@open-mercato/scheduler 0.5.1-develop.2860.07af3a6a9d → 0.5.1-develop.2874.77704bccbd
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.
|
@@ -138,7 +138,7 @@ function JobLogsModal({
|
|
|
138
138
|
job.failedReason && /* @__PURE__ */ jsxs(TabsContent, { value: "error", className: "space-y-4", children: [
|
|
139
139
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
140
140
|
/* @__PURE__ */ jsx(Label, { className: "text-sm font-medium", children: t("scheduler.job_logs.error_message", "Error Message") }),
|
|
141
|
-
/* @__PURE__ */ jsx("pre", { className: "mt-1 bg-
|
|
141
|
+
/* @__PURE__ */ jsx("pre", { className: "mt-1 bg-status-error-bg p-3 rounded text-sm text-status-error-text", children: job.failedReason })
|
|
142
142
|
] }),
|
|
143
143
|
job.stacktrace && job.stacktrace.length > 0 && /* @__PURE__ */ jsxs("div", { children: [
|
|
144
144
|
/* @__PURE__ */ jsx(Label, { className: "text-sm font-medium", children: t("scheduler.job_logs.stack_trace", "Stack Trace") }),
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/modules/scheduler/components/JobLogsModal.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@open-mercato/ui/primitives/dialog'\nimport { Badge } from '@open-mercato/ui/primitives/badge'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { Spinner } from '@open-mercato/ui/primitives/spinner'\nimport { apiCallOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { Alert, AlertDescription } from '@open-mercato/ui/primitives/alert'\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@open-mercato/ui/primitives/tabs'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\n\n\ntype BullMQJob = {\n id: string\n name: string\n data: Record<string, unknown>\n state: 'waiting' | 'active' | 'completed' | 'failed' | 'delayed'\n progress?: number\n returnvalue?: unknown\n failedReason?: string\n stacktrace?: string[]\n attemptsMade: number\n processedOn?: string\n finishedOn?: string\n logs: string[]\n}\n\ntype JobLogsModalProps = {\n open: boolean\n onClose: () => void\n queueJobId: string | null\n queueName: string | null\n scheduleName: string\n}\n\nexport function JobLogsModal({\n open,\n onClose,\n queueJobId,\n queueName,\n scheduleName,\n}: JobLogsModalProps) {\n const t = useT()\n const [loading, setLoading] = React.useState(true)\n const [error, setError] = React.useState<string | null>(null)\n const [job, setJob] = React.useState<BullMQJob | null>(null)\n\n React.useEffect(() => {\n if (open && queueJobId && queueName) {\n fetchJobDetails()\n } else {\n setLoading(false)\n setError(null)\n setJob(null)\n }\n }, [open, queueJobId, queueName])\n\n const fetchJobDetails = async () => {\n setLoading(true)\n setError(null)\n \n try {\n const { result } = await apiCallOrThrow(\n `/api/scheduler/queue-jobs/${queueJobId}?queue=${queueName}`\n )\n setJob(result as BullMQJob)\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : t('scheduler.job_logs.load_failed', 'Failed to load job details'))\n } finally {\n setLoading(false)\n }\n }\n\n const getStateBadgeVariant = (state: string): 'destructive' | 'secondary' | 'default' | 'outline' => {\n switch (state) {\n case 'completed':\n return 'default'\n case 'failed':\n return 'destructive'\n case 'active':\n return 'outline'\n default:\n return 'secondary'\n }\n }\n\n const formatDuration = (processedOn?: string, finishedOn?: string) => {\n if (!processedOn || !finishedOn) return null\n const duration = new Date(finishedOn).getTime() - new Date(processedOn).getTime()\n return `${(duration / 1000).toFixed(2)}s`\n }\n\n return (\n <Dialog open={open} onOpenChange={onClose}>\n <DialogContent className=\"max-w-4xl max-h-[80vh] overflow-auto\">\n <DialogHeader className=\"overflow-hidden\">\n <DialogTitle>\n {t('scheduler.job_logs.title', 'Queue Job')}: {scheduleName}\n </DialogTitle>\n <p\n className=\"text-sm text-muted-foreground font-mono truncate cursor-pointer hover:text-primary transition-colors\"\n title={queueJobId ?? undefined}\n onClick={() => queueJobId && navigator.clipboard.writeText(queueJobId)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n if (queueJobId) navigator.clipboard.writeText(queueJobId)\n }\n }}\n role=\"button\"\n tabIndex={0}\n >\n {t('scheduler.job_logs.job_id', 'Job ID')}: {queueJobId}\n </p>\n </DialogHeader>\n\n {loading && (\n <div className=\"flex justify-center items-center py-8\">\n <Spinner />\n </div>\n )}\n\n {error && (\n <Alert variant=\"destructive\">\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n )}\n\n {!loading && !error && job && (\n <Tabs defaultValue=\"overview\" className=\"w-full\">\n <TabsList>\n <TabsTrigger value=\"overview\">{t('scheduler.job_logs.tab_overview', 'Overview')}</TabsTrigger>\n <TabsTrigger value=\"logs\">{t('scheduler.job_logs.tab_logs', 'Logs')}</TabsTrigger>\n <TabsTrigger value=\"data\">{t('scheduler.job_logs.tab_payload', 'Payload')}</TabsTrigger>\n {job.failedReason && (\n <TabsTrigger value=\"error\">{t('scheduler.job_logs.tab_error', 'Error Details')}</TabsTrigger>\n )}\n </TabsList>\n\n <TabsContent value=\"overview\" className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <Label className=\"text-sm font-medium\">{t('scheduler.job_logs.state', 'State')}</Label>\n <div className=\"mt-1\">\n <Badge variant={getStateBadgeVariant(job.state)}>\n {job.state}\n </Badge>\n </div>\n </div>\n\n <div>\n <Label className=\"text-sm font-medium\">{t('scheduler.job_logs.attempts', 'Attempts')}</Label>\n <p className=\"mt-1 text-sm\">{job.attemptsMade}</p>\n </div>\n\n {job.processedOn && (\n <div>\n <Label className=\"text-sm font-medium\">{t('scheduler.job_logs.processed', 'Processed')}</Label>\n <p className=\"mt-1 text-sm\">\n {new Date(job.processedOn).toLocaleString()}\n </p>\n </div>\n )}\n\n {job.finishedOn && (\n <div>\n <Label className=\"text-sm font-medium\">{t('scheduler.job_logs.finished', 'Finished')}</Label>\n <p className=\"mt-1 text-sm\">\n {new Date(job.finishedOn).toLocaleString()}\n </p>\n </div>\n )}\n\n {job.processedOn && job.finishedOn && (\n <div>\n <Label className=\"text-sm font-medium\">{t('scheduler.job_logs.duration', 'Duration')}</Label>\n <p className=\"mt-1 text-sm\">\n {formatDuration(job.processedOn, job.finishedOn)}\n </p>\n </div>\n )}\n\n {job.progress !== undefined && (\n <div>\n <Label className=\"text-sm font-medium\">{t('scheduler.job_logs.progress', 'Progress')}</Label>\n <p className=\"mt-1 text-sm\">{job.progress}%</p>\n </div>\n )}\n </div>\n\n {job.returnvalue !== undefined && job.returnvalue !== null && (\n <div>\n <Label className=\"text-sm font-medium\">{t('scheduler.job_logs.return_value', 'Return Value')}</Label>\n <pre className=\"mt-1 bg-muted p-3 rounded text-xs overflow-auto max-h-64\">\n {String(typeof job.returnvalue === 'string' ? job.returnvalue : JSON.stringify(job.returnvalue, null, 2))}\n </pre>\n </div>\n )}\n </TabsContent>\n\n <TabsContent value=\"logs\">\n {job.logs.length > 0 ? (\n <pre className=\"bg-muted p-4 rounded text-xs overflow-auto max-h-96 font-mono\">\n {job.logs.join('\\n')}\n </pre>\n ) : (\n <p className=\"text-sm text-muted-foreground\">{t('scheduler.job_logs.no_logs', 'No logs available')}</p>\n )}\n </TabsContent>\n\n <TabsContent value=\"data\">\n <pre className=\"bg-muted p-4 rounded text-xs overflow-auto max-h-96\">\n {JSON.stringify(job.data, null, 2)}\n </pre>\n </TabsContent>\n\n {job.failedReason && (\n <TabsContent value=\"error\" className=\"space-y-4\">\n <div>\n <Label className=\"text-sm font-medium\">{t('scheduler.job_logs.error_message', 'Error Message')}</Label>\n <pre className=\"mt-1 bg-
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@open-mercato/ui/primitives/dialog'\nimport { Badge } from '@open-mercato/ui/primitives/badge'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { Spinner } from '@open-mercato/ui/primitives/spinner'\nimport { apiCallOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { Alert, AlertDescription } from '@open-mercato/ui/primitives/alert'\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@open-mercato/ui/primitives/tabs'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\n\n\ntype BullMQJob = {\n id: string\n name: string\n data: Record<string, unknown>\n state: 'waiting' | 'active' | 'completed' | 'failed' | 'delayed'\n progress?: number\n returnvalue?: unknown\n failedReason?: string\n stacktrace?: string[]\n attemptsMade: number\n processedOn?: string\n finishedOn?: string\n logs: string[]\n}\n\ntype JobLogsModalProps = {\n open: boolean\n onClose: () => void\n queueJobId: string | null\n queueName: string | null\n scheduleName: string\n}\n\nexport function JobLogsModal({\n open,\n onClose,\n queueJobId,\n queueName,\n scheduleName,\n}: JobLogsModalProps) {\n const t = useT()\n const [loading, setLoading] = React.useState(true)\n const [error, setError] = React.useState<string | null>(null)\n const [job, setJob] = React.useState<BullMQJob | null>(null)\n\n React.useEffect(() => {\n if (open && queueJobId && queueName) {\n fetchJobDetails()\n } else {\n setLoading(false)\n setError(null)\n setJob(null)\n }\n }, [open, queueJobId, queueName])\n\n const fetchJobDetails = async () => {\n setLoading(true)\n setError(null)\n \n try {\n const { result } = await apiCallOrThrow(\n `/api/scheduler/queue-jobs/${queueJobId}?queue=${queueName}`\n )\n setJob(result as BullMQJob)\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : t('scheduler.job_logs.load_failed', 'Failed to load job details'))\n } finally {\n setLoading(false)\n }\n }\n\n const getStateBadgeVariant = (state: string): 'destructive' | 'secondary' | 'default' | 'outline' => {\n switch (state) {\n case 'completed':\n return 'default'\n case 'failed':\n return 'destructive'\n case 'active':\n return 'outline'\n default:\n return 'secondary'\n }\n }\n\n const formatDuration = (processedOn?: string, finishedOn?: string) => {\n if (!processedOn || !finishedOn) return null\n const duration = new Date(finishedOn).getTime() - new Date(processedOn).getTime()\n return `${(duration / 1000).toFixed(2)}s`\n }\n\n return (\n <Dialog open={open} onOpenChange={onClose}>\n <DialogContent className=\"max-w-4xl max-h-[80vh] overflow-auto\">\n <DialogHeader className=\"overflow-hidden\">\n <DialogTitle>\n {t('scheduler.job_logs.title', 'Queue Job')}: {scheduleName}\n </DialogTitle>\n <p\n className=\"text-sm text-muted-foreground font-mono truncate cursor-pointer hover:text-primary transition-colors\"\n title={queueJobId ?? undefined}\n onClick={() => queueJobId && navigator.clipboard.writeText(queueJobId)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n if (queueJobId) navigator.clipboard.writeText(queueJobId)\n }\n }}\n role=\"button\"\n tabIndex={0}\n >\n {t('scheduler.job_logs.job_id', 'Job ID')}: {queueJobId}\n </p>\n </DialogHeader>\n\n {loading && (\n <div className=\"flex justify-center items-center py-8\">\n <Spinner />\n </div>\n )}\n\n {error && (\n <Alert variant=\"destructive\">\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n )}\n\n {!loading && !error && job && (\n <Tabs defaultValue=\"overview\" className=\"w-full\">\n <TabsList>\n <TabsTrigger value=\"overview\">{t('scheduler.job_logs.tab_overview', 'Overview')}</TabsTrigger>\n <TabsTrigger value=\"logs\">{t('scheduler.job_logs.tab_logs', 'Logs')}</TabsTrigger>\n <TabsTrigger value=\"data\">{t('scheduler.job_logs.tab_payload', 'Payload')}</TabsTrigger>\n {job.failedReason && (\n <TabsTrigger value=\"error\">{t('scheduler.job_logs.tab_error', 'Error Details')}</TabsTrigger>\n )}\n </TabsList>\n\n <TabsContent value=\"overview\" className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <Label className=\"text-sm font-medium\">{t('scheduler.job_logs.state', 'State')}</Label>\n <div className=\"mt-1\">\n <Badge variant={getStateBadgeVariant(job.state)}>\n {job.state}\n </Badge>\n </div>\n </div>\n\n <div>\n <Label className=\"text-sm font-medium\">{t('scheduler.job_logs.attempts', 'Attempts')}</Label>\n <p className=\"mt-1 text-sm\">{job.attemptsMade}</p>\n </div>\n\n {job.processedOn && (\n <div>\n <Label className=\"text-sm font-medium\">{t('scheduler.job_logs.processed', 'Processed')}</Label>\n <p className=\"mt-1 text-sm\">\n {new Date(job.processedOn).toLocaleString()}\n </p>\n </div>\n )}\n\n {job.finishedOn && (\n <div>\n <Label className=\"text-sm font-medium\">{t('scheduler.job_logs.finished', 'Finished')}</Label>\n <p className=\"mt-1 text-sm\">\n {new Date(job.finishedOn).toLocaleString()}\n </p>\n </div>\n )}\n\n {job.processedOn && job.finishedOn && (\n <div>\n <Label className=\"text-sm font-medium\">{t('scheduler.job_logs.duration', 'Duration')}</Label>\n <p className=\"mt-1 text-sm\">\n {formatDuration(job.processedOn, job.finishedOn)}\n </p>\n </div>\n )}\n\n {job.progress !== undefined && (\n <div>\n <Label className=\"text-sm font-medium\">{t('scheduler.job_logs.progress', 'Progress')}</Label>\n <p className=\"mt-1 text-sm\">{job.progress}%</p>\n </div>\n )}\n </div>\n\n {job.returnvalue !== undefined && job.returnvalue !== null && (\n <div>\n <Label className=\"text-sm font-medium\">{t('scheduler.job_logs.return_value', 'Return Value')}</Label>\n <pre className=\"mt-1 bg-muted p-3 rounded text-xs overflow-auto max-h-64\">\n {String(typeof job.returnvalue === 'string' ? job.returnvalue : JSON.stringify(job.returnvalue, null, 2))}\n </pre>\n </div>\n )}\n </TabsContent>\n\n <TabsContent value=\"logs\">\n {job.logs.length > 0 ? (\n <pre className=\"bg-muted p-4 rounded text-xs overflow-auto max-h-96 font-mono\">\n {job.logs.join('\\n')}\n </pre>\n ) : (\n <p className=\"text-sm text-muted-foreground\">{t('scheduler.job_logs.no_logs', 'No logs available')}</p>\n )}\n </TabsContent>\n\n <TabsContent value=\"data\">\n <pre className=\"bg-muted p-4 rounded text-xs overflow-auto max-h-96\">\n {JSON.stringify(job.data, null, 2)}\n </pre>\n </TabsContent>\n\n {job.failedReason && (\n <TabsContent value=\"error\" className=\"space-y-4\">\n <div>\n <Label className=\"text-sm font-medium\">{t('scheduler.job_logs.error_message', 'Error Message')}</Label>\n <pre className=\"mt-1 bg-status-error-bg p-3 rounded text-sm text-status-error-text\">\n {job.failedReason}\n </pre>\n </div>\n\n {job.stacktrace && job.stacktrace.length > 0 && (\n <div>\n <Label className=\"text-sm font-medium\">{t('scheduler.job_logs.stack_trace', 'Stack Trace')}</Label>\n <pre className=\"mt-1 bg-muted p-3 rounded text-xs overflow-auto max-h-64 font-mono\">\n {job.stacktrace.join('\\n')}\n </pre>\n </div>\n )}\n </TabsContent>\n )}\n </Tabs>\n )}\n </DialogContent>\n </Dialog>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@open-mercato/scheduler",
|
|
3
|
-
"version": "0.5.1-develop.
|
|
3
|
+
"version": "0.5.1-develop.2874.77704bccbd",
|
|
4
4
|
"description": "Database-managed scheduled jobs with admin UI",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -58,13 +58,13 @@
|
|
|
58
58
|
"./*/*/*/*/*/*.json": "./src/*/*/*/*/*/*.json"
|
|
59
59
|
},
|
|
60
60
|
"dependencies": {
|
|
61
|
-
"@open-mercato/events": "0.5.1-develop.
|
|
62
|
-
"@open-mercato/queue": "0.5.1-develop.
|
|
61
|
+
"@open-mercato/events": "0.5.1-develop.2874.77704bccbd",
|
|
62
|
+
"@open-mercato/queue": "0.5.1-develop.2874.77704bccbd",
|
|
63
63
|
"cron-parser": "^5.5.0"
|
|
64
64
|
},
|
|
65
65
|
"peerDependencies": {
|
|
66
66
|
"@mikro-orm/core": "^7.0.10",
|
|
67
|
-
"@open-mercato/shared": "0.5.1-develop.
|
|
67
|
+
"@open-mercato/shared": "0.5.1-develop.2874.77704bccbd",
|
|
68
68
|
"bullmq": "^5.0.0",
|
|
69
69
|
"ioredis": "^5.0.0",
|
|
70
70
|
"zod": ">=3.23.0"
|
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
}
|
|
79
79
|
},
|
|
80
80
|
"devDependencies": {
|
|
81
|
-
"@open-mercato/shared": "0.5.1-develop.
|
|
81
|
+
"@open-mercato/shared": "0.5.1-develop.2874.77704bccbd",
|
|
82
82
|
"@types/jest": "^30.0.0",
|
|
83
83
|
"@types/node": "^25.6.0",
|
|
84
84
|
"jest": "^30.3.0",
|
|
@@ -219,7 +219,7 @@ export function JobLogsModal({
|
|
|
219
219
|
<TabsContent value="error" className="space-y-4">
|
|
220
220
|
<div>
|
|
221
221
|
<Label className="text-sm font-medium">{t('scheduler.job_logs.error_message', 'Error Message')}</Label>
|
|
222
|
-
<pre className="mt-1 bg-
|
|
222
|
+
<pre className="mt-1 bg-status-error-bg p-3 rounded text-sm text-status-error-text">
|
|
223
223
|
{job.failedReason}
|
|
224
224
|
</pre>
|
|
225
225
|
</div>
|