Skip to content

Commit 34779b4

Browse files
authored
Merge pull request #84 from vitruv-tools/83-users-should-not-see-detail-button-in-project-page
83 users should not see detail button in project page
2 parents 2eee199 + 69c4a3b commit 34779b4

File tree

3 files changed

+54
-63
lines changed

3 files changed

+54
-63
lines changed

src/components/ui/VsumTabs.tsx

Lines changed: 3 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,7 @@ export const VsumTabs: React.FC<VsumTabsProps> = ({ openVsums, activeVsumId, onA
3333
const edit = edits[id];
3434
const details = detailsById[id];
3535
if (!edit || !details) { map[id] = false; return; }
36-
const detailsSourceIds = (details.metaModels || [])
37-
.map(m => (typeof m.sourceId === 'number' ? m.sourceId : undefined))
38-
.filter((v): v is number => typeof v === 'number');
39-
map[id] = !areIdArraysEqual(edit.metaModelSourceIds, detailsSourceIds);
36+
map[id] = !areIdArraysEqual(edit.metaModelSourceIds);
4037
});
4138
return map;
4239
}, [openVsums, edits, detailsById]);
@@ -48,13 +45,6 @@ export const VsumTabs: React.FC<VsumTabsProps> = ({ openVsums, activeVsumId, onA
4845
try {
4946
const res = await apiService.getVsumDetails(id);
5047
setDetailsById(prev => ({ ...prev, [id]: res.data }));
51-
const seededSourceIds = (res.data.metaModels || [])
52-
.map(m => (typeof m.sourceId === 'number' ? m.sourceId : undefined))
53-
.filter((v): v is number => typeof v === 'number');
54-
setEdits(prev => ({
55-
...prev,
56-
[id]: { metaModelSourceIds: seededSourceIds }
57-
}));
5848
} catch (e) {
5949
setError(e instanceof Error ? e.message : 'Failed to load VSUM details');
6050
}
@@ -72,9 +62,7 @@ export const VsumTabs: React.FC<VsumTabsProps> = ({ openVsums, activeVsumId, onA
7262
const edit = edits[id];
7363

7464
// fallback from details using sourceId
75-
const fallbackSourceIds = (detailsById[id]?.metaModels || [])
76-
.map(m => (typeof m.sourceId === 'number' ? m.sourceId : undefined))
77-
.filter((v): v is number => typeof v === 'number');
65+
const fallbackSourceIds = (detailsById[id]?.metaModels);
7866

7967
const metaModelSourceIds =
8068
override?.metaModelSourceIds ?? edit?.metaModelSourceIds ?? fallbackSourceIds;
@@ -96,16 +84,6 @@ export const VsumTabs: React.FC<VsumTabsProps> = ({ openVsums, activeVsumId, onA
9684
const res = await apiService.getVsumDetails(id);
9785
setDetailsById(prev => ({ ...prev, [id]: res.data }));
9886

99-
// sync local edits with server (by sourceId again)
100-
const serverSourceIds = (res.data.metaModels || [])
101-
.map(m => (typeof m.sourceId === 'number' ? m.sourceId : undefined))
102-
.filter((v): v is number => typeof v === 'number');
103-
104-
setEdits(prev => ({
105-
...prev,
106-
[id]: { metaModelSourceIds: serverSourceIds },
107-
}));
108-
10987
window.dispatchEvent(new CustomEvent('vitruv.refreshVsums'));
11088
} catch (e) {
11189
setError(e instanceof Error ? e.message : 'Failed to save VSUM');
@@ -133,11 +111,7 @@ export const VsumTabs: React.FC<VsumTabsProps> = ({ openVsums, activeVsumId, onA
133111

134112
if (typeof sourceId !== 'number') return;
135113

136-
const current = edits[activeVsumId] || {
137-
metaModelSourceIds: (detailsById[activeVsumId!]?.metaModels || [])
138-
.map(m => (typeof m.sourceId === 'number' ? m.sourceId : undefined))
139-
.filter((v): v is number => typeof v === 'number')
140-
};
114+
const current = edits[activeVsumId];
141115

142116
if (current.metaModelSourceIds.includes(sourceId)) return;
143117

src/components/ui/VsumsPanel.tsx

Lines changed: 50 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -223,37 +223,59 @@ export const VsumsPanel: React.FC = () => {
223223

224224
<div style={sectionStyle}>All</div>
225225

226-
{items.map((item) => (
227-
<div
228-
key={item.id}
229-
style={cardStyle}
230-
onDoubleClick={() =>
231-
window.dispatchEvent(new CustomEvent('vitruv.openVsum', { detail: { id: item.id } }))
232-
}
233-
>
234-
<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', gap: 8 }}>
235-
<div style={{ display: 'flex', flexDirection: 'column' }}>
236-
<div style={{ fontWeight: 700, color: '#2c3e50' }}>{item.name}</div>
237-
<div style={{ fontSize: 12, color: '#5a6c7d' }}>
238-
Created: {formatDateTime(item.createdAt)}
226+
{items.map((item) => {
227+
const role = (item as any).role as string | undefined;
228+
const canManage = role === 'OWNER';
229+
return (
230+
<div
231+
key={item.id}
232+
style={cardStyle}
233+
onDoubleClick={() =>
234+
window.dispatchEvent(new CustomEvent('vitruv.openVsum', { detail: { id: item.id } }))
235+
}
236+
>
237+
<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', gap: 8 }}>
238+
<div style={{ display: 'flex', flexDirection: 'column' }}>
239+
<div style={{ fontWeight: 700, color: '#2c3e50', display: 'flex', alignItems: 'center', gap: 8 }}>
240+
{item.name}
241+
{role && (
242+
<span
243+
style={{
244+
padding: '2px 6px',
245+
borderRadius: 6,
246+
fontSize: 11,
247+
fontWeight: 700,
248+
border: '1px solid #e5e7eb',
249+
background: role === 'OWNER' ? '#ecfdf5' : '#f3f4f6',
250+
color: role === 'OWNER' ? '#065f46' : '#374151',
251+
}}
252+
>
253+
{role}
254+
</span>
255+
)}
256+
</div>
257+
<div style={{ fontSize: 12, color: '#5a6c7d' }}>Created: {formatDateTime(item.createdAt)}</div>
239258
</div>
259+
260+
{canManage && (
261+
<button
262+
onClick={() => setDetailsId(item.id)}
263+
style={{
264+
padding: '6px 10px',
265+
border: '1px solid #dee2e6',
266+
borderRadius: 6,
267+
background: '#ffffff',
268+
cursor: 'pointer',
269+
fontWeight: 600,
270+
}}
271+
>
272+
Details
273+
</button>
274+
)}
240275
</div>
241-
<button
242-
onClick={() => setDetailsId(item.id)}
243-
style={{
244-
padding: '6px 10px',
245-
border: '1px solid #dee2e6',
246-
borderRadius: 6,
247-
background: '#ffffff',
248-
cursor: 'pointer',
249-
fontWeight: 600,
250-
}}
251-
>
252-
Details
253-
</button>
254276
</div>
255-
</div>
256-
))}
277+
);
278+
})}
257279

258280
{!loading && items.length === 0 && (
259281
<div style={{ textAlign: 'center', color: '#6b7280', marginTop: 40, fontStyle: 'italic' }}>

src/types/vsum.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,11 @@ export interface Vsum {
88

99
export interface VsumMetaModelRef {
1010
id: number;
11-
sourceId: number;
1211
name: string;
13-
description: string;
14-
domain: string;
15-
keyword: string[];
12+
role: string;
1613
createdAt: string;
1714
updatedAt: string;
1815
removedAt?: string | null;
19-
ecoreFileId: number;
20-
genModelFileId: number;
2116
}
2217

2318
export interface VsumDetails extends Vsum {

0 commit comments

Comments
 (0)