Skip to content

Commit 56a7b66

Browse files
feat: Indent crossplane children component (#319)
1 parent d250686 commit 56a7b66

File tree

2 files changed

+61
-3
lines changed

2 files changed

+61
-3
lines changed

src/components/ComponentsSelection/ComponentsSelection.module.css

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,37 @@
33
background: var(--sapBackgroundColor);
44
border-bottom: 1px solid var(--sapList_BorderColor);
55
}
6+
7+
.row:hover {
8+
background: var(--sapList_Hover_Background);
9+
}
10+
11+
.row.providerRow {
12+
position: relative;
13+
padding-inline-start: calc(1rem + 16px);
14+
background: color-mix(in srgb, var(--sapBackgroundColor) 98%, #000 2%);
15+
}
16+
17+
@media (prefers-color-scheme: dark) {
18+
.row.providerRow {
19+
background: color-mix(in srgb, var(--sapBackgroundColor) 97%, #fff 3%);
20+
}
21+
}
22+
23+
.row.providerRow:hover {
24+
background: var(--sapList_Hover_Background);
25+
}
26+
27+
.row.providerRow::before {
28+
content: "";
29+
position: absolute;
30+
inset-block: 6px;
31+
inset-inline-start: 1.6rem;
32+
width: 2px;
33+
background: var(--sapList_BorderColor);
34+
}
35+
36+
.providerRow :global(ui5-checkbox) {
37+
transform: scale(0.9);
38+
transform-origin: left center;
39+
}

src/components/ComponentsSelection/ComponentsSelection.tsx

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,31 @@ export const ComponentsSelection: React.FC<ComponentsSelectionProps> = ({
4040

4141
const selectedComponents = useMemo(() => getSelectedComponents(componentsList), [componentsList]);
4242

43+
const isProvider = useCallback((componentName: string) => {
44+
return componentName.includes('provider') && componentName !== 'crossplane';
45+
}, []);
46+
4347
const searchResults = useMemo(() => {
4448
const lowerSearch = searchTerm.toLowerCase();
45-
return componentsList.filter(({ name }) => name.toLowerCase().includes(lowerSearch));
46-
}, [componentsList, searchTerm]);
49+
const filtered = componentsList.filter(({ name }) => name.toLowerCase().includes(lowerSearch));
50+
51+
// Sort components: crossplane first, then providers, then rest
52+
return filtered.sort((a, b) => {
53+
const isCrossplaneA = a.name === 'crossplane';
54+
const isCrossplaneB = b.name === 'crossplane';
55+
56+
if (isCrossplaneA && !isCrossplaneB) return -1;
57+
if (isCrossplaneB && !isCrossplaneA) return 1;
58+
59+
const isProviderA = isProvider(a.name);
60+
const isProviderB = isProvider(b.name);
61+
62+
if (isProviderA && !isProviderB) return -1;
63+
if (isProviderB && !isProviderA) return 1;
64+
65+
return a.name.localeCompare(b.name);
66+
});
67+
}, [componentsList, searchTerm, isProvider]);
4768

4869
const handleSelectionChange = useCallback(
4970
(e: Ui5CustomEvent<CheckBoxDomRef, { checked: boolean }>) => {
@@ -105,10 +126,12 @@ export const ComponentsSelection: React.FC<ComponentsSelectionProps> = ({
105126
{searchResults.length > 0 ? (
106127
searchResults.map((component) => {
107128
const providerDisabled = isProviderDisabled(component);
129+
const isProviderComponent = isProvider(component.name);
130+
108131
return (
109132
<FlexBox
110133
key={component.name}
111-
className={styles.row}
134+
className={`${styles.row} ${isProviderComponent ? styles.providerRow : ''}`}
112135
gap={10}
113136
justifyContent="SpaceBetween"
114137
data-testid={`component-row-${component.name}`}
@@ -120,6 +143,7 @@ export const ComponentsSelection: React.FC<ComponentsSelectionProps> = ({
120143
checked={component.isSelected}
121144
disabled={providerDisabled}
122145
aria-label={component.name}
146+
className={isProviderComponent ? styles.checkBox : ''}
123147
onChange={handleSelectionChange}
124148
/>
125149
<FlexBox gap={10} justifyContent="SpaceBetween" alignItems="Baseline">

0 commit comments

Comments
 (0)