All files / client/src/lib experimental-workspace-layout.ts

78.12% Statements 25/32
66.66% Branches 10/15
90.9% Functions 10/11
82.6% Lines 19/23

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 684x 4x 4x 4x             4x           4x                 7x 21x             5x             5x 5x   5x 15x   5x   4x 12x 12x 12x       3x                        
export const EXPERIMENTAL_WORKSPACE_LAYOUT_KEY = "unoExperimentalWorkspaceLayout";
export const EXPERIMENTAL_WORKSPACE_COLUMNS_KEY = "unoExperimentalWorkspaceColumns";
export const EXPERIMENTAL_WORKSPACE_LAYOUT_CHANGE_EVENT = "experimentalWorkspaceLayoutChange";
export const DEFAULT_EXPERIMENTAL_WORKSPACE_LAYOUT = false;
 
export type WorkspaceColumn = "code" | "simulation" | "tutor";
 
export type WorkspaceColumnVisibility = Record<WorkspaceColumn, boolean>;
export type WorkspaceColumnSizes = Record<WorkspaceColumn, number>;
 
export const DEFAULT_WORKSPACE_COLUMN_VISIBILITY: WorkspaceColumnVisibility = {
  code: true,
  simulation: true,
  tutor: false,
};
 
export const DEFAULT_WORKSPACE_COLUMN_SIZES: WorkspaceColumnSizes = {
  code: 42,
  simulation: 33,
  tutor: 25,
};
 
export function getVisibleWorkspaceColumns(
  visibility: WorkspaceColumnVisibility,
): WorkspaceColumn[] {
  return (["code", "simulation", "tutor"] as WorkspaceColumn[]).filter(
    (column) => visibility[column],
  );
}
 
export function getWorkspaceResizePairs(
  columns: WorkspaceColumn[],
): Array<[WorkspaceColumn, WorkspaceColumn]> {
  return columns.slice(0, -1).map((column, index) => [column, columns[index + 1]]);
}
 
export function getWorkspaceDefaultSizes(
  columns: WorkspaceColumn[],
  rememberedSizes: WorkspaceColumnSizes = DEFAULT_WORKSPACE_COLUMN_SIZES,
): number[] {
  Iif (columns.length === 0) return [];
  Iif (columns.length === 1) return [100];
 
  const rememberedDefaults = Object.entries(DEFAULT_WORKSPACE_COLUMN_SIZES).every(
    ([column, size]) => rememberedSizes[column as WorkspaceColumn] === size,
  );
  if (columns.length === 2 && rememberedDefaults) return [50, 50];
 
  const defaults = DEFAULT_WORKSPACE_COLUMN_SIZES;
  const rawSizes = columns.map((column) => rememberedSizes[column] ?? defaults[column]);
  const total = rawSizes.reduce((sum, size) => sum + size, 0);
  return total > 0 ? rawSizes.map((size) => (size / total) * 100) : columns.map(() => 100 / columns.length);
}
 
export function parseWorkspaceColumnVisibility(value: string | null): WorkspaceColumnVisibility {
  Eif (!value) return { ...DEFAULT_WORKSPACE_COLUMN_VISIBILITY };
  try {
    const parsed = JSON.parse(value) as Partial<WorkspaceColumnVisibility>;
    return {
      code: parsed.code !== false,
      simulation: parsed.simulation !== false,
      tutor: parsed.tutor === true,
    };
  } catch {
    return { ...DEFAULT_WORKSPACE_COLUMN_VISIBILITY };
  }
}