From ffbfb9de228144eab115fc6318e7b9cf761ebecd Mon Sep 17 00:00:00 2001 From: Melissa Alvarez Date: Fri, 14 Dec 2018 11:57:29 -0600 Subject: [PATCH] [ML] Ensure loading indicator is present on initial jobs load (#27151) (#27231) * Show table loading on initial jobs load * Use async/await and try/catch to catch job load failure --- .../components/jobs_list/jobs_list.js | 7 ++- .../jobs_list_view/jobs_list_view.js | 61 +++++++++++-------- 2 files changed, 41 insertions(+), 27 deletions(-) diff --git a/x-pack/plugins/ml/public/jobs/jobs_list/components/jobs_list/jobs_list.js b/x-pack/plugins/ml/public/jobs/jobs_list/components/jobs_list/jobs_list.js index 01e08c3f5659..24f509d616c5 100644 --- a/x-pack/plugins/ml/public/jobs/jobs_list/components/jobs_list/jobs_list.js +++ b/x-pack/plugins/ml/public/jobs/jobs_list/components/jobs_list/jobs_list.js @@ -98,7 +98,7 @@ class JobsListUI extends Component { } render() { - const { intl } = this.props; + const { intl, loading } = this.props; const selectionControls = { selectable: () => true, selectableMessage: (selectable) => (!selectable) ? intl.formatMessage({ @@ -253,6 +253,7 @@ class JobsListUI extends Component { return ( { - const fullJobsList = {}; - const jobsSummaryList = jobs.map((job) => { - if (job.fullJob !== undefined) { - fullJobsList[job.id] = job.fullJob; - delete job.fullJob; - } - job.latestTimestampSortValue = (job.latestTimestampMs || 0); - return job; - }); - const filteredJobsSummaryList = filterJobs(jobsSummaryList, this.state.filterClauses); - this.setState({ jobsSummaryList, filteredJobsSummaryList, fullJobsList }, () => { - this.refreshSelectedJobs(); - }); - - Object.keys(this.updateFunctions).forEach((j) => { - this.updateFunctions[j].setState({ job: fullJobsList[j] }); - }); - - this.isDoneRefreshing(); - }) - .catch((error) => { - console.error(error); + try { + const jobs = await ml.jobs.jobsSummary(expandedJobsIds); + const fullJobsList = {}; + const jobsSummaryList = jobs.map((job) => { + if (job.fullJob !== undefined) { + fullJobsList[job.id] = job.fullJob; + delete job.fullJob; + } + job.latestTimestampSortValue = (job.latestTimestampMs || 0); + return job; }); + const filteredJobsSummaryList = filterJobs(jobsSummaryList, this.state.filterClauses); + this.setState({ jobsSummaryList, filteredJobsSummaryList, fullJobsList, loading: false }, () => { + this.refreshSelectedJobs(); + }); + + Object.keys(this.updateFunctions).forEach((j) => { + this.updateFunctions[j].setState({ job: fullJobsList[j] }); + }); + + this.isDoneRefreshing(); + } catch (error) { + console.error(error); + this.setState({ loading: false }); + } } } renderJobsListComponents() { - const jobIds = this.state.jobsSummaryList.map(j => j.id); + const { loading, jobsSummaryList } = this.state; + const jobIds = jobsSummaryList.map(j => j.id); return (
@@ -301,6 +309,7 @@ export class JobsListView extends Component { showStartDatafeedModal={this.showStartDatafeedModal} refreshJobs={() => this.refreshJobSummaryList(true)} selectedJobsCount={this.state.selectedJobs.length} + loading={loading} />