Skip to content

Commit

Permalink
[SDESK-1997] Coverage cancellation action
Browse files Browse the repository at this point in the history
new changes

new changes

Read only mode

fix
  • Loading branch information
nrvikas committed Oct 15, 2017
1 parent 85f4644 commit 8f61a41
Show file tree
Hide file tree
Showing 18 changed files with 479 additions and 24 deletions.
4 changes: 2 additions & 2 deletions client/actions/planning/api.js
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ const cancelAllCoverage = (item) => (
item,
{
reason: get(item, 'reason', undefined),
coverage_cancellation_only: true,
cancel_all_coverage: true,
}
)
)
Expand Down Expand Up @@ -887,7 +887,7 @@ const markPlanningCancelled = (plan, reason, coverageState, eventCancellation) =
})

const markCoverageCancelled = (plan, reason, coverageState, ids) => ({
type: PLANNING.ACTIONS.MARK_ALL_COVERAGE_CANCELLED,
type: PLANNING.ACTIONS.MARK_COVERAGE_CANCELLED,
payload: {
planning_item: plan,
reason,
Expand Down
3 changes: 2 additions & 1 deletion client/components/AssignmentForm/index.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { connect } from 'react-redux'
import { Field, reduxForm, propTypes } from 'redux-form'
import { CoverageDetails, EditAssignment } from '../../components'
import * as selectors from '../../selectors'
import { assignmentUtils } from '../../utils'
import { get } from 'lodash'

export class Component extends React.Component {
Expand Down Expand Up @@ -32,7 +33,7 @@ export class Component extends React.Component {
users={users}
desks={desks}
coverageProviders={coverageProviders}
readOnly={readOnly} context={'assignment'} />
readOnly={readOnly || assignmentUtils.isAssignmentCancelled(assignment)} context={'assignment'} />

<label>Coverage Details</label>
<CoverageDetails
Expand Down
15 changes: 14 additions & 1 deletion client/components/CoverageContainer/index.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import React from 'react'
import ReactDOM from 'react-dom'
import PropTypes from 'prop-types'
import { getCreator } from '../../utils'
import { planningUtils } from '../../utils'
import { Coverage, AuditInformation, ItemActionsMenu, CoverageListItem } from '../index'
import { get } from 'lodash'

Expand Down Expand Up @@ -46,6 +47,7 @@ export class CoverageContainer extends React.Component {
users,
removeCoverage,
duplicateCoverage,
cancelCoverage,
readOnly,
showRemoveAction,
desks,
Expand All @@ -57,6 +59,8 @@ export class CoverageContainer extends React.Component {
const versionCreator = getCreator(coverage, 'version_creator', users)
const updatedDate = get(coverage, '_updated')

const coverageCancelled = planningUtils.isCoverageCancelled(coverage)

const duplicateActions = contentTypes
.filter((contentType) => (
contentType.qcode !== get(coverage, 'planning.g2_content_type')
Expand All @@ -79,6 +83,14 @@ export class CoverageContainer extends React.Component {
},
]

if (!coverageCancelled) {
itemActions.unshift({
label: 'Cancel coverage',
icon: 'icon-close-small',
callback: () => {cancelCoverage(index)},
})
}

if (showRemoveAction) {
itemActions.unshift({
label: 'Remove coverage',
Expand Down Expand Up @@ -111,7 +123,7 @@ export class CoverageContainer extends React.Component {
<i className="icon-close-small"/>
</button>
</div>
<Coverage coverage={fieldName} readOnly={readOnly}/>
<Coverage coverage={fieldName} readOnly={readOnly || coverageCancelled}/>
</div>
}
</div>
Expand All @@ -128,6 +140,7 @@ CoverageContainer.propTypes = {
desks: PropTypes.array.isRequired,
removeCoverage: PropTypes.func.isRequired,
duplicateCoverage: PropTypes.func.isRequired,
cancelCoverage: PropTypes.func,
readOnly: PropTypes.bool.isRequired,
showRemoveAction: PropTypes.bool.isRequired,
}
3 changes: 2 additions & 1 deletion client/components/CoverageDetails/index.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ export const CoverageDetails = ({
// for assignment form coverage props is object
// for coverage form coverage props is string
const fieldNamePrefix = typeof coverage === 'string' ? `${coverage}.` : ''
const coverageStatusPrefix = fieldNamePrefix ? fieldNamePrefix : 'planning.'
return (
<div>
{get(formProfile, 'editor.slugline.enabled') &&
Expand Down Expand Up @@ -84,7 +85,7 @@ export const CoverageDetails = ({
)}
<div className="form__row">
<Field
name={`${fieldNamePrefix}news_coverage_status`}
name={`${coverageStatusPrefix}news_coverage_status`}
component={fields.CoverageStatusField}
label="Coverage Status"
clearable={false}
Expand Down
5 changes: 3 additions & 2 deletions client/components/EditAssignmentPanelContainer/index.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import * as actions from '../../actions'
import * as selectors from '../../selectors'
import { AssignmentForm, AuditInformation } from '../../components'
import { TOOLTIPS } from '../../constants'
import { getCreator } from '../../utils'
import { getCreator, assignmentUtils } from '../../utils'
import { get } from 'lodash'
import './style.scss'

Expand Down Expand Up @@ -67,11 +67,12 @@ export class EditAssignmentPanel extends React.Component {
<header className="subnav">
{readOnly &&
<div className="EditAssignmentPanel__actions">
{!assignmentUtils.isAssignmentCancelled(assignment) &&
<button className="EditAssignmentPanel__actions__edit navbtn navbtn--right"
onClick={openEditor.bind(this, assignment)}
data-sd-tooltip={TOOLTIPS.edit} data-flow='down'>
<i className="icon-pencil"/>
</button>
</button>}
<button className="EditAssignmentPanel__actions__edit navbtn navbtn--right"
onClick={closePreview.bind(this)}
data-sd-tooltip={TOOLTIPS.close} data-flow='down'>
Expand Down
36 changes: 34 additions & 2 deletions client/components/fields/CoveragesFieldArray/index.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ import { CoverageContainer } from '../../index'
import React from 'react'
import PropTypes from 'prop-types'
import { connect } from 'react-redux'
import { arraySplice } from 'redux-form'
import { get } from 'lodash'
import * as selectors from '../../../selectors'

export class CoveragesFieldArrayComponent extends React.Component {
newCoverage() {
Expand Down Expand Up @@ -35,6 +37,25 @@ export class CoveragesFieldArrayComponent extends React.Component {
})
}

cancelCoverage(index) {
let cancelledCoverage = {
...this.props.fields.get(index),
news_coverage_status: this.props.cancelCoverageState,
}

cancelledCoverage.planning = {
...cancelledCoverage.planning,
internal_note: `------------------------------------------------------------
Coverage cancelled
`,
ednote: `------------------------------------------------------------
Coverage cancelled
`,
}

this.props.cancelCoverage(index, cancelledCoverage)
}

render() {
const {
fields,
Expand All @@ -59,6 +80,7 @@ export class CoveragesFieldArrayComponent extends React.Component {
readOnly={readOnly}
removeCoverage={this.removeCoverage.bind(this)}
duplicateCoverage={this.duplicateCoverage.bind(this)}
cancelCoverage={this.cancelCoverage.bind(this)}
showRemoveAction={fields.length > 1 &&
!get(fields.get(index), 'assigned_to.assignment_id')}
/>
Expand All @@ -84,13 +106,23 @@ CoveragesFieldArrayComponent.propTypes = {
users: PropTypes.array.isRequired,
contentTypes: PropTypes.array.isRequired,
desks: PropTypes.array.isRequired,
cancelCoverage: PropTypes.func,
cancelCoverageState: PropTypes.object,
}

CoveragesFieldArrayComponent.defaultProps = {
slugline: '',
fields: {},
}

const mapStateToProps = (state) => ({ contentTypes: state.vocabularies.g2_content_type })
const mapStateToProps = (state) => ({
contentTypes: state.vocabularies.g2_content_type,
cancelCoverageState: selectors.getCoverageCancelState(state),
})

const mapDispatchToProps = (dispatch) => ({
cancelCoverage: (index, coverage) =>
(dispatch(arraySplice('planning', 'coverages', index, 1, coverage))),
})

export const CoveragesFieldArray = connect(mapStateToProps)(CoveragesFieldArrayComponent)
export const CoveragesFieldArray = connect(mapStateToProps, mapDispatchToProps)(CoveragesFieldArrayComponent)
2 changes: 1 addition & 1 deletion client/constants/planning.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ export const PLANNING = {
SET_ADVANCED_SEARCH: 'SET_ADVANCED_SEARCH',
CLEAR_ADVANCED_SEARCH: 'CLEAR_ADVANCED_SEARCH',
MARK_PLANNING_CANCELLED: 'MARK_PLANNING_CANCELLED',
MARK_ALL_COVERAGE_CANCELLED: 'MARK_ALL_COVERAGE_CANCELLED',
MARK_COVERAGE_CANCELLED: 'MARK_COVERAGE_CANCELLED',
MARK_PLANNING_POSTPONED: 'MARK_PLANNING_POSTPONED',
TOGGLE_SELECTED: 'TOGGLE_SELECTED',
SELECT_ALL: 'SELECT_ALL',
Expand Down
8 changes: 6 additions & 2 deletions client/reducers/planning.js
Original file line number Diff line number Diff line change
Expand Up @@ -273,15 +273,15 @@ const planningReducer = createReducer(initialState, {
}
},

[PLANNING.ACTIONS.MARK_ALL_COVERAGE_CANCELLED]: (state, payload) => {
[PLANNING.ACTIONS.MARK_COVERAGE_CANCELLED]: (state, payload) => {
plannings = cloneDeep(state.plannings)
plan = get(plannings, payload.planning_item, null)

// If the planning item is not loaded, disregard this action
if (plan === null) return state

plan.coverages.forEach((coverage) => {
if (payload.ids.indexOf(coverage._id) !== -1) {
if (payload.ids.indexOf(coverage.coverage_id) !== -1) {
markCoverage(coverage, payload, 'cancelled')
}
})
Expand Down Expand Up @@ -493,6 +493,10 @@ Coverage ${action}
note = `${coverage.planning.internal_note}\n\n${note}`
}

if (get(coverage, 'planning.ednote', null) !== null) {
note = `${coverage.planning.ednote}\n\n${note}`
}

if ('coverage_state' in payload) {
coverage.news_coverage_status = payload.coverage_state
}
Expand Down
2 changes: 2 additions & 0 deletions client/selectors/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,8 @@ export const getPlanningSearch = (state) => get(state, 'planning.search.currentS
export const getEventsFormsProfile = (state) => get(state, 'formsProfile.events')
export const getPlanningsFormsProfile = (state) => get(state, 'formsProfile.planning')
export const getCoverageFormsProfile = (state) => get(state, 'formsProfile.coverage')
export const getCoverageCancelState = (state) =>
(get(state, 'vocabularies.newscoveragestatus', []).find((s) => s.qcode === 'ncostat:notint'))
export const getVocabularies = (state) => get(state, 'vocabularies')
export const getSelectedPlanningItems = (state) => get(state, 'planning.selectedItems')
export const getLockedItems = (state) => get(state, 'locks', {
Expand Down
8 changes: 8 additions & 0 deletions client/utils/assignments.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { get } from 'lodash'

const isAssignmentCancelled = (assigment) =>
(get(assigment, 'assigned_to.state') === 'cancelled')

const self = { isAssignmentCancelled }

export default self
1 change: 1 addition & 0 deletions client/utils/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ export { default as registerNotifications } from './notifications'
export { default as eventUtils } from './events'
export { default as planningUtils } from './planning'
export { default as uiUtils } from './ui'
export { default as assignmentUtils } from './assignments'

export function createReducer(initialState, reducerMap) {
return (state = initialState, action) => {
Expand Down
11 changes: 6 additions & 5 deletions client/utils/planning.js
Original file line number Diff line number Diff line change
Expand Up @@ -85,19 +85,19 @@ const canCancelPlanning = (planning, event=null, session, privileges, locks) =>
}

const canCancelAllCoverage = (planning, event=null, session, privileges, locks) => {
const planState = getItemWorkflowState(planning)
const eventState = getItemWorkflowState(event)
return !!privileges[PRIVILEGES.PLANNING_MANAGEMENT] &&
!isPlanningLockRestricted(planning, session, locks) &&
planState === WORKFLOW_STATE.SCHEDULED &&
eventState !== WORKFLOW_STATE.SPIKED &&
!isAllCoverageCancelled(planning)
}

const isCoverageCancelled = (coverage) =>
(get(coverage, 'news_coverage_status.qcode') === 'ncostat:notint')

const isAllCoverageCancelled = (planning) => (
planning.coverages &&
planning.coverages.filter((c) =>
c.news_coverage_status.qcode !== 'ncostat:notint').length === 0
get(planning, 'coverages') &&
planning.coverages.filter((c) => !isCoverageCancelled(c)).length === 0
)

const isPlanningLocked = (plan, locks) =>
Expand Down Expand Up @@ -234,6 +234,7 @@ const self = {
isPlanAdHoc,
convertCoveragesGenreToObject,
convertGenreToObject,
isCoverageCancelled,
}

export default self

0 comments on commit 8f61a41

Please sign in to comment.