problems: handle page size change

This commit is contained in:
Alexander Zobnin
2018-12-27 17:05:49 +03:00
parent 2a3ff46a6a
commit c7c896d71a
2 changed files with 30 additions and 1 deletions

View File

@@ -1,6 +1,7 @@
import React, { PureComponent } from 'react'; import React, { PureComponent } from 'react';
import ReactTable from 'react-table'; import ReactTable from 'react-table';
import classNames from 'classnames'; import classNames from 'classnames';
import _ from 'lodash';
import * as utils from '../../datasource-zabbix/utils'; import * as utils from '../../datasource-zabbix/utils';
import { ProblemsPanelOptions, Trigger, ZBXEvent, GFTimeRange, RTCell, ZBXTag } from '../types'; import { ProblemsPanelOptions, Trigger, ZBXEvent, GFTimeRange, RTCell, ZBXTag } from '../types';
import EventTag from './EventTag'; import EventTag from './EventTag';
@@ -12,10 +13,12 @@ export interface ProblemListProps {
panelOptions: ProblemsPanelOptions; panelOptions: ProblemsPanelOptions;
loading?: boolean; loading?: boolean;
timeRange?: GFTimeRange; timeRange?: GFTimeRange;
pageSize?: number;
fontSize?: number; fontSize?: number;
getProblemEvents: (ids: string[]) => ZBXEvent[]; getProblemEvents: (ids: string[]) => ZBXEvent[];
onProblemAck?: (problem: Trigger, data: AckProblemData) => void; onProblemAck?: (problem: Trigger, data: AckProblemData) => void;
onTagClick?: (tag: ZBXTag, datasource: string) => void; onTagClick?: (tag: ZBXTag, datasource: string) => void;
onPageSizeChange?: (pageSize: number, pageIndex: number) => void;
} }
interface ProblemListState { interface ProblemListState {
@@ -43,6 +46,12 @@ export class ProblemList extends PureComponent<ProblemListProps, ProblemListStat
return this.props.onProblemAck(problem, data); return this.props.onProblemAck(problem, data);
} }
handlePageSizeChange = (pageSize, pageIndex) => {
if (this.props.onPageSizeChange) {
this.props.onPageSizeChange(pageSize, pageIndex);
}
}
buildColumns() { buildColumns() {
const result = []; const result = [];
const options = this.props.panelOptions; const options = this.props.panelOptions;
@@ -101,8 +110,13 @@ export class ProblemList extends PureComponent<ProblemListProps, ProblemListStat
// console.log(this.props.problems); // console.log(this.props.problems);
const columns = this.buildColumns(); const columns = this.buildColumns();
this.rootWidth = this.rootRef && this.rootRef.clientWidth; this.rootWidth = this.rootRef && this.rootRef.clientWidth;
const { fontSize } = this.props; const { pageSize, fontSize } = this.props;
const panelClass = classNames('panel-problems', { [`font-size--${fontSize}`]: fontSize }); const panelClass = classNames('panel-problems', { [`font-size--${fontSize}`]: fontSize });
let pageSizeOptions = [5, 10, 20, 25, 50, 100];
if (pageSize) {
pageSizeOptions.push(pageSize);
pageSizeOptions = _.sortBy(pageSizeOptions);
}
return ( return (
<div className={panelClass} ref={this.setRootRef}> <div className={panelClass} ref={this.setRootRef}>
@@ -110,6 +124,8 @@ export class ProblemList extends PureComponent<ProblemListProps, ProblemListStat
data={this.props.problems} data={this.props.problems}
columns={columns} columns={columns}
defaultPageSize={10} defaultPageSize={10}
pageSize={pageSize}
pageSizeOptions={pageSizeOptions}
minRows={0} minRows={0}
loading={this.props.loading} loading={this.props.loading}
noDataText="No problems found" noDataText="No problems found"
@@ -125,6 +141,7 @@ export class ProblemList extends PureComponent<ProblemListProps, ProblemListStat
expanded={this.getExpandedPage(this.state.page)} expanded={this.getExpandedPage(this.state.page)}
onExpandedChange={this.handleExpandedChange} onExpandedChange={this.handleExpandedChange}
onPageChange={page => this.setState({ page })} onPageChange={page => this.setState({ page })}
onPageSizeChange={this.handlePageSizeChange}
/> />
</div> </div>
); );

View File

@@ -543,6 +543,14 @@ export class TriggerPanelCtrl extends PanelCtrl {
return this.currentTriggersPage; return this.currentTriggersPage;
} }
handlePageSizeChange(pageSize, pageIndex) {
this.panel.pageSize = pageSize;
this.pageIndex = pageIndex;
this.scope.$apply(() => {
this.render();
});
}
formatHostName(trigger) { formatHostName(trigger) {
let host = ""; let host = "";
if (this.panel.hostField && this.panel.hostTechNameField) { if (this.panel.hostField && this.panel.hostTechNameField) {
@@ -727,6 +735,8 @@ export class TriggerPanelCtrl extends PanelCtrl {
const fontSize = parseInt(panel.fontSize.slice(0, panel.fontSize.length - 1)); const fontSize = parseInt(panel.fontSize.slice(0, panel.fontSize.length - 1));
const fontSizeProp = fontSize && fontSize !== 100 ? fontSize : null; const fontSizeProp = fontSize && fontSize !== 100 ? fontSize : null;
const pageSize = panel.pageSize || 10;
let panelOptions = {}; let panelOptions = {};
for (let prop in PANEL_DEFAULTS) { for (let prop in PANEL_DEFAULTS) {
panelOptions[prop] = ctrl.panel[prop]; panelOptions[prop] = ctrl.panel[prop];
@@ -736,8 +746,10 @@ export class TriggerPanelCtrl extends PanelCtrl {
panelOptions, panelOptions,
timeRange: { timeFrom, timeTo }, timeRange: { timeFrom, timeTo },
loading: ctrl.loading, loading: ctrl.loading,
pageSize: pageSize,
fontSize: fontSizeProp, fontSize: fontSizeProp,
getProblemEvents: ctrl.getProblemEvents.bind(ctrl), getProblemEvents: ctrl.getProblemEvents.bind(ctrl),
onPageSizeChange: ctrl.handlePageSizeChange.bind(ctrl),
onProblemAck: (trigger, data) => { onProblemAck: (trigger, data) => {
const message = data.message; const message = data.message;
return ctrl.acknowledgeTrigger(trigger, message); return ctrl.acknowledgeTrigger(trigger, message);