@eventcatalog/core 2.59.0 → 2.60.0
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/analytics/analytics.cjs +1 -1
- package/dist/analytics/analytics.js +2 -2
- package/dist/analytics/log-build.cjs +1 -1
- package/dist/analytics/log-build.js +3 -3
- package/dist/{chunk-F5WMB6Q5.js → chunk-6FRDYEMA.js} +1 -1
- package/dist/{chunk-T3QXQPTB.js → chunk-QMWI6M2I.js} +1 -1
- package/dist/{chunk-SCDNNFXH.js → chunk-WASYSRBV.js} +1 -1
- package/dist/constants.cjs +1 -1
- package/dist/constants.js +1 -1
- package/dist/eventcatalog.cjs +1 -1
- package/dist/eventcatalog.js +3 -3
- package/eventcatalog/src/components/SideNav/ListViewSideBar/components/MessageList.tsx +1 -0
- package/eventcatalog/src/components/SideNav/ListViewSideBar/index.tsx +276 -53
- package/eventcatalog/src/layouts/VerticalSideBarLayout.astro +1 -1
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/changelog/_index.data.ts +1 -1
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/changelog/index.astro +4 -6
- package/package.json +1 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
log_build_default
|
|
3
|
-
} from "../chunk-
|
|
4
|
-
import "../chunk-
|
|
5
|
-
import "../chunk-
|
|
3
|
+
} from "../chunk-6FRDYEMA.js";
|
|
4
|
+
import "../chunk-QMWI6M2I.js";
|
|
5
|
+
import "../chunk-WASYSRBV.js";
|
|
6
6
|
import "../chunk-UPONRQSN.js";
|
|
7
7
|
export {
|
|
8
8
|
log_build_default as default
|
package/dist/constants.cjs
CHANGED
package/dist/constants.js
CHANGED
package/dist/eventcatalog.cjs
CHANGED
package/dist/eventcatalog.js
CHANGED
|
@@ -6,8 +6,8 @@ import {
|
|
|
6
6
|
} from "./chunk-PLNJC7NZ.js";
|
|
7
7
|
import {
|
|
8
8
|
log_build_default
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
9
|
+
} from "./chunk-6FRDYEMA.js";
|
|
10
|
+
import "./chunk-QMWI6M2I.js";
|
|
11
11
|
import {
|
|
12
12
|
catalogToAstro,
|
|
13
13
|
checkAndConvertMdToMdx
|
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
import "./chunk-55D645EH.js";
|
|
16
16
|
import {
|
|
17
17
|
VERSION
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-WASYSRBV.js";
|
|
19
19
|
import {
|
|
20
20
|
getProjectOutDir,
|
|
21
21
|
isAuthEnabled,
|
|
@@ -58,6 +58,7 @@ const MessageList: React.FC<MessageListProps> = ({ messages, decodedCurrentPath,
|
|
|
58
58
|
className={`flex items-center justify-between px-2 py-1.5 text-xs text-gray-600 hover:bg-purple-100 rounded-md ${
|
|
59
59
|
decodedCurrentPath.includes(message.href) ? 'bg-purple-100 ' : 'hover:bg-purple-100'
|
|
60
60
|
}`}
|
|
61
|
+
title={message.data?.sidebar?.label || message.data.name}
|
|
61
62
|
>
|
|
62
63
|
<span className="truncate">
|
|
63
64
|
<HighlightedText text={message.data?.sidebar?.label || message.data.name} searchTerm={searchTerm} />
|
|
@@ -93,6 +93,7 @@ const ServiceItem = React.memo(
|
|
|
93
93
|
toggleGroupCollapse(item.href);
|
|
94
94
|
}}
|
|
95
95
|
className="flex justify-between items-center pl-2 w-full text-xs"
|
|
96
|
+
title={item.label}
|
|
96
97
|
>
|
|
97
98
|
<span className="truncate text-xs font-bold">
|
|
98
99
|
<HighlightedText text={item.label} searchTerm={searchTerm} />
|
|
@@ -314,8 +315,41 @@ const ListViewSideBar: React.FC<ListViewSideBarProps> = ({ resources, currentPat
|
|
|
314
315
|
const [collapsedGroups, setCollapsedGroups] = useState<{ [key: string]: boolean }>(() => {
|
|
315
316
|
if (typeof window !== 'undefined') {
|
|
316
317
|
const saved = window.localStorage.getItem(STORAGE_KEY);
|
|
318
|
+
const savedState = saved ? JSON.parse(saved) : {};
|
|
319
|
+
const currentPath = window.location.pathname;
|
|
320
|
+
|
|
321
|
+
// Default all sections to collapsed
|
|
322
|
+
const defaultCollapsedState: { [key: string]: boolean } = {
|
|
323
|
+
'all-services-group': true,
|
|
324
|
+
'flows-group': true,
|
|
325
|
+
'data-group': true,
|
|
326
|
+
'designs-group': true,
|
|
327
|
+
'messagesNotInService-group': true,
|
|
328
|
+
};
|
|
329
|
+
|
|
330
|
+
// Default all domains, services, and their subsections to collapsed
|
|
331
|
+
resources.domains?.forEach((domain: any) => {
|
|
332
|
+
const isDomainActive = currentPath.includes(domain.href);
|
|
333
|
+
defaultCollapsedState[domain.href] = !isDomainActive;
|
|
334
|
+
defaultCollapsedState[`${domain.href}-entities`] = true;
|
|
335
|
+
defaultCollapsedState[`${domain.href}-subdomains`] = true;
|
|
336
|
+
defaultCollapsedState[`${domain.href}-services`] = true;
|
|
337
|
+
});
|
|
338
|
+
|
|
339
|
+
resources.services?.forEach((service: any) => {
|
|
340
|
+
const isServiceActive = currentPath.includes(service.href);
|
|
341
|
+
defaultCollapsedState[service.href] = !isServiceActive;
|
|
342
|
+
defaultCollapsedState[`${service.href}-specifications`] = true;
|
|
343
|
+
defaultCollapsedState[`${service.href}-receives`] = true;
|
|
344
|
+
defaultCollapsedState[`${service.href}-sends`] = true;
|
|
345
|
+
defaultCollapsedState[`${service.href}-entities`] = true;
|
|
346
|
+
defaultCollapsedState[`${service.href}-data`] = true;
|
|
347
|
+
defaultCollapsedState[`${service.href}-writesTo-data`] = true;
|
|
348
|
+
defaultCollapsedState[`${service.href}-readsFrom-data`] = true;
|
|
349
|
+
});
|
|
350
|
+
|
|
317
351
|
setIsInitialized(true);
|
|
318
|
-
return
|
|
352
|
+
return { ...defaultCollapsedState, ...savedState };
|
|
319
353
|
}
|
|
320
354
|
return {};
|
|
321
355
|
});
|
|
@@ -444,12 +478,99 @@ const ListViewSideBar: React.FC<ListViewSideBarProps> = ({ resources, currentPat
|
|
|
444
478
|
}
|
|
445
479
|
}, [collapsedGroups]);
|
|
446
480
|
|
|
447
|
-
// If we find a data-active element, scroll to it on mount
|
|
481
|
+
// If we find a data-active element, scroll to it on mount and open its section
|
|
448
482
|
useEffect(() => {
|
|
449
483
|
const activeElement = document.querySelector('[data-active="true"]');
|
|
450
484
|
if (activeElement) {
|
|
451
485
|
// Add y offset to the scroll position
|
|
452
486
|
activeElement.scrollIntoView({ behavior: 'instant', block: 'center' });
|
|
487
|
+
|
|
488
|
+
// Check which section the active element belongs to and open it
|
|
489
|
+
const newCollapsedState = { ...collapsedGroups };
|
|
490
|
+
|
|
491
|
+
// Check if active page is in a domain
|
|
492
|
+
data.domains?.forEach((domain: any) => {
|
|
493
|
+
if (decodedCurrentPath.includes(domain.href)) {
|
|
494
|
+
newCollapsedState[domain.href] = false;
|
|
495
|
+
|
|
496
|
+
// Check if it's in domain entities
|
|
497
|
+
const isInDomainEntities = domain.entities?.some((entity: any) => decodedCurrentPath.includes(entity.href));
|
|
498
|
+
if (isInDomainEntities) {
|
|
499
|
+
newCollapsedState[`${domain.href}-entities`] = false;
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
// Check if it's in domain services
|
|
503
|
+
const isInDomainServices = domain.services?.some((service: any) => decodedCurrentPath.includes(service.data.id));
|
|
504
|
+
if (isInDomainServices) {
|
|
505
|
+
newCollapsedState[`${domain.href}-services`] = false;
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
// Check if it's in a subdomain
|
|
509
|
+
const subdomains = domain.domains || [];
|
|
510
|
+
subdomains.forEach((subdomain: any) => {
|
|
511
|
+
const actualSubdomain = data.domains?.find((d: any) => d.id === subdomain.data.id);
|
|
512
|
+
if (actualSubdomain && decodedCurrentPath.includes(actualSubdomain.href)) {
|
|
513
|
+
newCollapsedState[`${domain.href}-subdomains`] = false;
|
|
514
|
+
newCollapsedState[actualSubdomain.href] = false;
|
|
515
|
+
|
|
516
|
+
// Check subdomain entities
|
|
517
|
+
const isInSubdomainEntities = actualSubdomain.entities?.some((entity: any) =>
|
|
518
|
+
decodedCurrentPath.includes(entity.href)
|
|
519
|
+
);
|
|
520
|
+
if (isInSubdomainEntities) {
|
|
521
|
+
newCollapsedState[`${actualSubdomain.href}-entities`] = false;
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
// Check subdomain services
|
|
525
|
+
const isInSubdomainServices = actualSubdomain.services?.some((service: any) =>
|
|
526
|
+
decodedCurrentPath.includes(service.data.id)
|
|
527
|
+
);
|
|
528
|
+
if (isInSubdomainServices) {
|
|
529
|
+
newCollapsedState[`${actualSubdomain.href}-services`] = false;
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
});
|
|
533
|
+
}
|
|
534
|
+
});
|
|
535
|
+
|
|
536
|
+
// Check if active page is a service
|
|
537
|
+
data.services?.forEach((service: ServiceItem) => {
|
|
538
|
+
if (decodedCurrentPath.includes(service.href)) {
|
|
539
|
+
newCollapsedState['all-services-group'] = false;
|
|
540
|
+
newCollapsedState[service.href] = false;
|
|
541
|
+
|
|
542
|
+
// Open specific service sections if active
|
|
543
|
+
if (decodedCurrentPath.includes('/data')) {
|
|
544
|
+
newCollapsedState[`${service.href}-data`] = false;
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
});
|
|
548
|
+
|
|
549
|
+
// Check if active page is a flow
|
|
550
|
+
const isFlow = data.flows?.some((flow: FlowItem) => decodedCurrentPath === flow.href);
|
|
551
|
+
if (isFlow) {
|
|
552
|
+
newCollapsedState['flows-group'] = false;
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
// Check if active page is a container/data store
|
|
556
|
+
const isContainer = data.containers?.some((container: any) => decodedCurrentPath === container.href);
|
|
557
|
+
if (isContainer) {
|
|
558
|
+
newCollapsedState['data-group'] = false;
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
// Check if active page is a design
|
|
562
|
+
const isDesign = data.designs?.some((design: any) => decodedCurrentPath === design.href);
|
|
563
|
+
if (isDesign) {
|
|
564
|
+
newCollapsedState['designs-group'] = false;
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
// Check if active page is an orphaned message
|
|
568
|
+
const isOrphanedMessage = data.messagesNotInService?.some((msg: MessageItem) => decodedCurrentPath === msg.href);
|
|
569
|
+
if (isOrphanedMessage) {
|
|
570
|
+
newCollapsedState['messagesNotInService-group'] = false;
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
setCollapsedGroups(newCollapsedState);
|
|
453
574
|
}
|
|
454
575
|
}, []);
|
|
455
576
|
|
|
@@ -472,6 +593,7 @@ const ListViewSideBar: React.FC<ListViewSideBarProps> = ({ resources, currentPat
|
|
|
472
593
|
newCollapsedState[domain.href] = true;
|
|
473
594
|
newCollapsedState[`${domain.href}-entities`] = true;
|
|
474
595
|
newCollapsedState[`${domain.href}-subdomains`] = true;
|
|
596
|
+
newCollapsedState[`${domain.href}-services`] = true;
|
|
475
597
|
});
|
|
476
598
|
|
|
477
599
|
// Collapse all services
|
|
@@ -495,6 +617,7 @@ const ListViewSideBar: React.FC<ListViewSideBarProps> = ({ resources, currentPat
|
|
|
495
617
|
newCollapsedState[domain.href] = false;
|
|
496
618
|
newCollapsedState[`${domain.href}-entities`] = false;
|
|
497
619
|
newCollapsedState[`${domain.href}-subdomains`] = false;
|
|
620
|
+
newCollapsedState[`${domain.href}-services`] = false;
|
|
498
621
|
});
|
|
499
622
|
|
|
500
623
|
// Expand all services
|
|
@@ -548,6 +671,24 @@ const ListViewSideBar: React.FC<ListViewSideBarProps> = ({ resources, currentPat
|
|
|
548
671
|
};
|
|
549
672
|
}, []);
|
|
550
673
|
|
|
674
|
+
// Helper function to get services for a specific domain (only direct services, not from subdomains)
|
|
675
|
+
const getServicesForDomain = useMemo(() => {
|
|
676
|
+
return (domain: any, allServices: ServiceItem[], allDomains: any[]) => {
|
|
677
|
+
const domainServices = domain.services || [];
|
|
678
|
+
const subdomains = getSubdomainsForParent(domain, allDomains);
|
|
679
|
+
|
|
680
|
+
// Get all service IDs from subdomains
|
|
681
|
+
const subdomainServiceIds = subdomains.flatMap((subdomain: any) => (subdomain.services || []).map((s: any) => s.data.id));
|
|
682
|
+
|
|
683
|
+
// Filter services that belong to this domain but NOT to any of its subdomains
|
|
684
|
+
return allServices.filter(
|
|
685
|
+
(service: ServiceItem) =>
|
|
686
|
+
domainServices.some((domainService: any) => domainService.data.id === service.id) &&
|
|
687
|
+
!subdomainServiceIds.includes(service.id)
|
|
688
|
+
);
|
|
689
|
+
};
|
|
690
|
+
}, [getSubdomainsForParent]);
|
|
691
|
+
|
|
551
692
|
// Component to render a single domain item
|
|
552
693
|
const DomainItem = React.memo(
|
|
553
694
|
({ item, isSubdomain = false, nestingLevel = 0 }: { item: any; isSubdomain?: boolean; nestingLevel?: number }) => {
|
|
@@ -561,6 +702,7 @@ const ListViewSideBar: React.FC<ListViewSideBarProps> = ({ resources, currentPat
|
|
|
561
702
|
toggleGroupCollapse(item.href);
|
|
562
703
|
}}
|
|
563
704
|
className="p-1 hover:bg-gray-100 rounded-md"
|
|
705
|
+
title={item.label}
|
|
564
706
|
>
|
|
565
707
|
<div className={`transition-transform duration-150 ${collapsedGroups[item.href] ? '' : 'rotate-180'}`}>
|
|
566
708
|
<ChevronDownIcon className="h-3 w-3 text-gray-500" />
|
|
@@ -574,6 +716,7 @@ const ListViewSideBar: React.FC<ListViewSideBarProps> = ({ resources, currentPat
|
|
|
574
716
|
className={`flex-grow flex items-center justify-between px-2 py-0.5 text-xs font-bold rounded-md ${
|
|
575
717
|
decodedCurrentPath === item.href ? 'bg-purple-100' : 'hover:bg-purple-100'
|
|
576
718
|
}`}
|
|
719
|
+
title={item.label}
|
|
577
720
|
>
|
|
578
721
|
<span className="truncate">
|
|
579
722
|
<HighlightedText text={item.label} searchTerm={debouncedSearchTerm} />
|
|
@@ -589,10 +732,23 @@ const ListViewSideBar: React.FC<ListViewSideBarProps> = ({ resources, currentPat
|
|
|
589
732
|
|
|
590
733
|
// Component to render domain content (Overview, Architecture, etc.)
|
|
591
734
|
const DomainContent = React.memo(
|
|
592
|
-
({
|
|
735
|
+
({
|
|
736
|
+
item,
|
|
737
|
+
nestingLevel = 0,
|
|
738
|
+
className = '',
|
|
739
|
+
isSubdomain = false,
|
|
740
|
+
}: {
|
|
741
|
+
item: any;
|
|
742
|
+
nestingLevel?: number;
|
|
743
|
+
className?: string;
|
|
744
|
+
isSubdomain?: boolean;
|
|
745
|
+
}) => {
|
|
593
746
|
const marginLeft = nestingLevel > 0 ? `ml-${nestingLevel * 4}` : '';
|
|
594
747
|
const hasEntities = item.entities && item.entities.length > 0;
|
|
595
748
|
|
|
749
|
+
// Get services for this domain
|
|
750
|
+
const domainServices = getServicesForDomain(item, filteredData['services'] || [], filteredData['domains'] || []);
|
|
751
|
+
|
|
596
752
|
return (
|
|
597
753
|
<div
|
|
598
754
|
className={`overflow-hidden transition-[height] duration-150 ease-out ${collapsedGroups[item.href] ? 'h-0' : 'h-auto'} ${className}`}
|
|
@@ -604,6 +760,7 @@ const ListViewSideBar: React.FC<ListViewSideBarProps> = ({ resources, currentPat
|
|
|
604
760
|
className={`flex items-center px-2 py-1.5 text-xs text-gray-600 hover:bg-purple-100 rounded-md ${
|
|
605
761
|
decodedCurrentPath === item.href ? 'bg-purple-100 ' : 'hover:bg-purple-100'
|
|
606
762
|
}`}
|
|
763
|
+
title={`${item.label} - Overview`}
|
|
607
764
|
>
|
|
608
765
|
<span className="truncate">Overview</span>
|
|
609
766
|
</a>
|
|
@@ -645,6 +802,40 @@ const ListViewSideBar: React.FC<ListViewSideBarProps> = ({ resources, currentPat
|
|
|
645
802
|
<span className="truncate">Ubiquitous Language</span>
|
|
646
803
|
</a>
|
|
647
804
|
)}
|
|
805
|
+
|
|
806
|
+
{/* Render services before entities */}
|
|
807
|
+
{domainServices.length > 0 && (
|
|
808
|
+
<CollapsibleGroup
|
|
809
|
+
isCollapsed={collapsedGroups[`${item.href}-services`]}
|
|
810
|
+
onToggle={() => toggleGroupCollapse(`${item.href}-services`)}
|
|
811
|
+
title={
|
|
812
|
+
<button
|
|
813
|
+
onClick={(e) => {
|
|
814
|
+
e.stopPropagation();
|
|
815
|
+
toggleGroupCollapse(`${item.href}-services`);
|
|
816
|
+
}}
|
|
817
|
+
className="truncate underline ml-2 text-xs mb-1 py-1"
|
|
818
|
+
>
|
|
819
|
+
Services ({domainServices.length})
|
|
820
|
+
</button>
|
|
821
|
+
}
|
|
822
|
+
>
|
|
823
|
+
<div className="space-y-2 pl-4">
|
|
824
|
+
{domainServices.map((service: ServiceItem) => (
|
|
825
|
+
<ServiceItem
|
|
826
|
+
key={service.href}
|
|
827
|
+
item={service}
|
|
828
|
+
decodedCurrentPath={decodedCurrentPath}
|
|
829
|
+
collapsedGroups={collapsedGroups}
|
|
830
|
+
toggleGroupCollapse={toggleGroupCollapse}
|
|
831
|
+
isVisualizer={isVisualizer}
|
|
832
|
+
searchTerm={debouncedSearchTerm}
|
|
833
|
+
/>
|
|
834
|
+
))}
|
|
835
|
+
</div>
|
|
836
|
+
</CollapsibleGroup>
|
|
837
|
+
)}
|
|
838
|
+
|
|
648
839
|
{item.entities.length > 0 && !isVisualizer && (
|
|
649
840
|
<CollapsibleGroup
|
|
650
841
|
isCollapsed={collapsedGroups[`${item.href}-entities`]}
|
|
@@ -779,7 +970,7 @@ const ListViewSideBar: React.FC<ListViewSideBarProps> = ({ resources, currentPat
|
|
|
779
970
|
data-active={decodedCurrentPath === subdomain.href}
|
|
780
971
|
>
|
|
781
972
|
<DomainItem item={subdomain} isSubdomain={true} nestingLevel={1} />
|
|
782
|
-
<DomainContent item={subdomain} nestingLevel={3} className="ml-6" />
|
|
973
|
+
<DomainContent item={subdomain} nestingLevel={3} className="ml-6" isSubdomain={true} />
|
|
783
974
|
</div>
|
|
784
975
|
))}
|
|
785
976
|
</div>
|
|
@@ -793,64 +984,46 @@ const ListViewSideBar: React.FC<ListViewSideBarProps> = ({ resources, currentPat
|
|
|
793
984
|
</div>
|
|
794
985
|
)}
|
|
795
986
|
|
|
796
|
-
{
|
|
797
|
-
|
|
798
|
-
<ul className="space-y-4">
|
|
799
|
-
{filteredData['services'].map((item: any) => (
|
|
800
|
-
<li key={item.href} data-active={decodedCurrentPath === item.href}>
|
|
801
|
-
<ServiceItem
|
|
802
|
-
key={item.href}
|
|
803
|
-
item={item}
|
|
804
|
-
decodedCurrentPath={decodedCurrentPath}
|
|
805
|
-
collapsedGroups={collapsedGroups}
|
|
806
|
-
toggleGroupCollapse={toggleGroupCollapse}
|
|
807
|
-
isVisualizer={isVisualizer}
|
|
808
|
-
searchTerm={debouncedSearchTerm}
|
|
809
|
-
/>
|
|
810
|
-
</li>
|
|
811
|
-
))}
|
|
812
|
-
</ul>
|
|
813
|
-
</div>
|
|
814
|
-
)}
|
|
815
|
-
|
|
816
|
-
{filteredData['messagesNotInService'] && filteredData['messagesNotInService'].length > 0 && (
|
|
987
|
+
{/* All Services Group */}
|
|
988
|
+
{filteredData['services'] && filteredData['services'].length > 0 && (
|
|
817
989
|
<div className="pt-4 pb-2">
|
|
818
990
|
<CollapsibleGroup
|
|
819
|
-
isCollapsed={collapsedGroups['
|
|
820
|
-
onToggle={() => toggleGroupCollapse('
|
|
991
|
+
isCollapsed={collapsedGroups['all-services-group']}
|
|
992
|
+
onToggle={() => toggleGroupCollapse('all-services-group')}
|
|
821
993
|
title={
|
|
822
994
|
<button
|
|
823
995
|
onClick={(e) => {
|
|
824
996
|
e.stopPropagation();
|
|
825
|
-
toggleGroupCollapse('
|
|
997
|
+
toggleGroupCollapse('all-services-group');
|
|
826
998
|
}}
|
|
827
999
|
className="flex justify-between items-center pl-2 w-full text-xs"
|
|
828
1000
|
>
|
|
829
|
-
<span className="truncate text-xs font-bold">
|
|
1001
|
+
<span className="truncate text-xs font-bold">All Services ({filteredData['services'].length})</span>
|
|
1002
|
+
<span className="ml-2 rounded bg-purple-50 px-2 py-0.5 text-[10px] font-medium text-purple-600">
|
|
1003
|
+
SERVICES
|
|
1004
|
+
</span>
|
|
830
1005
|
</button>
|
|
831
1006
|
}
|
|
832
1007
|
>
|
|
833
|
-
<div className="space-y-
|
|
834
|
-
{filteredData['
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
</div>
|
|
853
|
-
))}
|
|
1008
|
+
<div className="space-y-4 border-gray-200/80 border-l pl-3 ml-[9px] mt-3">
|
|
1009
|
+
{filteredData['services'].map((item: any) => {
|
|
1010
|
+
// Ensure service is collapsed by default if not in collapsedGroups
|
|
1011
|
+
if (collapsedGroups[item.href] === undefined) {
|
|
1012
|
+
collapsedGroups[item.href] = true;
|
|
1013
|
+
}
|
|
1014
|
+
|
|
1015
|
+
return (
|
|
1016
|
+
<ServiceItem
|
|
1017
|
+
key={item.href}
|
|
1018
|
+
item={item}
|
|
1019
|
+
decodedCurrentPath={decodedCurrentPath}
|
|
1020
|
+
collapsedGroups={collapsedGroups}
|
|
1021
|
+
toggleGroupCollapse={toggleGroupCollapse}
|
|
1022
|
+
isVisualizer={isVisualizer}
|
|
1023
|
+
searchTerm={debouncedSearchTerm}
|
|
1024
|
+
/>
|
|
1025
|
+
);
|
|
1026
|
+
})}
|
|
854
1027
|
</div>
|
|
855
1028
|
</CollapsibleGroup>
|
|
856
1029
|
</div>
|
|
@@ -870,7 +1043,8 @@ const ListViewSideBar: React.FC<ListViewSideBarProps> = ({ resources, currentPat
|
|
|
870
1043
|
}}
|
|
871
1044
|
className="flex justify-between items-center pl-2 w-full text-xs"
|
|
872
1045
|
>
|
|
873
|
-
<span className="truncate text-xs font-bold">Flows</span>
|
|
1046
|
+
<span className="truncate text-xs font-bold">All Flows ({filteredData['flows'].length})</span>
|
|
1047
|
+
<span className="ml-2 rounded bg-teal-50 px-2 py-0.5 text-[10px] font-medium text-teal-600">FLOWS</span>
|
|
874
1048
|
</button>
|
|
875
1049
|
}
|
|
876
1050
|
>
|
|
@@ -883,6 +1057,7 @@ const ListViewSideBar: React.FC<ListViewSideBarProps> = ({ resources, currentPat
|
|
|
883
1057
|
className={`flex items-center justify-between px-2 py-0.5 text-xs font-thin rounded-md ${
|
|
884
1058
|
decodedCurrentPath === item.href ? 'bg-purple-100 text-purple-900' : 'hover:bg-purple-100'
|
|
885
1059
|
}`}
|
|
1060
|
+
title={item.label}
|
|
886
1061
|
>
|
|
887
1062
|
<span className="truncate">
|
|
888
1063
|
<HighlightedText text={item.label} searchTerm={debouncedSearchTerm} />
|
|
@@ -912,7 +1087,8 @@ const ListViewSideBar: React.FC<ListViewSideBarProps> = ({ resources, currentPat
|
|
|
912
1087
|
}}
|
|
913
1088
|
className="flex justify-between items-center pl-2 w-full text-xs"
|
|
914
1089
|
>
|
|
915
|
-
<span className="truncate text-xs font-bold">Data</span>
|
|
1090
|
+
<span className="truncate text-xs font-bold">All Data Stores ({filteredData['containers'].length})</span>
|
|
1091
|
+
<span className="ml-2 rounded bg-blue-50 px-2 py-0.5 text-[10px] font-medium text-blue-600">DATA</span>
|
|
916
1092
|
</button>
|
|
917
1093
|
}
|
|
918
1094
|
>
|
|
@@ -925,6 +1101,7 @@ const ListViewSideBar: React.FC<ListViewSideBarProps> = ({ resources, currentPat
|
|
|
925
1101
|
className={`flex items-center justify-between px-2 py-0.5 text-xs font-thin rounded-md ${
|
|
926
1102
|
decodedCurrentPath === item.href ? 'bg-purple-100 text-purple-900' : 'hover:bg-purple-100'
|
|
927
1103
|
}`}
|
|
1104
|
+
title={item.label}
|
|
928
1105
|
>
|
|
929
1106
|
<span className="truncate">
|
|
930
1107
|
<HighlightedText text={item.label} searchTerm={debouncedSearchTerm} />
|
|
@@ -953,7 +1130,8 @@ const ListViewSideBar: React.FC<ListViewSideBarProps> = ({ resources, currentPat
|
|
|
953
1130
|
}}
|
|
954
1131
|
className="flex justify-between items-center pl-2 w-full text-xs"
|
|
955
1132
|
>
|
|
956
|
-
<span className="truncate text-xs font-bold">Designs</span>
|
|
1133
|
+
<span className="truncate text-xs font-bold">All Designs ({filteredData['designs'].length})</span>
|
|
1134
|
+
<span className="ml-2 rounded bg-teal-50 px-2 py-0.5 text-[10px] font-medium text-teal-600">DESIGNS</span>
|
|
957
1135
|
</button>
|
|
958
1136
|
}
|
|
959
1137
|
>
|
|
@@ -966,6 +1144,7 @@ const ListViewSideBar: React.FC<ListViewSideBarProps> = ({ resources, currentPat
|
|
|
966
1144
|
className={`flex items-center justify-between px-2 py-0.5 text-xs font-thin rounded-md ${
|
|
967
1145
|
decodedCurrentPath === item.href ? 'bg-purple-100 text-purple-900' : 'hover:bg-purple-100'
|
|
968
1146
|
}`}
|
|
1147
|
+
title={item.label}
|
|
969
1148
|
>
|
|
970
1149
|
<span className="truncate">
|
|
971
1150
|
<HighlightedText text={item.label} searchTerm={debouncedSearchTerm} />
|
|
@@ -980,6 +1159,50 @@ const ListViewSideBar: React.FC<ListViewSideBarProps> = ({ resources, currentPat
|
|
|
980
1159
|
</CollapsibleGroup>
|
|
981
1160
|
</div>
|
|
982
1161
|
)}
|
|
1162
|
+
|
|
1163
|
+
{filteredData['messagesNotInService'] && filteredData['messagesNotInService'].length > 0 && (
|
|
1164
|
+
<div className="pt-4 pb-2">
|
|
1165
|
+
<CollapsibleGroup
|
|
1166
|
+
isCollapsed={collapsedGroups['messagesNotInService-group']}
|
|
1167
|
+
onToggle={() => toggleGroupCollapse('messagesNotInService-group')}
|
|
1168
|
+
title={
|
|
1169
|
+
<button
|
|
1170
|
+
onClick={(e) => {
|
|
1171
|
+
e.stopPropagation();
|
|
1172
|
+
toggleGroupCollapse('messagesNotInService-group');
|
|
1173
|
+
}}
|
|
1174
|
+
className="flex justify-between items-center pl-2 w-full text-xs"
|
|
1175
|
+
>
|
|
1176
|
+
<span className="truncate text-xs font-bold">Orphaned Messages</span>
|
|
1177
|
+
</button>
|
|
1178
|
+
}
|
|
1179
|
+
>
|
|
1180
|
+
<div className="space-y-2 border-gray-200/80 border-l pl-3 ml-[9px] mt-3">
|
|
1181
|
+
{filteredData['messagesNotInService'].map((item: any) => (
|
|
1182
|
+
<div key={item.href} data-active={decodedCurrentPath === item.href}>
|
|
1183
|
+
<a
|
|
1184
|
+
href={item.href}
|
|
1185
|
+
data-active={decodedCurrentPath === item.href}
|
|
1186
|
+
className={`flex items-center justify-between px-2 py-0.5 text-xs font-thin rounded-md ${
|
|
1187
|
+
decodedCurrentPath === item.href ? 'bg-purple-100 text-purple-900' : 'hover:bg-purple-100'
|
|
1188
|
+
}`}
|
|
1189
|
+
title={item.label}
|
|
1190
|
+
>
|
|
1191
|
+
<span className="truncate">
|
|
1192
|
+
<HighlightedText text={item.label} searchTerm={debouncedSearchTerm} />
|
|
1193
|
+
</span>
|
|
1194
|
+
<span
|
|
1195
|
+
className={`ml-2 text-[10px] font-medium px-2 uppercase py-0.5 rounded ${getMessageColorByCollection(item.collection)}`}
|
|
1196
|
+
>
|
|
1197
|
+
{getMessageCollectionName(item.collection, item)}
|
|
1198
|
+
</span>
|
|
1199
|
+
</a>
|
|
1200
|
+
</div>
|
|
1201
|
+
))}
|
|
1202
|
+
</div>
|
|
1203
|
+
</CollapsibleGroup>
|
|
1204
|
+
</div>
|
|
1205
|
+
)}
|
|
983
1206
|
</>
|
|
984
1207
|
)}
|
|
985
1208
|
</div>
|
|
@@ -311,7 +311,7 @@ const canPageBeEmbedded = process.env.ENABLE_EMBED === 'true';
|
|
|
311
311
|
|
|
312
312
|
<SideNav
|
|
313
313
|
id="sidebar"
|
|
314
|
-
class={`sidebar-transition h-content overflow-y-auto bg-white border-r border-gray-100 w-
|
|
314
|
+
class={`sidebar-transition h-content overflow-y-auto bg-white border-r border-gray-100 w-[22em] ml-16 ${showSideBarOnLoad ? 'block' : 'hidden'}`}
|
|
315
315
|
/>
|
|
316
316
|
</aside>
|
|
317
317
|
<main
|
|
@@ -14,7 +14,7 @@ export class Page extends HybridPage {
|
|
|
14
14
|
|
|
15
15
|
const { pageDataLoader } = await import('@utils/page-loaders/page-data-loader');
|
|
16
16
|
|
|
17
|
-
const itemTypes: PageTypes[] = ['events', 'commands', 'queries', 'services', 'domains', 'flows'];
|
|
17
|
+
const itemTypes: PageTypes[] = ['events', 'commands', 'queries', 'services', 'domains', 'flows', 'containers'];
|
|
18
18
|
const allItems = await Promise.all(itemTypes.map((type) => pageDataLoader[type]()));
|
|
19
19
|
|
|
20
20
|
return allItems.flatMap((items, index) =>
|
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
MagnifyingGlassIcon,
|
|
10
10
|
QueueListIcon,
|
|
11
11
|
} from '@heroicons/react/24/outline';
|
|
12
|
+
import { DatabaseIcon } from 'lucide-react';
|
|
12
13
|
import { render, getEntry } from 'astro:content';
|
|
13
14
|
import mdxComponents from '@components/MDX/components';
|
|
14
15
|
import 'diff2html/bundles/css/diff2html.min.css';
|
|
@@ -96,18 +97,15 @@ const getBadge = () => {
|
|
|
96
97
|
class: 'text-yellow-400',
|
|
97
98
|
};
|
|
98
99
|
}
|
|
100
|
+
if (props.collection === 'containers') {
|
|
101
|
+
return { backgroundColor: 'blue', textColor: 'blue', content: 'Container', icon: DatabaseIcon, class: 'text-blue-400' };
|
|
102
|
+
}
|
|
99
103
|
if (props.collection === 'flows') {
|
|
100
104
|
return { backgroundColor: 'teal', textColor: 'teal', content: 'Flow', icon: QueueListIcon, class: 'text-teal-400' };
|
|
101
105
|
}
|
|
102
106
|
};
|
|
103
107
|
|
|
104
108
|
const badges = [getBadge()];
|
|
105
|
-
import { HomeIcon } from '@heroicons/react/20/solid';
|
|
106
|
-
|
|
107
|
-
const pages = [
|
|
108
|
-
{ name: 'Projects', href: '#', current: false },
|
|
109
|
-
{ name: 'Project Nero', href: '#', current: true },
|
|
110
|
-
];
|
|
111
109
|
---
|
|
112
110
|
|
|
113
111
|
<VerticalSideBarLayout title="ChangeLog">
|