{"action":"created","comment":{"url":"https://api.github.com/repos/elastic/kibana/pulls/comments/190497374","pull_request_review_id":122883352,"id":190497374,"diff_hunk":"@@ -0,0 +1,402 @@\n+/*\n+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n+ * or more contributor license agreements. Licensed under the Elastic License;\n+ * you may not use this file except in compliance with the Elastic License.\n+ */\n+\n+\n+/*\n+ * React table for displaying a list of anomalies.\n+ */\n+\n+import PropTypes from 'prop-types';\n+import _ from 'lodash';\n+import $ from 'jquery';\n+\n+import React, {\n+  Component\n+} from 'react';\n+\n+import {\n+  EuiButtonIcon,\n+  EuiFlexGroup,\n+  EuiFlexItem,\n+  EuiHealth,\n+  EuiInMemoryTable,\n+  EuiText\n+} from '@elastic/eui';\n+\n+import { formatDate } from '@elastic/eui/lib/services/format';\n+\n+import { DescriptionCell } from './description_cell';\n+import { EntityCell } from './entity_cell';\n+import { InfluencersCell } from './influencers_cell';\n+import { AnomalyDetails } from './anomaly_details';\n+import { LinksMenu } from './links_menu';\n+\n+import { mlAnomaliesTableService } from './anomalies_table_service';\n+import { mlFieldFormatService } from 'plugins/ml/services/field_format_service';\n+import { getSeverityColor } from 'plugins/ml/../common/util/anomaly_utils';\n+import { formatValue } from 'plugins/ml/formatters/format_value';\n+\n+\n+const INFLUENCERS_LIMIT = 5;    // Maximum number of influencers to display before a 'show more' link is added.\n+\n+\n+function renderTime(date, aggregationInterval) {\n+  if (aggregationInterval === 'hour') {\n+    return formatDate(date, 'MMMM Do YYYY, HH:mm');\n+  } else if (aggregationInterval === 'second') {\n+    return formatDate(date, 'MMMM Do YYYY, HH:mm:ss');\n+  } else {\n+    return formatDate(date, 'MMMM Do YYYY');\n+  }\n+}\n+\n+function showLinksMenuForItem(item) {\n+  return item.isTimeSeriesViewDetector ||\n+    item.entityName === 'mlcategory' ||\n+    item.customUrls !== undefined;\n+}\n+\n+function getColumns(\n+  items,\n+  examplesByJobId,\n+  isAggregatedData,\n+  interval,\n+  timefilter,\n+  showViewSeriesLink,\n+  itemIdToExpandedRowMap,\n+  toggleRow,\n+  filter) {\n+  const columns = [\n+    {\n+      name: '',\n+      render: (item) => (\n+        <EuiButtonIcon\n+          onClick={() => toggleRow(item)}\n+          iconType={itemIdToExpandedRowMap[item.rowId] ? 'arrowDown' : 'arrowRight'}\n+          aria-label={itemIdToExpandedRowMap[item.rowId] ? 'Hide details' : 'Show details'}\n+          data-row-id={item.rowId}\n+        />\n+      )\n+    },\n+    {\n+      field: 'time',\n+      name: 'time',\n+      dataType: 'date',\n+      render: (date) => renderTime(date, interval),\n+      sortable: true\n+    },\n+    {\n+      field: 'severity',\n+      name: `${(isAggregatedData === true) ? 'max ' : ''}severity`,\n+      render: (score) => {\n+        return (\n+          <EuiHealth color={getSeverityColor(score)} compressed=\"true\">\n+            {score >= 1 ? Math.floor(score) : '< 1'}\n+          </EuiHealth>\n+        );\n+      },\n+      sortable: true\n+    },\n+    {\n+      field: 'detector',\n+      name: 'detector',\n+      sortable: true\n+    }\n+  ];\n+\n+  if (items.some(item => item.entityValue !== undefined)) {\n+    columns.push({\n+      field: 'entityValue',\n+      name: 'found for',\n+      render: (entityValue, item) => {\n+        return (\n+          <EntityCell\n+            entityName={item.entityName}\n+            entityValue={entityValue}\n+            filter={filter}\n+          />\n+        );\n+      },\n+      sortable: true\n+    });\n+  }\n+\n+  if (items.some(item => item.influencers !== undefined)) {\n+    columns.push({\n+      field: 'influencers',\n+      name: 'influenced by',\n+      render: (influencers) => {\n+        return (\n+          <InfluencersCell\n+            limit={INFLUENCERS_LIMIT}\n+            influencers={influencers}\n+          />\n+        );\n+      },\n+      sortable: true\n+    });\n+  }\n+\n+  // Map the additional 'sort' fields to the actual, typical and description\n+  // fields to ensure sorting is done correctly on the underlying metric value\n+  // and not on e.g. the actual values array as a String.\n+  if (items.some(item => item.actual !== undefined)) {\n+    columns.push({\n+      field: 'actualSort',\n+      name: 'actual',\n+      render: (actual, item) => {\n+        const fieldFormat = mlFieldFormatService.getFieldFormat(item.jobId, item.source.detector_index);\n+        return formatValue(item.actual, item.source.function, fieldFormat);\n+      },\n+      sortable: true\n+    });\n+  }\n+\n+  if (items.some(item => item.typical !== undefined)) {\n+    columns.push({\n+      field: 'typicalSort',\n+      name: 'typical',\n+      render: (typical, item) => {\n+        const fieldFormat = mlFieldFormatService.getFieldFormat(item.jobId, item.source.detector_index);\n+        return formatValue(item.typical, item.source.function, fieldFormat);\n+      },\n+      sortable: true\n+    });\n+\n+    // Assume that if we are showing typical, there will be an actual too,\n+    // so we can add a column to describe how actual compares to typical.\n+    const nonTimeOfDayOrWeek = items.some((item) => {\n+      const summaryRecFunc = item.source.function;\n+      return summaryRecFunc !== 'time_of_day' && summaryRecFunc !== 'time_of_week';\n+    });\n+    if (nonTimeOfDayOrWeek === true) {\n+      columns.push({\n+        field: 'metricDescriptionSort',\n+        name: 'description',\n+        render: (metricDescriptionSort, item) => {\n+          return (\n+            <DescriptionCell\n+              actual={item.actual}\n+              typical={item.typical}\n+            />\n+          );\n+        },\n+        sortable: true\n+      });\n+    }\n+  }\n+\n+  columns.push({\n+    field: 'jobId',\n+    name: 'job ID',\n+    sortable: true\n+  });\n+\n+  const showExamples = items.some(item => item.entityName === 'mlcategory');\n+  const showLinks = showViewSeriesLink === true && items.some((item) => showLinksMenuForItem(item));\n+\n+  if (showLinks === true) {\n+    columns.push({\n+      name: 'links',\n+      render: (item) => {\n+        if (showLinksMenuForItem(item) === true) {\n+          return (\n+            <LinksMenu\n+              anomaly={item}\n+              showViewSeriesLink={showViewSeriesLink}\n+              isAggregatedData={isAggregatedData}\n+              interval={interval}\n+              timefilter={timefilter}\n+            />\n+          );\n+        } else {\n+          return null;\n+        }\n+      },\n+      sortable: false\n+    });\n+  }\n+\n+  if (showExamples === true) {\n+    columns.push({\n+      name: 'category examples',\n+      sortable: false,\n+      truncateText: true,\n+      render: (item) => {\n+        const examples = _.get(examplesByJobId, [item.jobId, item.entityValue], []);\n+        return (\n+          <EuiText size=\"xs\">\n+            {examples.map((example, i) => {\n+              return <span key={`example${i}`} className=\"category-example\">{example}</span>;\n+            }\n+            )}\n+          </EuiText>\n+        );\n+      }\n+    });\n+  }\n+\n+  return columns;\n+}\n+\n+class AnomaliesTable extends Component {\n+  constructor(props) {\n+    super(props);\n+\n+    this.state = {\n+      itemIdToExpandedRowMap: {}\n+    };\n+  }\n+\n+  isShowingAggregatedData = () => {\n+    return (this.props.tableData.interval !== 'second');\n+  };\n+\n+  static getDerivedStateFromProps(nextProps, prevState) {\n+    // Update the itemIdToExpandedRowMap state if a change to the table data has resulted\n+    // in an anomaly that was previously expanded no longer being in the data.\n+    const itemIdToExpandedRowMap = prevState.itemIdToExpandedRowMap;\n+    const prevExpandedNotInData = Object.keys(itemIdToExpandedRowMap).find((rowId) => {\n+      const matching = nextProps.tableData.anomalies.find((anomaly) => {\n+        return anomaly.rowId === rowId;\n+      });\n+\n+      return matching === undefined;\n+    });\n+\n+    if (prevExpandedNotInData !== undefined) {\n+      // Anomaly data has changed and an anomaly that was previously expanded is no longer in the data.\n+      return {\n+        itemIdToExpandedRowMap: {}\n+      };\n+    }\n+\n+    // Return null to indicate no change to state.\n+    return null;\n+  }\n+\n+  toggleRow = (item) => {\n+    const itemIdToExpandedRowMap = { ...this.state.itemIdToExpandedRowMap };\n+    if (itemIdToExpandedRowMap[item.rowId]) {\n+      delete itemIdToExpandedRowMap[item.rowId];\n+    } else {\n+      const examples = item.entityName === 'mlcategory' ?\n+        _.get(this.props.tableData, ['examplesByJobId', item.jobId, item.entityValue]) : undefined;\n+      itemIdToExpandedRowMap[item.rowId] = (\n+        <AnomalyDetails\n+          anomaly={item}\n+          examples={examples}\n+          isAggregatedData={this.isShowingAggregatedData()}\n+          filter={this.props.filter}\n+        />\n+      );\n+    }\n+    this.setState({ itemIdToExpandedRowMap });\n+  };\n+\n+  onMouseOver = (event) => {\n+    // Triggered when the mouse is somewhere over the table.\n+    // Traverse through the table DOM to find the expand/collapse\n+    // button which stores the ID of the row.\n+    let mouseOverRecord = undefined;\n+    const target = $(event.target);\n+    const parentRow = target.closest('tr');\n+    const firstCell = parentRow.children('td').first();\n+    if (firstCell !== undefined) {\n+      const expandButton = firstCell.find('button').first();\n+      if (expandButton.length > 0) {\n+        const rowId = expandButton.attr('data-row-id');\n+        mouseOverRecord = this.props.tableData.anomalies.find((anomaly) => {\n+          return anomaly.rowId === rowId;\n+        });\n+      }\n+    }\n+\n+    if (this.mouseOverRecord !== undefined) {\n+      if (mouseOverRecord === undefined || this.mouseOverRecord.rowId !== mouseOverRecord.rowId) {\n+        // Mouse is over a different row, fire mouseleave on the previous record.\n+        mlAnomaliesTableService.anomalyRecordMouseleave.changed(this.mouseOverRecord);\n+\n+        if (mouseOverRecord !== undefined) {\n+          // Mouse is over a new row, fire mouseenter on the new record.\n+          mlAnomaliesTableService.anomalyRecordMouseenter.changed(mouseOverRecord);\n+        }\n+      }\n+    } else {\n+      if (mouseOverRecord !== undefined) {","path":"x-pack/plugins/ml/public/components/anomalies_table/anomalies_table.js","position":329,"original_position":329,"commit_id":"7d6117da0bad16a50ad9c0540fff717841be8f2d","original_commit_id":"7d6117da0bad16a50ad9c0540fff717841be8f2d","user":{"login":"walterra","id":230104,"avatar_url":"https://avatars3.githubusercontent.com/u/230104?v=4","gravatar_id":"","url":"https://api.github.com/users/walterra","html_url":"https://github.com/walterra","followers_url":"https://api.github.com/users/walterra/followers","following_url":"https://api.github.com/users/walterra/following{/other_user}","gists_url":"https://api.github.com/users/walterra/gists{/gist_id}","starred_url":"https://api.github.com/users/walterra/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/walterra/subscriptions","organizations_url":"https://api.github.com/users/walterra/orgs","repos_url":"https://api.github.com/users/walterra/repos","events_url":"https://api.github.com/users/walterra/events{/privacy}","received_events_url":"https://api.github.com/users/walterra/received_events","type":"User","site_admin":false},"body":"nit: This could be `} else if (mouseOverRecord !== undefined) {`.","created_at":"2018-05-24T08:07:04Z","updated_at":"2018-05-24T08:07:05Z","html_url":"https://github.com/elastic/kibana/pull/19352#discussion_r190497374","pull_request_url":"https://api.github.com/repos/elastic/kibana/pulls/19352","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/elastic/kibana/pulls/comments/190497374"},"html":{"href":"https://github.com/elastic/kibana/pull/19352#discussion_r190497374"},"pull_request":{"href":"https://api.github.com/repos/elastic/kibana/pulls/19352"}}},"pull_request":{"url":"https://api.github.com/repos/elastic/kibana/pulls/19352","id":190013050,"html_url":"https://github.com/elastic/kibana/pull/19352","diff_url":"https://github.com/elastic/kibana/pull/19352.diff","patch_url":"https://github.com/elastic/kibana/pull/19352.patch","issue_url":"https://api.github.com/repos/elastic/kibana/issues/19352","number":19352,"state":"open","locked":false,"title":"[ML] Convert anomalies table to EUI / React","user":{"login":"peteharverson","id":7405507,"avatar_url":"https://avatars1.githubusercontent.com/u/7405507?v=4","gravatar_id":"","url":"https://api.github.com/users/peteharverson","html_url":"https://github.com/peteharverson","followers_url":"https://api.github.com/users/peteharverson/followers","following_url":"https://api.github.com/users/peteharverson/following{/other_user}","gists_url":"https://api.github.com/users/peteharverson/gists{/gist_id}","starred_url":"https://api.github.com/users/peteharverson/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/peteharverson/subscriptions","organizations_url":"https://api.github.com/users/peteharverson/orgs","repos_url":"https://api.github.com/users/peteharverson/repos","events_url":"https://api.github.com/users/peteharverson/events{/privacy}","received_events_url":"https://api.github.com/users/peteharverson/received_events","type":"User","site_admin":false},"body":"Converts the anomalies table, as used on the Single Metric Viewer and Anomaly Explorer to EUI / React.\r\n\r\nFunctionally the table is the same, but is now built from the EUI components.\r\n\r\nExisting Angular based table:\r\n![image](https://user-images.githubusercontent.com/7405507/40433574-3f02e820-5ea4-11e8-9e20-72cf91f2825b.png)\r\n\r\nNew EUI / React table:\r\n![image](https://user-images.githubusercontent.com/7405507/40433425-e20f7426-5ea3-11e8-917b-383c5d74f85f.png)\r\n\r\nAddresses anomalies table and anomalies table service items in the components list of https://github.com/elastic/kibana/issues/18374. Note the interval and severity controls, and the parent pages (Angular controller based), will be converted to EUI in future PRs.\r\n\r\n\r\n\r\n","created_at":"2018-05-23T15:17:08Z","updated_at":"2018-05-24T08:07:05Z","closed_at":null,"merged_at":null,"merge_commit_sha":"36679b1e2ac982b32dc2a9a233604a13a7766dbb","assignee":null,"assignees":[],"requested_reviewers":[{"login":"jgowdyelastic","id":22172091,"avatar_url":"https://avatars0.githubusercontent.com/u/22172091?v=4","gravatar_id":"","url":"https://api.github.com/users/jgowdyelastic","html_url":"https://github.com/jgowdyelastic","followers_url":"https://api.github.com/users/jgowdyelastic/followers","following_url":"https://api.github.com/users/jgowdyelastic/following{/other_user}","gists_url":"https://api.github.com/users/jgowdyelastic/gists{/gist_id}","starred_url":"https://api.github.com/users/jgowdyelastic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jgowdyelastic/subscriptions","organizations_url":"https://api.github.com/users/jgowdyelastic/orgs","repos_url":"https://api.github.com/users/jgowdyelastic/repos","events_url":"https://api.github.com/users/jgowdyelastic/events{/privacy}","received_events_url":"https://api.github.com/users/jgowdyelastic/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":912943303,"url":"https://api.github.com/repos/elastic/kibana/labels/:ml","name":":ml","color":"0e8a16","default":false},{"id":912944483,"url":"https://api.github.com/repos/elastic/kibana/labels/:ml-results","name":":ml-results","color":"0e8a16","default":false},{"id":135307740,"url":"https://api.github.com/repos/elastic/kibana/labels/review","name":"review","color":"0052cc","default":false},{"id":883958396,"url":"https://api.github.com/repos/elastic/kibana/labels/v6.4.0","name":"v6.4.0","color":"ffffff","default":false},{"id":654061976,"url":"https://api.github.com/repos/elastic/kibana/labels/v7.0.0","name":"v7.0.0","color":"ffffff","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/elastic/kibana/pulls/19352/commits","review_comments_url":"https://api.github.com/repos/elastic/kibana/pulls/19352/comments","review_comment_url":"https://api.github.com/repos/elastic/kibana/pulls/comments{/number}","comments_url":"https://api.github.com/repos/elastic/kibana/issues/19352/comments","statuses_url":"https://api.github.com/repos/elastic/kibana/statuses/7d6117da0bad16a50ad9c0540fff717841be8f2d","head":{"label":"peteharverson:ml-anomalies-table-react","ref":"ml-anomalies-table-react","sha":"7d6117da0bad16a50ad9c0540fff717841be8f2d","user":{"login":"peteharverson","id":7405507,"avatar_url":"https://avatars1.githubusercontent.com/u/7405507?v=4","gravatar_id":"","url":"https://api.github.com/users/peteharverson","html_url":"https://github.com/peteharverson","followers_url":"https://api.github.com/users/peteharverson/followers","following_url":"https://api.github.com/users/peteharverson/following{/other_user}","gists_url":"https://api.github.com/users/peteharverson/gists{/gist_id}","starred_url":"https://api.github.com/users/peteharverson/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/peteharverson/subscriptions","organizations_url":"https://api.github.com/users/peteharverson/orgs","repos_url":"https://api.github.com/users/peteharverson/repos","events_url":"https://api.github.com/users/peteharverson/events{/privacy}","received_events_url":"https://api.github.com/users/peteharverson/received_events","type":"User","site_admin":false},"repo":{"id":131285225,"name":"kibana","full_name":"peteharverson/kibana","owner":{"login":"peteharverson","id":7405507,"avatar_url":"https://avatars1.githubusercontent.com/u/7405507?v=4","gravatar_id":"","url":"https://api.github.com/users/peteharverson","html_url":"https://github.com/peteharverson","followers_url":"https://api.github.com/users/peteharverson/followers","following_url":"https://api.github.com/users/peteharverson/following{/other_user}","gists_url":"https://api.github.com/users/peteharverson/gists{/gist_id}","starred_url":"https://api.github.com/users/peteharverson/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/peteharverson/subscriptions","organizations_url":"https://api.github.com/users/peteharverson/orgs","repos_url":"https://api.github.com/users/peteharverson/repos","events_url":"https://api.github.com/users/peteharverson/events{/privacy}","received_events_url":"https://api.github.com/users/peteharverson/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/peteharverson/kibana","description":":bar_chart: Kibana analytics and search dashboard for Elasticsearch","fork":true,"url":"https://api.github.com/repos/peteharverson/kibana","forks_url":"https://api.github.com/repos/peteharverson/kibana/forks","keys_url":"https://api.github.com/repos/peteharverson/kibana/keys{/key_id}","collaborators_url":"https://api.github.com/repos/peteharverson/kibana/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/peteharverson/kibana/teams","hooks_url":"https://api.github.com/repos/peteharverson/kibana/hooks","issue_events_url":"https://api.github.com/repos/peteharverson/kibana/issues/events{/number}","events_url":"https://api.github.com/repos/peteharverson/kibana/events","assignees_url":"https://api.github.com/repos/peteharverson/kibana/assignees{/user}","branches_url":"https://api.github.com/repos/peteharverson/kibana/branches{/branch}","tags_url":"https://api.github.com/repos/peteharverson/kibana/tags","blobs_url":"https://api.github.com/repos/peteharverson/kibana/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/peteharverson/kibana/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/peteharverson/kibana/git/refs{/sha}","trees_url":"https://api.github.com/repos/peteharverson/kibana/git/trees{/sha}","statuses_url":"https://api.github.com/repos/peteharverson/kibana/statuses/{sha}","languages_url":"https://api.github.com/repos/peteharverson/kibana/languages","stargazers_url":"https://api.github.com/repos/peteharverson/kibana/stargazers","contributors_url":"https://api.github.com/repos/peteharverson/kibana/contributors","subscribers_url":"https://api.github.com/repos/peteharverson/kibana/subscribers","subscription_url":"https://api.github.com/repos/peteharverson/kibana/subscription","commits_url":"https://api.github.com/repos/peteharverson/kibana/commits{/sha}","git_commits_url":"https://api.github.com/repos/peteharverson/kibana/git/commits{/sha}","comments_url":"https://api.github.com/repos/peteharverson/kibana/comments{/number}","issue_comment_url":"https://api.github.com/repos/peteharverson/kibana/issues/comments{/number}","contents_url":"https://api.github.com/repos/peteharverson/kibana/contents/{+path}","compare_url":"https://api.github.com/repos/peteharverson/kibana/compare/{base}...{head}","merges_url":"https://api.github.com/repos/peteharverson/kibana/merges","archive_url":"https://api.github.com/repos/peteharverson/kibana/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/peteharverson/kibana/downloads","issues_url":"https://api.github.com/repos/peteharverson/kibana/issues{/number}","pulls_url":"https://api.github.com/repos/peteharverson/kibana/pulls{/number}","milestones_url":"https://api.github.com/repos/peteharverson/kibana/milestones{/number}","notifications_url":"https://api.github.com/repos/peteharverson/kibana/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/peteharverson/kibana/labels{/name}","releases_url":"https://api.github.com/repos/peteharverson/kibana/releases{/id}","deployments_url":"https://api.github.com/repos/peteharverson/kibana/deployments","created_at":"2018-04-27T11:01:05Z","updated_at":"2018-04-27T11:01:20Z","pushed_at":"2018-05-23T15:05:11Z","git_url":"git://github.com/peteharverson/kibana.git","ssh_url":"git@github.com:peteharverson/kibana.git","clone_url":"https://github.com/peteharverson/kibana.git","svn_url":"https://github.com/peteharverson/kibana","homepage":"https://www.elastic.co/products/kibana","size":404858,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"elastic:master","ref":"master","sha":"56a69b1b385be638333ee79bf6af834792ad0f74","user":{"login":"elastic","id":6764390,"avatar_url":"https://avatars0.githubusercontent.com/u/6764390?v=4","gravatar_id":"","url":"https://api.github.com/users/elastic","html_url":"https://github.com/elastic","followers_url":"https://api.github.com/users/elastic/followers","following_url":"https://api.github.com/users/elastic/following{/other_user}","gists_url":"https://api.github.com/users/elastic/gists{/gist_id}","starred_url":"https://api.github.com/users/elastic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/elastic/subscriptions","organizations_url":"https://api.github.com/users/elastic/orgs","repos_url":"https://api.github.com/users/elastic/repos","events_url":"https://api.github.com/users/elastic/events{/privacy}","received_events_url":"https://api.github.com/users/elastic/received_events","type":"Organization","site_admin":false},"repo":{"id":7833168,"name":"kibana","full_name":"elastic/kibana","owner":{"login":"elastic","id":6764390,"avatar_url":"https://avatars0.githubusercontent.com/u/6764390?v=4","gravatar_id":"","url":"https://api.github.com/users/elastic","html_url":"https://github.com/elastic","followers_url":"https://api.github.com/users/elastic/followers","following_url":"https://api.github.com/users/elastic/following{/other_user}","gists_url":"https://api.github.com/users/elastic/gists{/gist_id}","starred_url":"https://api.github.com/users/elastic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/elastic/subscriptions","organizations_url":"https://api.github.com/users/elastic/orgs","repos_url":"https://api.github.com/users/elastic/repos","events_url":"https://api.github.com/users/elastic/events{/privacy}","received_events_url":"https://api.github.com/users/elastic/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/elastic/kibana","description":":bar_chart: Kibana analytics and search dashboard for Elasticsearch","fork":false,"url":"https://api.github.com/repos/elastic/kibana","forks_url":"https://api.github.com/repos/elastic/kibana/forks","keys_url":"https://api.github.com/repos/elastic/kibana/keys{/key_id}","collaborators_url":"https://api.github.com/repos/elastic/kibana/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/elastic/kibana/teams","hooks_url":"https://api.github.com/repos/elastic/kibana/hooks","issue_events_url":"https://api.github.com/repos/elastic/kibana/issues/events{/number}","events_url":"https://api.github.com/repos/elastic/kibana/events","assignees_url":"https://api.github.com/repos/elastic/kibana/assignees{/user}","branches_url":"https://api.github.com/repos/elastic/kibana/branches{/branch}","tags_url":"https://api.github.com/repos/elastic/kibana/tags","blobs_url":"https://api.github.com/repos/elastic/kibana/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/elastic/kibana/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/elastic/kibana/git/refs{/sha}","trees_url":"https://api.github.com/repos/elastic/kibana/git/trees{/sha}","statuses_url":"https://api.github.com/repos/elastic/kibana/statuses/{sha}","languages_url":"https://api.github.com/repos/elastic/kibana/languages","stargazers_url":"https://api.github.com/repos/elastic/kibana/stargazers","contributors_url":"https://api.github.com/repos/elastic/kibana/contributors","subscribers_url":"https://api.github.com/repos/elastic/kibana/subscribers","subscription_url":"https://api.github.com/repos/elastic/kibana/subscription","commits_url":"https://api.github.com/repos/elastic/kibana/commits{/sha}","git_commits_url":"https://api.github.com/repos/elastic/kibana/git/commits{/sha}","comments_url":"https://api.github.com/repos/elastic/kibana/comments{/number}","issue_comment_url":"https://api.github.com/repos/elastic/kibana/issues/comments{/number}","contents_url":"https://api.github.com/repos/elastic/kibana/contents/{+path}","compare_url":"https://api.github.com/repos/elastic/kibana/compare/{base}...{head}","merges_url":"https://api.github.com/repos/elastic/kibana/merges","archive_url":"https://api.github.com/repos/elastic/kibana/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/elastic/kibana/downloads","issues_url":"https://api.github.com/repos/elastic/kibana/issues{/number}","pulls_url":"https://api.github.com/repos/elastic/kibana/pulls{/number}","milestones_url":"https://api.github.com/repos/elastic/kibana/milestones{/number}","notifications_url":"https://api.github.com/repos/elastic/kibana/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/elastic/kibana/labels{/name}","releases_url":"https://api.github.com/repos/elastic/kibana/releases{/id}","deployments_url":"https://api.github.com/repos/elastic/kibana/deployments","created_at":"2013-01-26T04:00:59Z","updated_at":"2018-05-24T07:55:44Z","pushed_at":"2018-05-24T01:55:15Z","git_url":"git://github.com/elastic/kibana.git","ssh_url":"git@github.com:elastic/kibana.git","clone_url":"https://github.com/elastic/kibana.git","svn_url":"https://github.com/elastic/kibana","homepage":"https://www.elastic.co/products/kibana","size":405498,"stargazers_count":9391,"watchers_count":9391,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":3657,"mirror_url":null,"archived":false,"open_issues_count":3122,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":3657,"open_issues":3122,"watchers":9391,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/elastic/kibana/pulls/19352"},"html":{"href":"https://github.com/elastic/kibana/pull/19352"},"issue":{"href":"https://api.github.com/repos/elastic/kibana/issues/19352"},"comments":{"href":"https://api.github.com/repos/elastic/kibana/issues/19352/comments"},"review_comments":{"href":"https://api.github.com/repos/elastic/kibana/pulls/19352/comments"},"review_comment":{"href":"https://api.github.com/repos/elastic/kibana/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/elastic/kibana/pulls/19352/commits"},"statuses":{"href":"https://api.github.com/repos/elastic/kibana/statuses/7d6117da0bad16a50ad9c0540fff717841be8f2d"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"walterra"}}