@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.
@@ -37,7 +37,7 @@ var import_axios = __toESM(require("axios"), 1);
37
37
  var import_os = __toESM(require("os"), 1);
38
38
 
39
39
  // package.json
40
- var version = "2.59.0";
40
+ var version = "2.60.0";
41
41
 
42
42
  // src/constants.ts
43
43
  var VERSION = version;
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  raiseEvent
3
- } from "../chunk-T3QXQPTB.js";
4
- import "../chunk-SCDNNFXH.js";
3
+ } from "../chunk-QMWI6M2I.js";
4
+ import "../chunk-WASYSRBV.js";
5
5
  export {
6
6
  raiseEvent
7
7
  };
@@ -106,7 +106,7 @@ var import_axios = __toESM(require("axios"), 1);
106
106
  var import_os = __toESM(require("os"), 1);
107
107
 
108
108
  // package.json
109
- var version = "2.59.0";
109
+ var version = "2.60.0";
110
110
 
111
111
  // src/constants.ts
112
112
  var VERSION = version;
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  log_build_default
3
- } from "../chunk-F5WMB6Q5.js";
4
- import "../chunk-T3QXQPTB.js";
5
- import "../chunk-SCDNNFXH.js";
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
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  raiseEvent
3
- } from "./chunk-T3QXQPTB.js";
3
+ } from "./chunk-QMWI6M2I.js";
4
4
  import {
5
5
  getEventCatalogConfigFile,
6
6
  verifyRequiredFieldsAreInCatalogConfigFile
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  VERSION
3
- } from "./chunk-SCDNNFXH.js";
3
+ } from "./chunk-WASYSRBV.js";
4
4
 
5
5
  // src/analytics/analytics.js
6
6
  import axios from "axios";
@@ -1,5 +1,5 @@
1
1
  // package.json
2
- var version = "2.59.0";
2
+ var version = "2.60.0";
3
3
 
4
4
  // src/constants.ts
5
5
  var VERSION = version;
@@ -25,7 +25,7 @@ __export(constants_exports, {
25
25
  module.exports = __toCommonJS(constants_exports);
26
26
 
27
27
  // package.json
28
- var version = "2.59.0";
28
+ var version = "2.60.0";
29
29
 
30
30
  // src/constants.ts
31
31
  var VERSION = version;
package/dist/constants.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  VERSION
3
- } from "./chunk-SCDNNFXH.js";
3
+ } from "./chunk-WASYSRBV.js";
4
4
  export {
5
5
  VERSION
6
6
  };
@@ -157,7 +157,7 @@ var import_axios = __toESM(require("axios"), 1);
157
157
  var import_os = __toESM(require("os"), 1);
158
158
 
159
159
  // package.json
160
- var version = "2.59.0";
160
+ var version = "2.60.0";
161
161
 
162
162
  // src/constants.ts
163
163
  var VERSION = version;
@@ -6,8 +6,8 @@ import {
6
6
  } from "./chunk-PLNJC7NZ.js";
7
7
  import {
8
8
  log_build_default
9
- } from "./chunk-F5WMB6Q5.js";
10
- import "./chunk-T3QXQPTB.js";
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-SCDNNFXH.js";
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 saved ? JSON.parse(saved) : {};
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
- ({ item, nestingLevel = 0, className = '' }: { item: any; nestingLevel?: number; className?: string }) => {
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
- {filteredData['services'] && (
797
- <div className="pt-4 pb-2">
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['messagesNotInService-group']}
820
- onToggle={() => toggleGroupCollapse('messagesNotInService-group')}
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('messagesNotInService-group');
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">Orphaned Messages</span>
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-2 border-gray-200/80 border-l pl-3 ml-[9px] mt-3">
834
- {filteredData['messagesNotInService'].map((item: any) => (
835
- <div key={item.href} data-active={decodedCurrentPath === item.href}>
836
- <a
837
- href={item.href}
838
- data-active={decodedCurrentPath === item.href}
839
- className={`flex items-center justify-between px-2 py-0.5 text-xs font-thin rounded-md ${
840
- decodedCurrentPath === item.href ? 'bg-purple-100 text-purple-900' : 'hover:bg-purple-100'
841
- }`}
842
- >
843
- <span className="truncate">
844
- <HighlightedText text={item.label} searchTerm={debouncedSearchTerm} />
845
- </span>
846
- <span
847
- className={`ml-2 text-[10px] font-medium px-2 uppercase py-0.5 rounded ${getMessageColorByCollection(item.collection)}`}
848
- >
849
- {getMessageCollectionName(item.collection, item)}
850
- </span>
851
- </a>
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-80 ml-16 ${showSideBarOnLoad ? 'block' : 'hidden'}`}
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">
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "url": "https://github.com/event-catalog/eventcatalog.git"
7
7
  },
8
8
  "type": "module",
9
- "version": "2.59.0",
9
+ "version": "2.60.0",
10
10
  "publishConfig": {
11
11
  "access": "public"
12
12
  },