Skip to content

Commit

Permalink
Merge pull request #6685 from CitizenLabDotCo/TAN-536-comments-by-time
Browse files Browse the repository at this point in the history
[TAN-536] Publish data for more graphs
  • Loading branch information
alexander-cit authored Jan 9, 2024
2 parents 1f7ae96 + 7871c37 commit f565d5d
Show file tree
Hide file tree
Showing 28 changed files with 464 additions and 426 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
module ReportBuilder
class Queries::Analytics::ActiveUsers < Queries::Analytics::Base
protected

def query(start_at: nil, end_at: nil, project_id: nil, resolution: nil, **_other_props)
time_series_query = {
fact: 'participation',
filters: {
'dimension_user.role': ['citizen', nil],
**project_filter('dimension_project_id', project_id),
**date_filter('dimension_date_created', start_at, end_at)
},
groups: "dimension_date_created.#{interval(resolution)}",
aggregations: {
dimension_user_id: 'count',
'dimension_date_created.date': 'first'
}
}

active_users_whole_period_query = {
fact: 'participation',
filters: {
'dimension_user.role': ['citizen', nil],
**project_filter('dimension_project_id', project_id),
**date_filter('dimension_date_created', start_at, end_at)
},
aggregations: {
dimension_user_id: 'count'
}
}

[time_series_query, active_users_whole_period_query]
end
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
module ReportBuilder
class Queries::Analytics::CommentsByTime < Queries::Analytics::Base
protected

def query(start_at: nil, end_at: nil, project_id: nil, resolution: nil, **_other_props)
time_series_query = {
fact: 'participation',
filters: {
**date_filter('dimension_date_created', start_at, end_at),
**project_filter('dimension_project_id', project_id),
'dimension_type.name': 'comment',
'dimension_type.parent': %w[idea initiative]
},
groups: "dimension_date_created.#{interval(resolution)}",
aggregations: {
all: 'count',
'dimension_date_created.date': 'first'
}
}

comments_by_time_total = {
fact: 'participation',
filters: {
**date_filter('dimension_date_created', nil, end_at),
**project_filter('dimension_project_id', project_id),
'dimension_type.name': 'comment',
'dimension_type.parent': %w[idea initiative]
},
aggregations: {
all: 'count'
}
}

[time_series_query, comments_by_time_total]
end
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
module ReportBuilder
class Queries::Analytics::PostsByTime < Queries::Analytics::Base
protected

def query(start_at: nil, end_at: nil, project_id: nil, resolution: nil, **_other_props)
time_series_query = {
fact: 'post',
filters: {
**date_filter('dimension_date_created', start_at, end_at),
**project_filter('dimension_project_id', project_id),
'dimension_type.name': 'idea',
publication_status: 'published'
},
groups: "dimension_date_created.#{interval(resolution)}",
aggregations: {
all: 'count',
'dimension_date_created.date': 'first'
}
}

posts_by_time_total = {
fact: 'post',
filters: {
**date_filter('dimension_date_created', nil, end_at),
**project_filter('dimension_project_id', project_id),
'dimension_type.name': 'idea',
publication_status: 'published'
},
aggregations: {
all: 'count'
}
}

[time_series_query, posts_by_time_total]
end
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
module ReportBuilder
class Queries::Analytics::TrafficSources < Queries::Analytics::Base
protected

def query(start_at: nil, end_at: nil, project_id: nil, resolution: nil, **_other_props)
{
fact: 'visit',
filters: {
'dimension_user.role': ['citizen', nil],
**project_filter('dimension_projects.id', project_id),
**date_filter(
'dimension_date_first_action',
start_at,
end_at
)
},
groups: 'dimension_referrer_type.id',
aggregations: {
all: 'count',
'dimension_referrer_type.name': 'first'
}
}
end
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
module ReportBuilder
class Queries::Analytics::Visitors < Queries::Analytics::Base
protected

def query(start_at: nil, end_at: nil, project_id: nil, resolution: nil, **_other_props)
totals_whole_period_query = {
fact: 'visit',
filters: {
'dimension_user.role': ['citizen', nil],
**project_filter('dimension_projects.id', project_id),
**date_filter(
'dimension_date_first_action',
start_at,
end_at
)
},
aggregations: {
all: 'count',
visitor_id: 'count',
duration: 'avg',
pages_visited: 'avg'
}
}

time_series_query = {
fact: 'visit',
filters: {
'dimension_user.role': ['citizen', nil],
**project_filter('dimension_projects.id', project_id),
**date_filter(
'dimension_date_first_action',
start_at,
end_at
)
},
groups: "dimension_date_first_action.#{interval(resolution)}",
aggregations: {
all: 'count',
visitor_id: 'count',
'dimension_date_first_action.date': 'first'
}
}

[totals_whole_period_query, time_series_query]
end
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@ class QueryRepository
GRAPH_RESOLVED_NAMES_CLASSES = {
'GenderWidget' => Queries::Analytics::UsersByGender,
'ReactionsByTimeWidget' => Queries::Analytics::ReactionsByTime,
'CommentsByTimeWidget' => Queries::Analytics::CommentsByTime,
'PostsByTimeWidget' => Queries::Analytics::PostsByTime,
'ActiveUsersWidget' => Queries::Analytics::ActiveUsers,
'VisitorsWidget' => Queries::Analytics::Visitors,
'VisitorsTrafficSourcesWidget' => Queries::Analytics::TrafficSources,
'SurveyResultsWidget' => Queries::SurveyResults
}.freeze

Expand Down
9 changes: 8 additions & 1 deletion front/app/api/graph_data_units/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,14 @@ import { IResolution } from 'components/admin/ResolutionControl';
import { Moment } from 'moment';

// live
export type ResolvedName = 'ReactionsByTimeWidget' | 'SurveyResultsWidget';
export type ResolvedName =
| 'ReactionsByTimeWidget'
| 'SurveyResultsWidget'
| 'CommentsByTimeWidget'
| 'PostsByTimeWidget'
| 'ActiveUsersWidget'
| 'VisitorsWidget'
| 'VisitorsTrafficSourcesWidget';

export interface ParametersLive {
resolvedName: ResolvedName;
Expand Down
49 changes: 49 additions & 0 deletions front/app/api/graph_data_units/useGraphDataUnits.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import { useNode } from '@craftjs/core';
import useGraphDataUnitsPublished from 'api/graph_data_units/useGraphDataUnitsPublished';
import { useReportContext } from 'containers/Admin/reporting/context/ReportContext';

import { useLocation } from 'react-router-dom';
import { isPage } from 'utils/helperUtils';

import { BaseResponseData } from 'utils/cl-react-query/fetcher';
import useGraphDataUnitsLive from './useGraphDataUnitsLive';
import { PropsLive, ResolvedName } from './types';

interface Props {
resolvedName: ResolvedName;
queryParameters: PropsLive;
onSuccess?: () => void;
}

const useGraphDataUnits = <Response extends BaseResponseData>({
resolvedName,
queryParameters,
onSuccess,
}: Props) => {
const { pathname } = useLocation();
const { id: graphId } = useNode();
const isAdminPage = isPage('admin', pathname);
const { reportId } = useReportContext();

const { data: analyticsLive } = useGraphDataUnitsLive<Response>(
{
resolvedName,
props: queryParameters,
},
{ enabled: isAdminPage, onSuccess }
);

const { data: analyticsPublished } = useGraphDataUnitsPublished<Response>(
{
reportId,
graphId,
},
{ enabled: !isAdminPage }
);

const analytics = analyticsLive ?? analyticsPublished;

return analytics;
};

export default useGraphDataUnits;
Original file line number Diff line number Diff line change
Expand Up @@ -2,35 +2,41 @@
import { useIntl } from 'utils/cl-intl';
import { getTranslations } from './translations';

// query
import { query } from './query';

// parse
import { parseTimeSeries, parseExcelData } from './parse';

// utils
import { getFormattedNumbers } from 'components/admin/GraphCards/_utils/parse';

// typings
import { QueryParameters, Response } from './typings';
import useAnalytics from 'api/analytics/useAnalytics';
import { Response, QueryParameters } from './typings';
import { useMemo, useState } from 'react';

// hooks
import useGraphDataUnitsLive from 'api/graph_data_units/useGraphDataUnitsLive';

export default function useCommentsByTime({
projectId,
startAtMoment,
endAtMoment,
resolution,
}: QueryParameters) {
const [currentResolution, setCurrentResolution] = useState(resolution);
const { data: analytics } = useAnalytics<Response>(
query({
projectId,
startAtMoment,
endAtMoment,
resolution,
}),
() => setCurrentResolution(resolution)
const { data: analytics } = useGraphDataUnitsLive<Response>(
{
resolvedName: 'CommentsByTimeWidget',
props: {
projectId,
startAtMoment,
endAtMoment,
resolution,
},
},
{
onSuccess: () => {
setCurrentResolution(resolution);
},
}
);

const { formatMessage } = useIntl();
Expand Down

This file was deleted.

Loading

0 comments on commit f565d5d

Please sign in to comment.