mirror of
https://github.com/plausible/analytics.git
synced 2024-11-26 23:27:54 +03:00
Add All Time option to datepicker
This commit is contained in:
parent
0e908c84f6
commit
8467979051
@ -253,6 +253,8 @@ class DatePicker extends React.Component {
|
|||||||
return 'Last 6 months'
|
return 'Last 6 months'
|
||||||
} if (query.period === '12mo') {
|
} if (query.period === '12mo') {
|
||||||
return 'Last 12 months'
|
return 'Last 12 months'
|
||||||
|
} if (query.period === 'all') {
|
||||||
|
return 'All time'
|
||||||
} if (query.period === 'custom') {
|
} if (query.period === 'custom') {
|
||||||
return `${formatDayShort(query.from)} - ${formatDayShort(query.to)}`
|
return `${formatDayShort(query.from)} - ${formatDayShort(query.to)}`
|
||||||
}
|
}
|
||||||
@ -338,6 +340,7 @@ class DatePicker extends React.Component {
|
|||||||
{this.renderLink("12mo", "Last 12 months")}
|
{this.renderLink("12mo", "Last 12 months")}
|
||||||
</div>
|
</div>
|
||||||
<div className="py-1 date-option-group">
|
<div className="py-1 date-option-group">
|
||||||
|
{this.renderLink("all", "All time")}
|
||||||
<span
|
<span
|
||||||
onClick={() => this.setState({mode: 'calendar'}, this.openCalendar)}
|
onClick={() => this.setState({mode: 'calendar'}, this.openCalendar)}
|
||||||
onKeyPress={() => this.setState({mode: 'calendar'}, this.openCalendar)}
|
onKeyPress={() => this.setState({mode: 'calendar'}, this.openCalendar)}
|
||||||
|
@ -3,7 +3,7 @@ import { Link, withRouter } from 'react-router-dom'
|
|||||||
import {formatDay, formatMonthYYYY, nowForSite, parseUTCDate} from './util/date'
|
import {formatDay, formatMonthYYYY, nowForSite, parseUTCDate} from './util/date'
|
||||||
import * as storage from './util/storage'
|
import * as storage from './util/storage'
|
||||||
|
|
||||||
const PERIODS = ['realtime', 'day', 'month', '7d', '30d', '6mo', '12mo', 'custom']
|
const PERIODS = ['realtime', 'day', 'month', '7d', '30d', '6mo', '12mo', 'all', 'custom']
|
||||||
|
|
||||||
export function parseQuery(querystring, site) {
|
export function parseQuery(querystring, site) {
|
||||||
const q = new URLSearchParams(querystring)
|
const q = new URLSearchParams(querystring)
|
||||||
|
@ -146,6 +146,27 @@ defmodule Plausible.Stats.Query do
|
|||||||
|> maybe_include_imported(site, params)
|
|> maybe_include_imported(site, params)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def from(site, %{"period" => "all"} = params) do
|
||||||
|
end_date =
|
||||||
|
today(site.timezone)
|
||||||
|
|> Timex.end_of_month()
|
||||||
|
|
||||||
|
start_date =
|
||||||
|
site.inserted_at
|
||||||
|
|> Timex.Timezone.convert("UTC")
|
||||||
|
|> Timex.Timezone.convert(site.timezone)
|
||||||
|
|> Timex.beginning_of_month()
|
||||||
|
|
||||||
|
%__MODULE__{
|
||||||
|
period: "all",
|
||||||
|
date_range: Date.range(start_date, end_date),
|
||||||
|
interval: Map.get(params, "interval", "month"),
|
||||||
|
filters: parse_filters(params),
|
||||||
|
sample_threshold: Map.get(params, "sample_threshold", @default_sample_threshold)
|
||||||
|
}
|
||||||
|
|> maybe_include_imported(site, params)
|
||||||
|
end
|
||||||
|
|
||||||
def from(site, %{"period" => "custom", "from" => from, "to" => to} = params) do
|
def from(site, %{"period" => "custom", "from" => from, "to" => to} = params) do
|
||||||
new_params =
|
new_params =
|
||||||
params
|
params
|
||||||
|
@ -2,7 +2,11 @@ defmodule Plausible.Stats.QueryTest do
|
|||||||
use ExUnit.Case, async: true
|
use ExUnit.Case, async: true
|
||||||
alias Plausible.Stats.Query
|
alias Plausible.Stats.Query
|
||||||
|
|
||||||
@site %Plausible.Site{timezone: "UTC"}
|
@site_inserted_at ~D[2020-01-01]
|
||||||
|
@site %Plausible.Site{
|
||||||
|
timezone: "UTC",
|
||||||
|
inserted_at: @site_inserted_at
|
||||||
|
}
|
||||||
|
|
||||||
test "parses day format" do
|
test "parses day format" do
|
||||||
q = Query.from(@site, %{"period" => "day", "date" => "2019-01-01"})
|
q = Query.from(@site, %{"period" => "day", "date" => "2019-01-01"})
|
||||||
@ -56,6 +60,23 @@ defmodule Plausible.Stats.QueryTest do
|
|||||||
assert q.interval == "month"
|
assert q.interval == "month"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "parses all time" do
|
||||||
|
q = Query.from(@site, %{"period" => "all"})
|
||||||
|
|
||||||
|
assert q.date_range.first == @site_inserted_at
|
||||||
|
assert q.date_range.last == Timex.today() |> Timex.end_of_month()
|
||||||
|
assert q.period == "all"
|
||||||
|
assert q.interval == "month"
|
||||||
|
end
|
||||||
|
|
||||||
|
test "parses all time in correct timezone" do
|
||||||
|
site = Map.put(@site, :timezone, "America/Cancun")
|
||||||
|
q = Query.from(site, %{"period" => "all"})
|
||||||
|
|
||||||
|
assert q.date_range.first == ~D[2019-12-01]
|
||||||
|
assert q.date_range.last == Timex.today("America/Cancun") |> Timex.end_of_month()
|
||||||
|
end
|
||||||
|
|
||||||
test "defaults to 30 days format" do
|
test "defaults to 30 days format" do
|
||||||
assert Query.from(@site, %{}) == Query.from(@site, %{"period" => "30d"})
|
assert Query.from(@site, %{}) == Query.from(@site, %{"period" => "30d"})
|
||||||
end
|
end
|
||||||
|
@ -137,7 +137,52 @@ defmodule PlausibleWeb.Api.StatsController.MainGraphTest do
|
|||||||
assert Enum.sum(plot) == 4
|
assert Enum.sum(plot) == 4
|
||||||
end
|
end
|
||||||
|
|
||||||
# TODO: missing 6, 12 months, 30 days
|
test "displays visitors for 12 months with imported data", %{conn: conn, site: site} do
|
||||||
|
populate_stats(site, [
|
||||||
|
build(:pageview, timestamp: ~N[2021-01-01 00:00:00]),
|
||||||
|
build(:pageview, timestamp: ~N[2021-12-31 00:00:00]),
|
||||||
|
build(:imported_visitors, date: ~D[2021-01-01]),
|
||||||
|
build(:imported_visitors, date: ~D[2021-12-31])
|
||||||
|
])
|
||||||
|
|
||||||
|
conn =
|
||||||
|
get(
|
||||||
|
conn,
|
||||||
|
"/api/stats/#{site.domain}/main-graph?period=12mo&date=2021-12-31&with_imported=true"
|
||||||
|
)
|
||||||
|
|
||||||
|
assert %{"plot" => plot} = json_response(conn, 200)
|
||||||
|
|
||||||
|
assert Enum.count(plot) == 12
|
||||||
|
assert List.first(plot) == 2
|
||||||
|
assert List.last(plot) == 2
|
||||||
|
assert Enum.sum(plot) == 4
|
||||||
|
end
|
||||||
|
|
||||||
|
test "displays visitors for all time with just native data", %{conn: conn, site: site} do
|
||||||
|
use Plausible.Repo
|
||||||
|
|
||||||
|
Repo.update_all(from(s in "sites", where: s.id == ^site.id),
|
||||||
|
set: [inserted_at: ~N[2020-01-01 00:00:00]]
|
||||||
|
)
|
||||||
|
|
||||||
|
populate_stats(site, [
|
||||||
|
build(:pageview, timestamp: ~N[2020-01-01 00:00:00]),
|
||||||
|
build(:pageview, timestamp: ~N[2021-01-01 00:00:00]),
|
||||||
|
build(:pageview, timestamp: ~N[2021-12-31 00:00:00])
|
||||||
|
])
|
||||||
|
|
||||||
|
conn =
|
||||||
|
get(
|
||||||
|
conn,
|
||||||
|
"/api/stats/#{site.domain}/main-graph?period=all&with_imported=true"
|
||||||
|
)
|
||||||
|
|
||||||
|
assert %{"plot" => plot} = json_response(conn, 200)
|
||||||
|
|
||||||
|
assert List.first(plot) == 1
|
||||||
|
assert Enum.sum(plot) == 3
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "GET /api/stats/main-graph - labels" do
|
describe "GET /api/stats/main-graph - labels" do
|
||||||
|
Loading…
Reference in New Issue
Block a user