diff --git a/tests/k6/generate-test-data.js b/tests/k6/generate-test-data.js index 940fbbc..36bebdf 100644 --- a/tests/k6/generate-test-data.js +++ b/tests/k6/generate-test-data.js @@ -16,10 +16,10 @@ const config = { environments: ['development', 'integration', 'tnr', 'uat', 'preproduction', 'production'], priorities: { p1: 1, p2: 2, p3: 3, p4: 4, p5: 5 }, statuses: { - deployment: ['start', 'success', 'failure'], + deployment: ['planned', 'start', 'success', 'failure'], incident: ['open', 'close'], drift: ['open', 'done', 'warning'], - operation: ['start', 'success', 'failure', 'done'], + operation: ['planned', 'start', 'success', 'failure', 'done'], rpa_usage: ['success', 'failure', 'warning'], }, catalog: { @@ -740,7 +740,7 @@ export default function () { message: `Deployment of ${service} version ${version}`, source: randomElement(['github_actions', 'gitlab_ci', 'argocd']), type: 'deployment', - priority: env === 'production' ? randomElement(['p1', 'p2']) : randomElement(['p3', 'p4']), + priority: env === 'production' ? randomElement([1, 2]) : randomElement([3, 4]), service: service, status: status, environment: env, @@ -778,7 +778,7 @@ export default function () { message: `Incident: ${incident} on ${service}`, source: randomElement(['prometheus', 'datadog', 'manual']), type: 'incident', - priority: env === 'production' ? 'p1' : 'p2', + priority: env === 'production' ? 1 : 2, service: service, status: status, environment: env, @@ -815,7 +815,7 @@ export default function () { message: `Configuration drift: ${drift}`, source: 'terraform', type: 'drift', - priority: randomElement(['p2', 'p3']), + priority: randomElement([2, 3]), service: service, status: status, environment: env, @@ -851,7 +851,7 @@ export default function () { message: `RPA process "${process}" executed`, source: 'uipath', type: 'rpa_usage', - priority: randomElement(['p3', 'p4']), + priority: randomElement([3, 4]), service: service, status: status, environment: env, @@ -889,7 +889,7 @@ export default function () { message: `Operation: ${operation}`, source: randomElement(['manual', 'scheduled', 'automated']), type: 'operation', - priority: randomElement(['p2', 'p3']), + priority: randomElement([2, 3]), service: service, status: status, environment: env, diff --git a/web/src/App.tsx b/web/src/App.tsx index aac10b2..c2639de 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -24,7 +24,12 @@ import ThemeTest from './pages/ThemeTest' function App() { return ( - + }> } /> diff --git a/web/src/components/EventLinks.tsx b/web/src/components/EventLinks.tsx index 64772f5..0cd54b2 100644 --- a/web/src/components/EventLinks.tsx +++ b/web/src/components/EventLinks.tsx @@ -1,7 +1,9 @@ import type { EventLinks as EventLinksType } from '../types/api' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' -import { faGithub, faSlack, faJira } from '@fortawesome/free-brands-svg-icons' -import { faRocket } from '@fortawesome/free-solid-svg-icons' +import { faGithub, faJira } from '@fortawesome/free-brands-svg-icons' +import { faRocket, faTicket, faExternalLink } from '@fortawesome/free-solid-svg-icons' +import { SlackIcon } from './icons/SlackIcon' +import { GrafanaIcon } from './icons/GrafanaIcon' import { getJiraTicketUrl, getSlackMessageUrl, parseSlackId } from '../config' interface EventLinksProps { @@ -14,13 +16,7 @@ interface EventLinksProps { export default function EventLinks({ links, slackId, className = '' }: EventLinksProps) { const hasLinks = links?.pullRequestLink || links?.ticket || slackId - // Debug - console.log('EventLinks - links:', links) - console.log('EventLinks - ticket:', links?.ticket) - console.log('EventLinks - pullRequestLink:', links?.pullRequestLink) - if (!hasLinks) { - console.log('EventLinks - No links to display') return null } @@ -35,7 +31,7 @@ export default function EventLinks({ links, slackId, className = '' }: EventLink className="inline-flex items-center space-x-1 text-sm text-gray-700 dark:text-gray-300 hover:text-gray-900 dark:hover:text-gray-100 transition-colors" title={`Voir la Pull Request: ${links.pullRequestLink}`} > - + PR #{extractPRNumber(links.pullRequestLink)} )} @@ -44,6 +40,10 @@ export default function EventLinks({ links, slackId, className = '' }: EventLink {links?.ticket && (() => { const ticketId = extractTicketId(links.ticket) const ticketUrl = getJiraTicketUrl(links.ticket) + // Dรฉtecter si c'est un lien Jira/Atlassian + const isJiraLink = ticketUrl.toLowerCase().includes('atlassian') || ticketUrl.toLowerCase().includes('jira') + const icon = isJiraLink ? faJira : faTicket + return ( - + {ticketId} ) @@ -71,7 +71,7 @@ export default function EventLinks({ links, slackId, className = '' }: EventLink className="inline-flex items-center space-x-1 text-sm text-gray-700 dark:text-gray-300 hover:text-gray-900 dark:hover:text-gray-100 transition-colors" title="View in Slack" > - + Slack ) @@ -134,20 +134,20 @@ export function SourceIcon({ source, className = 'w-4 h-4' }: SourceIconProps) { const sourceLower = source.toLowerCase() if (sourceLower.includes('tracker')) { - return + return } if (sourceLower.includes('slack')) { - return + return } if (sourceLower.includes('github')) { - return + return } - if (sourceLower.includes('jira')) { - return + if (sourceLower.includes('grafana')) { + return } - return null + return } diff --git a/web/src/components/StaticModeBanner.tsx b/web/src/components/StaticModeBanner.tsx index f3f46cb..f5ddc72 100644 --- a/web/src/components/StaticModeBanner.tsx +++ b/web/src/components/StaticModeBanner.tsx @@ -4,8 +4,12 @@ import { getMetadata } from '../lib/staticApi' export default function StaticModeBanner() { const [lastUpdate, setLastUpdate] = useState('') + const isStaticMode = import.meta.env.VITE_STATIC_MODE === 'true' useEffect(() => { + // Only fetch metadata if we're in static mode + if (!isStaticMode) return + const fetchMetadata = async () => { try { const metadata = await getMetadata() @@ -15,9 +19,7 @@ export default function StaticModeBanner() { } } fetchMetadata() - }, []) - - const isStaticMode = import.meta.env.VITE_STATIC_MODE === 'true' + }, [isStaticMode]) if (!isStaticMode) return null diff --git a/web/src/components/icons/GrafanaIcon.tsx b/web/src/components/icons/GrafanaIcon.tsx index db9e264..f032627 100644 --- a/web/src/components/icons/GrafanaIcon.tsx +++ b/web/src/components/icons/GrafanaIcon.tsx @@ -2,7 +2,7 @@ interface GrafanaIconProps { className?: string } -export default function GrafanaIcon({ className = "w-4 h-4" }: GrafanaIconProps) { +export function GrafanaIcon({ className = "w-4 h-4" }: GrafanaIconProps) { return ( { const apiUrl = import.meta.env.VITE_API_BASE_URL || '/api/v1alpha1' - console.log('๐Ÿ”— API Base URL:', apiUrl) // Debug temporaire return apiUrl } @@ -200,8 +199,6 @@ const realCatalogApi = { }, createOrUpdate: async (catalog: Catalog) => { - console.log('๐ŸŒ API: Sending catalog to backend:', JSON.stringify(catalog, null, 2)) - // Convert to backend format (snake_case for dependencies, simple SLA) // IMPORTANT: Exclude version fields - they are managed separately via updateVersions endpoint const backendCatalog = { @@ -273,10 +270,7 @@ const realCatalogApi = { // They are managed via separate updateVersions endpoint } - console.log('๐Ÿ”„ API: Converted for backend (no version fields):', JSON.stringify(backendCatalog, null, 2)) - const { data } = await axiosInstance.put<{ catalog: any }>('/catalog', backendCatalog) - console.log('โœ… API: Received response:', JSON.stringify(data, null, 2)) // Convert response back to frontend format const frontendCatalog: Catalog = { @@ -314,8 +308,6 @@ const realCatalogApi = { }, updateVersions: async (name: string, versions: string[], latestVersion?: string, referenceVersion?: string) => { - console.log('๐Ÿ”ง API: Updating versions for service:', name, { versions, latestVersion, referenceVersion }) - const requestData = { name, available_versions: versions, @@ -323,10 +315,7 @@ const realCatalogApi = { reference_version: referenceVersion } - console.log('๐Ÿ“ค API: Sending version update:', JSON.stringify(requestData, null, 2)) - const { data } = await axiosInstance.put<{ catalog: any }>(`/catalog/${name}/versions`, requestData) - console.log('โœ… API: Version update response:', JSON.stringify(data, null, 2)) // Convert response back to frontend format const frontendCatalog: Catalog = { @@ -354,18 +343,13 @@ const realCatalogApi = { }, updateDependencies: async (name: string, dependenciesIn: string[], dependenciesOut: string[]) => { - console.log('๐Ÿ”ง API: Updating dependencies for service:', name, { dependenciesIn, dependenciesOut }) - const requestData = { name, dependencies_in: dependenciesIn, dependencies_out: dependenciesOut } - console.log('๐Ÿ“ค API: Sending dependencies update:', JSON.stringify(requestData, null, 2)) - const { data } = await axiosInstance.put<{ catalog: any }>(`/catalog/${name}/dependencies`, requestData) - console.log('โœ… API: Dependencies update response:', JSON.stringify(data, null, 2)) // Convert response back to frontend format const frontendCatalog: Catalog = { diff --git a/web/src/lib/eventUtils.tsx b/web/src/lib/eventUtils.tsx index 4fc969d..78b5959 100644 --- a/web/src/lib/eventUtils.tsx +++ b/web/src/lib/eventUtils.tsx @@ -9,36 +9,28 @@ export const getEventTypeIcon = (type: EventType | string, className: string = ' // Normaliser le type en string lowercase const typeStr = String(type).toLowerCase() - console.log('๐Ÿ” getEventTypeIcon:', type, 'โ†’', typeStr) - switch (typeStr) { case 'deployment': case '1': - console.log('โœ… โ†’ ROCKET (Dรฉploiement)') return case 'operation': case '2': - console.log('โœ… โ†’ WRENCH (Opรฉration)') return case 'drift': case '3': - console.log('โœ… โ†’ CODE_BRANCH (Drift)') return case 'incident': case '4': - console.log('โœ… โ†’ FIRE (Incident)') return case 'rpa_usage': case '5': - console.log('โœ… โ†’ ROBOT (RPA Usage)') return default: - console.warn('โš ๏ธ Type inconnu:', type, typeStr) return } } diff --git a/web/src/lib/staticApi.ts b/web/src/lib/staticApi.ts index 2c04893..62700c8 100644 --- a/web/src/lib/staticApi.ts +++ b/web/src/lib/staticApi.ts @@ -181,8 +181,6 @@ export const staticCatalogApi = { updateVersions: async (name: string, versions: string[], latestVersion?: string, referenceVersion?: string) => { // Mock version update for static mode - console.log('๐Ÿ”ง Static API: Mock updating versions for service:', name, { versions, latestVersion, referenceVersion }) - // In static mode, we just return a mock response return { name, diff --git a/web/src/pages/AllDriftsList.tsx b/web/src/pages/AllDriftsList.tsx index ffaa55c..da1a50d 100644 --- a/web/src/pages/AllDriftsList.tsx +++ b/web/src/pages/AllDriftsList.tsx @@ -52,7 +52,6 @@ export default function AllDriftsList() { type: EventType.DRIFT as unknown as number, } - console.log('Loading all drifts:', searchParams) const data = await eventsApi.search(searchParams) setDrifts(data.events || []) diff --git a/web/src/pages/CatalogDependencies.tsx b/web/src/pages/CatalogDependencies.tsx index cdb2cd3..32365e7 100644 --- a/web/src/pages/CatalogDependencies.tsx +++ b/web/src/pages/CatalogDependencies.tsx @@ -22,7 +22,7 @@ import { useMemo, useState, useCallback } from 'react' import { Button } from '../components/ui/button' import { Input } from '../components/ui/input' import { Badge } from '../components/ui/badge' -import KubernetesIcon from '../components/icons/KubernetesIcon' +import { KubernetesIcon } from '../components/icons/KubernetesIcon' type LayoutType = 'circular' | 'hierarchical' | 'force' | 'grid' type ViewMode = 'graph' | 'list' diff --git a/web/src/pages/CatalogDetail.tsx b/web/src/pages/CatalogDetail.tsx index 9031d06..e9c65fc 100644 --- a/web/src/pages/CatalogDetail.tsx +++ b/web/src/pages/CatalogDetail.tsx @@ -23,11 +23,11 @@ import { faCube, faComments } from '@fortawesome/free-solid-svg-icons' -import KubernetesIcon from '../components/icons/KubernetesIcon' -import KotlinIcon from '../components/icons/KotlinIcon' -import TerraformIcon from '../components/icons/TerraformIcon' -import SlackIcon from '../components/icons/SlackIcon' -import GrafanaIcon from '../components/icons/GrafanaIcon' +import { KubernetesIcon } from '../components/icons/KubernetesIcon' +import { KotlinIcon } from '../components/icons/KotlinIcon' +import { TerraformIcon } from '../components/icons/TerraformIcon' +import { SlackIcon } from '../components/icons/SlackIcon' +import { GrafanaIcon } from '../components/icons/GrafanaIcon' import { ReactFlow, Node, diff --git a/web/src/pages/CatalogTable.tsx b/web/src/pages/CatalogTable.tsx index 59f8dfc..be8e939 100644 --- a/web/src/pages/CatalogTable.tsx +++ b/web/src/pages/CatalogTable.tsx @@ -33,11 +33,11 @@ import { } from '@fortawesome/free-solid-svg-icons' import { Button } from '../components/ui/button' import { Input } from '../components/ui/input' -import KubernetesIcon from '../components/icons/KubernetesIcon' -import KotlinIcon from '../components/icons/KotlinIcon' -import TerraformIcon from '../components/icons/TerraformIcon' -import SlackIcon from '../components/icons/SlackIcon' -import GrafanaIcon from '../components/icons/GrafanaIcon' +import { KubernetesIcon } from '../components/icons/KubernetesIcon' +import { KotlinIcon } from '../components/icons/KotlinIcon' +import { TerraformIcon } from '../components/icons/TerraformIcon' +import { SlackIcon } from '../components/icons/SlackIcon' +import { GrafanaIcon } from '../components/icons/GrafanaIcon' import { Badge } from '../components/ui/badge' import { Checkbox } from '../components/ui/checkbox' import { Separator } from '../components/ui/separator' diff --git a/web/src/pages/CreateCatalog.tsx b/web/src/pages/CreateCatalog.tsx index e94e5e3..1f4cdff 100644 --- a/web/src/pages/CreateCatalog.tsx +++ b/web/src/pages/CreateCatalog.tsx @@ -82,8 +82,10 @@ export default function CreateCatalog() { e.preventDefault() if (!formData.name || !formData.owner) return - // Debug: Log the data being sent - console.log('๐Ÿ“ค Sending catalog data:', JSON.stringify(formData, null, 2)) + // Debug: Log the data being sent in development only + if (import.meta.env.DEV) { + console.log('๐Ÿ“ค Sending catalog data:', JSON.stringify(formData, null, 2)) + } createUpdateMutation.mutate(formData as Catalog) } diff --git a/web/src/pages/DriftsList.tsx b/web/src/pages/DriftsList.tsx index 687884e..ce34fdf 100644 --- a/web/src/pages/DriftsList.tsx +++ b/web/src/pages/DriftsList.tsx @@ -40,7 +40,6 @@ export default function DriftsList() { type: EventType.DRIFT as unknown as number, } - console.log('Loading all drifts with filters:', searchParams) const data = await eventsApi.search(searchParams) // Filter out completed/failed drifts - show everything except failed, done, closed diff --git a/web/src/pages/EventsCalendar.tsx b/web/src/pages/EventsCalendar.tsx index 7a0732d..bcda114 100644 --- a/web/src/pages/EventsCalendar.tsx +++ b/web/src/pages/EventsCalendar.tsx @@ -490,7 +490,7 @@ export default function EventsCalendar() { {/* Calendar Content */} -
+
{isLoading ? (
@@ -499,9 +499,9 @@ export default function EventsCalendar() {
) : ( -
+
{/* Calendar Grid */} -
+

{format(currentDate, 'MMMM yyyy', { locale: fr })} @@ -587,14 +587,14 @@ export default function EventsCalendar() {

{/* Event Details Panel */} -
+

{selectedDate ? format(selectedDate, 'dd MMMM yyyy', { locale: fr }) : 'Select a Date'}

- +
{selectedDayEvents.length > 0 ? (
diff --git a/web/src/pages/Locks.tsx b/web/src/pages/Locks.tsx index 199324e..57f5589 100644 --- a/web/src/pages/Locks.tsx +++ b/web/src/pages/Locks.tsx @@ -23,7 +23,6 @@ export default function Locks() { setLoading(true) setError(null) const data = await locksApi.list() - console.log('Locks data:', data) setLocks(data.locks || []) } catch (err) { setError('Erreur lors du chargement des locks')