@eventcatalog/core 4.12.2 → 5.0.0-beta.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/LICENSE +226 -95
- package/NOTICE +30 -0
- package/README.md +3 -2
- package/dist/analytics/analytics.cjs +1 -1
- package/dist/analytics/analytics.js +2 -2
- package/dist/analytics/log-build.cjs +43 -16
- package/dist/analytics/log-build.d.cts +6 -5
- package/dist/analytics/log-build.d.ts +6 -5
- package/dist/analytics/log-build.js +4 -3
- package/dist/{chunk-U4YJSTGV.js → chunk-AYNZXUB5.js} +2 -10
- package/dist/{chunk-IVVM67LN.js → chunk-CR6AK5LR.js} +1 -1
- package/dist/{chunk-GTIC4R74.js → chunk-LR7AGRHN.js} +13 -16
- package/dist/chunk-TQLRG35T.js +203 -0
- package/dist/{chunk-WK4J6FP3.js → chunk-TWN43V4T.js} +1 -1
- package/dist/{chunk-ZW3MYAWF.js → chunk-WAIADKQE.js} +1 -1
- package/dist/{chunk-RPVA2SZY.js → chunk-ZHKEARLJ.js} +1 -1
- package/dist/constants.cjs +1 -1
- package/dist/constants.js +1 -1
- package/dist/eventcatalog.cjs +407 -291
- package/dist/eventcatalog.config.d.cts +2 -3
- package/dist/eventcatalog.config.d.ts +2 -3
- package/dist/eventcatalog.js +30 -93
- package/dist/federation/content-cache.d.cts +0 -5
- package/dist/federation/content-cache.d.ts +0 -5
- package/dist/federation/diagnostics.d.cts +0 -5
- package/dist/federation/diagnostics.d.ts +0 -5
- package/dist/federation/federate.cjs +0 -9
- package/dist/federation/federate.d.cts +0 -5
- package/dist/federation/federate.d.ts +0 -5
- package/dist/federation/federate.js +2 -3
- package/dist/federation/filesystem-source-provider.d.cts +0 -5
- package/dist/federation/filesystem-source-provider.d.ts +0 -5
- package/dist/federation/github-source-provider.d.cts +0 -5
- package/dist/federation/github-source-provider.d.ts +0 -5
- package/dist/federation/output-transaction.d.cts +0 -4
- package/dist/federation/output-transaction.d.ts +0 -4
- package/dist/federation/public-assets.d.cts +0 -5
- package/dist/federation/public-assets.d.ts +0 -5
- package/dist/federation/source-provider.d.cts +0 -5
- package/dist/federation/source-provider.d.ts +0 -5
- package/dist/federation/types.d.cts +0 -5
- package/dist/federation/types.d.ts +0 -5
- package/dist/generate.cjs +1 -1
- package/dist/generate.js +3 -3
- package/dist/license-C1y-56bb.d.cts +23 -0
- package/dist/license-C1y-56bb.d.ts +23 -0
- package/dist/runtime-dependencies/@eventcatalog__visualiser__layout.mjs +3 -0
- package/dist/runtime-dependencies/@modelcontextprotocol__ext-apps.mjs +3 -0
- package/dist/runtime-dependencies/@modelcontextprotocol__ext-apps__react.mjs +3 -0
- package/dist/runtime-dependencies/@modelcontextprotocol__ext-apps__server.mjs +3 -0
- package/dist/runtime-dependencies/@modelcontextprotocol__sdk__types.js.mjs +3 -0
- package/dist/runtime-dependencies/manifest.json +12 -1
- package/dist/runtime-dependencies/react-syntax-highlighter__dist__esm__languages__prism__graphql.mjs +3 -0
- package/dist/runtime-dependencies/react-syntax-highlighter__dist__esm__languages__prism__json.mjs +3 -0
- package/dist/runtime-dependencies/react-syntax-highlighter__dist__esm__languages__prism__markup.mjs +3 -0
- package/dist/runtime-dependencies/react-syntax-highlighter__dist__esm__languages__prism__protobuf.mjs +3 -0
- package/dist/runtime-dependencies/react-syntax-highlighter__dist__esm__languages__prism__yaml.mjs +3 -0
- package/dist/runtime-dependencies/react-syntax-highlighter__dist__esm__styles__prism__one-dark.mjs +3 -0
- package/dist/runtime-dependencies/react-syntax-highlighter__dist__esm__styles__prism__one-light.mjs +3 -0
- package/dist/utils/cli-logger.cjs +1 -1
- package/dist/utils/cli-logger.js +2 -2
- package/dist/utils/license-status.cjs +240 -0
- package/dist/utils/license-status.d.cts +28 -0
- package/dist/utils/license-status.d.ts +28 -0
- package/dist/utils/license-status.js +12 -0
- package/eventcatalog/astro.config.mjs +1 -1
- package/eventcatalog/integrations/eventcatalog-runtime.mjs +1 -1
- package/eventcatalog/src/components/ChatPanel/ChatPanel.tsx +29 -19
- package/eventcatalog/src/components/ChatPanel/OfflineReply.tsx +74 -0
- package/eventcatalog/src/components/FieldsExplorer/FieldFilters.tsx +24 -28
- package/eventcatalog/src/components/FieldsExplorer/FieldNodeGraph.tsx +16 -11
- package/eventcatalog/src/components/FieldsExplorer/FieldsExplorer.tsx +4 -218
- package/eventcatalog/src/components/FieldsExplorer/FieldsTable.tsx +27 -36
- package/eventcatalog/src/components/Header.astro +43 -58
- package/eventcatalog/src/components/Lists/PillListFlat.styles.css +17 -17
- package/eventcatalog/src/components/MDX/EntityMap/EntityMap.astro +1 -1
- package/eventcatalog/src/components/MDX/Flow/Flow.astro +4 -0
- package/eventcatalog/src/components/MDX/NodeGraph/AstroNodeGraph.tsx +14 -0
- package/eventcatalog/src/components/MDX/NodeGraph/NodeGraph.astro +49 -18
- package/eventcatalog/src/components/MDX/RemoteFile.astro +2 -24
- package/eventcatalog/src/components/SchemaExplorer/ApiAccessSection.tsx +59 -93
- package/eventcatalog/src/components/SchemaExplorer/ApiContentViewer.tsx +1 -32
- package/eventcatalog/src/components/SchemaExplorer/DiffViewer.tsx +20 -67
- package/eventcatalog/src/components/SchemaExplorer/SchemaContentViewer.tsx +2 -11
- package/eventcatalog/src/components/SchemaExplorer/SchemaDetailsPanel.tsx +11 -60
- package/eventcatalog/src/components/SchemaExplorer/SchemaExplorer.tsx +1 -3
- package/eventcatalog/src/components/SchemaExplorer/SchemaPageViewer.tsx +0 -3
- package/eventcatalog/src/components/SchemaExplorer/VersionHistoryModal.tsx +2 -9
- package/eventcatalog/src/components/SchemaExplorer/parse-schema.ts +46 -0
- package/eventcatalog/src/components/SchemaExplorer/utils.ts +11 -0
- package/eventcatalog/src/components/Settings/AssistantSettingsForm.tsx +2 -9
- package/eventcatalog/src/components/Settings/LicenseSettings.tsx +288 -0
- package/eventcatalog/src/components/Settings/LlmAccessSettingsForm.tsx +3 -19
- package/eventcatalog/src/components/Settings/McpSettingsForm.tsx +85 -30
- package/eventcatalog/src/components/Settings/SettingsShared.tsx +7 -75
- package/eventcatalog/src/components/SideNav/CustomDocsNav.astro +2 -2
- package/eventcatalog/src/components/TrialBadge.astro +82 -0
- package/eventcatalog/src/content.config.ts +9 -90
- package/eventcatalog/src/{enterprise → features}/ai/chat-api.ts +22 -34
- package/eventcatalog/src/{enterprise → features}/analytics/adapters/ga4.ts +0 -5
- package/eventcatalog/src/{enterprise → features}/analytics/adapters/gtm.ts +0 -5
- package/eventcatalog/src/{enterprise → features}/analytics/adapters/posthog.ts +0 -5
- package/eventcatalog/src/{enterprise → features}/analytics/components/AnalyticsHead.astro +2 -4
- package/eventcatalog/src/{enterprise → features}/analytics/components/AnalyticsTracker.astro +2 -4
- package/eventcatalog/src/{enterprise → features}/analytics/tracker.ts +0 -5
- package/eventcatalog/src/{enterprise → features}/api/catalog.ts +0 -5
- package/eventcatalog/src/{enterprise → features}/auth/[...auth].ts +0 -5
- package/eventcatalog/src/{enterprise → features}/auth/middleware/middleware-auth.ts +0 -5
- package/eventcatalog/src/{enterprise → features}/auth/middleware/middleware.ts +0 -5
- package/eventcatalog/src/{enterprise → features}/collections/custom-pages.ts +0 -5
- package/eventcatalog/src/{enterprise → features}/collections/index.ts +0 -5
- package/eventcatalog/src/{enterprise → features}/collections/resource-docs.ts +0 -5
- package/eventcatalog/src/{enterprise → features}/custom-documentation/collection.ts +0 -5
- package/eventcatalog/src/features/custom-documentation/components/CustomDocsNav/CustomDocsNav.astro +9 -0
- package/eventcatalog/src/{enterprise → features}/custom-documentation/components/CustomDocsNav/CustomDocsNavWrapper.tsx +0 -5
- package/eventcatalog/src/{enterprise → features}/custom-documentation/components/CustomDocsNav/components/NestedItem.tsx +1 -6
- package/eventcatalog/src/{enterprise → features}/custom-documentation/components/CustomDocsNav/components/NoResultsFound.tsx +0 -5
- package/eventcatalog/src/{enterprise → features}/custom-documentation/components/CustomDocsNav/index.tsx +1 -6
- package/eventcatalog/src/{enterprise → features}/custom-documentation/components/CustomDocsNav/types.ts +0 -5
- package/eventcatalog/src/{enterprise/custom-documentation/pages/docs/custom/index.astro → features/custom-documentation/components/CustomDocumentationPage.astro} +5 -5
- package/eventcatalog/src/{enterprise → features}/custom-documentation/utils/badge-styles.ts +0 -5
- package/eventcatalog/src/{enterprise → features}/custom-documentation/utils/custom-docs.ts +1 -6
- package/eventcatalog/src/{enterprise → features}/custom-documentation/utils/docs-search.ts +0 -5
- package/eventcatalog/src/{enterprise → features}/custom-pages/routes.ts +0 -5
- package/eventcatalog/src/{enterprise → features}/directory/user-team-directory.ts +0 -5
- package/eventcatalog/src/{enterprise → features}/fields/field-extractor.ts +0 -5
- package/eventcatalog/src/{enterprise → features}/fields/field-indexer.ts +0 -5
- package/eventcatalog/src/{enterprise → features}/fields/fields-db.ts +0 -5
- package/eventcatalog/src/{enterprise → features}/fields/pages/api/fields.ts +1 -6
- package/eventcatalog/src/{enterprise → features}/fields/pages/fields.astro +1 -2
- package/eventcatalog/src/{enterprise → features}/integrations/eventcatalog-features.ts +17 -75
- package/eventcatalog/src/features/mcp/apps/architecture-diagram/links.ts +59 -0
- package/eventcatalog/src/features/mcp/apps/architecture-diagram/node-chat.tsx +299 -0
- package/eventcatalog/src/features/mcp/apps/architecture-diagram/shared.ts +14 -0
- package/eventcatalog/src/features/mcp/apps/architecture-diagram/view.tsx +454 -0
- package/eventcatalog/src/features/mcp/apps/generated/viewer.html +432 -0
- package/eventcatalog/src/features/mcp/apps/mermaid-stub.ts +10 -0
- package/eventcatalog/src/features/mcp/apps/schema-viewer/schema-code.tsx +65 -0
- package/eventcatalog/src/features/mcp/apps/schema-viewer/shared.ts +23 -0
- package/eventcatalog/src/features/mcp/apps/schema-viewer/view.tsx +170 -0
- package/eventcatalog/src/features/mcp/apps/shared/app-view.tsx +98 -0
- package/eventcatalog/src/features/mcp/apps/shared/resource-types.ts +15 -0
- package/eventcatalog/src/features/mcp/apps/viewer/shared.ts +24 -0
- package/eventcatalog/src/features/mcp/apps/viewer/styles.css +25 -0
- package/eventcatalog/src/features/mcp/apps/viewer/view.tsx +59 -0
- package/eventcatalog/src/features/mcp/mcp-app-icons.ts +63 -0
- package/eventcatalog/src/features/mcp/mcp-apps.ts +160 -0
- package/eventcatalog/src/{enterprise → features}/mcp/mcp-auth.ts +0 -5
- package/eventcatalog/src/{enterprise → features}/mcp/mcp-scope.ts +7 -7
- package/eventcatalog/src/{enterprise → features}/mcp/mcp-scoped-tools.ts +47 -40
- package/eventcatalog/src/{enterprise → features}/mcp/mcp-server.ts +347 -34
- package/eventcatalog/src/{enterprise → features}/mcp/oauth-protected-resource.ts +0 -5
- package/eventcatalog/src/features/mcp/schema-viewer.ts +24 -0
- package/eventcatalog/src/{enterprise → features}/tools/catalog-tools.ts +133 -102
- package/eventcatalog/src/features/tools/index.ts +5 -0
- package/eventcatalog/src/{enterprise → features}/visualizer-layout/reset.ts +0 -5
- package/eventcatalog/src/{enterprise → features}/visualizer-layout/save.ts +0 -5
- package/eventcatalog/src/layouts/BaseLayout.astro +2 -2
- package/eventcatalog/src/layouts/Footer.astro +31 -39
- package/eventcatalog/src/layouts/SettingsLayout.astro +6 -6
- package/eventcatalog/src/layouts/VerticalSideBarLayout.astro +7 -37
- package/eventcatalog/src/{enterprise → pages}/api/schemas/[collection]/[id]/[version]/index.ts +0 -22
- package/eventcatalog/src/{enterprise → pages}/api/schemas/services/[id]/[version]/[specification]/index.ts +0 -19
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/[docVersion]/_index.data.ts +2 -6
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/[docVersion]/index.astro +1 -5
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/_index.data.ts +2 -6
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/index.astro +1 -5
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId].md.ts +2 -6
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId].mdx.ts +2 -6
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/index.astro +9 -5
- package/eventcatalog/src/pages/docs/custom/[...path]/index.astro +12 -0
- package/eventcatalog/src/{enterprise/custom-documentation/pages/docs/custom/root-index.astro → pages/docs/custom/index.astro} +1 -23
- package/eventcatalog/src/pages/docs/llm/llms-full.txt.ts +4 -9
- package/eventcatalog/src/pages/docs/llm/llms.txt.ts +4 -4
- package/eventcatalog/src/pages/docs/llm/schemas.txt.ts +0 -11
- package/eventcatalog/src/pages/docs/services/[id]/[docType]/[docId]/index.astro +2 -2
- package/eventcatalog/src/pages/index.astro +2 -2
- package/eventcatalog/src/pages/schemas/[type]/[id]/[version]/index.astro +0 -3
- package/eventcatalog/src/pages/schemas/explorer/index.astro +1 -4
- package/eventcatalog/src/pages/settings/assistant.astro +2 -4
- package/eventcatalog/src/pages/settings/license.astro +18 -0
- package/eventcatalog/src/pages/settings/llm-access.astro +1 -4
- package/eventcatalog/src/pages/settings/mcp.astro +33 -4
- package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/_index.data.ts +1 -2
- package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/data/index.astro +2 -45
- package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/entity-map/index.astro +1 -1
- package/eventcatalog/src/pages/visualiser/[type]/[id]/[version].mermaid.ts +7 -109
- package/eventcatalog/src/pages/visualiser/_mermaid-route.ts +78 -0
- package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/_index.data.ts +44 -0
- package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/entity-map/index.astro +1 -1
- package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/index.astro +56 -0
- package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/systems-context/index.astro +3 -40
- package/eventcatalog/src/pages/visualiser/domains/[id]/[version].mermaid.ts +20 -0
- package/eventcatalog/src/pages/visualiser/systems/[id]/[version]/_index.data.ts +29 -0
- package/eventcatalog/src/pages/visualiser/systems/[id]/[version]/context/index.astro +3 -38
- package/eventcatalog/src/pages/visualiser/systems/[id]/[version]/index.astro +56 -0
- package/eventcatalog/src/pages/visualiser/systems/[id]/[version].mermaid.ts +20 -0
- package/eventcatalog/src/stores/sidebar-store/builders/agent.ts +1 -1
- package/eventcatalog/src/stores/sidebar-store/builders/container.ts +1 -1
- package/eventcatalog/src/stores/sidebar-store/builders/data-product.ts +1 -1
- package/eventcatalog/src/stores/sidebar-store/builders/domain.ts +7 -32
- package/eventcatalog/src/stores/sidebar-store/builders/entity.ts +1 -1
- package/eventcatalog/src/stores/sidebar-store/builders/message.ts +1 -1
- package/eventcatalog/src/stores/sidebar-store/builders/service.ts +2 -8
- package/eventcatalog/src/stores/sidebar-store/builders/system.ts +2 -12
- package/eventcatalog/src/stores/sidebar-store/custom-sidebar.ts +0 -10
- package/eventcatalog/src/stores/sidebar-store/state.ts +4 -6
- package/eventcatalog/src/styles/theme.css +22 -18
- package/eventcatalog/src/styles/themes/forest.css +8 -8
- package/eventcatalog/src/styles/themes/ocean.css +8 -8
- package/eventcatalog/src/styles/themes/sapphire.css +8 -8
- package/eventcatalog/src/styles/themes/sunset.css +8 -8
- package/eventcatalog/src/utils/clipboard.ts +4 -4
- package/eventcatalog/src/utils/collections/flow-step-schema.ts +117 -0
- package/eventcatalog/src/utils/collections/pointer-schema.ts +7 -0
- package/eventcatalog/src/utils/collections/resource-docs.ts +677 -14
- package/eventcatalog/src/utils/collections/schema-loader.ts +0 -5
- package/eventcatalog/src/utils/feature.ts +14 -23
- package/eventcatalog/src/utils/license.ts +114 -0
- package/eventcatalog/src/utils/node-graphs/architecture-diagram-types.ts +32 -0
- package/eventcatalog/src/utils/node-graphs/architecture-diagram.ts +84 -0
- package/eventcatalog/src/utils/node-graphs/catalog-force-graph.ts +1 -0
- package/eventcatalog/src/utils/node-graphs/channel-node-graph.ts +4 -25
- package/eventcatalog/src/utils/node-graphs/container-node-graph.ts +12 -39
- package/eventcatalog/src/utils/node-graphs/data-products-node-graph.ts +11 -27
- package/eventcatalog/src/utils/node-graphs/domain-levels-node-graph.ts +679 -0
- package/eventcatalog/src/utils/node-graphs/domains-node-graph.ts +3 -20
- package/eventcatalog/src/utils/node-graphs/export-mermaid.ts +62 -4
- package/eventcatalog/src/utils/node-graphs/field-node-graph.ts +8 -23
- package/eventcatalog/src/utils/node-graphs/flow-lanes.ts +119 -0
- package/eventcatalog/src/utils/node-graphs/flows-node-graph.ts +153 -45
- package/eventcatalog/src/utils/node-graphs/layout-node-graph.ts +28 -0
- package/eventcatalog/src/utils/node-graphs/layout-persistence.ts +3 -3
- package/eventcatalog/src/utils/node-graphs/message-node-graph.ts +16 -34
- package/eventcatalog/src/utils/node-graphs/services-node-graph.ts +11 -25
- package/eventcatalog/src/utils/node-graphs/system-context-node-graph.ts +18 -54
- package/eventcatalog/src/utils/node-graphs/system-levels-node-graph.ts +59 -0
- package/eventcatalog/src/utils/node-graphs/systems-node-graph.ts +20 -80
- package/eventcatalog/src/utils/node-graphs/utils/utils.ts +1 -78
- package/eventcatalog/src/utils/trial.ts +36 -0
- package/eventcatalog/tsconfig.json +1 -1
- package/package.json +11 -11
- package/dist/chunk-FV56YFM4.js +0 -7
- package/dist/federation/entitlement.cjs +0 -31
- package/dist/federation/entitlement.d.cts +0 -12
- package/dist/federation/entitlement.d.ts +0 -12
- package/dist/federation/entitlement.js +0 -6
- package/dist/runtime-dependencies/dagre.mjs +0 -3
- package/eventcatalog/src/components/Settings/BillingSettingsForm.tsx +0 -265
- package/eventcatalog/src/enterprise/LICENSE +0 -57
- package/eventcatalog/src/enterprise/README.md +0 -5
- package/eventcatalog/src/enterprise/collections/resource-docs-utils.ts +0 -691
- package/eventcatalog/src/enterprise/custom-documentation/components/CustomDocsNav/CustomDocsNav.astro +0 -9
- package/eventcatalog/src/enterprise/custom-documentation/pages/docs/custom/[...path]/index.astro +0 -18
- package/eventcatalog/src/enterprise/custom-documentation/pages/docs/custom/feature.astro +0 -171
- package/eventcatalog/src/enterprise/feature.ts +0 -75
- package/eventcatalog/src/enterprise/tools/index.ts +0 -10
- package/eventcatalog/src/hooks/eventcatalog-visualizer.ts +0 -126
- package/eventcatalog/src/pages/settings/billing.astro +0 -17
- package/eventcatalog/src/pages/visualiser/domain-integrations/index.astro +0 -26
- package/eventcatalog/src/types/mcp-modules.d.ts +0 -67
- package/eventcatalog/src/utils/node-graphs/domains-canvas.ts +0 -261
- package/eventcatalog/src/utils/node-graphs/export-node-graph.ts +0 -91
- /package/eventcatalog/src/{enterprise → features}/auth/error.astro +0 -0
- /package/eventcatalog/src/{enterprise → features}/auth/login.astro +0 -0
- /package/eventcatalog/src/{enterprise → features}/auth/unauthorized.astro +0 -0
- /package/eventcatalog/src/{enterprise/custom-documentation/pages → pages}/docs/custom/[...path]/_index.data.ts +0 -0
- /package/eventcatalog/src/{enterprise/custom-documentation/pages → pages}/docs/custom/[...path].mdx.ts +0 -0
|
@@ -15,7 +15,6 @@ export interface FieldFiltersProps {
|
|
|
15
15
|
formats: { value: string; count: number }[];
|
|
16
16
|
messageTypes: { value: string; count: number }[];
|
|
17
17
|
} | null;
|
|
18
|
-
isScaleEnabled?: boolean;
|
|
19
18
|
}
|
|
20
19
|
|
|
21
20
|
export default function FieldFilters({
|
|
@@ -28,7 +27,6 @@ export default function FieldFilters({
|
|
|
28
27
|
conflictingOnly,
|
|
29
28
|
onConflictingOnlyChange,
|
|
30
29
|
facets,
|
|
31
|
-
isScaleEnabled = false,
|
|
32
30
|
}: FieldFiltersProps) {
|
|
33
31
|
const toggleFormat = (value: string) => {
|
|
34
32
|
if (selectedFormats.includes(value)) {
|
|
@@ -131,32 +129,30 @@ export default function FieldFilters({
|
|
|
131
129
|
</div>
|
|
132
130
|
|
|
133
131
|
{/* Conflicting Fields Only Toggle */}
|
|
134
|
-
|
|
135
|
-
<
|
|
136
|
-
<
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
<
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
</div>
|
|
159
|
-
)}
|
|
132
|
+
<div>
|
|
133
|
+
<label className="flex items-center gap-2 cursor-pointer group">
|
|
134
|
+
<div
|
|
135
|
+
className={`w-4 h-4 flex-shrink-0 rounded border flex items-center justify-center transition-colors ${
|
|
136
|
+
conflictingOnly
|
|
137
|
+
? 'bg-amber-500 border-amber-500'
|
|
138
|
+
: 'border-[rgb(var(--ec-page-border))] bg-[rgb(var(--ec-input-bg))] group-hover:border-[rgb(var(--ec-icon-color))]'
|
|
139
|
+
}`}
|
|
140
|
+
onClick={() => onConflictingOnlyChange(!conflictingOnly)}
|
|
141
|
+
>
|
|
142
|
+
{conflictingOnly && (
|
|
143
|
+
<svg className="w-3 h-3 text-white" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="3">
|
|
144
|
+
<path d="M5 13l4 4L19 7" strokeLinecap="round" strokeLinejoin="round" />
|
|
145
|
+
</svg>
|
|
146
|
+
)}
|
|
147
|
+
</div>
|
|
148
|
+
<span className="text-sm text-[rgb(var(--ec-page-text))]" onClick={() => onConflictingOnlyChange(!conflictingOnly)}>
|
|
149
|
+
Conflicting fields
|
|
150
|
+
</span>
|
|
151
|
+
</label>
|
|
152
|
+
<p className="text-[11px] text-[rgb(var(--ec-page-text-muted))] mt-1 ml-6">
|
|
153
|
+
Show only fields with inconsistent types across messages
|
|
154
|
+
</p>
|
|
155
|
+
</div>
|
|
160
156
|
|
|
161
157
|
{/* Results & Clear */}
|
|
162
158
|
{activeFilterCount > 0 && (
|
|
@@ -211,23 +211,28 @@ function FieldNodeGraphInner({
|
|
|
211
211
|
occurrences,
|
|
212
212
|
onClose,
|
|
213
213
|
}: FieldNodeGraphProps) {
|
|
214
|
-
const
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
);
|
|
218
|
-
|
|
219
|
-
const [nodes, , onNodesChange] = useNodesState(initialNodes);
|
|
220
|
-
const [edges, , onEdgesChange] = useEdgesState(initialEdges);
|
|
221
|
-
const edgesRef = useRef(initialEdges);
|
|
214
|
+
const [nodes, setNodes, onNodesChange] = useNodesState<Node>([]);
|
|
215
|
+
const [edges, setEdges, onEdgesChange] = useEdgesState<Edge>([]);
|
|
216
|
+
const edgesRef = useRef(edges);
|
|
222
217
|
edgesRef.current = edges;
|
|
223
218
|
|
|
224
219
|
const { fitView } = useReactFlow();
|
|
225
220
|
const wrapperRef = useRef<HTMLDivElement>(null);
|
|
226
221
|
|
|
222
|
+
// Laying the graph out is async, so it's shown (and fitted) once it's ready
|
|
227
223
|
useEffect(() => {
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
224
|
+
let cancelled = false;
|
|
225
|
+
getNodesAndEdges({ fieldPath, fieldType, occurrences }).then((graph) => {
|
|
226
|
+
if (cancelled) return;
|
|
227
|
+
setNodes(graph.nodes);
|
|
228
|
+
setEdges(graph.edges);
|
|
229
|
+
// Called straight after setNodes so React Flow fits once they're measured
|
|
230
|
+
fitView({ padding: 0.2 });
|
|
231
|
+
});
|
|
232
|
+
return () => {
|
|
233
|
+
cancelled = true;
|
|
234
|
+
};
|
|
235
|
+
}, [fieldPath, fieldType, occurrences, setNodes, setEdges, fitView]);
|
|
231
236
|
|
|
232
237
|
// Unique messages, producers, consumers for the details panel
|
|
233
238
|
const uniqueMessages = useMemo(() => {
|
|
@@ -1,205 +1,11 @@
|
|
|
1
1
|
import { useState, useEffect, useCallback, useRef, useMemo } from 'react';
|
|
2
|
-
import { ChevronLeft, ChevronRight,
|
|
2
|
+
import { ChevronLeft, ChevronRight, Search, X, AlertTriangle } from 'lucide-react';
|
|
3
3
|
import FieldFilters from './FieldFilters';
|
|
4
4
|
import FieldsTable from './FieldsTable';
|
|
5
5
|
import type { FieldResult } from './FieldsTable';
|
|
6
6
|
import FieldNodeGraph from './FieldNodeGraph';
|
|
7
7
|
import { buildUrl } from '@utils/url-builder';
|
|
8
8
|
|
|
9
|
-
function DummyNode({
|
|
10
|
-
type,
|
|
11
|
-
name,
|
|
12
|
-
version,
|
|
13
|
-
className,
|
|
14
|
-
}: {
|
|
15
|
-
type: 'service' | 'event' | 'field';
|
|
16
|
-
name: string;
|
|
17
|
-
version?: string;
|
|
18
|
-
className?: string;
|
|
19
|
-
}) {
|
|
20
|
-
const styles = {
|
|
21
|
-
service: { border: 'border-pink-500', badge: 'bg-pink-500', label: 'SERVICE' },
|
|
22
|
-
event: { border: 'border-orange-500', badge: 'bg-orange-500', label: 'EVENT' },
|
|
23
|
-
field: { border: 'border-cyan-500', badge: 'bg-cyan-500', label: 'FIELD' },
|
|
24
|
-
};
|
|
25
|
-
const s = styles[type];
|
|
26
|
-
return (
|
|
27
|
-
<div
|
|
28
|
-
className={`relative rounded-xl border-2 ${s.border} bg-[rgb(var(--ec-card-bg))] px-3 pt-4 pb-2.5 min-w-[140px] ${className || ''}`}
|
|
29
|
-
>
|
|
30
|
-
<div
|
|
31
|
-
className={`absolute -top-2.5 left-2.5 ${s.badge} text-white text-[7px] font-bold uppercase tracking-widest px-1.5 py-0.5 rounded`}
|
|
32
|
-
>
|
|
33
|
-
{s.label}
|
|
34
|
-
</div>
|
|
35
|
-
<div className="text-[11px] font-semibold text-[rgb(var(--ec-page-text))]">{name}</div>
|
|
36
|
-
{version && <div className="text-[9px] text-[rgb(var(--ec-page-text-muted))]">v{version}</div>}
|
|
37
|
-
</div>
|
|
38
|
-
);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
function DummyEdge({ label }: { label: string }) {
|
|
42
|
-
return (
|
|
43
|
-
<div className="flex items-center gap-1">
|
|
44
|
-
<div className="w-8 h-px bg-[rgb(var(--ec-page-border))]" />
|
|
45
|
-
<span className="text-[8px] text-[rgb(var(--ec-page-text-muted))] whitespace-nowrap">{label}</span>
|
|
46
|
-
<div className="w-8 h-px bg-[rgb(var(--ec-page-border))]" />
|
|
47
|
-
</div>
|
|
48
|
-
);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
function FieldLineageUpgradeModal({ fieldPath, onClose }: { fieldPath: string; onClose: () => void }) {
|
|
52
|
-
return (
|
|
53
|
-
<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/50" onClick={onClose}>
|
|
54
|
-
<div
|
|
55
|
-
className="w-[90vw] h-[80vh] max-w-[1400px] rounded-xl border shadow-2xl flex flex-col overflow-hidden relative"
|
|
56
|
-
style={{
|
|
57
|
-
backgroundColor: 'rgb(var(--ec-page-bg))',
|
|
58
|
-
borderColor: 'rgb(var(--ec-page-border))',
|
|
59
|
-
}}
|
|
60
|
-
onClick={(e) => e.stopPropagation()}
|
|
61
|
-
>
|
|
62
|
-
{/* Header */}
|
|
63
|
-
<div
|
|
64
|
-
className="flex items-center justify-between px-5 py-3 border-b flex-shrink-0"
|
|
65
|
-
style={{ borderColor: 'rgb(var(--ec-page-border))' }}
|
|
66
|
-
>
|
|
67
|
-
<div className="flex items-center gap-2">
|
|
68
|
-
<h3 className="text-sm font-semibold" style={{ color: 'rgb(var(--ec-page-text))' }}>
|
|
69
|
-
Field Traceability
|
|
70
|
-
</h3>
|
|
71
|
-
<code
|
|
72
|
-
className="px-2 py-0.5 rounded text-xs font-mono"
|
|
73
|
-
style={{
|
|
74
|
-
backgroundColor: 'rgb(var(--ec-accent) / 0.1)',
|
|
75
|
-
color: 'rgb(var(--ec-accent))',
|
|
76
|
-
}}
|
|
77
|
-
>
|
|
78
|
-
{fieldPath}
|
|
79
|
-
</code>
|
|
80
|
-
</div>
|
|
81
|
-
<button
|
|
82
|
-
onClick={onClose}
|
|
83
|
-
className="p-1.5 rounded-lg transition-colors hover:bg-[rgb(var(--ec-content-hover))] flex-shrink-0"
|
|
84
|
-
style={{ color: 'rgb(var(--ec-icon-color))' }}
|
|
85
|
-
>
|
|
86
|
-
<X className="w-4 h-4" />
|
|
87
|
-
</button>
|
|
88
|
-
</div>
|
|
89
|
-
|
|
90
|
-
{/* Blurred dummy content */}
|
|
91
|
-
<div className="flex-1 relative overflow-hidden">
|
|
92
|
-
{/* Fake graph + side panel */}
|
|
93
|
-
<div className="absolute inset-0 flex blur-[2px] opacity-60 select-none pointer-events-none">
|
|
94
|
-
{/* Fake graph area */}
|
|
95
|
-
<div className="flex-1 flex items-center justify-center p-8">
|
|
96
|
-
<div className="flex items-center gap-3">
|
|
97
|
-
{/* Producer services */}
|
|
98
|
-
<div className="flex flex-col gap-6">
|
|
99
|
-
<DummyNode type="service" name="Billing Service" version="1.2.0" />
|
|
100
|
-
<DummyNode type="service" name="Order Service" version="2.0.1" />
|
|
101
|
-
</div>
|
|
102
|
-
{/* Edges to events */}
|
|
103
|
-
<div className="flex flex-col gap-12">
|
|
104
|
-
<DummyEdge label="produces" />
|
|
105
|
-
<DummyEdge label="produces" />
|
|
106
|
-
</div>
|
|
107
|
-
{/* Events */}
|
|
108
|
-
<div className="flex flex-col gap-6">
|
|
109
|
-
<DummyNode type="event" name="Payment Due" version="0.0.1" />
|
|
110
|
-
<DummyNode type="event" name="Order Created" version="1.0.0" />
|
|
111
|
-
</div>
|
|
112
|
-
{/* Edges to field */}
|
|
113
|
-
<div className="flex flex-col gap-12">
|
|
114
|
-
<DummyEdge label="contains" />
|
|
115
|
-
<DummyEdge label="contains" />
|
|
116
|
-
</div>
|
|
117
|
-
{/* Field */}
|
|
118
|
-
<div className="flex flex-col gap-6">
|
|
119
|
-
<DummyNode type="field" name={fieldPath} />
|
|
120
|
-
</div>
|
|
121
|
-
{/* Edges to consumers */}
|
|
122
|
-
<div className="flex flex-col gap-12">
|
|
123
|
-
<DummyEdge label="consumed by" />
|
|
124
|
-
</div>
|
|
125
|
-
{/* Consumer services */}
|
|
126
|
-
<div className="flex flex-col gap-6">
|
|
127
|
-
<DummyNode type="service" name="Notification Service" version="0.0.2" />
|
|
128
|
-
</div>
|
|
129
|
-
</div>
|
|
130
|
-
</div>
|
|
131
|
-
{/* Fake side panel */}
|
|
132
|
-
<div className="w-[280px] flex-shrink-0 border-l border-[rgb(var(--ec-page-border))] p-4 space-y-4">
|
|
133
|
-
<div>
|
|
134
|
-
<div className="text-[11px] font-medium text-[rgb(var(--ec-page-text-muted))] uppercase tracking-wider mb-2">
|
|
135
|
-
Field
|
|
136
|
-
</div>
|
|
137
|
-
<div className="text-sm font-mono font-semibold text-[rgb(var(--ec-page-text))]">{fieldPath}</div>
|
|
138
|
-
<div className="text-xs text-[rgb(var(--ec-page-text-muted))] mt-1">string</div>
|
|
139
|
-
</div>
|
|
140
|
-
<div>
|
|
141
|
-
<div className="text-[11px] font-medium text-amber-500 uppercase tracking-wider mb-2">Type Conflict</div>
|
|
142
|
-
<div className="rounded-lg border border-amber-500/20 bg-amber-500/5 p-2.5 space-y-1">
|
|
143
|
-
<div className="text-xs text-amber-600">Inconsistent types detected</div>
|
|
144
|
-
<div className="flex justify-between text-xs">
|
|
145
|
-
<code className="font-mono">string</code>
|
|
146
|
-
<span className="text-[rgb(var(--ec-page-text-muted))]">3 schemas</span>
|
|
147
|
-
</div>
|
|
148
|
-
<div className="flex justify-between text-xs">
|
|
149
|
-
<code className="font-mono">integer</code>
|
|
150
|
-
<span className="text-[rgb(var(--ec-page-text-muted))]">1 schema</span>
|
|
151
|
-
</div>
|
|
152
|
-
</div>
|
|
153
|
-
</div>
|
|
154
|
-
<div>
|
|
155
|
-
<div className="text-[11px] font-medium text-[rgb(var(--ec-page-text-muted))] uppercase tracking-wider mb-2">
|
|
156
|
-
Messages (3)
|
|
157
|
-
</div>
|
|
158
|
-
<div className="space-y-1.5">
|
|
159
|
-
<div className="rounded-lg border border-[rgb(var(--ec-page-border)/0.5)] bg-[rgb(var(--ec-card-bg))] px-2.5 py-2 text-xs">
|
|
160
|
-
Payment Due
|
|
161
|
-
</div>
|
|
162
|
-
<div className="rounded-lg border border-[rgb(var(--ec-page-border)/0.5)] bg-[rgb(var(--ec-card-bg))] px-2.5 py-2 text-xs">
|
|
163
|
-
Order Created
|
|
164
|
-
</div>
|
|
165
|
-
<div className="rounded-lg border border-[rgb(var(--ec-page-border)/0.5)] bg-[rgb(var(--ec-card-bg))] px-2.5 py-2 text-xs">
|
|
166
|
-
Invoice Generated
|
|
167
|
-
</div>
|
|
168
|
-
</div>
|
|
169
|
-
</div>
|
|
170
|
-
</div>
|
|
171
|
-
</div>
|
|
172
|
-
|
|
173
|
-
{/* Upgrade prompt overlay */}
|
|
174
|
-
<div className="absolute inset-0 flex items-center justify-center bg-[rgb(var(--ec-page-bg)/0.5)]">
|
|
175
|
-
<div className="text-center max-w-lg px-6 py-8 rounded-2xl border border-[rgb(var(--ec-page-border))] bg-[rgb(var(--ec-page-bg))] shadow-2xl">
|
|
176
|
-
<div className="w-12 h-12 rounded-full bg-[rgb(var(--ec-accent)/0.1)] flex items-center justify-center mx-auto mb-4">
|
|
177
|
-
<Lock className="w-6 h-6 text-[rgb(var(--ec-accent))]" />
|
|
178
|
-
</div>
|
|
179
|
-
<h3 className="text-lg font-semibold text-[rgb(var(--ec-page-text))] mb-2">Field Lineage & Traceability</h3>
|
|
180
|
-
<p className="text-sm text-[rgb(var(--ec-page-text-muted))] mb-5 leading-relaxed">
|
|
181
|
-
See which services produce and consume this field, detect type conflicts across schemas, and trace field usage
|
|
182
|
-
across your entire event-driven architecture.
|
|
183
|
-
</p>
|
|
184
|
-
<a
|
|
185
|
-
href="https://eventcatalog.cloud/"
|
|
186
|
-
target="_blank"
|
|
187
|
-
rel="noopener noreferrer"
|
|
188
|
-
className="inline-flex items-center gap-2 px-5 py-2.5 rounded-lg text-sm font-medium text-white bg-[rgb(var(--ec-accent))] hover:opacity-90 transition-opacity"
|
|
189
|
-
>
|
|
190
|
-
Start your 14-day free trial
|
|
191
|
-
</a>
|
|
192
|
-
<p className="text-xs text-[rgb(var(--ec-page-text-muted))] mt-3">
|
|
193
|
-
Available with EventCatalog Scale. No credit card required.
|
|
194
|
-
</p>
|
|
195
|
-
</div>
|
|
196
|
-
</div>
|
|
197
|
-
</div>
|
|
198
|
-
</div>
|
|
199
|
-
</div>
|
|
200
|
-
);
|
|
201
|
-
}
|
|
202
|
-
|
|
203
9
|
interface Facets {
|
|
204
10
|
formats: { value: string; count: number }[];
|
|
205
11
|
types: { value: string; count: number }[];
|
|
@@ -223,11 +29,7 @@ interface SelectedField {
|
|
|
223
29
|
occurrences: FieldResult[];
|
|
224
30
|
}
|
|
225
31
|
|
|
226
|
-
|
|
227
|
-
isScaleEnabled?: boolean;
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
export default function FieldsExplorer({ isScaleEnabled = false }: FieldsExplorerProps) {
|
|
32
|
+
export default function FieldsExplorer() {
|
|
231
33
|
const [fields, setFields] = useState<FieldResult[]>([]);
|
|
232
34
|
const [total, setTotal] = useState(0);
|
|
233
35
|
const [cursor, setCursor] = useState<string | null>(null);
|
|
@@ -325,18 +127,6 @@ export default function FieldsExplorer({ isScaleEnabled = false }: FieldsExplore
|
|
|
325
127
|
|
|
326
128
|
// Open modal: fetch all occurrences for the field path, then show modal
|
|
327
129
|
const handleSelectField = useCallback(async (fieldPath: string) => {
|
|
328
|
-
// Non-scale users get the locked upgrade modal
|
|
329
|
-
if (!isScaleEnabled) {
|
|
330
|
-
setSelectedField({
|
|
331
|
-
path: fieldPath,
|
|
332
|
-
type: 'unknown',
|
|
333
|
-
description: '',
|
|
334
|
-
required: false,
|
|
335
|
-
occurrences: [],
|
|
336
|
-
});
|
|
337
|
-
return;
|
|
338
|
-
}
|
|
339
|
-
|
|
340
130
|
try {
|
|
341
131
|
// Fetch all pages of occurrences for this field path
|
|
342
132
|
let allOccurrences: FieldResult[] = [];
|
|
@@ -446,7 +236,6 @@ export default function FieldsExplorer({ isScaleEnabled = false }: FieldsExplore
|
|
|
446
236
|
conflictingOnly={conflictingOnly}
|
|
447
237
|
onConflictingOnlyChange={setConflictingOnly}
|
|
448
238
|
facets={filterFacets}
|
|
449
|
-
isScaleEnabled={isScaleEnabled}
|
|
450
239
|
/>
|
|
451
240
|
</div>
|
|
452
241
|
</div>
|
|
@@ -485,7 +274,7 @@ export default function FieldsExplorer({ isScaleEnabled = false }: FieldsExplore
|
|
|
485
274
|
)}
|
|
486
275
|
|
|
487
276
|
{/* Table */}
|
|
488
|
-
<FieldsTable fields={fields} onSelectField={handleSelectField} isLoading={isLoading}
|
|
277
|
+
<FieldsTable fields={fields} onSelectField={handleSelectField} isLoading={isLoading} />
|
|
489
278
|
|
|
490
279
|
{/* Pagination */}
|
|
491
280
|
<div className="flex-shrink-0 flex items-center justify-between px-6 py-3 border-t border-[rgb(var(--ec-page-border))]">
|
|
@@ -524,10 +313,7 @@ export default function FieldsExplorer({ isScaleEnabled = false }: FieldsExplore
|
|
|
524
313
|
</div>
|
|
525
314
|
|
|
526
315
|
{/* Field Detail Modal with Node Graph */}
|
|
527
|
-
{selectedField &&
|
|
528
|
-
<FieldLineageUpgradeModal fieldPath={selectedField.path} onClose={() => setSelectedField(null)} />
|
|
529
|
-
)}
|
|
530
|
-
{selectedField && isScaleEnabled && (
|
|
316
|
+
{selectedField && (
|
|
531
317
|
<FieldNodeGraph
|
|
532
318
|
fieldPath={selectedField.path}
|
|
533
319
|
fieldType={selectedField.type}
|
|
@@ -26,7 +26,6 @@ export interface FieldsTableProps {
|
|
|
26
26
|
fields: FieldResult[];
|
|
27
27
|
onSelectField: (fieldPath: string) => void;
|
|
28
28
|
isLoading: boolean;
|
|
29
|
-
isScaleEnabled?: boolean;
|
|
30
29
|
}
|
|
31
30
|
|
|
32
31
|
const getColorAndIconForMessageType = (type: string) => {
|
|
@@ -82,7 +81,7 @@ function FieldPathCell({ path }: { path: string }) {
|
|
|
82
81
|
);
|
|
83
82
|
}
|
|
84
83
|
|
|
85
|
-
export default function FieldsTable({ fields, onSelectField, isLoading
|
|
84
|
+
export default function FieldsTable({ fields, onSelectField, isLoading }: FieldsTableProps) {
|
|
86
85
|
if (isLoading) {
|
|
87
86
|
return (
|
|
88
87
|
<div className="flex-1 flex items-center justify-center px-6 pb-5">
|
|
@@ -130,16 +129,12 @@ export default function FieldsTable({ fields, onSelectField, isLoading, isScaleE
|
|
|
130
129
|
<th className="px-4 py-2.5 text-left text-[11px] font-medium text-[rgb(var(--ec-page-text-muted))] uppercase tracking-wider">
|
|
131
130
|
Required
|
|
132
131
|
</th>
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
<th className="px-4 py-2.5 text-left text-[11px] font-medium text-[rgb(var(--ec-page-text-muted))] uppercase tracking-wider">
|
|
140
|
-
Used In
|
|
141
|
-
</th>
|
|
142
|
-
)}
|
|
132
|
+
<th className="px-4 py-2.5 text-left text-[11px] font-medium text-[rgb(var(--ec-page-text-muted))] uppercase tracking-wider">
|
|
133
|
+
Consistency
|
|
134
|
+
</th>
|
|
135
|
+
<th className="px-4 py-2.5 text-left text-[11px] font-medium text-[rgb(var(--ec-page-text-muted))] uppercase tracking-wider">
|
|
136
|
+
Used In
|
|
137
|
+
</th>
|
|
143
138
|
<th className="px-4 py-2.5 text-left text-[11px] font-medium text-[rgb(var(--ec-page-text-muted))] uppercase tracking-wider">
|
|
144
139
|
Owners
|
|
145
140
|
</th>
|
|
@@ -178,32 +173,28 @@ export default function FieldsTable({ fields, onSelectField, isLoading, isScaleE
|
|
|
178
173
|
<span className="text-[0.8rem] text-[rgb(var(--ec-page-text-muted))]">-</span>
|
|
179
174
|
)}
|
|
180
175
|
</td>
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
{field.conflicts.length} types
|
|
191
|
-
</span>
|
|
192
|
-
</div>
|
|
193
|
-
) : (
|
|
194
|
-
<span className="inline-flex items-center" title="All usages of this field match the same type">
|
|
195
|
-
<Check className="h-4 w-4 text-green-500" />
|
|
176
|
+
<td className="px-4 py-3 text-sm text-[rgb(var(--ec-page-text-muted))]">
|
|
177
|
+
{field.conflicts && field.conflicts.length > 1 ? (
|
|
178
|
+
<div
|
|
179
|
+
className="flex items-center gap-1.5"
|
|
180
|
+
title={field.conflicts.map((c) => `${c.type} (${c.count})`).join(', ')}
|
|
181
|
+
>
|
|
182
|
+
<AlertTriangle className="w-3.5 h-3.5 text-amber-500 flex-shrink-0" />
|
|
183
|
+
<span className="inline-flex items-center px-1.5 py-0.5 rounded text-[10px] font-semibold bg-amber-500/10 text-amber-600 border border-amber-500/20">
|
|
184
|
+
{field.conflicts.length} types
|
|
196
185
|
</span>
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
<td className="px-4 py-3 text-sm text-[rgb(var(--ec-page-text-muted))]">
|
|
202
|
-
<span className="text-[0.8rem] text-[rgb(var(--ec-page-text-muted))]">
|
|
203
|
-
{field.usedInCount || 1} {(field.usedInCount || 1) === 1 ? 'schema' : 'schemas'}
|
|
186
|
+
</div>
|
|
187
|
+
) : (
|
|
188
|
+
<span className="inline-flex items-center" title="All usages of this field match the same type">
|
|
189
|
+
<Check className="h-4 w-4 text-green-500" />
|
|
204
190
|
</span>
|
|
205
|
-
|
|
206
|
-
|
|
191
|
+
)}
|
|
192
|
+
</td>
|
|
193
|
+
<td className="px-4 py-3 text-sm text-[rgb(var(--ec-page-text-muted))]">
|
|
194
|
+
<span className="text-[0.8rem] text-[rgb(var(--ec-page-text-muted))]">
|
|
195
|
+
{field.usedInCount || 1} {(field.usedInCount || 1) === 1 ? 'schema' : 'schemas'}
|
|
196
|
+
</span>
|
|
197
|
+
</td>
|
|
207
198
|
<td className="px-4 py-3 text-sm text-[rgb(var(--ec-page-text-muted))]">
|
|
208
199
|
{owners.length > 0 ? (
|
|
209
200
|
<div className="flex items-center gap-1 flex-wrap">
|
|
@@ -2,17 +2,12 @@
|
|
|
2
2
|
import catalog from '@utils/eventcatalog-config/catalog';
|
|
3
3
|
import Search from '@components/Search/Search.astro';
|
|
4
4
|
import { buildUrl } from '@utils/url-builder';
|
|
5
|
-
import {
|
|
6
|
-
showEventCatalogBranding,
|
|
7
|
-
showCustomBranding,
|
|
8
|
-
isEventCatalogChatVisible,
|
|
9
|
-
isEventCatalogChatEnabled,
|
|
10
|
-
} from '@utils/feature';
|
|
11
5
|
import { getSession } from '@utils/auth-astro/server';
|
|
12
|
-
import { isAuthEnabled,
|
|
6
|
+
import { isAuthEnabled, isEventCatalogChatVisible, isEventCatalogChatEnabled } from '@utils/feature';
|
|
13
7
|
import { EnvironmentDropdown } from './EnvironmentDropdown';
|
|
14
8
|
import ChatPanelButton from './ChatPanel/ChatPanelButton';
|
|
15
9
|
import ThemeToggle from './ThemeToggle';
|
|
10
|
+
import TrialBadge from './TrialBadge.astro';
|
|
16
11
|
|
|
17
12
|
const { showNestedSideBar = true } = Astro.props;
|
|
18
13
|
|
|
@@ -27,7 +22,16 @@ const logo = {
|
|
|
27
22
|
text: catalog?.logo?.text || 'EventCatalog',
|
|
28
23
|
};
|
|
29
24
|
|
|
30
|
-
const repositoryUrl = catalog?.repositoryUrl
|
|
25
|
+
const repositoryUrl = catalog?.repositoryUrl;
|
|
26
|
+
|
|
27
|
+
// Header icons match the theme toggle: a 20px icon in a padded button, coloured with the theme's icon colour
|
|
28
|
+
const headerIconLinkClass =
|
|
29
|
+
'block p-2 rounded-md text-[rgb(var(--ec-icon-color))] hover:text-[rgb(var(--ec-icon-hover))] hover:bg-[rgb(var(--ec-dropdown-hover))] transition-colors';
|
|
30
|
+
const headerIconClass = 'block h-5 w-5 bg-current';
|
|
31
|
+
const iconMask = (name: string) => {
|
|
32
|
+
const url = buildUrl(`/icons/${name}.svg`, true);
|
|
33
|
+
return `mask: url("${url}") center / contain no-repeat; -webkit-mask: url("${url}") center / contain no-repeat;`;
|
|
34
|
+
};
|
|
31
35
|
|
|
32
36
|
const user = session?.user as { name?: string; email?: string; image?: string; provider?: string } | undefined;
|
|
33
37
|
const userName = user?.name || user?.email || 'User';
|
|
@@ -70,7 +74,8 @@ const providerName = user?.provider ? providerNames[user.provider] || user.provi
|
|
|
70
74
|
<div class="hidden md:block shrink-0 ml-auto">
|
|
71
75
|
{
|
|
72
76
|
session ? (
|
|
73
|
-
<div class="flex items-center
|
|
77
|
+
<div class="flex items-center gap-3 justify-end pr-2">
|
|
78
|
+
<TrialBadge />
|
|
74
79
|
{catalog.environments && catalog.environments.length > 0 && (
|
|
75
80
|
<EnvironmentDropdown environments={catalog.environments} client:idle />
|
|
76
81
|
)}
|
|
@@ -168,7 +173,8 @@ const providerName = user?.provider ? providerNames[user.provider] || user.provi
|
|
|
168
173
|
</div>
|
|
169
174
|
) : (
|
|
170
175
|
<>
|
|
171
|
-
<div class="flex items-center
|
|
176
|
+
<div class="flex items-center gap-3 justify-end pr-2">
|
|
177
|
+
<TrialBadge />
|
|
172
178
|
{catalog.environments && catalog.environments.length > 0 && (
|
|
173
179
|
<EnvironmentDropdown environments={catalog.environments} client:idle />
|
|
174
180
|
)}
|
|
@@ -180,57 +186,36 @@ const providerName = user?.provider ? providerNames[user.provider] || user.provi
|
|
|
180
186
|
Sign In
|
|
181
187
|
</button>
|
|
182
188
|
)}
|
|
183
|
-
<
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
href="https://discord.com/invite/3rjaZMmrAm"
|
|
189
|
-
class="block p-1.5 rounded-lg hover:bg-[rgb(var(--ec-dropdown-hover))] transition-colors"
|
|
190
|
-
aria-label="Join our Discord community"
|
|
191
|
-
>
|
|
192
|
-
<img
|
|
193
|
-
src={buildUrl('/icons/discord.svg', true)}
|
|
194
|
-
alt=""
|
|
195
|
-
class="h-6 w-6 hover:opacity-100 transition-opacity ec-themed-icon"
|
|
196
|
-
aria-hidden="true"
|
|
197
|
-
/>
|
|
198
|
-
</a>
|
|
199
|
-
</li>
|
|
200
|
-
<li>
|
|
201
|
-
<a
|
|
202
|
-
href="https://github.com/event-catalog/eventcatalog"
|
|
203
|
-
class="block p-1.5 rounded-lg hover:bg-[rgb(var(--ec-dropdown-hover))] transition-colors"
|
|
204
|
-
aria-label="View EventCatalog on GitHub"
|
|
205
|
-
>
|
|
206
|
-
<img
|
|
207
|
-
src={buildUrl('/icons/github.svg', true)}
|
|
208
|
-
alt=""
|
|
209
|
-
class="h-6 w-6 hover:opacity-100 transition-opacity ec-themed-icon"
|
|
210
|
-
aria-hidden="true"
|
|
211
|
-
/>
|
|
212
|
-
</a>
|
|
213
|
-
</li>
|
|
214
|
-
</ul>
|
|
215
|
-
)}
|
|
216
|
-
{showCustomBranding() && !showEventCatalogBranding() && (
|
|
217
|
-
<ul class="flex space-x-4">
|
|
189
|
+
<ul class="flex items-center gap-1">
|
|
190
|
+
<li>
|
|
191
|
+
<ThemeToggle client:idle />
|
|
192
|
+
</li>
|
|
193
|
+
{repositoryUrl && (
|
|
218
194
|
<li>
|
|
219
|
-
<a
|
|
220
|
-
|
|
221
|
-
class="block p-1.5 rounded-lg hover:bg-[rgb(var(--ec-dropdown-hover))] transition-colors focus:outline-hidden"
|
|
222
|
-
aria-label="View repository on GitHub"
|
|
223
|
-
>
|
|
224
|
-
<img
|
|
225
|
-
src={buildUrl('/icons/github.svg', true)}
|
|
226
|
-
alt=""
|
|
227
|
-
class="h-6 w-6 opacity-70 hover:opacity-100 transition-opacity ec-themed-icon"
|
|
228
|
-
aria-hidden="true"
|
|
229
|
-
/>
|
|
195
|
+
<a href={repositoryUrl} class={headerIconLinkClass} aria-label="View repository on GitHub">
|
|
196
|
+
<span class={headerIconClass} style={iconMask('github')} aria-hidden="true" />
|
|
230
197
|
</a>
|
|
231
198
|
</li>
|
|
232
|
-
|
|
233
|
-
|
|
199
|
+
)}
|
|
200
|
+
<li>
|
|
201
|
+
<a
|
|
202
|
+
href="https://discord.com/invite/3rjaZMmrAm"
|
|
203
|
+
class={headerIconLinkClass}
|
|
204
|
+
aria-label="Join our Discord community"
|
|
205
|
+
>
|
|
206
|
+
<span class={headerIconClass} style={iconMask('discord')} aria-hidden="true" />
|
|
207
|
+
</a>
|
|
208
|
+
</li>
|
|
209
|
+
<li>
|
|
210
|
+
<a
|
|
211
|
+
href="https://github.com/event-catalog/eventcatalog"
|
|
212
|
+
class={headerIconLinkClass}
|
|
213
|
+
aria-label="View EventCatalog on GitHub"
|
|
214
|
+
>
|
|
215
|
+
<span class={headerIconClass} style={iconMask('github')} aria-hidden="true" />
|
|
216
|
+
</a>
|
|
217
|
+
</li>
|
|
218
|
+
</ul>
|
|
234
219
|
</div>
|
|
235
220
|
</>
|
|
236
221
|
)
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
.tooltip {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
2
|
+
visibility: hidden;
|
|
3
|
+
position: absolute;
|
|
4
|
+
}
|
|
5
|
+
.has-tooltip:hover .tooltip {
|
|
6
|
+
visibility: visible;
|
|
7
|
+
z-index: 100;
|
|
8
|
+
}
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
10
|
+
.pill-item:hover {
|
|
11
|
+
background: linear-gradient(to left, rgb(var(--ec-accent-gradient-from)), rgb(var(--ec-accent-gradient-to)));
|
|
12
|
+
color: white;
|
|
13
|
+
font-weight: normal;
|
|
14
|
+
}
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
16
|
+
.owner-item:hover {
|
|
17
|
+
background: linear-gradient(to left, rgb(var(--ec-accent-gradient-from)), rgb(var(--ec-accent-gradient-to)));
|
|
18
|
+
color: white;
|
|
19
|
+
font-weight: normal;
|
|
20
|
+
}
|