@industry-theme/repository-composition-panels 0.6.6 → 0.6.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{BufferResource-COIBph2K.js → BufferResource-cAcDbPe9.js} +2 -2
- package/dist/{BufferResource-COIBph2K.js.map → BufferResource-cAcDbPe9.js.map} +1 -1
- package/dist/{CanvasRenderer-os9XVFU1.js → CanvasRenderer-vrEt8Kvw.js} +3 -3
- package/dist/{CanvasRenderer-os9XVFU1.js.map → CanvasRenderer-vrEt8Kvw.js.map} +1 -1
- package/dist/{Filter-Cga-hPyS.js → Filter-xnpEahTO.js} +2 -2
- package/dist/{Filter-Cga-hPyS.js.map → Filter-xnpEahTO.js.map} +1 -1
- package/dist/{RenderTargetSystem-dKyRZcjY.js → RenderTargetSystem-NCEP5Jvy.js} +3 -3
- package/dist/{RenderTargetSystem-dKyRZcjY.js.map → RenderTargetSystem-NCEP5Jvy.js.map} +1 -1
- package/dist/{WebGLRenderer-D6PCzY96.js → WebGLRenderer-KCjes89V.js} +4 -4
- package/dist/{WebGLRenderer-D6PCzY96.js.map → WebGLRenderer-KCjes89V.js.map} +1 -1
- package/dist/{WebGPURenderer-BPbpe2qf.js → WebGPURenderer-CBPe3ZFu.js} +4 -4
- package/dist/{WebGPURenderer-BPbpe2qf.js.map → WebGPURenderer-CBPe3ZFu.js.map} +1 -1
- package/dist/{browserAll-Bkn6RsGL.js → browserAll-AfGuQn9U.js} +3 -3
- package/dist/{browserAll-Bkn6RsGL.js.map → browserAll-AfGuQn9U.js.map} +1 -1
- package/dist/{index-BnHKy4Xw.js → index-BOgxBkoa.js} +256 -51
- package/dist/{index-BnHKy4Xw.js.map → index-BOgxBkoa.js.map} +1 -1
- package/dist/{init-CtgKz_ge.js → init-8y10xD3C.js} +3 -3
- package/dist/{init-CtgKz_ge.js.map → init-8y10xD3C.js.map} +1 -1
- package/dist/panels/CollectionMapPanel.d.ts +1 -1
- package/dist/panels/CollectionMapPanel.d.ts.map +1 -1
- package/dist/panels/overworld-map/OverworldMapPanel.d.ts +3 -0
- package/dist/panels/overworld-map/OverworldMapPanel.d.ts.map +1 -1
- package/dist/panels/overworld-map/components/IsometricInteractionManager.d.ts +4 -0
- package/dist/panels/overworld-map/components/IsometricInteractionManager.d.ts.map +1 -1
- package/dist/panels/overworld-map/components/IsometricRenderer.d.ts +12 -0
- package/dist/panels/overworld-map/components/IsometricRenderer.d.ts.map +1 -1
- package/dist/panels/overworld-map/genericMapper.d.ts.map +1 -1
- package/dist/panels/overworld-map/isometricUtils.d.ts +15 -0
- package/dist/panels/overworld-map/isometricUtils.d.ts.map +1 -1
- package/dist/panels.bundle.js +1 -1
- package/dist/webworkerAll-Dc1Ywudq.js +3 -0
- package/dist/webworkerAll-Dc1Ywudq.js.map +1 -0
- package/package.json +1 -1
- package/dist/webworkerAll-CGgU2W8C.js +0 -3
- package/dist/webworkerAll-CGgU2W8C.js.map +0 -1
|
@@ -104205,7 +104205,7 @@ const browserExt = {
|
|
|
104205
104205
|
},
|
|
104206
104206
|
test: () => true,
|
|
104207
104207
|
load: async () => {
|
|
104208
|
-
await import("./browserAll-
|
|
104208
|
+
await import("./browserAll-AfGuQn9U.js");
|
|
104209
104209
|
}
|
|
104210
104210
|
};
|
|
104211
104211
|
const webworkerExt = {
|
|
@@ -104216,7 +104216,7 @@ const webworkerExt = {
|
|
|
104216
104216
|
},
|
|
104217
104217
|
test: () => typeof self !== "undefined" && self.WorkerGlobalScope !== void 0,
|
|
104218
104218
|
load: async () => {
|
|
104219
|
-
await import("./webworkerAll-
|
|
104219
|
+
await import("./webworkerAll-Dc1Ywudq.js");
|
|
104220
104220
|
}
|
|
104221
104221
|
};
|
|
104222
104222
|
class ObservablePoint {
|
|
@@ -116459,19 +116459,19 @@ async function autoDetectRenderer(options) {
|
|
|
116459
116459
|
for (let i2 = 0; i2 < preferredOrder.length; i2++) {
|
|
116460
116460
|
const rendererType = preferredOrder[i2];
|
|
116461
116461
|
if (rendererType === "webgpu" && await isWebGPUSupported()) {
|
|
116462
|
-
const { WebGPURenderer } = await import("./WebGPURenderer-
|
|
116462
|
+
const { WebGPURenderer } = await import("./WebGPURenderer-CBPe3ZFu.js");
|
|
116463
116463
|
RendererClass = WebGPURenderer;
|
|
116464
116464
|
finalOptions = { ...options, ...options.webgpu };
|
|
116465
116465
|
break;
|
|
116466
116466
|
} else if (rendererType === "webgl" && isWebGLSupported(
|
|
116467
116467
|
options.failIfMajorPerformanceCaveat ?? AbstractRenderer.defaultOptions.failIfMajorPerformanceCaveat
|
|
116468
116468
|
)) {
|
|
116469
|
-
const { WebGLRenderer } = await import("./WebGLRenderer-
|
|
116469
|
+
const { WebGLRenderer } = await import("./WebGLRenderer-KCjes89V.js");
|
|
116470
116470
|
RendererClass = WebGLRenderer;
|
|
116471
116471
|
finalOptions = { ...options, ...options.webgl };
|
|
116472
116472
|
break;
|
|
116473
116473
|
} else if (rendererType === "canvas") {
|
|
116474
|
-
const { CanvasRenderer } = await import("./CanvasRenderer-
|
|
116474
|
+
const { CanvasRenderer } = await import("./CanvasRenderer-vrEt8Kvw.js");
|
|
116475
116475
|
RendererClass = CanvasRenderer;
|
|
116476
116476
|
finalOptions = { ...options, ...options.canvasOptions };
|
|
116477
116477
|
break;
|
|
@@ -130463,6 +130463,18 @@ function screenToGrid(screenX, screenY) {
|
|
|
130463
130463
|
function getIsometricZIndex(gridX, gridY) {
|
|
130464
130464
|
return gridX + gridY;
|
|
130465
130465
|
}
|
|
130466
|
+
function domEventToGridCoords(clientX, clientY, viewport, canvasElement) {
|
|
130467
|
+
if (!viewport || !canvasElement) {
|
|
130468
|
+
console.warn("[domEventToGridCoords] Missing viewport or canvas element, returning (0, 0)");
|
|
130469
|
+
return { gridX: 0, gridY: 0 };
|
|
130470
|
+
}
|
|
130471
|
+
const rect = canvasElement.getBoundingClientRect();
|
|
130472
|
+
const canvasX = clientX - rect.left;
|
|
130473
|
+
const canvasY = clientY - rect.top;
|
|
130474
|
+
const worldPoint = viewport.toWorld({ x: canvasX, y: canvasY });
|
|
130475
|
+
const gridCoords = screenToGrid(worldPoint.x, worldPoint.y);
|
|
130476
|
+
return gridCoords;
|
|
130477
|
+
}
|
|
130466
130478
|
const ISO_TILE_WIDTH = 64;
|
|
130467
130479
|
const ISO_TILE_HEIGHT = 32;
|
|
130468
130480
|
class IsometricRenderer {
|
|
@@ -130474,6 +130486,24 @@ class IsometricRenderer {
|
|
|
130474
130486
|
this.gridColor = config.gridColor ?? 3355443;
|
|
130475
130487
|
this.regionColor = config.regionColor ?? 16737792;
|
|
130476
130488
|
}
|
|
130489
|
+
/**
|
|
130490
|
+
* Add a texture to the atlas
|
|
130491
|
+
*/
|
|
130492
|
+
addTexture(key, texture) {
|
|
130493
|
+
this.atlas[key] = texture;
|
|
130494
|
+
}
|
|
130495
|
+
/**
|
|
130496
|
+
* Check if a texture exists in the atlas
|
|
130497
|
+
*/
|
|
130498
|
+
hasTexture(key) {
|
|
130499
|
+
return key in this.atlas;
|
|
130500
|
+
}
|
|
130501
|
+
/**
|
|
130502
|
+
* Get all texture keys in the atlas
|
|
130503
|
+
*/
|
|
130504
|
+
getTextureKeys() {
|
|
130505
|
+
return Object.keys(this.atlas);
|
|
130506
|
+
}
|
|
130477
130507
|
/**
|
|
130478
130508
|
* Main rendering method - creates all scene elements
|
|
130479
130509
|
*/
|
|
@@ -131113,6 +131143,12 @@ class IsometricInteractionManager {
|
|
|
131113
131143
|
}
|
|
131114
131144
|
return intersecting;
|
|
131115
131145
|
}
|
|
131146
|
+
/**
|
|
131147
|
+
* Check if a sprite is currently being dragged
|
|
131148
|
+
*/
|
|
131149
|
+
isDragging() {
|
|
131150
|
+
return this.dragState !== null && this.dragState.isDragging;
|
|
131151
|
+
}
|
|
131116
131152
|
/**
|
|
131117
131153
|
* Cleanup resources
|
|
131118
131154
|
*/
|
|
@@ -131806,10 +131842,12 @@ function nodesToUnifiedOverworldMap(nodes, options = {}) {
|
|
|
131806
131842
|
}
|
|
131807
131843
|
}
|
|
131808
131844
|
}
|
|
131845
|
+
const minCol = Math.min(...layoutRegions.map((r2) => r2.gridPosition.col));
|
|
131809
131846
|
const maxCol = Math.max(...layoutRegions.map((r2) => r2.gridPosition.col));
|
|
131847
|
+
const minRow = Math.min(...layoutRegions.map((r2) => r2.gridPosition.row));
|
|
131810
131848
|
const maxRow = Math.max(...layoutRegions.map((r2) => r2.gridPosition.row));
|
|
131811
|
-
const totalCols = maxCol + 1;
|
|
131812
|
-
const totalRows = maxRow + 1;
|
|
131849
|
+
const totalCols = maxCol - minCol + 1;
|
|
131850
|
+
const totalRows = maxRow - minRow + 1;
|
|
131813
131851
|
const mapWidth = totalCols * REGION_SIZE_TILES;
|
|
131814
131852
|
const mapHeight = totalRows * REGION_SIZE_TILES;
|
|
131815
131853
|
const regions = layoutRegions.map((region) => ({
|
|
@@ -131871,7 +131909,8 @@ const OverworldMapPanelContent = ({
|
|
|
131871
131909
|
onAddRegion,
|
|
131872
131910
|
onRenameRegion,
|
|
131873
131911
|
onDeleteRegion,
|
|
131874
|
-
collectionKey
|
|
131912
|
+
collectionKey,
|
|
131913
|
+
onViewportReady
|
|
131875
131914
|
}) => {
|
|
131876
131915
|
const canvasRef = useRef(null);
|
|
131877
131916
|
const appRef = useRef(null);
|
|
@@ -131902,12 +131941,14 @@ const OverworldMapPanelContent = ({
|
|
|
131902
131941
|
return nodes.map((n2) => n2.id).sort().join(",");
|
|
131903
131942
|
}, [collectionKey, nodes]);
|
|
131904
131943
|
const mapData = useMemo(() => {
|
|
131944
|
+
console.log("[OverworldMapPanel] mapData memo recalculating", { nodeCount: nodes.length, customRegions: customRegions.length });
|
|
131905
131945
|
const map2 = nodesToUnifiedOverworldMap(nodes, {
|
|
131906
131946
|
includeDevDependencies,
|
|
131907
131947
|
regionLayout,
|
|
131908
131948
|
customRegions
|
|
131909
131949
|
// Pass through custom regions for manual layout
|
|
131910
131950
|
});
|
|
131951
|
+
console.log("[OverworldMapPanel] mapData created:", { mapNodeCount: map2.nodes.length, mapRegions: map2.regions.length });
|
|
131911
131952
|
mapDataRef.current = map2;
|
|
131912
131953
|
return map2;
|
|
131913
131954
|
}, [nodes, includeDevDependencies, regionLayout, customRegions]);
|
|
@@ -132000,6 +132041,9 @@ const OverworldMapPanelContent = ({
|
|
|
132000
132041
|
app.stage.addChild(viewport);
|
|
132001
132042
|
viewportRef.current = viewport;
|
|
132002
132043
|
worldContainerRef.current = viewport;
|
|
132044
|
+
if (onViewportReady) {
|
|
132045
|
+
onViewportReady(viewport);
|
|
132046
|
+
}
|
|
132003
132047
|
const renderer = new IsometricRenderer({
|
|
132004
132048
|
viewport,
|
|
132005
132049
|
atlas: textures,
|
|
@@ -132295,9 +132339,44 @@ const OverworldMapPanelContent = ({
|
|
|
132295
132339
|
};
|
|
132296
132340
|
}, [stableCollectionKey, width, height]);
|
|
132297
132341
|
useEffect(() => {
|
|
132298
|
-
|
|
132342
|
+
var _a;
|
|
132343
|
+
console.log("[OverworldMapPanel] Scene render effect triggered", { hasViewport: !!viewportRef.current, hasRenderer: !!rendererRef.current, hasMapData: !!mapData });
|
|
132344
|
+
if (!viewportRef.current || !rendererRef.current || !mapData || !appRef.current) return;
|
|
132345
|
+
if ((_a = interactionRef.current) == null ? void 0 : _a.isDragging()) {
|
|
132346
|
+
console.log("[OverworldMapPanel] Skipping scene re-render - drag in progress");
|
|
132347
|
+
return;
|
|
132348
|
+
}
|
|
132349
|
+
console.log("[OverworldMapPanel] Re-rendering scene with", { nodes: mapData.nodes.length, regions: mapData.regions.length });
|
|
132299
132350
|
const renderer = rendererRef.current;
|
|
132300
132351
|
const viewport = viewportRef.current;
|
|
132352
|
+
const app = appRef.current;
|
|
132353
|
+
const existingKeys = new Set(renderer.getTextureKeys().filter((k2) => k2.startsWith("building-")));
|
|
132354
|
+
const neededCombos = /* @__PURE__ */ new Set();
|
|
132355
|
+
for (const node2 of mapData.nodes) {
|
|
132356
|
+
const key = `building-${node2.size.toFixed(2)}-${node2.color}`;
|
|
132357
|
+
neededCombos.add(key);
|
|
132358
|
+
}
|
|
132359
|
+
console.log("[OverworldMapPanel] Checking sprites:", { existing: existingKeys.size, needed: neededCombos.size });
|
|
132360
|
+
let generatedCount = 0;
|
|
132361
|
+
for (const key of neededCombos) {
|
|
132362
|
+
if (!renderer.hasTexture(key)) {
|
|
132363
|
+
const [, sizeStr, colorHex] = key.split("-");
|
|
132364
|
+
const size = parseFloat(sizeStr);
|
|
132365
|
+
const color2 = parseInt(colorHex.replace("#", ""), 16);
|
|
132366
|
+
console.log("[OverworldMapPanel] Generating missing sprite:", { key, size, color: color2 });
|
|
132367
|
+
const buildingGraphics = generateBuildingSprite({ size, color: color2 });
|
|
132368
|
+
const texture = app.renderer.generateTexture({
|
|
132369
|
+
target: buildingGraphics,
|
|
132370
|
+
resolution: 2
|
|
132371
|
+
});
|
|
132372
|
+
renderer.addTexture(key, texture);
|
|
132373
|
+
buildingGraphics.destroy();
|
|
132374
|
+
generatedCount++;
|
|
132375
|
+
}
|
|
132376
|
+
}
|
|
132377
|
+
if (generatedCount > 0) {
|
|
132378
|
+
console.log("[OverworldMapPanel] Generated", generatedCount, "new sprite textures");
|
|
132379
|
+
}
|
|
132301
132380
|
if (sceneContainersRef.current) {
|
|
132302
132381
|
viewport.removeChild(sceneContainersRef.current.background);
|
|
132303
132382
|
viewport.removeChild(sceneContainersRef.current.tiles);
|
|
@@ -132310,7 +132389,9 @@ const OverworldMapPanelContent = ({
|
|
|
132310
132389
|
sceneContainersRef.current.paths.destroy({ children: true });
|
|
132311
132390
|
sceneContainersRef.current.nodes.destroy({ children: true });
|
|
132312
132391
|
}
|
|
132392
|
+
console.log("[OverworldMapPanel] Calling renderer.renderScene...");
|
|
132313
132393
|
const scene = renderer.renderScene(mapData, true);
|
|
132394
|
+
console.log("[OverworldMapPanel] Scene rendered, sprite count:", scene.spriteInstances.size);
|
|
132314
132395
|
viewport.addChild(scene.background);
|
|
132315
132396
|
viewport.addChild(scene.tiles);
|
|
132316
132397
|
viewport.addChild(scene.bridges);
|
|
@@ -132609,6 +132690,8 @@ const CollectionMapPanelContent = ({
|
|
|
132609
132690
|
var _a;
|
|
132610
132691
|
const customRegions = ((_a = collection.metadata) == null ? void 0 : _a.customRegions) || [];
|
|
132611
132692
|
const [isEditingRegions, setIsEditingRegions] = React2__default.useState(false);
|
|
132693
|
+
const viewportRef = React2__default.useRef(null);
|
|
132694
|
+
const canvasRef = React2__default.useRef(null);
|
|
132612
132695
|
const handleRenameRegion = useCallback(async (regionId, name2) => {
|
|
132613
132696
|
await regionCallbacks.onRegionUpdated(collection.id, regionId, { name: name2 });
|
|
132614
132697
|
}, [regionCallbacks, collection.id]);
|
|
@@ -132620,17 +132703,73 @@ const CollectionMapPanelContent = ({
|
|
|
132620
132703
|
}
|
|
132621
132704
|
await regionCallbacks.onRegionDeleted(collection.id, regionId);
|
|
132622
132705
|
}, [regionCallbacks, collection.id, customRegions.length]);
|
|
132623
|
-
const handleProjectMoved = useCallback(async (projectId, gridX, gridY) => {
|
|
132624
|
-
var _a2;
|
|
132706
|
+
const handleProjectMoved = useCallback(async (projectId, gridX, gridY, metadata) => {
|
|
132707
|
+
var _a2, _b, _c, _d;
|
|
132708
|
+
console.log("[handleProjectMoved] Moving project:", { projectId, gridX, gridY });
|
|
132709
|
+
const isNewRepo = !!metadata;
|
|
132710
|
+
const existingMembership = memberships.find((m2) => m2.repositoryId === projectId);
|
|
132711
|
+
if (!isNewRepo && !existingMembership) {
|
|
132712
|
+
const error = new Error(
|
|
132713
|
+
`[handleProjectMoved] FATAL ERROR: Attempting to move repo "${projectId}" that doesn't exist in collection!
|
|
132714
|
+
Memberships (${memberships.length}): [${memberships.map((m2) => m2.repositoryId).join(", ")}]
|
|
132715
|
+
This indicates a sprite was rendered without valid backing data.`
|
|
132716
|
+
);
|
|
132717
|
+
console.error(error);
|
|
132718
|
+
throw error;
|
|
132719
|
+
}
|
|
132720
|
+
const isFirstPlacement = isNewRepo || !!existingMembership && !((_a2 = existingMembership.metadata) == null ? void 0 : _a2.regionId);
|
|
132721
|
+
console.log("[handleProjectMoved] Placement check:", {
|
|
132722
|
+
isNewRepo,
|
|
132723
|
+
existingMembership: existingMembership ? { id: existingMembership.repositoryId, hasMetadata: !!existingMembership.metadata, regionId: (_b = existingMembership.metadata) == null ? void 0 : _b.regionId } : null,
|
|
132724
|
+
isExistingWithoutRegion: !!existingMembership && !((_c = existingMembership.metadata) == null ? void 0 : _c.regionId),
|
|
132725
|
+
isFirstPlacement
|
|
132726
|
+
});
|
|
132625
132727
|
const regionCol = Math.floor(gridX / REGION_SIZE_TILES);
|
|
132626
132728
|
const regionRow = Math.floor(gridY / REGION_SIZE_TILES);
|
|
132627
132729
|
const regionOrder = regionRow * 10 + regionCol;
|
|
132628
132730
|
const targetRegion = customRegions.find((r2) => r2.order === regionOrder);
|
|
132629
132731
|
const newRegionId = targetRegion == null ? void 0 : targetRegion.id;
|
|
132732
|
+
console.log("[handleProjectMoved] Target region:", { regionOrder, newRegionId, targetRegion });
|
|
132630
132733
|
if (!newRegionId) {
|
|
132631
132734
|
console.warn("[CollectionMapPanel] ⚠️ Could not determine region for position:", { gridX, gridY, regionOrder });
|
|
132632
132735
|
return;
|
|
132633
132736
|
}
|
|
132737
|
+
if (isFirstPlacement) {
|
|
132738
|
+
console.log("[PLACEMENT] Starting placement for:", projectId);
|
|
132739
|
+
console.log("[PLACEMENT] Target region:", newRegionId);
|
|
132740
|
+
console.log("[PLACEMENT] Target position:", { gridX, gridY });
|
|
132741
|
+
try {
|
|
132742
|
+
if (isNewRepo) {
|
|
132743
|
+
if (!onProjectAdded) {
|
|
132744
|
+
throw new Error("onProjectAdded callback not available");
|
|
132745
|
+
}
|
|
132746
|
+
console.log("[PLACEMENT] Step 1: Calling onProjectAdded (repo not in collection yet)...");
|
|
132747
|
+
await onProjectAdded(projectId, metadata);
|
|
132748
|
+
console.log("[PLACEMENT] Step 1: onProjectAdded completed");
|
|
132749
|
+
} else {
|
|
132750
|
+
console.log("[PLACEMENT] Step 1: SKIPPED (repo already in collection as membership)");
|
|
132751
|
+
}
|
|
132752
|
+
const regionBoundsX2 = regionCol * REGION_SIZE_TILES;
|
|
132753
|
+
const regionBoundsY2 = regionRow * REGION_SIZE_TILES;
|
|
132754
|
+
const relativeGridX2 = gridX - regionBoundsX2;
|
|
132755
|
+
const relativeGridY2 = gridY - regionBoundsY2;
|
|
132756
|
+
const layout2 = {
|
|
132757
|
+
gridX: relativeGridX2,
|
|
132758
|
+
gridY: relativeGridY2
|
|
132759
|
+
};
|
|
132760
|
+
console.log("[PLACEMENT] Step 2: Setting position:", layout2);
|
|
132761
|
+
await regionCallbacks.onRepositoryPositionUpdated(collection.id, projectId, layout2);
|
|
132762
|
+
console.log("[PLACEMENT] Step 2: Position updated");
|
|
132763
|
+
console.log("[PLACEMENT] Step 3: Assigning region:", newRegionId);
|
|
132764
|
+
await regionCallbacks.onRepositoryAssigned(collection.id, projectId, newRegionId);
|
|
132765
|
+
console.log("[PLACEMENT] Step 3: Region assigned");
|
|
132766
|
+
console.log("[PLACEMENT] ✓ Placement completed successfully");
|
|
132767
|
+
} catch (error) {
|
|
132768
|
+
console.error("[PLACEMENT] ✗ ERROR during placement:", error);
|
|
132769
|
+
throw error;
|
|
132770
|
+
}
|
|
132771
|
+
return;
|
|
132772
|
+
}
|
|
132634
132773
|
const regionBoundsX = regionCol * REGION_SIZE_TILES;
|
|
132635
132774
|
const regionBoundsY = regionRow * REGION_SIZE_TILES;
|
|
132636
132775
|
const relativeGridX = gridX - regionBoundsX;
|
|
@@ -132639,40 +132778,34 @@ const CollectionMapPanelContent = ({
|
|
|
132639
132778
|
gridX: relativeGridX,
|
|
132640
132779
|
gridY: relativeGridY
|
|
132641
132780
|
};
|
|
132781
|
+
console.log("[handleProjectMoved] Saving position:", { layout, newRegionId });
|
|
132642
132782
|
await regionCallbacks.onRepositoryPositionUpdated(collection.id, projectId, layout);
|
|
132643
132783
|
const membership = memberships.find((m2) => m2.repositoryId === projectId);
|
|
132644
|
-
const oldRegionId = (
|
|
132784
|
+
const oldRegionId = (_d = membership == null ? void 0 : membership.metadata) == null ? void 0 : _d.regionId;
|
|
132645
132785
|
if (oldRegionId !== newRegionId) {
|
|
132786
|
+
console.log("[handleProjectMoved] Region changed, updating assignment:", { oldRegionId, newRegionId });
|
|
132646
132787
|
await regionCallbacks.onRepositoryAssigned(collection.id, projectId, newRegionId);
|
|
132647
132788
|
}
|
|
132648
|
-
}, [collection.id, regionCallbacks, memberships, customRegions]);
|
|
132789
|
+
}, [collection.id, regionCallbacks, memberships, customRegions, onProjectAdded]);
|
|
132649
132790
|
const handleProjectDrop = useCallback(async (data, event) => {
|
|
132650
|
-
|
|
132651
|
-
if (!onProjectAdded) {
|
|
132652
|
-
console.warn("No onProjectAdded callback provided - cannot add project to collection");
|
|
132653
|
-
return;
|
|
132654
|
-
}
|
|
132791
|
+
console.log("[handleProjectDrop] Drop event:", { data, eventType: event.type });
|
|
132655
132792
|
const repositoryPath = data.primaryData;
|
|
132656
132793
|
const repositoryMetadata = data.metadata || {};
|
|
132657
|
-
|
|
132658
|
-
|
|
132659
|
-
|
|
132660
|
-
|
|
132661
|
-
|
|
132662
|
-
|
|
132663
|
-
|
|
132664
|
-
|
|
132665
|
-
|
|
132666
|
-
|
|
132667
|
-
|
|
132668
|
-
|
|
132669
|
-
|
|
132670
|
-
|
|
132671
|
-
|
|
132672
|
-
await regionCallbacks.onRepositoryAssigned(collection.id, repositoryPath, targetRegionId);
|
|
132673
|
-
}
|
|
132674
|
-
}
|
|
132675
|
-
}, [collection.id, onProjectAdded, customRegions, regionCallbacks]);
|
|
132794
|
+
const repoId = (repositoryMetadata == null ? void 0 : repositoryMetadata.name) || repositoryPath;
|
|
132795
|
+
console.log("[handleProjectDrop] Converting drop position to grid coords");
|
|
132796
|
+
const gridCoords = domEventToGridCoords(
|
|
132797
|
+
event.clientX,
|
|
132798
|
+
event.clientY,
|
|
132799
|
+
viewportRef.current,
|
|
132800
|
+
canvasRef.current
|
|
132801
|
+
);
|
|
132802
|
+
console.log("[handleProjectDrop] Drop at grid position:", gridCoords);
|
|
132803
|
+
const gridX = Math.round(gridCoords.gridX);
|
|
132804
|
+
const gridY = Math.round(gridCoords.gridY);
|
|
132805
|
+
console.log("[handleProjectDrop] Snapped to grid:", { gridX, gridY });
|
|
132806
|
+
console.log("[handleProjectDrop] Placing repo at drop position");
|
|
132807
|
+
await handleProjectMoved(repoId, gridX, gridY, repositoryMetadata);
|
|
132808
|
+
}, [handleProjectMoved]);
|
|
132676
132809
|
const { isDragOver, ...dropZoneProps } = useDropZone({
|
|
132677
132810
|
handlers: [
|
|
132678
132811
|
{
|
|
@@ -132683,10 +132816,16 @@ const CollectionMapPanelContent = ({
|
|
|
132683
132816
|
showVisualFeedback: true
|
|
132684
132817
|
});
|
|
132685
132818
|
const nodes = useMemo(() => {
|
|
132819
|
+
console.log("[nodes memo] Converting memberships to nodes", {
|
|
132820
|
+
collectionId: collection.id,
|
|
132821
|
+
totalMemberships: memberships.length,
|
|
132822
|
+
totalRepositories: repositories.length
|
|
132823
|
+
});
|
|
132686
132824
|
const collectionMemberships = memberships.filter(
|
|
132687
132825
|
(m2) => m2.collectionId === collection.id
|
|
132688
132826
|
);
|
|
132689
|
-
|
|
132827
|
+
console.log("[nodes memo] Filtered memberships for collection:", collectionMemberships);
|
|
132828
|
+
const memberNodes = collectionMemberships.map((membership) => {
|
|
132690
132829
|
var _a2, _b, _c, _d, _e2, _f, _g;
|
|
132691
132830
|
const repo = repositories.find((r2) => {
|
|
132692
132831
|
var _a3;
|
|
@@ -132694,8 +132833,10 @@ const CollectionMapPanelContent = ({
|
|
|
132694
132833
|
return repoId === membership.repositoryId;
|
|
132695
132834
|
});
|
|
132696
132835
|
if (!repo) {
|
|
132836
|
+
console.warn("[nodes memo] No repository found for membership:", membership.repositoryId);
|
|
132697
132837
|
return null;
|
|
132698
132838
|
}
|
|
132839
|
+
console.log("[nodes memo] Creating node for:", membership.repositoryId);
|
|
132699
132840
|
let category;
|
|
132700
132841
|
if (repo.github) {
|
|
132701
132842
|
category = "git-repo";
|
|
@@ -132728,7 +132869,54 @@ const CollectionMapPanelContent = ({
|
|
|
132728
132869
|
};
|
|
132729
132870
|
return node2;
|
|
132730
132871
|
}).filter((n2) => n2 !== null);
|
|
132872
|
+
console.log("[nodes memo] Created nodes:", { total: memberNodes.length });
|
|
132873
|
+
return memberNodes;
|
|
132731
132874
|
}, [collection.id, memberships, repositories, dependencies]);
|
|
132875
|
+
const validatedNodes = useMemo(() => {
|
|
132876
|
+
console.log("[validatedNodes] Validating nodes:", nodes.length);
|
|
132877
|
+
const nodesWithPositions = nodes.filter(
|
|
132878
|
+
(n2) => {
|
|
132879
|
+
var _a2, _b;
|
|
132880
|
+
return n2.regionId && ((_a2 = n2.layout) == null ? void 0 : _a2.gridX) !== void 0 && ((_b = n2.layout) == null ? void 0 : _b.gridY) !== void 0;
|
|
132881
|
+
}
|
|
132882
|
+
);
|
|
132883
|
+
const isInitialLoad = nodesWithPositions.length === 0 && nodes.length > 0;
|
|
132884
|
+
if (isInitialLoad) {
|
|
132885
|
+
console.log("[validatedNodes] Initial load detected, skipping validation (auto-layout will run)");
|
|
132886
|
+
return nodes;
|
|
132887
|
+
}
|
|
132888
|
+
const invalidNodes = [];
|
|
132889
|
+
nodes.forEach((node2) => {
|
|
132890
|
+
var _a2, _b;
|
|
132891
|
+
const hasRegion = !!node2.regionId;
|
|
132892
|
+
const hasPosition = ((_a2 = node2.layout) == null ? void 0 : _a2.gridX) !== void 0 && ((_b = node2.layout) == null ? void 0 : _b.gridY) !== void 0;
|
|
132893
|
+
if (!hasRegion) {
|
|
132894
|
+
invalidNodes.push({
|
|
132895
|
+
id: node2.id,
|
|
132896
|
+
reason: `Missing regionId (has layout: ${hasPosition})`
|
|
132897
|
+
});
|
|
132898
|
+
}
|
|
132899
|
+
});
|
|
132900
|
+
if (invalidNodes.length > 0) {
|
|
132901
|
+
const error = new Error(
|
|
132902
|
+
`[CollectionMapPanel] FATAL: Attempting to render nodes without regionId!
|
|
132903
|
+
This should never happen. All nodes must have a regionId before rendering.
|
|
132904
|
+
(Nodes without layout positions will be auto-positioned using circle packing)
|
|
132905
|
+
|
|
132906
|
+
Invalid nodes (${invalidNodes.length}):
|
|
132907
|
+
` + invalidNodes.map((n2) => ` - ${n2.id}: ${n2.reason}`).join("\n") + `
|
|
132908
|
+
|
|
132909
|
+
Total nodes: ${nodes.length}
|
|
132910
|
+
Collection: ${collection.id}
|
|
132911
|
+
|
|
132912
|
+
This is not initial load - auto-assignment should have already run.`
|
|
132913
|
+
);
|
|
132914
|
+
console.error(error);
|
|
132915
|
+
throw error;
|
|
132916
|
+
}
|
|
132917
|
+
console.log("[validatedNodes] ✓ All nodes valid");
|
|
132918
|
+
return nodes;
|
|
132919
|
+
}, [nodes, collection.id]);
|
|
132732
132920
|
const hasComputedLayout = useRef(false);
|
|
132733
132921
|
const prevCollectionIdRef = useRef(null);
|
|
132734
132922
|
useEffect(() => {
|
|
@@ -132743,14 +132931,19 @@ const CollectionMapPanelContent = ({
|
|
|
132743
132931
|
return;
|
|
132744
132932
|
}
|
|
132745
132933
|
const needsRegions = customRegions.length === 0 && !nodes.some((n2) => n2.regionId);
|
|
132746
|
-
const
|
|
132747
|
-
|
|
132748
|
-
|
|
132934
|
+
const nodesWithPositions = nodes.filter(
|
|
132935
|
+
(n2) => {
|
|
132936
|
+
var _a2, _b;
|
|
132937
|
+
return n2.regionId && ((_a2 = n2.layout) == null ? void 0 : _a2.gridX) !== void 0 && ((_b = n2.layout) == null ? void 0 : _b.gridY) !== void 0;
|
|
132938
|
+
}
|
|
132749
132939
|
);
|
|
132940
|
+
const isInitialLoad = nodesWithPositions.length === 0 && nodes.length > 0;
|
|
132941
|
+
const needsLayout = isInitialLoad;
|
|
132750
132942
|
if (!needsRegions && !needsLayout) {
|
|
132751
132943
|
hasComputedLayout.current = true;
|
|
132752
132944
|
return;
|
|
132753
132945
|
}
|
|
132946
|
+
hasComputedLayout.current = true;
|
|
132754
132947
|
const map2 = nodesToUnifiedOverworldMap(nodes, {
|
|
132755
132948
|
regionLayout,
|
|
132756
132949
|
customRegions
|
|
@@ -132763,13 +132956,14 @@ const CollectionMapPanelContent = ({
|
|
|
132763
132956
|
id: region.id,
|
|
132764
132957
|
name: region.name,
|
|
132765
132958
|
order: index2,
|
|
132766
|
-
createdAt:
|
|
132959
|
+
createdAt: 0
|
|
132960
|
+
// Deterministic value - regions don't need real timestamps
|
|
132767
132961
|
}));
|
|
132768
132962
|
}
|
|
132769
|
-
const
|
|
132963
|
+
const anyMissingRegionId = nodes.some((n2) => !n2.regionId);
|
|
132770
132964
|
updates.positions = map2.nodes.filter((node2) => {
|
|
132771
132965
|
const originalNode = nodes.find((n2) => n2.id === node2.id);
|
|
132772
|
-
const needsUpdate =
|
|
132966
|
+
const needsUpdate = anyMissingRegionId || !(originalNode == null ? void 0 : originalNode.layout) || originalNode.layout.gridX === void 0 || originalNode.layout.gridY === void 0;
|
|
132773
132967
|
return needsUpdate;
|
|
132774
132968
|
}).map((node2) => ({
|
|
132775
132969
|
repositoryId: node2.id,
|
|
@@ -132794,19 +132988,24 @@ const CollectionMapPanelContent = ({
|
|
|
132794
132988
|
}
|
|
132795
132989
|
}
|
|
132796
132990
|
await regionCallbacks.onBatchLayoutInitialized(collection.id, updates);
|
|
132797
|
-
hasComputedLayout.current = true;
|
|
132798
132991
|
})();
|
|
132799
132992
|
}, [collection.id, nodes, regionLayout, customRegions, regionCallbacks]);
|
|
132993
|
+
const handleViewportReady = useCallback((viewport) => {
|
|
132994
|
+
console.log("[CollectionMapPanel] Viewport ready for coordinate conversion");
|
|
132995
|
+
viewportRef.current = viewport;
|
|
132996
|
+
}, []);
|
|
132800
132997
|
return /* @__PURE__ */ jsxs(
|
|
132801
132998
|
"div",
|
|
132802
132999
|
{
|
|
133000
|
+
ref: canvasRef,
|
|
132803
133001
|
style: {
|
|
132804
133002
|
position: "relative",
|
|
132805
133003
|
width: "100%",
|
|
132806
133004
|
height: "100%",
|
|
132807
133005
|
overflow: "hidden",
|
|
132808
|
-
|
|
132809
|
-
|
|
133006
|
+
boxSizing: "border-box",
|
|
133007
|
+
border: isDragOver ? "2px solid #3b82f6" : "2px solid transparent",
|
|
133008
|
+
transition: "border-color 0.2s ease"
|
|
132810
133009
|
},
|
|
132811
133010
|
...dropZoneProps,
|
|
132812
133011
|
children: [
|
|
@@ -132843,17 +133042,18 @@ const CollectionMapPanelContent = ({
|
|
|
132843
133042
|
/* @__PURE__ */ jsx(
|
|
132844
133043
|
OverworldMapPanelContent,
|
|
132845
133044
|
{
|
|
132846
|
-
nodes,
|
|
133045
|
+
nodes: validatedNodes,
|
|
132847
133046
|
regionLayout,
|
|
132848
133047
|
isLoading,
|
|
132849
133048
|
isEditingRegions,
|
|
132850
133049
|
customRegions,
|
|
132851
133050
|
collectionKey: collection.id,
|
|
132852
133051
|
onProjectMoved: handleProjectMoved,
|
|
133052
|
+
onViewportReady: handleViewportReady,
|
|
132853
133053
|
onAddRegion: async (position2) => {
|
|
132854
133054
|
const order2 = position2.row * 10 + position2.col;
|
|
132855
133055
|
const name2 = `Region ${customRegions.length + 1}`;
|
|
132856
|
-
await regionCallbacks.onRegionCreated(collection.id, { name: name2, order: order2 });
|
|
133056
|
+
await regionCallbacks.onRegionCreated(collection.id, { name: name2, order: order2, createdAt: 0 });
|
|
132857
133057
|
},
|
|
132858
133058
|
onRenameRegion: handleRenameRegion,
|
|
132859
133059
|
onDeleteRegion: handleDeleteRegion
|
|
@@ -132872,8 +133072,13 @@ const CollectionMapPanel = ({ context: context2, actions }) => {
|
|
|
132872
133072
|
const dependencies = ((_d = selectedCollectionView == null ? void 0 : selectedCollectionView.data) == null ? void 0 : _d.dependencies) || {};
|
|
132873
133073
|
const isLoading = (selectedCollectionView == null ? void 0 : selectedCollectionView.loading) ?? false;
|
|
132874
133074
|
const handleProjectAdded = useCallback((repositoryPath, repositoryMetadata) => {
|
|
132875
|
-
|
|
133075
|
+
console.log("[handleProjectAdded] Called with:", { repositoryPath, repositoryMetadata, selectedCollection: selectedCollection == null ? void 0 : selectedCollection.id });
|
|
133076
|
+
if (!selectedCollection) {
|
|
133077
|
+
console.warn("[handleProjectAdded] No selected collection");
|
|
133078
|
+
return;
|
|
133079
|
+
}
|
|
132876
133080
|
if (actions.addRepositoryToCollection) {
|
|
133081
|
+
console.log("[handleProjectAdded] Calling addRepositoryToCollection");
|
|
132877
133082
|
actions.addRepositoryToCollection(selectedCollection.id, repositoryPath, repositoryMetadata);
|
|
132878
133083
|
} else {
|
|
132879
133084
|
console.warn("Actions does not support addRepositoryToCollection - drag-drop feature requires context integration");
|
|
@@ -133954,4 +134159,4 @@ export {
|
|
|
133954
134159
|
UPDATE_PRIORITY as y,
|
|
133955
134160
|
removeItems as z
|
|
133956
134161
|
};
|
|
133957
|
-
//# sourceMappingURL=index-
|
|
134162
|
+
//# sourceMappingURL=index-BOgxBkoa.js.map
|