@trackunit/iris-app-api 1.9.47 → 1.10.3

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/CHANGELOG.md CHANGED
@@ -1,3 +1,25 @@
1
+ ## 1.10.3 (2025-12-03)
2
+
3
+ This was a version bump only for iris-app-api to align it with other projects, there were no code changes.
4
+
5
+ ## 1.10.2 (2025-12-03)
6
+
7
+ This was a version bump only for iris-app-api to align it with other projects, there were no code changes.
8
+
9
+ ## 1.10.1 (2025-12-03)
10
+
11
+ This was a version bump only for iris-app-api to align it with other projects, there were no code changes.
12
+
13
+ ## 1.10.0 (2025-12-03)
14
+
15
+ ### 🚀 Features
16
+
17
+ - add device health filters ([352b53e90f1](https://github.com/Trackunit/manager/commit/352b53e90f1))
18
+
19
+ ### ❤️ Thank You
20
+
21
+ - Simon Laustsen
22
+
1
23
  ## 1.9.47 (2025-12-03)
2
24
 
3
25
  This was a version bump only for iris-app-api to align it with other projects, there were no code changes.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trackunit/iris-app-api",
3
- "version": "1.9.47",
3
+ "version": "1.10.3",
4
4
  "license": "SEE LICENSE IN LICENSE.txt",
5
5
  "repository": "https://github.com/Trackunit/manager",
6
6
  "engines": {
@@ -19,7 +19,7 @@ export type WidgetSupportedFilterBars = "CUSTOMERS" | "ASSETS" | "SITES";
19
19
  export type WidgetSupportedFilters = WidgetSupportedFilterBars | "TIME_RANGE";
20
20
  export declare const widgetTypes: readonly ["KPI", "CHART", "LIST", "MAP", "OTHER"];
21
21
  export type WidgetType = (typeof widgetTypes)[number];
22
- export declare const allAssetFilterKeys: readonly ["search", "siteIds", "groups", "types", "assetType", "brands", "models", "criticality", "activity", "metadataCompleteness", "lastSeen", "followed", "siteType", "ownerAccountIds", "area", "partner", "productionYears", "serviceStatus", "telematicsConnected", "activeFilter", "siteDepotOwnershipIds"];
22
+ export declare const allAssetFilterKeys: readonly ["search", "siteIds", "groups", "types", "assetType", "brands", "models", "criticality", "activity", "metadataCompleteness", "lastSeen", "followed", "siteType", "ownerAccountIds", "area", "partner", "productionYears", "serviceStatus", "telematicsConnected", "activeFilter", "siteDepotOwnershipIds", "fleetHealthTypes", "fleetHealthCategories"];
23
23
  export declare const allAssetFilterKeysWithCustomer: string[];
24
24
  export declare const customFieldFilterKey: "customFields";
25
25
  export type AssetFilterKeys = typeof allAssetFilterKeys;
@@ -44,6 +44,8 @@ exports.allAssetFilterKeys = [
44
44
  "telematicsConnected",
45
45
  "activeFilter",
46
46
  "siteDepotOwnershipIds",
47
+ "fleetHealthTypes",
48
+ "fleetHealthCategories",
47
49
  ];
48
50
  exports.allAssetFilterKeysWithCustomer = [
49
51
  ...exports.allAssetFilterKeys,
@@ -1 +1 @@
1
- {"version":3,"file":"widgetExtensionManifest.js","sourceRoot":"","sources":["../../../../../../../libs/iris-app-sdk/iris-app-api/src/types/extensions/widgetExtensionManifest.ts"],"names":[],"mappings":";;;AAGA;;;;;GAKG;AACI,MAAM,gBAAgB,GAAG,CAAC,MAA0C,EAA4B,EAAE;IACvG,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC;AACrF,CAAC,CAAC;AAFW,QAAA,gBAAgB,oBAE3B;AAEF;;;;;GAKG;AACI,MAAM,mBAAmB,GAAG,CAAC,MAA0C,EAA+B,EAAE;IAC7G,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,IAAI,MAAM,KAAK,KAAK,CAAC;AAClE,CAAC,CAAC;AAFW,QAAA,mBAAmB,uBAE9B;AAQW,QAAA,WAAW,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAU,CAAC;AAIhE,QAAA,kBAAkB,GAAG;IAChC,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,OAAO;IACP,WAAW;IACX,QAAQ;IACR,QAAQ;IACR,aAAa;IACb,UAAU;IACV,sBAAsB;IACtB,UAAU;IACV,UAAU;IACV,UAAU;IACV,iBAAiB;IACjB,MAAM;IACN,SAAS;IACT,iBAAiB;IACjB,eAAe;IACf,qBAAqB;IACrB,cAAc;IACd,uBAAuB;CACf,CAAC;AAEE,QAAA,8BAA8B,GAAG;IAC5C,GAAG,0BAAkB;IACrB,aAAa;IACb,gBAAgB;IAChB,2BAA2B;IAC3B,6BAA6B;IAC7B,6CAA6C;CAC9C,CAAC;AACW,QAAA,oBAAoB,GAAG,cAAuB,CAAC;AAK/C,QAAA,kCAAkC,GAAG,CAAC,GAAG,sCAA8B,EAAE,4BAAoB,CAAU,CAAC;AAGxG,QAAA,iBAAiB,GAAG,CAAC,QAAQ,EAAE,YAAY,EAAE,UAAU,CAAU,CAAC;AAElE,QAAA,iCAAiC,GAAG,CAAC,GAAG,yBAAiB,EAAE,4BAAoB,CAAU,CAAC;AAG1F,QAAA,qBAAqB,GAAG,CAAC,QAAQ,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,CAAU,CAAC;AAE1F,QAAA,qCAAqC,GAAG,CAAC,GAAG,6BAAqB,EAAE,4BAAoB,CAAU,CAAC;AAGlG,QAAA,sBAAsB,GAAG,CAAC,KAAK,CAAU,CAAC","sourcesContent":["import { IconByName, IconByPath, ImageByPath } from \"../iconImage\";\nimport { AbstractExtensionManifest, TranslationKey, Translations } from \"../irisAppExtensionManifest\";\n\n/**\n * Check if the object is a footer with a link\n *\n * @param object - The object to check\n * @returns {boolean} if the object is a footer with a link, false otherwise\n */\nexport const isFooterWithLink = (object: FooterWithLink | FooterWithoutLink): object is FooterWithLink => {\n return typeof object === \"object\" && \"link\" in object && object.link !== undefined;\n};\n\n/**\n * Check if the object is a footer without a link\n *\n * @param object - The object to check\n * @returns {boolean} if the object is a footer without a link, false otherwise\n */\nexport const isFooterWithoutLink = (object: FooterWithLink | FooterWithoutLink): object is FooterWithoutLink => {\n return typeof object === \"object\" && \"link\" in object === false;\n};\n\nexport type WidgetSupportedLocations = \"MY_HOME\" | \"SITE_HOME\" | \"PLAYGROUND\";\n\nexport type WidgetSupportedFilterBars = \"CUSTOMERS\" | \"ASSETS\" | \"SITES\";\n\nexport type WidgetSupportedFilters = WidgetSupportedFilterBars | \"TIME_RANGE\";\n\nexport const widgetTypes = [\"KPI\", \"CHART\", \"LIST\", \"MAP\", \"OTHER\"] as const;\n\nexport type WidgetType = (typeof widgetTypes)[number];\n\nexport const allAssetFilterKeys = [\n \"search\",\n \"siteIds\",\n \"groups\",\n \"types\",\n \"assetType\",\n \"brands\",\n \"models\",\n \"criticality\",\n \"activity\",\n \"metadataCompleteness\",\n \"lastSeen\",\n \"followed\",\n \"siteType\",\n \"ownerAccountIds\",\n \"area\",\n \"partner\",\n \"productionYears\",\n \"serviceStatus\",\n \"telematicsConnected\",\n \"activeFilter\",\n \"siteDepotOwnershipIds\",\n] as const;\n\nexport const allAssetFilterKeysWithCustomer = [\n ...allAssetFilterKeys,\n \"customerIds\",\n \"rentalStatuses\",\n \"rentalContractOrderNumber\",\n \"rentalContractReferenceCode\",\n \"rentalContractReferenceCodeDescriptionQuery\",\n];\nexport const customFieldFilterKey = \"customFields\" as const;\nexport type AssetFilterKeys = typeof allAssetFilterKeys;\n\nexport type AssetFilterKeysWithCustomer = typeof allAssetFilterKeysWithCustomer;\n\nexport const allAssetFilterKeysWithCustomFields = [...allAssetFilterKeysWithCustomer, customFieldFilterKey] as const;\nexport type AssetFilterKeysWithCustomFields = typeof allAssetFilterKeysWithCustomFields;\n\nexport const allSiteFilterKeys = [\"search\", \"siteStatus\", \"siteType\"] as const;\nexport type SiteFilterKeys = typeof allSiteFilterKeys;\nexport const allSiteFilterKeysWithCustomFields = [...allSiteFilterKeys, customFieldFilterKey] as const;\nexport type SiteFilterKeysWithCustomFields = typeof allSiteFilterKeysWithCustomFields;\n\nexport const allCustomerFilterKeys = [\"search\", \"customerType\", \"criticality\", \"servicePlan\"] as const;\nexport type CustomerFilterKeys = typeof allCustomerFilterKeys;\nexport const allCustomerFilterKeysWithCustomFields = [...allCustomerFilterKeys, customFieldFilterKey] as const;\nexport type CustomerFilterKeysWithCustomFields = typeof allCustomerFilterKeysWithCustomFields;\n\nexport const allTimeRangeFilterKeys = [\"ALL\"] as const;\nexport type TimeRangeFilterKeys = typeof allTimeRangeFilterKeys;\n\ntype FilterConfig<TFilterKeys extends ReadonlyArray<string>> = {\n include: Array<TFilterKeys[number]>;\n};\n\nexport type SupportedFiltersConfig = {\n ASSETS?: FilterConfig<AssetFilterKeysWithCustomFields>;\n SITES?: FilterConfig<SiteFilterKeysWithCustomFields>;\n CUSTOMERS?: FilterConfig<CustomerFilterKeysWithCustomFields>;\n TIME_RANGE?: FilterConfig<TimeRangeFilterKeys>;\n};\n\nexport type FilterBarToLinkConfig = {\n /**\n * The name of the search property to append the filter bar to the link.\n * Example: \"assetType\"\n * Will append to the link as \"?assetType=<encoded value>\"\n */\n searchPropertyName?: string;\n\n /**\n * The filter bar to append to the search property.\n * Example:\n * {\n * ASSETS: { include: [\"assetType\"] },\n * }\n * Then use filterBar: \"ASSETS\"\n *\n * Will append to the link as \"?<searchPropertyName>=<encoded value>\"\n *\n * Encoded using useCustomEncoding from @trackunit/react-core-hooks it has a decode hook as well. Its optimized to create a small url string.\n * Will encode to something like \"H4sIAJblCWkAA6tWSipKzEspVrKKVgpJzE4tTc7IVNJRck_Ny0wF0o6lxYlKsbUAbPtHWiYAAAA\"\n */\n filterBar: keyof SupportedFiltersConfig;\n};\n\nexport type FooterWithLink = {\n /**\n * The link to display in the footer. The link is fixed and will always point to the same route.\n */\n link: string;\n\n /**\n * The link description to display in the footer, if not it will default to localized version of 'See full details'. Only relevant if link is provided.\n */\n linkDescription?: string | Translations | TranslationKey;\n\n /**\n * The filter bar to append to the link.\n */\n appendFilterBar?: FilterBarToLinkConfig | Array<FilterBarToLinkConfig>;\n\n /**\n * A logo can be displayed in the footer to show that the widget is powered by an entity. You can use an SVG logo, and provide background and foreground colors.\n * You can also use a SVG, PNG, JPEG or JPG logo directly max size 150x16px.\n */\n poweredByImage?: ImageByPath;\n};\n\nexport type FooterWithoutLink = {\n link?: never;\n linkDescription?: never;\n\n /**\n * A logo can be displayed in the footer to show that the widget is powered by an entity. You can use an SVG logo, and provide background and foreground colors.\n * You can also use a SVG, PNG, JPEG or JPG logo directly max size 150x16px.\n */\n poweredByImage?: ImageByPath;\n};\n\n/**\n * BETA! DO NOT USE THIS YET - its under development\n */\nexport interface WidgetExtensionManifest extends AbstractExtensionManifest {\n type: \"WIDGET_EXTENSION\";\n\n preview?: {\n /**\n * The description of the widget will be displayed in the drawer for adding widgets.\n */\n description?: string | Translations | TranslationKey;\n };\n\n /**\n * The widget type is used for filtering the widgets in the drawer.\n */\n widgetType: WidgetType;\n\n /**\n * Each widget must have one fixed size.\n * Standard widgets are 2x2.\n * Smaller widgets can be either 1x1 or 2x1.\n * It is not recommended to create widgets that are larger than 2x2 by default.\n * If a widget needs to support multiple sizes, create a separate widget for each size.\n * Use `allowFullWidth: true` to let users expand the widget across the full width of the screen.\n * This is generally recommended only for charts and maps where a larger display improves usability.\n */\n size: {\n default: {\n width: 1 | 2 | 3 | 4 | 5 | 6;\n height: 1 | 2 | 3 | 4 | 5 | 6;\n };\n allowFullWidth?: boolean;\n };\n\n header: {\n /**\n * The name of the widget to display in the header. Do not place date ranges or fixed filters in the name. It is used for finding the widget in the drawer.\n * Widgets sized 1x1 do not show the name in the header, but it is still visible in the drawer.\n */\n name: string | Translations | TranslationKey;\n\n /**\n * The image of the widget to display in the header, if not it will default to the icon of the manifest.\n * Most standard widgets use icons, but you can use an SVG logo instead.\n */\n image?: IconByName | IconByPath;\n\n /**\n * If true, a button will be on the header and an editDialog from the src folder of this extension will be loaded to allow users to configure the widget.\n */\n hasEditDialog?: boolean;\n };\n\n footer?: FooterWithLink | FooterWithoutLink;\n\n /**\n * The locations where the widget can be placed. Choose between My Home, Site Home and Playground.\n */\n supportedLocations: Array<WidgetSupportedLocations>;\n\n /**\n * The filters that the widget can be filtered by. To support a date range filter, add \"TIME_RANGE\" to the list. The date range will be displayed separately in the menu.\n * If you would like to lock the filters to a specific value, you can do so by adding the filter to the list and setting the value to the filter.\n */\n supportedFilters?: SupportedFiltersConfig;\n}\n"]}
1
+ {"version":3,"file":"widgetExtensionManifest.js","sourceRoot":"","sources":["../../../../../../../libs/iris-app-sdk/iris-app-api/src/types/extensions/widgetExtensionManifest.ts"],"names":[],"mappings":";;;AAGA;;;;;GAKG;AACI,MAAM,gBAAgB,GAAG,CAAC,MAA0C,EAA4B,EAAE;IACvG,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC;AACrF,CAAC,CAAC;AAFW,QAAA,gBAAgB,oBAE3B;AAEF;;;;;GAKG;AACI,MAAM,mBAAmB,GAAG,CAAC,MAA0C,EAA+B,EAAE;IAC7G,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,IAAI,MAAM,KAAK,KAAK,CAAC;AAClE,CAAC,CAAC;AAFW,QAAA,mBAAmB,uBAE9B;AAQW,QAAA,WAAW,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAU,CAAC;AAIhE,QAAA,kBAAkB,GAAG;IAChC,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,OAAO;IACP,WAAW;IACX,QAAQ;IACR,QAAQ;IACR,aAAa;IACb,UAAU;IACV,sBAAsB;IACtB,UAAU;IACV,UAAU;IACV,UAAU;IACV,iBAAiB;IACjB,MAAM;IACN,SAAS;IACT,iBAAiB;IACjB,eAAe;IACf,qBAAqB;IACrB,cAAc;IACd,uBAAuB;IACvB,kBAAkB;IAClB,uBAAuB;CACf,CAAC;AAEE,QAAA,8BAA8B,GAAG;IAC5C,GAAG,0BAAkB;IACrB,aAAa;IACb,gBAAgB;IAChB,2BAA2B;IAC3B,6BAA6B;IAC7B,6CAA6C;CAC9C,CAAC;AACW,QAAA,oBAAoB,GAAG,cAAuB,CAAC;AAK/C,QAAA,kCAAkC,GAAG,CAAC,GAAG,sCAA8B,EAAE,4BAAoB,CAAU,CAAC;AAGxG,QAAA,iBAAiB,GAAG,CAAC,QAAQ,EAAE,YAAY,EAAE,UAAU,CAAU,CAAC;AAElE,QAAA,iCAAiC,GAAG,CAAC,GAAG,yBAAiB,EAAE,4BAAoB,CAAU,CAAC;AAG1F,QAAA,qBAAqB,GAAG,CAAC,QAAQ,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,CAAU,CAAC;AAE1F,QAAA,qCAAqC,GAAG,CAAC,GAAG,6BAAqB,EAAE,4BAAoB,CAAU,CAAC;AAGlG,QAAA,sBAAsB,GAAG,CAAC,KAAK,CAAU,CAAC","sourcesContent":["import { IconByName, IconByPath, ImageByPath } from \"../iconImage\";\nimport { AbstractExtensionManifest, TranslationKey, Translations } from \"../irisAppExtensionManifest\";\n\n/**\n * Check if the object is a footer with a link\n *\n * @param object - The object to check\n * @returns {boolean} if the object is a footer with a link, false otherwise\n */\nexport const isFooterWithLink = (object: FooterWithLink | FooterWithoutLink): object is FooterWithLink => {\n return typeof object === \"object\" && \"link\" in object && object.link !== undefined;\n};\n\n/**\n * Check if the object is a footer without a link\n *\n * @param object - The object to check\n * @returns {boolean} if the object is a footer without a link, false otherwise\n */\nexport const isFooterWithoutLink = (object: FooterWithLink | FooterWithoutLink): object is FooterWithoutLink => {\n return typeof object === \"object\" && \"link\" in object === false;\n};\n\nexport type WidgetSupportedLocations = \"MY_HOME\" | \"SITE_HOME\" | \"PLAYGROUND\";\n\nexport type WidgetSupportedFilterBars = \"CUSTOMERS\" | \"ASSETS\" | \"SITES\";\n\nexport type WidgetSupportedFilters = WidgetSupportedFilterBars | \"TIME_RANGE\";\n\nexport const widgetTypes = [\"KPI\", \"CHART\", \"LIST\", \"MAP\", \"OTHER\"] as const;\n\nexport type WidgetType = (typeof widgetTypes)[number];\n\nexport const allAssetFilterKeys = [\n \"search\",\n \"siteIds\",\n \"groups\",\n \"types\",\n \"assetType\",\n \"brands\",\n \"models\",\n \"criticality\",\n \"activity\",\n \"metadataCompleteness\",\n \"lastSeen\",\n \"followed\",\n \"siteType\",\n \"ownerAccountIds\",\n \"area\",\n \"partner\",\n \"productionYears\",\n \"serviceStatus\",\n \"telematicsConnected\",\n \"activeFilter\",\n \"siteDepotOwnershipIds\",\n \"fleetHealthTypes\",\n \"fleetHealthCategories\",\n] as const;\n\nexport const allAssetFilterKeysWithCustomer = [\n ...allAssetFilterKeys,\n \"customerIds\",\n \"rentalStatuses\",\n \"rentalContractOrderNumber\",\n \"rentalContractReferenceCode\",\n \"rentalContractReferenceCodeDescriptionQuery\",\n];\nexport const customFieldFilterKey = \"customFields\" as const;\nexport type AssetFilterKeys = typeof allAssetFilterKeys;\n\nexport type AssetFilterKeysWithCustomer = typeof allAssetFilterKeysWithCustomer;\n\nexport const allAssetFilterKeysWithCustomFields = [...allAssetFilterKeysWithCustomer, customFieldFilterKey] as const;\nexport type AssetFilterKeysWithCustomFields = typeof allAssetFilterKeysWithCustomFields;\n\nexport const allSiteFilterKeys = [\"search\", \"siteStatus\", \"siteType\"] as const;\nexport type SiteFilterKeys = typeof allSiteFilterKeys;\nexport const allSiteFilterKeysWithCustomFields = [...allSiteFilterKeys, customFieldFilterKey] as const;\nexport type SiteFilterKeysWithCustomFields = typeof allSiteFilterKeysWithCustomFields;\n\nexport const allCustomerFilterKeys = [\"search\", \"customerType\", \"criticality\", \"servicePlan\"] as const;\nexport type CustomerFilterKeys = typeof allCustomerFilterKeys;\nexport const allCustomerFilterKeysWithCustomFields = [...allCustomerFilterKeys, customFieldFilterKey] as const;\nexport type CustomerFilterKeysWithCustomFields = typeof allCustomerFilterKeysWithCustomFields;\n\nexport const allTimeRangeFilterKeys = [\"ALL\"] as const;\nexport type TimeRangeFilterKeys = typeof allTimeRangeFilterKeys;\n\ntype FilterConfig<TFilterKeys extends ReadonlyArray<string>> = {\n include: Array<TFilterKeys[number]>;\n};\n\nexport type SupportedFiltersConfig = {\n ASSETS?: FilterConfig<AssetFilterKeysWithCustomFields>;\n SITES?: FilterConfig<SiteFilterKeysWithCustomFields>;\n CUSTOMERS?: FilterConfig<CustomerFilterKeysWithCustomFields>;\n TIME_RANGE?: FilterConfig<TimeRangeFilterKeys>;\n};\n\nexport type FilterBarToLinkConfig = {\n /**\n * The name of the search property to append the filter bar to the link.\n * Example: \"assetType\"\n * Will append to the link as \"?assetType=<encoded value>\"\n */\n searchPropertyName?: string;\n\n /**\n * The filter bar to append to the search property.\n * Example:\n * {\n * ASSETS: { include: [\"assetType\"] },\n * }\n * Then use filterBar: \"ASSETS\"\n *\n * Will append to the link as \"?<searchPropertyName>=<encoded value>\"\n *\n * Encoded using useCustomEncoding from @trackunit/react-core-hooks it has a decode hook as well. Its optimized to create a small url string.\n * Will encode to something like \"H4sIAJblCWkAA6tWSipKzEspVrKKVgpJzE4tTc7IVNJRck_Ny0wF0o6lxYlKsbUAbPtHWiYAAAA\"\n */\n filterBar: keyof SupportedFiltersConfig;\n};\n\nexport type FooterWithLink = {\n /**\n * The link to display in the footer. The link is fixed and will always point to the same route.\n */\n link: string;\n\n /**\n * The link description to display in the footer, if not it will default to localized version of 'See full details'. Only relevant if link is provided.\n */\n linkDescription?: string | Translations | TranslationKey;\n\n /**\n * The filter bar to append to the link.\n */\n appendFilterBar?: FilterBarToLinkConfig | Array<FilterBarToLinkConfig>;\n\n /**\n * A logo can be displayed in the footer to show that the widget is powered by an entity. You can use an SVG logo, and provide background and foreground colors.\n * You can also use a SVG, PNG, JPEG or JPG logo directly max size 150x16px.\n */\n poweredByImage?: ImageByPath;\n};\n\nexport type FooterWithoutLink = {\n link?: never;\n linkDescription?: never;\n\n /**\n * A logo can be displayed in the footer to show that the widget is powered by an entity. You can use an SVG logo, and provide background and foreground colors.\n * You can also use a SVG, PNG, JPEG or JPG logo directly max size 150x16px.\n */\n poweredByImage?: ImageByPath;\n};\n\n/**\n * BETA! DO NOT USE THIS YET - its under development\n */\nexport interface WidgetExtensionManifest extends AbstractExtensionManifest {\n type: \"WIDGET_EXTENSION\";\n\n preview?: {\n /**\n * The description of the widget will be displayed in the drawer for adding widgets.\n */\n description?: string | Translations | TranslationKey;\n };\n\n /**\n * The widget type is used for filtering the widgets in the drawer.\n */\n widgetType: WidgetType;\n\n /**\n * Each widget must have one fixed size.\n * Standard widgets are 2x2.\n * Smaller widgets can be either 1x1 or 2x1.\n * It is not recommended to create widgets that are larger than 2x2 by default.\n * If a widget needs to support multiple sizes, create a separate widget for each size.\n * Use `allowFullWidth: true` to let users expand the widget across the full width of the screen.\n * This is generally recommended only for charts and maps where a larger display improves usability.\n */\n size: {\n default: {\n width: 1 | 2 | 3 | 4 | 5 | 6;\n height: 1 | 2 | 3 | 4 | 5 | 6;\n };\n allowFullWidth?: boolean;\n };\n\n header: {\n /**\n * The name of the widget to display in the header. Do not place date ranges or fixed filters in the name. It is used for finding the widget in the drawer.\n * Widgets sized 1x1 do not show the name in the header, but it is still visible in the drawer.\n */\n name: string | Translations | TranslationKey;\n\n /**\n * The image of the widget to display in the header, if not it will default to the icon of the manifest.\n * Most standard widgets use icons, but you can use an SVG logo instead.\n */\n image?: IconByName | IconByPath;\n\n /**\n * If true, a button will be on the header and an editDialog from the src folder of this extension will be loaded to allow users to configure the widget.\n */\n hasEditDialog?: boolean;\n };\n\n footer?: FooterWithLink | FooterWithoutLink;\n\n /**\n * The locations where the widget can be placed. Choose between My Home, Site Home and Playground.\n */\n supportedLocations: Array<WidgetSupportedLocations>;\n\n /**\n * The filters that the widget can be filtered by. To support a date range filter, add \"TIME_RANGE\" to the list. The date range will be displayed separately in the menu.\n * If you would like to lock the filters to a specific value, you can do so by adding the filter to the list and setting the value to the filter.\n */\n supportedFilters?: SupportedFiltersConfig;\n}\n"]}