Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
cf2d072
refactor: remove external dependency for layer sorting
richartkeil Dec 9, 2023
edf8ab0
fix: Import annotation groups correctly
Tonybodo Dec 13, 2023
2dd3c82
fix: Import for single Images
Tonybodo Dec 14, 2023
be5dd36
fix: DnD for annotation groups and Image Layers
Tonybodo Dec 14, 2023
21139d0
Feat: Add new Annotation Group
Tonybodo Dec 16, 2023
9b49968
feat: Add Annotation Groups via UI
Tonybodo Dec 16, 2023
951ce82
Merge pull request #568 from HealthML/annotation-groups-only
Tonybodo Dec 16, 2023
d241ab4
Fix: Can not drag and drop after import
Tonybodo Jan 15, 2024
16940ae
Feat: Delete AnnotationsGroups
Tonybodo Jan 16, 2024
b96499c
Merge branch 'refactor-annotation-groups-ui' into add-and-delete-anno…
Tonybodo Jan 16, 2024
455f90a
Feat: Delete annotation references from database
Tonybodo Jan 20, 2024
bee5af2
Feat: Refactor saveAs method, so that its add metadata
Tonybodo Jan 20, 2024
aa379ae
Fix: First annotation-layer not draggable
Tonybodo Feb 4, 2024
3d9643f
Feat: Confirmation popups for delete annotation groups
Tonybodo Feb 6, 2024
d59c816
Fix: Review adjustments
Tonybodo Feb 9, 2024
58be698
Refactor: SaveAs changes metadata for existing group
Tonybodo Feb 10, 2024
079385b
Fix: Flanky import and imported group naming
Tonybodo Feb 12, 2024
01750d4
Fix: Updating hasChanges on annotation groups
Tonybodo Feb 12, 2024
79d7877
Fix: Create squashed Nifti and export popup
Tonybodo Feb 12, 2024
2c6a2c7
Fix: Fixes for presentation
Tonybodo Feb 16, 2024
8c0350f
Merge pull request #567 from HealthML/refactor-annotation-groups-ui
Tonybodo Feb 24, 2024
ed85c4d
Merge pull request #573 from HealthML/add-and-delete-annotation-groups
Tonybodo Feb 24, 2024
244efd9
Merge branch 'refactor-annotation-groups' into refactor-saving
Tonybodo Feb 24, 2024
6a9566c
Fix: Merge request
Tonybodo Feb 24, 2024
46f2f94
Refactor: Remove popup for groups without metadata
Tonybodo Feb 24, 2024
e66bd44
Merge pull request #577 from HealthML/refactor-saving
Tonybodo Feb 24, 2024
075847f
Merge branch 'develop-annotation-service' into refactor-annotation-gr…
Tonybodo Feb 24, 2024
70f3eaf
Fix: File endings corrupt saving
Tonybodo Feb 27, 2024
da4c03b
Fix: Review changes
Tonybodo Feb 27, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { useSortable } from "@dnd-kit/sortable";
import { CSS } from "@dnd-kit/utilities";
import { IAnnotationGroup, ILayer } from "@visian/ui-shared";
import { observer } from "mobx-react-lite";

import { AnnotationGroupListItem } from "./group-list-item";

export const DraggableAnnotationGroupListItem = observer<{
group: IAnnotationGroup;
isActive: boolean;
isLast?: boolean;
isDragged?: boolean;
draggedLayer?: ILayer;
}>(({ group, isActive, isLast, isDragged, draggedLayer }) => {
const { attributes, listeners, setNodeRef, transform, transition } =
useSortable({ id: group.id, data: { annotationGroup: group } });

const style = {
transform: CSS.Transform.toString(transform),
transition,
opacity: isDragged ? 0.3 : 1,
};

return (
<div ref={setNodeRef} style={style} {...attributes} {...listeners}>
<AnnotationGroupListItem
group={group}
isActive={isActive}
isLast={isLast}
draggedLayer={draggedLayer}
/>
</div>
);
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { useSortable } from "@dnd-kit/sortable";
import { CSS } from "@dnd-kit/utilities";
import { ILayer } from "@visian/ui-shared";
import { observer } from "mobx-react-lite";

import { LayerListItem } from "./layer-list-item";

export const DraggableLayerListItem = observer<{
layer: ILayer;
isActive?: boolean;
isLast?: boolean;
isDragged?: boolean;
}>(({ layer, isActive, isLast, isDragged }) => {
const { attributes, listeners, setNodeRef, transform, transition } =
useSortable({
id: layer.id,
data: { layer },
});

const style = {
transform: CSS.Transform.toString(transform),
transition,
opacity: isDragged ? 0.3 : 1,

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We could add the 0.3 as a variable draggedLayerListItemOpacity (or similar) to the theme.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here with the style?

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is still open but maybe not necessary.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

From my point of view its fine, if you want to add it to the theme, feel free :D

};

return (
<div ref={setNodeRef} style={style} {...attributes} {...listeners}>
<LayerListItem layer={layer} isActive={isActive} isLast={isLast} />
</div>
);
});
64 changes: 53 additions & 11 deletions apps/editor/src/components/editor/layers/group-list-item.tsx
Original file line number Diff line number Diff line change
@@ -1,23 +1,65 @@
import { FullWidthListItem, IAnnotationGroup } from "@visian/ui-shared";
import {
SortableContext,
verticalListSortingStrategy,
} from "@dnd-kit/sortable";
import { FullWidthListItem, IAnnotationGroup, ILayer } from "@visian/ui-shared";
import { observer } from "mobx-react-lite";
import { useCallback } from "react";
import styled from "styled-components";

import { DraggableLayerListItem } from "./draggable-layer-list-item";

const ChildLayerContainer = styled.div`
margin-left: 16px;
`;

export const AnnotationGroupListItem = observer<{
group: IAnnotationGroup;
isActive: boolean;
isLast?: boolean;
}>(({ group, isActive, isLast }) => {
draggedLayer?: ILayer;
}>(({ group, isActive, isLast, draggedLayer }) => {
const toggleCollapse = useCallback(() => {
group.collapsed = !group.collapsed;
group.setCollapsed(!group.collapsed);
}, [group]);

const hideDividerForLayer = useCallback(
(layerIndex: number) => {
if (isLast && layerIndex === group.layers.length - 1) return true;
const indexOfActiveLayer = group.layers.findIndex((l) => l.isActive);
return layerIndex === indexOfActiveLayer - 1;
},
[group, isLast],
);

return (
<FullWidthListItem
icon={group.collapsed ? "arrowRight" : "arrowDown"}
onClick={toggleCollapse}
labelTx={group.title}
label={group.title}
isActive={isActive}
isLast={isLast}
/>
<>
<FullWidthListItem
icon={group.collapsed ? "arrowRight" : "arrowDown"}
onIconPress={toggleCollapse}
labelTx={group.title}
label={group.title}
isActive={isActive}
isLast={isLast && group.collapsed}
/>
{!group.collapsed && (
<ChildLayerContainer>
<SortableContext
items={group.layerIds}
strategy={verticalListSortingStrategy}
>
{group.layers.map((layer, index) => (
<DraggableLayerListItem
key={layer.id}
layer={layer}
isActive={layer.isActive}
isDragged={layer === draggedLayer}
isLast={hideDividerForLayer(index)}
/>
))}
</SortableContext>
</ChildLayerContainer>
)}
</>
);
});
Loading