mirror of
https://github.com/discourse/discourse.git
synced 2025-03-23 10:25:41 +08:00
FIX: graphs should go to zero for missing dates
This commit is contained in:
parent
215c0d5569
commit
b7ba490df7
@ -1,6 +1,7 @@
|
|||||||
import { ajax } from 'discourse/lib/ajax';
|
import { ajax } from 'discourse/lib/ajax';
|
||||||
import round from "discourse/lib/round";
|
import round from "discourse/lib/round";
|
||||||
import { fmt } from 'discourse/lib/computed';
|
import { fmt } from 'discourse/lib/computed';
|
||||||
|
import { fillMissingDates } from 'discourse/lib/utilities';
|
||||||
|
|
||||||
const Report = Discourse.Model.extend({
|
const Report = Discourse.Model.extend({
|
||||||
reportUrl: fmt("type", "/admin/reports/%@"),
|
reportUrl: fmt("type", "/admin/reports/%@"),
|
||||||
@ -142,14 +143,13 @@ Report.reopenClass({
|
|||||||
group_id: groupId
|
group_id: groupId
|
||||||
}
|
}
|
||||||
}).then(json => {
|
}).then(json => {
|
||||||
// Add a percent field to each tuple
|
// Add zero values for missing dates
|
||||||
let maxY = 0;
|
if (json.report.data.length > 0) {
|
||||||
json.report.data.forEach(row => {
|
const startDateFormatted = moment(json.report.start_date).format('YYYY-MM-DD');
|
||||||
if (row.y > maxY) maxY = row.y;
|
const endDateFormatted = moment(json.report.end_date).format('YYYY-MM-DD');
|
||||||
});
|
json.report.data = fillMissingDates(json.report.data, startDateFormatted, endDateFormatted);
|
||||||
if (maxY > 0) {
|
|
||||||
json.report.data.forEach(row => row.percentage = Math.round((row.y / maxY) * 100));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const model = Report.create({ type: type });
|
const model = Report.create({ type: type });
|
||||||
model.setProperties(json.report);
|
model.setProperties(json.report);
|
||||||
return model;
|
return model;
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import { ajax } from 'discourse/lib/ajax';
|
import { ajax } from 'discourse/lib/ajax';
|
||||||
|
import { fillMissingDates } from 'discourse/lib/utilities';
|
||||||
|
|
||||||
export default Discourse.Route.extend({
|
export default Discourse.Route.extend({
|
||||||
queryParams: {
|
queryParams: {
|
||||||
@ -15,6 +16,13 @@ export default Discourse.Route.extend({
|
|||||||
search_type: params.searchType
|
search_type: params.searchType
|
||||||
}
|
}
|
||||||
}).then(json => {
|
}).then(json => {
|
||||||
|
// Add zero values for missing dates
|
||||||
|
if (json.term.data.length > 0) {
|
||||||
|
const startDate = (json.term.period === "all") ? moment(json.term.data[0].x).format('YYYY-MM-DD') : moment(json.term.start_date).format('YYYY-MM-DD');
|
||||||
|
const endDate = moment(json.term.end_date).format('YYYY-MM-DD');
|
||||||
|
json.term.data = fillMissingDates(json.term.data, startDate, endDate);
|
||||||
|
}
|
||||||
|
|
||||||
const model = Ember.Object.create({ type: "search_log_term" });
|
const model = Ember.Object.create({ type: "search_log_term" });
|
||||||
model.setProperties(json.term);
|
model.setProperties(json.term);
|
||||||
return model;
|
return model;
|
||||||
|
@ -450,5 +450,25 @@ export function clipboardData(e, canUpload) {
|
|||||||
return { clipboard, types, canUpload, canPasteHtml };
|
return { clipboard, types, canUpload, canPasteHtml };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function fillMissingDates(data, startDate, endDate) {
|
||||||
|
const startMoment = moment(startDate, "YYYY-MM-DD");
|
||||||
|
const endMoment = moment(endDate, "YYYY-MM-DD");
|
||||||
|
const countDays = endMoment.diff(startMoment, 'days');
|
||||||
|
let currentMoment = startMoment;
|
||||||
|
|
||||||
|
for (let i = 0; i <= countDays; i++) {
|
||||||
|
let date = (data[i]) ? moment(data[i].x, "YYYY-MM-DD") : null;
|
||||||
|
if (i === 0 && date.isAfter(startMoment)) {
|
||||||
|
data.splice(i, 0, { "x" : startMoment.format("YYYY-MM-DD"), 'y': 0 });
|
||||||
|
} else {
|
||||||
|
if (!date || date.isAfter(moment(currentMoment))) {
|
||||||
|
data.splice(i, 0, { "x" : currentMoment, 'y': 0 });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
currentMoment = moment(currentMoment).add(1, "day").format("YYYY-MM-DD");
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
// This prevents a mini racer crash
|
// This prevents a mini racer crash
|
||||||
export default {};
|
export default {};
|
||||||
|
@ -77,7 +77,10 @@ class SearchLog < ActiveRecord::Base
|
|||||||
return {
|
return {
|
||||||
type: "search_log_term",
|
type: "search_log_term",
|
||||||
title: I18n.t("search_logs.graph_title"),
|
title: I18n.t("search_logs.graph_title"),
|
||||||
data: details
|
start_date: start_of(period),
|
||||||
|
end_date: Time.zone.now,
|
||||||
|
data: details,
|
||||||
|
period: period.to_s
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -172,6 +172,7 @@ RSpec.describe SearchLog, type: :model do
|
|||||||
|
|
||||||
SearchLog.where(term: 'ruby', ip_address: '127.0.0.2').update_all(search_result_id: 24)
|
SearchLog.where(term: 'ruby', ip_address: '127.0.0.2').update_all(search_result_id: 24)
|
||||||
term_click_through_details = SearchLog.term_details("ruby", :all, :click_through_only)
|
term_click_through_details = SearchLog.term_details("ruby", :all, :click_through_only)
|
||||||
|
expect(term_click_through_details[:period]).to eq("all")
|
||||||
expect(term_click_through_details[:data][0][:y]).to eq(1)
|
expect(term_click_through_details[:data][0][:y]).to eq(1)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -14,7 +14,8 @@ import {
|
|||||||
validateUploadedFiles,
|
validateUploadedFiles,
|
||||||
getUploadMarkdown,
|
getUploadMarkdown,
|
||||||
caretRowCol,
|
caretRowCol,
|
||||||
setCaretPosition
|
setCaretPosition,
|
||||||
|
fillMissingDates
|
||||||
} from 'discourse/lib/utilities';
|
} from 'discourse/lib/utilities';
|
||||||
import * as Utilities from 'discourse/lib/utilities';
|
import * as Utilities from 'discourse/lib/utilities';
|
||||||
|
|
||||||
@ -253,3 +254,12 @@ QUnit.test("caretRowCol", assert => {
|
|||||||
|
|
||||||
document.body.removeChild(textarea);
|
document.body.removeChild(textarea);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
QUnit.test("fillMissingDates", assert => {
|
||||||
|
const startDate = "2017-11-12"; // YYYY-MM-DD
|
||||||
|
const endDate = "2017-12-12"; // YYYY-MM-DD
|
||||||
|
const data = '[{"x":"2017-11-12","y":3},{"x":"2017-11-27","y":2},{"x":"2017-12-06","y":9},{"x":"2017-12-11","y":2}]';
|
||||||
|
|
||||||
|
assert.equal(fillMissingDates(JSON.parse(data), startDate, endDate).length, 31,
|
||||||
|
"it returns a JSON array with 31 dates");
|
||||||
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user