Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

As a Planning editor I want to see all items with Coverages assigned to a specific editor [SDESK-6745]. #1781

Merged
merged 11 commits into from
Apr 18, 2023
3 changes: 2 additions & 1 deletion client/api/combined.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ function convertCombinedParams(params: ISearchParams): Partial<ISearchAPIParams>
calendars: cvsToString(params.calendars),
agendas: arrayToString(params.agendas),
include_associated_planning: params.include_associated_planning,
source: cvsToString(params.source, 'id')
source: cvsToString(params.source, 'id'),
coverage_user_id: params.coverage_user_id,
};
}

Expand Down
3 changes: 2 additions & 1 deletion client/api/planning.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@ function convertPlanningParams(params: ISearchParams): Partial<ISearchAPIParams>
include_scheduled_updates: params.include_scheduled_updates,
event_item: arrayToString(params.event_item),
g2_content_type: params.g2_content_type?.qcode,
source: cvsToString(params.source, 'id')
source: cvsToString(params.source, 'id'),
coverage_user_id: params.coverage_user_id,
};
}

Expand Down
36 changes: 34 additions & 2 deletions client/apps/Planning/PlanningListSubNav.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@ import moment from 'moment';
import classNames from 'classnames';

import {planningApi, superdeskApi} from '../../superdeskApi';
import {LIST_VIEW_TYPE, SORT_FIELD, SORT_ORDER} from '../../interfaces';
import {LIST_VIEW_TYPE, SORT_FIELD, SORT_ORDER, PLANNING_VIEW} from '../../interfaces';

import * as selectors from '../../selectors';
import * as actions from '../../actions';

import {Button, ButtonGroup, Dropdown, SubNav, Tooltip, IconButton} from 'superdesk-ui-framework/react';
import {FilterSubnavDropdown} from '../../components/Main';
import {SubNavDatePicker} from './SubNavDatePicker';
import {IUser} from 'superdesk-api';

export type SUBNAV_VIEW_SIZE = 'standard' | 'compact';
const STANDARD_MIN_WIDTH = 500;
Expand All @@ -22,10 +23,12 @@ interface IProps {
currentInterval: 'DAY' | 'WEEK' | 'MONTH';
sortOrder: SORT_ORDER;
sortField: SORT_FIELD;

users: Array<IUser>
setStartFilter(value?: moment.Moment): void;
jumpTo(interval: 'TODAY' | 'BACK' | 'FORWARD'): void;
setJumpInterval(interval: 'DAY' | 'WEEK' | 'MONTH'): void;
activefilter: PLANNING_VIEW;
coverageUser?: IUser['_id'];
}

interface IState {
Expand All @@ -38,6 +41,9 @@ const mapStateToProps = (state) => ({
listViewType: selectors.main.getCurrentListViewType(state),
sortOrder: selectors.main.getCurrentSortOrder(state),
sortField: selectors.main.getCurrentSortField(state),
users: selectors.general.users(state),
activefilter: selectors.main.activeFilter(state),
devketanpro marked this conversation as resolved.
Show resolved Hide resolved
coverageUser: selectors.main.getCoverageUser(state)
});

const mapDispatchToProps = (dispatch) => ({
Expand Down Expand Up @@ -131,7 +137,19 @@ class PlanningListSubNavComponent extends React.Component<IProps, IState> {
planningApi.ui.list.search({sort_field: field});
}

filterCoverageUser(item) {
planningApi.ui.list.search({coverage_user_id: item._id});
}

render() {
let newOption = {_id: null, display_name: 'ALL'};
let list = [newOption, ...this.props.users];
const userList = list.map((user) => ({
label: user.display_name,
onSelect: () => {
this.filterCoverageUser(user);
}
}));
const {gettext} = superdeskApi.localization;
const {currentStartFilter} = this.props;
let intervalText: string;
Expand Down Expand Up @@ -171,6 +189,20 @@ class PlanningListSubNavComponent extends React.Component<IProps, IState> {
<ButtonGroup align="inline">
<FilterSubnavDropdown viewSize={this.state.viewSize} />
</ButtonGroup>
{this.props.activefilter == PLANNING_VIEW.EVENTS ? ' ' : (
<div>
{gettext('Assigned Coverages Items :')}
<Dropdown items={userList}>
<span className="sd-margin-l--1 sd-margin-r--3">
{this.props.users.find(
(user) => user._id == this.props.coverageUser)?.display_name ?? gettext('ALL')}
<span className="dropdown__caret" />
</span>
</Dropdown>

</div>
)}

<ButtonGroup align="end">
{this.props.listViewType === LIST_VIEW_TYPE.LIST ? (
<React.Fragment>
Expand Down
4 changes: 4 additions & 0 deletions client/interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -879,6 +879,7 @@ export interface ICommonSearchParams<T extends IEventOrPlanningItem> {
sortOrder?: SORT_ORDER;
sortField?: SORT_FIELD;
source?:string;
coverage_user_id?:string;
}

export interface IEventSearchParams extends ICommonSearchParams<IEventItem> {
Expand All @@ -890,6 +891,7 @@ export interface IEventSearchParams extends ICommonSearchParams<IEventItem> {
location?: IEventLocation;
reference?: string;
};

}

export interface IPlanningSearchParams extends ICommonSearchParams<IPlanningItem> {
Expand Down Expand Up @@ -1312,6 +1314,7 @@ export interface ISearchParams {
id?: string;
name?: string;
}>;
coverage_user_id?:string;

// Event Params
reference?: string;
Expand Down Expand Up @@ -1363,6 +1366,7 @@ export interface ISearchAPIParams {
recurrence_id?: string;
filter_id?: ISearchFilter['_id'];
source?: string;
coverage_user_id?:string;

// Event Params
reference?: string;
Expand Down
4 changes: 4 additions & 0 deletions client/selectors/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,10 @@ export const getCurrentSortField = createSelector(
(params) => params.sortField ?? SORT_FIELD.SCHEDULE,
);

export const getCoverageUser = createSelector(
[currentSearch],
(params) => params.coverage_user_id
);
export const currentJumpInterval = createSelector(
[activeFilter, searchParams],
(filter, params) => get(params, `${filter}.jumpInterval`) || MAIN.JUMP.WEEK
Expand Down
4 changes: 4 additions & 0 deletions client/utils/search.ts
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ export function planningParamsToSearchParams(params: IPlanningSearchParams): ISe
include_scheduled_updates: params.includeScheduledUpdates,
no_agenda_assigned: params.noAgendaAssigned,
agendas: params.agendas,
coverage_user_id: params.coverage_user_id,
};
}

Expand All @@ -107,6 +108,7 @@ export function searchParamsToPlanningParams(params: ISearchParams): IPlanningSe
excludeRescheduledAndCancelled: params.exclude_rescheduled_and_cancelled,
featured: params.featured,
includeScheduledUpdates: params.include_scheduled_updates,
coverage_user_id: params.coverage_user_id,
advancedSearch: {
...common.advancedSearch,
featured: params.featured,
Expand Down Expand Up @@ -149,6 +151,7 @@ export function combinedParamsToSearchParams(params: ICombinedSearchParams): ISe
return {
...commonParamsToSearchParams(params),
reference: params.advancedSearch?.reference,
coverage_user_id: params.coverage_user_id,
};
}

Expand All @@ -157,6 +160,7 @@ export function searchParamsToCombinedParams(params: ISearchParams): ICombinedSe

return {
...common,
coverage_user_id: params.coverage_user_id,
advancedSearch: {
...common.advancedSearch,
reference: params.reference,
Expand Down
6 changes: 6 additions & 0 deletions server/planning/search/queries/combined.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,11 +88,16 @@ def search_dates(params: Dict[str, Any], query: elastic.ElasticQuery):
query.must.append(elastic.bool_or([event_query.build()["query"], planning_query.build()["query"]]))


def search_coverage_assigned_user(params: Dict[str, Any], query: elastic.ElasticQuery):
planning.search_coverage_assigned_user(params, query)


COMBINED_SEARCH_FILTERS: List[Callable[[Dict[str, Any], elastic.ElasticQuery], None]] = [
search_not_common_fields,
search_sluglines,
search_calendars_and_agendas,
search_dates,
search_coverage_assigned_user,
]

COMBINED_SEARCH_FILTERS.extend(common.COMMON_SEARCH_FILTERS)
Expand All @@ -103,6 +108,7 @@ def search_dates(params: Dict[str, Any], query: elastic.ElasticQuery):
"calendars",
"agendas",
"include_associated_planning",
"coverage_user_id",
]

COMBINED_PARAMS.extend(common.COMMON_PARAMS)
17 changes: 17 additions & 0 deletions server/planning/search/queries/planning.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,21 @@ def search_coverage_sluglines(params: Dict[str, Any], query: elastic.ElasticQuer
)


def search_coverage_assigned_user(params: Dict[str, Any], query: elastic.ElasticQuery):
if params.get("coverage_user_id") and not strtobool(params.get("no_coverage", False)):
query.must.append(
elastic.bool_and(
[
elastic.term(
field="coverages.assigned_to.user",
value=params["coverage_user_id"],
),
],
"coverages",
),
)


def search_urgency(params: Dict[str, Any], query: elastic.ElasticQuery):
urgency = str_to_number(params.get("urgency"))

Expand Down Expand Up @@ -263,6 +278,7 @@ def set_search_sort(params: Dict[str, Any], query: elastic.ElasticQuery):
search_by_events,
search_dates,
set_search_sort,
search_coverage_assigned_user,
]

PLANNING_SEARCH_FILTERS.extend(COMMON_SEARCH_FILTERS)
Expand All @@ -278,6 +294,7 @@ def set_search_sort(params: Dict[str, Any], query: elastic.ElasticQuery):
"featured",
"include_scheduled_updates",
"event_item",
"coverage_user_id",
]

PLANNING_PARAMS.extend(COMMON_PARAMS)