diff --git a/src/actions/speaker-actions.js b/src/actions/speaker-actions.js index 1b25d275c..414216865 100644 --- a/src/actions/speaker-actions.js +++ b/src/actions/speaker-actions.js @@ -90,11 +90,14 @@ export const UNSELECT_ALL_SUMMIT_SPEAKERS = "UNSELECT_ALL_SUMMIT_SPEAKERS"; export const SEND_SPEAKERS_EMAILS = "SEND_SPEAKERS_EMAILS"; export const SET_SPEAKERS_CURRENT_FLOW_EVENT = "SET_SPEAKERS_CURRENT_FLOW_EVENT"; - export const REQUEST_SPEAKERS_ACTIVITIES_COUNT = "REQUEST_SPEAKERS_ACTIVITIES_COUNT"; export const RECEIVE_SPEAKERS_ACTIVITIES_COUNT = "RECEIVE_SPEAKERS_ACTIVITIES_COUNT"; +export const REQUEST_SELECTED_SPEAKERS_ACTIVITY_COUNT = + "REQUEST_SELECTED_SPEAKERS_ACTIVITY_COUNT"; +export const RECEIVE_SELECTED_SPEAKERS_ACTIVITY_COUNT = + "RECEIVE_SELECTED_SPEAKERS_ACTIVITY_COUNT"; const normalizeEntity = (entity) => { const normalizedEntity = { ...entity }; @@ -899,6 +902,73 @@ const getSpeakersActivitiesCount = )(params)(dispatch); }; +export const getSelectedSpeakersActivityCount = + () => async (dispatch, getState) => { + const { currentSummitState, currentSummitSpeakersListState } = getState(); + const accessToken = await getAccessTokenSafely(); + const { currentSummit } = currentSummitState; + const { + totalActivities, + term, + selectedCount, + selectedItems, + excludedItems, + selectedAll, + selectionPlanFilter, + trackFilter, + trackGroupFilter, + activityTypeFilter, + selectionStatusFilter, + mediaUploadTypeFilter + } = currentSummitSpeakersListState; + const filters = { + selectionPlanFilter, + trackFilter, + trackGroupFilter, + activityTypeFilter, + selectionStatusFilter, + mediaUploadTypeFilter + }; + const filter = parseFilters(filters); + const params = { access_token: accessToken }; + + // if no speakers selected we escape setting count to 0 + // if all speakers selected we escape setting count to totalActivities + if (selectedCount === 0 || (selectedAll && excludedItems.length === 0)) { + const activityCount = selectedCount === 0 ? 0 : totalActivities; + dispatch( + createAction(RECEIVE_SELECTED_SPEAKERS_ACTIVITY_COUNT)({ + response: { count: activityCount }, + override: true + }) + ); + return; + } + + if (term) { + const filterTerm = buildTermFilter(term); + filter.push(filterTerm.join(",")); + } + + // build id filter + if (selectedAll) { + if (excludedItems.length > 0) { + filter.push(`not_id==${excludedItems.join("||")}`); + } + } else if (selectedItems.length > 0) { + filter.push(`id==${selectedItems.join("||")}`); + } + + if (filter.length > 0) params["filter[]"] = filter; + + return getRequest( + createAction(REQUEST_SELECTED_SPEAKERS_ACTIVITY_COUNT), + createAction(RECEIVE_SELECTED_SPEAKERS_ACTIVITY_COUNT), + `${window.API_BASE_URL}/api/v1/summits/${currentSummit.id}/speakers/all/events/count`, + authErrorHandler + )(params)(dispatch); + }; + export const getSpeakersBySummit = ( term = null, diff --git a/src/actions/submitter-actions.js b/src/actions/submitter-actions.js index 906be372d..e5209b8cc 100644 --- a/src/actions/submitter-actions.js +++ b/src/actions/submitter-actions.js @@ -46,6 +46,10 @@ export const REQUEST_SUBMITTERS_ACTIVITIES_COUNT = "REQUEST_SUBMITTERS_ACTIVITIES_COUNT"; export const RECEIVE_SUBMITTERS_ACTIVITIES_COUNT = "RECEIVE_SUBMITTERS_ACTIVITIES_COUNT"; +export const REQUEST_SELECTED_SUBMITTERS_ACTIVITY_COUNT = + "REQUEST_SELECTED_SUBMITTERS_ACTIVITY_COUNT"; +export const RECEIVE_SELECTED_SUBMITTERS_ACTIVITY_COUNT = + "RECEIVE_SELECTED_SUBMITTERS_ACTIVITY_COUNT"; export const initSubmittersList = () => async (dispatch) => { dispatch(createAction(INIT_SUBMITTERS_LIST_PARAMS)()); @@ -63,6 +67,72 @@ const getSubmittersActivitiesCount = )(params)(dispatch); }; +export const getSelectedSubmittersActivityCount = + () => async (dispatch, getState) => { + const { currentSummitState, currentSummitSubmittersListState } = getState(); + const accessToken = await getAccessTokenSafely(); + const { currentSummit } = currentSummitState; + const { + totalActivities, + term, + selectedCount, + selectedItems, + excludedItems, + selectedAll, + selectionPlanFilter, + trackFilter, + trackGroupFilter, + activityTypeFilter, + selectionStatusFilter, + mediaUploadTypeFilter + } = currentSummitSubmittersListState; + const filters = { + selectionPlanFilter, + trackFilter, + trackGroupFilter, + activityTypeFilter, + selectionStatusFilter, + mediaUploadTypeFilter + }; + const filter = parseFilters(filters); + const params = { access_token: accessToken }; + + // if no submitters selected we escape setting count to 0 + // if all submitters selected we escape setting count to totalActivities + if (selectedCount === 0 || (selectedAll && excludedItems.length === 0)) { + const activityCount = selectedCount === 0 ? 0 : totalActivities; + dispatch( + createAction(RECEIVE_SELECTED_SUBMITTERS_ACTIVITY_COUNT)({ + response: { count: activityCount } + }) + ); + return; + } + + if (term) { + const filterTerm = buildTermFilter(term); + filter.push(filterTerm.join(",")); + } + + // build id filter + if (selectedAll) { + if (excludedItems.length > 0) { + filter.push(`not_id==${excludedItems.join("||")}`); + } + } else if (selectedItems.length > 0) { + filter.push(`id==${selectedItems.join("||")}`); + } + + if (filter.length > 0) params["filter[]"] = filter; + + return getRequest( + createAction(REQUEST_SELECTED_SUBMITTERS_ACTIVITY_COUNT), + createAction(RECEIVE_SELECTED_SUBMITTERS_ACTIVITY_COUNT), + `${window.API_BASE_URL}/api/v1/summits/${currentSummit.id}/submitters/all/events/count`, + authErrorHandler + )(params)(dispatch); + }; + export const getSubmittersBySummit = ( term = null, diff --git a/src/i18n/en.json b/src/i18n/en.json index eadc2eefd..19471e5ee 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -1114,7 +1114,6 @@ "should_send_copy_2_submitter": "Also send to submitter?", "allows_to_reassign": "Allow to reassign?", "items_qty": "Selected {qty} Speakers | {activitiesQty} Activities", - "items_qty_no_activities": "Selected {qty} Speakers", "placeholders": { "search_speakers": "Search by Full Name, Email, Speaker Id, Member Id, Title Or Abstract", "test_recipient": "Optional Test Recipient" @@ -1129,8 +1128,7 @@ "resend_done": "Emails sent successfully.", "submitters": "Submitters", "submitters_no_speakers": "Submitters (no speakers)", - "items_qty": "Selected {qty} Submitters | {activitiesQty} Activities", - "items_qty_no_activities": "Selected {qty} Submitters" + "items_qty": "Selected {qty} Submitters | {activitiesQty} Activities" }, "speaker_attendance_list": { "speaker_attendance_list": "Speaker Attendance List", diff --git a/src/pages/summit_speakers/summit-speakers-list-page.js b/src/pages/summit_speakers/summit-speakers-list-page.js index c21f1cd52..94c797eb8 100644 --- a/src/pages/summit_speakers/summit-speakers-list-page.js +++ b/src/pages/summit_speakers/summit-speakers-list-page.js @@ -30,7 +30,8 @@ import { selectAllSummitSpeakers, unselectAllSummitSpeakers, setCurrentFlowEvent, - sendSpeakerEmails + sendSpeakerEmails, + getSelectedSpeakersActivityCount } from "../../actions/speaker-actions"; import { initSubmittersList, @@ -41,7 +42,8 @@ import { selectAllSummitSubmitters, unselectAllSummitSubmitters, setCurrentSubmitterFlowEvent, - sendSubmitterEmails + sendSubmitterEmails, + getSelectedSubmittersActivityCount } from "../../actions/submitter-actions"; import { validateSpecs, @@ -65,6 +67,7 @@ class SummitSpeakersListPage extends React.Component { super(props); this.getSubjectProps = this.getSubjectProps.bind(this); + this.getSelectedActivityCount = this.getSelectedActivityCount.bind(this); this.export = this.export.bind(this); this.getBySummit = this.getBySummit.bind(this); this.handleSpeakerSubmitterSourceChange = @@ -139,6 +142,18 @@ class SummitSpeakersListPage extends React.Component { } } + componentDidUpdate(prevProps) { + const { source } = this.state; + const subjectPropKey = + source === sources.speakers ? "speakersProps" : "submittersProps"; + const { selectedCount: currentCount } = this.props[subjectPropKey]; + const { selectedCount: prevCount } = prevProps[subjectPropKey]; + + if (currentCount !== prevCount) { + this.getSelectedActivityCount(); + } + } + getSubjectProps() { const { source } = this.state; return source === sources.speakers @@ -146,6 +161,15 @@ class SummitSpeakersListPage extends React.Component { : this.props.submittersProps; } + getSelectedActivityCount() { + const { source } = this.state; + if (source === sources.speakers) { + this.props.getSelectedSpeakersActivityCount(); + } else { + this.props.getSelectedSubmittersActivityCount(); + } + } + getBySummit(term, page, perPage, order, orderDir, filters) { const { source } = this.state; const callable = @@ -703,6 +727,8 @@ class SummitSpeakersListPage extends React.Component { orderDir, totalItems, selectedCount, + selectedActivityCount, + gettingSelectedActivityCount, selectedAll, selectionPlanFilter, trackFilter, @@ -711,12 +737,9 @@ class SummitSpeakersListPage extends React.Component { selectionStatusFilter, mediaUploadTypeFilter, currentFlowEvent, - totalActivities, - excludedItems + totalActivities } = this.getSubjectProps(); - const activitiesCountAccurate = selectedAll && excludedItems.length === 0; - const columns = [ { columnKey: "full_name", @@ -1052,19 +1075,17 @@ class SummitSpeakersListPage extends React.Component {