diff --git a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/BreakdownOfLoadedResources/BreakdownOfLoadedResources.tsx b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/BreakdownOfLoadedResources/BreakdownOfLoadedResources.tsx index b43997b37..fd38e2a55 100644 --- a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/BreakdownOfLoadedResources/BreakdownOfLoadedResources.tsx +++ b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/BreakdownOfLoadedResources/BreakdownOfLoadedResources.tsx @@ -10,25 +10,25 @@ import { interface Props { data: any + metric?: any } function BreakdownOfLoadedResources(props: Props) { - const { data } = props; + const { data, metric } = props; const gradientDef = Styles.gradientDef(); - const params = { density: 28 } return ( {gradientDef} - + {gradientDef} - + getRE(serach, 'i').test(value); + const _data = search ? metric.data.chart.filter(i => test(i.urlHostpath, search)) : metric.data.chart.images; + + console.log('data', metric.data) + + const write = ({ target: { name, value } }) => { + setSearch(value) + }; + + return ( + + +
+
+ +
+ + + + ); +} + +export default CallWithErrors; \ No newline at end of file diff --git a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/Chart.js b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/Chart.js new file mode 100644 index 000000000..2f406622d --- /dev/null +++ b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/Chart.js @@ -0,0 +1,16 @@ +import { AreaChart, Area } from 'recharts'; +import { Styles } from '../../common'; + +const Chart = ({ data, compare }) => { + const colors = compare ? Styles.compareColors : Styles.colors; + + return ( + + + + ); +} + +Chart.displayName = 'Chart'; + +export default Chart; diff --git a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/ImageInfo.js b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/ImageInfo.js new file mode 100644 index 000000000..8251bec60 --- /dev/null +++ b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/ImageInfo.js @@ -0,0 +1,12 @@ +import { Popup, Icon, TextEllipsis } from 'UI'; +import styles from './imageInfo.css'; + +const ImageInfo = ({ data }) => ( +
+ +
+); + +ImageInfo.displayName = 'ImageInfo'; + +export default ImageInfo; diff --git a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/MethodType.js b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/MethodType.js new file mode 100644 index 000000000..ba370b481 --- /dev/null +++ b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/MethodType.js @@ -0,0 +1,10 @@ +import React from 'react' +import { Label } from 'UI'; + +const MethodType = ({ data }) => { + return ( + + ) +} + +export default MethodType diff --git a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/callWithErrors.css b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/callWithErrors.css new file mode 100644 index 000000000..bc37a3991 --- /dev/null +++ b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/callWithErrors.css @@ -0,0 +1,22 @@ +.topActions { + position: absolute; + top: -4px; + right: 50px; + display: flex; + justify-content: flex-end; +} + +.searchField { + padding: 4px 5px; + border-bottom: dotted thin $gray-light; + border-radius: 3px; + &:focus, + &:active { + border: solid thin transparent !important; + box-shadow: none; + background-color: $gray-light; + } + &:hover { + border: solid thin $gray-light !important; + } +} \ No newline at end of file diff --git a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/imageInfo.css b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/imageInfo.css new file mode 100644 index 000000000..69030a582 --- /dev/null +++ b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/imageInfo.css @@ -0,0 +1,39 @@ +.name { + display: flex; + align-items: center; + + & > span { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + max-width: 60%; + } +} + +.imagePreview { + max-width: 200px; + max-height: 200px; +} + +.imageWrapper { + display: flex; + flex-flow: column; + align-items: center; + width: 40px; + text-align: center; + margin-right: 10px; + & > span { + height: 16px; + } + & .label { + font-size: 9px; + color: $gray-light; + } +} + +.popup { + background-color: #f5f5f5 !important; + &:before { + background-color: #f5f5f5 !important; + } +} \ No newline at end of file diff --git a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/index.ts b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/index.ts new file mode 100644 index 000000000..4d3ba4df8 --- /dev/null +++ b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallWithErrors/index.ts @@ -0,0 +1 @@ +export { default } from './CallWithErrors' \ No newline at end of file diff --git a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallsErrors4xx/CallsErrors4xx.tsx b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallsErrors4xx/CallsErrors4xx.tsx index bd54bc5e3..f1e192587 100644 --- a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallsErrors4xx/CallsErrors4xx.tsx +++ b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallsErrors4xx/CallsErrors4xx.tsx @@ -9,26 +9,26 @@ import { interface Props { data: any + metric?: any } function CallsErrors4xx(props: Props) { - const { data } = props; + const { data, metric } = props; + console.log('asd', metric.data.namesMap) return ( - {/* { data.namesMap.map((key, index) => ( + { Array.isArray(metric.data.namesMap) && metric.data.namesMap.map((key, index) => ( - ))} */} + ))} diff --git a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallsErrors5xx/CallsErrors5xx.tsx b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallsErrors5xx/CallsErrors5xx.tsx index e55bbb0cb..3dec42162 100644 --- a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallsErrors5xx/CallsErrors5xx.tsx +++ b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/CallsErrors5xx/CallsErrors5xx.tsx @@ -9,26 +9,25 @@ import { interface Props { data: any + metric?: any } function CallsErrors5xx(props: Props) { - const { data } = props; + const { data, metric } = props; return ( - {/* { data.namesMap.map((key, index) => ( + { Array.isArray(metric.data.namesMap) && metric.data.namesMap.map((key, index) => ( - ))} */} + ))} diff --git a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/Crashes/Crashes.tsx b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/Crashes/Crashes.tsx index 5dffda63d..b27cf319b 100644 --- a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/Crashes/Crashes.tsx +++ b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/Crashes/Crashes.tsx @@ -10,24 +10,24 @@ import { interface Props { data: any + metric?: any } function Crashes(props: Props) { - const { data } = props; + const { data, metric } = props; const gradientDef = Styles.gradientDef(); - const params = { density: 70 } return ( {gradientDef} - + { - const _params = { density: 70 } + // const _params = { density: 70 } console.log('params', params) // TODO reload the data with new params; // this.props.fetchWidget(WIDGET_KEY, dashbaordStore.period, props.platform, { ..._params, url: params.value }) } @@ -34,7 +33,7 @@ function DomBuildingTime(props: Props) { return ( <>
@@ -45,7 +44,7 @@ function DomBuildingTime(props: Props) { onSelect={onSelect} placeholder="Search for Page" /> - +
{gradientDef} - +
- {data.chart.map((item, i) => + {metric.data.chart.map((item, i) => <>
@@ -27,12 +27,12 @@ function FPS(props: Props) {
{gradientDef} - + <>
@@ -27,12 +27,12 @@ function MemoryConsumption(props: Props) {
{gradientDef} - +
diff --git a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/ResourceLoadedVsResponseEnd/ResourceLoadedVsResponseEnd.tsx b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/ResourceLoadedVsResponseEnd/ResourceLoadedVsResponseEnd.tsx index 378a3abdc..0423a0007 100644 --- a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/ResourceLoadedVsResponseEnd/ResourceLoadedVsResponseEnd.tsx +++ b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/ResourceLoadedVsResponseEnd/ResourceLoadedVsResponseEnd.tsx @@ -8,19 +8,19 @@ import { interface Props { data: any + metric?: any } function ResourceLoadedVsResponseEnd(props: Props) { - const { data } = props; - const params = { density: 70 } + const { data, metric } = props; return ( @@ -28,7 +28,7 @@ function ResourceLoadedVsResponseEnd(props: Props) { {...Styles.xaxis} dataKey="time" // interval={3} - interval={(params.density / 7)} + interval={(metric.params.density / 7)} /> { - const _params = { density: 70 } + // const _params = { density: 70 } setSutoCompleteSelected(params.value); console.log('params', params) // TODO reload the data with new params; // this.props.fetchWidget(WIDGET_KEY, dashbaordStore.period, props.platform, { ..._params, url: params.value }) @@ -52,7 +52,7 @@ function ResourceLoadingTime(props: Props) { return ( <>
@@ -80,17 +80,17 @@ function ResourceLoadingTime(props: Props) {
{gradientDef} - + Styles.tickFormatter(val)} - label={{ ...Styles.axisLabelLeft, value: "CPU Load (%)" }} + label={{ ...Styles.axisLabelLeft, value: "Resource Fetch Time (ms)" }} /> { - const _params = { density: 70 } + // const _params = { density: 70 } console.log('params', params) // TODO reload the data with new params; // this.props.fetchWidget(WIDGET_KEY, dashbaordStore.period, props.platform, { ..._params, url: params.value }) } @@ -34,7 +34,7 @@ function ResponseTime(props: Props) { return ( <>
@@ -45,7 +45,7 @@ function ResponseTime(props: Props) { onSelect={onSelect} placeholder="Search for Page" /> - +
{gradientDef} - + {gradientDef} - + Styles.tickFormatter(val)} - label={{ ...Styles.axisLabelLeft, value: "CPU Load (%)" }} + label={{ ...Styles.axisLabelLeft, value: "Number of Requests" }} /> { + return Object.keys(item) + .filter(i => i !== 'browser' && i !== 'count') + .map(i => ({ key: 'v' +i, value: item[i]})) + } + return ( + +
+ {metric.data.chart.map((item, i) => + + )} +
+
+ ); +} + +export default SessionsPerBrowser; \ No newline at end of file diff --git a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SessionsPerBrowser/index.ts b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SessionsPerBrowser/index.ts new file mode 100644 index 000000000..06f0656a1 --- /dev/null +++ b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SessionsPerBrowser/index.ts @@ -0,0 +1 @@ +export { default } from './SessionsPerBrowser' \ No newline at end of file diff --git a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SlowestDomains/SlowestDomains.tsx b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SlowestDomains/SlowestDomains.tsx index a7334e650..9e2563752 100644 --- a/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SlowestDomains/SlowestDomains.tsx +++ b/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/SlowestDomains/SlowestDomains.tsx @@ -6,17 +6,18 @@ import Bar from 'App/components/Dashboard/Widgets/SlowestDomains/Bar'; interface Props { data: any + metric?: any } function SlowestDomains(props: Props) { - const { data } = props; - const firstAvg = data.chart[0] && data.chart[0].errorsCount; + const { data, metric } = props; + const firstAvg = metric.data.chart[0] && metric.data.chart[0].errorsCount; return (
- {data.chart.map((item, i) => + {metric.data.chart.map((item, i) => { - const _params = { density: 70 } + // const _params = { density: 70 } console.log('params', params) // TODO reload the data with new params; // this.props.fetchWidget(WIDGET_KEY, dashbaordStore.period, props.platform, { ..._params, url: params.value }) } @@ -34,7 +34,7 @@ function TimeToRender(props: Props) { return ( <>
@@ -49,12 +49,12 @@ function TimeToRender(props: Props) {
{gradientDef} - + } - return + return } if (metricType === 'timeseries') { diff --git a/frontend/app/components/Dashboard/components/WidgetPredefinedChart/WidgetPredefinedChart.tsx b/frontend/app/components/Dashboard/components/WidgetPredefinedChart/WidgetPredefinedChart.tsx index 7ae8a581f..151825b80 100644 --- a/frontend/app/components/Dashboard/components/WidgetPredefinedChart/WidgetPredefinedChart.tsx +++ b/frontend/app/components/Dashboard/components/WidgetPredefinedChart/WidgetPredefinedChart.tsx @@ -22,64 +22,69 @@ import ResourceLoadingTime from 'App/components/Dashboard/Widgets/PredefinedWidg import BreakdownOfLoadedResources from 'App/components/Dashboard/Widgets/PredefinedWidgets/BreakdownOfLoadedResources'; import MissingResources from 'App/components/Dashboard/Widgets/PredefinedWidgets/MissingResources'; import ResourceLoadedVsResponseEnd from 'App/components/Dashboard/Widgets/PredefinedWidgets/ResourceLoadedVsResponseEnd'; +import SessionsPerBrowser from 'App/components/Dashboard/Widgets/PredefinedWidgets/SessionsPerBrowser'; +import CallWithErrors from '../../Widgets/PredefinedWidgets/CallWithErrors'; interface Props { data: any; predefinedKey: string + metric?: any; } function WidgetPredefinedChart(props: Props) { - const { data, predefinedKey } = props; + const { data, predefinedKey, metric } = props; const renderWidget = () => { switch (predefinedKey) { // ERRORS case 'errors_per_type': - return + return case 'errors_per_domains': - return + return case 'resources_by_party': - return + return case 'impacted_sessions_by_js_errors': - return + return case 'domains_errors_4xx': - return + return case 'domains_errors_5xx': - return + return + case 'calls_errors': + return // PERFORMANCE // case 'impacted_sessions_by_slow_pages': // case 'pages_response_time_distribution': // case 'speed_location': case 'cpu': - return + return case 'crashes': - return + return case 'pages_dom_buildtime': - return + return case 'fps': - return + return case 'memory_consumption': - return + return case 'pages_response_time': - return + return case 'resources_vs_visually_complete': - return + return case 'sessions_per_browser': - return + return case 'slowest_domains': - return + return case 'time_to_render': - return + return // Resources case 'resources_count_by_type': - return + return case 'missing_resources': - return + return case 'resource_type_vs_response_end': - return + return case 'resources_loading_time': - return + return // case 'slowest_resources': default: diff --git a/frontend/app/mstore/dashboardStore.ts b/frontend/app/mstore/dashboardStore.ts index 1166b245f..73a41b379 100644 --- a/frontend/app/mstore/dashboardStore.ts +++ b/frontend/app/mstore/dashboardStore.ts @@ -420,27 +420,6 @@ export default class DashboardStore implements IDashboardSotre { metric.setData(_data) resolve(_data); } else { - // if (metric.predefinedKey === 'errors_per_domains') { - // console.log('errors_per_domains', data) - // data.chart = data - // } else { - // data.chart = getChartFormatter(this.period)(Array.isArray(data) ? data : data.chart) - // } - // data.namesMap = Array.isArray(data) ? data - // .map(i => Object.keys(i)) - // .flat() - // .filter(i => i !== 'time' && i !== 'timestamp') - // .reduce((unique: any, item: any) => { - // if (!unique.includes(item)) { - // unique.push(item); - // } - // return unique; - // }, []) : data.chart; - // console.log('map', data.namesMap) - // const _data = { ...data, namesMap: data.namesMap, chart: data.chart } - // metric.setData(_data) - // resolve(_data); - const _data = { ...data, } @@ -457,7 +436,7 @@ export default class DashboardStore implements IDashboardSotre { return unique; }, []) } else { - _data['chart'] = Array.isArray(data) ? data : [] + _data['chart'] = getChartFormatter(this.period)(Array.isArray(data) ? data : []); _data['namesMap'] = Array.isArray(data) ? data.map(i => Object.keys(i)) .flat() .filter(i => i !== 'time' && i !== 'timestamp') diff --git a/frontend/app/mstore/types/widget.ts b/frontend/app/mstore/types/widget.ts index ee9c559b4..2c74ce26b 100644 --- a/frontend/app/mstore/types/widget.ts +++ b/frontend/app/mstore/types/widget.ts @@ -28,6 +28,8 @@ export interface IWidget { colSpan: number predefinedKey: string + params: any + udpateKey(key: string, value: any): void removeSeries(index: number): void addSeries(): void @@ -57,6 +59,7 @@ export default class Widget implements IWidget { dashboards: any[] = [] dashboardIds: any[] = [] config: any = {} + params: any = { density: 70 } position: number = 0 data: any = {