diff --git a/src/Board.tsx b/src/Board.tsx index 639d79a..8708573 100644 --- a/src/Board.tsx +++ b/src/Board.tsx @@ -74,8 +74,17 @@ const filterProperties = [ ]; // Filter tasks according to the filter string -const filterTask = (task: KanbnTask, taskFilter: string) => { +const filterTask = ( + task: KanbnTask, + taskFilter: string, + customFields: { name: string, type: 'boolean' | 'date' | 'number' | 'string' }[] +) => { let result = true; + const customFieldMap = Object.fromEntries(customFields.map(customField => [ + customField.name.toLowerCase(), + customField, + ])); + const customFieldNames = Object.keys(customFieldMap); taskFilter.split(' ').forEach(f => { const parts = f.split(':').map(p => p.toLowerCase()); @@ -90,6 +99,17 @@ const filterTask = (task: KanbnTask, taskFilter: string) => { return; } + // Filter boolean custom fields + if (customFieldNames.includes(parts[0]) && customFieldMap[parts[0]].type === 'boolean') { + if ( + !(customFieldMap[parts[0]].name in task.metadata) || + !task.metadata[customFieldMap[parts[0]].name] + ) { + result = false; + } + return; + } + // Filter task id or name if ( !task.id.toLowerCase().includes(parts[0]) && @@ -101,9 +121,14 @@ const filterTask = (task: KanbnTask, taskFilter: string) => { } // If this filter section contains a property name and value, check the value against the property - if (parts.length === 2 && filterProperties.indexOf(parts[0]) !== -1) { + if ( + parts.length === 2 && ( + filterProperties.includes(parts[0]) || + customFieldNames.includes(parts[0]) + ) + ) { - // Filter by property value + // Fetch the value to filter by let propertyValue = ''; switch (parts[0]) { case 'description': @@ -121,8 +146,24 @@ const filterTask = (task: KanbnTask, taskFilter: string) => { case 'relation': propertyValue = task.relations.map(relation => `${relation.type} ${relation.task}`).join(' '); break; - default: break; + case 'subtask': + propertyValue = task.subTasks.map(subTask => `${subTask.text}`).join(' '); + break; + case 'comment': + propertyValue = task.comments.map(comment => `${comment.author} ${comment.text}`).join(' '); + break; + default: + if ( + customFieldNames.includes(parts[0]) && + customFieldMap[parts[0]].type !== 'boolean' && + customFieldMap[parts[0]].name in task.metadata + ) { + propertyValue = `${task.metadata[customFieldMap[parts[0]].name]}`; + } + break; } + + // Check the search term against the value if (!propertyValue.toLowerCase().includes(parts[1])) { result = false; } @@ -326,14 +367,16 @@ const Board = ({ snapshot.isDraggingOver ? 'drag-over' : null ].filter(i => i).join(' ')} > - {column.filter(task => filterTask(task, taskFilter)).map((task, position) => )} + {column + .filter(task => filterTask(task, taskFilter, customFields)) + .map((task, position) => )} {provided.placeholder} );