@manojkmfsi/monodog 1.1.37 → 1.1.39
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/CHANGELOG.md +12 -0
- package/monodog-dashboard/dist/assets/index-C08ciT3A.js +20 -0
- package/monodog-dashboard/dist/assets/index-C08ciT3A.js.map +1 -0
- package/monodog-dashboard/dist/assets/index-Dc2vaUOq.css +1 -0
- package/monodog-dashboard/{index.html → dist/index.html} +2 -1
- package/monodog-dashboard/package.json +0 -3
- package/package.json +2 -2
- package/monodog-dashboard/THEME_SYSTEM.md +0 -309
- package/monodog-dashboard/__tests__/AuthCallbackPage.test.ts +0 -138
- package/monodog-dashboard/__tests__/ConfigInspector.test.ts +0 -33
- package/monodog-dashboard/__tests__/DependencyGraph.test.ts +0 -72
- package/monodog-dashboard/__tests__/HealthStatus.test.ts +0 -69
- package/monodog-dashboard/__tests__/LoginPage.test.ts +0 -79
- package/monodog-dashboard/__tests__/PackageDetail.test.ts +0 -22
- package/monodog-dashboard/__tests__/ReleaseManager.test.tsx +0 -510
- package/monodog-dashboard/__tests__/api-client.test.ts +0 -475
- package/monodog-dashboard/__tests__/components.test.ts +0 -117
- package/monodog-dashboard/__tests__/dashboard.utils.test.ts +0 -144
- package/monodog-dashboard/__tests__/dependency.utils.test.ts +0 -125
- package/monodog-dashboard/__tests__/monorepoService.unit.test.ts +0 -103
- package/monodog-dashboard/__tests__/packages.utils.test.ts +0 -37
- package/monodog-dashboard/__tests__/pages.test.ts +0 -103
- package/monodog-dashboard/package-lock.json +0 -4587
- package/monodog-dashboard/postcss.config.js +0 -6
- package/monodog-dashboard/src/components/App.tsx +0 -36
- package/monodog-dashboard/src/components/LoadingState.tsx +0 -18
- package/monodog-dashboard/src/components/PermissionGuard.tsx +0 -92
- package/monodog-dashboard/src/components/ProtectedRoute.tsx +0 -24
- package/monodog-dashboard/src/components/configuration/Configuration.tsx +0 -91
- package/monodog-dashboard/src/components/configuration/components/BrandingSettings.tsx +0 -128
- package/monodog-dashboard/src/components/configuration/components/ConfigurationHeader.tsx +0 -34
- package/monodog-dashboard/src/components/configuration/components/ConfigurationModal.tsx +0 -20
- package/monodog-dashboard/src/components/configuration/components/ConfigurationTabs.tsx +0 -30
- package/monodog-dashboard/src/components/configuration/components/FeatureToggles.tsx +0 -66
- package/monodog-dashboard/src/components/configuration/components/GeneralSettings.tsx +0 -77
- package/monodog-dashboard/src/components/configuration/components/MonorepoSettings.tsx +0 -179
- package/monodog-dashboard/src/components/configuration/components/index.ts +0 -8
- package/monodog-dashboard/src/components/configuration/types/config.types.ts +0 -52
- package/monodog-dashboard/src/components/configuration/utils/config.utils.tsx +0 -115
- package/monodog-dashboard/src/components/main-dashboard/Dashboard.tsx +0 -242
- package/monodog-dashboard/src/components/main-dashboard/Layout.tsx +0 -112
- package/monodog-dashboard/src/components/main-dashboard/components/Header.tsx +0 -47
- package/monodog-dashboard/src/components/main-dashboard/components/PackageDistribution.tsx +0 -35
- package/monodog-dashboard/src/components/main-dashboard/components/PackageSearchFilter.tsx +0 -47
- package/monodog-dashboard/src/components/main-dashboard/components/PackageTable.tsx +0 -87
- package/monodog-dashboard/src/components/main-dashboard/components/QuickActions.tsx +0 -60
- package/monodog-dashboard/src/components/main-dashboard/components/StatsCards.tsx +0 -73
- package/monodog-dashboard/src/components/main-dashboard/components/index.ts +0 -7
- package/monodog-dashboard/src/components/main-dashboard/types/dashboard.types.ts +0 -33
- package/monodog-dashboard/src/components/main-dashboard/utils/dashboard.utils.tsx +0 -70
- package/monodog-dashboard/src/components/modules/ci-integration/CIIntegration.tsx +0 -277
- package/monodog-dashboard/src/components/modules/ci-integration/components/BuildDetails.tsx +0 -228
- package/monodog-dashboard/src/components/modules/ci-integration/components/BuildList.tsx +0 -212
- package/monodog-dashboard/src/components/modules/ci-integration/components/BuildOverview.tsx +0 -158
- package/monodog-dashboard/src/components/modules/ci-integration/components/CIIntegrationHeader.tsx +0 -38
- package/monodog-dashboard/src/components/modules/ci-integration/components/ErrorState.tsx +0 -25
- package/monodog-dashboard/src/components/modules/ci-integration/components/LoadingState.tsx +0 -16
- package/monodog-dashboard/src/components/modules/ci-integration/components/PipelineStatus.tsx +0 -223
- package/monodog-dashboard/src/components/modules/ci-integration/components/index.ts +0 -8
- package/monodog-dashboard/src/components/modules/ci-integration/types/ci.types.ts +0 -97
- package/monodog-dashboard/src/components/modules/ci-integration/utils/ci.utils.tsx +0 -264
- package/monodog-dashboard/src/components/modules/config-inspector/ConfigInspector.tsx +0 -324
- package/monodog-dashboard/src/components/modules/config-inspector/components/ConfigEditor.tsx +0 -93
- package/monodog-dashboard/src/components/modules/config-inspector/components/ConfigInspectorHeader.tsx +0 -36
- package/monodog-dashboard/src/components/modules/config-inspector/components/ConfigPreview.tsx +0 -89
- package/monodog-dashboard/src/components/modules/config-inspector/components/ConfigSidebar.tsx +0 -141
- package/monodog-dashboard/src/components/modules/config-inspector/components/ConfigToolbar.tsx +0 -184
- package/monodog-dashboard/src/components/modules/config-inspector/components/ErrorState.tsx +0 -25
- package/monodog-dashboard/src/components/modules/config-inspector/components/LoadingState.tsx +0 -16
- package/monodog-dashboard/src/components/modules/config-inspector/components/ValidationPanel.tsx +0 -155
- package/monodog-dashboard/src/components/modules/config-inspector/components/index.ts +0 -9
- package/monodog-dashboard/src/components/modules/config-inspector/types/config.types.ts +0 -100
- package/monodog-dashboard/src/components/modules/config-inspector/utils/config.utils.tsx +0 -704
- package/monodog-dashboard/src/components/modules/dependency-graph/DependencyGraph.tsx +0 -224
- package/monodog-dashboard/src/components/modules/dependency-graph/components/CircularDependencies.tsx +0 -177
- package/monodog-dashboard/src/components/modules/dependency-graph/components/DependencyDetails.tsx +0 -192
- package/monodog-dashboard/src/components/modules/dependency-graph/components/DependencyGraphHeader.tsx +0 -30
- package/monodog-dashboard/src/components/modules/dependency-graph/components/DependencyList.tsx +0 -177
- package/monodog-dashboard/src/components/modules/dependency-graph/components/ErrorState.tsx +0 -25
- package/monodog-dashboard/src/components/modules/dependency-graph/components/GraphLegend.tsx +0 -89
- package/monodog-dashboard/src/components/modules/dependency-graph/components/GraphStats.tsx +0 -141
- package/monodog-dashboard/src/components/modules/dependency-graph/components/GraphToolbar.tsx +0 -107
- package/monodog-dashboard/src/components/modules/dependency-graph/components/GraphVisualization.tsx +0 -179
- package/monodog-dashboard/src/components/modules/dependency-graph/components/LoadingState.tsx +0 -16
- package/monodog-dashboard/src/components/modules/dependency-graph/components/index.ts +0 -11
- package/monodog-dashboard/src/components/modules/dependency-graph/types/dependency.types.ts +0 -105
- package/monodog-dashboard/src/components/modules/dependency-graph/utils/dependency.utils.tsx +0 -433
- package/monodog-dashboard/src/components/modules/health-status/HealthStatus.tsx +0 -739
- package/monodog-dashboard/src/components/modules/health-status/components/ErrorState.tsx +0 -25
- package/monodog-dashboard/src/components/modules/health-status/components/HealthActions.tsx +0 -122
- package/monodog-dashboard/src/components/modules/health-status/components/HealthAlerts.tsx +0 -151
- package/monodog-dashboard/src/components/modules/health-status/components/HealthMetrics.tsx +0 -132
- package/monodog-dashboard/src/components/modules/health-status/components/HealthStatusHeader.tsx +0 -30
- package/monodog-dashboard/src/components/modules/health-status/components/LoadingState.tsx +0 -16
- package/monodog-dashboard/src/components/modules/health-status/components/OverallHealthScore.tsx +0 -122
- package/monodog-dashboard/src/components/modules/health-status/components/PackageHealthList.tsx +0 -195
- package/monodog-dashboard/src/components/modules/health-status/types/health.types.ts +0 -80
- package/monodog-dashboard/src/components/modules/health-status/utils/health.utils.tsx +0 -220
- package/monodog-dashboard/src/components/modules/packages/PackageDetail.tsx +0 -255
- package/monodog-dashboard/src/components/modules/packages/PackagesOverview.tsx +0 -166
- package/monodog-dashboard/src/components/modules/packages/components/ConfigurationTab.tsx +0 -311
- package/monodog-dashboard/src/components/modules/packages/components/DependenciesTab.tsx +0 -154
- package/monodog-dashboard/src/components/modules/packages/components/ErrorState.tsx +0 -21
- package/monodog-dashboard/src/components/modules/packages/components/HealthMetricsTab.tsx +0 -275
- package/monodog-dashboard/src/components/modules/packages/components/LoadingState.tsx +0 -14
- package/monodog-dashboard/src/components/modules/packages/components/PackageDetailHeader.tsx +0 -167
- package/monodog-dashboard/src/components/modules/packages/components/PackageDetailTabs.tsx +0 -49
- package/monodog-dashboard/src/components/modules/packages/components/PackageStats.tsx +0 -70
- package/monodog-dashboard/src/components/modules/packages/components/PackagesTable.tsx +0 -163
- package/monodog-dashboard/src/components/modules/packages/components/RecentCommitsTab.tsx +0 -90
- package/monodog-dashboard/src/components/modules/packages/components/SearchAndFilter.tsx +0 -66
- package/monodog-dashboard/src/components/modules/packages/components/index.ts +0 -12
- package/monodog-dashboard/src/components/modules/packages/types/packages.types.ts +0 -101
- package/monodog-dashboard/src/components/modules/packages/utils/packages.utils.tsx +0 -178
- package/monodog-dashboard/src/components/pipeline/JobsList.tsx +0 -83
- package/monodog-dashboard/src/components/pipeline/LogViewer.tsx +0 -392
- package/monodog-dashboard/src/components/pipeline/PipelineManager.tsx +0 -562
- package/monodog-dashboard/src/components/pipeline/WorkflowRunsList.tsx +0 -272
- package/monodog-dashboard/src/components/pipeline/WorkflowTrigger.tsx +0 -182
- package/monodog-dashboard/src/components/pipeline/utils/pipeline.utils.tsx +0 -11
- package/monodog-dashboard/src/components/publish-control/PublishControl.tsx +0 -229
- package/monodog-dashboard/src/components/publish-control/components/ChangelogViewer.tsx +0 -103
- package/monodog-dashboard/src/components/publish-control/components/ErrorState.tsx +0 -23
- package/monodog-dashboard/src/components/publish-control/components/LoadingState.tsx +0 -10
- package/monodog-dashboard/src/components/publish-control/components/PackageReleaseTable.tsx +0 -140
- package/monodog-dashboard/src/components/publish-control/components/PublishHeader.tsx +0 -30
- package/monodog-dashboard/src/components/publish-control/components/QuickActionCards.tsx +0 -56
- package/monodog-dashboard/src/components/publish-control/components/ReleaseSchedule.tsx +0 -104
- package/monodog-dashboard/src/components/publish-control/components/index.ts +0 -8
- package/monodog-dashboard/src/components/publish-control/types/publish.types.ts +0 -39
- package/monodog-dashboard/src/components/publish-control/utils/publish.utils.ts +0 -59
- package/monodog-dashboard/src/components/release-manager/ReleaseManager.tsx +0 -342
- package/monodog-dashboard/src/components/release-manager/components/ChangesetPreview.tsx +0 -123
- package/monodog-dashboard/src/components/release-manager/components/ErrorState.tsx +0 -38
- package/monodog-dashboard/src/components/release-manager/components/LoadingState.tsx +0 -18
- package/monodog-dashboard/src/components/release-manager/components/PackageSelector.tsx +0 -137
- package/monodog-dashboard/src/components/release-manager/components/PublishConfirmation.tsx +0 -150
- package/monodog-dashboard/src/components/release-manager/components/ReleaseValidation.tsx +0 -138
- package/monodog-dashboard/src/components/release-manager/components/VersionBumpSelector.tsx +0 -142
- package/monodog-dashboard/src/components/release-manager/types/index.ts +0 -9
- package/monodog-dashboard/src/components/release-manager/types/release-manager.types.ts +0 -29
- package/monodog-dashboard/src/components/setup-guide/SetupGuide.tsx +0 -96
- package/monodog-dashboard/src/components/setup-guide/components/SetupHeader.tsx +0 -24
- package/monodog-dashboard/src/components/setup-guide/components/SetupModal.tsx +0 -24
- package/monodog-dashboard/src/components/setup-guide/components/SetupProgress.tsx +0 -29
- package/monodog-dashboard/src/components/setup-guide/components/StepContent.tsx +0 -272
- package/monodog-dashboard/src/components/setup-guide/components/StepNavigation.tsx +0 -62
- package/monodog-dashboard/src/components/setup-guide/components/index.ts +0 -6
- package/monodog-dashboard/src/components/setup-guide/types/setup.types.ts +0 -38
- package/monodog-dashboard/src/components/setup-guide/utils/setup.utils.ts +0 -79
- package/monodog-dashboard/src/constants/api-config.ts +0 -81
- package/monodog-dashboard/src/constants/index.ts +0 -9
- package/monodog-dashboard/src/constants/messages.ts +0 -40
- package/monodog-dashboard/src/icons/heroicons.ts +0 -65
- package/monodog-dashboard/src/icons/index.tsx +0 -1788
- package/monodog-dashboard/src/index.css +0 -175
- package/monodog-dashboard/src/main.tsx +0 -9
- package/monodog-dashboard/src/pages/AuthCallbackPage.tsx +0 -103
- package/monodog-dashboard/src/pages/CIPage.tsx +0 -6
- package/monodog-dashboard/src/pages/ConfigPage.tsx +0 -6
- package/monodog-dashboard/src/pages/DashboardPage.tsx +0 -6
- package/monodog-dashboard/src/pages/DependenciesPage.tsx +0 -6
- package/monodog-dashboard/src/pages/HealthPage.tsx +0 -6
- package/monodog-dashboard/src/pages/LoginPage.tsx +0 -77
- package/monodog-dashboard/src/pages/PackageDetailPage.tsx +0 -6
- package/monodog-dashboard/src/pages/PackagesPage.tsx +0 -6
- package/monodog-dashboard/src/pages/PipelinePage.tsx +0 -22
- package/monodog-dashboard/src/pages/PublishPage.tsx +0 -6
- package/monodog-dashboard/src/pages/ReleaseManagerPage.tsx +0 -9
- package/monodog-dashboard/src/pages/index.ts +0 -28
- package/monodog-dashboard/src/routes/AppRouter.tsx +0 -89
- package/monodog-dashboard/src/routes/AppRouterPages.tsx +0 -56
- package/monodog-dashboard/src/routes/index.ts +0 -10
- package/monodog-dashboard/src/routes/routes.config.ts +0 -94
- package/monodog-dashboard/src/services/api/api-client.ts +0 -189
- package/monodog-dashboard/src/services/api/index.ts +0 -30
- package/monodog-dashboard/src/services/api/types/api.types.ts +0 -63
- package/monodog-dashboard/src/services/auth-context.tsx +0 -344
- package/monodog-dashboard/src/services/monorepoService.ts +0 -733
- package/monodog-dashboard/src/services/permission-context.tsx +0 -193
- package/monodog-dashboard/src/theme/COMPONENT_UPDATES.md +0 -273
- package/monodog-dashboard/src/theme/INTEGRATION.md +0 -381
- package/monodog-dashboard/src/theme/README.md +0 -239
- package/monodog-dashboard/src/theme/examples.tsx +0 -386
- package/monodog-dashboard/src/theme/index.ts +0 -402
- package/monodog-dashboard/src/theme/migration-guide.md +0 -335
- package/monodog-dashboard/src/types/auth-context.types.ts +0 -51
- package/monodog-dashboard/src/types/component.types.ts +0 -96
- package/monodog-dashboard/src/types/icons.types.ts +0 -13
- package/monodog-dashboard/src/types/index.ts +0 -68
- package/monodog-dashboard/src/types/monorepo-service.types.ts +0 -53
- package/monodog-dashboard/src/types/permission-context.types.ts +0 -49
- package/monodog-dashboard/src/types/pipeline.types.ts +0 -89
- package/monodog-dashboard/src/types/routes.types.ts +0 -12
- package/monodog-dashboard/src/utils/cookies.ts +0 -47
- package/monodog-dashboard/tailwind.config.js +0 -68
- package/monodog-dashboard/tsconfig.app.json +0 -14
- package/monodog-dashboard/tsconfig.json +0 -17
- package/monodog-dashboard/tsconfig.node.json +0 -10
- package/monodog-dashboard/vite.config.ts +0 -9
|
@@ -1,272 +0,0 @@
|
|
|
1
|
-
import React, { useState, useEffect } from 'react';
|
|
2
|
-
import { ExclamationCircleIcon, CheckCircleIcon, ClockIcon } from '../../icons/index';
|
|
3
|
-
import { useAuth } from '../../services/auth-context';
|
|
4
|
-
import { DASHBOARD_ERROR_MESSAGES } from '../../constants/messages';
|
|
5
|
-
import { DASHBOARD_API_ENDPOINTS } from '../../constants/api-config';
|
|
6
|
-
import apiClient from '../../services/api';
|
|
7
|
-
import type { WorkflowRun, WorkflowRunsListProps } from '../../types';
|
|
8
|
-
|
|
9
|
-
function getStatusIcon(status: string, conclusion: string | null) {
|
|
10
|
-
if (status === 'completed') {
|
|
11
|
-
if (conclusion === 'success') {
|
|
12
|
-
return <CheckCircleIcon className="h-5 w-5 text-green-600" />;
|
|
13
|
-
} else if (conclusion === 'failure') {
|
|
14
|
-
return <ExclamationCircleIcon className="h-5 w-5 text-red-600" />;
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
return <ClockIcon className="h-5 w-5 text-yellow-600" />;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
function getStatusBadgeClass(status: string, conclusion: string | null): string {
|
|
21
|
-
if (status === 'completed') {
|
|
22
|
-
if (conclusion === 'success') {
|
|
23
|
-
return 'bg-green-100 text-green-800';
|
|
24
|
-
} else if (conclusion === 'failure') {
|
|
25
|
-
return 'bg-red-100 text-red-800';
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
return 'bg-yellow-100 text-yellow-800';
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
function formatDate(dateString: string): string {
|
|
32
|
-
const date = new Date(dateString);
|
|
33
|
-
const now = new Date();
|
|
34
|
-
const seconds = Math.floor((now.getTime() - date.getTime()) / 1000);
|
|
35
|
-
if (seconds < 60) {
|
|
36
|
-
return 'just now';
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
const minutes = Math.floor(seconds / 60);
|
|
40
|
-
if (minutes < 60) {
|
|
41
|
-
return `${minutes}m ago`;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
const hours = Math.floor(minutes / 60);
|
|
45
|
-
if (hours < 24) {
|
|
46
|
-
return `${hours}h ago`;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
const days = Math.floor(hours / 24);
|
|
50
|
-
if (days < 7) {
|
|
51
|
-
return `${days}d ago`;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
return date.toLocaleDateString();
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
export default function WorkflowRunsList({
|
|
58
|
-
owner,
|
|
59
|
-
repo,
|
|
60
|
-
packageName,
|
|
61
|
-
onSelectRun,
|
|
62
|
-
runId,
|
|
63
|
-
limit = 10,
|
|
64
|
-
}: WorkflowRunsListProps) {
|
|
65
|
-
const [runs, setRuns] = useState<WorkflowRun[]>([]);
|
|
66
|
-
const [loading, setLoading] = useState(true);
|
|
67
|
-
const [error, setError] = useState<string | null>(null);
|
|
68
|
-
const [actionInProgress, setActionInProgress] = useState<number | null>(null);
|
|
69
|
-
const { isAuthenticated, hasPermission } = useAuth();
|
|
70
|
-
|
|
71
|
-
useEffect(() => {
|
|
72
|
-
const fetchRuns = async () => {
|
|
73
|
-
try {
|
|
74
|
-
setLoading(true);
|
|
75
|
-
setError(null);
|
|
76
|
-
|
|
77
|
-
let url = DASHBOARD_API_ENDPOINTS.WORKFLOWS.LIST(owner, repo) + `?per_page=${limit}`;
|
|
78
|
-
if (packageName) {
|
|
79
|
-
url = DASHBOARD_API_ENDPOINTS.WORKFLOWS.BY_PACKAGE(owner, repo, packageName);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
const response = await apiClient.get(url);
|
|
83
|
-
if (!response.success) {
|
|
84
|
-
throw new Error(DASHBOARD_ERROR_MESSAGES.FAILED_TO_FETCH_WORKFLOWS);
|
|
85
|
-
}
|
|
86
|
-
const data = (response.data as { runs: WorkflowRun[] });
|
|
87
|
-
let runsList: WorkflowRun[] = [];
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
if (packageName) {
|
|
91
|
-
// When querying by package, API might return array or single object
|
|
92
|
-
if (Array.isArray(data)) {
|
|
93
|
-
runsList = (data as Array<{ runs: WorkflowRun[] }>)
|
|
94
|
-
.flatMap((p) => p.runs || [])
|
|
95
|
-
.slice(0, limit);
|
|
96
|
-
} else {
|
|
97
|
-
const dataObj = data as { runs: WorkflowRun[] };
|
|
98
|
-
runsList = (Array.isArray(dataObj.runs) ? dataObj.runs : [])
|
|
99
|
-
.slice(0, limit);
|
|
100
|
-
}
|
|
101
|
-
} else {
|
|
102
|
-
// Direct workflow list
|
|
103
|
-
runsList = Array.isArray(data.runs) ? (data.runs as WorkflowRun[]) : [];
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
setRuns(runsList);
|
|
107
|
-
} catch (err) {
|
|
108
|
-
setError(err instanceof Error ? err.message : DASHBOARD_ERROR_MESSAGES.UNKNOWN_ERROR);
|
|
109
|
-
} finally {
|
|
110
|
-
setLoading(false);
|
|
111
|
-
}
|
|
112
|
-
};
|
|
113
|
-
|
|
114
|
-
const interval = setInterval(fetchRuns, 5000); // Poll every 5 seconds
|
|
115
|
-
fetchRuns();
|
|
116
|
-
|
|
117
|
-
return () => clearInterval(interval);
|
|
118
|
-
}, [owner, repo, packageName, limit]);
|
|
119
|
-
|
|
120
|
-
const handleCancelRun = async (e: React.MouseEvent, run: WorkflowRun) => {
|
|
121
|
-
e.stopPropagation();
|
|
122
|
-
setActionInProgress(run.id);
|
|
123
|
-
|
|
124
|
-
try {
|
|
125
|
-
|
|
126
|
-
const response = await apiClient.post(
|
|
127
|
-
DASHBOARD_API_ENDPOINTS.WORKFLOWS.CANCEL(owner, repo, run.id),
|
|
128
|
-
);
|
|
129
|
-
|
|
130
|
-
if (response.success) {
|
|
131
|
-
// Update the run status locally
|
|
132
|
-
setRuns(runs.map(r =>
|
|
133
|
-
r.id === run.id
|
|
134
|
-
? { ...r, status: 'completed', conclusion: 'cancelled' }
|
|
135
|
-
: r
|
|
136
|
-
));
|
|
137
|
-
} else {
|
|
138
|
-
throw new Error(DASHBOARD_ERROR_MESSAGES.FAILED_TO_CANCEL_RUN);
|
|
139
|
-
}
|
|
140
|
-
} catch (err) {
|
|
141
|
-
console.error('Failed to cancel run:', err);
|
|
142
|
-
setError(err instanceof Error ? err.message : DASHBOARD_ERROR_MESSAGES.FAILED_TO_CANCEL_RUN);
|
|
143
|
-
} finally {
|
|
144
|
-
setActionInProgress(null);
|
|
145
|
-
}
|
|
146
|
-
};
|
|
147
|
-
|
|
148
|
-
const handleRerunRun = async (e: React.MouseEvent, run: WorkflowRun) => {
|
|
149
|
-
e.stopPropagation();
|
|
150
|
-
setActionInProgress(run.id);
|
|
151
|
-
|
|
152
|
-
try {
|
|
153
|
-
|
|
154
|
-
const response = await apiClient.post(
|
|
155
|
-
DASHBOARD_API_ENDPOINTS.WORKFLOWS.RERUN(owner, repo, run.id),
|
|
156
|
-
{ failedOnly: false },
|
|
157
|
-
);
|
|
158
|
-
|
|
159
|
-
if (response.success) {
|
|
160
|
-
// Update the run status locally
|
|
161
|
-
setRuns(runs.map(r =>
|
|
162
|
-
r.id === run.id
|
|
163
|
-
? { ...r, status: 'in_progress', conclusion: null }
|
|
164
|
-
: r
|
|
165
|
-
));
|
|
166
|
-
} else {
|
|
167
|
-
throw new Error(DASHBOARD_ERROR_MESSAGES.FAILED_TO_RERUN_WORKFLOW);
|
|
168
|
-
}
|
|
169
|
-
} catch (err) {
|
|
170
|
-
console.error('Failed to rerun workflow:', err);
|
|
171
|
-
setError(err instanceof Error ? err.message : DASHBOARD_ERROR_MESSAGES.FAILED_TO_RERUN_WORKFLOW);
|
|
172
|
-
} finally {
|
|
173
|
-
setActionInProgress(null);
|
|
174
|
-
}
|
|
175
|
-
};
|
|
176
|
-
|
|
177
|
-
if (loading && runs.length === 0) {
|
|
178
|
-
return (
|
|
179
|
-
<div className="flex items-center justify-center py-8">
|
|
180
|
-
<div className="animate-spin">
|
|
181
|
-
<ClockIcon className="h-8 w-8 text-blue-600" />
|
|
182
|
-
</div>
|
|
183
|
-
</div>
|
|
184
|
-
);
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
if (error) {
|
|
188
|
-
return (
|
|
189
|
-
<div className="rounded-lg bg-red-50 p-4 border border-red-200">
|
|
190
|
-
<p className="text-sm text-red-800">Error: {error}</p>
|
|
191
|
-
</div>
|
|
192
|
-
);
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
return (
|
|
196
|
-
<div className="space-y-2">
|
|
197
|
-
{!runs || runs.length === 0 ? (
|
|
198
|
-
<p className="text-sm text-gray-500 py-4">No workflow runs found</p>
|
|
199
|
-
) : (
|
|
200
|
-
runs.map(run => (
|
|
201
|
-
<div
|
|
202
|
-
key={run.id}
|
|
203
|
-
className={`text-left p-3 rounded-lg border transition-colors ${
|
|
204
|
-
runId === run.id
|
|
205
|
-
? 'border-blue-500 bg-blue-50'
|
|
206
|
-
: 'border-gray-200 hover:bg-gray-50'
|
|
207
|
-
}`}
|
|
208
|
-
>
|
|
209
|
-
<button
|
|
210
|
-
onClick={() => onSelectRun?.(run.id)}
|
|
211
|
-
className="w-full text-left"
|
|
212
|
-
>
|
|
213
|
-
<div className="flex items-start gap-2">
|
|
214
|
-
{getStatusIcon(run.status, run.conclusion)}
|
|
215
|
-
<div className="min-w-0 flex-1">
|
|
216
|
-
<p className="font-medium text-sm text-gray-900">
|
|
217
|
-
{run.name}
|
|
218
|
-
</p>
|
|
219
|
-
|
|
220
|
-
<p className="text-xs text-gray-500 mt-1">
|
|
221
|
-
<span
|
|
222
|
-
className={`px-2 py-1 rounded text-xs font-medium ${getStatusBadgeClass(
|
|
223
|
-
run.status,
|
|
224
|
-
run.conclusion
|
|
225
|
-
)}`}
|
|
226
|
-
>
|
|
227
|
-
{run.conclusion ?? run.status}
|
|
228
|
-
</span>
|
|
229
|
-
<span> • </span>
|
|
230
|
-
<span>Branch: {run.head_branch}</span>
|
|
231
|
-
<span> • </span>
|
|
232
|
-
<span>by {run.actor.login}</span>
|
|
233
|
-
<span> • </span>
|
|
234
|
-
<span>{formatDate(run.created_at)}</span>
|
|
235
|
-
</p>
|
|
236
|
-
</div>
|
|
237
|
-
</div>
|
|
238
|
-
</button>
|
|
239
|
-
|
|
240
|
-
{hasPermission('maintain') && (
|
|
241
|
-
<div className="flex gap-2 mt-3">
|
|
242
|
-
{run.status === 'in_progress' && (
|
|
243
|
-
<button
|
|
244
|
-
onClick={e => handleCancelRun(e, run)}
|
|
245
|
-
disabled={actionInProgress === run.id}
|
|
246
|
-
className="flex-1 px-3 py-2 text-sm font-medium text-red-700 bg-red-50 border border-red-200 rounded hover:bg-red-100 disabled:opacity-50 disabled:cursor-not-allowed transition-colors"
|
|
247
|
-
title="Cancel this workflow run"
|
|
248
|
-
>
|
|
249
|
-
{actionInProgress === run.id
|
|
250
|
-
? 'Cancelling...'
|
|
251
|
-
: 'Cancel Run'}
|
|
252
|
-
</button>
|
|
253
|
-
)}
|
|
254
|
-
{(run.conclusion === 'cancelled' ||
|
|
255
|
-
run.conclusion === 'failure') && (
|
|
256
|
-
<button
|
|
257
|
-
onClick={e => handleRerunRun(e, run)}
|
|
258
|
-
disabled={actionInProgress === run.id}
|
|
259
|
-
className="flex-1 px-3 py-2 text-sm font-medium text-blue-700 bg-blue-50 border border-blue-200 rounded hover:bg-blue-100 disabled:opacity-50 disabled:cursor-not-allowed transition-colors"
|
|
260
|
-
title="Rerun this workflow"
|
|
261
|
-
>
|
|
262
|
-
{actionInProgress === run.id ? 'Rerunning...' : 'Rerun'}
|
|
263
|
-
</button>
|
|
264
|
-
)}
|
|
265
|
-
</div>
|
|
266
|
-
)}
|
|
267
|
-
</div>
|
|
268
|
-
))
|
|
269
|
-
)}
|
|
270
|
-
</div>
|
|
271
|
-
);
|
|
272
|
-
}
|
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
import React, { useState, useEffect } from 'react';
|
|
2
|
-
import { PlayIcon, ExclamationCircleIcon } from '../../icons/index';
|
|
3
|
-
import apiClient from '../../services/api';
|
|
4
|
-
import { DASHBOARD_ERROR_MESSAGES } from '../../constants/messages';
|
|
5
|
-
import { DASHBOARD_API_ENDPOINTS } from '../../constants/api-config';
|
|
6
|
-
import type { WorkflowTriggerProps } from '../../types';
|
|
7
|
-
|
|
8
|
-
interface WorkflowOption {
|
|
9
|
-
id: number;
|
|
10
|
-
name: string;
|
|
11
|
-
path: string;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export default function WorkflowTrigger({
|
|
15
|
-
owner,
|
|
16
|
-
repo,
|
|
17
|
-
defaultBranch = 'main',
|
|
18
|
-
onSuccess,
|
|
19
|
-
onError,
|
|
20
|
-
}: WorkflowTriggerProps) {
|
|
21
|
-
const [isOpen, setIsOpen] = useState(false);
|
|
22
|
-
const [branch, setBranch] = useState(defaultBranch);
|
|
23
|
-
const [inputs, setInputs] = useState<Record<string, string>>({});
|
|
24
|
-
const [loading, setLoading] = useState(false);
|
|
25
|
-
const [error, setError] = useState<string | null>(null);
|
|
26
|
-
const [workflows, setWorkflows] = useState<WorkflowOption[]>([]);
|
|
27
|
-
const [selectedWorkflow, setSelectedWorkflow] = useState<string>();
|
|
28
|
-
const [loadingWorkflows, setLoadingWorkflows] = useState(false);
|
|
29
|
-
|
|
30
|
-
// Fetch available workflows when modal opens
|
|
31
|
-
useEffect(() => {
|
|
32
|
-
if (isOpen && workflows.length === 0) {
|
|
33
|
-
fetchWorkflows();
|
|
34
|
-
}
|
|
35
|
-
}, [isOpen]);
|
|
36
|
-
|
|
37
|
-
const fetchWorkflows = async () => {
|
|
38
|
-
try {
|
|
39
|
-
setLoadingWorkflows(true);
|
|
40
|
-
|
|
41
|
-
const response = await apiClient.get(
|
|
42
|
-
DASHBOARD_API_ENDPOINTS.WORKFLOWS.AVAILABLE(owner, repo)
|
|
43
|
-
);
|
|
44
|
-
if (response.success) {
|
|
45
|
-
setWorkflows(response.data.workflows || []);
|
|
46
|
-
// If no workflow path was set, use the first available one
|
|
47
|
-
if (response.data.workflows?.length > 0 && !selectedWorkflow) {
|
|
48
|
-
setSelectedWorkflow(response.data.workflows[0].path);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
} catch (err) {
|
|
52
|
-
console.error('Failed to fetch workflows:', err);
|
|
53
|
-
} finally {
|
|
54
|
-
setLoadingWorkflows(false);
|
|
55
|
-
}
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
const handleTrigger = async () => {
|
|
59
|
-
try {
|
|
60
|
-
setLoading(true);
|
|
61
|
-
setError(null);
|
|
62
|
-
|
|
63
|
-
const response = await apiClient.post(
|
|
64
|
-
DASHBOARD_API_ENDPOINTS.WORKFLOWS.TRIGGER(owner, repo),
|
|
65
|
-
{
|
|
66
|
-
workflow: selectedWorkflow,
|
|
67
|
-
ref: branch,
|
|
68
|
-
inputs,
|
|
69
|
-
workflowId: workflows.find((w) => w.path == selectedWorkflow)?.id ?? ''
|
|
70
|
-
}
|
|
71
|
-
);
|
|
72
|
-
|
|
73
|
-
if (!response.success) {
|
|
74
|
-
throw new Error(DASHBOARD_ERROR_MESSAGES.FAILED_TO_TRIGGER_WORKFLOW);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
const data = response.data;
|
|
78
|
-
|
|
79
|
-
if (data.success) {
|
|
80
|
-
onSuccess?.(data.runUrl || `https://github.com/${owner}/${repo}/actions`);
|
|
81
|
-
setIsOpen(false);
|
|
82
|
-
setBranch(defaultBranch);
|
|
83
|
-
setInputs({});
|
|
84
|
-
} else {
|
|
85
|
-
throw new Error(data.message || DASHBOARD_ERROR_MESSAGES.FAILED_TO_TRIGGER_WORKFLOW);
|
|
86
|
-
}
|
|
87
|
-
} catch (err) {
|
|
88
|
-
const errorMessage =
|
|
89
|
-
err instanceof Error ? err.message : DASHBOARD_ERROR_MESSAGES.UNKNOWN_ERROR;
|
|
90
|
-
setError(errorMessage);
|
|
91
|
-
onError?.(errorMessage);
|
|
92
|
-
} finally {
|
|
93
|
-
setLoading(false);
|
|
94
|
-
}
|
|
95
|
-
};
|
|
96
|
-
|
|
97
|
-
return (
|
|
98
|
-
<div className="relative">
|
|
99
|
-
<button
|
|
100
|
-
onClick={() => setIsOpen(!isOpen)}
|
|
101
|
-
disabled={loading}
|
|
102
|
-
className="flex items-center gap-2 px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed transition-colors"
|
|
103
|
-
>
|
|
104
|
-
<PlayIcon className="h-4 w-4" />
|
|
105
|
-
Trigger Workflow
|
|
106
|
-
</button>
|
|
107
|
-
|
|
108
|
-
{isOpen && (
|
|
109
|
-
<div className="absolute right-0 mt-2 w-96 bg-white border border-gray-200 rounded-lg shadow-lg z-10 p-6">
|
|
110
|
-
<h3 className="text-lg font-semibold text-gray-900 mb-4">
|
|
111
|
-
Trigger Workflow
|
|
112
|
-
</h3>
|
|
113
|
-
|
|
114
|
-
{error && (
|
|
115
|
-
<div className="mb-4 p-3 bg-red-50 border border-red-200 rounded-lg flex items-start gap-3">
|
|
116
|
-
<ExclamationCircleIcon className="h-5 w-5 text-red-600 flex-shrink-0 mt-0.5" />
|
|
117
|
-
<p className="text-sm text-red-700">{error}</p>
|
|
118
|
-
</div>
|
|
119
|
-
)}
|
|
120
|
-
|
|
121
|
-
<div className="space-y-4">
|
|
122
|
-
<div>
|
|
123
|
-
<label className="block text-sm font-medium text-gray-700 mb-1">
|
|
124
|
-
Workflow
|
|
125
|
-
</label>
|
|
126
|
-
{loadingWorkflows ? (
|
|
127
|
-
<div className="w-full px-3 py-2 border border-gray-300 rounded-lg bg-gray-50 text-gray-500">
|
|
128
|
-
Loading workflows...
|
|
129
|
-
</div>
|
|
130
|
-
) : workflows.length > 0 ? (
|
|
131
|
-
<select
|
|
132
|
-
value={selectedWorkflow}
|
|
133
|
-
onChange={(e) => setSelectedWorkflow(e.target.value)}
|
|
134
|
-
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500"
|
|
135
|
-
>
|
|
136
|
-
{workflows.map((wf) => (
|
|
137
|
-
<option key={wf.id} value={wf.path}>
|
|
138
|
-
{wf.name} ({wf.path})
|
|
139
|
-
</option>
|
|
140
|
-
))}
|
|
141
|
-
</select>
|
|
142
|
-
) : (
|
|
143
|
-
<div className="w-full px-3 py-2 border border-gray-300 rounded-lg bg-yellow-50 text-yellow-700 text-sm">
|
|
144
|
-
No workflows available
|
|
145
|
-
</div>
|
|
146
|
-
)}
|
|
147
|
-
</div>
|
|
148
|
-
|
|
149
|
-
<div>
|
|
150
|
-
<label className="block text-sm font-medium text-gray-700 mb-1">
|
|
151
|
-
Branch
|
|
152
|
-
</label>
|
|
153
|
-
<input
|
|
154
|
-
type="text"
|
|
155
|
-
value={branch}
|
|
156
|
-
onChange={(e) => setBranch(e.target.value)}
|
|
157
|
-
placeholder="main"
|
|
158
|
-
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500"
|
|
159
|
-
/>
|
|
160
|
-
</div>
|
|
161
|
-
|
|
162
|
-
<div className="flex gap-2 pt-4">
|
|
163
|
-
<button
|
|
164
|
-
onClick={handleTrigger}
|
|
165
|
-
disabled={loading || !branch}
|
|
166
|
-
className="flex-1 px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed transition-colors font-medium"
|
|
167
|
-
>
|
|
168
|
-
{loading ? 'Triggering...' : 'Trigger'}
|
|
169
|
-
</button>
|
|
170
|
-
<button
|
|
171
|
-
onClick={() => setIsOpen(false)}
|
|
172
|
-
className="px-4 py-2 border border-gray-300 text-gray-700 rounded-lg hover:bg-gray-50 transition-colors font-medium"
|
|
173
|
-
>
|
|
174
|
-
Cancel
|
|
175
|
-
</button>
|
|
176
|
-
</div>
|
|
177
|
-
</div>
|
|
178
|
-
</div>
|
|
179
|
-
)}
|
|
180
|
-
</div>
|
|
181
|
-
);
|
|
182
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { cookieUtils } from '../../../utils/cookies';
|
|
2
|
-
|
|
3
|
-
export const getSessionPermission = () => {
|
|
4
|
-
try {
|
|
5
|
-
const data = cookieUtils.get('monodog_session_data');
|
|
6
|
-
return data ? JSON.parse(data).permission : null;
|
|
7
|
-
} catch (e) {
|
|
8
|
-
console.error("Failed to parse session data", e);
|
|
9
|
-
return null;
|
|
10
|
-
}
|
|
11
|
-
};
|
|
@@ -1,229 +0,0 @@
|
|
|
1
|
-
import { useState, useEffect } from 'react';
|
|
2
|
-
import { monorepoService } from '../../services/monorepoService';
|
|
3
|
-
import { DASHBOARD_ERROR_MESSAGES } from '../../constants/messages';
|
|
4
|
-
|
|
5
|
-
// Import sub-components
|
|
6
|
-
import {
|
|
7
|
-
PublishHeader,
|
|
8
|
-
QuickActionCards,
|
|
9
|
-
PackageReleaseTable,
|
|
10
|
-
ReleaseSchedule,
|
|
11
|
-
ChangelogViewer,
|
|
12
|
-
LoadingState,
|
|
13
|
-
ErrorState,
|
|
14
|
-
} from './components';
|
|
15
|
-
|
|
16
|
-
// Import types and utilities
|
|
17
|
-
import { Package, Release } from './types/publish.types';
|
|
18
|
-
import {
|
|
19
|
-
calculatePublishStats,
|
|
20
|
-
filterPackagesByName,
|
|
21
|
-
} from './utils/publish.utils';
|
|
22
|
-
|
|
23
|
-
// Re-export types for backward compatibility
|
|
24
|
-
export type { Package, Release } from './types/publish.types';
|
|
25
|
-
|
|
26
|
-
const mockPackages: Package[] = [
|
|
27
|
-
{
|
|
28
|
-
name: 'dashboard',
|
|
29
|
-
currentVersion: '1.0.0',
|
|
30
|
-
nextVersion: '1.0.1',
|
|
31
|
-
status: 'ready',
|
|
32
|
-
lastPublished: '2024-01-10',
|
|
33
|
-
changelog: 'Bug fixes and performance improvements',
|
|
34
|
-
commits: 15,
|
|
35
|
-
dependencies: ['react', 'tailwindcss'],
|
|
36
|
-
publishType: 'patch',
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
name: 'backend',
|
|
40
|
-
currentVersion: '1.2.0',
|
|
41
|
-
nextVersion: '1.3.0',
|
|
42
|
-
status: 'building',
|
|
43
|
-
lastPublished: '2024-01-08',
|
|
44
|
-
changelog: 'New API endpoints and enhanced security',
|
|
45
|
-
commits: 28,
|
|
46
|
-
dependencies: ['express', 'prisma'],
|
|
47
|
-
publishType: 'minor',
|
|
48
|
-
},
|
|
49
|
-
{
|
|
50
|
-
name: 'utils',
|
|
51
|
-
currentVersion: '0.5.2',
|
|
52
|
-
nextVersion: '1.0.0',
|
|
53
|
-
status: 'ready',
|
|
54
|
-
lastPublished: '2024-01-05',
|
|
55
|
-
changelog: 'Major refactor with breaking changes',
|
|
56
|
-
commits: 42,
|
|
57
|
-
dependencies: ['lodash'],
|
|
58
|
-
publishType: 'major',
|
|
59
|
-
},
|
|
60
|
-
{
|
|
61
|
-
name: 'ci-status',
|
|
62
|
-
currentVersion: '0.3.1',
|
|
63
|
-
nextVersion: '0.4.0',
|
|
64
|
-
status: 'testing',
|
|
65
|
-
lastPublished: '2024-01-12',
|
|
66
|
-
changelog: 'Enhanced CI monitoring and reporting',
|
|
67
|
-
commits: 18,
|
|
68
|
-
dependencies: ['axios', 'ws'],
|
|
69
|
-
publishType: 'minor',
|
|
70
|
-
},
|
|
71
|
-
];
|
|
72
|
-
|
|
73
|
-
const mockReleases: Release[] = [
|
|
74
|
-
{
|
|
75
|
-
id: '1',
|
|
76
|
-
packageName: 'dashboard',
|
|
77
|
-
version: '1.0.1',
|
|
78
|
-
status: 'scheduled',
|
|
79
|
-
scheduledFor: '2024-01-16 10:00 AM',
|
|
80
|
-
changelog: 'Bug fixes and performance improvements',
|
|
81
|
-
author: 'team-frontend',
|
|
82
|
-
},
|
|
83
|
-
{
|
|
84
|
-
id: '2',
|
|
85
|
-
packageName: 'backend',
|
|
86
|
-
version: '1.3.0',
|
|
87
|
-
status: 'in-progress',
|
|
88
|
-
scheduledFor: '2024-01-16 09:00 AM',
|
|
89
|
-
startedAt: '2024-01-16 09:00 AM',
|
|
90
|
-
changelog: 'New API endpoints and enhanced security',
|
|
91
|
-
author: 'team-backend',
|
|
92
|
-
},
|
|
93
|
-
{
|
|
94
|
-
id: '3',
|
|
95
|
-
packageName: 'utils',
|
|
96
|
-
version: '1.0.0',
|
|
97
|
-
status: 'completed',
|
|
98
|
-
scheduledFor: '2024-01-15 02:00 PM',
|
|
99
|
-
startedAt: '2024-01-15 02:00 PM',
|
|
100
|
-
completedAt: '2024-01-15 02:15 PM',
|
|
101
|
-
changelog: 'Major refactor with breaking changes',
|
|
102
|
-
author: 'team-shared',
|
|
103
|
-
},
|
|
104
|
-
];
|
|
105
|
-
|
|
106
|
-
export default function PublishControl() {
|
|
107
|
-
const [selectedPackage, setSelectedPackage] = useState<string>('all');
|
|
108
|
-
const [selectedStatus, setSelectedStatus] = useState<string>('all');
|
|
109
|
-
const [packages, setPackages] = useState<Package[]>(mockPackages);
|
|
110
|
-
const [loading, setLoading] = useState(false);
|
|
111
|
-
const [error, setError] = useState<string | null>(null);
|
|
112
|
-
|
|
113
|
-
useEffect(() => {
|
|
114
|
-
const fetchPackageData = async () => {
|
|
115
|
-
try {
|
|
116
|
-
setLoading(true);
|
|
117
|
-
const data = await monorepoService.getPackages();
|
|
118
|
-
// Convert monorepo service data to publish control format
|
|
119
|
-
const publishPackages: Package[] = data.map(pkg => ({
|
|
120
|
-
name: pkg.name,
|
|
121
|
-
currentVersion: pkg.version,
|
|
122
|
-
nextVersion: getNextVersion(pkg.version),
|
|
123
|
-
status: getPublishStatus(pkg.status),
|
|
124
|
-
lastPublished: pkg.lastUpdated,
|
|
125
|
-
changelog: pkg.description || 'No changelog available',
|
|
126
|
-
commits: Math.floor(Math.random() * 20) + 1,
|
|
127
|
-
dependencies: pkg.dependencies || [],
|
|
128
|
-
publishType: getPublishType(),
|
|
129
|
-
}));
|
|
130
|
-
setPackages(publishPackages);
|
|
131
|
-
setError(null);
|
|
132
|
-
} catch (err) {
|
|
133
|
-
setError(DASHBOARD_ERROR_MESSAGES.FAILED_TO_FETCH_PACKAGES);
|
|
134
|
-
console.error('Error fetching packages:', err);
|
|
135
|
-
// Fallback to mock data
|
|
136
|
-
setPackages(mockPackages);
|
|
137
|
-
} finally {
|
|
138
|
-
setLoading(false);
|
|
139
|
-
}
|
|
140
|
-
};
|
|
141
|
-
|
|
142
|
-
fetchPackageData();
|
|
143
|
-
}, []);
|
|
144
|
-
|
|
145
|
-
// Helper functions
|
|
146
|
-
const getNextVersion = (currentVersion: string): string => {
|
|
147
|
-
const parts = currentVersion.split('.').map(Number);
|
|
148
|
-
parts[2] += 1; // Increment patch version
|
|
149
|
-
return parts.join('.');
|
|
150
|
-
};
|
|
151
|
-
|
|
152
|
-
const getPublishStatus = (
|
|
153
|
-
status: string
|
|
154
|
-
): 'ready' | 'building' | 'testing' | 'published' | 'failed' => {
|
|
155
|
-
switch (status) {
|
|
156
|
-
case 'healthy':
|
|
157
|
-
return 'ready';
|
|
158
|
-
case 'warning':
|
|
159
|
-
return 'testing';
|
|
160
|
-
case 'error':
|
|
161
|
-
return 'failed';
|
|
162
|
-
case 'building':
|
|
163
|
-
return 'building';
|
|
164
|
-
default:
|
|
165
|
-
return 'ready';
|
|
166
|
-
}
|
|
167
|
-
};
|
|
168
|
-
|
|
169
|
-
const getPublishType = (): 'patch' | 'minor' | 'major' | 'prerelease' => {
|
|
170
|
-
const types: ('patch' | 'minor' | 'major' | 'prerelease')[] = [
|
|
171
|
-
'patch',
|
|
172
|
-
'minor',
|
|
173
|
-
'major',
|
|
174
|
-
'prerelease',
|
|
175
|
-
];
|
|
176
|
-
return types[Math.floor(Math.random() * types.length)];
|
|
177
|
-
};
|
|
178
|
-
|
|
179
|
-
// Handle actions
|
|
180
|
-
const handleNewRelease = () => {
|
|
181
|
-
// console.log('Creating new release...');
|
|
182
|
-
};
|
|
183
|
-
|
|
184
|
-
const handleRetry = () => {
|
|
185
|
-
window.location.reload();
|
|
186
|
-
};
|
|
187
|
-
|
|
188
|
-
// Calculate derived data using utility functions
|
|
189
|
-
const filteredPackages = filterPackagesByName(packages, selectedPackage);
|
|
190
|
-
const stats = calculatePublishStats(packages);
|
|
191
|
-
|
|
192
|
-
if (loading) {
|
|
193
|
-
return <LoadingState />;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
if (error) {
|
|
197
|
-
return <ErrorState error={error} onRetry={handleRetry} />;
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
return (
|
|
201
|
-
<div className="space-y-6">
|
|
202
|
-
{/* Header */}
|
|
203
|
-
<PublishHeader
|
|
204
|
-
packageCount={packages.length}
|
|
205
|
-
onNewRelease={handleNewRelease}
|
|
206
|
-
/>
|
|
207
|
-
|
|
208
|
-
{/* Quick Action Cards */}
|
|
209
|
-
<QuickActionCards stats={stats} />
|
|
210
|
-
|
|
211
|
-
{/* Package Release Table */}
|
|
212
|
-
<PackageReleaseTable
|
|
213
|
-
packages={filteredPackages}
|
|
214
|
-
selectedPackage={selectedPackage}
|
|
215
|
-
onPackageChange={setSelectedPackage}
|
|
216
|
-
/>
|
|
217
|
-
|
|
218
|
-
{/* Release Schedule */}
|
|
219
|
-
<ReleaseSchedule
|
|
220
|
-
releases={mockReleases}
|
|
221
|
-
selectedStatus={selectedStatus}
|
|
222
|
-
onStatusChange={setSelectedStatus}
|
|
223
|
-
/>
|
|
224
|
-
|
|
225
|
-
{/* Changelog Viewer */}
|
|
226
|
-
<ChangelogViewer />
|
|
227
|
-
</div>
|
|
228
|
-
);
|
|
229
|
-
}
|