Skip to content

Commit

Permalink
make getCoverageDueDate configurable (#1981)
Browse files Browse the repository at this point in the history
* make getCoverageDueDate configurable

SDBELGA-782
  • Loading branch information
petrjasek authored May 8, 2024
1 parent a895b49 commit 4c52b17
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 37 deletions.
6 changes: 6 additions & 0 deletions client/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,10 @@ if (appConfig.planning == null) {
appConfig.planning = {};
}

if (appConfig.coverage == null) {
appConfig.coverage = {};
}

export function updateConfigAfterLoad() {
if (appConfig?.planning?.dateformat == null) {
appConfig.planning.dateformat = appConfig.view.dateformat;
Expand All @@ -95,3 +99,5 @@ export function updateConfigAfterLoad() {
appConfig.planning.autosave_timeout = 1500;
}
}

export const planningConfig = appConfig as IPlanningConfig;
6 changes: 6 additions & 0 deletions client/configure.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import {planningConfig} from './config';
import {IPlanningConfig} from './interfaces';

export const setCoverageDueDateStrategy = (callback: IPlanningConfig['coverage']['getDueDateStrategy']) => {
planningConfig.coverage.getDueDateStrategy = callback;
};
4 changes: 4 additions & 0 deletions client/interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,10 @@ export interface IPlanningConfig extends ISuperdeskGlobalConfig {
default_create_planning_series_with_event_series?: boolean;
event_related_item_search_provider_name?: string;
};

coverage?: {
getDueDateStrategy?(planningItem: IPlanningItem, eventItem?: IEventItem): moment.Moment | null;
};
}

export interface ISession {
Expand Down
89 changes: 52 additions & 37 deletions client/utils/planning.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,9 @@ import {
sanitizeItemFields,
stringUtils,
} from './index';
import {getUsersDefaultLanguage} from './users';
import * as selectors from '../selectors';
import {IMenuItem} from 'superdesk-ui-framework/react/components/Menu';
import {planningConfig} from '../config';

const isCoverageAssigned = (coverage) => !!get(coverage, 'assigned_to.desk');

Expand Down Expand Up @@ -1361,59 +1361,74 @@ function defaultCoverageValues(
}

if (planningItem) {
let coverageTime: moment.Moment = null;

if (planningItem?.event_item == null) {
coverageTime = moment(planningItem?.planning_date || moment());
} else if (eventItem) {
coverageTime = moment(eventItem?.dates?.end || moment());
}
const getCoverageDueDateStrategy = planningConfig.coverage?.getDueDateStrategy || getDefaultCoverageDueDate;
const coverageTime = getCoverageDueDateStrategy(planningItem as IPlanningItem, eventItem);

if (coverageTime) {
coverageTime.add(1, 'hour');

// Only round up to the hour if we didn't derive coverage time from an Event
if (!eventItem) {
coverageTime.minute() ?
coverageTime
.add(1, 'hour')
.startOf('hour') :
coverageTime.startOf('hour');
}

if (moment().isAfter(coverageTime)) {
coverageTime = moment();
coverageTime.minute() ?
coverageTime
.add(1, 'hour')
.startOf('hour') :
coverageTime.startOf('hour');
}
newCoverage.planning.scheduled = coverageTime;
}

if (eventItem && appConfig.long_event_duration_threshold > -1) {
const duration = moment.duration({
from: eventItem?.dates?.start,
to: eventItem?.dates?.end
});

if (appConfig.long_event_duration_threshold === 0) {
newCoverage.planning.scheduled = moment(eventItem?.dates?.end || moment());
} else {
const duration = moment.duration({
from: eventItem?.dates?.start,
to: eventItem?.dates?.end
});

if (duration.hours() > appConfig.long_event_duration_threshold) {
delete newCoverage.planning.scheduled;
delete newCoverage.planning._scheduledTime;
}
} else if (duration.hours() > appConfig.long_event_duration_threshold) {
delete newCoverage.planning.scheduled;
delete newCoverage.planning._scheduledTime;
}
}

newCoverage.planning._scheduledTime = newCoverage.planning.scheduled;
}

self.setDefaultAssignment(newCoverage, preferredCoverageDesks, g2contentType, defaultDesk);
return newCoverage;
}

function getDefaultCoverageDueDate(
planningItem: IPlanningItem,
eventItem?: IEventItem,
): moment.Moment | null {
let coverageTime: moment.Moment = null;

if (planningItem?.event_item == null) {
coverageTime = moment(planningItem?.planning_date || moment());
} else if (eventItem) {
coverageTime = moment(eventItem?.dates?.end || moment());
}

if (!coverageTime) {
return coverageTime;
}

coverageTime.add(1, 'hour');

// Only round up to the hour if we didn't derive coverage time from an Event
if (!eventItem) {
coverageTime.minute() ?
coverageTime
.add(1, 'hour')
.startOf('hour') :
coverageTime.startOf('hour');
}

// If the coverage time is in the past, set it to the current time
if (moment().isAfter(coverageTime)) {
coverageTime = moment();
coverageTime.minute() ?
coverageTime
.add(1, 'hour')
.startOf('hour') :
coverageTime.startOf('hour');
}

return coverageTime;
}

function setDefaultAssignment(
coverage: DeepPartial<IPlanningCoverageItem>,
preferredCoverageDesks: {[key: string]: IDesk['_id']},
Expand Down

0 comments on commit 4c52b17

Please sign in to comment.