@acorex-platform/extension-weather-core-client 0.0.21
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/fesm2022/acorex-platform-extension-weather-core-client-contracts.mjs +161 -0
- package/fesm2022/acorex-platform-extension-weather-core-client-contracts.mjs.map +1 -0
- package/fesm2022/acorex-platform-extension-weather-core-client.mjs +803 -0
- package/fesm2022/acorex-platform-extension-weather-core-client.mjs.map +1 -0
- package/package.json +28 -0
- package/types/acorex-platform-extension-weather-core-client-contracts.d.ts +114 -0
- package/types/acorex-platform-extension-weather-core-client.d.ts +17 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-extension-weather-core-client.mjs","sources":["../../../../libs/extensions/weather/core/client/src/lib/integration/weather.integration-domain.provider.ts","../../../../libs/extensions/weather/core/client/src/lib/manifest.ts","../../../../libs/extensions/weather/core/client/src/lib/settings.provider.ts","../../../../libs/extensions/weather/core/client/src/lib/widgets/weather-widget.utils.ts","../../../../libs/extensions/weather/core/client/src/lib/widgets/weather-widget.component.ts","../../../../libs/extensions/weather/core/client/src/lib/widgets/weather-widget.component.html","../../../../libs/extensions/weather/core/client/src/lib/widgets/weather-widget.config.ts","../../../../libs/extensions/weather/core/client/src/lib/widgets/weather-widget.definition.ts","../../../../libs/extensions/weather/core/client/src/lib/widget-definition.provider.ts","../../../../libs/extensions/weather/core/client/src/lib/weather-extension.module.ts","../../../../libs/extensions/weather/core/client/src/acorex-platform-extension-weather-core-client.ts"],"sourcesContent":["import { AXP_INTEGRATION_CATEGORY } from '@acorex-platform/framework-shared/core';\nimport {\n type AXPIntegrationDomainProvider,\n AXPIntegrationDomainProviderContext,\n} from '@acorex-platform/framework-client/common';\nimport { Injectable } from '@angular/core';\nimport {\n AXE_WEATHER_DOMAIN_ID,\n RootConfig,\n} from '@acorex-platform/extension-weather-core-client/contracts';\n\nconst I18N = `@${RootConfig.config.i18n}:integration.domain`;\n\n@Injectable()\nexport class AXEWeatherIntegrationDomainProvider implements AXPIntegrationDomainProvider {\n async provide(context: AXPIntegrationDomainProviderContext): Promise<void> {\n context.register({\n id: AXE_WEATHER_DOMAIN_ID,\n module: RootConfig.module.name,\n displayName: `${I18N}.title`,\n description: `${I18N}.description`,\n icon: RootConfig.module.icon,\n category: AXP_INTEGRATION_CATEGORY.Weather,\n capabilities: [],\n settingsGroup: 'experience',\n sortOrder: 10,\n });\n }\n}\n","import { AXPModuleManifest } from '@acorex-platform/framework-client/core';\nimport { RootConfig } from '@acorex-platform/extension-weather-core-client/contracts';\n\nexport const WeatherExtensionManifest: AXPModuleManifest = {\n name: RootConfig.module.name,\n version: '1.0.0',\n title: RootConfig.module.title,\n icon: RootConfig.module.icon,\n i18n: RootConfig.config.i18n,\n type: 'integration',\n domain: 'weather',\n dependencies: [],\n};\n","import {\n AXP_EXPERIENCE_SETTINGS_GROUP,\n AXP_EXPERIENCE_SETTINGS_SECTIONS,\n AXPSettingDefinitionProvider,\n AXPSettingDefinitionProviderContext,\n} from '@acorex-platform/framework-client/common';\nimport { AXPWidgetsList } from '@acorex-platform/framework-shared/core';\nimport { Injectable } from '@angular/core';\nimport {\n AXEWeatherSettingKeys,\n RootConfig,\n WEATHER_PROVIDER_IDS,\n} from '@acorex-platform/extension-weather-core-client/contracts';\n\nconst I18N = `@${RootConfig.config.i18n}:settings`;\n\n@Injectable()\nexport class AXEWeatherSettingsProvider implements AXPSettingDefinitionProvider {\n async provide(context: AXPSettingDefinitionProviderContext): Promise<void> {\n if (!context.hasGroup(AXP_EXPERIENCE_SETTINGS_GROUP)) {\n return;\n }\n\n const experience = context.group(AXP_EXPERIENCE_SETTINGS_GROUP);\n if (!experience) {\n return;\n }\n\n const widgets = experience.section(AXP_EXPERIENCE_SETTINGS_SECTIONS.Widgets);\n if (!widgets) {\n return;\n }\n\n widgets.addSetting({\n key: AXEWeatherSettingKeys.ActiveProvider,\n title: `${I18N}.provider.active-provider.title`,\n scope: 'T',\n overridableAt: [],\n isInherited: true,\n defaultValue: WEATHER_PROVIDER_IDS.WeatherApi,\n widget: {\n type: AXPWidgetsList.Editors.SelectBox,\n options: {\n dataSource: [\n { id: WEATHER_PROVIDER_IDS.WeatherApi, title: 'WeatherAPI.com' },\n { id: WEATHER_PROVIDER_IDS.OpenWeatherMap, title: 'OpenWeatherMap' },\n ],\n },\n },\n description: `${I18N}.provider.active-provider.description`,\n });\n }\n}\n","import { getWeatherCondition } from '@acorex-platform/extension-weather-core-client/contracts';\n\n/** Allowed grid sizes: 1×2, 2×1, 2×2, 4×2, 4×4 (no 1×1, no 1×4). */\nexport type AXPWeatherLayoutVariant = '1x2' | '2x1' | '2x2' | '4x2' | '4x4';\n\nexport interface AXPWeatherVisualTheme {\n blob: string;\n high: string;\n low: string;\n accent: string;\n background: string;\n}\n\nconst GRID_CELL_HEIGHT = 75;\nconst GRID_GAP = 5;\n\nconst CONDITION_HUES: Record<string, number> = {\n sunny: 38,\n clearNight: 250,\n partlyCloudy: 210,\n partlyCloudyNight: 250,\n cloudy: 215,\n rain: 220,\n showers: 215,\n thunderstorm: 270,\n snow: 200,\n mist: 215,\n unknown: 210,\n};\n\nfunction normalizeHue(hue: number): number {\n return ((hue % 360) + 360) % 360;\n}\n\n/** Snap pixel size to the nearest dashboard grid unit count (1–4). */\nfunction gridUnitsFromPixels(size: number, cellSize: number): number {\n let bestUnits = 1;\n let bestDelta = Infinity;\n\n for (let units = 1; units <= 4; units++) {\n const expected = units * cellSize + (units - 1) * GRID_GAP;\n const delta = Math.abs(size - expected);\n if (delta < bestDelta) {\n bestDelta = delta;\n bestUnits = units;\n }\n }\n\n return bestUnits;\n}\n\nexport function resolveWeatherGridUnits(width: number, height: number): { w: number; h: number } {\n return {\n w: gridUnitsFromPixels(width, 112),\n h: gridUnitsFromPixels(height, GRID_CELL_HEIGHT),\n };\n}\n\nexport function resolveWeatherLayoutVariant(width: number, height: number): AXPWeatherLayoutVariant {\n if (width <= 0 || height <= 0) {\n return '2x2';\n }\n\n const { w, h } = resolveWeatherGridUnits(width, height);\n\n // Snap disallowed sizes to nearest allowed layout.\n if (w === 1 && h === 1) {\n return '2x2';\n }\n\n if (w === 1 && h >= 4) {\n return '1x2';\n }\n\n if (w === 1 && h === 3) {\n return '1x2';\n }\n\n if (w >= 4 && h >= 4) {\n return '4x4';\n }\n\n if (w >= 4 && h >= 2) {\n return '4x2';\n }\n\n if (w >= 4 && h === 1) {\n return '2x1';\n }\n\n if (w >= 2 && h >= 2) {\n return '2x2';\n }\n\n if (w >= 2 && h === 1) {\n return '2x1';\n }\n\n if (w === 1 && h >= 2) {\n return '1x2';\n }\n\n return '2x2';\n}\n\nexport function getWeatherConditionHue(conditionId: string): number {\n const normalized = String(conditionId || 'unknown').replace(/\\s+/g, '');\n return CONDITION_HUES[normalized] ?? CONDITION_HUES[getWeatherCondition(normalized).id] ?? CONDITION_HUES['unknown'];\n}\n\nexport function buildWeatherVisualTheme(conditionId: string): AXPWeatherVisualTheme {\n const condition = getWeatherCondition(conditionId || 'partlyCloudy');\n const hue = getWeatherConditionHue(condition.id);\n const accent = condition.color || '#6ba4e8';\n const h = normalizeHue(hue);\n\n const isWarm = ['sunny', 'clearNight'].includes(condition.id);\n const high = isWarm ? '#f59e0b' : '#3b82f6';\n const low = '#3b82f6';\n\n return {\n background: `linear-gradient(135deg, hsl(${h}, 84%, 97%) 0%, hsl(${h}, 68%, 98%) 52%, #fff 100%)`,\n blob: `radial-gradient(circle at 100% 100%, hsla(${h}, 85%, 72%, 0.45) 0%, hsla(${h}, 70%, 80%, 0.18) 42%, transparent 72%)`,\n high,\n low,\n accent,\n };\n}\n\nexport function shouldShowWeatherStats(_variant: AXPWeatherLayoutVariant): boolean {\n return true;\n}\n\nexport function shouldShowWeatherFeelsLike(variant: AXPWeatherLayoutVariant): boolean {\n return variant !== '1x2';\n}\n\nexport function shouldShowWeatherHourly(variant: AXPWeatherLayoutVariant): boolean {\n return variant === '2x1' || variant === '4x2' || variant === '4x4';\n}\n\nexport function shouldShowWeatherMetrics(variant: AXPWeatherLayoutVariant): boolean {\n return variant === '4x2' || variant === '4x4';\n}\n\nexport function shouldShowWeatherDaily(variant: AXPWeatherLayoutVariant, showForecast: boolean): boolean {\n return showForecast && (variant === '4x2' || variant === '4x4');\n}\n\nexport function isWeatherWideDashboard(variant: AXPWeatherLayoutVariant): boolean {\n return variant === '4x2' || variant === '4x4';\n}\n\n/** Cap hourly slots so wide tiles fill evenly without a horizontal scrollbar. */\nexport function resolveWeatherHourlyCount(\n variant: AXPWeatherLayoutVariant,\n configuredHours: number,\n): number {\n const configured = Number.isFinite(configuredHours) ? Math.max(1, Math.floor(configuredHours)) : 6;\n\n switch (variant) {\n case '2x1':\n return Math.min(configured, 4);\n case '4x2':\n return Math.min(configured, 4);\n case '4x4':\n return Math.min(configured, 6);\n default:\n return configured;\n }\n}\n","import { AXButtonModule } from '@acorex/components/button';\nimport { AXSkeletonModule } from '@acorex/components/skeleton';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AXPStateMessageComponent } from '@acorex-platform/framework-client/layout/components';\nimport { AXPDashboardWidgetComponent, AXPDashboardWidgetContainerSize } from '@acorex-platform/module-dashboard-management-client';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n computed,\n effect,\n inject,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Subscription, catchError, finalize, interval as rxjsInterval, of, switchMap } from 'rxjs';\nimport {\n AXPWeatherData,\n AXPWeatherForecastDay,\n AXPWeatherHour,\n} from '@acorex-platform/extension-weather-core-client/contracts';\nimport { AXPWeatherApiAbstract, AXEWeatherGatewayService } from '@acorex-platform/extension-weather-core-gateway';\nimport {\n buildWeatherVisualTheme,\n resolveWeatherHourlyCount,\n resolveWeatherLayoutVariant,\n shouldShowWeatherDaily,\n shouldShowWeatherFeelsLike,\n shouldShowWeatherHourly,\n shouldShowWeatherMetrics,\n shouldShowWeatherStats,\n} from './weather-widget.utils';\n\n@Component({\n templateUrl: './weather-widget.component.html',\n styleUrls: ['./weather-widget.component.css'],\n standalone: true,\n imports: [\n CommonModule,\n AXTranslationModule,\n AXSkeletonModule,\n AXButtonModule,\n AXPStateMessageComponent,\n ],\n providers: [\n {\n provide: AXPWeatherApiAbstract,\n useClass: AXEWeatherGatewayService,\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AXPWeatherWidgetViewComponent extends AXPDashboardWidgetComponent {\n private weatherService = inject(AXPWeatherApiAbstract);\n private destroyRef = inject(DestroyRef);\n\n private containerWidth = signal(0);\n private containerHeight = signal(0);\n private refreshSubscription: Subscription | null = null;\n private iconCache = new Map<string, string>();\n\n protected weatherData = signal<AXPWeatherData | null>(null);\n protected isLoading = signal(true);\n protected hasError = signal(false);\n protected errorMessage = signal('');\n\n protected city = computed(() => this.options()['city'] || 'New York');\n protected temperatureUnit = computed(() => this.options()['temperatureUnit']?.id || '°C');\n protected windSpeedUnit = computed(() => this.options()['windSpeedUnit']?.id || 'km/h');\n protected showHumidity = computed(() => this.options()['showHumidity'] !== false);\n protected showWind = computed(() => this.options()['showWind'] !== false);\n protected showForecast = computed(() => this.options()['showForecast'] !== false);\n protected forecastDays = computed(() => this.options()['forecastDays'] ?? 5);\n protected forecastHours = computed(() => this.options()['forecastHours'] ?? 6);\n protected autoRefresh = computed(() => this.options()['autoRefresh'] !== false);\n protected refreshInterval = computed(() => this.options()['refreshInterval']?.id ?? 15);\n\n protected layoutVariant = computed(() =>\n resolveWeatherLayoutVariant(this.containerWidth(), this.containerHeight()),\n );\n\n protected visualTheme = computed(() =>\n buildWeatherVisualTheme(this.weatherData()?.current.condition || 'partlyCloudy'),\n );\n\n protected showStats = computed(() => shouldShowWeatherStats(this.layoutVariant()));\n protected showFeelsLike = computed(() => shouldShowWeatherFeelsLike(this.layoutVariant()));\n protected showHourly = computed(() => shouldShowWeatherHourly(this.layoutVariant()));\n protected showMetrics = computed(() => shouldShowWeatherMetrics(this.layoutVariant()));\n protected showDaily = computed(() => shouldShowWeatherDaily(this.layoutVariant(), this.showForecast()));\n protected effectiveForecastHours = computed(() =>\n resolveWeatherHourlyCount(this.layoutVariant(), this.forecastHours()),\n );\n\n protected displayedDailyForecast = computed(() => {\n const weatherData = this.weatherData();\n if (!weatherData?.forecast) {\n return [];\n }\n\n return weatherData.forecast.slice(1, this.forecastDays());\n });\n\n protected displayedHourlyForecast = computed(() => {\n const maxHours = this.effectiveForecastHours();\n const weatherData = this.weatherData();\n if (!weatherData?.forecast?.[0]?.hour) {\n return [];\n }\n\n const now = new Date();\n const currentHour = now.getHours();\n const todayHours = weatherData.forecast[0].hour;\n\n const remainingTodayHours = todayHours.filter((hour) => {\n const hourTime = new Date(hour.time);\n return hourTime.getHours() > currentHour;\n });\n\n let result = [...remainingTodayHours];\n if (result.length < maxHours && weatherData.forecast.length > 1) {\n const tomorrowHours = weatherData.forecast[1].hour;\n const neededFromTomorrow = maxHours - result.length;\n result = [...result, ...tomorrowHours.slice(0, neededFromTomorrow)];\n }\n\n return result.slice(0, maxHours);\n });\n\n constructor() {\n super();\n\n effect(() => {\n this.options();\n this.loadWeatherData();\n this.setupRefreshTimer();\n });\n\n this.destroyRef.onDestroy(() => this.clearRefreshTimer());\n }\n\n protected override onContainerSizeChanged(size: AXPDashboardWidgetContainerSize): void {\n this.containerWidth.set(size.width);\n this.containerHeight.set(size.height);\n }\n\n protected refreshWeather(): void {\n this.loadWeatherData();\n }\n\n protected getConditionIcon(conditionId: string): string {\n const id = conditionId || 'unknown';\n\n if (this.iconCache.has(id)) {\n return this.iconCache.get(id) as string;\n }\n\n const iconPath = this.weatherService.resolveConditionIcon(id);\n this.iconCache.set(id, iconPath);\n return iconPath;\n }\n\n protected getConditionName(conditionId: string): string {\n const condition = this.weatherService.getCondition(conditionId);\n if (!condition?.name) {\n return '@dashboard:weather.conditions.unknown';\n }\n\n const formattedName = condition.name.toLowerCase().replace(/\\s+/g, '-');\n return `@dashboard:weather.conditions.${formattedName}`;\n }\n\n protected getCurrentTemperature(): number {\n const data = this.weatherData();\n if (!data) {\n return 0;\n }\n\n return this.temperatureUnit() === '°C' ? data.current.tempC : data.current.tempF;\n }\n\n protected getFeelsLikeTemperature(): number {\n const data = this.weatherData();\n if (!data) {\n return 0;\n }\n\n return this.temperatureUnit() === '°C' ? data.current.feelsLikeC : data.current.feelsLikeF;\n }\n\n protected getMaxTemp(): number {\n const day = this.weatherData()?.forecast?.[0];\n if (!day) {\n return 0;\n }\n\n return this.temperatureUnit() === '°C' ? day.maxTempC : day.maxTempF;\n }\n\n protected getMinTemp(): number {\n const day = this.weatherData()?.forecast?.[0];\n if (!day) {\n return 0;\n }\n\n return this.temperatureUnit() === '°C' ? day.minTempC : day.minTempF;\n }\n\n protected getHumidity(): number {\n return this.weatherData()?.current.humidity ?? 0;\n }\n\n protected getWindSpeed(): number {\n const data = this.weatherData();\n if (!data) {\n return 0;\n }\n\n return this.windSpeedUnit() === 'km/h' ? data.current.windKph : data.current.windMph;\n }\n\n protected getUvIndex(): number {\n return this.weatherData()?.current.uv ?? 0;\n }\n\n protected getWindSpeedUnitKey(): string {\n return this.windSpeedUnit() === 'km/h' ? '@dashboard:weather.units.kmh' : '@dashboard:weather.units.mph';\n }\n\n protected getForecastDayTemp(day: AXPWeatherForecastDay): number {\n return this.temperatureUnit() === '°C' ? day.maxTempC : day.maxTempF;\n }\n\n protected getForecastDayMinTemp(day: AXPWeatherForecastDay): number {\n return this.temperatureUnit() === '°C' ? day.minTempC : day.minTempF;\n }\n\n protected getHourLabel(timeStr: string): string {\n const time = new Date(timeStr);\n return time.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', hour12: false });\n }\n\n protected getHourTemp(hour: AXPWeatherHour): number {\n return this.temperatureUnit() === '°C' ? hour.tempC : hour.tempF;\n }\n\n protected getDayName(date: Date): string {\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n const tomorrow = new Date(today);\n tomorrow.setDate(tomorrow.getDate() + 1);\n\n const checkDate = new Date(date);\n checkDate.setHours(0, 0, 0, 0);\n\n if (checkDate.getTime() === today.getTime()) {\n return '@dashboard:weather.days.today';\n }\n if (checkDate.getTime() === tomorrow.getTime()) {\n return '@dashboard:weather.days.tomorrow';\n }\n\n const days = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'];\n return `@dashboard:weather.days.${days[checkDate.getDay()]}`;\n }\n\n protected parseDate(dateStr: string): Date {\n return new Date(dateStr);\n }\n\n protected locationShortLabel(): string {\n const location = this.weatherData()?.location;\n const raw = (location?.country || location?.city || this.city()).trim();\n\n if (/^[A-Za-z]{2,3}$/.test(raw)) {\n return raw.toUpperCase();\n }\n\n const words = raw.split(/\\s+/).filter(Boolean);\n if (words.length >= 2) {\n return `${words[0][0] ?? ''}${words[1][0] ?? ''}`.toUpperCase();\n }\n\n return raw.slice(0, 2).toUpperCase();\n }\n\n private loadWeatherData(): void {\n if (!this.city()) {\n this.isLoading.set(false);\n return;\n }\n\n this.isLoading.set(true);\n this.hasError.set(false);\n this.errorMessage.set('');\n\n const requestDays = Math.max(this.forecastDays(), 2);\n\n this.weatherService\n .getForecast({\n location: this.city(),\n tempUnit: this.temperatureUnit(),\n days: requestDays,\n })\n .pipe(\n catchError((error) => {\n this.handleError(error);\n return of(null);\n }),\n finalize(() => this.isLoading.set(false)),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe((data) => {\n if (data) {\n this.weatherData.set(data);\n }\n });\n }\n\n private setupRefreshTimer(): void {\n this.clearRefreshTimer();\n\n if (!this.autoRefresh()) {\n return;\n }\n\n const intervalValue = Math.max(this.refreshInterval(), 5);\n const intervalMs = intervalValue * 60 * 1000;\n\n this.refreshSubscription = rxjsInterval(intervalMs)\n .pipe(\n switchMap(() => {\n this.loadWeatherData();\n return of(null);\n }),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe();\n }\n\n private clearRefreshTimer(): void {\n if (this.refreshSubscription) {\n this.refreshSubscription.unsubscribe();\n this.refreshSubscription = null;\n }\n }\n\n private handleError(error: unknown): void {\n console.error('Weather widget error:', error);\n this.hasError.set(true);\n\n const status = (error as { status?: number })?.status;\n if (status === 0) {\n this.errorMessage.set('@dashboard:weather.error.network');\n return;\n }\n\n if (status !== undefined && status >= 400 && status < 500) {\n this.errorMessage.set('@dashboard:weather.error.api');\n return;\n }\n\n this.errorMessage.set('@dashboard:weather.error.general');\n }\n}\n","<div\n class=\"weather-card weather-card--{{ layoutVariant() }}\"\n [style.background]=\"visualTheme().background\"\n [style.--weather-high]=\"visualTheme().high\"\n [style.--weather-low]=\"visualTheme().low\"\n [style.--weather-accent]=\"visualTheme().accent\"\n [attr.aria-label]=\"'Current weather for ' + city()\"\n>\n @if (isLoading()) {\n <div class=\"weather-card__state\" [attr.aria-busy]=\"true\">\n <ax-skeleton class=\"weather-card__skeleton-icon\"></ax-skeleton>\n <div class=\"weather-card__skeleton-lines\">\n <ax-skeleton class=\"weather-card__skeleton-line weather-card__skeleton-line--lg\"></ax-skeleton>\n <ax-skeleton class=\"weather-card__skeleton-line\"></ax-skeleton>\n </div>\n </div>\n } @else if (hasError()) {\n <div class=\"weather-card__state\">\n <axp-state-message\n mode=\"error\"\n icon=\"fa-solid fa-exclamation-triangle\"\n [title]=\"'@dashboard:weather.error.title'\"\n [description]=\"errorMessage()\"\n >\n <button slot=\"actions\" type=\"button\" class=\"weather-card__retry\" (click)=\"refreshWeather()\">\n <i class=\"fa-solid fa-sync-alt\" aria-hidden=\"true\"></i>\n <span>{{ '@dashboard:weather.retry' | translate | async }}</span>\n </button>\n </axp-state-message>\n </div>\n } @else if (weatherData()) {\n <div class=\"weather-card__blob\" [style.background]=\"visualTheme().blob\" aria-hidden=\"true\"></div>\n\n @if (layoutVariant() === '1x2') {\n <div class=\"weather-card__tall\">\n <div class=\"weather-card__hero\">\n <div class=\"weather-card__hero-core\">\n <img\n [src]=\"getConditionIcon(weatherData()!.current.condition)\"\n class=\"weather-card__hero-icon\"\n [alt]=\"getConditionName(weatherData()!.current.condition) | translate | async\"\n loading=\"lazy\"\n />\n <span class=\"weather-card__temp\">{{ getCurrentTemperature() | number: '1.0-0' }}°</span>\n </div>\n <div class=\"weather-card__inline-location\">\n <i class=\"fa-solid fa-location-dot\" aria-hidden=\"true\"></i>\n <span>{{ locationShortLabel() }}</span>\n </div>\n </div>\n\n <p class=\"weather-card__condition weather-card__condition--center\">\n {{ getConditionName(weatherData()!.current.condition) | translate | async }}\n </p>\n\n @if (showStats()) {\n <div class=\"weather-card__footer-stats\">\n <span class=\"weather-card__stat weather-card__stat--high\">\n H {{ getMaxTemp() | number: '1.0-0' }}°\n </span>\n <span class=\"weather-card__stat weather-card__stat--low\">\n L {{ getMinTemp() | number: '1.0-0' }}°\n </span>\n </div>\n }\n </div>\n } @else {\n <header class=\"weather-card__header\">\n <img\n [src]=\"getConditionIcon(weatherData()!.current.condition)\"\n class=\"weather-card__icon\"\n [alt]=\"getConditionName(weatherData()!.current.condition) | translate | async\"\n loading=\"lazy\"\n />\n <div class=\"weather-card__location\">\n <span class=\"weather-card__city\">{{ city() }}</span>\n <i class=\"fa-solid fa-location-dot\" aria-hidden=\"true\"></i>\n </div>\n </header>\n\n <div class=\"weather-card__body\">\n <div class=\"weather-card__primary\">\n <div class=\"weather-card__temp\">{{ getCurrentTemperature() | number: '1.0-0' }}°</div>\n <p class=\"weather-card__condition\">\n {{ getConditionName(weatherData()!.current.condition) | translate | async }}\n </p>\n </div>\n\n @if (showStats()) {\n <div class=\"weather-card__stats\">\n <span class=\"weather-card__stat weather-card__stat--high\">\n H {{ getMaxTemp() | number: '1.0-0' }}°\n </span>\n <span class=\"weather-card__stat weather-card__stat--low\">\n L {{ getMinTemp() | number: '1.0-0' }}°\n </span>\n @if (showFeelsLike()) {\n <span class=\"weather-card__stat weather-card__stat--feels\">\n Feels {{ getFeelsLikeTemperature() | number: '1.0-0' }}°\n </span>\n }\n </div>\n }\n\n @if (showHourly()) {\n <section class=\"weather-card__hourly\">\n <h4 class=\"weather-card__section-title\">\n {{ '@dashboard:weather.hourly-forecast' | translate | async }}\n </h4>\n <div class=\"weather-card__hourly-row\">\n @for (hour of displayedHourlyForecast(); track hour.time) {\n <div class=\"weather-card__hour\">\n <span class=\"weather-card__hour-time\">{{ getHourLabel(hour.time) }}</span>\n <img\n [src]=\"getConditionIcon(hour.condition)\"\n class=\"weather-card__hour-icon\"\n [alt]=\"getConditionName(hour.condition) | translate | async\"\n loading=\"lazy\"\n />\n <span class=\"weather-card__hour-temp\">{{ getHourTemp(hour) | number: '1.0-0' }}°</span>\n </div>\n }\n </div>\n </section>\n }\n\n @if (showDaily()) {\n <section class=\"weather-card__daily\">\n <h4 class=\"weather-card__section-title\">\n {{ '@dashboard:weather.forecast' | translate | async }}\n </h4>\n <div class=\"weather-card__daily-list\">\n @for (day of displayedDailyForecast(); track day.date) {\n <div class=\"weather-card__daily-item\">\n <span class=\"weather-card__daily-name\">\n {{ getDayName(parseDate(day.date)) | translate | async }}\n </span>\n <img\n [src]=\"getConditionIcon(day.condition)\"\n class=\"weather-card__daily-icon\"\n [alt]=\"getConditionName(day.condition) | translate | async\"\n loading=\"lazy\"\n />\n <span class=\"weather-card__daily-high\">{{ getForecastDayTemp(day) | number: '1.0-0' }}°</span>\n <span class=\"weather-card__daily-low\">{{ getForecastDayMinTemp(day) | number: '1.0-0' }}°</span>\n </div>\n }\n </div>\n </section>\n }\n\n @if (showMetrics() && (showHumidity() || showWind() || getUvIndex() > 0)) {\n <section class=\"weather-card__metrics\">\n @if (showHumidity()) {\n <div class=\"weather-card__metric\">\n <i class=\"fa-solid fa-droplet\" aria-hidden=\"true\"></i>\n <span class=\"weather-card__metric-label\">{{ '@dashboard:weather.humidity' | translate | async }}</span>\n <span class=\"weather-card__metric-value\">{{ getHumidity() }}%</span>\n </div>\n }\n @if (showWind()) {\n <div class=\"weather-card__metric\">\n <i class=\"fa-solid fa-wind\" aria-hidden=\"true\"></i>\n <span class=\"weather-card__metric-label\">{{ '@dashboard:weather.wind' | translate | async }}</span>\n <span class=\"weather-card__metric-value\">\n {{ getWindSpeed() }} {{ getWindSpeedUnitKey() | translate | async }}\n </span>\n </div>\n }\n @if (getUvIndex() > 0) {\n <div class=\"weather-card__metric\">\n <i class=\"fa-solid fa-sun\" aria-hidden=\"true\"></i>\n <span class=\"weather-card__metric-label\">{{ '@dashboard:weather.uv-index' | translate | async }}</span>\n <span class=\"weather-card__metric-value\">{{ getUvIndex() }}</span>\n </div>\n }\n </section>\n }\n </div>\n }\n } @else {\n <div class=\"weather-card__state\">\n <axp-state-message\n icon=\"fa-solid fa-cloud-sun\"\n [title]=\"'@dashboard:weather.no-data.title'\"\n [description]=\"'@dashboard:weather.no-data.description'\"\n >\n <button slot=\"actions\" type=\"button\" class=\"weather-card__retry\" (click)=\"refreshWeather()\">\n <i class=\"fa-solid fa-sync-alt\" aria-hidden=\"true\"></i>\n <span>{{ '@dashboard:weather.load-data' | translate | async }}</span>\n </button>\n </axp-state-message>\n </div>\n }\n</div>\n","import { AXPWidgetConfig, AXPWidgetGroupEnum } from '@acorex-platform/framework-shared/widget-core';\nimport { AXPWidgetsCatalog } from '@acorex-platform/framework-shared/core';\nimport { RootConfig } from '@acorex-platform/extension-weather-core-client/contracts';\nimport {\n AXP_DASHBOARD_SHARED_SUB_UTILITY_WEATHER,\n AXP_UTILITY_WEATHER_DIMENSIONS,\n AXP_WIDGETS_UTILITY_CATEGORY,\n} from '@acorex-platform/module-dashboard-management-client';\nimport {\n AXP_APPEARANCE_PROPERTY_GROUP,\n AXP_BEHAVIOR_PROPERTY_GROUP,\n AXP_DATA_PROPERTY_GROUP,\n} from '@acorex-platform/framework-client/layout/widgets';\n\n/**\n * Responsive weather widget — adapts layout from compact to extra-large based on tile size.\n */\nexport const AXPWeatherWidget: AXPWidgetConfig = {\n name: RootConfig.widgets.weather,\n title: '@dashboard:widgets.weather.widget-title',\n description: '@dashboard:widgets.weather.widget-description',\n categories: [AXP_WIDGETS_UTILITY_CATEGORY],\n subCategory: AXP_DASHBOARD_SHARED_SUB_UTILITY_WEATHER,\n groups: [AXPWidgetGroupEnum.DashboardWidget],\n type: 'dashboard',\n icon: 'fa-light fa-cloud-sun',\n properties: [\n {\n name: 'city',\n title: '@dashboard:widgets.weather.city',\n group: AXP_DATA_PROPERTY_GROUP,\n schema: {\n defaultValue: 'New York',\n dataType: 'string',\n interface: {\n name: 'city',\n path: 'options.city',\n type: AXPWidgetsCatalog.text,\n },\n },\n visible: true,\n },\n {\n name: 'showHumidity',\n title: '@dashboard:widgets.weather.show-humidity',\n group: AXP_APPEARANCE_PROPERTY_GROUP,\n schema: {\n defaultValue: true,\n dataType: 'boolean',\n interface: {\n name: 'showHumidity',\n path: 'options.showHumidity',\n type: AXPWidgetsCatalog.toggle,\n },\n },\n visible: true,\n },\n {\n name: 'showWind',\n title: '@dashboard:widgets.weather.show-wind',\n group: AXP_APPEARANCE_PROPERTY_GROUP,\n schema: {\n defaultValue: true,\n dataType: 'boolean',\n interface: {\n name: 'showWind',\n path: 'options.showWind',\n type: AXPWidgetsCatalog.toggle,\n },\n },\n visible: true,\n },\n {\n name: 'showForecast',\n title: '@dashboard:widgets.weather.show-forecast',\n group: AXP_APPEARANCE_PROPERTY_GROUP,\n schema: {\n defaultValue: true,\n dataType: 'boolean',\n interface: {\n name: 'showForecast',\n path: 'options.showForecast',\n type: AXPWidgetsCatalog.toggle,\n },\n },\n visible: true,\n },\n {\n name: 'forecastDays',\n title: '@dashboard:widgets.weather.forecast-days',\n group: AXP_APPEARANCE_PROPERTY_GROUP,\n schema: {\n defaultValue: 5,\n dataType: 'number',\n interface: {\n name: 'forecastDays',\n path: 'options.forecastDays',\n type: AXPWidgetsCatalog.number,\n options: {\n minValue: 1,\n maxValue: 7,\n step: 1,\n },\n },\n },\n visible: true,\n },\n {\n name: 'forecastHours',\n title: '@dashboard:widgets.weather.forecast-hours',\n group: AXP_APPEARANCE_PROPERTY_GROUP,\n schema: {\n defaultValue: 6,\n dataType: 'number',\n interface: {\n name: 'forecastHours',\n path: 'options.forecastHours',\n type: AXPWidgetsCatalog.number,\n options: {\n minValue: 1,\n maxValue: 8,\n step: 1,\n },\n },\n },\n visible: true,\n },\n {\n name: 'temperatureUnit',\n title: '@dashboard:widgets.weather.temperature-unit',\n group: AXP_DATA_PROPERTY_GROUP,\n schema: {\n defaultValue: '°C',\n dataType: 'string',\n interface: {\n name: 'temperatureUnit',\n path: 'options.temperatureUnit',\n type: AXPWidgetsCatalog.select,\n options: {\n dataSource: ['°C', '°F'],\n },\n },\n },\n visible: true,\n },\n {\n name: 'windSpeedUnit',\n title: '@dashboard:widgets.weather.wind-speed-unit',\n group: AXP_DATA_PROPERTY_GROUP,\n schema: {\n defaultValue: 'km/h',\n dataType: 'string',\n interface: {\n name: 'windSpeedUnit',\n path: 'options.windSpeedUnit',\n type: AXPWidgetsCatalog.select,\n options: {\n dataSource: ['km/h', 'mph', 'm/s'],\n },\n },\n },\n visible: true,\n },\n {\n name: 'autoRefresh',\n title: '@dashboard:widgets.weather.auto-refresh',\n group: AXP_BEHAVIOR_PROPERTY_GROUP,\n schema: {\n defaultValue: true,\n dataType: 'boolean',\n interface: {\n name: 'autoRefresh',\n path: 'options.autoRefresh',\n type: AXPWidgetsCatalog.toggle,\n },\n },\n visible: true,\n },\n {\n name: 'refreshInterval',\n title: '@dashboard:widgets.weather.refresh-interval',\n group: AXP_BEHAVIOR_PROPERTY_GROUP,\n schema: {\n defaultValue: 15,\n dataType: 'number',\n interface: {\n name: 'refreshInterval',\n path: 'options.refreshInterval',\n type: AXPWidgetsCatalog.select,\n options: {\n dataSource: [5, 10, 15, 30, 60],\n },\n },\n },\n visible: true,\n },\n ],\n components: {\n view: {\n component: () => import('./weather-widget.component').then((c) => c.AXPWeatherWidgetViewComponent),\n },\n },\n meta: {\n title: { visible: false },\n dimensions: AXP_UTILITY_WEATHER_DIMENSIONS,\n },\n};\n","import { AXPWidgetGroupEnum } from '@acorex-platform/framework-shared/widget-core';\nimport { defineWidget } from '@acorex-platform/framework-shared/runtime';\nimport { RootConfig } from '@acorex-platform/extension-weather-core-client/contracts';\n\n//#region ---- Weather widget definition (AI sidecar) ----\n\n/**\n * Build-time metadata for the full weather widget; mirrors {@link AXPWeatherWidget}.\n */\nexport const axmWeatherWidgetDefinition = defineWidget({\n name: RootConfig.widgets.weather,\n title: '@dashboard:widgets.weather.widget-title',\n description: '@dashboard:widgets.weather.widget-description',\n icon: 'fa-light fa-cloud-sun',\n categories: [\n {\n name: 'utility',\n order: 7,\n title: '@dashboard-management:shared-widgets.widget-picker-category.utility',\n },\n ],\n subCategory: {\n name: 'dashboard-utility-weather',\n order: 3,\n title: '@dashboard-management:shared-widgets.widget-picker-sub-categories.utility-weather',\n },\n groups: [AXPWidgetGroupEnum.DashboardWidget],\n type: 'dashboard',\n inputs: [\n { name: 'city', title: 'City / location', interface: { name: 'text-editor' } },\n { name: 'showHumidity', title: 'Show humidity', interface: { name: 'toggle-editor' } },\n { name: 'showWind', title: 'Show wind', interface: { name: 'toggle-editor' } },\n { name: 'showForecast', title: 'Show forecast', interface: { name: 'toggle-editor' } },\n { name: 'forecastDays', title: 'Forecast days', interface: { name: 'number-editor' } },\n { name: 'forecastHours', title: 'Forecast hours', interface: { name: 'number-editor' } },\n { name: 'temperatureUnit', title: 'Temperature unit', interface: { name: 'select-editor' } },\n { name: 'windSpeedUnit', title: 'Wind speed unit', interface: { name: 'select-editor' } },\n { name: 'autoRefresh', title: 'Auto refresh', interface: { name: 'toggle-editor' } },\n { name: 'refreshInterval', title: 'Refresh interval (ms)', interface: { name: 'number-editor' } },\n ],\n outputs: [\n {\n name: 'boundValue',\n title: 'Weather snapshot',\n description: 'Resolved weather DTO from the weather API service for the configured city.',\n interface: { name: 'json' },\n },\n ],\n ai: {\n tags: ['dashboard', 'utility', 'weather', 'forecast'],\n shortDescription: '**Responsive weather** tile that adapts from compact to full forecast layout.',\n usage: {\n whenToUse: ['Operational dashboards that need ambient weather context.'],\n avoidWhen: ['Business KPIs without a location — KPI widgets.'],\n },\n renderSurfaces: [{ mode: 'view', summary: 'Dashboard tile: weather service–backed current + forecast UI.' }],\n instruction: 'City string must be geocodable by the configured weather provider; see weather-widget.config.ts.',\n },\n});\n\n//#endregion\n","import { Injectable } from '@angular/core';\nimport { AXPWidgetDefinitionProvider } from '@acorex-platform/framework-client/layout/widget-core';\nimport { AXPWeatherWidget } from './widgets';\n\n@Injectable()\nexport class AXEWeatherWidgetsProvider implements AXPWidgetDefinitionProvider {\n getWidgets() {\n return [AXPWeatherWidget];\n }\n}\n","import {\n AXP_INTEGRATION_DOMAIN_PROVIDER,\n AXP_SETTING_DEFINITION_PROVIDER,\n} from '@acorex-platform/framework-client/common';\nimport { AXP_MODULE_MANIFEST_PROVIDER } from '@acorex-platform/framework-client/core';\nimport { AXP_WIDGET_DEFINITION_PROVIDER } from '@acorex-platform/framework-client/layout/widget-core';\nimport { NgModule } from '@angular/core';\nimport { AXEWeatherIntegrationDomainProvider } from './integration/weather.integration-domain.provider';\nimport { WeatherExtensionManifest } from './manifest';\nimport { AXEWeatherSettingsProvider } from './settings.provider';\nimport { AXEWeatherWidgetsProvider } from './widget-definition.provider';\n\n@NgModule({\n providers: [\n { provide: AXP_MODULE_MANIFEST_PROVIDER, useValue: WeatherExtensionManifest, multi: true },\n { provide: AXP_WIDGET_DEFINITION_PROVIDER, useClass: AXEWeatherWidgetsProvider, multi: true },\n { provide: AXP_SETTING_DEFINITION_PROVIDER, useClass: AXEWeatherSettingsProvider, multi: true },\n { provide: AXP_INTEGRATION_DOMAIN_PROVIDER, useClass: AXEWeatherIntegrationDomainProvider, multi: true },\n ],\n})\nexport class AXEWeatherExtensionModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["I18N","rxjsInterval"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@acorex-platform/extension-weather-core-client",
|
|
3
|
+
"version": "0.0.21",
|
|
4
|
+
"sideEffects": false,
|
|
5
|
+
"peerDependencies": {
|
|
6
|
+
"@angular/common": "^21.0.0",
|
|
7
|
+
"@angular/core": "^21.0.0"
|
|
8
|
+
},
|
|
9
|
+
"dependencies": {
|
|
10
|
+
"tslib": "^2.3.0"
|
|
11
|
+
},
|
|
12
|
+
"module": "fesm2022/acorex-platform-extension-weather-core-client.mjs",
|
|
13
|
+
"typings": "types/acorex-platform-extension-weather-core-client.d.ts",
|
|
14
|
+
"exports": {
|
|
15
|
+
"./package.json": {
|
|
16
|
+
"default": "./package.json"
|
|
17
|
+
},
|
|
18
|
+
".": {
|
|
19
|
+
"types": "./types/acorex-platform-extension-weather-core-client.d.ts",
|
|
20
|
+
"default": "./fesm2022/acorex-platform-extension-weather-core-client.mjs"
|
|
21
|
+
},
|
|
22
|
+
"./contracts": {
|
|
23
|
+
"types": "./types/acorex-platform-extension-weather-core-client-contracts.d.ts",
|
|
24
|
+
"default": "./fesm2022/acorex-platform-extension-weather-core-client-contracts.mjs"
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"type": "module"
|
|
28
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
declare const RootConfig: {
|
|
2
|
+
config: {
|
|
3
|
+
i18n: string;
|
|
4
|
+
};
|
|
5
|
+
module: {
|
|
6
|
+
name: string;
|
|
7
|
+
title: string;
|
|
8
|
+
icon: string;
|
|
9
|
+
};
|
|
10
|
+
widgets: {
|
|
11
|
+
weather: string;
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
declare const AXEWeatherQueryKeys: {
|
|
16
|
+
readonly GetForecast: "WeatherExtension:Weather:GetForecast";
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
declare enum AXEWeatherSettingKeys {
|
|
20
|
+
ActiveProvider = "WeatherExtension:Setting:ActiveProvider"
|
|
21
|
+
}
|
|
22
|
+
declare const WEATHER_PROVIDER_IDS: {
|
|
23
|
+
readonly WeatherApi: "weatherapi";
|
|
24
|
+
readonly OpenWeatherMap: "openweathermap";
|
|
25
|
+
};
|
|
26
|
+
type WeatherProviderId = (typeof WEATHER_PROVIDER_IDS)[keyof typeof WEATHER_PROVIDER_IDS];
|
|
27
|
+
|
|
28
|
+
declare const AXE_WEATHER_DOMAIN_ID = "weather";
|
|
29
|
+
|
|
30
|
+
interface AXPWeatherLocation {
|
|
31
|
+
city: string;
|
|
32
|
+
country: string;
|
|
33
|
+
displayName: string;
|
|
34
|
+
}
|
|
35
|
+
interface AXPWeatherCondition {
|
|
36
|
+
condition: string;
|
|
37
|
+
conditionCode: number;
|
|
38
|
+
iconUrl: string;
|
|
39
|
+
tempC: number;
|
|
40
|
+
tempF: number;
|
|
41
|
+
feelsLikeC: number;
|
|
42
|
+
feelsLikeF: number;
|
|
43
|
+
humidity: number;
|
|
44
|
+
windKph: number;
|
|
45
|
+
windMph: number;
|
|
46
|
+
windDirection: string;
|
|
47
|
+
uv: number;
|
|
48
|
+
/** Whether it is daytime at the weather location (from provider). */
|
|
49
|
+
isDay: boolean;
|
|
50
|
+
lastUpdated: string;
|
|
51
|
+
}
|
|
52
|
+
interface AXPWeatherHour {
|
|
53
|
+
time: string;
|
|
54
|
+
condition: string;
|
|
55
|
+
iconUrl: string;
|
|
56
|
+
tempC: number;
|
|
57
|
+
tempF: number;
|
|
58
|
+
isDay?: boolean;
|
|
59
|
+
}
|
|
60
|
+
interface AXPWeatherForecastDay {
|
|
61
|
+
date: string;
|
|
62
|
+
day: string;
|
|
63
|
+
condition: string;
|
|
64
|
+
iconUrl: string;
|
|
65
|
+
maxTempC: number;
|
|
66
|
+
maxTempF: number;
|
|
67
|
+
minTempC: number;
|
|
68
|
+
minTempF: number;
|
|
69
|
+
hour: AXPWeatherHour[];
|
|
70
|
+
}
|
|
71
|
+
interface AXPWeatherData {
|
|
72
|
+
location: AXPWeatherLocation;
|
|
73
|
+
current: AXPWeatherCondition;
|
|
74
|
+
forecast: AXPWeatherForecastDay[];
|
|
75
|
+
}
|
|
76
|
+
interface AXPWeatherRequestOptions {
|
|
77
|
+
tempUnit?: string;
|
|
78
|
+
location?: string;
|
|
79
|
+
}
|
|
80
|
+
interface AXPWeatherForecastRequest extends AXPWeatherRequestOptions {
|
|
81
|
+
days?: number;
|
|
82
|
+
}
|
|
83
|
+
interface AXPWeatherConditionDisplay {
|
|
84
|
+
id: string;
|
|
85
|
+
name: string;
|
|
86
|
+
icon: string;
|
|
87
|
+
svgIcon: string;
|
|
88
|
+
color: string;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
declare const WEATHER_PROVIDER: unique symbol;
|
|
92
|
+
interface WeatherProviderPort {
|
|
93
|
+
readonly id: string;
|
|
94
|
+
getWeather(request: AXPWeatherForecastRequest): Promise<AXPWeatherData>;
|
|
95
|
+
getForecast(request: AXPWeatherForecastRequest): Promise<AXPWeatherData>;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
declare function getWeatherCondition(id: string): AXPWeatherConditionDisplay;
|
|
99
|
+
declare function resolveWeatherConditionIcon(conditionId: string): string;
|
|
100
|
+
declare function applyDayNightToCondition(conditionId: string, isDay: boolean): string;
|
|
101
|
+
declare function mapApiConditionToId(conditionText: string, isDay?: boolean): string;
|
|
102
|
+
declare function parseWeatherLocation(location: string): {
|
|
103
|
+
city: string;
|
|
104
|
+
country: string;
|
|
105
|
+
display: string;
|
|
106
|
+
};
|
|
107
|
+
declare function formatWeatherLocationName(locationParts: {
|
|
108
|
+
city: string;
|
|
109
|
+
country: string;
|
|
110
|
+
display: string;
|
|
111
|
+
}): string;
|
|
112
|
+
|
|
113
|
+
export { AXEWeatherQueryKeys, AXEWeatherSettingKeys, AXE_WEATHER_DOMAIN_ID, RootConfig, WEATHER_PROVIDER, WEATHER_PROVIDER_IDS, applyDayNightToCondition, formatWeatherLocationName, getWeatherCondition, mapApiConditionToId, parseWeatherLocation, resolveWeatherConditionIcon };
|
|
114
|
+
export type { AXPWeatherCondition, AXPWeatherConditionDisplay, AXPWeatherData, AXPWeatherForecastDay, AXPWeatherForecastRequest, AXPWeatherHour, AXPWeatherLocation, AXPWeatherRequestOptions, WeatherProviderId, WeatherProviderPort };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import * as _acorex_platform_framework_shared_widget_core from '@acorex-platform/framework-shared/widget-core';
|
|
3
|
+
import { AXPWidgetDefinitionProvider } from '@acorex-platform/framework-client/layout/widget-core';
|
|
4
|
+
|
|
5
|
+
declare class AXEWeatherExtensionModule {
|
|
6
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<AXEWeatherExtensionModule, never>;
|
|
7
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<AXEWeatherExtensionModule, never, never, never>;
|
|
8
|
+
static ɵinj: i0.ɵɵInjectorDeclaration<AXEWeatherExtensionModule>;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
declare class AXEWeatherWidgetsProvider implements AXPWidgetDefinitionProvider {
|
|
12
|
+
getWidgets(): _acorex_platform_framework_shared_widget_core.AXPWidgetConfig<any>[];
|
|
13
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<AXEWeatherWidgetsProvider, never>;
|
|
14
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<AXEWeatherWidgetsProvider>;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export { AXEWeatherExtensionModule, AXEWeatherWidgetsProvider };
|