{"record":{"id":"8dd30faaef9a0ef6","repo":"wekan/wekan","slug":"no-default-swimlane-found-for-board","errorCode":null,"errorMessage":"No default swimlane found for board","messagePattern":"No default swimlane found for board","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"client/lib/boardConverter.js","lineNumber":94,"sourceCode":"\n    if (this.conversionCache.has(boardId)) {\n      return true; // Already converted\n    }\n\n    isConverting.set(true);\n    conversionProgress.set(0);\n    conversionStatus.set('Starting board conversion...');\n\n    try {\n      const board = ReactiveCache.getBoard(boardId);\n      if (!board) {\n        throw new Error('Board not found');\n      }\n\n      // Get the default swimlane for this board\n      const defaultSwimlane = board.getDefaultSwimline();\n      if (!defaultSwimlane) {\n        throw new Error('No default swimlane found for board');\n      }\n\n      // Get all lists that need conversion\n      const listsToConvert = ReactiveCache.getLists({\n        boardId: boardId,\n        $or: [\n          { swimlaneId: { $exists: false } },\n          { swimlaneId: '' },\n          { swimlaneId: null }\n        ]\n      });\n\n      if (listsToConvert.length === 0) {\n        this.conversionCache.set(boardId, true);\n        globalConvertedBoards.add(boardId); // Mark board as converted\n        isConverting.set(false);\n        console.log(`Board ${boardId} has no lists to convert, marked as converted`);\n        return true;","sourceCodeStart":76,"sourceCodeEnd":112,"githubUrl":"https://github.com/wekan/wekan/blob/eb1433158b1804bcf3edaa5cb18f08ae2e04d6c2/client/lib/boardConverter.js#L76-L112","documentation":"Immediately after the board lookup, convertBoard fetches the board's default swimlane via board.getDefaultSwimline() and throws Error('No default swimlane found for board') at line 94 if it is falsy. Every WeKan board is expected to have an initial/default swimlane that lists convert into; a board without one cannot be converted.","triggerScenarios":"The board's default swimlane was deleted (manually or by an import that replaced swimlanes), the board predates swimlanes and was never migrated, getDefaultSwimline filters by archived/deleted state and the only swimlane is archived, or the swimlane document exists server-side but is missing from the client cache.","commonSituations":"Boards imported from very old WeKan versions or external formats lacking swimlanes; swimlane deleted by an admin script; data corruption after failed import leaving a board with zero swimlanes.","solutions":["Recreate a swimlane on the board in the UI (Add Swimlane) — the first/default one satisfies getDefaultSwimline — then retry conversion.","Check the swimlanes collection for the boardId; if rows exist but are archived, unarchive the default swimlane.","Refresh so the client cache includes the board's swimlanes.","If the board has zero swimlanes in the database, insert a default swimlane server-side or re-import the board."],"exampleFix":"// before\nconst defaultSwimlane = board.getDefaultSwimline();\nif (!defaultSwimlane) throw new Error('No default swimlane found for board');\n\n// after — fall back to the board's first swimlane before failing\nlet defaultSwimlane = board.getDefaultSwimline();\nif (!defaultSwimlane) defaultSwimlane = ReactiveCache.getSwimlane({ boardId, archived: false });\nif (!defaultSwimlane) throw new Error('No default swimlane found for board');","handlingStrategy":"fallback","validationCode":"function boardHasDefaultSwimlane(boardId) {\n  const board = ReactiveCache.getBoard(boardId);\n  return !!(board && board.getDefaultSwimline());\n}","typeGuard":"function hasSwimlane(board) {\n  return Boolean(board && typeof board.getDefaultSwimline === 'function' && board.getDefaultSwimline());\n}","tryCatchPattern":"try {\n  await convertBoard(boardId);\n} catch (e) {\n  if (e.message === 'No default swimlane found for board') {\n    showToast('This board has no active swimlane. Add a swimlane and retry.');\n  } else throw e;\n}","preventionTips":["Never delete the initial/default swimlane on boards you plan to convert.","Audit imported boards for zero swimlanes before conversion.","Unarchive the default swimlane if a cleanup archived it.","Offer a one-click 'create default swimlane' recovery in the conversion UI."],"tags":["swimlanes","boards","data-migration","client"],"backgroundTag":"missing-default-record","analyzedSha":"eb1433158b1804bcf3edaa5cb18f08ae2e04d6c2","analyzedAt":"2026-09-01T21:05:02.951Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-09T01:17:15.007Z"}