@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
1,002 lines (986 loc) • 47.9 kB
TypeScript
import { MeasurementService, IFetchResponse, IMeasurementFilter, IMeasurement, ISeriesFilter, IResult, ISeries } from '@c8y/client';
import { AggregationOption, AlertService, AggregationOptionStatus, AggregationService, GainsightService, ModalLabels } from '@c8y/ngx-components';
import { TranslateService } from '@ngx-translate/core';
import * as _angular_core from '@angular/core';
import { OnInit, OnDestroy, ChangeDetectorRef, InjectionToken } from '@angular/core';
import { SupportedIconsSuggestions } from '@c8y/ngx-components/icon-selector/icons';
import * as _angular_forms from '@angular/forms';
import { FormBuilder, ValidatorFn } from '@angular/forms';
import * as packages_client_lib from 'packages/client/lib';
import { AggregationOptionStatus as AggregationOptionStatus$1, AggregationOption as AggregationOption$1 } from '@c8y/ngx-components/global-context';
import { BsModalRef, BsModalService } from 'ngx-bootstrap/modal';
type Measurement = number | {
min: number;
max: number;
};
interface SeriesInfo {
unit: string | null | undefined;
name: string;
type: string | null | undefined;
}
interface SourceData {
series: SeriesInfo[];
values: {
[timestamp: string]: (Measurement | null)[] | undefined;
};
truncated: boolean;
}
interface SourceItem {
source: string | number;
data: SourceData;
}
interface TransformedSeries {
values: {
[timestamp: string]: Measurement;
} | null;
seriesDetails: SeriesInfo;
}
interface TransformedSource {
[seriesType: string]: TransformedSeries;
}
interface TransformedData {
[sourceId: string]: TransformedSource;
}
declare class UtilsService {
transformDataStructure(data: SourceItem[]): TransformedData;
/**
* Formats a date range into a specific string format, handling UTC dates correctly.
*
* @param fromDate - The start date in ISO format (e.g., "2023-12-04T12:40:00.000Z")
* @param toDate - The end date in ISO format (e.g., "2023-12-06T23:50:00.000Z")
* @returns A string representing the date range in the format "ddmmmyyhhmm-ddmmmyyhhmm"
* where d=day, m=month, y=year, h=hour, m=minute
*
* Example
* ```typescript
* const fromDate = "2023-12-04T12:40:00.000Z";
* const toDate = "2023-12-06T23:50:00.000Z";
* const formattedRange = getFormattedDateRange(fromDate, toDate);
* console.log(formattedRange); // Output: "04dec231240-06dec232350"
* ```
*/
getFormattedDateRange(fromDate: string, toDate: string): string;
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UtilsService, never>;
static ɵprov: _angular_core.ɵɵInjectableDeclaration<UtilsService>;
}
declare const HAS_ERROR = "has-error";
declare const MEASUREMENTS_PREVIEW_ITEMS_LIMIT = 5;
declare const SERIES_DATA_MERGED_FILE_NAME = "seriesDataMergedFileName";
/**
* Represents counts of datapoints data categorized by their availability and delivery method.
*/
interface DatapointCounts {
/**
* The number of datapoints whose data can be directly downloaded
* through a web browser.
*/
browserDownloadableCount: number;
/**
* The number of datapoints whose data will be sent via email because its record count exceeded 50_000.
*/
emailDeliverableCount: number;
/**
* The number of datapoints whose data cannot be retrieved at all,
* neither through direct download nor via email because its record count exceeded 1_000_000 API limit.
*/
nonRetrievableCount: number;
}
/**
* Represents a datapoints which number of records exceed a threshold where data will be precessed by a backend.
*/
interface DatapointsExceedingLimit {
datapointDetail: DatapointDetails;
totalElements: number;
}
interface DateFetchConfig {
date: string;
shouldFetchData: boolean;
}
interface IDataTransformer {
transformToMergedFormat(data: ExportData[]): TimeSeriesColumnData;
}
interface FileGenerator {
generateMerged?: (exportData: ExportData[], mergedExportDetails: MergedExportDetails) => BlobPart;
generateList?: (listData: ListExportDatapoint[], columns: ExportColumnConfig[]) => Promise<Blob>;
getFileExtension(): string;
getMimeType(): string;
getLabel(): string;
getIcon(): string;
getType(): string;
getTitle(): string;
getZipName(): string;
getAcceptType(): string;
}
interface FileTypeMetadata {
extension: string;
icon: SupportedIconsSuggestions;
label: string;
title: string;
type: string;
zipName: string;
}
/**
* Represents the data structure, which is used to be transformed into a file (series) or used for a preview (series and measurements).
*/
interface ExportData {
time?: string | null;
source: string | number;
device_name: string;
fragment_series: string;
/**
* Represents the value of a measurement for /measurement data API.
*/
value?: number | null;
/**
* Represents the min value of a measurement for /series data API.
*/
value_min?: number | null;
/**
* Represents the value of a measurement for /series data API.
* Measurement API data does not contain max value.
*/
value_max?: number | null;
unit?: string | null;
}
interface DatapointDetails {
deviceName?: string;
source: string | number;
valueFragmentSeries: string;
valueFragmentType: string;
target?: number;
label?: string;
}
/**
* Represents the data structure, which is used to be
* transformed into an ExportData.
*/
interface DataToExport extends DatapointDetails {
unit: string | undefined;
timeValueMap: {
[timestamp: string]: Measurement;
} | undefined;
}
/**
* Represents the data to be exported along with the backend-created file.
* Only measurements API generates a file on the backend.
*/
interface DataToExportWithBackendCreatedFile {
source: string | number;
valueFragmentSeries: string;
valueFragmentType: string;
fetchedMeasurementsBlobFile: Blob;
}
/**
* Represents a single datapoint row in latestWithDetails exports
* Contains latest measurement with extended datapoint information (current, target, diff, etc.)
*/
interface ListExportDatapoint extends DatapointDetails {
label: string;
target: number | null;
current: number | null;
diff: number | null;
diffPercent: number | null;
unit?: string;
}
/**
* Export type to distinguish between different widget data structures
* - timeSeries: Timeline of measurements (one or many timestamps per datapoint)
* - latestWithDetails: Latest measurement with datapoint details (single entry per datapoint with metadata)
*/
type ExportType = 'timeSeries' | 'latestWithDetails';
/**
* Column configuration for latestWithDetails exports
*/
interface ExportColumnConfig {
id: string;
label: string;
visible: boolean;
order: number;
}
/**
* Base configuration for the export process.
*/
interface ExportConfig {
/**
* Type of export - determines data structure and available options
* - 'timeSeries': Timeline of measurements with Data Scope options (Compact/Full modes)
* - 'latestWithDetails': Latest measurement with datapoint details, exports as displayed
* Defaults to 'timeSeries' for backward compatibility
*/
exportType?: ExportType;
/**
* Column configuration for latestWithDetails exports
* Specifies which columns to export and their order
* Only applicable when exportType is 'latestWithDetails'
*/
columns?: ExportColumnConfig[];
aggregation?: AggregationOption;
datapointDetails: DatapointDetails[];
dateFrom: string;
dateTo: string;
}
/**
* Represents the configuration on the basis of which the zip file is created.
*/
interface FileExportConfig {
fileType: string;
zipName: string;
}
/**
* Represents a required config properties used in a process of generating a measurements based export file.
*/
interface MeasurementFileConfig {
exportConfig: ExportConfig;
acceptFileType: string;
}
/**
* Represents a required config properties along with transformed data structures,
* used in a process of generating a series based export file.
*/
interface SeriesExportParams {
flattenedAndSortedExportData: ExportData[];
fileType: string;
mergedExportDetails: MergedExportDetails;
}
interface TimeSeriesColumnData {
timeSeries: Map<TimeStamp, ColumnValueMap>;
uniqueColumnIdentifiers: string[];
}
/**
* Represents a mapping of datapoints series values.
* The key of the map is a source, and the value is the value data from requested series.
*/
type DatapointsValuesDataMap = Map<SourceId | number, string[]>;
type SourceId = string | number;
type FileCompressionTypes = 'STORE' | 'DEFLATE';
type TimeSeriesData = {
[timestamp: string]: Measurement;
};
interface FileTypeConfig {
extension: string;
mimeType: string;
acceptType: string;
}
/**
* Represents the details unique for a merged file.
*/
type MergedExportDetails = {
aggregation: AggregationOption;
dateFrom: string;
dateTo: string;
};
type ExportedFile = {
fileName: string;
fileData: Blob;
};
type TimeStamp = string;
type ReadingValue = number;
/**
* Represents the min and max values for a specific timestamp.
* Both min and max values are available only when using series API.
*/
type MinMaxValues = {
min: number;
max: number;
};
/**
* Represents a mapping of column headers and their corresponding values.
* e.g. 'Temperature - 5 -> c8y_Temperature.T [ºC] (max)': 25
*/
type ColumnValueMap = {
[key: ColumnHeader]: ReadingValue;
};
declare const EXPORT_MODE_LABELS: {
readonly FULL: "Full";
readonly COMPACT: "Compact";
};
/**
* Each export type is based on a different API:
* - COMPACT - series
* - FULL - measurements
* All differences between export modes:
* Compact:
* Processes up to 5,000 records per data point, or up to the data retention limit (API limit)
* Creates a single merged file containing all the data
* Provides minimum and maximum values (API feature)
* Preview is not available
* Supports optional data aggregation (API feature)
* Full:
* Processes up to 1,000,000 records per data point, or up to the data retention limit (API limit)
* For exports exceeding 50,000 records, data will be sent via email
* Creates a compressed ZIP file containing separate data files for each selected data point
* Preview is available
* Does not support data aggregation
*/
declare const EXPORT_MODE_VALUES: {
readonly full: "FULL";
readonly compact: "COMPACT";
};
declare const FILE_COMPRESSION_TYPES_VALUES: {
readonly store: "STORE";
readonly deflate: "DEFLATE";
};
declare const PRODUCT_EXPERIENCE_DATAPOINTS_EXPORT_SELECTOR: {
readonly EVENTS: {
readonly EXPORT_SELECTOR: "exportSelector";
};
readonly COMPONENTS: {
readonly DATAPOINTS_EXPORT_SELECTOR: "datapoints-export-selector";
readonly DATAPOINTS_EXPORT_SELECTOR_FILE_EXPORTER: "datapoints-export-selector-file-exporter";
};
readonly ACTIONS: {
readonly OPEN_MODAL: "openModal";
readonly DOWNLOAD_STARTED: "downloadStarted";
};
readonly EXPORT_CONFIG: {
readonly FULL_EXPORT_TYPE: "fullExportType";
readonly COMPACT_EXPORT_TYPE: "compactExportType";
};
};
declare class DataFetchingService {
private alertService;
private measurementService;
private translateService;
private utilsService;
constructor(alertService: AlertService, measurementService: MeasurementService, translateService: TranslateService, utilsService: UtilsService);
/**
* Checks if any of measurements requests may exceeded the limit,
* after which the export data is processed by the backend and the generated CSV/Excel file is sent by email.
*
* The threshold is set to 50_000 records in application's core properties (export.data.synchronous.limit).
*
* @param exportConfig - The export configuration.
* @returns A promise that returns an array of objects representing datapoints files that will be sent by email.
*/
getDatapointsExceedingLimit(exportConfig: ExportConfig): Promise<DatapointsExceedingLimit[]>;
/**
* Retrieves the message to be displayed when the limit of datapoints is exceeded during file export.
*
* @param hasNoExportableData - Indicates if there is no exportable data because the date range of all selected datapoints exceeds 1,000,000 records.
* @param emailDeliverableCount - The number of datapoint exports that exceed the limit, will be proceeded by the backend and sent by email.
* @param browserDownloadableCount - The number of datapoint exports that can be downloaded directly.
* @param skippedDatapointCount - The number of datapoint exports skipped due to exceeding the measurements API limit of 1,000,000 records.
* @param totalDatapointsSelectedForExportCount - Total number of datapoint selected for exports.
* @returns The message that can be injected.
*/
getLimitExceededMessage(hasNoExportableData: boolean, emailDeliverableCount?: number, browserDownloadableCount?: number, nonRetrievableCount?: number, totalDatapointsSelectedForExportCount?: number): string;
/**
* Trims the given HTML message by removing list items that correspond to zero counts.
*
* @param message - The HTML string containing the message with list items.
* @param counts - An array of number values corresponding to each list item.
* @param countToTrim - A count that will be trimmed with corresponding list item.
* @returns A trimmed HTML string with list items removed where the corresponding count is zero.
*
* Example:
* ```typescript
* const message = '<ul><li>Item 1</li><li>Item 2</li><li>Item 3</li></ul>';
* const counts = [1, 0, 2];
* const trimmedMessage = this.removeZeroCountListItems(message, counts);
* // Result: '<ul><li>Item 1</li><li>Item 3</li></ul>'
* ```
*/
removeZeroCountListItems(message: string, counts: number[], countToTrim?: number): string;
/**
* Displays an information alert about sending data via email.
*
* Only measurements API can send files via email.
*
* @param fileType - The type of file to be sent.
* @param datapointsExceedingLimit - The array of datapoints exceeding the limit.
*/
showSendViaEmailInfoAlert(fileType: string, datapointsExceedingLimit: DatapointsExceedingLimit[]): void;
fetchMeasurementDataFilesAndPairWithSourceDetails(acceptFileType: string, exportConfig: ExportConfig): Promise<DataToExportWithBackendCreatedFile[]>;
fetchAndProcessMeasurementFile(details: DatapointDetails, measurementFileConfig: MeasurementFileConfig, roundSeconds?: boolean): Promise<DataToExportWithBackendCreatedFile | undefined>;
mergeMeasurementsWithItsSourceDetails(details: DatapointDetails, measurementFile: IFetchResponse): Promise<DataToExportWithBackendCreatedFile>;
fetchAndPrepareDataToExport(exportConfig: ExportConfig, isMeasurement: boolean): Promise<DataToExport[]>;
prepareMeasurementsFilter(details: DatapointDetails, exportConfig: ExportConfig, roundSeconds: boolean, pageSize?: number): IMeasurementFilter;
processMeasurementDataForPreview(details: DatapointDetails, data: IMeasurement[]): DataToExport;
/**
* Returns a map of active data points device IDs with their corresponding series.
*
* Example output:
* ```typescript
* new Map([
* ['844657202', ['c8y_Temperature.T']],
* ['32666427', ['c8y_Battery.Battery']]
* ]);
* ```
* @param datapointDetails - An array of data points details.
* @returns A map where the key is the data point ID and the value is an array of data point series.
*/
groupSeriesByDeviceId(datapointDetails: DatapointDetails[]): DatapointsValuesDataMap;
/**
* Processes the fetched series data and prepares it for export.
*
* @param datapointDetails - An array of data point details.
* @param fetchedDataMap - A map of fetched series data grouped by source.
* @returns An array of DataToExport objects.
*/
processSeriesData(datapointDetails: DatapointDetails[], fetchedDataMap: SourceItem[]): DataToExport[];
hasPermissionToUseMeasurementsApi(exportConfig: ExportConfig): Promise<boolean>;
getSourcesWithPermissionsToRead(datapointDetails: DatapointDetails[]): Promise<string[]>;
/**
* Adjusts the given date by adding the specified number of minutes and setting seconds to 0.
*
* @param date - The date to be adjusted in string format.
* @param minutes - The number of minutes to add to the date.
* @param roundSeconds - Whether to round the seconds or not.
* If true, the seconds will be rounded to 0.
* If false, the seconds will be displayed as they are.
* @returns The adjusted date in ISO string format.
*/
adjustDate(date: string | Date, minutes: number, roundSeconds?: boolean): string;
/**
* Asynchronously loads series data based on the provided parameters.
*
* This method constructs a filter for retrieving series data within a specified date range,
* from a specific source, and optionally applying an aggregation type.
*
* @param rawFilter - The parameters for loading series data, including date range, source, series names, and aggregation type.
* @param roundSeconds - Indicates whether to round the seconds in the date range to the nearest whole number.
* @returns A promise that resolves to series data wrapped in result object.
*/
fetchSeriesData(rawFilter: ISeriesFilter, roundSeconds?: boolean): Promise<IResult<ISeries>> | undefined;
/**
* Fetches snapshot data for list-type exports
* Gets the latest measurement for each datapoint within the date range
* @param exportConfig - The export configuration with list type
* @returns Promise with array of ListExportDatapoint objects
*/
fetchAndPrepareListExportData(exportConfig: ExportConfig): Promise<ListExportDatapoint[]>;
/**
* Fetches and prepares measurement data for preview.
*
* Empty DataToExport object can be returned, because unlike series data,
* measurement data is not further processed besides showing only in the preview.
* CSV/Excel files are generated by the backend for measurements.
*
* @param exportConfig - The export configuration.
* @param roundSeconds - Indicates whether to round the seconds in the date range to the nearest whole number.
* @returns A promise that resolves to an array of DataToExport objects or null when no data is fetched.
*/
private fetchAndPrepareMeasurementDataToExportForPreview;
private fetchMeasurementDataForPreview;
private fetchAndPrepareSeriesDataToExport;
private prepareSeriesFilter;
static ɵfac: _angular_core.ɵɵFactoryDeclaration<DataFetchingService, never>;
static ɵprov: _angular_core.ɵɵInjectableDeclaration<DataFetchingService>;
}
declare class DataProcessingService {
private fileGenerators;
private utils;
mergeMapping: {};
fileTypesConfigs: {
[key: string]: {
extension: string;
mimeType: string;
acceptType: string;
};
};
constructor(fileGenerators: FileGenerator[], utils: UtilsService);
setGenerators(fileGenerators: FileGenerator[]): void;
/**
* Transforms the data into a structured format for an export.
*
* @param dataToExport - An array of processed measurement data combined with the respective properties of the datapoint.
* @returns Provides a two-dimensional array of ExportData,
* where each inner array contains ExportData entries representing the transformed measurements and metadata of each datapoint.
*/
transformToExportFileStructure(dataToExport: DataToExport[]): ExportData[][];
/**
* Transforms the input datapoints with values into a structured format for a preview.
*
* @param dataToExport - An array of processed measurement data combined with the respective properties of the datapoint.
* @returns Provides an array of up to 5 ExportData elements (no more is needed for a preview) or an empty array,
*/
transformToExportFileStructureForPreview(dataToExport: DataToExport[]): ExportData[];
/**
* Transforms list export data into a structured format for preview.
*
* @param listData - Array of list datapoints with snapshot values
* @param columns - Column configuration for ordering
* @returns Provides an array of up to 5 ExportData elements for preview
*/
transformListDataToPreview(listData: ListExportDatapoint[], columns: ExportColumnConfig[]): ExportData[];
/**
* Processes a single dataToExport and transforms it into an array of ExportData.
*
* Used further for creating series data based export and also for measurements and series data based preview.
* Series data provides min and max values for each timestamp.
*
* @param dataToExport - A processed measurement or series data combined with the respective properties of the datapoint to be precessed
* @returns An array of ExportData representing the processed datapoint,
* that can be used as a row data in the exported files or for preview.
*/
processDataToExport(dataToExport: DataToExport): ExportData[];
createExportData(dataToExport: DataToExport, time: string, isMeasurement: boolean, value: number, valueMax?: number): ExportData;
/**
* Exports the given data to merged CSV or Excel files.
*
* @param exportData - An array containing ExportData objects that will be used as parts of the merged file.
* @param fileType - Indicates the type of the file to be exported.
* @param mergedExportDetails - An object containing the date range from which the export was created and aggregation type.
* @returns An objects containing file name and its respective content as Blob.
*
* Example of exported merged file structure:
* date from date to
* 2024-04-15T12:14:00.000Z 2024-07-16T14:14:28+02:00
* time G6Fit -> c8y_Acceleration.accelerationX [G] G6Fit -> c8y_Acceleration.accelerationY [G]
* 2024-05-13T13:45:10.500+02:00 0.0109026359624273 0.789461628278069
*
* Example of exported file name format:
* 04dec231240-06dec232350.xlsx
*/
exportSeriesDataToMergedFiles(exportData: ExportData[], fileType: string, mergedExportDetails: MergedExportDetails): Promise<ExportedFile>;
/**
* Zips all created files.
*
* @param files - An array of objects containing file names and their respective content as Blobs.
* @returns A Promise that resolves to a Blob representing the generated zip file.
*/
zipFiles(files: ExportedFile[]): Promise<Blob>;
/**
* Exports the given data to CSV or Excel files.
*
* @param params - An object containing all the necessary parameters for the export and zip process.
* @returns A Promise that resolves to a Blob representing the exported file.
*/
exportSeriesData(params: SeriesExportParams): Promise<Blob>;
createFileName(source: string | number, fragmentSeries: string, fileExtension: string): string;
/**
* Generates list export blob (CSV or Excel) for snapshot data
* @param fileType - Type of file (csv or excel)
* @param listData - Array of datapoints with current values
* @param columns - Column configuration
* @param dateRange - Date range for filename generation
* @returns Promise with Blob containing the exported file
*/
generateListExport(fileType: string, listData: ListExportDatapoint[], columns: ExportColumnConfig[], dateRange: {
dateFrom: string;
dateTo: string;
}): Promise<Blob>;
/**
* Processes list datapoints and transforms them into an array of ExportData.
*
* @param listData - Array of list datapoints with snapshot values
* @param columns - Column configuration for ordering
* @returns An array of ExportData representing the processed list datapoints
*/
private processListDataToExport;
/**
* Generates a zip blob using the provided zip object.
*
* @param zip - The zip object used for generating the blob.
* @param compressionType - The compression type for the zip file. 'STORE' is no compression, 'DEFLATE' is compression.
* @param compressionLevel - The compression level for the zip file.
* Level 1 is quickest, 9 is best compressed.
* @returns A Promise that resolves to a Blob containing the generated zip file.
*/
private generateZipBlob;
static ɵfac: _angular_core.ɵɵFactoryDeclaration<DataProcessingService, never>;
static ɵprov: _angular_core.ɵɵInjectableDeclaration<DataProcessingService>;
}
declare class DatapointsExportSelectorFileExporterService {
private alertService;
private datapointsExportSelectorDataProcessingService;
private translateService;
/**
* Cached data is reused when both CSV and Excel files were selected for export, used for merged file.
*/
private cachedFlatteredAndSortedSeriesExportData;
/**
* Cached data is reused when both CSV and Excel files were selected for export, used for raw files.
*/
private cachedRawExportSeriesData;
constructor(alertService: AlertService, datapointsExportSelectorDataProcessingService: DataProcessingService, translateService: TranslateService);
getMeasurementExportedDataBlob(extension: string, dataToExport: DataToExportWithBackendCreatedFile[]): Promise<Blob | null>;
getSeriesExportedDataBlob(fileType: string, dataToExport: DataToExport[], mergedExportDetails: MergedExportDetails): Promise<Blob | null>;
cleanupCachedData(): void;
/**
* Generates a blob for list-type exports (snapshot data)
* @param fileType - The type of file to generate (csv or excel)
* @param listData - Array of datapoints with current values
* @param columns - Column configuration for export
* @param dateRange - Date range for the export header
* @returns Promise with Blob or null on error
*/
getListExportedDataBlob(fileType: string, listData: ListExportDatapoint[], columns: ExportColumnConfig[], dateRange: {
dateFrom: string;
dateTo: string;
}): Promise<Blob | null>;
private showZipCreationErrorAlert;
private getMeasurementDataZipBlob;
private createRawMeasurementExportedFiles;
/**
* Converts data to a specified file type and returns the generated blob.
*
* Unlike measurements, data must be transformed to an exportable file structure before exporting.
*
* @param fileType - The type of file to which the data points should be exported. This can be 'csv' or 'excel'.
* @param dataToExport - An array of processed measurement data combined with the respective properties of the datapoint.
* @param mergedExportDetails - The details for the merged export, contains date range and aggregation.
* @returns A promise that resolves to the generated ZIP blob or null if an error occurs.
*/
private getSeriesDataBlob;
private transformSeriesDataToExportableFileStructure;
static ɵfac: _angular_core.ɵɵFactoryDeclaration<DatapointsExportSelectorFileExporterService, never>;
static ɵprov: _angular_core.ɵɵInjectableDeclaration<DatapointsExportSelectorFileExporterService>;
}
declare const FILE_GENERATORS: InjectionToken<FileGenerator[]>;
declare const dateRangeValidator: ValidatorFn;
declare class DatapointsExportSelectorFileExporterComponent implements OnInit, OnDestroy {
private aggregationService;
private cdr;
private datapointsExportModalService;
private datapointsExportSelectorFileExporterService;
private dataFetchingService;
private formBuilder;
private generators;
private gainsightService;
exportConfig: _angular_core.InputSignal<ExportConfig>;
onDownloadButtonStateChange: _angular_core.OutputEmitterRef<boolean>;
previewAvailabilityChange: _angular_core.OutputEmitterRef<boolean>;
previewLoadingChange: _angular_core.OutputEmitterRef<boolean>;
/**
* Represents aggregation selector options that are disabled.
* This state is determined based on the current date range.
*/
disabledAggregationOptions: AggregationOptionStatus;
formGroup: ReturnType<DatapointsExportSelectorFileExporterComponent['createForm']>;
/**
* Contains all datapoints that number of records exceeds a threshold, where data for these datapoints will be processed by the backend.
* Applies only to measurement API which can return processed CSV, Excel or XML data.
*/
datapointsExceedingBrowserDownloadLimit: DatapointsExceedingLimit[];
/**
* Indicates whether any of DataToExport objects timeValueMap property is not undefined (series data)
* or dataPointToExport is not undefined at all (measurement data).
*/
hasFetchedDataAnyValuesToExport: boolean;
/**
* Indicates if there is no exportable data because the date range of all selected datapoints exceeds 1,000,000 records.
*/
hasNoExportableData: boolean;
hasPermissionToReadAnyMeasurements: boolean;
disabledExportModes: Record<string, boolean>;
isCheckingPermissions: boolean;
private _isPreviewLoading;
get isPreviewLoading(): boolean;
set isPreviewLoading(value: boolean);
/**
* Indicates whether the full or compact type of export is selected.
* Full type of export is based on measurement API data.
* Compact type of export is based on series API data.
*/
isFullTypeOfExport: boolean;
/**
* Indicates whether list-type export is selected.
* List type of export is a snapshot of current datapoints values.
*/
isListTypeOfExport: boolean;
/**
* Indicates whether the Data Scope component should be visible.
* Hidden for list-type exports, visible for table-type exports.
*/
isDataScopeVisible: boolean;
previewTableData: ExportData[];
limitExceededMessage: string;
/**
* Contains processed data that is prepared to be exported if series data was fetched
* or shown in the preview table in case of measurements data.
*/
private dataToExport;
/**
* Contains a list of datapoints that selected date range exceeds API limit of 1_000_000 records.
*/
private dataPointsExceedingOneMillionLimit;
/**
* Represents the state of file type selection checkboxes.
*/
private fileTypeSelectionState;
/**
* Hold the initial state of the aggregation from the export config.
* Value will be loaded on component destroy.
*/
private initialAggregation;
/**
* Hold the initial state of the dateFrom from the export config.
* Value will be loaded on component destroy.
*/
private initialDateFrom;
/**
* Hold the initial state of the dateTo from the export config.
* Value will be loaded on component destroy.
*/
private initialDateTo;
/**
* Hold the initial state of the datapointDetails from the export config.
* Some logic may filter out datapoints in datapointDetails array, that exceeds 1_000_000 limit for measurements API,
* but full list is still needed when component is reopened.
* Value will be loaded on component destroy.
*/
private initialDatapointDetails;
/**
* Indicates whether the aggregation value was changed programmatically.
* It prevents a case where fetching may be triggered twice when export type is changed.
* Both options alone can trigger fetching data.
*/
private isAggregationChangedProgrammatically;
/**
* Indicates whether any of the export file types (CSV, Excel) are checked.
*/
private isAnyOfExportFileTypeChecked;
private dateFromSubject;
private dateToSubject;
private destroy$;
dynamicFilesTypeMetadata: {
[key: string]: FileTypeMetadata;
};
constructor(aggregationService: AggregationService, cdr: ChangeDetectorRef, datapointsExportModalService: DataProcessingService, datapointsExportSelectorFileExporterService: DatapointsExportSelectorFileExporterService, dataFetchingService: DataFetchingService, formBuilder: FormBuilder, generators: FileGenerator[], gainsightService: GainsightService);
setFilesType(generators: FileGenerator[]): void;
ngOnInit(): Promise<void>;
ngOnDestroy(): void;
exportAndDownload(): Promise<void>;
getOnlySelectedFileExports(fileExports: FileExportConfig[]): FileExportConfig[];
exportFile(fileType: string): Promise<Blob | null>;
downloadFile(blob: Blob | null, fileType: string, measurementsZipFileName: string): Promise<void>;
/**
* Exports a measurement file of the specified type.
*
* Measurements API does provide a way to fetch a preprocessed CSV/Excel file.
*
* At this point a backed file needs to be fetched.
* Measurement data used for a preview contains just 5 first records
* and it's not fetched with CSV/Excel headers.
*
* @param fileType - The type of file to export.
* @returns A Promise that resolves to a Blob representing the exported file or null when no data to export or it's sent via email.
*/
exportMeasurementFile(fileType: string): Promise<Blob> | null;
excludeDatapointsThatExceedsApiLimit(exportConfig: ExportConfig): ExportConfig;
/**
* Exports the series data to a file of the specified type.
*
* Series API does not provide a way to fetch a preprocessed CSV/Excel file.
*
* Series data used for exporting a file is already fetched for a preview
* and can be reused for exporting.
*
* @param fileType - The type of file to export (e.g., CSV, Excel).
* @returns A Promise that resolves to a Blob representing the exported file.
*/
exportSeriesFile(fileType: string): Promise<Blob>;
/**
* Exports list-type data (snapshot of datapoints with current values)
* @param fileType - The type of file to export (csv or excel)
* @returns Promise resolving to a Blob with the exported file
*/
exportListFile(fileType: string): Promise<Blob>;
onAggregationChange(newAggregation: AggregationOption): Promise<void>;
onDateFromChange(updatedDate: string): void;
onDateToChange(updatedDate: string): void;
updateDateAndFetchData(dateType: 'dateFrom' | 'dateTo', dateInfo: DateFetchConfig): Promise<void>;
onExportTypeChange(exportType: string): Promise<void>;
/**
* Prepares preview for list-type exports
* @param listData - Array of list datapoints
*/
private prepareListPreview;
private updateDisabledAggregationOptions;
private createForm;
private preparePreview;
private handleDateSelectorChanges;
private handleExportModeChanges;
private handleFileTypeSelectionChanges;
private updateFileTypeSelectionState;
private handleFormValidationChanges;
private updateFileTypeControl;
private determineShowingPreviewOrEmptyState;
private determineIfMeasurementResponseWillBeProcessedByBackend;
private calculateDatapointCounts;
private storeInitialChangeableConfig;
private loadInitialChangeableConfig;
private loadExportData;
private loadListExportData;
private loadTableExportData;
private updateDownloadButtonState;
private emitPreviewAvailability;
private resetFullExportRelatedProperties;
private getInitialSelection;
/**
* Adjusts both "from" and "to" dates when either is updated:
* - Resets seconds to 00 even when only one date changes
* - Prevents persisting hidden seconds ≠ 00 from initial load
* - Triggers data fetch
*
* Example:
* When user changes "from" date:
* Input: startDate = "2024-03-26 13:30:45", endDate = "2024-03-27 15:20:45"
* Result: startDate -> "2024-03-26 14:30:00", endDate -> "2024-03-27 15:20:00"
*
* When user changes "to" date:
* Input: startDate = "2024-03-26 14:30:45", endDate = "2024-03-27 15:20:45"
* Result: startDate -> "2024-03-26 14:30:00", endDate -> "2024-03-27 16:20:00"
*
* @param startDate - The "start" date to be adjusted.
* @param endDate - The "end" date to be adjusted.
*/
private update;
private triggerGainsightDownloadEvent;
static ɵfac: _angular_core.ɵɵFactoryDeclaration<DatapointsExportSelectorFileExporterComponent, never>;
static ɵcmp: _angular_core.ɵɵComponentDeclaration<DatapointsExportSelectorFileExporterComponent, "c8y-datapoints-export-selector-file-exporter", never, { "exportConfig": { "alias": "exportConfig"; "required": true; "isSignal": true; }; }, { "onDownloadButtonStateChange": "onDownloadButtonStateChange"; "previewAvailabilityChange": "previewAvailabilityChange"; "previewLoadingChange": "previewLoadingChange"; }, never, never, true, never>;
}
declare class DataPointsExportSelectorPreviewComponent {
columns: _angular_core.InputSignal<ExportColumnConfig[]>;
hasFetchedDataAnyValuesToExport: _angular_core.InputSignal<boolean>;
isPreviewLoading: _angular_core.InputSignal<boolean>;
previewTableData: _angular_core.InputSignal<ExportData[]>;
readonly MEASUREMENTS_PREVIEW_ITEMS_LIMIT = 5;
isListPreview: _angular_core.Signal<boolean>;
listHeaders: _angular_core.Signal<string[]>;
previewRows: _angular_core.Signal<{
rowValues: string[];
time?: string | null;
source: string | number;
device_name: string;
fragment_series: string;
value?: number | null;
value_min?: number | null;
value_max?: number | null;
unit?: string | null;
}[]>;
static ɵfac: _angular_core.ɵɵFactoryDeclaration<DataPointsExportSelectorPreviewComponent, never>;
static ɵcmp: _angular_core.ɵɵComponentDeclaration<DataPointsExportSelectorPreviewComponent, "c8y-datapoints-export-selector-preview", never, { "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "hasFetchedDataAnyValuesToExport": { "alias": "hasFetchedDataAnyValuesToExport"; "required": false; "isSignal": true; }; "isPreviewLoading": { "alias": "isPreviewLoading"; "required": false; "isSignal": true; }; "previewTableData": { "alias": "previewTableData"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
}
declare class DataPointsExportSelectorDataScopeComponent {
disabledAggregationOptions: _angular_core.InputSignal<AggregationOptionStatus$1>;
formGroup: _angular_core.InputSignal<_angular_forms.FormGroup<{
dateFrom: _angular_forms.FormControl<string>;
dateTo: _angular_forms.FormControl<string>;
aggregation: _angular_forms.FormControl<"NONE" | "MINUTELY" | "HOURLY" | "DAILY">;
exportMode: _angular_forms.FormControl<"COMPACT">;
fileTypes: _angular_forms.FormGroup<{}>;
}>>;
disabledExportModes: _angular_core.InputSignal<Record<string, boolean>>;
onAggregationChange: _angular_core.OutputEmitterRef<AggregationOption$1>;
onExportTypeChange: _angular_core.OutputEmitterRef<string>;
readonly AGGREGATION_LABELS: {
readonly NONE: string;
readonly MINUTELY: string;
readonly HOURLY: string;
readonly DAILY: string;
};
readonly AGGREGATION_VALUES_ARR: readonly ["NONE", packages_client_lib.aggregationType.MINUTELY, packages_client_lib.aggregationType.HOURLY, packages_client_lib.aggregationType.DAILY];
readonly EXPORT_MODE_LABELS: {
readonly FULL: "Full";
readonly COMPACT: "Compact";
};
readonly EXPORT_MODE_VALUES: {
readonly full: "FULL";
readonly compact: "COMPACT";
};
readonly EXPORT_MODE_VALUES_ARR: readonly ["FULL", "COMPACT"];
emitAggregationChange(aggregation: AggregationOption$1): void;
emitExportTypeChange(exportType: string): void;
static ɵfac: _angular_core.ɵɵFactoryDeclaration<DataPointsExportSelectorDataScopeComponent, never>;
static ɵcmp: _angular_core.ɵɵComponentDeclaration<DataPointsExportSelectorDataScopeComponent, "c8y-datapoints-export-selector-data-scope", never, { "disabledAggregationOptions": { "alias": "disabledAggregationOptions"; "required": true; "isSignal": true; }; "formGroup": { "alias": "formGroup"; "required": true; "isSignal": true; }; "disabledExportModes": { "alias": "disabledExportModes"; "required": false; "isSignal": true; }; }, { "onAggregationChange": "onAggregationChange"; "onExportTypeChange": "onExportTypeChange"; }, never, never, true, never>;
}
declare class DataPointsExportSelectorFileTypesComponent {
dynamicFilesTypeMetadata: _angular_core.InputSignal<{
[key: string]: FileTypeMetadata;
}>;
formGroup: _angular_core.InputSignal<_angular_forms.FormGroup<{
dateFrom: _angular_forms.FormControl<string>;
dateTo: _angular_forms.FormControl<string>;
aggregation: _angular_forms.FormControl<"NONE" | "MINUTELY" | "HOURLY" | "DAILY">;
exportMode: _angular_forms.FormControl<"COMPACT">;
fileTypes: _angular_forms.FormGroup<{}>;
}>>;
static ɵfac: _angular_core.ɵɵFactoryDeclaration<DataPointsExportSelectorFileTypesComponent, never>;
static ɵcmp: _angular_core.ɵɵComponentDeclaration<DataPointsExportSelectorFileTypesComponent, "c8y-datapoints-export-selector-file-types", never, { "dynamicFilesTypeMetadata": { "alias": "dynamicFilesTypeMetadata"; "required": false; "isSignal": true; }; "formGroup": { "alias": "formGroup"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
}
declare class DataPointsExportSelectorTimeRangeComponent implements OnInit, OnDestroy {
formGroup: _angular_core.InputSignal<_angular_forms.FormGroup<{
dateFrom: _angular_forms.FormControl<string>;
dateTo: _angular_forms.FormControl<string>;
aggregation: _angular_forms.FormControl<"NONE" | "MINUTELY" | "HOURLY" | "DAILY">;
exportMode: _angular_forms.FormControl<"COMPACT">;
fileTypes: _angular_forms.FormGroup<{}>;
}>>;
onDateFromChange: _angular_core.OutputEmitterRef<string>;
onDateToChange: _angular_core.OutputEmitterRef<string>;
private destroy$;
readonly DATE_FROM = "dateFrom";
readonly DATE_TO = "dateTo";
readonly FROM_DATE: "From`date`";
readonly HAS_ERROR = "has-error";
readonly INVALID_DATE_TIME = "invalidDateTime";
readonly THIS_DATE_IS_INVALID: "This date is invalid.";
readonly THIS_DATE_IS_AFTER_THE_LAST_ALLOWED_DATE: "This date is after the latest allowed date.";
readonly THIS_DATE_IS_BEFORE_THE_EARLIEST_ALLOWED_DATE: "This date is before the earliest allowed date.";
readonly TO_DATE: "To`date`";
ngOnInit(): void;
ngOnDestroy(): void;
static ɵfac: _angular_core.ɵɵFactoryDeclaration<DataPointsExportSelectorTimeRangeComponent, never>;
static ɵcmp: _angular_core.ɵɵComponentDeclaration<DataPointsExportSelectorTimeRangeComponent, "c8y-datapoints-export-selector-time-range", never, { "formGroup": { "alias": "formGroup"; "required": true; "isSignal": true; }; }, { "onDateFromChange": "onDateFromChange"; "onDateToChange": "onDateToChange"; }, never, never, true, never>;
}
declare const CSVGeneratorAdapter: FileGenerator;
declare class ExcelDataTransformer implements IDataTransformer {
transformToMergedFormat(exportData: ExportData[]): TimeSeriesColumnData;
private createMeasurementIdentifier;
private formatMinKey;
private formatMaxKey;
}
declare const ExcelGeneratorAdapter: FileGenerator;
declare class DatapointsExportSelectorModalComponent {
private bsModalRef;
private bsModalService;
private readonly fileExporter;
exportConfig: ExportConfig;
isDownloadEnabled: boolean;
isPreviewAvailable: boolean;
isPreviewLoading: boolean;
labels: ModalLabels;
result: Promise<boolean>;
private _close;
private isPreviewModalOpen;
constructor(bsModalRef: BsModalRef, bsModalService: BsModalService);
handleKeyboardEvent(event: KeyboardEvent): void;
dismiss(): void;
exportAndDownload(): Promise<void>;
openPreviewModal(): void;
changeDownloadButtonState(isEnabled: boolean): void;
changePreviewAvailability(isAvailable: boolean): void;
changePreviewLoading(isLoading: boolean): void;
static ɵfac: _angular_core.ɵɵFactoryDeclaration<DatapointsExportSelectorModalComponent, never>;
static ɵcmp: _angular_core.ɵɵComponentDeclaration<DatapointsExportSelectorModalComponent, "c8y-datapoints-export-selector-modal", never, {}, {}, never, never, true, never>;
}
declare class DatapointsExportSelectorComponent {
private bsModalService;
private gainsightService;
displayMode: _angular_core.InputSignal<"default" | "icon-only">;
/**
* CSS class for the container element.
* Defaults to 'd-flex p-t-4 p-b-4' if not provided.
*/
containerClass: _angular_core.InputSignal<string>;
/**
* Configuration for the export selector modal.
*/
exportConfig: _angular_core.InputSignal<ExportConfig>;
isOpen: _angular_core.OutputEmitterRef<boolean>;
readonly DEFAULT_CSS_STYLE = "d-flex";
/**
* Check if export button should be disabled
* Disabled when: no config provided or no datapoints configured
*/
isExportDisabled: _angular_core.Signal<boolean>;
constructor(bsModalService: BsModalService, gainsightService: GainsightService);
openExportModal(): Promise<void>;
static ɵfac: _angular_core.ɵɵFactoryDeclaration<DatapointsExportSelectorComponent, never>;
static ɵcmp: _angular_core.ɵɵComponentDeclaration<DatapointsExportSelectorComponent, "c8y-datapoints-export-selector", never, { "displayMode": { "alias": "displayMode"; "required": false; "isSignal": true; }; "containerClass": { "alias": "containerClass"; "required": false; "isSignal": true; }; "exportConfig": { "alias": "exportConfig"; "required": false; "isSignal": true; }; }, { "isOpen": "isOpen"; }, never, never, true, never>;
}
export { CSVGeneratorAdapter, DataFetchingService, DataPointsExportSelectorDataScopeComponent, DataPointsExportSelectorFileTypesComponent, DataPointsExportSelectorPreviewComponent, DataPointsExportSelectorTimeRangeComponent, DataProcessingService, DatapointsExportSelectorComponent, DatapointsExportSelectorFileExporterComponent, DatapointsExportSelectorFileExporterService, DatapointsExportSelectorModalComponent, EXPORT_MODE_LABELS, EXPORT_MODE_VALUES, ExcelDataTransformer, ExcelGeneratorAdapter, FILE_COMPRESSION_TYPES_VALUES, FILE_GENERATORS, HAS_ERROR, MEASUREMENTS_PREVIEW_ITEMS_LIMIT, PRODUCT_EXPERIENCE_DATAPOINTS_EXPORT_SELECTOR, SERIES_DATA_MERGED_FILE_NAME, UtilsService, dateRangeValidator };
export type { ColumnValueMap, DataToExport, DataToExportWithBackendCreatedFile, DatapointCounts, DatapointDetails, DatapointsExceedingLimit, DatapointsValuesDataMap, DateFetchConfig, ExportColumnConfig, ExportConfig, ExportData, ExportType, ExportedFile, FileCompressionTypes, FileExportConfig, FileGenerator, FileTypeConfig, FileTypeMetadata, IDataTransformer, ListExportDatapoint, Measurement, MeasurementFileConfig, MergedExportDetails, MinMaxValues, ReadingValue, SeriesExportParams, SeriesInfo, SourceData, SourceId, SourceItem, TimeSeriesColumnData, TimeSeriesData, TimeStamp, TransformedData, TransformedSeries, TransformedSource };
//# sourceMappingURL=index.d.ts.map