@memberjunction/ng-dashboards 5.23.0 → 5.24.0
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/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +677 -5
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +6879 -1873
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +46 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +758 -491
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +19 -0
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +410 -208
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +17 -17
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +1 -0
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +1 -0
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +1 -0
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.d.ts.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +1 -0
- package/dist/Integration/components/overview/overview.component.js.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.js +1 -0
- package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.js +1 -0
- package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts +411 -0
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +4266 -0
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -0
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +35 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +186 -13
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +1 -0
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +188 -165
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts +75 -0
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +601 -0
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -0
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts +93 -12
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js +637 -107
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/index.d.ts +2 -0
- package/dist/KnowledgeHub/index.d.ts.map +1 -1
- package/dist/KnowledgeHub/index.js +2 -0
- package/dist/KnowledgeHub/index.js.map +1 -1
- package/dist/__tests__/analytics-resource.test.d.ts +2 -0
- package/dist/__tests__/analytics-resource.test.d.ts.map +1 -0
- package/dist/__tests__/analytics-resource.test.js +181 -0
- package/dist/__tests__/analytics-resource.test.js.map +1 -0
- package/dist/__tests__/scheduling.test.d.ts +2 -0
- package/dist/__tests__/scheduling.test.d.ts.map +1 -0
- package/dist/__tests__/scheduling.test.js +205 -0
- package/dist/__tests__/scheduling.test.js.map +1 -0
- package/dist/ai-dashboards.module.d.ts +18 -14
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +25 -5
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +1 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +1 -0
- package/dist/public-api.js.map +1 -1
- package/dist/shared/entity-field-display.d.ts +44 -0
- package/dist/shared/entity-field-display.d.ts.map +1 -0
- package/dist/shared/entity-field-display.js +118 -0
- package/dist/shared/entity-field-display.js.map +1 -0
- package/package.json +47 -46
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schedules.component.d.ts","sourceRoot":"","sources":["../../../../src/Integration/components/schedules/schedules.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,MAAM,EAAE,SAAS,EAAU,MAAM,eAAe,CAAC;AAGxF,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAoD,MAAM,+BAA+B,CAAC;;AAO/G,UAAU,WAAW;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IACzB,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;IAC7C,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,UAAU,WAAW;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,UAAU;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAMD,qBAOa,kBAAmB,SAAQ,qBAAsB,YAAW,MAAM,EAAE,SAAS;IAMxF,SAAS,EAAE,WAAW,EAAE,CAAM;IAC9B,SAAS,UAAQ;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC/B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEhC,6CAA6C;IAC7C,cAAc,oCAA2C;IAEzD,yCAAyC;IACzC,eAAe,EAAE,WAAW,EAAE,CAAM;IACpC,aAAa,EAAE,MAAM,EAAE,CAAM;IAE7B,8BAA8B;IAC9B,eAAe,EAAE,cAAc,EAAE,CAQ/B;IAEF,8BAA8B;IAC9B,WAAW,EAAE,UAAU,EAAE,CAKvB;IAMF,OAAO,CAAC,WAAW,CAAkC;IACrD,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,YAAY,CAA+C;IAEnE,6EAA6E;IAC7E,OAAO,CAAC,QAAQ,CAAC,4BAA4B,CAA0C;IAMjF,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"schedules.component.d.ts","sourceRoot":"","sources":["../../../../src/Integration/components/schedules/schedules.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -448,6 +448,7 @@ let SchedulesComponent = class SchedulesComponent extends BaseResourceComponent
|
|
|
448
448
|
async ngOnInit() {
|
|
449
449
|
this.buildTimelineHours();
|
|
450
450
|
await this.LoadData();
|
|
451
|
+
this.NotifyLoadComplete();
|
|
451
452
|
// Refresh relative times every 60 seconds
|
|
452
453
|
this.refreshTimer = setInterval(() => this.cdr.detectChanges(), 60_000);
|
|
453
454
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schedules.component.js","sourceRoot":"","sources":["../../../../src/Integration/components/schedules/schedules.component.ts","../../../../src/Integration/components/schedules/schedules.component.html"],"names":[],"mappings":"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","sourcesContent":["import { ChangeDetectorRef, Component, OnInit, OnDestroy, inject } from '@angular/core';\nimport { RegisterClass, UUIDsEqual } from '@memberjunction/global';\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { ResourceData, MJCompanyIntegrationEntity, MJScheduledJobEntity } from '@memberjunction/core-entities';\nimport { IntegrationDataService, ResolveIntegrationIcon } from '../../services/integration-data.service';\n\n// ---------------------------------------------------------------------------\n// Data interfaces\n// ---------------------------------------------------------------------------\n\ninterface ScheduleRow {\n ID: string;\n Name: string;\n Integration: string;\n Company: string;\n IsActive: boolean | null;\n ScheduleEnabled: boolean;\n ScheduleType: 'Manual' | 'Interval' | 'Cron';\n ScheduleIntervalMinutes: number | null;\n CronExpression: string | null;\n NextScheduledRunAt: string | null;\n LastScheduledRunAt: string | null;\n IsLocked: boolean;\n LockedAt: string | null;\n ScheduledJobID: string | null;\n}\n\ninterface TimelineMarker {\n Hour: number;\n Minute: number;\n IsNext: boolean;\n}\n\ninterface TimelineRow {\n IntegrationID: string;\n IntegrationName: string;\n Markers: TimelineMarker[];\n IsLocked: boolean;\n}\n\ninterface IntervalPreset {\n Label: string;\n Minutes: number;\n}\n\ninterface CronPreset {\n Label: string;\n Expression: string;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\n@RegisterClass(BaseResourceComponent, 'IntegrationSchedules')\n@Component({\n standalone: false,\n selector: 'app-integration-schedules',\n templateUrl: './schedules.component.html',\n styleUrls: ['./schedules.component.css']\n})\nexport class SchedulesComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n\n // ---------------------------------------------------------------------------\n // Public state\n // ---------------------------------------------------------------------------\n\n Schedules: ScheduleRow[] = [];\n IsLoading = true;\n SavingID: string | null = null;\n RunningID: string | null = null;\n\n /** Track pending edits per integration ID */\n PendingChanges = new Map<string, Partial<ScheduleRow>>();\n\n /** Timeline data built from schedules */\n TimelineMarkers: TimelineRow[] = [];\n TimelineHours: number[] = [];\n\n /** Preset interval choices */\n IntervalPresets: IntervalPreset[] = [\n { Label: '5m', Minutes: 5 },\n { Label: '15m', Minutes: 15 },\n { Label: '30m', Minutes: 30 },\n { Label: '1h', Minutes: 60 },\n { Label: '6h', Minutes: 360 },\n { Label: '12h', Minutes: 720 },\n { Label: '24h', Minutes: 1440 }\n ];\n\n /** Preset cron expressions */\n CronPresets: CronPreset[] = [\n { Label: 'Every hour', Expression: '0 * * * *' },\n { Label: 'Every 6 hours', Expression: '0 */6 * * *' },\n { Label: 'Daily midnight', Expression: '0 0 * * *' },\n { Label: 'Weekdays 9am', Expression: '0 9 * * 1-5' }\n ];\n\n // ---------------------------------------------------------------------------\n // Private\n // ---------------------------------------------------------------------------\n\n private dataService = inject(IntegrationDataService);\n private cdr = inject(ChangeDetectorRef);\n private refreshTimer: ReturnType<typeof setInterval> | null = null;\n\n /** JobTypeID for \"Integration Sync\" scheduled job type (from MJ metadata) */\n private readonly INTEGRATION_SYNC_JOB_TYPE_ID = '4CD34733-4751-4572-B946-17DF6CB3EC90';\n\n // ---------------------------------------------------------------------------\n // Lifecycle\n // ---------------------------------------------------------------------------\n\n async ngOnInit(): Promise<void> {\n this.buildTimelineHours();\n await this.LoadData();\n // Refresh relative times every 60 seconds\n this.refreshTimer = setInterval(() => this.cdr.detectChanges(), 60_000);\n }\n\n ngOnDestroy(): void {\n if (this.refreshTimer) {\n clearInterval(this.refreshTimer);\n this.refreshTimer = null;\n }\n }\n\n // ---------------------------------------------------------------------------\n // Resource overrides\n // ---------------------------------------------------------------------------\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Schedules';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-calendar-check';\n }\n\n // ---------------------------------------------------------------------------\n // Data loading\n // ---------------------------------------------------------------------------\n\n async LoadData(): Promise<void> {\n this.IsLoading = true;\n this.cdr.detectChanges();\n try {\n const provider = this.RunViewToUse;\n const rv = new RunView(provider ?? null);\n const result = await rv.RunView<ScheduleRow>({\n EntityName: 'MJ: Company Integrations',\n ExtraFilter: '',\n OrderBy: 'Name',\n Fields: [\n 'ID', 'Name', 'Integration', 'Company', 'IsActive',\n 'ScheduleEnabled', 'ScheduleType', 'ScheduleIntervalMinutes',\n 'CronExpression', 'NextScheduledRunAt', 'LastScheduledRunAt',\n 'IsLocked', 'LockedAt', 'ScheduledJobID'\n ],\n ResultType: 'simple'\n });\n this.Schedules = result.Results;\n this.BuildTimeline();\n } catch (err) {\n console.error('[SchedulesComponent] Failed to load data:', err);\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n // ---------------------------------------------------------------------------\n // Timeline\n // ---------------------------------------------------------------------------\n\n BuildTimeline(): void {\n const now = new Date();\n const rows: TimelineRow[] = [];\n\n for (const schedule of this.Schedules) {\n if (!schedule.ScheduleEnabled) continue;\n\n const markers = this.computeMarkersForSchedule(schedule, now);\n if (markers.length > 0 || schedule.IsLocked) {\n rows.push({\n IntegrationID: schedule.ID,\n IntegrationName: schedule.Integration ?? schedule.Name,\n Markers: markers,\n IsLocked: schedule.IsLocked\n });\n }\n }\n this.TimelineMarkers = rows;\n }\n\n // ---------------------------------------------------------------------------\n // Schedule editing\n // ---------------------------------------------------------------------------\n\n ToggleScheduleEnabled(integrationID: string): void {\n const schedule = this.findSchedule(integrationID);\n if (!schedule) return;\n\n const current = this.getEffectiveValue(integrationID, 'ScheduleEnabled', schedule.ScheduleEnabled);\n this.setPendingChange(integrationID, 'ScheduleEnabled', !current);\n }\n\n SetScheduleType(integrationID: string, type: 'Manual' | 'Interval' | 'Cron'): void {\n this.setPendingChange(integrationID, 'ScheduleType', type);\n }\n\n SetInterval(integrationID: string, minutes: number): void {\n this.setPendingChange(integrationID, 'ScheduleIntervalMinutes', minutes);\n this.setPendingChange(integrationID, 'ScheduleType', 'Interval');\n }\n\n SetCronExpression(integrationID: string, expression: string): void {\n this.setPendingChange(integrationID, 'CronExpression', expression);\n }\n\n OnCronInputChange(integrationID: string, event: Event): void {\n const input = event.target as HTMLInputElement;\n this.SetCronExpression(integrationID, input.value);\n }\n\n SetCustomInterval(integrationID: string, event: Event): void {\n const input = event.target as HTMLInputElement;\n const value = parseInt(input.value, 10);\n if (!isNaN(value) && value > 0) {\n this.SetInterval(integrationID, value);\n }\n }\n\n HasChanges(integrationID: string): boolean {\n return this.PendingChanges.has(integrationID);\n }\n\n // ---------------------------------------------------------------------------\n // Save & Run\n // ---------------------------------------------------------------------------\n\n async SaveSchedule(integrationID: string): Promise<void> {\n const changes = this.PendingChanges.get(integrationID);\n if (!changes) return;\n\n this.SavingID = integrationID;\n this.cdr.detectChanges();\n\n try {\n const md = new Metadata();\n const entity = await md.GetEntityObject<MJCompanyIntegrationEntity>('MJ: Company Integrations');\n await entity.Load(integrationID);\n\n // Resolve effective values (pending change wins over stored value)\n const scheduleEnabled = changes.ScheduleEnabled ?? (entity.Get('ScheduleEnabled') as boolean);\n const scheduleType = (changes.ScheduleType ?? entity.Get('ScheduleType') as string) as 'Manual' | 'Interval' | 'Cron';\n const cronExpression = changes.CronExpression ?? (entity.Get('CronExpression') as string | null);\n const intervalMinutes = changes.ScheduleIntervalMinutes ?? (entity.Get('ScheduleIntervalMinutes') as number | null);\n\n // Apply schedule fields to the entity\n if (changes.ScheduleEnabled !== undefined) entity.Set('ScheduleEnabled', changes.ScheduleEnabled);\n if (changes.ScheduleType !== undefined) entity.Set('ScheduleType', changes.ScheduleType);\n if (changes.ScheduleIntervalMinutes !== undefined) entity.Set('ScheduleIntervalMinutes', changes.ScheduleIntervalMinutes);\n if (changes.CronExpression !== undefined) entity.Set('CronExpression', changes.CronExpression);\n\n // Create/update/disable the linked ScheduledJob so the scheduler actually fires\n await this.SyncScheduledJob(entity, scheduleEnabled, scheduleType, cronExpression, intervalMinutes, integrationID);\n\n const saved = await entity.Save();\n if (saved) {\n this.PendingChanges.delete(integrationID);\n await this.LoadData();\n } else {\n console.error('[SchedulesComponent] Failed to save schedule:', entity.LatestResult?.CompleteMessage);\n }\n } catch (err) {\n console.error('[SchedulesComponent] Error saving schedule:', err);\n } finally {\n this.SavingID = null;\n this.cdr.detectChanges();\n }\n }\n\n // ---------------------------------------------------------------------------\n // Scheduled job sync helpers\n // ---------------------------------------------------------------------------\n\n /**\n * Creates, updates, or disables the ScheduledJob record linked to this integration.\n * When enabled with a real schedule type, ensures an Active ScheduledJob exists.\n * When disabled or set to Manual, marks the ScheduledJob as Disabled (if one exists).\n */\n private async SyncScheduledJob(\n entity: MJCompanyIntegrationEntity,\n enabled: boolean,\n scheduleType: 'Manual' | 'Interval' | 'Cron',\n cronExpression: string | null,\n intervalMinutes: number | null,\n integrationID: string\n ): Promise<void> {\n const effectiveCron = this.ResolveCronExpression(scheduleType, cronExpression, intervalMinutes);\n const existingJobID = entity.Get('ScheduledJobID') as string | null;\n const shouldBeActive = enabled && scheduleType !== 'Manual' && !!effectiveCron;\n\n if (shouldBeActive) {\n const jobID = await this.UpsertScheduledJob(existingJobID, entity, effectiveCron!, integrationID);\n if (jobID !== existingJobID) {\n entity.Set('ScheduledJobID', jobID);\n }\n } else if (existingJobID) {\n await this.DisableScheduledJob(existingJobID);\n }\n }\n\n /** Converts schedule type + config into a cron expression. */\n private ResolveCronExpression(\n scheduleType: 'Manual' | 'Interval' | 'Cron',\n cronExpression: string | null,\n intervalMinutes: number | null\n ): string | null {\n if (scheduleType === 'Cron') return cronExpression;\n if (scheduleType === 'Interval' && intervalMinutes) return this.IntervalToCron(intervalMinutes);\n return null;\n }\n\n /** Converts an interval in minutes to an equivalent cron expression. */\n private IntervalToCron(minutes: number): string {\n if (minutes < 60) return `*/${minutes} * * * *`;\n const hours = minutes / 60;\n if (Number.isInteger(hours)) return hours === 1 ? '0 * * * *' : `0 */${hours} * * *`;\n return `*/${minutes} * * * *`;\n }\n\n /**\n * Creates a new ScheduledJob or updates the existing one.\n * Returns the ID of the job (new or existing).\n */\n private async UpsertScheduledJob(\n existingJobID: string | null,\n entity: MJCompanyIntegrationEntity,\n cronExpression: string,\n integrationID: string\n ): Promise<string> {\n const md = new Metadata();\n\n if (existingJobID) {\n const job = await md.GetEntityObject<MJScheduledJobEntity>('MJ: Scheduled Jobs');\n const loaded = await job.Load(existingJobID);\n if (loaded) {\n job.Set('CronExpression', cronExpression);\n job.Set('Status', 'Active');\n // Reset NextRunAt so the scheduler picks up the new cron immediately\n job.Set('NextRunAt', new Date());\n await job.Save();\n return existingJobID;\n }\n }\n\n // No existing job (or failed to load) — create a new one\n const integrationName = (entity.Get('Name') as string) ?? (entity.Get('Integration') as string) ?? 'Integration';\n const job = await md.GetEntityObject<MJScheduledJobEntity>('MJ: Scheduled Jobs');\n job.NewRecord();\n job.Set('Name', `${integrationName} Sync`);\n job.Set('JobTypeID', this.INTEGRATION_SYNC_JOB_TYPE_ID);\n job.Set('CronExpression', cronExpression);\n job.Set('Timezone', 'UTC');\n job.Set('Status', 'Active');\n job.Set('ConcurrencyMode', 'Skip');\n job.Set('Configuration', JSON.stringify({ CompanyIntegrationID: integrationID }));\n // Set NextRunAt to now so the scheduler fires it on next poll without needing a restart\n job.Set('NextRunAt', new Date());\n await job.Save();\n return job.Get('ID') as string;\n }\n\n /** Sets an existing ScheduledJob to Disabled so it stops firing. */\n private async DisableScheduledJob(jobID: string): Promise<void> {\n const md = new Metadata();\n const job = await md.GetEntityObject<MJScheduledJobEntity>('MJ: Scheduled Jobs');\n const loaded = await job.Load(jobID);\n if (loaded) {\n job.Set('Status', 'Disabled');\n await job.Save();\n }\n }\n\n async RunNow(integrationID: string): Promise<void> {\n if (this.RunningID) return;\n this.RunningID = integrationID;\n this.cdr.detectChanges();\n\n try {\n const result = await this.dataService.RunSync(integrationID);\n if (!result.Success) {\n console.error('[SchedulesComponent] RunSync failed:', result.Message);\n }\n await this.LoadData();\n } catch (err) {\n console.error('[SchedulesComponent] RunNow error:', err);\n } finally {\n this.RunningID = null;\n this.cdr.detectChanges();\n }\n }\n\n // ---------------------------------------------------------------------------\n // Template helpers\n // ---------------------------------------------------------------------------\n\n GetEffectiveScheduleEnabled(schedule: ScheduleRow): boolean {\n return this.getEffectiveValue(schedule.ID, 'ScheduleEnabled', schedule.ScheduleEnabled) as boolean;\n }\n\n GetEffectiveScheduleType(schedule: ScheduleRow): 'Manual' | 'Interval' | 'Cron' {\n return this.getEffectiveValue(schedule.ID, 'ScheduleType', schedule.ScheduleType) as 'Manual' | 'Interval' | 'Cron';\n }\n\n GetEffectiveInterval(schedule: ScheduleRow): number | null {\n return this.getEffectiveValue(schedule.ID, 'ScheduleIntervalMinutes', schedule.ScheduleIntervalMinutes) as number | null;\n }\n\n GetEffectiveCron(schedule: ScheduleRow): string | null {\n return this.getEffectiveValue(schedule.ID, 'CronExpression', schedule.CronExpression) as string | null;\n }\n\n IsIntervalSelected(schedule: ScheduleRow, minutes: number): boolean {\n return this.GetEffectiveInterval(schedule) === minutes;\n }\n\n GetNextRunRelative(schedule: ScheduleRow): string {\n if (!schedule.NextScheduledRunAt) return 'Not scheduled';\n const next = new Date(schedule.NextScheduledRunAt);\n const diffMs = next.getTime() - Date.now();\n if (diffMs < 0) return 'Overdue';\n return 'in ' + this.formatDurationMs(diffMs);\n }\n\n GetLastRunRelative(schedule: ScheduleRow): string {\n if (!schedule.LastScheduledRunAt) return 'Never';\n return this.dataService.ComputeRelativeTime(schedule.LastScheduledRunAt);\n }\n\n GetCronDescription(expression: string | null): string {\n if (!expression) return '';\n const parts = expression.split(' ');\n if (parts.length !== 5) return expression;\n const [min, hour, , , dow] = parts;\n if (min === '0' && hour === '*') return 'Every hour';\n if (min === '0' && hour.startsWith('*/')) return `Every ${hour.slice(2)} hours`;\n if (min === '0' && hour !== '*' && dow === '*') return `Daily at ${hour}:00`;\n if (min === '0' && hour !== '*' && dow === '1-5') return `Weekdays at ${hour}:00`;\n if (dow === '1-5') return `Weekdays at ${hour}:${min.padStart(2, '0')}`;\n return expression;\n }\n\n GetIntegrationIcon(name: string): string {\n return ResolveIntegrationIcon(name);\n }\n\n ComputeTimelinePosition(hour: number, minute: number): number {\n return ((hour * 60 + minute) / (24 * 60)) * 100;\n }\n\n IsSaving(integrationID: string): boolean {\n return UUIDsEqual(this.SavingID, integrationID);\n }\n\n IsRunning(integrationID: string): boolean {\n return UUIDsEqual(this.RunningID, integrationID);\n }\n\n get ScheduledCount(): number {\n return this.Schedules.filter(s => s.ScheduleEnabled).length;\n }\n\n get LockedCount(): number {\n return this.Schedules.filter(s => s.IsLocked).length;\n }\n\n TrackByID(_index: number, item: ScheduleRow): string {\n return item.ID;\n }\n\n TrackTimelineByID(_index: number, item: TimelineRow): string {\n return item.IntegrationID;\n }\n\n TrackPresetByMinutes(_index: number, item: IntervalPreset): number {\n return item.Minutes;\n }\n\n TrackCronPresetByExpr(_index: number, item: CronPreset): string {\n return item.Expression;\n }\n\n TrackHour(_index: number, hour: number): number {\n return hour;\n }\n\n TrackMarker(index: number, _item: TimelineMarker): number {\n return index;\n }\n\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n\n private findSchedule(integrationID: string): ScheduleRow | undefined {\n return this.Schedules.find(s => UUIDsEqual(s.ID, integrationID));\n }\n\n private getEffectiveValue<K extends keyof ScheduleRow>(\n integrationID: string,\n field: K,\n originalValue: ScheduleRow[K]\n ): ScheduleRow[K] {\n const changes = this.PendingChanges.get(integrationID);\n if (changes && field in changes) {\n return changes[field] as ScheduleRow[K];\n }\n return originalValue;\n }\n\n private setPendingChange<K extends keyof ScheduleRow>(\n integrationID: string,\n field: K,\n value: ScheduleRow[K]\n ): void {\n const existing = this.PendingChanges.get(integrationID) ?? {};\n existing[field] = value;\n this.PendingChanges.set(integrationID, existing);\n this.cdr.detectChanges();\n }\n\n private buildTimelineHours(): void {\n this.TimelineHours = Array.from({ length: 24 }, (_, i) => i);\n }\n\n private computeMarkersForSchedule(schedule: ScheduleRow, now: Date): TimelineMarker[] {\n const markers: TimelineMarker[] = [];\n const type = schedule.ScheduleType;\n\n if (type === 'Interval' && schedule.ScheduleIntervalMinutes && schedule.ScheduleIntervalMinutes > 0) {\n this.computeIntervalMarkers(schedule, now, markers);\n } else if (type === 'Cron' && schedule.CronExpression) {\n this.computeCronMarkers(schedule, now, markers);\n } else if (schedule.NextScheduledRunAt) {\n this.addNextRunMarker(schedule, now, markers);\n }\n\n return markers;\n }\n\n private computeIntervalMarkers(schedule: ScheduleRow, now: Date, markers: TimelineMarker[]): void {\n const intervalMs = schedule.ScheduleIntervalMinutes! * 60_000;\n const endTime = now.getTime() + 24 * 60 * 60_000;\n\n // Start from the next scheduled run or from now\n let cursor = schedule.NextScheduledRunAt\n ? new Date(schedule.NextScheduledRunAt).getTime()\n : now.getTime();\n\n // If cursor is in the past, advance to the next future occurrence\n while (cursor < now.getTime()) {\n cursor += intervalMs;\n }\n\n const nextRun = cursor;\n\n while (cursor < endTime) {\n const d = new Date(cursor);\n markers.push({\n Hour: d.getHours(),\n Minute: d.getMinutes(),\n IsNext: cursor === nextRun\n });\n cursor += intervalMs;\n }\n }\n\n private computeCronMarkers(schedule: ScheduleRow, now: Date, markers: TimelineMarker[]): void {\n // Simple cron approximation for timeline display\n const times = this.approximateCronTimes(schedule.CronExpression!);\n const nextRunTime = schedule.NextScheduledRunAt ? new Date(schedule.NextScheduledRunAt) : null;\n\n for (const time of times) {\n const isNext = nextRunTime != null\n && time.Hour === nextRunTime.getHours()\n && time.Minute === nextRunTime.getMinutes();\n markers.push({ Hour: time.Hour, Minute: time.Minute, IsNext: isNext });\n }\n }\n\n private addNextRunMarker(schedule: ScheduleRow, now: Date, markers: TimelineMarker[]): void {\n const next = new Date(schedule.NextScheduledRunAt!);\n const diffMs = next.getTime() - now.getTime();\n if (diffMs >= 0 && diffMs <= 24 * 60 * 60_000) {\n markers.push({ Hour: next.getHours(), Minute: next.getMinutes(), IsNext: true });\n }\n }\n\n /**\n * Approximate cron schedule times within a 24-hour window.\n * Handles common patterns only -- not a full cron parser.\n */\n private approximateCronTimes(expression: string): Array<{ Hour: number; Minute: number }> {\n const parts = expression.split(' ');\n if (parts.length !== 5) return [];\n const [minPart, hourPart] = parts;\n const minute = minPart === '*' ? 0 : parseInt(minPart, 10);\n const times: Array<{ Hour: number; Minute: number }> = [];\n\n if (hourPart === '*') {\n // Every hour\n for (let h = 0; h < 24; h++) {\n times.push({ Hour: h, Minute: isNaN(minute) ? 0 : minute });\n }\n } else if (hourPart.startsWith('*/')) {\n const step = parseInt(hourPart.slice(2), 10);\n if (!isNaN(step) && step > 0) {\n for (let h = 0; h < 24; h += step) {\n times.push({ Hour: h, Minute: isNaN(minute) ? 0 : minute });\n }\n }\n } else {\n // Specific hour(s) — comma-separated\n const hours = hourPart.split(',').map(h => parseInt(h.trim(), 10)).filter(h => !isNaN(h));\n for (const h of hours) {\n times.push({ Hour: h, Minute: isNaN(minute) ? 0 : minute });\n }\n }\n\n return times;\n }\n\n private formatDurationMs(ms: number): string {\n const totalMinutes = Math.floor(ms / 60_000);\n if (totalMinutes < 1) return 'less than a minute';\n if (totalMinutes < 60) return `${totalMinutes} minute${totalMinutes === 1 ? '' : 's'}`;\n const hours = Math.floor(totalMinutes / 60);\n const minutes = totalMinutes % 60;\n if (minutes === 0) return `${hours} hour${hours === 1 ? '' : 's'}`;\n return `${hours}h ${minutes}m`;\n }\n}\n\nexport function LoadSchedulesComponent(): void {\n // Tree-shaking prevention: importing this module causes\n // @RegisterClass decorators to fire, registering components.\n}\n","<!-- Loading state -->\n@if (IsLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading schedules...\"></mj-loading>\n </div>\n} @else {\n <div class=\"schedules-root\">\n\n <!-- ================================================================= -->\n <!-- HEADER -->\n <!-- ================================================================= -->\n <div class=\"section-header\">\n <div class=\"header-left\">\n <h2 class=\"section-title\">\n <i class=\"fa-solid fa-calendar-check\"></i>\n Sync Schedules\n </h2>\n <span class=\"header-meta\">{{ Schedules.length }} integration{{ Schedules.length === 1 ? '' : 's' }}</span>\n <span class=\"header-meta\">{{ ScheduledCount }} scheduled</span>\n @if (LockedCount > 0) {\n <span class=\"header-meta running-badge\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n {{ LockedCount }} running\n </span>\n }\n </div>\n <button class=\"btn btn-outline\" (click)=\"LoadData()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n Refresh\n </button>\n </div>\n\n <!-- ================================================================= -->\n <!-- TIMELINE (24-hour visual) -->\n <!-- ================================================================= -->\n @if (TimelineMarkers.length > 0) {\n <div class=\"timeline-section\">\n <div class=\"timeline-title\">\n <i class=\"fa-regular fa-clock\"></i>\n Next 24 Hours\n </div>\n <div class=\"timeline-container\">\n <!-- Hour grid labels -->\n <div class=\"timeline-grid-labels\">\n <div class=\"timeline-label-spacer\"></div>\n <div class=\"timeline-grid-track\">\n @for (hour of TimelineHours; track TrackHour($index, hour)) {\n @if (hour % 4 === 0) {\n <span class=\"timeline-hour-label\"\n [style.left.%]=\"ComputeTimelinePosition(hour, 0)\">\n {{ hour }}:00\n </span>\n }\n }\n </div>\n </div>\n\n <!-- Integration rows -->\n @for (row of TimelineMarkers; track TrackTimelineByID($index, row)) {\n <div class=\"timeline-row\">\n <div class=\"timeline-row-label\" [title]=\"row.IntegrationName\">\n {{ row.IntegrationName }}\n </div>\n <div class=\"timeline-track-container\">\n <!-- Hour grid lines -->\n @for (hour of TimelineHours; track TrackHour($index, hour)) {\n @if (hour % 4 === 0) {\n <div class=\"timeline-grid-line\"\n [style.left.%]=\"ComputeTimelinePosition(hour, 0)\">\n </div>\n }\n }\n\n <!-- Track bar -->\n <div class=\"timeline-track\"></div>\n\n <!-- Markers -->\n @for (marker of row.Markers; track TrackMarker($index, marker)) {\n <div class=\"timeline-marker\"\n [class.timeline-marker-next]=\"marker.IsNext\"\n [style.left.%]=\"ComputeTimelinePosition(marker.Hour, marker.Minute)\"\n [title]=\"marker.Hour + ':' + ('' + marker.Minute).padStart(2, '0')\">\n </div>\n }\n\n <!-- Locked indicator -->\n @if (row.IsLocked) {\n <div class=\"timeline-locked-indicator\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n </div>\n }\n\n <!-- Current time line -->\n <div class=\"timeline-now-line\"></div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- ================================================================= -->\n <!-- SCHEDULE CARDS -->\n <!-- ================================================================= -->\n <div class=\"cards-section\">\n @for (schedule of Schedules; track TrackByID($index, schedule)) {\n <div class=\"schedule-card\" [class.schedule-card-disabled]=\"!schedule.IsActive\">\n\n <!-- LEFT: Icon + Info -->\n <div class=\"card-info\">\n <div class=\"card-icon\">\n <i [class]=\"GetIntegrationIcon(schedule.Integration || schedule.Name)\"></i>\n </div>\n <div class=\"card-details\">\n <div class=\"card-name\">{{ schedule.Integration || schedule.Name }}</div>\n <div class=\"card-company\">{{ schedule.Company }}</div>\n <div class=\"card-badges\">\n @if (schedule.IsActive) {\n <span class=\"badge badge-success\">Active</span>\n } @else {\n <span class=\"badge badge-gray\">Inactive</span>\n }\n @if (schedule.IsLocked) {\n <span class=\"badge badge-running\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Running\n </span>\n }\n </div>\n </div>\n </div>\n\n <!-- CENTER: Schedule Configuration -->\n <div class=\"card-config\">\n <!-- Schedule toggle -->\n <div class=\"config-row\">\n <label class=\"toggle-label\">\n Auto-sync\n <button class=\"toggle-switch\"\n [class.toggle-on]=\"GetEffectiveScheduleEnabled(schedule)\"\n (click)=\"ToggleScheduleEnabled(schedule.ID)\"\n [attr.aria-checked]=\"GetEffectiveScheduleEnabled(schedule)\"\n role=\"switch\">\n <span class=\"toggle-knob\"></span>\n </button>\n </label>\n </div>\n\n @if (GetEffectiveScheduleEnabled(schedule)) {\n <!-- Schedule type pills -->\n <div class=\"config-row\">\n <div class=\"type-pills\">\n <button class=\"type-pill\"\n [class.type-pill-active]=\"GetEffectiveScheduleType(schedule) === 'Manual'\"\n (click)=\"SetScheduleType(schedule.ID, 'Manual')\">\n Manual\n </button>\n <button class=\"type-pill\"\n [class.type-pill-active]=\"GetEffectiveScheduleType(schedule) === 'Interval'\"\n (click)=\"SetScheduleType(schedule.ID, 'Interval')\">\n Interval\n </button>\n <button class=\"type-pill\"\n [class.type-pill-active]=\"GetEffectiveScheduleType(schedule) === 'Cron'\"\n (click)=\"SetScheduleType(schedule.ID, 'Cron')\">\n Cron\n </button>\n </div>\n </div>\n\n <!-- Interval config -->\n @if (GetEffectiveScheduleType(schedule) === 'Interval') {\n <div class=\"config-row\">\n <div class=\"interval-presets\">\n @for (preset of IntervalPresets; track TrackPresetByMinutes($index, preset)) {\n <button class=\"preset-btn\"\n [class.preset-btn-active]=\"IsIntervalSelected(schedule, preset.Minutes)\"\n (click)=\"SetInterval(schedule.ID, preset.Minutes)\">\n {{ preset.Label }}\n </button>\n }\n </div>\n <div class=\"custom-interval\">\n <input type=\"number\"\n class=\"interval-input\"\n placeholder=\"Custom min\"\n min=\"1\"\n [value]=\"GetEffectiveInterval(schedule)\"\n (change)=\"SetCustomInterval(schedule.ID, $event)\" />\n <span class=\"interval-unit\">min</span>\n </div>\n </div>\n }\n\n <!-- Cron config -->\n @if (GetEffectiveScheduleType(schedule) === 'Cron') {\n <div class=\"config-row\">\n <div class=\"cron-presets\">\n @for (preset of CronPresets; track TrackCronPresetByExpr($index, preset)) {\n <button class=\"preset-btn\"\n [class.preset-btn-active]=\"GetEffectiveCron(schedule) === preset.Expression\"\n (click)=\"SetCronExpression(schedule.ID, preset.Expression)\">\n {{ preset.Label }}\n </button>\n }\n </div>\n <div class=\"cron-input-row\">\n <input type=\"text\"\n class=\"cron-input\"\n placeholder=\"* * * * *\"\n [value]=\"GetEffectiveCron(schedule) ?? ''\"\n (change)=\"OnCronInputChange(schedule.ID, $event)\" />\n @if (GetEffectiveCron(schedule)) {\n <span class=\"cron-description\">\n {{ GetCronDescription(GetEffectiveCron(schedule)) }}\n </span>\n }\n </div>\n </div>\n }\n }\n </div>\n\n <!-- RIGHT: Status + Actions -->\n <div class=\"card-status\">\n <div class=\"status-items\">\n <div class=\"status-item\">\n <span class=\"status-label\">Next run</span>\n <span class=\"status-value\">{{ GetNextRunRelative(schedule) }}</span>\n </div>\n <div class=\"status-item\">\n <span class=\"status-label\">Last run</span>\n <span class=\"status-value\">{{ GetLastRunRelative(schedule) }}</span>\n </div>\n <div class=\"status-item\">\n <span class=\"status-label\">Status</span>\n @if (schedule.IsLocked) {\n <span class=\"status-value status-running\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Running\n </span>\n } @else {\n <span class=\"status-value status-idle\">Idle</span>\n }\n </div>\n </div>\n\n <div class=\"card-actions\">\n @if (HasChanges(schedule.ID)) {\n <button class=\"btn btn-primary btn-save\"\n [disabled]=\"IsSaving(schedule.ID)\"\n (click)=\"SaveSchedule(schedule.ID)\">\n @if (IsSaving(schedule.ID)) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Saving...\n } @else {\n <i class=\"fa-solid fa-check\"></i>\n Save\n }\n </button>\n }\n <button class=\"btn btn-outline btn-run\"\n [disabled]=\"IsRunning(schedule.ID) || schedule.IsLocked\"\n (click)=\"RunNow(schedule.ID)\">\n @if (IsRunning(schedule.ID)) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Running...\n } @else {\n <i class=\"fa-solid fa-play\"></i>\n Run Now\n }\n </button>\n </div>\n </div>\n </div>\n }\n\n @if (Schedules.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-calendar-xmark\"></i>\n <p>No integrations found</p>\n </div>\n }\n </div>\n </div>\n}\n"]}
|
|
1
|
+
{"version":3,"file":"schedules.component.js","sourceRoot":"","sources":["../../../../src/Integration/components/schedules/schedules.component.ts","../../../../src/Integration/components/schedules/schedules.component.html"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAqB,MAAM,EAAE,MAAM,eAAe,CAAC;AACxF,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;;;;ICHvG,8BAA+B;IAC7B,gCAAqD;IACvD,iBAAM;;;IAgBE,+BAAwC;IACtC,wBAA2C;IAC3C,YACF;IAAA,iBAAO;;;IADL,eACF;IADE,2DACF;;;IAyBQ,gCACwD;IACtD,YACF;IAAA,iBAAO;;;;IAFD,uEAAiD;IACrD,cACF;IADE,2CACF;;;IAJF,yHAAsB;;;IAAtB,4CAKC;;;IAeG,0BAEM;;;;IADD,uEAAiD;;;IAFxD,+HAAsB;;;IAAtB,4CAIC;;;IAQD,0BAIM;;;;IAFD,6FAAoE;IADpE,wDAA4C;IAE5C,uFAAmE;;;IAMxE,+BAAuC;IACrC,wBAA2C;IAC7C,iBAAM;;;IA7BV,AADF,+BAA0B,cACsC;IAC5D,YACF;IAAA,iBAAM;IACN,+BAAsC;IAEpC,yJAMC;IAGD,0BAAkC;IAGlC,0JAMC;IAGD,yHAAoB;IAOpB,2BAAqC;IAEzC,AADE,iBAAM,EACF;;;;IAnC4B,cAA6B;IAA7B,8CAA6B;IAC3D,cACF;IADE,uDACF;IAGE,eAMC;IAND,mCAMC;IAMD,eAMC;IAND,6BAMC;IAGD,eAIC;IAJD,0CAIC;;;IArDT,AADF,+BAA8B,cACA;IAC1B,wBAAmC;IACnC,+BACF;IAAA,iBAAM;IAGJ,AAFF,+BAAgC,cAEI;IAChC,0BAAyC;IACzC,+BAAiC;IAC/B,kJAOC;IAEL,AADE,iBAAM,EACF;IAGN,4JAsCC;IAEL,AADE,iBAAM,EACF;;;IApDE,eAOC;IAPD,mCAOC;IAKL,eAsCC;IAtCD,qCAsCC;;;IAsBO,gCAAkC;IAAA,sBAAM;IAAA,iBAAO;;;IAE/C,gCAA+B;IAAA,wBAAQ;IAAA,iBAAO;;;IAG9C,gCAAkC;IAChC,wBAA2C;IAC3C,yBACF;IAAA,iBAAO;;;;IAiDH,kCAE2D;IAAnD,kTAAS,sDAAwC,KAAC;IACxD,YACF;IAAA,iBAAS;;;;;IAHD,+FAAwE;IAE9E,cACF;IADE,iDACF;;;;IANJ,AADF,+BAAwB,cACQ;IAC5B,oLAMC;IACH,iBAAM;IAEJ,AADF,+BAA6B,gBAMgC;IAApD,sRAAU,gDAAsC,KAAC;IALxD,iBAK2D;IAC3D,gCAA4B;IAAA,mBAAG;IAEnC,AADE,AADiC,iBAAO,EAClC,EACF;;;;IAjBF,eAMC;IAND,qCAMC;IAOM,eAAwC;IAAxC,gEAAwC;;;;IAY7C,kCAEoE;IAA5D,kTAAS,+DAAiD,KAAC;IACjE,YACF;IAAA,iBAAS;;;;;IAHD,mGAA4E;IAElF,cACF;IADE,iDACF;;;IAUA,gCAA+B;IAC7B,YACF;IAAA,iBAAO;;;;IADL,cACF;IADE,gGACF;;;;IAlBJ,AADF,+BAAwB,cACI;IACxB,qLAMC;IACH,iBAAM;IAEJ,AADF,+BAA4B,gBAKiC;IAApD,sRAAU,gDAAsC,KAAC;IAJxD,iBAI2D;IAC3D,wIAAkC;IAMtC,AADE,iBAAM,EACF;;;;IApBF,eAMC;IAND,iCAMC;IAMM,eAA0C;IAA1C,kEAA0C;IAEjD,cAIC;IAJD,+DAIC;;;;IAhEH,AADF,AADF,+BAAwB,cACE,iBAGmC;IAAjD,+PAAS,uCAA6B,QAAQ,CAAC,KAAC;IACtD,wBACF;IAAA,iBAAS;IACT,kCAE2D;IAAnD,+PAAS,uCAA6B,UAAU,CAAC,KAAC;IACxD,0BACF;IAAA,iBAAS;IACT,kCAEuD;IAA/C,+PAAS,uCAA6B,MAAM,CAAC,KAAC;IACpD,sBACF;IAEJ,AADE,AADE,iBAAS,EACL,EACF;IAGN,yHAAyD;IAwBzD,yHAAqD;;;;IA1CzC,eAA0E;IAA1E,6FAA0E;IAK1E,eAA4E;IAA5E,+FAA4E;IAK5E,eAAwE;IAAxE,2FAAwE;IAQpF,eAqBC;IArBD,sFAqBC;IAGD,cAwBC;IAxBD,kFAwBC;;;IAkBG,gCAA0C;IACxC,wBAA2C;IAC3C,yBACF;IAAA,iBAAO;;;IAEP,gCAAuC;IAAA,oBAAI;IAAA,iBAAO;;;IAWhD,wBAA2C;IAC3C,2BACF;;;IACE,wBAAiC;IACjC,sBACF;;;;IATF,kCAE4C;IAApC,gQAAS,mCAAyB,KAAC;IAIvC,AAHF,8GAA6B,wFAGpB;IAIX,iBAAS;;;;IATD,0DAAkC;IAExC,cAMC;IAND,yDAMC;;;IAOD,wBAA2C;IAC3C,4BACF;;;IACE,wBAAgC;IAChC,yBACF;;;;IAhKJ,AADF,AAHF,+BAA+E,cAGtD,cACE;IACrB,oBAA2E;IAC7E,iBAAM;IAEJ,AADF,+BAA0B,cACD;IAAA,YAA2C;IAAA,iBAAM;IACxE,+BAA0B;IAAA,YAAsB;IAAA,iBAAM;IACtD,+BAAyB;IAGrB,AAFF,6GAAyB,uFAEhB;IAGT,6GAAyB;IAQ/B,AADE,AADE,iBAAM,EACF,EACF;IAMF,AADF,AAFF,gCAAyB,eAEC,iBACM;IAC1B,4BACA;IAAA,mCAIsB;IAFd,6NAAS,4CAAkC,KAAC;IAGlD,4BAAiC;IAGvC,AADE,AADE,iBAAS,EACH,EACJ;IAEN,kGAA6C;IAyE/C,iBAAM;IAMA,AADF,AADF,AADF,gCAAyB,eACG,eACC,gBACI;IAAA,yBAAQ;IAAA,iBAAO;IAC1C,iCAA2B;IAAA,aAAkC;IAC/D,AAD+D,iBAAO,EAChE;IAEJ,AADF,gCAAyB,gBACI;IAAA,yBAAQ;IAAA,iBAAO;IAC1C,iCAA2B;IAAA,aAAkC;IAC/D,AAD+D,iBAAO,EAChE;IAEJ,AADF,gCAAyB,gBACI;IAAA,uBAAM;IAAA,iBAAO;IAMtC,AALF,6GAAyB,uFAKhB;IAIb,AADE,iBAAM,EACF;IAEN,gCAA0B;IACxB,+GAA+B;IAa/B,mCAEsC;IAA9B,6NAAS,6BAAmB,KAAC;IAIjC,AAHF,iGAA8B,2EAGrB;IAOjB,AADE,AADE,AADE,iBAAS,EACL,EACF,EACF;;;;IAxKqB,+DAAmD;IAKrE,eAAmE;IAAnE,qFAAmE;IAG/C,eAA2C;IAA3C,iEAA2C;IACxC,eAAsB;IAAtB,yCAAsB;IAE9C,eAIC;IAJD,gDAIC;IACD,eAKC;IALD,gDAKC;IAYO,eAAyD;IAAzD,4EAAyD;;IASrE,eAwEC;IAxED,2EAwEC;IAQ8B,eAAkC;IAAlC,4DAAkC;IAIlC,eAAkC;IAAlC,4DAAkC;IAI7D,eAOC;IAPD,gDAOC;IAKH,eAYC;IAZD,6DAYC;IAEO,cAAwD;IAAxD,mFAAwD;IAE9D,cAMC;IAND,4DAMC;;;IAQT,+BAAyB;IACvB,wBAA0C;IAC1C,yBAAG;IAAA,qCAAqB;IAC1B,AAD0B,iBAAI,EACxB;;;;IA5QN,AADF,AADF,AALF,8BAA4B,aAKE,aACD,YACG;IACxB,uBAA0C;IAC1C,gCACF;IAAA,iBAAK;IACL,+BAA0B;IAAA,YAAyE;IAAA,iBAAO;IAC1G,+BAA0B;IAAA,YAA8B;IAAA,iBAAO;IAC/D,qGAAuB;IAMzB,iBAAM;IACN,kCAAqD;IAArB,uLAAS,iBAAU,KAAC;IAClD,yBAAyC;IACzC,0BACF;IACF,AADE,iBAAS,EACL;IAKN,sGAAkC;IAqElC,gCAA2B;IACzB,sIA0KC;IAED,qGAA8B;IAOlC,AADE,iBAAM,EACF;;;IA3Q0B,eAAyE;IAAzE,4GAAyE;IACzE,eAA8B;IAA9B,8DAA8B;IACxD,cAKC;IALD,kDAKC;IAWL,eAgEC;IAhED,6DAgEC;IAMC,eA0KC;IA1KD,+BA0KC;IAED,eAKC;IALD,yDAKC;;ADvOP,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AASvE,IAAM,kBAAkB,GAAxB,MAAM,kBAAmB,SAAQ,qBAAqB;IAE3D,8EAA8E;IAC9E,eAAe;IACf,8EAA8E;IAE9E,SAAS,GAAkB,EAAE,CAAC;IAC9B,SAAS,GAAG,IAAI,CAAC;IACjB,QAAQ,GAAkB,IAAI,CAAC;IAC/B,SAAS,GAAkB,IAAI,CAAC;IAEhC,6CAA6C;IAC7C,cAAc,GAAG,IAAI,GAAG,EAAgC,CAAC;IAEzD,yCAAyC;IACzC,eAAe,GAAkB,EAAE,CAAC;IACpC,aAAa,GAAa,EAAE,CAAC;IAE7B,8BAA8B;IAC9B,eAAe,GAAqB;QAClC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE;QAC3B,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE;QAC7B,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE;QAC7B,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;QAC5B,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE;QAC7B,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE;QAC9B,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE;KAChC,CAAC;IAEF,8BAA8B;IAC9B,WAAW,GAAiB;QAC1B,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE;QAChD,EAAE,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,aAAa,EAAE;QACrD,EAAE,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE;QACpD,EAAE,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,aAAa,EAAE;KACrD,CAAC;IAEF,8EAA8E;IAC9E,UAAU;IACV,8EAA8E;IAEtE,WAAW,GAAG,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAC7C,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAChC,YAAY,GAA0C,IAAI,CAAC;IAEnE,6EAA6E;IAC5D,4BAA4B,GAAG,sCAAsC,CAAC;IAEvF,8EAA8E;IAC9E,YAAY;IACZ,8EAA8E;IAE9E,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACtB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,0CAA0C;QAC1C,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,EAAE,MAAM,CAAC,CAAC;IAC1E,CAAC;IAED,WAAW;QACT,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACjC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,qBAAqB;IACrB,8EAA8E;IAE9E,KAAK,CAAC,sBAAsB,CAAC,KAAmB;QAC9C,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,KAAmB;QAC5C,OAAO,4BAA4B,CAAC;IACtC,CAAC;IAED,8EAA8E;IAC9E,eAAe;IACf,8EAA8E;IAE9E,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC;YACnC,MAAM,EAAE,GAAG,IAAI,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC;YACzC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAc;gBAC3C,UAAU,EAAE,0BAA0B;gBACtC,WAAW,EAAE,EAAE;gBACf,OAAO,EAAE,MAAM;gBACf,MAAM,EAAE;oBACN,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU;oBAClD,iBAAiB,EAAE,cAAc,EAAE,yBAAyB;oBAC5D,gBAAgB,EAAE,oBAAoB,EAAE,oBAAoB;oBAC5D,UAAU,EAAE,UAAU,EAAE,gBAAgB;iBACzC;gBACD,UAAU,EAAE,QAAQ;aACrB,CAAC,CAAC;YACH,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC;YAChC,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,GAAG,CAAC,CAAC;QAClE,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,WAAW;IACX,8EAA8E;IAE9E,aAAa;QACX,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,GAAkB,EAAE,CAAC;QAE/B,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,IAAI,CAAC,QAAQ,CAAC,eAAe;gBAAE,SAAS;YAExC,MAAM,OAAO,GAAG,IAAI,CAAC,yBAAyB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YAC9D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBAC5C,IAAI,CAAC,IAAI,CAAC;oBACR,aAAa,EAAE,QAAQ,CAAC,EAAE;oBAC1B,eAAe,EAAE,QAAQ,CAAC,WAAW,IAAI,QAAQ,CAAC,IAAI;oBACtD,OAAO,EAAE,OAAO;oBAChB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;iBAC5B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;IAC9B,CAAC;IAED,8EAA8E;IAC9E,mBAAmB;IACnB,8EAA8E;IAE9E,qBAAqB,CAAC,aAAqB;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ;YAAE,OAAO;QAEtB,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,iBAAiB,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;QACnG,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,iBAAiB,EAAE,CAAC,OAAO,CAAC,CAAC;IACpE,CAAC;IAED,eAAe,CAAC,aAAqB,EAAE,IAAoC;QACzE,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;IAC7D,CAAC;IAED,WAAW,CAAC,aAAqB,EAAE,OAAe;QAChD,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,yBAAyB,EAAE,OAAO,CAAC,CAAC;QACzE,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;IACnE,CAAC;IAED,iBAAiB,CAAC,aAAqB,EAAE,UAAkB;QACzD,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,gBAAgB,EAAE,UAAU,CAAC,CAAC;IACrE,CAAC;IAED,iBAAiB,CAAC,aAAqB,EAAE,KAAY;QACnD,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B,CAAC;QAC/C,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACrD,CAAC;IAED,iBAAiB,CAAC,aAAqB,EAAE,KAAY;QACnD,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B,CAAC;QAC/C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,UAAU,CAAC,aAAqB;QAC9B,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAChD,CAAC;IAED,8EAA8E;IAC9E,aAAa;IACb,8EAA8E;IAE9E,KAAK,CAAC,YAAY,CAAC,aAAqB;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACvD,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,IAAI,CAAC,QAAQ,GAAG,aAAa,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAEzB,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,eAAe,CAA6B,0BAA0B,CAAC,CAAC;YAChG,MAAM,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAEjC,mEAAmE;YACnE,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,IAAK,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAa,CAAC;YAC9F,MAAM,YAAY,GAAG,CAAC,OAAO,CAAC,YAAY,IAAI,MAAM,CAAC,GAAG,CAAC,cAAc,CAAW,CAAmC,CAAC;YACtH,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAK,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAmB,CAAC;YACjG,MAAM,eAAe,GAAG,OAAO,CAAC,uBAAuB,IAAK,MAAM,CAAC,GAAG,CAAC,yBAAyB,CAAmB,CAAC;YAEpH,sCAAsC;YACtC,IAAI,OAAO,CAAC,eAAe,KAAK,SAAS;gBAAE,MAAM,CAAC,GAAG,CAAC,iBAAiB,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;YAClG,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS;gBAAE,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;YACzF,IAAI,OAAO,CAAC,uBAAuB,KAAK,SAAS;gBAAE,MAAM,CAAC,GAAG,CAAC,yBAAyB,EAAE,OAAO,CAAC,uBAAuB,CAAC,CAAC;YAC1H,IAAI,OAAO,CAAC,cAAc,KAAK,SAAS;gBAAE,MAAM,CAAC,GAAG,CAAC,gBAAgB,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;YAE/F,gFAAgF;YAChF,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,CAAC,CAAC;YAEnH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAClC,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;gBAC1C,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;YACxB,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,+CAA+C,EAAE,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;YACvG,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,6CAA6C,EAAE,GAAG,CAAC,CAAC;QACpE,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACrB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,6BAA6B;IAC7B,8EAA8E;IAE9E;;;;OAIG;IACK,KAAK,CAAC,gBAAgB,CAC5B,MAAkC,EAClC,OAAgB,EAChB,YAA4C,EAC5C,cAA6B,EAC7B,eAA8B,EAC9B,aAAqB;QAErB,MAAM,aAAa,GAAG,IAAI,CAAC,qBAAqB,CAAC,YAAY,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC;QAChG,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAkB,CAAC;QACpE,MAAM,cAAc,GAAG,OAAO,IAAI,YAAY,KAAK,QAAQ,IAAI,CAAC,CAAC,aAAa,CAAC;QAE/E,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,aAAa,EAAE,MAAM,EAAE,aAAc,EAAE,aAAa,CAAC,CAAC;YAClG,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;gBAC5B,MAAM,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;aAAM,IAAI,aAAa,EAAE,CAAC;YACzB,MAAM,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,8DAA8D;IACtD,qBAAqB,CAC3B,YAA4C,EAC5C,cAA6B,EAC7B,eAA8B;QAE9B,IAAI,YAAY,KAAK,MAAM;YAAE,OAAO,cAAc,CAAC;QACnD,IAAI,YAAY,KAAK,UAAU,IAAI,eAAe;YAAE,OAAO,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;QAChG,OAAO,IAAI,CAAC;IACd,CAAC;IAED,wEAAwE;IAChE,cAAc,CAAC,OAAe;QACpC,IAAI,OAAO,GAAG,EAAE;YAAE,OAAO,KAAK,OAAO,UAAU,CAAC;QAChD,MAAM,KAAK,GAAG,OAAO,GAAG,EAAE,CAAC;QAC3B,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC;QACrF,OAAO,KAAK,OAAO,UAAU,CAAC;IAChC,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,kBAAkB,CAC9B,aAA4B,EAC5B,MAAkC,EAClC,cAAsB,EACtB,aAAqB;QAErB,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;QAE1B,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,eAAe,CAAuB,oBAAoB,CAAC,CAAC;YACjF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC7C,IAAI,MAAM,EAAE,CAAC;gBACX,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;gBAC1C,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBAC5B,qEAAqE;gBACrE,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;gBACjC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO,aAAa,CAAC;YACvB,CAAC;QACH,CAAC;QAED,yDAAyD;QACzD,MAAM,eAAe,GAAI,MAAM,CAAC,GAAG,CAAC,MAAM,CAAY,IAAK,MAAM,CAAC,GAAG,CAAC,aAAa,CAAY,IAAI,aAAa,CAAC;QACjH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,eAAe,CAAuB,oBAAoB,CAAC,CAAC;QACjF,GAAG,CAAC,SAAS,EAAE,CAAC;QAChB,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,eAAe,OAAO,CAAC,CAAC;QAC3C,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,4BAA4B,CAAC,CAAC;QACxD,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;QAC1C,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAC3B,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC5B,GAAG,CAAC,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;QACnC,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,oBAAoB,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;QAClF,wFAAwF;QACxF,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QACjC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,CAAW,CAAC;IACjC,CAAC;IAED,oEAAoE;IAC5D,KAAK,CAAC,mBAAmB,CAAC,KAAa;QAC7C,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,eAAe,CAAuB,oBAAoB,CAAC,CAAC;QACjF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,MAAM,EAAE,CAAC;YACX,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YAC9B,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QACnB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,aAAqB;QAChC,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,IAAI,CAAC,SAAS,GAAG,aAAa,CAAC;QAC/B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAEzB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC7D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;YACxE,CAAC;YACD,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACxB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,GAAG,CAAC,CAAC;QAC3D,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,mBAAmB;IACnB,8EAA8E;IAE9E,2BAA2B,CAAC,QAAqB;QAC/C,OAAO,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,EAAE,iBAAiB,EAAE,QAAQ,CAAC,eAAe,CAAY,CAAC;IACrG,CAAC;IAED,wBAAwB,CAAC,QAAqB;QAC5C,OAAO,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,EAAE,cAAc,EAAE,QAAQ,CAAC,YAAY,CAAmC,CAAC;IACtH,CAAC;IAED,oBAAoB,CAAC,QAAqB;QACxC,OAAO,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,EAAE,yBAAyB,EAAE,QAAQ,CAAC,uBAAuB,CAAkB,CAAC;IAC3H,CAAC;IAED,gBAAgB,CAAC,QAAqB;QACpC,OAAO,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,EAAE,gBAAgB,EAAE,QAAQ,CAAC,cAAc,CAAkB,CAAC;IACzG,CAAC;IAED,kBAAkB,CAAC,QAAqB,EAAE,OAAe;QACvD,OAAO,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,KAAK,OAAO,CAAC;IACzD,CAAC;IAED,kBAAkB,CAAC,QAAqB;QACtC,IAAI,CAAC,QAAQ,CAAC,kBAAkB;YAAE,OAAO,eAAe,CAAC;QACzD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3C,IAAI,MAAM,GAAG,CAAC;YAAE,OAAO,SAAS,CAAC;QACjC,OAAO,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED,kBAAkB,CAAC,QAAqB;QACtC,IAAI,CAAC,QAAQ,CAAC,kBAAkB;YAAE,OAAO,OAAO,CAAC;QACjD,OAAO,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;IAC3E,CAAC;IAED,kBAAkB,CAAC,UAAyB;QAC1C,IAAI,CAAC,UAAU;YAAE,OAAO,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,UAAU,CAAC;QAC1C,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,AAAD,EAAG,AAAD,EAAG,GAAG,CAAC,GAAG,KAAK,CAAC;QACnC,IAAI,GAAG,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG;YAAE,OAAO,YAAY,CAAC;QACrD,IAAI,GAAG,KAAK,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,SAAS,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;QAChF,IAAI,GAAG,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG;YAAE,OAAO,YAAY,IAAI,KAAK,CAAC;QAC7E,IAAI,GAAG,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,GAAG,KAAK,KAAK;YAAE,OAAO,eAAe,IAAI,KAAK,CAAC;QAClF,IAAI,GAAG,KAAK,KAAK;YAAE,OAAO,eAAe,IAAI,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;QACxE,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,kBAAkB,CAAC,IAAY;QAC7B,OAAO,sBAAsB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,uBAAuB,CAAC,IAAY,EAAE,MAAc;QAClD,OAAO,CAAC,CAAC,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC;IAClD,CAAC;IAED,QAAQ,CAAC,aAAqB;QAC5B,OAAO,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IAClD,CAAC;IAED,SAAS,CAAC,aAAqB;QAC7B,OAAO,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC;IAC9D,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;IACvD,CAAC;IAED,SAAS,CAAC,MAAc,EAAE,IAAiB;QACzC,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAED,iBAAiB,CAAC,MAAc,EAAE,IAAiB;QACjD,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,oBAAoB,CAAC,MAAc,EAAE,IAAoB;QACvD,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,qBAAqB,CAAC,MAAc,EAAE,IAAgB;QACpD,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,SAAS,CAAC,MAAc,EAAE,IAAY;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,WAAW,CAAC,KAAa,EAAE,KAAqB;QAC9C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,8EAA8E;IAC9E,kBAAkB;IAClB,8EAA8E;IAEtE,YAAY,CAAC,aAAqB;QACxC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC;IACnE,CAAC;IAEO,iBAAiB,CACvB,aAAqB,EACrB,KAAQ,EACR,aAA6B;QAE7B,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACvD,IAAI,OAAO,IAAI,KAAK,IAAI,OAAO,EAAE,CAAC;YAChC,OAAO,OAAO,CAAC,KAAK,CAAmB,CAAC;QAC1C,CAAC;QACD,OAAO,aAAa,CAAC;IACvB,CAAC;IAEO,gBAAgB,CACtB,aAAqB,EACrB,KAAQ,EACR,KAAqB;QAErB,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;QAC9D,QAAQ,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC3B,CAAC;IAEO,kBAAkB;QACxB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC;IAEO,yBAAyB,CAAC,QAAqB,EAAE,GAAS;QAChE,MAAM,OAAO,GAAqB,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,CAAC;QAEnC,IAAI,IAAI,KAAK,UAAU,IAAI,QAAQ,CAAC,uBAAuB,IAAI,QAAQ,CAAC,uBAAuB,GAAG,CAAC,EAAE,CAAC;YACpG,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QACtD,CAAC;aAAM,IAAI,IAAI,KAAK,MAAM,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;YACtD,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QAClD,CAAC;aAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,CAAC;YACvC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QAChD,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,sBAAsB,CAAC,QAAqB,EAAE,GAAS,EAAE,OAAyB;QACxF,MAAM,UAAU,GAAG,QAAQ,CAAC,uBAAwB,GAAG,MAAM,CAAC;QAC9D,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC;QAEjD,gDAAgD;QAChD,IAAI,MAAM,GAAG,QAAQ,CAAC,kBAAkB;YACtC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,OAAO,EAAE;YACjD,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QAElB,kEAAkE;QAClE,OAAO,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9B,MAAM,IAAI,UAAU,CAAC;QACvB,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC;QAEvB,OAAO,MAAM,GAAG,OAAO,EAAE,CAAC;YACxB,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE;gBAClB,MAAM,EAAE,CAAC,CAAC,UAAU,EAAE;gBACtB,MAAM,EAAE,MAAM,KAAK,OAAO;aAC3B,CAAC,CAAC;YACH,MAAM,IAAI,UAAU,CAAC;QACvB,CAAC;IACH,CAAC;IAEO,kBAAkB,CAAC,QAAqB,EAAE,GAAS,EAAE,OAAyB;QACpF,iDAAiD;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,cAAe,CAAC,CAAC;QAClE,MAAM,WAAW,GAAG,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAE/F,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,WAAW,IAAI,IAAI;mBAC7B,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,QAAQ,EAAE;mBACpC,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,UAAU,EAAE,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAC,QAAqB,EAAE,GAAS,EAAE,OAAyB;QAClF,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,kBAAmB,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;QAC9C,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,IAAI,EAAE,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,oBAAoB,CAAC,UAAkB;QAC7C,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAClC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC;QAClC,MAAM,MAAM,GAAG,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC3D,MAAM,KAAK,GAA4C,EAAE,CAAC;QAE1D,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;YACrB,aAAa;YACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;aAAM,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC7C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;gBAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;oBAClC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC9D,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,qCAAqC;YACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1F,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBACtB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,gBAAgB,CAAC,EAAU;QACjC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC;QAC7C,IAAI,YAAY,GAAG,CAAC;YAAE,OAAO,oBAAoB,CAAC;QAClD,IAAI,YAAY,GAAG,EAAE;YAAE,OAAO,GAAG,YAAY,UAAU,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QACvF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,YAAY,GAAG,EAAE,CAAC;QAClC,IAAI,OAAO,KAAK,CAAC;YAAE,OAAO,GAAG,KAAK,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QACnE,OAAO,GAAG,KAAK,KAAK,OAAO,GAAG,CAAC;IACjC,CAAC;qPAvkBU,kBAAkB,yBAAlB,kBAAkB;6DAAlB,kBAAkB;YCzD7B,AAJF,oFAAiB,+DAIR;;YAJT,uCA4RC;;;AD/NY,kBAAkB;IAP9B,aAAa,CAAC,qBAAqB,EAAE,sBAAsB,CAAC;GAOhD,kBAAkB,CAwkB9B;;iFAxkBY,kBAAkB;cAN9B,SAAS;6BACI,KAAK,YACP,2BAA2B;;kFAI1B,kBAAkB;AA0kB/B,MAAM,UAAU,sBAAsB;IACpC,wDAAwD;IACxD,6DAA6D;AAC/D,CAAC","sourcesContent":["import { ChangeDetectorRef, Component, OnInit, OnDestroy, inject } from '@angular/core';\nimport { RegisterClass, UUIDsEqual } from '@memberjunction/global';\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { ResourceData, MJCompanyIntegrationEntity, MJScheduledJobEntity } from '@memberjunction/core-entities';\nimport { IntegrationDataService, ResolveIntegrationIcon } from '../../services/integration-data.service';\n\n// ---------------------------------------------------------------------------\n// Data interfaces\n// ---------------------------------------------------------------------------\n\ninterface ScheduleRow {\n ID: string;\n Name: string;\n Integration: string;\n Company: string;\n IsActive: boolean | null;\n ScheduleEnabled: boolean;\n ScheduleType: 'Manual' | 'Interval' | 'Cron';\n ScheduleIntervalMinutes: number | null;\n CronExpression: string | null;\n NextScheduledRunAt: string | null;\n LastScheduledRunAt: string | null;\n IsLocked: boolean;\n LockedAt: string | null;\n ScheduledJobID: string | null;\n}\n\ninterface TimelineMarker {\n Hour: number;\n Minute: number;\n IsNext: boolean;\n}\n\ninterface TimelineRow {\n IntegrationID: string;\n IntegrationName: string;\n Markers: TimelineMarker[];\n IsLocked: boolean;\n}\n\ninterface IntervalPreset {\n Label: string;\n Minutes: number;\n}\n\ninterface CronPreset {\n Label: string;\n Expression: string;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\n@RegisterClass(BaseResourceComponent, 'IntegrationSchedules')\n@Component({\n standalone: false,\n selector: 'app-integration-schedules',\n templateUrl: './schedules.component.html',\n styleUrls: ['./schedules.component.css']\n})\nexport class SchedulesComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n\n // ---------------------------------------------------------------------------\n // Public state\n // ---------------------------------------------------------------------------\n\n Schedules: ScheduleRow[] = [];\n IsLoading = true;\n SavingID: string | null = null;\n RunningID: string | null = null;\n\n /** Track pending edits per integration ID */\n PendingChanges = new Map<string, Partial<ScheduleRow>>();\n\n /** Timeline data built from schedules */\n TimelineMarkers: TimelineRow[] = [];\n TimelineHours: number[] = [];\n\n /** Preset interval choices */\n IntervalPresets: IntervalPreset[] = [\n { Label: '5m', Minutes: 5 },\n { Label: '15m', Minutes: 15 },\n { Label: '30m', Minutes: 30 },\n { Label: '1h', Minutes: 60 },\n { Label: '6h', Minutes: 360 },\n { Label: '12h', Minutes: 720 },\n { Label: '24h', Minutes: 1440 }\n ];\n\n /** Preset cron expressions */\n CronPresets: CronPreset[] = [\n { Label: 'Every hour', Expression: '0 * * * *' },\n { Label: 'Every 6 hours', Expression: '0 */6 * * *' },\n { Label: 'Daily midnight', Expression: '0 0 * * *' },\n { Label: 'Weekdays 9am', Expression: '0 9 * * 1-5' }\n ];\n\n // ---------------------------------------------------------------------------\n // Private\n // ---------------------------------------------------------------------------\n\n private dataService = inject(IntegrationDataService);\n private cdr = inject(ChangeDetectorRef);\n private refreshTimer: ReturnType<typeof setInterval> | null = null;\n\n /** JobTypeID for \"Integration Sync\" scheduled job type (from MJ metadata) */\n private readonly INTEGRATION_SYNC_JOB_TYPE_ID = '4CD34733-4751-4572-B946-17DF6CB3EC90';\n\n // ---------------------------------------------------------------------------\n // Lifecycle\n // ---------------------------------------------------------------------------\n\n async ngOnInit(): Promise<void> {\n this.buildTimelineHours();\n await this.LoadData();\n this.NotifyLoadComplete();\n // Refresh relative times every 60 seconds\n this.refreshTimer = setInterval(() => this.cdr.detectChanges(), 60_000);\n }\n\n ngOnDestroy(): void {\n if (this.refreshTimer) {\n clearInterval(this.refreshTimer);\n this.refreshTimer = null;\n }\n }\n\n // ---------------------------------------------------------------------------\n // Resource overrides\n // ---------------------------------------------------------------------------\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Schedules';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-calendar-check';\n }\n\n // ---------------------------------------------------------------------------\n // Data loading\n // ---------------------------------------------------------------------------\n\n async LoadData(): Promise<void> {\n this.IsLoading = true;\n this.cdr.detectChanges();\n try {\n const provider = this.RunViewToUse;\n const rv = new RunView(provider ?? null);\n const result = await rv.RunView<ScheduleRow>({\n EntityName: 'MJ: Company Integrations',\n ExtraFilter: '',\n OrderBy: 'Name',\n Fields: [\n 'ID', 'Name', 'Integration', 'Company', 'IsActive',\n 'ScheduleEnabled', 'ScheduleType', 'ScheduleIntervalMinutes',\n 'CronExpression', 'NextScheduledRunAt', 'LastScheduledRunAt',\n 'IsLocked', 'LockedAt', 'ScheduledJobID'\n ],\n ResultType: 'simple'\n });\n this.Schedules = result.Results;\n this.BuildTimeline();\n } catch (err) {\n console.error('[SchedulesComponent] Failed to load data:', err);\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n // ---------------------------------------------------------------------------\n // Timeline\n // ---------------------------------------------------------------------------\n\n BuildTimeline(): void {\n const now = new Date();\n const rows: TimelineRow[] = [];\n\n for (const schedule of this.Schedules) {\n if (!schedule.ScheduleEnabled) continue;\n\n const markers = this.computeMarkersForSchedule(schedule, now);\n if (markers.length > 0 || schedule.IsLocked) {\n rows.push({\n IntegrationID: schedule.ID,\n IntegrationName: schedule.Integration ?? schedule.Name,\n Markers: markers,\n IsLocked: schedule.IsLocked\n });\n }\n }\n this.TimelineMarkers = rows;\n }\n\n // ---------------------------------------------------------------------------\n // Schedule editing\n // ---------------------------------------------------------------------------\n\n ToggleScheduleEnabled(integrationID: string): void {\n const schedule = this.findSchedule(integrationID);\n if (!schedule) return;\n\n const current = this.getEffectiveValue(integrationID, 'ScheduleEnabled', schedule.ScheduleEnabled);\n this.setPendingChange(integrationID, 'ScheduleEnabled', !current);\n }\n\n SetScheduleType(integrationID: string, type: 'Manual' | 'Interval' | 'Cron'): void {\n this.setPendingChange(integrationID, 'ScheduleType', type);\n }\n\n SetInterval(integrationID: string, minutes: number): void {\n this.setPendingChange(integrationID, 'ScheduleIntervalMinutes', minutes);\n this.setPendingChange(integrationID, 'ScheduleType', 'Interval');\n }\n\n SetCronExpression(integrationID: string, expression: string): void {\n this.setPendingChange(integrationID, 'CronExpression', expression);\n }\n\n OnCronInputChange(integrationID: string, event: Event): void {\n const input = event.target as HTMLInputElement;\n this.SetCronExpression(integrationID, input.value);\n }\n\n SetCustomInterval(integrationID: string, event: Event): void {\n const input = event.target as HTMLInputElement;\n const value = parseInt(input.value, 10);\n if (!isNaN(value) && value > 0) {\n this.SetInterval(integrationID, value);\n }\n }\n\n HasChanges(integrationID: string): boolean {\n return this.PendingChanges.has(integrationID);\n }\n\n // ---------------------------------------------------------------------------\n // Save & Run\n // ---------------------------------------------------------------------------\n\n async SaveSchedule(integrationID: string): Promise<void> {\n const changes = this.PendingChanges.get(integrationID);\n if (!changes) return;\n\n this.SavingID = integrationID;\n this.cdr.detectChanges();\n\n try {\n const md = new Metadata();\n const entity = await md.GetEntityObject<MJCompanyIntegrationEntity>('MJ: Company Integrations');\n await entity.Load(integrationID);\n\n // Resolve effective values (pending change wins over stored value)\n const scheduleEnabled = changes.ScheduleEnabled ?? (entity.Get('ScheduleEnabled') as boolean);\n const scheduleType = (changes.ScheduleType ?? entity.Get('ScheduleType') as string) as 'Manual' | 'Interval' | 'Cron';\n const cronExpression = changes.CronExpression ?? (entity.Get('CronExpression') as string | null);\n const intervalMinutes = changes.ScheduleIntervalMinutes ?? (entity.Get('ScheduleIntervalMinutes') as number | null);\n\n // Apply schedule fields to the entity\n if (changes.ScheduleEnabled !== undefined) entity.Set('ScheduleEnabled', changes.ScheduleEnabled);\n if (changes.ScheduleType !== undefined) entity.Set('ScheduleType', changes.ScheduleType);\n if (changes.ScheduleIntervalMinutes !== undefined) entity.Set('ScheduleIntervalMinutes', changes.ScheduleIntervalMinutes);\n if (changes.CronExpression !== undefined) entity.Set('CronExpression', changes.CronExpression);\n\n // Create/update/disable the linked ScheduledJob so the scheduler actually fires\n await this.SyncScheduledJob(entity, scheduleEnabled, scheduleType, cronExpression, intervalMinutes, integrationID);\n\n const saved = await entity.Save();\n if (saved) {\n this.PendingChanges.delete(integrationID);\n await this.LoadData();\n } else {\n console.error('[SchedulesComponent] Failed to save schedule:', entity.LatestResult?.CompleteMessage);\n }\n } catch (err) {\n console.error('[SchedulesComponent] Error saving schedule:', err);\n } finally {\n this.SavingID = null;\n this.cdr.detectChanges();\n }\n }\n\n // ---------------------------------------------------------------------------\n // Scheduled job sync helpers\n // ---------------------------------------------------------------------------\n\n /**\n * Creates, updates, or disables the ScheduledJob record linked to this integration.\n * When enabled with a real schedule type, ensures an Active ScheduledJob exists.\n * When disabled or set to Manual, marks the ScheduledJob as Disabled (if one exists).\n */\n private async SyncScheduledJob(\n entity: MJCompanyIntegrationEntity,\n enabled: boolean,\n scheduleType: 'Manual' | 'Interval' | 'Cron',\n cronExpression: string | null,\n intervalMinutes: number | null,\n integrationID: string\n ): Promise<void> {\n const effectiveCron = this.ResolveCronExpression(scheduleType, cronExpression, intervalMinutes);\n const existingJobID = entity.Get('ScheduledJobID') as string | null;\n const shouldBeActive = enabled && scheduleType !== 'Manual' && !!effectiveCron;\n\n if (shouldBeActive) {\n const jobID = await this.UpsertScheduledJob(existingJobID, entity, effectiveCron!, integrationID);\n if (jobID !== existingJobID) {\n entity.Set('ScheduledJobID', jobID);\n }\n } else if (existingJobID) {\n await this.DisableScheduledJob(existingJobID);\n }\n }\n\n /** Converts schedule type + config into a cron expression. */\n private ResolveCronExpression(\n scheduleType: 'Manual' | 'Interval' | 'Cron',\n cronExpression: string | null,\n intervalMinutes: number | null\n ): string | null {\n if (scheduleType === 'Cron') return cronExpression;\n if (scheduleType === 'Interval' && intervalMinutes) return this.IntervalToCron(intervalMinutes);\n return null;\n }\n\n /** Converts an interval in minutes to an equivalent cron expression. */\n private IntervalToCron(minutes: number): string {\n if (minutes < 60) return `*/${minutes} * * * *`;\n const hours = minutes / 60;\n if (Number.isInteger(hours)) return hours === 1 ? '0 * * * *' : `0 */${hours} * * *`;\n return `*/${minutes} * * * *`;\n }\n\n /**\n * Creates a new ScheduledJob or updates the existing one.\n * Returns the ID of the job (new or existing).\n */\n private async UpsertScheduledJob(\n existingJobID: string | null,\n entity: MJCompanyIntegrationEntity,\n cronExpression: string,\n integrationID: string\n ): Promise<string> {\n const md = new Metadata();\n\n if (existingJobID) {\n const job = await md.GetEntityObject<MJScheduledJobEntity>('MJ: Scheduled Jobs');\n const loaded = await job.Load(existingJobID);\n if (loaded) {\n job.Set('CronExpression', cronExpression);\n job.Set('Status', 'Active');\n // Reset NextRunAt so the scheduler picks up the new cron immediately\n job.Set('NextRunAt', new Date());\n await job.Save();\n return existingJobID;\n }\n }\n\n // No existing job (or failed to load) — create a new one\n const integrationName = (entity.Get('Name') as string) ?? (entity.Get('Integration') as string) ?? 'Integration';\n const job = await md.GetEntityObject<MJScheduledJobEntity>('MJ: Scheduled Jobs');\n job.NewRecord();\n job.Set('Name', `${integrationName} Sync`);\n job.Set('JobTypeID', this.INTEGRATION_SYNC_JOB_TYPE_ID);\n job.Set('CronExpression', cronExpression);\n job.Set('Timezone', 'UTC');\n job.Set('Status', 'Active');\n job.Set('ConcurrencyMode', 'Skip');\n job.Set('Configuration', JSON.stringify({ CompanyIntegrationID: integrationID }));\n // Set NextRunAt to now so the scheduler fires it on next poll without needing a restart\n job.Set('NextRunAt', new Date());\n await job.Save();\n return job.Get('ID') as string;\n }\n\n /** Sets an existing ScheduledJob to Disabled so it stops firing. */\n private async DisableScheduledJob(jobID: string): Promise<void> {\n const md = new Metadata();\n const job = await md.GetEntityObject<MJScheduledJobEntity>('MJ: Scheduled Jobs');\n const loaded = await job.Load(jobID);\n if (loaded) {\n job.Set('Status', 'Disabled');\n await job.Save();\n }\n }\n\n async RunNow(integrationID: string): Promise<void> {\n if (this.RunningID) return;\n this.RunningID = integrationID;\n this.cdr.detectChanges();\n\n try {\n const result = await this.dataService.RunSync(integrationID);\n if (!result.Success) {\n console.error('[SchedulesComponent] RunSync failed:', result.Message);\n }\n await this.LoadData();\n } catch (err) {\n console.error('[SchedulesComponent] RunNow error:', err);\n } finally {\n this.RunningID = null;\n this.cdr.detectChanges();\n }\n }\n\n // ---------------------------------------------------------------------------\n // Template helpers\n // ---------------------------------------------------------------------------\n\n GetEffectiveScheduleEnabled(schedule: ScheduleRow): boolean {\n return this.getEffectiveValue(schedule.ID, 'ScheduleEnabled', schedule.ScheduleEnabled) as boolean;\n }\n\n GetEffectiveScheduleType(schedule: ScheduleRow): 'Manual' | 'Interval' | 'Cron' {\n return this.getEffectiveValue(schedule.ID, 'ScheduleType', schedule.ScheduleType) as 'Manual' | 'Interval' | 'Cron';\n }\n\n GetEffectiveInterval(schedule: ScheduleRow): number | null {\n return this.getEffectiveValue(schedule.ID, 'ScheduleIntervalMinutes', schedule.ScheduleIntervalMinutes) as number | null;\n }\n\n GetEffectiveCron(schedule: ScheduleRow): string | null {\n return this.getEffectiveValue(schedule.ID, 'CronExpression', schedule.CronExpression) as string | null;\n }\n\n IsIntervalSelected(schedule: ScheduleRow, minutes: number): boolean {\n return this.GetEffectiveInterval(schedule) === minutes;\n }\n\n GetNextRunRelative(schedule: ScheduleRow): string {\n if (!schedule.NextScheduledRunAt) return 'Not scheduled';\n const next = new Date(schedule.NextScheduledRunAt);\n const diffMs = next.getTime() - Date.now();\n if (diffMs < 0) return 'Overdue';\n return 'in ' + this.formatDurationMs(diffMs);\n }\n\n GetLastRunRelative(schedule: ScheduleRow): string {\n if (!schedule.LastScheduledRunAt) return 'Never';\n return this.dataService.ComputeRelativeTime(schedule.LastScheduledRunAt);\n }\n\n GetCronDescription(expression: string | null): string {\n if (!expression) return '';\n const parts = expression.split(' ');\n if (parts.length !== 5) return expression;\n const [min, hour, , , dow] = parts;\n if (min === '0' && hour === '*') return 'Every hour';\n if (min === '0' && hour.startsWith('*/')) return `Every ${hour.slice(2)} hours`;\n if (min === '0' && hour !== '*' && dow === '*') return `Daily at ${hour}:00`;\n if (min === '0' && hour !== '*' && dow === '1-5') return `Weekdays at ${hour}:00`;\n if (dow === '1-5') return `Weekdays at ${hour}:${min.padStart(2, '0')}`;\n return expression;\n }\n\n GetIntegrationIcon(name: string): string {\n return ResolveIntegrationIcon(name);\n }\n\n ComputeTimelinePosition(hour: number, minute: number): number {\n return ((hour * 60 + minute) / (24 * 60)) * 100;\n }\n\n IsSaving(integrationID: string): boolean {\n return UUIDsEqual(this.SavingID, integrationID);\n }\n\n IsRunning(integrationID: string): boolean {\n return UUIDsEqual(this.RunningID, integrationID);\n }\n\n get ScheduledCount(): number {\n return this.Schedules.filter(s => s.ScheduleEnabled).length;\n }\n\n get LockedCount(): number {\n return this.Schedules.filter(s => s.IsLocked).length;\n }\n\n TrackByID(_index: number, item: ScheduleRow): string {\n return item.ID;\n }\n\n TrackTimelineByID(_index: number, item: TimelineRow): string {\n return item.IntegrationID;\n }\n\n TrackPresetByMinutes(_index: number, item: IntervalPreset): number {\n return item.Minutes;\n }\n\n TrackCronPresetByExpr(_index: number, item: CronPreset): string {\n return item.Expression;\n }\n\n TrackHour(_index: number, hour: number): number {\n return hour;\n }\n\n TrackMarker(index: number, _item: TimelineMarker): number {\n return index;\n }\n\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n\n private findSchedule(integrationID: string): ScheduleRow | undefined {\n return this.Schedules.find(s => UUIDsEqual(s.ID, integrationID));\n }\n\n private getEffectiveValue<K extends keyof ScheduleRow>(\n integrationID: string,\n field: K,\n originalValue: ScheduleRow[K]\n ): ScheduleRow[K] {\n const changes = this.PendingChanges.get(integrationID);\n if (changes && field in changes) {\n return changes[field] as ScheduleRow[K];\n }\n return originalValue;\n }\n\n private setPendingChange<K extends keyof ScheduleRow>(\n integrationID: string,\n field: K,\n value: ScheduleRow[K]\n ): void {\n const existing = this.PendingChanges.get(integrationID) ?? {};\n existing[field] = value;\n this.PendingChanges.set(integrationID, existing);\n this.cdr.detectChanges();\n }\n\n private buildTimelineHours(): void {\n this.TimelineHours = Array.from({ length: 24 }, (_, i) => i);\n }\n\n private computeMarkersForSchedule(schedule: ScheduleRow, now: Date): TimelineMarker[] {\n const markers: TimelineMarker[] = [];\n const type = schedule.ScheduleType;\n\n if (type === 'Interval' && schedule.ScheduleIntervalMinutes && schedule.ScheduleIntervalMinutes > 0) {\n this.computeIntervalMarkers(schedule, now, markers);\n } else if (type === 'Cron' && schedule.CronExpression) {\n this.computeCronMarkers(schedule, now, markers);\n } else if (schedule.NextScheduledRunAt) {\n this.addNextRunMarker(schedule, now, markers);\n }\n\n return markers;\n }\n\n private computeIntervalMarkers(schedule: ScheduleRow, now: Date, markers: TimelineMarker[]): void {\n const intervalMs = schedule.ScheduleIntervalMinutes! * 60_000;\n const endTime = now.getTime() + 24 * 60 * 60_000;\n\n // Start from the next scheduled run or from now\n let cursor = schedule.NextScheduledRunAt\n ? new Date(schedule.NextScheduledRunAt).getTime()\n : now.getTime();\n\n // If cursor is in the past, advance to the next future occurrence\n while (cursor < now.getTime()) {\n cursor += intervalMs;\n }\n\n const nextRun = cursor;\n\n while (cursor < endTime) {\n const d = new Date(cursor);\n markers.push({\n Hour: d.getHours(),\n Minute: d.getMinutes(),\n IsNext: cursor === nextRun\n });\n cursor += intervalMs;\n }\n }\n\n private computeCronMarkers(schedule: ScheduleRow, now: Date, markers: TimelineMarker[]): void {\n // Simple cron approximation for timeline display\n const times = this.approximateCronTimes(schedule.CronExpression!);\n const nextRunTime = schedule.NextScheduledRunAt ? new Date(schedule.NextScheduledRunAt) : null;\n\n for (const time of times) {\n const isNext = nextRunTime != null\n && time.Hour === nextRunTime.getHours()\n && time.Minute === nextRunTime.getMinutes();\n markers.push({ Hour: time.Hour, Minute: time.Minute, IsNext: isNext });\n }\n }\n\n private addNextRunMarker(schedule: ScheduleRow, now: Date, markers: TimelineMarker[]): void {\n const next = new Date(schedule.NextScheduledRunAt!);\n const diffMs = next.getTime() - now.getTime();\n if (diffMs >= 0 && diffMs <= 24 * 60 * 60_000) {\n markers.push({ Hour: next.getHours(), Minute: next.getMinutes(), IsNext: true });\n }\n }\n\n /**\n * Approximate cron schedule times within a 24-hour window.\n * Handles common patterns only -- not a full cron parser.\n */\n private approximateCronTimes(expression: string): Array<{ Hour: number; Minute: number }> {\n const parts = expression.split(' ');\n if (parts.length !== 5) return [];\n const [minPart, hourPart] = parts;\n const minute = minPart === '*' ? 0 : parseInt(minPart, 10);\n const times: Array<{ Hour: number; Minute: number }> = [];\n\n if (hourPart === '*') {\n // Every hour\n for (let h = 0; h < 24; h++) {\n times.push({ Hour: h, Minute: isNaN(minute) ? 0 : minute });\n }\n } else if (hourPart.startsWith('*/')) {\n const step = parseInt(hourPart.slice(2), 10);\n if (!isNaN(step) && step > 0) {\n for (let h = 0; h < 24; h += step) {\n times.push({ Hour: h, Minute: isNaN(minute) ? 0 : minute });\n }\n }\n } else {\n // Specific hour(s) — comma-separated\n const hours = hourPart.split(',').map(h => parseInt(h.trim(), 10)).filter(h => !isNaN(h));\n for (const h of hours) {\n times.push({ Hour: h, Minute: isNaN(minute) ? 0 : minute });\n }\n }\n\n return times;\n }\n\n private formatDurationMs(ms: number): string {\n const totalMinutes = Math.floor(ms / 60_000);\n if (totalMinutes < 1) return 'less than a minute';\n if (totalMinutes < 60) return `${totalMinutes} minute${totalMinutes === 1 ? '' : 's'}`;\n const hours = Math.floor(totalMinutes / 60);\n const minutes = totalMinutes % 60;\n if (minutes === 0) return `${hours} hour${hours === 1 ? '' : 's'}`;\n return `${hours}h ${minutes}m`;\n }\n}\n\nexport function LoadSchedulesComponent(): void {\n // Tree-shaking prevention: importing this module causes\n // @RegisterClass decorators to fire, registering components.\n}\n","<!-- Loading state -->\n@if (IsLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading schedules...\"></mj-loading>\n </div>\n} @else {\n <div class=\"schedules-root\">\n\n <!-- ================================================================= -->\n <!-- HEADER -->\n <!-- ================================================================= -->\n <div class=\"section-header\">\n <div class=\"header-left\">\n <h2 class=\"section-title\">\n <i class=\"fa-solid fa-calendar-check\"></i>\n Sync Schedules\n </h2>\n <span class=\"header-meta\">{{ Schedules.length }} integration{{ Schedules.length === 1 ? '' : 's' }}</span>\n <span class=\"header-meta\">{{ ScheduledCount }} scheduled</span>\n @if (LockedCount > 0) {\n <span class=\"header-meta running-badge\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n {{ LockedCount }} running\n </span>\n }\n </div>\n <button class=\"btn btn-outline\" (click)=\"LoadData()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n Refresh\n </button>\n </div>\n\n <!-- ================================================================= -->\n <!-- TIMELINE (24-hour visual) -->\n <!-- ================================================================= -->\n @if (TimelineMarkers.length > 0) {\n <div class=\"timeline-section\">\n <div class=\"timeline-title\">\n <i class=\"fa-regular fa-clock\"></i>\n Next 24 Hours\n </div>\n <div class=\"timeline-container\">\n <!-- Hour grid labels -->\n <div class=\"timeline-grid-labels\">\n <div class=\"timeline-label-spacer\"></div>\n <div class=\"timeline-grid-track\">\n @for (hour of TimelineHours; track TrackHour($index, hour)) {\n @if (hour % 4 === 0) {\n <span class=\"timeline-hour-label\"\n [style.left.%]=\"ComputeTimelinePosition(hour, 0)\">\n {{ hour }}:00\n </span>\n }\n }\n </div>\n </div>\n\n <!-- Integration rows -->\n @for (row of TimelineMarkers; track TrackTimelineByID($index, row)) {\n <div class=\"timeline-row\">\n <div class=\"timeline-row-label\" [title]=\"row.IntegrationName\">\n {{ row.IntegrationName }}\n </div>\n <div class=\"timeline-track-container\">\n <!-- Hour grid lines -->\n @for (hour of TimelineHours; track TrackHour($index, hour)) {\n @if (hour % 4 === 0) {\n <div class=\"timeline-grid-line\"\n [style.left.%]=\"ComputeTimelinePosition(hour, 0)\">\n </div>\n }\n }\n\n <!-- Track bar -->\n <div class=\"timeline-track\"></div>\n\n <!-- Markers -->\n @for (marker of row.Markers; track TrackMarker($index, marker)) {\n <div class=\"timeline-marker\"\n [class.timeline-marker-next]=\"marker.IsNext\"\n [style.left.%]=\"ComputeTimelinePosition(marker.Hour, marker.Minute)\"\n [title]=\"marker.Hour + ':' + ('' + marker.Minute).padStart(2, '0')\">\n </div>\n }\n\n <!-- Locked indicator -->\n @if (row.IsLocked) {\n <div class=\"timeline-locked-indicator\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n </div>\n }\n\n <!-- Current time line -->\n <div class=\"timeline-now-line\"></div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- ================================================================= -->\n <!-- SCHEDULE CARDS -->\n <!-- ================================================================= -->\n <div class=\"cards-section\">\n @for (schedule of Schedules; track TrackByID($index, schedule)) {\n <div class=\"schedule-card\" [class.schedule-card-disabled]=\"!schedule.IsActive\">\n\n <!-- LEFT: Icon + Info -->\n <div class=\"card-info\">\n <div class=\"card-icon\">\n <i [class]=\"GetIntegrationIcon(schedule.Integration || schedule.Name)\"></i>\n </div>\n <div class=\"card-details\">\n <div class=\"card-name\">{{ schedule.Integration || schedule.Name }}</div>\n <div class=\"card-company\">{{ schedule.Company }}</div>\n <div class=\"card-badges\">\n @if (schedule.IsActive) {\n <span class=\"badge badge-success\">Active</span>\n } @else {\n <span class=\"badge badge-gray\">Inactive</span>\n }\n @if (schedule.IsLocked) {\n <span class=\"badge badge-running\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Running\n </span>\n }\n </div>\n </div>\n </div>\n\n <!-- CENTER: Schedule Configuration -->\n <div class=\"card-config\">\n <!-- Schedule toggle -->\n <div class=\"config-row\">\n <label class=\"toggle-label\">\n Auto-sync\n <button class=\"toggle-switch\"\n [class.toggle-on]=\"GetEffectiveScheduleEnabled(schedule)\"\n (click)=\"ToggleScheduleEnabled(schedule.ID)\"\n [attr.aria-checked]=\"GetEffectiveScheduleEnabled(schedule)\"\n role=\"switch\">\n <span class=\"toggle-knob\"></span>\n </button>\n </label>\n </div>\n\n @if (GetEffectiveScheduleEnabled(schedule)) {\n <!-- Schedule type pills -->\n <div class=\"config-row\">\n <div class=\"type-pills\">\n <button class=\"type-pill\"\n [class.type-pill-active]=\"GetEffectiveScheduleType(schedule) === 'Manual'\"\n (click)=\"SetScheduleType(schedule.ID, 'Manual')\">\n Manual\n </button>\n <button class=\"type-pill\"\n [class.type-pill-active]=\"GetEffectiveScheduleType(schedule) === 'Interval'\"\n (click)=\"SetScheduleType(schedule.ID, 'Interval')\">\n Interval\n </button>\n <button class=\"type-pill\"\n [class.type-pill-active]=\"GetEffectiveScheduleType(schedule) === 'Cron'\"\n (click)=\"SetScheduleType(schedule.ID, 'Cron')\">\n Cron\n </button>\n </div>\n </div>\n\n <!-- Interval config -->\n @if (GetEffectiveScheduleType(schedule) === 'Interval') {\n <div class=\"config-row\">\n <div class=\"interval-presets\">\n @for (preset of IntervalPresets; track TrackPresetByMinutes($index, preset)) {\n <button class=\"preset-btn\"\n [class.preset-btn-active]=\"IsIntervalSelected(schedule, preset.Minutes)\"\n (click)=\"SetInterval(schedule.ID, preset.Minutes)\">\n {{ preset.Label }}\n </button>\n }\n </div>\n <div class=\"custom-interval\">\n <input type=\"number\"\n class=\"interval-input\"\n placeholder=\"Custom min\"\n min=\"1\"\n [value]=\"GetEffectiveInterval(schedule)\"\n (change)=\"SetCustomInterval(schedule.ID, $event)\" />\n <span class=\"interval-unit\">min</span>\n </div>\n </div>\n }\n\n <!-- Cron config -->\n @if (GetEffectiveScheduleType(schedule) === 'Cron') {\n <div class=\"config-row\">\n <div class=\"cron-presets\">\n @for (preset of CronPresets; track TrackCronPresetByExpr($index, preset)) {\n <button class=\"preset-btn\"\n [class.preset-btn-active]=\"GetEffectiveCron(schedule) === preset.Expression\"\n (click)=\"SetCronExpression(schedule.ID, preset.Expression)\">\n {{ preset.Label }}\n </button>\n }\n </div>\n <div class=\"cron-input-row\">\n <input type=\"text\"\n class=\"cron-input\"\n placeholder=\"* * * * *\"\n [value]=\"GetEffectiveCron(schedule) ?? ''\"\n (change)=\"OnCronInputChange(schedule.ID, $event)\" />\n @if (GetEffectiveCron(schedule)) {\n <span class=\"cron-description\">\n {{ GetCronDescription(GetEffectiveCron(schedule)) }}\n </span>\n }\n </div>\n </div>\n }\n }\n </div>\n\n <!-- RIGHT: Status + Actions -->\n <div class=\"card-status\">\n <div class=\"status-items\">\n <div class=\"status-item\">\n <span class=\"status-label\">Next run</span>\n <span class=\"status-value\">{{ GetNextRunRelative(schedule) }}</span>\n </div>\n <div class=\"status-item\">\n <span class=\"status-label\">Last run</span>\n <span class=\"status-value\">{{ GetLastRunRelative(schedule) }}</span>\n </div>\n <div class=\"status-item\">\n <span class=\"status-label\">Status</span>\n @if (schedule.IsLocked) {\n <span class=\"status-value status-running\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Running\n </span>\n } @else {\n <span class=\"status-value status-idle\">Idle</span>\n }\n </div>\n </div>\n\n <div class=\"card-actions\">\n @if (HasChanges(schedule.ID)) {\n <button class=\"btn btn-primary btn-save\"\n [disabled]=\"IsSaving(schedule.ID)\"\n (click)=\"SaveSchedule(schedule.ID)\">\n @if (IsSaving(schedule.ID)) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Saving...\n } @else {\n <i class=\"fa-solid fa-check\"></i>\n Save\n }\n </button>\n }\n <button class=\"btn btn-outline btn-run\"\n [disabled]=\"IsRunning(schedule.ID) || schedule.IsLocked\"\n (click)=\"RunNow(schedule.ID)\">\n @if (IsRunning(schedule.ID)) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Running...\n } @else {\n <i class=\"fa-solid fa-play\"></i>\n Run Now\n }\n </button>\n </div>\n </div>\n </div>\n }\n\n @if (Schedules.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-calendar-xmark\"></i>\n <p>No integrations found</p>\n </div>\n }\n </div>\n </div>\n}\n"]}
|