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
1 change: 1 addition & 0 deletions client/api/events.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ function convertEventParams(params: ISearchParams): Partial<ISearchAPIParams> {
location: params.location?.qcode,
calendars: cvsToString(params.calendars),
no_calendar_assigned: params.no_calendar_assigned,
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
43 changes: 41 additions & 2 deletions client/apps/Planning/PlanningListSubNav.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,17 @@ interface IProps {
currentInterval: 'DAY' | 'WEEK' | 'MONTH';
sortOrder: SORT_ORDER;
sortField: SORT_FIELD;

userList:Array<{label: string, onSelect(): void}>;
devketanpro marked this conversation as resolved.
Show resolved Hide resolved
users: any;
devketanpro marked this conversation as resolved.
Show resolved Hide resolved
setStartFilter(value?: moment.Moment): void;
jumpTo(interval: 'TODAY' | 'BACK' | 'FORWARD'): void;
setJumpInterval(interval: 'DAY' | 'WEEK' | 'MONTH'): void;
activefilter?:string;
devketanpro marked this conversation as resolved.
Show resolved Hide resolved
}

interface IState {
viewSize: SUBNAV_VIEW_SIZE;
viewSize?: SUBNAV_VIEW_SIZE;
devketanpro marked this conversation as resolved.
Show resolved Hide resolved
name?: string,
}

const mapStateToProps = (state) => ({
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),
groups: selectors.main.itemGroups(state),
devketanpro marked this conversation as resolved.
Show resolved Hide resolved
activefilter: selectors.main.activeFilter(state)
});

const mapDispatchToProps = (dispatch) => ({
Expand All @@ -51,11 +57,16 @@ class PlanningListSubNavComponent extends React.Component<IProps, IState> {
sortFieldOptions: Array<{label: string, onSelect(): void}>
container?: HTMLDivElement;
resizeObserver: ResizeObserver;
userList: Array<{label: string, onSelect(): void}>
devketanpro marked this conversation as resolved.
Show resolved Hide resolved

constructor(props) {
super(props);
this.state = {
MarkLark86 marked this conversation as resolved.
Show resolved Hide resolved
name: ''
};
const {gettext} = superdeskApi.localization;

this.props.users.unshift({_id: null, display_name: 'All'});
MarkLark86 marked this conversation as resolved.
Show resolved Hide resolved
this.toggleSortOrder = this.toggleSortOrder.bind(this);
this.onResized = this.onResized.bind(this);
this.onContainerMounted = this.onContainerMounted.bind(this);
Expand Down Expand Up @@ -87,6 +98,10 @@ class PlanningListSubNavComponent extends React.Component<IProps, IState> {
}];
}

componentDidMount() {
this.setState({name: 'All'});
}

onContainerMounted(node: HTMLDivElement) {
this.container = node;

Expand Down Expand Up @@ -131,7 +146,18 @@ 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});
this.setState({name: item.display_name});
}

render() {
const userList = this.props.users.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 +197,19 @@ class PlanningListSubNavComponent extends React.Component<IProps, IState> {
<ButtonGroup align="inline">
<FilterSubnavDropdown viewSize={this.state.viewSize} />
</ButtonGroup>
{this.props.activefilter === 'EVENTS' ? ' ' : (
<div>
All items and Coverages assigned to :
MarkLark86 marked this conversation as resolved.
Show resolved Hide resolved
<Dropdown items={userList}>
<span className="sd-margin-l--1 sd-margin-r--3">
{this.state.name}
<span className="dropdown__caret" />
</span>
</Dropdown>

</div>
)}

<ButtonGroup align="end">
{this.props.listViewType === LIST_VIEW_TYPE.LIST ? (
<React.Fragment>
Expand Down
3 changes: 2 additions & 1 deletion client/components/Coverages/CoverageIcon.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,8 @@ export class CoverageIcon extends React.PureComponent<IProps> {
planningUtils.getCoverageIcon(
planningUtils.getCoverageContentType(this.props.coverage, this.props.contentTypes) ||
this.props.coverage.planning?.g2_content_type,
this.props.coverage
this.props.coverage,
devketanpro marked this conversation as resolved.
Show resolved Hide resolved
this.props.users
),
planningUtils.getCoverageIconColor(this.props.coverage),
)}
Expand Down
3 changes: 3 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 Down Expand Up @@ -1312,6 +1313,7 @@ export interface ISearchParams {
id?: string;
name?: string;
}>;
coverage_user_id?:string;

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

// Event Params
reference?: string;
Expand Down
3 changes: 2 additions & 1 deletion client/utils/planning.ts
Original file line number Diff line number Diff line change
Expand Up @@ -974,7 +974,8 @@ function getCoverageDateTimeText(coverage: IPlanningCoverageItem) {
*/
function getCoverageIcon(
type: IG2ContentType['qcode'] | IG2ContentType['content item type'],
coverage?: DeepPartial<IPlanningCoverageItem>
coverage?: DeepPartial<IPlanningCoverageItem>,
users?: Array<IUser>
MarkLark86 marked this conversation as resolved.
Show resolved Hide resolved
): string {
if (get(coverage, 'scheduled_updates.length', 0) > 0 ||
(get(coverage, 'scheduled_update_id') && get(coverage, 'assignment_id'))) {
Expand Down
6 changes: 6 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 All @@ -125,6 +127,7 @@ export function eventParamsToSearchParams(params: IEventSearchParams): ISearchPa
location: params.advancedSearch?.location,
no_calendar_assigned: params.noCalendarAssigned,
calendars: params.calendars,
coverage_user_id: params.coverage_user_id
};
}

Expand All @@ -137,6 +140,7 @@ export function searchParamsToEventParams(params: ISearchParams): IEventSearchPa
calendars: params.calendars,
noCalendarAssigned: params.no_calendar_assigned,
recurrenceId: params.recurrence_id,
coverage_user_id: params.coverage_user_id,
advancedSearch: {
...common.advancedSearch,
location: params.location,
Expand All @@ -149,6 +153,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 +162,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)