@praxisui/cron-builder
Version:
Cron expression builder utilities and components for Praxis UI.
1 lines • 45.4 kB
Source Map (JSON)
{"version":3,"file":"praxisui-cron-builder.mjs","sources":["../../../projects/praxis-cron-builder/src/lib/pdx-cron-builder.component.ts","../../../projects/praxis-cron-builder/src/lib/pdx-cron-builder.component.html","../../../projects/praxis-cron-builder/src/lib/pdx-cron-builder.metadata.ts","../../../projects/praxis-cron-builder/src/public-api.ts","../../../projects/praxis-cron-builder/src/praxisui-cron-builder.ts"],"sourcesContent":["import { Component, Input, forwardRef, OnInit, OnDestroy, ChangeDetectionStrategy, inject } from '@angular/core';\nimport {\n ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n NonNullableFormBuilder,\n FormGroup,\n FormControl,\n ReactiveFormsModule,\n} from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { MatTabsModule, MatTabChangeEvent } from '@angular/material/tabs';\nimport { MatRadioModule } from '@angular/material/radio';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatListModule } from '@angular/material/list';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatSliderModule } from '@angular/material/slider';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatSnackBar, MatSnackBarModule } from '@angular/material/snack-bar';\nimport { Clipboard } from '@angular/cdk/clipboard';\nimport { PraxisIconDirective } from '@praxisui/core';\n// Avoid static imports of heavy node-targeted cron libraries to prevent ng-packagr TS issues.\n// Use dynamic imports inside methods instead.\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\n// Lazy module singletons\nlet _cronValidator: any | undefined;\nlet _cronstrue: any | undefined;\nlet _cronParser: any | undefined;\n\n// ... (keep existing interfaces)\nexport interface Recurrence {\n // Define recurrence properties here later\n}\n\nexport interface CronBuilderMetadata {\n mode?: 'simple' | 'advanced' | 'both';\n fields?: {\n seconds?: boolean;\n minutes?: boolean;\n hours?: boolean;\n dom?: boolean;\n month?: boolean;\n dow?: boolean;\n };\n timezone?: string;\n locale?: string;\n presets?: Array<{ label: string; cron: string }>;\n previewOccurrences?: number;\n previewFrom?: Date;\n validators?: {\n requiredMessage?: string;\n invalidCronMessage?: string;\n };\n validationTrigger?: 'change' | 'blur';\n validationDebounce?: number;\n errorPosition?: 'tooltip' | 'inline';\n showInlineErrors?: boolean;\n hint?: string;\n}\n\nexport type CronPresetType =\n | 'everyNMinutes'\n | 'dailyAt'\n | 'weekly'\n | 'monthlyDay'\n | 'monthlyNthWeekday';\n\nexport interface SimpleCronFormValue {\n type: CronPresetType;\n everyN: number;\n dailyTime: string;\n weeklyDays: number[];\n weeklyTime: string;\n monthlyDay: number;\n monthlyTime: string;\n nth: number;\n nthDay: number;\n nthTime: string;\n}\n\nexport interface AdvancedCronFormValue {\n seconds?: string;\n minutes: string;\n hours: string;\n dayOfMonth: string;\n month: string;\n dayOfWeek: string;\n}\n\n@Component({\n selector: 'pdx-cron-builder',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n MatTabsModule,\n MatRadioModule,\n MatSelectModule,\n MatInputModule,\n MatFormFieldModule,\n MatListModule,\n MatButtonModule,\n MatIconModule,\n MatTooltipModule,\n MatSliderModule,\n MatChipsModule,\n MatSnackBarModule,\n PraxisIconDirective,\n ],\n templateUrl: './pdx-cron-builder.component.html',\n styleUrls: ['./pdx-cron-builder.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => PdxCronBuilderComponent),\n multi: true,\n },\n ],\n})\n\nexport class PdxCronBuilderComponent\n implements ControlValueAccessor, OnInit, OnDestroy\n{\n // Tipos auxiliares para Typed Forms\n private readonly fb = inject(NonNullableFormBuilder);\n private readonly clipboard = inject(Clipboard);\n private readonly snackBar = inject(MatSnackBar);\n\n @Input() metadata: CronBuilderMetadata = {\n mode: 'both',\n fields: {\n seconds: false,\n minutes: true,\n hours: true,\n dom: true,\n month: true,\n dow: true,\n },\n presets: [\n { label: 'Every minute (* * * * *)', cron: '* * * * *' },\n { label: 'Every 5 minutes (*/5 * * * *)', cron: '*/5 * * * *' },\n { label: 'Daily at midnight (0 0 * * *)', cron: '0 0 * * *' },\n { label: 'Weekly on Sunday at midnight (0 0 * * 0)', cron: '0 0 * * 0' },\n ],\n previewOccurrences: 5,\n };\n\n value: string | Recurrence | null = null;\n isDisabled = false;\n activeTab: 'simple' | 'advanced' = 'simple';\n selectedTabIndex = 0;\n\n readonly form: FormGroup;\n readonly simpleForm: FormGroup;\n readonly timezoneControl = new FormControl<string>('UTC', { nonNullable: true });\n private readonly destroy$ = new Subject<void>();\n\n humanized = '';\n preview: Date[] = [];\n error: string | null = null;\n\n // Opções expostas ao template para controle de fluxo moderno\n readonly weekdayLabels = ['Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sáb'] as const;\n readonly weeklyDayOptions = [0, 1, 2, 3, 4, 5, 6] as const;\n readonly nthOrderOptions = [1, 2, 3, 4, 5] as const;\n readonly nthDayOptions = [1, 2, 3, 4, 5, 6, 0] as const;\n readonly timezoneOptions = ['UTC', 'America/Sao_Paulo', 'Europe/London', 'America/New_York'] as const;\n\n constructor() {\n this.form = this.fb.group({\n seconds: this.fb.control('*'),\n minutes: this.fb.control('*'),\n hours: this.fb.control('*'),\n dayOfMonth: this.fb.control('*'),\n month: this.fb.control('*'),\n dayOfWeek: this.fb.control('*'),\n });\n\n this.simpleForm = this.fb.group({\n type: this.fb.control<'everyNMinutes' | 'dailyAt' | 'weekly' | 'monthlyDay' | 'monthlyNthWeekday'>('everyNMinutes'),\n everyN: this.fb.control(5),\n dailyTime: this.fb.control('00:00'),\n weeklyDays: this.fb.control<number[]>([]),\n weeklyTime: this.fb.control('00:00'),\n monthlyDay: this.fb.control(1),\n monthlyTime: this.fb.control('00:00'),\n nth: this.fb.control(1),\n nthDay: this.fb.control(1),\n nthTime: this.fb.control('00:00'),\n });\n }\n\n // Acesso facilitado aos controles no template\n get simpleControls() {\n return (this.simpleForm as any).controls as Record<string, FormControl>;\n }\n\n ngOnInit(): void {\n if (this.metadata.mode === 'simple') {\n this.activeTab = 'simple';\n this.selectedTabIndex = 0;\n } else if (this.metadata.mode === 'advanced') {\n this.activeTab = 'advanced';\n this.selectedTabIndex = 1;\n }\n\n this.form.valueChanges.pipe(takeUntil(this.destroy$)).subscribe((value: AdvancedCronFormValue) => {\n const cron = this.constructCronString(value as AdvancedCronFormValue);\n this.updateValue(cron);\n });\n\n this.simpleForm.valueChanges\n .pipe(takeUntil(this.destroy$))\n .subscribe((value: SimpleCronFormValue) => {\n const cron = this.buildCronFromSimple(value as SimpleCronFormValue);\n this.updateValue(cron);\n });\n\n this.timezoneControl.setValue(this.metadata.timezone || 'UTC', {\n emitEvent: false,\n });\n this.timezoneControl.valueChanges\n .pipe(takeUntil(this.destroy$))\n .subscribe((tz) => {\n this.metadata.timezone = tz || 'UTC';\n if (typeof this.value === 'string') {\n this.generatePreview(this.value);\n }\n });\n }\n\n onChange: (value: any) => void = () => {};\n onTouched: () => void = () => {};\n\n writeValue(value: string | Recurrence | null): void {\n if (typeof value === 'string') {\n this.updateValue(value, false);\n this.parseCronString(value);\n this.syncSimpleForm(value);\n }\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n setDisabledState?(isDisabled: boolean): void {\n this.isDisabled = isDisabled;\n if (isDisabled) {\n this.form.disable();\n this.simpleForm.disable();\n this.timezoneControl.disable();\n } else {\n this.form.enable();\n this.simpleForm.enable();\n this.timezoneControl.enable();\n }\n }\n\n onTabChange(event: MatTabChangeEvent): void {\n this.selectedTabIndex = event.index;\n this.activeTab = event.index === 0 ? 'simple' : 'advanced';\n this.onTouched();\n }\n\n setPreset(cron: string): void {\n this.updateValue(cron);\n this.parseCronString(cron);\n this.syncSimpleForm(cron);\n }\n\n updateValue(cron: string, emitEvent = true): void {\n this.value = cron;\n if (emitEvent) {\n this.onChange(cron);\n }\n this.validate(cron);\n this.humanize(cron);\n this.generatePreview(cron);\n }\n\n copyCron(): void {\n if (typeof this.value === 'string') {\n this.clipboard.copy(this.value);\n this.snackBar.open('CRON expression copied', undefined, {\n duration: 2000,\n });\n }\n }\n\n copyHumanized(): void {\n if (this.humanized) {\n this.clipboard.copy(this.humanized);\n this.snackBar.open('Description copied', undefined, { duration: 2000 });\n }\n }\n\n importCron(): void {\n const cron = prompt('Enter CRON expression');\n if (cron) {\n this.updateValue(cron);\n this.parseCronString(cron);\n this.syncSimpleForm(cron);\n }\n }\n\n private validate(cron: string): void {\n (async () => {\n try {\n _cronValidator = _cronValidator || (await import('cron-validator'));\n const ok = await _cronValidator.isValidCron?.(cron, { alias: true, allowBlankDay: true });\n this.error = ok\n ? null\n : this.metadata.validators?.invalidCronMessage || 'Invalid CRON expression';\n } catch {\n // On import/validation failure, do a minimal sanity check and do not block UX\n this.error = /\\S+ \\S+ \\S+ \\S+ \\S+/.test(cron) ? null : 'Invalid CRON expression';\n }\n })();\n }\n\n private humanize(cron: string): void {\n if (this.error) {\n this.humanized = '';\n return;\n }\n (async () => {\n try {\n _cronstrue = _cronstrue || (await import('cronstrue'));\n this.humanized = _cronstrue.toString?.(cron, { locale: this.metadata.locale }) || '';\n } catch {\n this.humanized = '';\n }\n })();\n }\n\n private generatePreview(cron: string): void {\n if (this.error || !this.metadata.previewOccurrences) {\n this.preview = [];\n return;\n }\n (async () => {\n try {\n _cronParser = _cronParser || (await import('cron-parser'));\n const parse = _cronParser.parse || _cronParser.default?.parse;\n const interval = parse?.(cron, {\n currentDate: this.metadata.previewFrom ?? new Date(),\n tz: this.metadata.timezone,\n } as any);\n const next: Date[] = [];\n for (let i = 0; i < (this.metadata.previewOccurrences ?? 5); i++) {\n next.push(interval.next().toDate());\n }\n this.preview = next;\n } catch {\n this.preview = [];\n }\n })();\n }\n\n private parseCronString(cron: string): void {\n const parts = cron.trim().split(/\\s+/);\n if (parts.length < 5) return;\n\n let seconds = '*';\n let minutes: string;\n let hours: string;\n let dayOfMonth: string;\n let month: string;\n let dayOfWeek: string;\n\n if (parts.length === 6) {\n [seconds, minutes, hours, dayOfMonth, month, dayOfWeek] = parts;\n } else {\n [minutes, hours, dayOfMonth, month, dayOfWeek] = parts;\n }\n\n this.form.patchValue(\n {\n seconds: this.metadata.fields?.seconds ? seconds : '*',\n minutes: minutes || '*',\n hours: hours || '*',\n dayOfMonth: dayOfMonth || '*',\n month: month || '*',\n dayOfWeek: dayOfWeek || '*',\n },\n { emitEvent: false },\n );\n }\n\n private syncSimpleForm(cron: string): void {\n const parts = cron.trim().split(/\\s+/);\n if (parts.length < 5) return;\n if (parts.length === 6) {\n parts.shift();\n }\n const [minutes, hours, dom, month, dow] = parts;\n\n if (\n minutes.startsWith('*/') &&\n hours === '*' &&\n dom === '*' &&\n month === '*' &&\n dow === '*'\n ) {\n this.simpleForm.patchValue(\n { type: 'everyNMinutes', everyN: parseInt(minutes.slice(2), 10) },\n { emitEvent: false },\n );\n } else if (dom === '*' && month === '*' && dow === '*') {\n this.simpleForm.patchValue(\n { type: 'dailyAt', dailyTime: this.toTime(hours, minutes) },\n { emitEvent: false },\n );\n } else if (dom === '*' && month === '*') {\n this.simpleForm.patchValue(\n {\n type: 'weekly',\n weeklyTime: this.toTime(hours, minutes),\n weeklyDays: dow.split(',').map((d) => +d),\n },\n { emitEvent: false },\n );\n } else if (month === '*' && dow === '*') {\n this.simpleForm.patchValue(\n {\n type: 'monthlyDay',\n monthlyTime: this.toTime(hours, minutes),\n monthlyDay: +dom,\n },\n { emitEvent: false },\n );\n } else if (dom === '?' && dow.includes('#')) {\n const [day, nth] = dow.split('#');\n this.simpleForm.patchValue(\n {\n type: 'monthlyNthWeekday',\n nth: +nth,\n nthDay: +day,\n nthTime: this.toTime(hours, minutes),\n },\n { emitEvent: false },\n );\n }\n }\n\n private buildCronFromSimple(v: SimpleCronFormValue): string {\n let cron: string;\n switch (v.type) {\n case 'everyNMinutes':\n cron = `*/${v.everyN || 1} * * * *`;\n break;\n case 'dailyAt': {\n const [h, m] = this.parseTime(v.dailyTime);\n cron = `${m} ${h} * * *`;\n break;\n }\n case 'weekly': {\n const [h, m] = this.parseTime(v.weeklyTime);\n const days = (v.weeklyDays || []).sort().join(',') || '*';\n cron = `${m} ${h} * * ${days}`;\n break;\n }\n case 'monthlyDay': {\n const [h, m] = this.parseTime(v.monthlyTime);\n cron = `${m} ${h} ${v.monthlyDay || 1} * *`;\n break;\n }\n case 'monthlyNthWeekday': {\n const [h, m] = this.parseTime(v.nthTime);\n cron = `${m} ${h} ? * ${v.nthDay || 1}#${v.nth || 1}`;\n break;\n }\n default:\n cron = '* * * * *';\n }\n return this.metadata.fields?.seconds ? `0 ${cron}` : cron;\n }\n\n private parseTime(time: string): [number, number] {\n if (!time) {\n return [0, 0];\n }\n const [h, m] = time.split(':').map((v) => parseInt(v, 10));\n return [h || 0, m || 0];\n }\n\n private toTime(h: string, m: string): string {\n return `${this.pad(parseInt(h, 10))}:${this.pad(parseInt(m, 10))}`;\n }\n\n private pad(v: number): string {\n return v.toString().padStart(2, '0');\n }\n\n private constructCronString(value: AdvancedCronFormValue): string {\n const { seconds, minutes, hours, dayOfMonth, month, dayOfWeek } = value;\n if (this.metadata.fields?.seconds) {\n return `${seconds || '*'} ${minutes || '*'} ${hours || '*'} ${dayOfMonth || '*'} ${month || '*'} ${dayOfWeek || '*'}`;\n }\n return `${minutes || '*'} ${hours || '*'} ${dayOfMonth || '*'} ${month || '*'} ${dayOfWeek || '*'}`;\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n}\n","<div class=\"cron-builder-container\" (focusout)=\"onTouched()\">\n @if (metadata.mode === 'both') {\n <mat-tab-group\n [selectedIndex]=\"selectedTabIndex\"\n (selectedTabChange)=\"onTabChange($event)\"\n >\n <mat-tab label=\"Simple\"></mat-tab>\n <mat-tab label=\"Advanced\"></mat-tab>\n </mat-tab-group>\n }\n\n @if (value) {\n <div class=\"cron-expression\">\n <mat-form-field appearance=\"outline\" class=\"cron-expression-field\">\n <mat-label>CRON Expression</mat-label>\n <input matInput [value]=\"value\" readonly />\n <button\n mat-icon-button\n matSuffix\n (click)=\"copyCron()\"\n [matTooltip]=\"'Copy to clipboard'\"\n aria-label=\"Copy CRON expression\"\n >\n <mat-icon [praxisIcon]=\"'content_copy'\"></mat-icon>\n </button>\n </mat-form-field>\n <button mat-button (click)=\"importCron()\">Import CRON</button>\n </div>\n }\n\n @switch (activeTab) {\n @case ('simple') {\n <div [formGroup]=\"simpleForm\" class=\"simple-mode\">\n <mat-form-field appearance=\"outline\" class=\"preset-select\">\n <mat-label>Preset</mat-label>\n <mat-select formControlName=\"type\">\n <mat-option value=\"everyNMinutes\">A cada X min</mat-option>\n <mat-option value=\"dailyAt\">Diariamente às</mat-option>\n <mat-option value=\"weekly\">Semanal (dias marcados) às</mat-option>\n <mat-option value=\"monthlyDay\">Mensal (dia N) às</mat-option>\n <mat-option value=\"monthlyNthWeekday\">\n Mensal (N-ésima 2ª-feira) às\n </mat-option>\n </mat-select>\n </mat-form-field>\n\n @switch (simpleControls.type.value) {\n @case ('everyNMinutes') {\n <div class=\"preset-body\">\n <mat-slider\n formControlName=\"everyN\"\n min=\"1\"\n max=\"60\"\n step=\"1\"\n thumbLabel\n ></mat-slider>\n <div class=\"cron-hint\">\n A cada {{ simpleControls.everyN.value }} minutos\n </div>\n </div>\n }\n\n @case ('dailyAt') {\n <div class=\"preset-body\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Hora</mat-label>\n <input matInput type=\"time\" formControlName=\"dailyTime\" />\n </mat-form-field>\n <div class=\"cron-hint\">\n Diariamente às {{ simpleControls.dailyTime.value }}\n </div>\n </div>\n }\n\n @case ('weekly') {\n <div class=\"preset-body\">\n <mat-chip-listbox formControlName=\"weeklyDays\" multiple>\n @for (day of weeklyDayOptions; track day) {\n <mat-chip-option [value]=\"day\">\n {{ weekdayLabels[day] }}\n </mat-chip-option>\n }\n </mat-chip-listbox>\n <mat-form-field appearance=\"outline\">\n <mat-label>Hora</mat-label>\n <input matInput type=\"time\" formControlName=\"weeklyTime\" />\n </mat-form-field>\n <div class=\"cron-hint\">\n Semanalmente às {{ simpleControls.weeklyTime.value }}\n </div>\n </div>\n }\n\n @case ('monthlyDay') {\n <div class=\"preset-body\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Dia</mat-label>\n <input\n matInput\n type=\"number\"\n formControlName=\"monthlyDay\"\n min=\"1\"\n max=\"31\"\n />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Hora</mat-label>\n <input matInput type=\"time\" formControlName=\"monthlyTime\" />\n </mat-form-field>\n <div class=\"cron-hint\">\n Dia {{ simpleControls.monthlyDay.value }} às\n {{ simpleControls.monthlyTime.value }}\n </div>\n </div>\n }\n\n @case ('monthlyNthWeekday') {\n <div class=\"preset-body\">\n <mat-form-field appearance=\"outline\">\n <mat-label>N-ésima</mat-label>\n <mat-select formControlName=\"nth\">\n @for (nth of nthOrderOptions; track nth) {\n <mat-option [value]=\"nth\">{{ nth }}ª</mat-option>\n }\n </mat-select>\n </mat-form-field>\n <mat-chip-listbox formControlName=\"nthDay\">\n @for (day of nthDayOptions; track day) {\n <mat-chip-option [value]=\"day\">\n {{ weekdayLabels[day] }}\n </mat-chip-option>\n }\n </mat-chip-listbox>\n <mat-form-field appearance=\"outline\">\n <mat-label>Hora</mat-label>\n <input matInput type=\"time\" formControlName=\"nthTime\" />\n </mat-form-field>\n <div class=\"cron-hint\">\n {{ simpleControls.nth.value }}ª\n {{ weekdayLabels[simpleControls.nthDay.value] }}\n às\n {{ simpleControls.nthTime.value }}\n </div>\n </div>\n }\n }\n </div>\n }\n\n @case ('advanced') {\n <div [formGroup]=\"form\">\n <div class=\"cron-fields\">\n @if (metadata.fields?.minutes) {\n <mat-form-field>\n <mat-label>Minutes</mat-label>\n <input matInput formControlName=\"minutes\" />\n </mat-form-field>\n }\n @if (metadata.fields?.hours) {\n <mat-form-field>\n <mat-label>Hours</mat-label>\n <input matInput formControlName=\"hours\" />\n </mat-form-field>\n }\n @if (metadata.fields?.dom) {\n <mat-form-field>\n <mat-label>Day of Month</mat-label>\n <input matInput formControlName=\"dayOfMonth\" />\n </mat-form-field>\n }\n @if (metadata.fields?.month) {\n <mat-form-field>\n <mat-label>Month</mat-label>\n <input matInput formControlName=\"month\" />\n </mat-form-field>\n }\n @if (metadata.fields?.dow) {\n <mat-form-field>\n <mat-label>Day of Week</mat-label>\n <input matInput formControlName=\"dayOfWeek\" />\n </mat-form-field>\n }\n @if (metadata.fields?.seconds) {\n <mat-form-field>\n <mat-label>Seconds</mat-label>\n <input matInput formControlName=\"seconds\" />\n </mat-form-field>\n }\n </div>\n </div>\n }\n }\n\n <div class=\"cron-feedback\">\n <mat-form-field appearance=\"outline\" class=\"timezone-field\">\n <mat-label>Timezone</mat-label>\n <mat-select [formControl]=\"timezoneControl\">\n @for (tz of timezoneOptions; track tz) {\n <mat-option [value]=\"tz\">\n {{ tz }}\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n\n @if (humanized) {\n <div class=\"humanized-description\" aria-live=\"polite\">\n {{ humanized }}\n <button\n mat-icon-button\n class=\"copy-humanized\"\n (click)=\"copyHumanized()\"\n [matTooltip]=\"'Copy description'\"\n aria-label=\"Copy description\"\n >\n <mat-icon [praxisIcon]=\"'content_copy'\"></mat-icon>\n </button>\n </div>\n }\n\n @if (error) {\n <div class=\"cron-error\">{{ error }}</div>\n }\n\n @if (preview.length > 0) {\n <div class=\"preview-section\">\n <h4>Next Occurrences:</h4>\n <mat-list>\n @for (date of preview; track $index) {\n <mat-list-item>\n {{\n date\n | date\n : \"full\"\n : timezoneControl.value\n : metadata.locale || \"pt-BR\"\n }}\n </mat-list-item>\n }\n </mat-list>\n </div>\n }\n </div>\n\n @if (metadata.hint) {\n <div class=\"cron-hint\">{{ metadata.hint }}</div>\n }\n</div>\n","import { PdxCronBuilderComponent } from './pdx-cron-builder.component';\n\n// Keep this metadata object self-contained to avoid build-time dependency on @praxisui/core types.\nexport const PDX_CRON_BUILDER_COMPONENT_METADATA: any = {\n id: 'pdx-cron-builder',\n selector: 'pdx-cron-builder',\n component: PdxCronBuilderComponent,\n friendlyName: 'Cron (builder)',\n description: 'Editor visual para expressões CRON com validação e presets.',\n icon: 'schedule',\n inputs: [\n { name: 'label', type: 'string', description: 'Rótulo do campo' },\n { name: 'hint', type: 'string', description: 'Texto auxiliar' },\n { name: 'presets', type: 'Array<{ label: string; cron: string }>', description: 'Lista de presets disponíveis' },\n { name: 'enableSeconds', type: 'boolean', description: 'Habilita segundo campo (6 partes)', default: false },\n { name: 'metadata', type: 'any', description: 'Metadados compatíveis com formulários Praxis' },\n ],\n outputs: [\n { name: 'valueChange', type: 'string', description: 'Emite quando a expressão cron muda' },\n ],\n tags: ['widget', 'field', 'cron', 'schedule'],\n lib: '@praxisui/cron-builder',\n};\n","/*\n * Public API Surface of praxis-cron-builder\n */\n\nexport * from './lib/pdx-cron-builder.component';\nexport * from './lib/pdx-cron-builder.metadata';\n// Note: runtime cron libraries are loaded dynamically inside the component to\n// avoid build-time type resolution issues with ng-packagr.\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}