@acorex-platform/extension-weather-core-client 0.0.37 → 0.0.46
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 +41 -1
- package/fesm2022/acorex-platform-extension-weather-core-client-contracts.mjs.map +1 -1
- package/fesm2022/acorex-platform-extension-weather-core-client.mjs +0 -14
- package/fesm2022/acorex-platform-extension-weather-core-client.mjs.map +1 -1
- package/package.json +2 -2
- package/types/acorex-platform-extension-weather-core-client-contracts.d.ts +24 -1
|
@@ -15,7 +15,47 @@ const RootConfig = {
|
|
|
15
15
|
widgets: {
|
|
16
16
|
weather: dashboardWidgetId('Weather'),
|
|
17
17
|
},
|
|
18
|
+
/**
|
|
19
|
+
* Daily field-mission weather digest (BackgroundJobSchedule → DailyForecastDigest:Run).
|
|
20
|
+
* Fetches today's forecast for configured cities, asks AI whether outdoor missions
|
|
21
|
+
* are suitable, and emails tenant admins a human-readable briefing (not raw data).
|
|
22
|
+
* Template id aligns with AXM_TEXT_TEMPLATE_IDS.weatherDailyForecastDigest.
|
|
23
|
+
*/
|
|
24
|
+
dailyForecastDigest: {
|
|
25
|
+
providerKey: 'weather-extension',
|
|
26
|
+
defaultCron: '0 6 * * *',
|
|
27
|
+
defaultTimezone: 'Australia/Sydney',
|
|
28
|
+
templateId: 'c7100013-0001-4111-b111-131313131313',
|
|
29
|
+
tenantRoleNames: ['admin', 'account-holder'],
|
|
30
|
+
defaultLocations: [
|
|
31
|
+
'Sydney, Australia',
|
|
32
|
+
'Melbourne, Australia',
|
|
33
|
+
'Brisbane, Australia',
|
|
34
|
+
'Perth, Australia',
|
|
35
|
+
'Auckland, New Zealand',
|
|
36
|
+
'Wellington, New Zealand',
|
|
37
|
+
'Christchurch, New Zealand',
|
|
38
|
+
],
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
//#endregion
|
|
42
|
+
|
|
43
|
+
const WeatherExtensionManifest = {
|
|
44
|
+
name: RootConfig.module.name,
|
|
45
|
+
version: '1.0.0',
|
|
46
|
+
title: RootConfig.module.title,
|
|
47
|
+
icon: RootConfig.module.icon,
|
|
48
|
+
i18n: RootConfig.config.i18n,
|
|
49
|
+
type: 'integration',
|
|
50
|
+
domain: 'weather',
|
|
51
|
+
dependencies: [],
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
//#region ---- Weather extension command keys ----
|
|
55
|
+
const AXEWeatherCommandKeys = {
|
|
56
|
+
DailyForecastDigestRun: 'WeatherExtension:DailyForecastDigest:Run',
|
|
18
57
|
};
|
|
58
|
+
const AXE_WEATHER_DAILY_FORECAST_DIGEST_RUN_COMMAND_KEY = AXEWeatherCommandKeys.DailyForecastDigestRun;
|
|
19
59
|
//#endregion
|
|
20
60
|
|
|
21
61
|
//#region ---- Weather query keys ----
|
|
@@ -157,5 +197,5 @@ function formatWeatherLocationName(locationParts) {
|
|
|
157
197
|
* Generated bundle index. Do not edit.
|
|
158
198
|
*/
|
|
159
199
|
|
|
160
|
-
export { AXEWeatherQueryKeys, AXEWeatherSettingKeys, AXE_WEATHER_DOMAIN_ID, RootConfig, WEATHER_PROVIDER, WEATHER_PROVIDER_IDS, applyDayNightToCondition, formatWeatherLocationName, getWeatherCondition, mapApiConditionToId, parseWeatherLocation, resolveWeatherConditionIcon };
|
|
200
|
+
export { AXEWeatherCommandKeys, AXEWeatherQueryKeys, AXEWeatherSettingKeys, AXE_WEATHER_DAILY_FORECAST_DIGEST_RUN_COMMAND_KEY, AXE_WEATHER_DOMAIN_ID, RootConfig, WEATHER_PROVIDER, WEATHER_PROVIDER_IDS, WeatherExtensionManifest, applyDayNightToCondition, formatWeatherLocationName, getWeatherCondition, mapApiConditionToId, parseWeatherLocation, resolveWeatherConditionIcon };
|
|
161
201
|
//# sourceMappingURL=acorex-platform-extension-weather-core-client-contracts.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-platform-extension-weather-core-client-contracts.mjs","sources":["../../../../libs/extensions/weather/core/contracts/src/root-config.ts","../../../../libs/extensions/weather/core/contracts/src/query.keys.ts","../../../../libs/extensions/weather/core/contracts/src/settings.keys.ts","../../../../libs/extensions/weather/core/contracts/src/integration-domain.constants.ts","../../../../libs/extensions/weather/core/contracts/src/weather.types.ts","../../../../libs/extensions/weather/core/contracts/src/weather-provider.port.ts","../../../../libs/extensions/weather/core/contracts/src/weather-condition.util.ts","../../../../libs/extensions/weather/core/contracts/src/acorex-platform-extension-weather-core-client-contracts.ts"],"sourcesContent":["//#region ---- Weather extension root config ----\n\nconst config = {\n i18n: 'extensions-weather',\n};\n\nconst MODULE_NAME = 'WeatherExtension';\n\n/** Keep dashboard widget type ids for backward compatibility with existing dashboards. */\nconst dashboardWidgetId = (segment: string): string => `DashboardManagement:Widget:Dashboard:${segment}`;\n\nexport const RootConfig = {\n config,\n module: {\n name: MODULE_NAME,\n title: `@${config.i18n}:module.title`,\n icon: 'fa-light fa-cloud-sun-rain',\n },\n widgets: {\n weather: dashboardWidgetId('Weather'),\n },\n};\n\n//#endregion\n","//#region ---- Weather query keys ----\n\nexport const AXEWeatherQueryKeys = {\n GetForecast: 'WeatherExtension:Weather:GetForecast',\n} as const;\n\n//#endregion\n","//#region ---- Weather extension settings ----\n\nexport enum AXEWeatherSettingKeys {\n ActiveProvider = 'WeatherExtension:Setting:ActiveProvider',\n}\n\nexport const WEATHER_PROVIDER_IDS = {\n WeatherApi: 'weatherapi',\n OpenWeatherMap: 'openweathermap',\n} as const;\n\nexport type WeatherProviderId = (typeof WEATHER_PROVIDER_IDS)[keyof typeof WEATHER_PROVIDER_IDS];\n\n//#endregion\n","//#region ---- Weather integration domain ----\n\nexport const AXE_WEATHER_DOMAIN_ID = 'weather';\n\n//#endregion\n","//#region ---- Weather data types ----\n\nexport interface AXPWeatherLocation {\n city: string;\n country: string;\n displayName: string;\n}\n\nexport interface AXPWeatherCondition {\n condition: string;\n conditionCode: number;\n iconUrl: string;\n tempC: number;\n tempF: number;\n feelsLikeC: number;\n feelsLikeF: number;\n humidity: number;\n windKph: number;\n windMph: number;\n windDirection: string;\n uv: number;\n /** Whether it is daytime at the weather location (from provider). */\n isDay: boolean;\n lastUpdated: string;\n}\n\nexport interface AXPWeatherHour {\n time: string;\n condition: string;\n iconUrl: string;\n tempC: number;\n tempF: number;\n isDay?: boolean;\n}\n\nexport interface AXPWeatherForecastDay {\n date: string;\n day: string;\n condition: string;\n iconUrl: string;\n maxTempC: number;\n maxTempF: number;\n minTempC: number;\n minTempF: number;\n hour: AXPWeatherHour[];\n}\n\nexport interface AXPWeatherData {\n location: AXPWeatherLocation;\n current: AXPWeatherCondition;\n forecast: AXPWeatherForecastDay[];\n}\n\nexport interface AXPWeatherRequestOptions {\n tempUnit?: string;\n location?: string;\n}\n\nexport interface AXPWeatherForecastRequest extends AXPWeatherRequestOptions {\n days?: number;\n}\n\nexport interface AXPWeatherConditionDisplay {\n id: string;\n name: string;\n icon: string;\n svgIcon: string;\n color: string;\n}\n\n//#endregion\n","import type { AXPWeatherData, AXPWeatherForecastRequest } from './weather.types';\n\n//#region ---- Server weather provider port ----\n\nexport const WEATHER_PROVIDER = Symbol('WEATHER_PROVIDER');\n\nexport interface WeatherProviderPort {\n readonly id: string;\n getWeather(request: AXPWeatherForecastRequest): Promise<AXPWeatherData>;\n getForecast(request: AXPWeatherForecastRequest): Promise<AXPWeatherData>;\n}\n\n//#endregion\n","import type { AXPWeatherConditionDisplay } from './weather.types';\n\n//#region ---- Weather condition catalog ----\n\nconst WEATHER_CONDITIONS: Record<string, AXPWeatherConditionDisplay> = {\n sunny: { id: 'sunny', name: 'Sunny', icon: 'fa-solid fa-sun', svgIcon: 'day.svg', color: '#ff9d00' },\n clearNight: { id: 'clearNight', name: 'Clear Night', icon: 'fa-solid fa-moon', svgIcon: 'night.svg', color: '#5d639e' },\n partlyCloudy: { id: 'partlyCloudy', name: 'Partly Cloudy', icon: 'fa-solid fa-cloud-sun', svgIcon: 'cloudy-day-3.svg', color: '#6ba4e8' },\n partlyCloudyNight: { id: 'partlyCloudyNight', name: 'Partly Cloudy Night', icon: 'fa-solid fa-cloud-moon', svgIcon: 'cloudy-night-3.svg', color: '#5d639e' },\n cloudy: { id: 'cloudy', name: 'Cloudy', icon: 'fa-solid fa-cloud', svgIcon: 'cloudy.svg', color: '#72869d' },\n rain: { id: 'rain', name: 'Rain', icon: 'fa-solid fa-cloud-rain', svgIcon: 'rainy-6.svg', color: '#3a74ad' },\n showers: { id: 'showers', name: 'Showers', icon: 'fa-solid fa-cloud-showers-heavy', svgIcon: 'rainy-7.svg', color: '#2c5d8c' },\n thunderstorm: { id: 'thunderstorm', name: 'Thunderstorm', icon: 'fa-solid fa-bolt-lightning', svgIcon: 'thunder.svg', color: '#8834af' },\n snow: { id: 'snow', name: 'Snow', icon: 'fa-solid fa-snowflake', svgIcon: 'snowy-6.svg', color: '#68a9cd' },\n mist: { id: 'mist', name: 'Mist', icon: 'fa-solid fa-smog', svgIcon: 'cloudy.svg', color: '#94a3b8' },\n};\n\nexport function getWeatherCondition(id: string): AXPWeatherConditionDisplay {\n const normalizedId = String(id).toLowerCase().replace(/\\s+/g, '');\n\n if (WEATHER_CONDITIONS[normalizedId]) {\n return WEATHER_CONDITIONS[normalizedId];\n }\n\n if (normalizedId.includes('partly') && normalizedId.includes('cloud')) {\n return WEATHER_CONDITIONS['partlyCloudy'];\n }\n if (normalizedId.includes('cloud')) {\n return WEATHER_CONDITIONS['cloudy'];\n }\n if (normalizedId.includes('sun')) {\n return WEATHER_CONDITIONS['sunny'];\n }\n if (normalizedId.includes('rain')) {\n return WEATHER_CONDITIONS['rain'];\n }\n if (normalizedId.includes('snow')) {\n return WEATHER_CONDITIONS['snow'];\n }\n\n return {\n id: 'unknown',\n name: 'Unknown',\n icon: 'fa-solid fa-question',\n svgIcon: 'weather.svg',\n color: '#999999',\n };\n}\n\nexport function resolveWeatherConditionIcon(conditionId: string): string {\n return `assets/images/weather/${getWeatherCondition(conditionId).svgIcon}`;\n}\n\nexport function applyDayNightToCondition(conditionId: string, isDay: boolean): string {\n if (isDay) {\n return conditionId;\n }\n\n if (conditionId === 'sunny') {\n return 'clearNight';\n }\n\n if (conditionId === 'partlyCloudy') {\n return 'partlyCloudyNight';\n }\n\n return conditionId;\n}\n\nexport function mapApiConditionToId(conditionText: string, isDay = true): string {\n const text = conditionText.toLowerCase();\n let conditionId: string;\n\n if (text.includes('sunny') || text.includes('clear')) {\n conditionId = 'sunny';\n } else if (text === 'partly cloudy') {\n conditionId = 'partlyCloudy';\n } else {\n conditionId = resolveBaseConditionId(text);\n return applyDayNightToCondition(conditionId, isDay);\n }\n\n return applyDayNightToCondition(conditionId, isDay);\n}\n\nfunction resolveBaseConditionId(text: string): string {\n if (text.includes('sunny') || text.includes('clear')) {\n return 'sunny';\n }\n if (text === 'partly cloudy') {\n return 'partlyCloudy';\n }\n if (text.includes('cloudy') || text.includes('overcast')) {\n return 'cloudy';\n }\n if (text.includes('rain') || text.includes('drizzle') || text.includes('shower')) {\n return 'rain';\n }\n if (text.includes('thunder') || text.includes('lightning')) {\n return 'thunderstorm';\n }\n if (text.includes('snow') || text.includes('sleet') || text.includes('blizzard')) {\n return 'snow';\n }\n if (text.includes('mist') || text.includes('fog')) {\n return 'mist';\n }\n\n return 'partlyCloudy';\n}\n\nexport function parseWeatherLocation(location: string): { city: string; country: string; display: string } {\n if (!location || location.trim() === '') {\n return { city: 'New York', country: 'USA', display: 'New York' };\n }\n\n const city = location.trim();\n return { city, country: '', display: city };\n}\n\nexport function formatWeatherLocationName(locationParts: { city: string; country: string; display: string }): string {\n return locationParts.city || 'Unknown Location';\n}\n\n//#endregion\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"acorex-platform-extension-weather-core-client-contracts.mjs","sources":["../../../../libs/extensions/weather/core/contracts/src/root-config.ts","../../../../libs/extensions/weather/core/contracts/src/manifest.ts","../../../../libs/extensions/weather/core/contracts/src/commands.keys.ts","../../../../libs/extensions/weather/core/contracts/src/query.keys.ts","../../../../libs/extensions/weather/core/contracts/src/settings.keys.ts","../../../../libs/extensions/weather/core/contracts/src/integration-domain.constants.ts","../../../../libs/extensions/weather/core/contracts/src/weather.types.ts","../../../../libs/extensions/weather/core/contracts/src/weather-provider.port.ts","../../../../libs/extensions/weather/core/contracts/src/weather-condition.util.ts","../../../../libs/extensions/weather/core/contracts/src/acorex-platform-extension-weather-core-client-contracts.ts"],"sourcesContent":["//#region ---- Weather extension root config ----\n\nconst config = {\n i18n: 'extensions-weather',\n};\n\nconst MODULE_NAME = 'WeatherExtension';\n\n/** Keep dashboard widget type ids for backward compatibility with existing dashboards. */\nconst dashboardWidgetId = (segment: string): string => `DashboardManagement:Widget:Dashboard:${segment}`;\n\nexport const RootConfig = {\n config,\n module: {\n name: MODULE_NAME,\n title: `@${config.i18n}:module.title`,\n icon: 'fa-light fa-cloud-sun-rain',\n },\n widgets: {\n weather: dashboardWidgetId('Weather'),\n },\n /**\n * Daily field-mission weather digest (BackgroundJobSchedule → DailyForecastDigest:Run).\n * Fetches today's forecast for configured cities, asks AI whether outdoor missions\n * are suitable, and emails tenant admins a human-readable briefing (not raw data).\n * Template id aligns with AXM_TEXT_TEMPLATE_IDS.weatherDailyForecastDigest.\n */\n dailyForecastDigest: {\n providerKey: 'weather-extension',\n defaultCron: '0 6 * * *',\n defaultTimezone: 'Australia/Sydney',\n templateId: 'c7100013-0001-4111-b111-131313131313',\n tenantRoleNames: ['admin', 'account-holder'] as const,\n defaultLocations: [\n 'Sydney, Australia',\n 'Melbourne, Australia',\n 'Brisbane, Australia',\n 'Perth, Australia',\n 'Auckland, New Zealand',\n 'Wellington, New Zealand',\n 'Christchurch, New Zealand',\n ] as const,\n },\n};\n\n//#endregion\n","\nimport { AXPModuleManifest } from '@acorex-platform/framework-shared/core';\nimport { RootConfig } from './root-config';\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","//#region ---- Weather extension command keys ----\n\nexport const AXEWeatherCommandKeys = {\n DailyForecastDigestRun: 'WeatherExtension:DailyForecastDigest:Run',\n} as const;\n\nexport const AXE_WEATHER_DAILY_FORECAST_DIGEST_RUN_COMMAND_KEY =\n AXEWeatherCommandKeys.DailyForecastDigestRun;\n\n//#endregion\n","//#region ---- Weather query keys ----\n\nexport const AXEWeatherQueryKeys = {\n GetForecast: 'WeatherExtension:Weather:GetForecast',\n} as const;\n\n//#endregion\n","//#region ---- Weather extension settings ----\n\nexport enum AXEWeatherSettingKeys {\n ActiveProvider = 'WeatherExtension:Setting:ActiveProvider',\n}\n\nexport const WEATHER_PROVIDER_IDS = {\n WeatherApi: 'weatherapi',\n OpenWeatherMap: 'openweathermap',\n} as const;\n\nexport type WeatherProviderId = (typeof WEATHER_PROVIDER_IDS)[keyof typeof WEATHER_PROVIDER_IDS];\n\n//#endregion\n","//#region ---- Weather integration domain ----\n\nexport const AXE_WEATHER_DOMAIN_ID = 'weather';\n\n//#endregion\n","//#region ---- Weather data types ----\n\nexport interface AXPWeatherLocation {\n city: string;\n country: string;\n displayName: string;\n}\n\nexport interface AXPWeatherCondition {\n condition: string;\n conditionCode: number;\n iconUrl: string;\n tempC: number;\n tempF: number;\n feelsLikeC: number;\n feelsLikeF: number;\n humidity: number;\n windKph: number;\n windMph: number;\n windDirection: string;\n uv: number;\n /** Whether it is daytime at the weather location (from provider). */\n isDay: boolean;\n lastUpdated: string;\n}\n\nexport interface AXPWeatherHour {\n time: string;\n condition: string;\n iconUrl: string;\n tempC: number;\n tempF: number;\n isDay?: boolean;\n}\n\nexport interface AXPWeatherForecastDay {\n date: string;\n day: string;\n condition: string;\n iconUrl: string;\n maxTempC: number;\n maxTempF: number;\n minTempC: number;\n minTempF: number;\n hour: AXPWeatherHour[];\n}\n\nexport interface AXPWeatherData {\n location: AXPWeatherLocation;\n current: AXPWeatherCondition;\n forecast: AXPWeatherForecastDay[];\n}\n\nexport interface AXPWeatherRequestOptions {\n tempUnit?: string;\n location?: string;\n}\n\nexport interface AXPWeatherForecastRequest extends AXPWeatherRequestOptions {\n days?: number;\n}\n\nexport interface AXPWeatherConditionDisplay {\n id: string;\n name: string;\n icon: string;\n svgIcon: string;\n color: string;\n}\n\n//#endregion\n","import type { AXPWeatherData, AXPWeatherForecastRequest } from './weather.types';\n\n//#region ---- Server weather provider port ----\n\nexport const WEATHER_PROVIDER = Symbol('WEATHER_PROVIDER');\n\nexport interface WeatherProviderPort {\n readonly id: string;\n getWeather(request: AXPWeatherForecastRequest): Promise<AXPWeatherData>;\n getForecast(request: AXPWeatherForecastRequest): Promise<AXPWeatherData>;\n}\n\n//#endregion\n","import type { AXPWeatherConditionDisplay } from './weather.types';\n\n//#region ---- Weather condition catalog ----\n\nconst WEATHER_CONDITIONS: Record<string, AXPWeatherConditionDisplay> = {\n sunny: { id: 'sunny', name: 'Sunny', icon: 'fa-solid fa-sun', svgIcon: 'day.svg', color: '#ff9d00' },\n clearNight: { id: 'clearNight', name: 'Clear Night', icon: 'fa-solid fa-moon', svgIcon: 'night.svg', color: '#5d639e' },\n partlyCloudy: { id: 'partlyCloudy', name: 'Partly Cloudy', icon: 'fa-solid fa-cloud-sun', svgIcon: 'cloudy-day-3.svg', color: '#6ba4e8' },\n partlyCloudyNight: { id: 'partlyCloudyNight', name: 'Partly Cloudy Night', icon: 'fa-solid fa-cloud-moon', svgIcon: 'cloudy-night-3.svg', color: '#5d639e' },\n cloudy: { id: 'cloudy', name: 'Cloudy', icon: 'fa-solid fa-cloud', svgIcon: 'cloudy.svg', color: '#72869d' },\n rain: { id: 'rain', name: 'Rain', icon: 'fa-solid fa-cloud-rain', svgIcon: 'rainy-6.svg', color: '#3a74ad' },\n showers: { id: 'showers', name: 'Showers', icon: 'fa-solid fa-cloud-showers-heavy', svgIcon: 'rainy-7.svg', color: '#2c5d8c' },\n thunderstorm: { id: 'thunderstorm', name: 'Thunderstorm', icon: 'fa-solid fa-bolt-lightning', svgIcon: 'thunder.svg', color: '#8834af' },\n snow: { id: 'snow', name: 'Snow', icon: 'fa-solid fa-snowflake', svgIcon: 'snowy-6.svg', color: '#68a9cd' },\n mist: { id: 'mist', name: 'Mist', icon: 'fa-solid fa-smog', svgIcon: 'cloudy.svg', color: '#94a3b8' },\n};\n\nexport function getWeatherCondition(id: string): AXPWeatherConditionDisplay {\n const normalizedId = String(id).toLowerCase().replace(/\\s+/g, '');\n\n if (WEATHER_CONDITIONS[normalizedId]) {\n return WEATHER_CONDITIONS[normalizedId];\n }\n\n if (normalizedId.includes('partly') && normalizedId.includes('cloud')) {\n return WEATHER_CONDITIONS['partlyCloudy'];\n }\n if (normalizedId.includes('cloud')) {\n return WEATHER_CONDITIONS['cloudy'];\n }\n if (normalizedId.includes('sun')) {\n return WEATHER_CONDITIONS['sunny'];\n }\n if (normalizedId.includes('rain')) {\n return WEATHER_CONDITIONS['rain'];\n }\n if (normalizedId.includes('snow')) {\n return WEATHER_CONDITIONS['snow'];\n }\n\n return {\n id: 'unknown',\n name: 'Unknown',\n icon: 'fa-solid fa-question',\n svgIcon: 'weather.svg',\n color: '#999999',\n };\n}\n\nexport function resolveWeatherConditionIcon(conditionId: string): string {\n return `assets/images/weather/${getWeatherCondition(conditionId).svgIcon}`;\n}\n\nexport function applyDayNightToCondition(conditionId: string, isDay: boolean): string {\n if (isDay) {\n return conditionId;\n }\n\n if (conditionId === 'sunny') {\n return 'clearNight';\n }\n\n if (conditionId === 'partlyCloudy') {\n return 'partlyCloudyNight';\n }\n\n return conditionId;\n}\n\nexport function mapApiConditionToId(conditionText: string, isDay = true): string {\n const text = conditionText.toLowerCase();\n let conditionId: string;\n\n if (text.includes('sunny') || text.includes('clear')) {\n conditionId = 'sunny';\n } else if (text === 'partly cloudy') {\n conditionId = 'partlyCloudy';\n } else {\n conditionId = resolveBaseConditionId(text);\n return applyDayNightToCondition(conditionId, isDay);\n }\n\n return applyDayNightToCondition(conditionId, isDay);\n}\n\nfunction resolveBaseConditionId(text: string): string {\n if (text.includes('sunny') || text.includes('clear')) {\n return 'sunny';\n }\n if (text === 'partly cloudy') {\n return 'partlyCloudy';\n }\n if (text.includes('cloudy') || text.includes('overcast')) {\n return 'cloudy';\n }\n if (text.includes('rain') || text.includes('drizzle') || text.includes('shower')) {\n return 'rain';\n }\n if (text.includes('thunder') || text.includes('lightning')) {\n return 'thunderstorm';\n }\n if (text.includes('snow') || text.includes('sleet') || text.includes('blizzard')) {\n return 'snow';\n }\n if (text.includes('mist') || text.includes('fog')) {\n return 'mist';\n }\n\n return 'partlyCloudy';\n}\n\nexport function parseWeatherLocation(location: string): { city: string; country: string; display: string } {\n if (!location || location.trim() === '') {\n return { city: 'New York', country: 'USA', display: 'New York' };\n }\n\n const city = location.trim();\n return { city, country: '', display: city };\n}\n\nexport function formatWeatherLocationName(locationParts: { city: string; country: string; display: string }): string {\n return locationParts.city || 'Unknown Location';\n}\n\n//#endregion\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { AXP_EXPERIENCE_SETTINGS_GROUP, AXP_EXPERIENCE_SETTINGS_SECTIONS, AXP_SETTING_DEFINITION_PROVIDER, AXP_INTEGRATION_DOMAIN_PROVIDER } from '@acorex-platform/framework-client/common';
|
|
2
|
-
import { AXP_MODULE_MANIFEST_PROVIDER } from '@acorex-platform/framework-client/core';
|
|
3
2
|
import { AXP_WIDGET_DEFINITION_PROVIDER } from '@acorex-platform/framework-client/layout/widget-core';
|
|
4
3
|
import * as i0 from '@angular/core';
|
|
5
4
|
import { Injectable, inject, DestroyRef, signal, computed, effect, ChangeDetectionStrategy, Component, NgModule } from '@angular/core';
|
|
@@ -43,17 +42,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
43
42
|
type: Injectable
|
|
44
43
|
}] });
|
|
45
44
|
|
|
46
|
-
const WeatherExtensionManifest = {
|
|
47
|
-
name: RootConfig.module.name,
|
|
48
|
-
version: '1.0.0',
|
|
49
|
-
title: RootConfig.module.title,
|
|
50
|
-
icon: RootConfig.module.icon,
|
|
51
|
-
i18n: RootConfig.config.i18n,
|
|
52
|
-
type: 'integration',
|
|
53
|
-
domain: 'weather',
|
|
54
|
-
dependencies: [],
|
|
55
|
-
};
|
|
56
|
-
|
|
57
45
|
const I18N = `@${RootConfig.config.i18n}:settings`;
|
|
58
46
|
class AXEWeatherSettingsProvider {
|
|
59
47
|
async provide(context) {
|
|
@@ -777,7 +765,6 @@ class AXEWeatherExtensionModule {
|
|
|
777
765
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXEWeatherExtensionModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
778
766
|
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.8", ngImport: i0, type: AXEWeatherExtensionModule }); }
|
|
779
767
|
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXEWeatherExtensionModule, providers: [
|
|
780
|
-
{ provide: AXP_MODULE_MANIFEST_PROVIDER, useValue: WeatherExtensionManifest, multi: true },
|
|
781
768
|
{ provide: AXP_WIDGET_DEFINITION_PROVIDER, useClass: AXEWeatherWidgetsProvider, multi: true },
|
|
782
769
|
{ provide: AXP_SETTING_DEFINITION_PROVIDER, useClass: AXEWeatherSettingsProvider, multi: true },
|
|
783
770
|
{ provide: AXP_INTEGRATION_DOMAIN_PROVIDER, useClass: AXEWeatherIntegrationDomainProvider, multi: true },
|
|
@@ -787,7 +774,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
787
774
|
type: NgModule,
|
|
788
775
|
args: [{
|
|
789
776
|
providers: [
|
|
790
|
-
{ provide: AXP_MODULE_MANIFEST_PROVIDER, useValue: WeatherExtensionManifest, multi: true },
|
|
791
777
|
{ provide: AXP_WIDGET_DEFINITION_PROVIDER, useClass: AXEWeatherWidgetsProvider, multi: true },
|
|
792
778
|
{ provide: AXP_SETTING_DEFINITION_PROVIDER, useClass: AXEWeatherSettingsProvider, multi: true },
|
|
793
779
|
{ provide: AXP_INTEGRATION_DOMAIN_PROVIDER, useClass: AXEWeatherIntegrationDomainProvider, multi: true },
|
|
@@ -1 +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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"}
|
|
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/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 {\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_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 { AXEWeatherSettingsProvider } from './settings.provider';\nimport { AXEWeatherWidgetsProvider } from './widget-definition.provider';\n\n@NgModule({\n providers: [\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
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@acorex-platform/extension-weather-core-client",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.46",
|
|
4
4
|
"sideEffects": false,
|
|
5
5
|
"peerDependencies": {
|
|
6
6
|
"@angular/common": "^21.0.0 || ^22.0.0",
|
|
7
7
|
"@angular/core": "^21.0.0 || ^22.0.0"
|
|
8
8
|
},
|
|
9
9
|
"dependencies": {
|
|
10
|
-
"@acorex-platform/extension-weather-core-gateway": "0.0.
|
|
10
|
+
"@acorex-platform/extension-weather-core-gateway": "0.0.46",
|
|
11
11
|
"tslib": "^2.3.0"
|
|
12
12
|
},
|
|
13
13
|
"module": "fesm2022/acorex-platform-extension-weather-core-client.mjs",
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { AXPModuleManifest } from '@acorex-platform/framework-shared/core';
|
|
2
|
+
|
|
1
3
|
declare const RootConfig: {
|
|
2
4
|
config: {
|
|
3
5
|
i18n: string;
|
|
@@ -10,7 +12,28 @@ declare const RootConfig: {
|
|
|
10
12
|
widgets: {
|
|
11
13
|
weather: string;
|
|
12
14
|
};
|
|
15
|
+
/**
|
|
16
|
+
* Daily field-mission weather digest (BackgroundJobSchedule → DailyForecastDigest:Run).
|
|
17
|
+
* Fetches today's forecast for configured cities, asks AI whether outdoor missions
|
|
18
|
+
* are suitable, and emails tenant admins a human-readable briefing (not raw data).
|
|
19
|
+
* Template id aligns with AXM_TEXT_TEMPLATE_IDS.weatherDailyForecastDigest.
|
|
20
|
+
*/
|
|
21
|
+
dailyForecastDigest: {
|
|
22
|
+
providerKey: string;
|
|
23
|
+
defaultCron: string;
|
|
24
|
+
defaultTimezone: string;
|
|
25
|
+
templateId: string;
|
|
26
|
+
tenantRoleNames: readonly ["admin", "account-holder"];
|
|
27
|
+
defaultLocations: readonly ["Sydney, Australia", "Melbourne, Australia", "Brisbane, Australia", "Perth, Australia", "Auckland, New Zealand", "Wellington, New Zealand", "Christchurch, New Zealand"];
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
declare const WeatherExtensionManifest: AXPModuleManifest;
|
|
32
|
+
|
|
33
|
+
declare const AXEWeatherCommandKeys: {
|
|
34
|
+
readonly DailyForecastDigestRun: "WeatherExtension:DailyForecastDigest:Run";
|
|
13
35
|
};
|
|
36
|
+
declare const AXE_WEATHER_DAILY_FORECAST_DIGEST_RUN_COMMAND_KEY: "WeatherExtension:DailyForecastDigest:Run";
|
|
14
37
|
|
|
15
38
|
declare const AXEWeatherQueryKeys: {
|
|
16
39
|
readonly GetForecast: "WeatherExtension:Weather:GetForecast";
|
|
@@ -110,5 +133,5 @@ declare function formatWeatherLocationName(locationParts: {
|
|
|
110
133
|
display: string;
|
|
111
134
|
}): string;
|
|
112
135
|
|
|
113
|
-
export { AXEWeatherQueryKeys, AXEWeatherSettingKeys, AXE_WEATHER_DOMAIN_ID, RootConfig, WEATHER_PROVIDER, WEATHER_PROVIDER_IDS, applyDayNightToCondition, formatWeatherLocationName, getWeatherCondition, mapApiConditionToId, parseWeatherLocation, resolveWeatherConditionIcon };
|
|
136
|
+
export { AXEWeatherCommandKeys, AXEWeatherQueryKeys, AXEWeatherSettingKeys, AXE_WEATHER_DAILY_FORECAST_DIGEST_RUN_COMMAND_KEY, AXE_WEATHER_DOMAIN_ID, RootConfig, WEATHER_PROVIDER, WEATHER_PROVIDER_IDS, WeatherExtensionManifest, applyDayNightToCondition, formatWeatherLocationName, getWeatherCondition, mapApiConditionToId, parseWeatherLocation, resolveWeatherConditionIcon };
|
|
114
137
|
export type { AXPWeatherCondition, AXPWeatherConditionDisplay, AXPWeatherData, AXPWeatherForecastDay, AXPWeatherForecastRequest, AXPWeatherHour, AXPWeatherLocation, AXPWeatherRequestOptions, WeatherProviderId, WeatherProviderPort };
|