@c8y/apps
Version:
Cumulocity IoT applications
131 lines (117 loc) • 4.23 kB
text/typescript
import { Component } from '@angular/core';
import { Column, gettext } from '@c8y/ngx-components';
import { CustomDeviceGridColumn, DeviceGridService } from '@c8y/ngx-components/device-grid';
import { find } from 'lodash-es';
import { AbstractControl } from '@angular/forms';
import { FormlyFieldConfig } from '@ngx-formly/core';
({
selector: 'c8y-device-grid-example',
templateUrl: './device-grid-example.component.html'
})
export class DeviceGridExampleComponent {
examples: Array<{ label: string; columns: Column[] }>;
selectedExample;
columnsInput: Column[];
constructor(protected deviceGridService: DeviceGridService) {
this.examples = [
this.getExampleWithStandardColumns(),
this.getExampleWithStandardColumnsAndSavedFilteringSorting(),
this.getExampleWithCustomColumnAndPredefinedFiltering(),
this.getExampleWithCustomColumnAndCustomValidator()
];
this.selectExample(this.examples[0]);
}
getExampleWithStandardColumns() {
const columns = this.deviceGridService.getDefaultColumns();
return {
label: 'Standard columns',
columns
};
}
getExampleWithStandardColumnsAndSavedFilteringSorting() {
const columns = this.deviceGridService.getDefaultColumns();
const nameColumn = find(columns, { name: 'name' });
nameColumn.externalFilterQuery = {
names: ['*Temp*']
};
nameColumn.sortOrder = 'desc';
return {
label: 'Standard columns with saved filtering/sorting',
columns
};
}
getExampleWithCustomColumnAndPredefinedFiltering() {
const columns = this.deviceGridService.getDefaultColumns();
const typeColumn = new CustomDeviceGridColumn();
typeColumn.name = 'type';
typeColumn.path = 'type';
typeColumn.header = gettext('Type');
typeColumn.externalFilterQuery = {
equals: ['c8y_MQTTDevice']
};
columns.splice(2, 0, typeColumn);
return {
label: 'Standard columns with custom one with predefined filtering',
columns
};
}
getExampleWithCustomColumnAndCustomValidator() {
const columns = this.deviceGridService.getDefaultColumns();
const nameColumn = columns.find(column => column.name === 'name');
nameColumn.filteringConfig.fields = [
{
key: 'name',
type: 'array',
defaultValue: [''],
templateOptions: {
required: true,
addText: 'Add next`name`'
},
fieldArray: {
type: 'string',
templateOptions: {
required: true,
label: 'Show items with name',
tooltip: 'Use * as a wildcard character',
placeholder: 'My device`DEVICE_NAME`'
},
validators: {
minLength: {
expression: (c: AbstractControl) => c.value.length >= 3,
message: (error: any, field: FormlyFieldConfig) =>
`value "${field.formControl.value}" is too short. min length is 3 characters`
},
maxLength: {
expression: (c: AbstractControl) => c.value.length <= 6,
message: (error: any, field: FormlyFieldConfig) =>
`value "${field.formControl.value}" is too long. max length is 6 characters `
},
regexExampleValidator: {
expression: (c: AbstractControl) => /foo/.test(c.value),
message: (error: any, field: FormlyFieldConfig) =>
`value "${field.formControl.value}" must contain "foo"`
}
}
}
}
];
return {
label: 'Standard columns with custom validators for "Name" column\'s filter',
columns
};
}
selectExample(example) {
this.selectedExample = example;
this.columnsInput = example.columns;
}
onColumnsChange(columns: Column[]): void {
// the columns list contains the current setup of the columns in the grid:
// eslint-disable-next-line no-console
console.log({ columns });
}
onDeviceQueryStringChange(deviceQueryString: string): void {
// the query string is based on currently selected filters and sorting in columns:
// eslint-disable-next-line no-console
console.log({ deviceQueryString });
}
}