diff --git a/ghost/admin/app/components/gh-members-chart.js b/ghost/admin/app/components/gh-members-chart.js index 915066851a..8a04b0e0b5 100644 --- a/ghost/admin/app/components/gh-members-chart.js +++ b/ghost/admin/app/components/gh-members-chart.js @@ -16,6 +16,7 @@ export default Component.extend({ nightShift: false, stats: null, + chartStats: null, chartData: null, chartOptions: null, showSummary: true, @@ -64,6 +65,10 @@ export default Component.extend({ if (this._lastNightShift !== undefined && this.nightShift !== this._lastNightShift) { this.setChartOptions(); } + + if (this.chartStats) { + this.setMRRChartData(this.chartStats); + } this._lastNightShift = this.nightShift; }, @@ -77,24 +82,19 @@ export default Component.extend({ // Tasks ------------------------------------------------------------------- fetchStatsTask: task(function* () { - this.set('stats', null); let stats; - if (this.chartType === 'mrr') { - stats = yield this.membersStats.fetchMRR(); - this.setMRRChartData(stats); - } else if (this.chartType === 'counts') { - stats = yield this.membersStats.fetchCounts(); - this.setCountsChartData(stats); - } else { + if (this.chartType !== 'mrr') { + this.set('stats', null); stats = yield this.membersStats.fetch(); this.setOriginalChartData(stats); } }), setMRRChartData(stats) { - const statsForCurrency = stats[0]; - statsForCurrency.data = this.membersStats.fillDates(statsForCurrency.data) || {}; - if (stats) { + const statsForCurrency = stats && stats[0]; + if (statsForCurrency) { + statsForCurrency.data = this.membersStats.fillDates(statsForCurrency.data) || {}; + this.set('stats', statsForCurrency); this.setChartOptions({ @@ -106,6 +106,15 @@ export default Component.extend({ dateLabels: Object.keys(statsForCurrency.data), dateValues: Object.values(statsForCurrency.data).map(val => val / 100) }); + } else { + this.set('stats', {}); + this.set('chartHeading', 'MRR'); + + this.setChartData({ + label: 'Total MRR', + dateLabels: [], + dateValues: [] + }); } }, diff --git a/ghost/admin/app/controllers/dashboard.js b/ghost/admin/app/controllers/dashboard.js index 604812e261..e60311efd1 100644 --- a/ghost/admin/app/controllers/dashboard.js +++ b/ghost/admin/app/controllers/dashboard.js @@ -13,10 +13,27 @@ export default class DashboardController extends Controller { error: null, loading: false }; + @tracked + mrrStats = { + data: null, + error: null, + loading: false + }; constructor(...args) { super(...args); this.loadEvents(); + this.loadCharts(); + } + + loadCharts() { + this.membersStats.fetchMRR().then((stats) => { + this.mrrStats.data = stats; + this.events.loading = false; + }, (error) => { + this.mrrStats.error = error; + this.events.loading = false; + }); } loadEvents() { diff --git a/ghost/admin/app/services/members-stats.js b/ghost/admin/app/services/members-stats.js index 22efcd763c..d50acedf58 100644 --- a/ghost/admin/app/services/members-stats.js +++ b/ghost/admin/app/services/members-stats.js @@ -46,16 +46,15 @@ export default class MembersStatsService extends Service { } fetchCounts() { - let daysChanged = this._lastFetchedDays !== this.days; - let staleData = this._lastFetched && this._lastFetched - new Date() > 1 * 60 * 1000; + let staleData = this._lastFetchedCounts && this._lastFetchedCounts - new Date() > 1 * 60 * 1000; // return an already in-progress promise unless params have changed - if (this._fetchCountsTask.isRunning && !this._forceRefresh && !daysChanged) { + if (this._fetchCountsTask.isRunning) { return this._fetchCountsTask.last; } // return existing stats unless data is > 1 min old - if (this.countStats && !this._forceRefresh && !daysChanged && !staleData) { + if (this.countStats && !this._forceRefresh && !staleData) { return Promise.resolve(this.stats); } @@ -79,16 +78,15 @@ export default class MembersStatsService extends Service { } fetchMRR() { - let daysChanged = this._lastFetchedDays !== this.days; - let staleData = this._lastFetched && this._lastFetched - new Date() > 1 * 60 * 1000; + let staleData = this._lastFetchedMRR && this._lastFetchedMRR - new Date() > 1 * 60 * 1000; // return an already in-progress promise unless params have changed - if (this._fetchMRRTask.isRunning && !this._forceRefresh && !daysChanged) { + if (this._fetchMRRTask.isRunning) { return this._fetchMRRTask.last; } // return existing stats unless data is > 1 min old - if (this.mrrStats && !this._forceRefresh && !daysChanged && !staleData) { + if (this.mrrStats && !this._forceRefresh && !staleData) { return Promise.resolve(this.stats); } @@ -101,8 +99,7 @@ export default class MembersStatsService extends Service { @task *_fetchCountsTask() { - this._lastFetched = new Date(); - this._forceRefresh = false; + this._lastFetchedCounts = new Date(); let statsUrl = this.ghostPaths.url.api('members/stats/count'); let stats = yield this.ajax.request(statsUrl); @@ -112,8 +109,7 @@ export default class MembersStatsService extends Service { @task *_fetchMRRTask() { - this._lastFetched = new Date(); - this._forceRefresh = false; + this._lastFetchedMRR = new Date(); let statsUrl = this.ghostPaths.url.api('members/stats/mrr'); let stats = yield this.ajax.request(statsUrl); diff --git a/ghost/admin/app/templates/dashboard.hbs b/ghost/admin/app/templates/dashboard.hbs index ceead164cd..5a2906713e 100644 --- a/ghost/admin/app/templates/dashboard.hbs +++ b/ghost/admin/app/templates/dashboard.hbs @@ -17,9 +17,15 @@