From 8db8fd06afcb59e43c1fe02566b685b5a10faf9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Castillo?= Date: Wed, 17 Jun 2026 18:04:19 -0300 Subject: [PATCH] fix: add new filter for pending submissions, functions to simplify template MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Castillo --- src/actions/speaker-actions.js | 9 + src/actions/submitter-actions.js | 9 + .../summit-speakers-list-page.js | 410 ++++-------------- .../summit-speakers-list-reducer.js | 1 + .../summit-submitters-list-reducer.js | 1 + 5 files changed, 108 insertions(+), 322 deletions(-) diff --git a/src/actions/speaker-actions.js b/src/actions/speaker-actions.js index 414216865..1e02da75a 100644 --- a/src/actions/speaker-actions.js +++ b/src/actions/speaker-actions.js @@ -886,6 +886,15 @@ const parseFilters = (filters) => { ); } + if ( + filters.hasOwnProperty("pendingSubmissionsFilter") && + filters.pendingSubmissionsFilter !== null + ) { + filter.push( + `has_pending_presentations==${filters.pendingSubmissionsFilter}` + ); + } + // return checkOrFilter(filters, filter); return filter; }; diff --git a/src/actions/submitter-actions.js b/src/actions/submitter-actions.js index e5209b8cc..744fb71d4 100644 --- a/src/actions/submitter-actions.js +++ b/src/actions/submitter-actions.js @@ -504,6 +504,15 @@ const parseFilters = (filters) => { ); } + if ( + filters.hasOwnProperty("pendingSubmissionsFilter") && + filters.pendingSubmissionsFilter !== null + ) { + filter.push( + `has_pending_presentations==${filters.pendingSubmissionsFilter}` + ); + } + // return checkOrFilter(filters, filter); return filter; }; diff --git a/src/pages/summit_speakers/summit-speakers-list-page.js b/src/pages/summit_speakers/summit-speakers-list-page.js index 94c797eb8..2028aa35e 100644 --- a/src/pages/summit_speakers/summit-speakers-list-page.js +++ b/src/pages/summit_speakers/summit-speakers-list-page.js @@ -68,6 +68,8 @@ class SummitSpeakersListPage extends React.Component { this.getSubjectProps = this.getSubjectProps.bind(this); this.getSelectedActivityCount = this.getSelectedActivityCount.bind(this); + this.getFilters = this.getFilters.bind(this); + this.callBySummit = this.callBySummit.bind(this); this.export = this.export.bind(this); this.getBySummit = this.getBySummit.bind(this); this.handleSpeakerSubmitterSourceChange = @@ -96,6 +98,8 @@ class SummitSpeakersListPage extends React.Component { this.handleOrAndFilter = this.handleOrAndFilter.bind(this); this.handleChangeMediaUploadTypeFilter = this.handleChangeMediaUploadTypeFilter.bind(this); + this.handleChangePendingSubmissionsFilter = + this.handleChangePendingSubmissionsFilter.bind(this); this.state = { testRecipient: "", @@ -114,31 +118,7 @@ class SummitSpeakersListPage extends React.Component { initSubmittersList(); initSpeakersList(); if (currentSummit) { - const { - term, - page, - order, - orderDir, - perPage, - selectionPlanFilter, - trackFilter, - trackGroupFilter, - activityTypeFilter, - selectionStatusFilter, - mediaUploadTypeFilter - } = this.getSubjectProps(); - const { - speakerFilters: { orAndFilter } - } = this.state; - this.getBySummit(term, page, perPage, order, orderDir, { - selectionPlanFilter, - trackFilter, - trackGroupFilter, - activityTypeFilter, - selectionStatusFilter, - orAndFilter, - mediaUploadTypeFilter - }); + this.callBySummit(); } } @@ -179,6 +159,44 @@ class SummitSpeakersListPage extends React.Component { callable(term, page, perPage, order, orderDir, filters, source); } + getFilters(filterOverrides = {}) { + const { + selectionPlanFilter, + trackFilter, + trackGroupFilter, + activityTypeFilter, + selectionStatusFilter, + mediaUploadTypeFilter, + pendingSubmissionsFilter + } = this.getSubjectProps(); + const { + speakerFilters: { orAndFilter } + } = this.state; + return { + selectionPlanFilter, + trackFilter, + trackGroupFilter, + activityTypeFilter, + selectionStatusFilter, + orAndFilter, + mediaUploadTypeFilter, + pendingSubmissionsFilter, + ...filterOverrides + }; + } + + callBySummit(posOverrides = {}, filterOverrides = {}) { + const { term, page, perPage, order, orderDir } = this.getSubjectProps(); + this.getBySummit( + posOverrides.term ?? term, + posOverrides.page ?? page, + posOverrides.perPage ?? perPage, + posOverrides.order ?? order, + posOverrides.orderDir ?? orderDir, + this.getFilters(filterOverrides) + ); + } + export(term, order, orderDir, filters) { const { source } = this.state; const callable = @@ -200,7 +218,8 @@ class SummitSpeakersListPage extends React.Component { trackGroupFilter, activityTypeFilter, selectionStatusFilter, - mediaUploadTypeFilter + mediaUploadTypeFilter, + pendingSubmissionsFilter } = this.getSubjectProps(); const { speakerFilters: { orAndFilter } @@ -216,7 +235,8 @@ class SummitSpeakersListPage extends React.Component { activityTypeFilter, selectionStatusFilter, orAndFilter, - mediaUploadTypeFilter + mediaUploadTypeFilter, + pendingSubmissionsFilter }); }); } @@ -229,236 +249,44 @@ class SummitSpeakersListPage extends React.Component { } handlePageChange(page) { - const { - term, - order, - orderDir, - perPage, - selectionPlanFilter, - trackFilter, - trackGroupFilter, - activityTypeFilter, - selectionStatusFilter, - mediaUploadTypeFilter - } = this.getSubjectProps(); - const { - speakerFilters: { orAndFilter } - } = this.state; - this.getBySummit(term, page, perPage, order, orderDir, { - selectionPlanFilter, - trackFilter, - trackGroupFilter, - activityTypeFilter, - selectionStatusFilter, - orAndFilter, - mediaUploadTypeFilter - }); + this.callBySummit({ page }); } handleSort(index, key, dir) { - const { - term, - page, - perPage, - selectionPlanFilter, - trackFilter, - trackGroupFilter, - activityTypeFilter, - selectionStatusFilter, - mediaUploadTypeFilter - } = this.getSubjectProps(); - const { - speakerFilters: { orAndFilter } - } = this.state; - this.getBySummit(term, page, perPage, key, dir, { - selectionPlanFilter, - trackFilter, - trackGroupFilter, - activityTypeFilter, - selectionStatusFilter, - orAndFilter, - mediaUploadTypeFilter - }); + this.callBySummit({ order: key, orderDir: dir }); } handleSearch(term) { - const { - order, - orderDir, - page, - perPage, - selectionPlanFilter, - trackFilter, - trackGroupFilter, - activityTypeFilter, - selectionStatusFilter, - mediaUploadTypeFilter - } = this.getSubjectProps(); - const { - speakerFilters: { orAndFilter } - } = this.state; - this.getBySummit(term, page, perPage, order, orderDir, { - selectionPlanFilter, - trackFilter, - trackGroupFilter, - activityTypeFilter, - selectionStatusFilter, - orAndFilter, - mediaUploadTypeFilter - }); + this.callBySummit({ term }); } handleChangeSelectionPlanFilter(ev) { - const { value: newSelectionPlanFilter } = ev.target; - const { - term, - order, - page, - orderDir, - perPage, - trackFilter, - trackGroupFilter, - activityTypeFilter, - selectionStatusFilter, - mediaUploadTypeFilter - } = this.getSubjectProps(); - const { - speakerFilters: { orAndFilter } - } = this.state; - this.getBySummit(term, page, perPage, order, orderDir, { - selectionPlanFilter: newSelectionPlanFilter, - trackFilter, - trackGroupFilter, - activityTypeFilter, - selectionStatusFilter, - orAndFilter, - mediaUploadTypeFilter - }); + this.callBySummit({}, { selectionPlanFilter: ev.target.value }); } handleChangeTrackFilter(ev) { - const { value: newTrackFilter } = ev.target; - const { - term, - order, - page, - orderDir, - perPage, - selectionPlanFilter, - trackGroupFilter, - activityTypeFilter, - selectionStatusFilter, - mediaUploadTypeFilter - } = this.getSubjectProps(); - const { - speakerFilters: { orAndFilter } - } = this.state; - this.getBySummit(term, page, perPage, order, orderDir, { - selectionPlanFilter, - trackFilter: newTrackFilter, - trackGroupFilter, - activityTypeFilter, - selectionStatusFilter, - orAndFilter, - mediaUploadTypeFilter - }); + this.callBySummit({}, { trackFilter: ev.target.value }); } handleChangeTrackGroupFilter(ev) { - const { value: newTrackGroupFilter } = ev.target; - const { - term, - order, - page, - orderDir, - perPage, - selectionPlanFilter, - trackFilter, - activityTypeFilter, - selectionStatusFilter, - mediaUploadTypeFilter - } = this.getSubjectProps(); - const { - speakerFilters: { orAndFilter } - } = this.state; - this.getBySummit(term, page, perPage, order, orderDir, { - selectionPlanFilter, - trackFilter, - trackGroupFilter: newTrackGroupFilter, - activityTypeFilter, - selectionStatusFilter, - orAndFilter, - mediaUploadTypeFilter - }); + this.callBySummit({}, { trackGroupFilter: ev.target.value }); } handleChangeActivityTypeFilter(ev) { - const { value: newActivityTypeFilter } = ev.target; - const { - term, - order, - page, - orderDir, - perPage, - selectionPlanFilter, - trackFilter, - trackGroupFilter, - selectionStatusFilter, - mediaUploadTypeFilter - } = this.getSubjectProps(); - const { - speakerFilters: { orAndFilter } - } = this.state; - this.getBySummit(term, page, perPage, order, orderDir, { - selectionPlanFilter, - trackFilter, - trackGroupFilter, - activityTypeFilter: newActivityTypeFilter, - selectionStatusFilter, - orAndFilter, - mediaUploadTypeFilter - }); + this.callBySummit({}, { activityTypeFilter: ev.target.value }); } handleChangeMediaUploadTypeFilter(ev) { const { value, operator } = ev.target; - const { - term, - order, - page, - orderDir, - perPage, - activityTypeFilter, - selectionPlanFilter, - trackFilter, - trackGroupFilter, - selectionStatusFilter, - mediaUploadTypeFilter - } = this.getSubjectProps(); - const { - speakerFilters: { orAndFilter } - } = this.state; + const { mediaUploadTypeFilter } = this.getSubjectProps(); if (operator && value.length > 0) { - this.getBySummit(term, page, perPage, order, orderDir, { - selectionPlanFilter, - trackFilter, - trackGroupFilter, - activityTypeFilter, - selectionStatusFilter, - orAndFilter, - mediaUploadTypeFilter: { operator, value } - }); + this.callBySummit({}, { mediaUploadTypeFilter: { operator, value } }); // get speakers if the media upload types filter is clear } else if (mediaUploadTypeFilter.value.length > 0 && value.length === 0) { - this.getBySummit(term, page, perPage, order, orderDir, { - selectionPlanFilter, - trackFilter, - trackGroupFilter, - activityTypeFilter, - selectionStatusFilter, - orAndFilter, - mediaUploadTypeFilter: { operator: null, value: [] } - }); + this.callBySummit( + {}, + { mediaUploadTypeFilter: { operator: null, value: [] } } + ); } } @@ -478,31 +306,12 @@ class SummitSpeakersListPage extends React.Component { } else if (newSelectionStatusFilter.includes("alternate_rejected")) { newSelectionStatusFilter = ["alternate_rejected"]; } + this.callBySummit({}, { selectionStatusFilter: newSelectionStatusFilter }); + } - const { - term, - order, - page, - orderDir, - perPage, - selectionPlanFilter, - trackFilter, - trackGroupFilter, - activityTypeFilter, - mediaUploadTypeFilter - } = this.getSubjectProps(); - const { - speakerFilters: { orAndFilter } - } = this.state; - this.getBySummit(term, page, perPage, order, orderDir, { - selectionPlanFilter, - trackFilter, - trackGroupFilter, - activityTypeFilter, - orAndFilter, - selectionStatusFilter: newSelectionStatusFilter, - mediaUploadTypeFilter - }); + handleChangePendingSubmissionsFilter(ev) { + const { value } = ev.target; + this.callBySummit({}, { pendingSubmissionsFilter: value }); } handleChangeFlowEvent(ev) { @@ -524,18 +333,7 @@ class SummitSpeakersListPage extends React.Component { const excerptRecipient = this.ingestEmailRef.value; const shouldSendCopy2Submitter = isSpeakerMode && this.shouldSendCopy2SubmitterRef.checked; - const { - term, - selectionPlanFilter, - trackFilter, - trackGroupFilter, - activityTypeFilter, - selectionStatusFilter, - mediaUploadTypeFilter - } = this.getSubjectProps(); - const { - speakerFilters: { orAndFilter } - } = this.state; + const { term } = this.getSubjectProps(); this.props.validateSpecs( promoCodeStrategy, @@ -555,15 +353,7 @@ class SummitSpeakersListPage extends React.Component { callable( term, - { - selectionPlanFilter, - trackFilter, - trackGroupFilter, - activityTypeFilter, - selectionStatusFilter, - orAndFilter, - mediaUploadTypeFilter - }, + this.getFilters(), testRecipient, excerptRecipient, shouldSendCopy2Submitter, @@ -623,30 +413,9 @@ class SummitSpeakersListPage extends React.Component { } handleExport(ev) { - const { - term, - order, - orderDir, - selectionPlanFilter, - trackFilter, - trackGroupFilter, - activityTypeFilter, - selectionStatusFilter, - mediaUploadTypeFilter - } = this.getSubjectProps(); - const { - speakerFilters: { orAndFilter } - } = this.state; ev.preventDefault(); - this.export(term, order, orderDir, { - selectionPlanFilter, - trackFilter, - trackGroupFilter, - activityTypeFilter, - selectionStatusFilter, - orAndFilter, - mediaUploadTypeFilter - }); + const { term, order, orderDir } = this.getSubjectProps(); + this.export(term, order, orderDir, this.getFilters()); } handleSelected(item_id, isSelected) { @@ -685,32 +454,11 @@ class SummitSpeakersListPage extends React.Component { } handleOrAndFilter(ev) { - const { - term, - order, - page, - orderDir, - perPage, - trackFilter, - trackGroupFilter, - selectionPlanFilter, - activityTypeFilter, - selectionStatusFilter, - mediaUploadTypeFilter - } = this.getSubjectProps(); this.setState({ ...this.state, speakerFilters: { ...this.state.speakerFilters, orAndFilter: ev } }); - this.getBySummit(term, page, perPage, order, orderDir, { - selectionPlanFilter, - trackFilter, - trackGroupFilter, - activityTypeFilter, - mediaUploadTypeFilter, - selectionStatusFilter, - orAndFilter: ev - }); + this.callBySummit({}, { orAndFilter: ev }); } render() { @@ -736,6 +484,7 @@ class SummitSpeakersListPage extends React.Component { activityTypeFilter, selectionStatusFilter, mediaUploadTypeFilter, + pendingSubmissionsFilter, currentFlowEvent, totalActivities } = this.getSubjectProps(); @@ -796,6 +545,11 @@ class SummitSpeakersListPage extends React.Component { { label: "Alternate/Rejected", value: "alternate_rejected" } ]; + const pendingSubmissionsDDL = [ + { label: "Has Pending Submissions", value: true }, + { label: "No Pending Submissions", value: false } + ]; + const speakerSubmitterSourceSelectorDDL = [ { label: T.translate("summit_speakers_list.speakers"), @@ -1021,6 +775,18 @@ class SummitSpeakersListPage extends React.Component { isMulti /> +
+ +
+ +