admin08077/Githubgemini
0
1{"version":3,"file":"CronJobBuilder-2-5myVyo.js","sources":["../../components/features/CronJobBuilder.tsx"],"sourcesContent":["import React, { useState, useMemo, useCallback, useEffect } from 'react';\nimport { CommandLineIcon, SparklesIcon } from '../icons.tsx';\nimport { generateCronFromDescription, CronParts } from '../../services/index.ts';\nimport { LoadingSpinner } from '../shared/index.tsx';\n\nconst CronPartSelector: React.FC<{ label: string, value: string, onChange: (value: string) => void, options: (string|number)[] }> = ({ label, value, onChange, options }) => {\n return (\n <div>\n <label className=\"block text-sm font-medium text-text-secondary\">{label}</label>\n <select value={value} onChange={e => onChange(e.target.value)} className=\"w-full mt-1 px-3 py-2 rounded-md bg-surface border border-border\">\n <option value=\"*\">* (every)</option>\n {options.map(o => <option key={o} value={o}>{o}</option>)}\n </select>\n </div>\n );\n};\n\nexport const CronJobBuilder: React.FC<{ initialPrompt?: string }> = ({ initialPrompt }) => {\n const [minute, setMinute] = useState('0');\n const [hour, setHour] = useState('17');\n const [dayOfMonth, setDayOfMonth] = useState('*');\n const [month, setMonth] = useState('*');\n const [dayOfWeek, setDayOfWeek] = useState('1-5');\n const [aiPrompt, setAiPrompt] = useState(initialPrompt || 'every weekday at 5pm');\n const [isLoading, setIsLoading] = useState(false);\n \n const cronExpression = useMemo(() => {\n return `${minute} ${hour} ${dayOfMonth} ${month} ${dayOfWeek}`;\n }, [minute, hour, dayOfMonth, month, dayOfWeek]);\n\n const handleAiGenerate = useCallback(async (p: string) => {\n if (!p) return;\n setIsLoading(true);\n try {\n const result: CronParts = await generateCronFromDescription(p);\n setMinute(result.minute);\n setHour(result.hour);\n setDayOfMonth(result.dayOfMonth);\n setMonth(result.month);\n setDayOfWeek(result.dayOfWeek);\n } catch (e) {\n console.error(e);\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n useEffect(() => {\n if (initialPrompt) {\n setAiPrompt(initialPrompt);\n handleAiGenerate(initialPrompt);\n }\n }, [initialPrompt, handleAiGenerate]);\n\n return (\n <div className=\"h-full flex flex-col p-4 sm:p-6 lg:p-8 text-text-primary\">\n <header className=\"mb-6\">\n <h1 className=\"text-3xl font-bold flex items-center\">\n <CommandLineIcon />\n <span className=\"ml-3\">AI Cron Job Builder</span>\n </h1>\n <p className=\"text-text-secondary mt-1\">Visually construct a cron expression or describe it in plain English.</p>\n </header>\n <div className=\"flex gap-2 mb-6\">\n <input type=\"text\" value={aiPrompt} onChange={e => setAiPrompt(e.target.value)} placeholder=\"Describe a schedule...\" className=\"flex-grow px-3 py-1.5 rounded-md bg-surface border border-border text-sm\"/>\n <button onClick={() => handleAiGenerate(aiPrompt)} disabled={isLoading} className=\"btn-primary px-4 py-1.5 flex items-center gap-2\">\n {isLoading ? <LoadingSpinner /> : <SparklesIcon />} AI Generate\n </button>\n </div>\n <div className=\"grid grid-cols-2 md:grid-cols-5 gap-4 mb-6\">\n <CronPartSelector label=\"Minute\" value={minute} onChange={setMinute} options={Array.from({length: 60}, (_, i) => i)} />\n <CronPartSelector label=\"Hour\" value={hour} onChange={setHour} options={Array.from({length: 24}, (_, i) => i)} />\n <CronPartSelector label=\"Day (Month)\" value={dayOfMonth} onChange={setDayOfMonth} options={Array.from({length: 31}, (_, i) => i + 1)} />\n <CronPartSelector label=\"Month\" value={month} onChange={setMonth} options={Array.from({length: 12}, (_, i) => i + 1)} />\n <CronPartSelector label=\"Day (Week)\" value={dayOfWeek} onChange={setDayOfWeek} options={Array.from({length: 7}, (_, i) => i)} />\n </div>\n <div className=\"bg-surface p-4 rounded-lg text-center border border-border\">\n <p className=\"text-text-secondary text-sm\">Generated Expression</p>\n <p className=\"font-mono text-primary text-2xl mt-1\">{cronExpression}</p>\n <button onClick={() => navigator.clipboard.writeText(cronExpression)} className=\"mt-4 px-3 py-1 bg-gray-100 hover:bg-gray-200 rounded-md text-xs\">Copy</button>\n </div>\n </div>\n );\n};"],"names":["CronPartSelector","label","value","onChange","options","jsx","jsxs","e","o","CronJobBuilder","initialPrompt","minute","setMinute","useState","hour","setHour","dayOfMonth","setDayOfMonth","month","setMonth","dayOfWeek","setDayOfWeek","aiPrompt","setAiPrompt","isLoading","setIsLoading","cronExpression","useMemo","handleAiGenerate","useCallback","p","result","generateCronFromDescription","useEffect","CommandLineIcon","LoadingSpinner","SparklesIcon","_","i"],"mappings":"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"}