fix(quick add magic): make sure assignees which don't exist are not removed from task title
Resolves https://kolaente.dev/vikunja/frontend/issues/2927
This commit is contained in:
@ -30,7 +30,7 @@ describe('Parse Task Text', () => {
|
||||
it('should parse text in todoist mode when configured', () => {
|
||||
const result = parseTaskText('Lorem Ipsum today @label #list !2 +user', PrefixMode.Todoist)
|
||||
|
||||
expect(result.text).toBe('Lorem Ipsum')
|
||||
expect(result.text).toBe('Lorem Ipsum +user')
|
||||
const now = new Date()
|
||||
expect(result?.date?.getFullYear()).toBe(now.getFullYear())
|
||||
expect(result?.date?.getMonth()).toBe(now.getMonth())
|
||||
@ -633,47 +633,53 @@ describe('Parse Task Text', () => {
|
||||
|
||||
describe('Assignee', () => {
|
||||
it('should parse an assignee', () => {
|
||||
const result = parseTaskText('Lorem Ipsum @user')
|
||||
const text = 'Lorem Ipsum @user'
|
||||
const result = parseTaskText(text)
|
||||
|
||||
expect(result.text).toBe('Lorem Ipsum')
|
||||
expect(result.text).toBe(text)
|
||||
expect(result.assignees).toHaveLength(1)
|
||||
expect(result.assignees[0]).toBe('user')
|
||||
})
|
||||
it('should parse multiple assignees', () => {
|
||||
const result = parseTaskText('Lorem Ipsum @user1 @user2 @user3')
|
||||
const text = 'Lorem Ipsum @user1 @user2 @user3'
|
||||
const result = parseTaskText(text)
|
||||
|
||||
expect(result.text).toBe('Lorem Ipsum')
|
||||
expect(result.text).toBe(text)
|
||||
expect(result.assignees).toHaveLength(3)
|
||||
expect(result.assignees[0]).toBe('user1')
|
||||
expect(result.assignees[1]).toBe('user2')
|
||||
expect(result.assignees[2]).toBe('user3')
|
||||
})
|
||||
it('should parse avoid duplicate assignees', () => {
|
||||
const result = parseTaskText('Lorem Ipsum @user1 @user1 @user2')
|
||||
const text = 'Lorem Ipsum @user1 @user1 @user2'
|
||||
const result = parseTaskText(text)
|
||||
|
||||
expect(result.text).toBe('Lorem Ipsum')
|
||||
expect(result.text).toBe(text)
|
||||
expect(result.assignees).toHaveLength(2)
|
||||
expect(result.assignees[0]).toBe('user1')
|
||||
expect(result.assignees[1]).toBe('user2')
|
||||
})
|
||||
it('should parse an assignee with a space in it', () => {
|
||||
const result = parseTaskText(`Lorem Ipsum @'user with long name'`)
|
||||
const text = `Lorem Ipsum @'user with long name'`
|
||||
const result = parseTaskText(text)
|
||||
|
||||
expect(result.text).toBe('Lorem Ipsum')
|
||||
expect(result.text).toBe(text)
|
||||
expect(result.assignees).toHaveLength(1)
|
||||
expect(result.assignees[0]).toBe('user with long name')
|
||||
})
|
||||
it('should parse an assignee with a space in it and "', () => {
|
||||
const result = parseTaskText(`Lorem Ipsum @"user with long name"`)
|
||||
const text = `Lorem Ipsum @"user with long name"`
|
||||
const result = parseTaskText(text)
|
||||
|
||||
expect(result.text).toBe('Lorem Ipsum')
|
||||
expect(result.text).toBe(text)
|
||||
expect(result.assignees).toHaveLength(1)
|
||||
expect(result.assignees[0]).toBe('user with long name')
|
||||
})
|
||||
it('should parse an assignee who is called like a date as assignee', () => {
|
||||
const result = parseTaskText(`Lorem Ipsum @today`)
|
||||
const text = `Lorem Ipsum @today`
|
||||
const result = parseTaskText(text)
|
||||
|
||||
expect(result.text).toBe('Lorem Ipsum')
|
||||
expect(result.text).toBe(text)
|
||||
expect(result.assignees).toHaveLength(1)
|
||||
expect(result.assignees[0]).toBe('today')
|
||||
})
|
||||
|
@ -82,7 +82,6 @@ export const parseTaskText = (text: string, prefixesMode: PrefixMode = PrefixMod
|
||||
result.text = result.priority !== null ? cleanupItemText(result.text, [String(result.priority)], prefixes.priority) : result.text
|
||||
|
||||
result.assignees = getItemsFromPrefix(result.text, prefixes.assignee)
|
||||
result.text = cleanupItemText(result.text, result.assignees, prefixes.assignee)
|
||||
|
||||
const {textWithoutMatched, repeats} = getRepeats(result.text)
|
||||
result.text = textWithoutMatched
|
||||
@ -277,7 +276,7 @@ const getRepeats = (text: string): repeatParsedResult => {
|
||||
}
|
||||
}
|
||||
|
||||
const cleanupItemText = (text: string, items: string[], prefix: string): string => {
|
||||
export const cleanupItemText = (text: string, items: string[], prefix: string): string => {
|
||||
items.forEach(l => {
|
||||
text = text
|
||||
.replace(`${prefix}'${l}' `, '')
|
||||
@ -294,7 +293,7 @@ const cleanupResult = (result: ParsedTaskText, prefixes: Prefixes): ParsedTaskTe
|
||||
result.text = cleanupItemText(result.text, result.labels, prefixes.label)
|
||||
result.text = result.list !== null ? cleanupItemText(result.text, [result.list], prefixes.list) : result.text
|
||||
result.text = result.priority !== null ? cleanupItemText(result.text, [String(result.priority)], prefixes.priority) : result.text
|
||||
result.text = cleanupItemText(result.text, result.assignees, prefixes.assignee)
|
||||
// Not removing assignees to avoid removing @text where the user does not exist
|
||||
result.text = result.text.trim()
|
||||
|
||||
return result
|
||||
|
Reference in New Issue
Block a user