Compare commits

...

4 Commits

6 changed files with 50 additions and 28 deletions

View File

@ -111,7 +111,7 @@
<icon icon="align-left" />
</span>
<span
v-if="task.repeatAfter.amount > 0"
v-if="task.repeatAfter.amount > 0 || (task.repeatAfter.amount === 0 && task.repeatMode === TASK_REPEAT_MODES.REPEAT_MODE_MONTH)"
class="project-task-icon"
>
<icon icon="history" />
@ -207,6 +207,7 @@ import {useIntervalFn} from '@vueuse/core'
import {playPopSound} from '@/helpers/playPop'
import {useAuthStore} from '@/stores/auth'
import {isEditorContentEmpty} from '@/helpers/editorContentEmpty'
import {TASK_REPEAT_MODES} from '@/types/IRepeatMode'
const {
theTask,

View File

@ -2,7 +2,7 @@ import {calculateDayInterval} from './calculateDayInterval'
import {calculateNearestHours} from './calculateNearestHours'
import {replaceAll} from '../replaceAll'
interface dateParseResult {
export interface dateParseResult {
newText: string,
date: Date | null,
}
@ -12,7 +12,7 @@ interface dateFoundResult {
date: Date | null,
}
const monthsRegexGroup = '(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)'
const monthsRegexGroup = '(january|february|march|april|june|july|august|september|october|november|december|jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)'
function matchesDateExpr(text: string, dateExpr: string): boolean {
return text.match(new RegExp('(^| )' + dateExpr, 'gi')) !== null
@ -60,12 +60,12 @@ export const parseDate = (text: string, now: Date = new Date()): dateParseResult
return addTimeToDate(text, date, 'end of month')
}
let parsed = getDateFromWeekday(text)
let parsed = getDateFromWeekday(text, now)
if (parsed.date !== null) {
return addTimeToDate(text, parsed.date, parsed.foundText)
}
parsed = getDayFromText(text)
parsed = getDayFromText(text, now)
if (parsed.date !== null) {
const month = getMonthFromText(text, parsed.date)
return addTimeToDate(month.newText, month.date, parsed.foundText)
@ -76,7 +76,7 @@ export const parseDate = (text: string, now: Date = new Date()): dateParseResult
return addTimeToDate(text, parsed.date, parsed.foundText)
}
parsed = getDateFromText(text)
parsed = getDateFromText(text, now)
if (parsed.date === null) {
return {
@ -230,7 +230,7 @@ export const getDateFromTextIn = (text: string, now: Date = new Date()) => {
}
}
const getDateFromWeekday = (text: string): dateFoundResult => {
const getDateFromWeekday = (text: string, date: Date = new Date()): dateFoundResult => {
const matcher = /(^| )(next )?(monday|mon|tuesday|tue|wednesday|wed|thursday|thu|friday|fri|saturday|sat|sunday|sun)($| )/g
const results: string[] | null = matcher.exec(text.toLowerCase()) // The i modifier does not seem to work.
if (results === null) {
@ -240,7 +240,6 @@ const getDateFromWeekday = (text: string): dateFoundResult => {
}
}
const date: Date = new Date()
const currentDay: number = date.getDay()
let day = 0
@ -296,7 +295,7 @@ const getDateFromWeekday = (text: string): dateFoundResult => {
}
}
const getDayFromText = (text: string) => {
const getDayFromText = (text: string, now: Date = new Date()) => {
const matcher = /(^| )(([1-2][0-9])|(3[01])|(0?[1-9]))(st|nd|rd|th|\.)($| )/ig
const results = matcher.exec(text)
if (results === null) {
@ -306,7 +305,6 @@ const getDayFromText = (text: string) => {
}
}
const now = new Date()
const date = new Date(now)
const day = parseInt(results[0])
date.setDate(day)

View File

@ -1,7 +1,7 @@
import {beforeEach, afterEach, describe, it, expect, vi} from 'vitest'
import {afterEach, beforeEach, describe, expect, it, vi} from 'vitest'
import {parseTaskText, PrefixMode} from './parseTaskText'
import {getDateFromText, parseDate} from '../helpers/time/parseDate'
import {ParsedTaskText, parseTaskText, PrefixMode} from './parseTaskText'
import {parseDate} from '../helpers/time/parseDate'
import {calculateDayInterval} from '../helpers/time/calculateDayInterval'
import {PRIORITIES} from '@/constants/priorities'
import {MILLISECONDS_A_DAY} from '@/constants/date'
@ -461,50 +461,69 @@ describe('Parse Task Text', () => {
'1/27': '2022-1-27',
'jan 27': '2022-1-27',
'Jan 27': '2022-1-27',
'january 27': '2022-1-27',
'January 27': '2022-1-27',
'feb 21': '2022-2-21',
'Feb 21': '2022-2-21',
'february 21': '2022-2-21',
'February 21': '2022-2-21',
'mar 21': '2022-3-21',
'Mar 21': '2022-3-21',
'march 21': '2022-3-21',
'March 21': '2022-3-21',
'apr 21': '2022-4-21',
'Apr 21': '2022-4-21',
'april 21': '2022-4-21',
'April 21': '2022-4-21',
'may 21': '2022-5-21',
'May 21': '2022-5-21',
'jun 21': '2022-6-21',
'Jun 21': '2022-6-21',
'june 21': '2022-6-21',
'June 21': '2022-6-21',
'21st June': '2021-6-21',
'jul 21': '2021-7-21',
'Jul 21': '2021-7-21',
'july 21': '2021-7-21',
'July 21': '2021-7-21',
'aug 21': '2021-8-21',
'Aug 21': '2021-8-21',
'august 21': '2021-8-21',
'August 21': '2021-8-21',
'sep 21': '2021-9-21',
'Sep 21': '2021-9-21',
'september 21': '2021-9-21',
'September 21': '2021-9-21',
'oct 21': '2021-10-21',
'Oct 21': '2021-10-21',
'october 21': '2021-10-21',
'October 21': '2021-10-21',
'nov 21': '2021-11-21',
'Nov 21': '2021-11-21',
'november 21': '2021-11-21',
'November 21': '2021-11-21',
'dec 21': '2021-12-21',
'Dec 21': '2021-12-21',
'december 21': '2021-12-21',
'December 21': '2021-12-21',
} as Record<string, string | null>
for (const c in cases) {
it(`should parse '${c}' as '${cases[c]}' with the date at the end`, () => {
const {date, foundText} = getDateFromText(`Lorem Ipsum ${c}`, now)
const assertResult = ({date, text}: ParsedTaskText) => {
if (date === null && cases[c] === null) {
expect(date).toBeNull()
return
}
expect(`${date?.getFullYear()}-${date?.getMonth() + 1}-${date?.getDate()}`).toBe(cases[c])
expect(foundText.trim()).toBe(c)
expect(text.trim()).toBe('Lorem Ipsum')
}
it(`should parse '${c}' as '${cases[c]}' with the date at the end`, () => {
assertResult(parseTaskText(`Lorem Ipsum ${c}`, PrefixMode.Default, now))
})
it(`should parse '${c}' as '${cases[c]}' with the date at the beginning`, () => {
const {date, foundText} = getDateFromText(`${c} Lorem Ipsum`, now)
if (date === null && cases[c] === null) {
expect(date).toBeNull()
return
}
expect(`${date?.getFullYear()}-${date?.getMonth() + 1}-${date?.getDate()}`).toBe(cases[c])
expect(foundText.trim()).toBe(c)
assertResult(parseTaskText(`${c} Lorem Ipsum`, PrefixMode.Default, now))
})
}
})

View File

@ -55,7 +55,7 @@ interface Prefixes {
*
* @param text
*/
export const parseTaskText = (text: string, prefixesMode: PrefixMode = PrefixMode.Default): ParsedTaskText => {
export const parseTaskText = (text: string, prefixesMode: PrefixMode = PrefixMode.Default, now: Date = new Date()): ParsedTaskText => {
const result: ParsedTaskText = {
text: text,
date: null,
@ -86,7 +86,7 @@ export const parseTaskText = (text: string, prefixesMode: PrefixMode = PrefixMod
result.text = textWithoutMatched
result.repeats = repeats
const {newText, date} = parseDate(result.text)
const {newText, date} = parseDate(result.text, now)
result.text = newText
result.date = date

4
go.mod
View File

@ -69,11 +69,11 @@ require (
github.com/wneessen/go-mail v0.4.0
github.com/yuin/goldmark v1.7.1
golang.org/x/crypto v0.22.0
golang.org/x/image v0.15.0
golang.org/x/image v0.16.0
golang.org/x/oauth2 v0.20.0
golang.org/x/sync v0.7.0
golang.org/x/sys v0.20.0
golang.org/x/term v0.19.0
golang.org/x/term v0.20.0
golang.org/x/text v0.15.0
gopkg.in/d4l3k/messagediff.v1 v1.2.1
gopkg.in/yaml.v3 v3.0.1

4
go.sum
View File

@ -579,6 +579,8 @@ golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqR
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/image v0.15.0 h1:kOELfmgrmJlw4Cdb7g/QGuB3CvDrXbqEIww/pNtNBm8=
golang.org/x/image v0.15.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE=
golang.org/x/image v0.16.0 h1:9kloLAKhUufZhA12l5fwnx2NZW39/we1UhBesW433jw=
golang.org/x/image v0.16.0/go.mod h1:ugSZItdV4nOxyqp56HmXwH0Ry0nBCpjnZdpDaIHdoPs=
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
@ -658,6 +660,8 @@ golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuX
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q=
golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=
golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw=
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=