@@ -578,8 +578,9 @@ export class KanbanComponent extends Component {
578578 // Get unique tags from all tasks
579579 const allTags = new Set < string > ( ) ;
580580 this . tasks . forEach ( ( task ) => {
581- if ( task . metadata . tags ) {
582- task . metadata . tags . forEach ( ( tag ) => {
581+ const metadata = task . metadata || { } ;
582+ if ( metadata . tags ) {
583+ metadata . tags . forEach ( ( tag ) => {
583584 // Skip non-string tags
584585 if ( typeof tag === "string" ) {
585586 allTags . add ( tag ) ;
@@ -624,8 +625,9 @@ export class KanbanComponent extends Component {
624625 // Get unique contexts from all tasks
625626 const allContexts = new Set < string > ( ) ;
626627 this . tasks . forEach ( ( task ) => {
627- if ( task . metadata . context ) {
628- allContexts . add ( task . metadata . context ) ;
628+ const metadata = task . metadata || { } ;
629+ if ( metadata . context ) {
630+ allContexts . add ( metadata . context ) ;
629631 }
630632 } ) ;
631633 const contextColumns = Array . from ( allContexts ) . map (
@@ -723,34 +725,38 @@ export class KanbanComponent extends Component {
723725 const { field, order } = sortOption ;
724726 let comparison = 0 ;
725727
728+ // Ensure both tasks have metadata property
729+ const metadataA = a . metadata || { } ;
730+ const metadataB = b . metadata || { } ;
731+
726732 switch ( field ) {
727733 case "priority" :
728- const priorityA = a . metadata . priority ?? 0 ;
729- const priorityB = b . metadata . priority ?? 0 ;
734+ const priorityA = metadataA . priority ?? 0 ;
735+ const priorityB = metadataB . priority ?? 0 ;
730736 comparison = priorityA - priorityB ;
731737 break ;
732738 case "dueDate" :
733- const dueDateA = a . metadata . dueDate ?? Number . MAX_SAFE_INTEGER ;
734- const dueDateB = b . metadata . dueDate ?? Number . MAX_SAFE_INTEGER ;
739+ const dueDateA = metadataA . dueDate ?? Number . MAX_SAFE_INTEGER ;
740+ const dueDateB = metadataB . dueDate ?? Number . MAX_SAFE_INTEGER ;
735741 comparison = dueDateA - dueDateB ;
736742 break ;
737743 case "scheduledDate" :
738744 const scheduledA =
739- a . metadata . scheduledDate ?? Number . MAX_SAFE_INTEGER ;
745+ metadataA . scheduledDate ?? Number . MAX_SAFE_INTEGER ;
740746 const scheduledB =
741- b . metadata . scheduledDate ?? Number . MAX_SAFE_INTEGER ;
747+ metadataB . scheduledDate ?? Number . MAX_SAFE_INTEGER ;
742748 comparison = scheduledA - scheduledB ;
743749 break ;
744750 case "startDate" :
745- const startA = a . metadata . startDate ?? Number . MAX_SAFE_INTEGER ;
746- const startB = b . metadata . startDate ?? Number . MAX_SAFE_INTEGER ;
751+ const startA = metadataA . startDate ?? Number . MAX_SAFE_INTEGER ;
752+ const startB = metadataB . startDate ?? Number . MAX_SAFE_INTEGER ;
747753 comparison = startA - startB ;
748754 break ;
749755 case "createdDate" :
750756 const createdA =
751- a . metadata . createdDate ?? Number . MAX_SAFE_INTEGER ;
757+ metadataA . createdDate ?? Number . MAX_SAFE_INTEGER ;
752758 const createdB =
753- b . metadata . createdDate ?? Number . MAX_SAFE_INTEGER ;
759+ metadataB . createdDate ?? Number . MAX_SAFE_INTEGER ;
754760 comparison = createdA - createdB ;
755761 break ;
756762 }
@@ -936,6 +942,8 @@ export class KanbanComponent extends Component {
936942 return ;
937943 }
938944
945+ taskToUpdate . metadata = taskToUpdate . metadata || { } ;
946+
939947 // Create updated task object
940948 const updatedTask = { ...taskToUpdate } ;
941949
@@ -1013,7 +1021,9 @@ export class KanbanComponent extends Component {
10131021 // Only update project if it's not a read-only tgProject
10141022 if ( ! isProjectReadonly ( taskToUpdate ) ) {
10151023 updatedTask . metadata . project =
1016- newValue === null || newValue === "" ? undefined : newValue ;
1024+ newValue === null || newValue === ""
1025+ ? undefined
1026+ : newValue ;
10171027 }
10181028 break ;
10191029 case "context" :
@@ -1060,22 +1070,20 @@ export class KanbanComponent extends Component {
10601070 private getTasksForProperty ( groupBy : string , value : any ) : Task [ ] {
10611071 // Filter tasks based on the groupBy property and value
10621072 const tasksForProperty = this . tasks . filter ( ( task ) => {
1073+ const metadata = task . metadata || { } ;
10631074 switch ( groupBy ) {
10641075 case "priority" :
10651076 if ( value === null || value === "" ) {
1066- return ! task . metadata . priority ;
1077+ return ! metadata . priority ;
10671078 }
1068- return task . metadata . priority === value ;
1079+ return metadata . priority === value ;
10691080 case "tags" :
10701081 if ( value === null || value === "" ) {
1071- return (
1072- ! task . metadata . tags ||
1073- task . metadata . tags . length === 0
1074- ) ;
1082+ return ! metadata . tags || metadata . tags . length === 0 ;
10751083 }
10761084 return (
1077- task . metadata . tags &&
1078- task . metadata . tags . some (
1085+ metadata . tags &&
1086+ metadata . tags . some (
10791087 ( tag ) => typeof tag === "string" && tag === value
10801088 )
10811089 ) ;
@@ -1086,9 +1094,9 @@ export class KanbanComponent extends Component {
10861094 return getEffectiveProject ( task ) === value ;
10871095 case "context" :
10881096 if ( value === null || value === "" ) {
1089- return ! task . metadata . context ;
1097+ return ! metadata . context ;
10901098 }
1091- return task . metadata . context === value ;
1099+ return metadata . context === value ;
10921100 case "dueDate" :
10931101 case "scheduledDate" :
10941102 case "startDate" :
@@ -1125,16 +1133,17 @@ export class KanbanComponent extends Component {
11251133 today . getTime ( ) + 14 * 24 * 60 * 60 * 1000
11261134 ) ;
11271135
1136+ const metadata = task . metadata || { } ;
11281137 let taskDate : number | undefined ;
11291138 switch ( dateField ) {
11301139 case "dueDate" :
1131- taskDate = task . metadata . dueDate ;
1140+ taskDate = metadata . dueDate ;
11321141 break ;
11331142 case "scheduledDate" :
1134- taskDate = task . metadata . scheduledDate ;
1143+ taskDate = metadata . scheduledDate ;
11351144 break ;
11361145 case "startDate" :
1137- taskDate = task . metadata . startDate ;
1146+ taskDate = metadata . startDate ;
11381147 break ;
11391148 }
11401149
@@ -1270,6 +1279,7 @@ export class KanbanComponent extends Component {
12701279
12711280 private getTaskOriginalColumnValue ( task : Task , groupBy : string ) : any {
12721281 // Determine which column the task currently belongs to based on its properties
1282+ const metadata = task . metadata || { } ;
12731283 switch ( groupBy ) {
12741284 case "tags" :
12751285 // For tags, find which tag column this task would be in
@@ -1287,17 +1297,14 @@ export class KanbanComponent extends Component {
12871297 for ( const column of kanbanConfig . customColumns ) {
12881298 if ( column . value === "" || column . value === null ) {
12891299 // "No Tags" column
1290- if (
1291- ! task . metadata . tags ||
1292- task . metadata . tags . length === 0
1293- ) {
1300+ if ( ! metadata . tags || metadata . tags . length === 0 ) {
12941301 return "" ;
12951302 }
12961303 } else {
12971304 // Specific tag column
12981305 if (
1299- task . metadata . tags &&
1300- task . metadata . tags . some (
1306+ metadata . tags &&
1307+ metadata . tags . some (
13011308 ( tag ) =>
13021309 typeof tag === "string" &&
13031310 tag === column . value
@@ -1309,14 +1316,11 @@ export class KanbanComponent extends Component {
13091316 }
13101317 } else {
13111318 // Use default columns - find the first tag that matches existing columns
1312- if (
1313- ! task . metadata . tags ||
1314- task . metadata . tags . length === 0
1315- ) {
1319+ if ( ! metadata . tags || metadata . tags . length === 0 ) {
13161320 return "" ;
13171321 }
13181322 // Return the first string tag (for simplicity, as we need to determine which column it came from)
1319- const firstStringTag = task . metadata . tags . find (
1323+ const firstStringTag = metadata . tags . find (
13201324 ( tag ) => typeof tag === "string"
13211325 ) ;
13221326 return firstStringTag || "" ;
@@ -1325,15 +1329,15 @@ export class KanbanComponent extends Component {
13251329 case "project" :
13261330 return getEffectiveProject ( task ) || "" ;
13271331 case "context" :
1328- return task . metadata . context || "" ;
1332+ return metadata . context || "" ;
13291333 case "priority" :
1330- return task . metadata . priority || null ;
1334+ return metadata . priority || null ;
13311335 case "dueDate" :
1332- return this . getDateCategory ( task . metadata . dueDate ) ;
1336+ return this . getDateCategory ( metadata . dueDate ) ;
13331337 case "scheduledDate" :
1334- return this . getDateCategory ( task . metadata . scheduledDate ) ;
1338+ return this . getDateCategory ( metadata . scheduledDate ) ;
13351339 case "startDate" :
1336- return this . getDateCategory ( task . metadata . startDate ) ;
1340+ return this . getDateCategory ( metadata . startDate ) ;
13371341 case "filePath" :
13381342 return task . filePath ;
13391343 default :
0 commit comments