{"version":3,"sources":["webpack:///./app/containers/PolicyEdit/actions.js","webpack:///./app/containers/PolicyEdit/reducer.js","webpack:///./app/containers/PolicyEdit/sagas.js","webpack:///./app/containers/PolicyEdit/index.js"],"names":["fetchPolicy","createAction","FETCH_POLICY","setPolicy","SET_POLICY","initialState","fromJS","policy","saving","deleting","policyEditReducer","handleActions","DELETE_POLICY","state","set","DELETE_POLICY_SUCCESS","payload","UPDATE_POLICY","UPDATE_POLICY_SUCCESS","getPolicy","policyEditSaga","action","client","getClient","query","forceFetch","gql","FETCH_POLICY_QUERY","variables","srn","result","data","ControlPolicies","items","Error","count","evalCriteria","JSON","parse","put","console","error","all","takeLatest","LoadingAnim","Breadcrumb","Icon","transform","spin","fa","name","SectionHeader","small","PolicyEdit","props","deletePolicy","get","setState","currentState","editingPolicy","search","getIn","pathname","searchName","qs","stringify","searchId","policyId","styles","navContextContainer","height","gridArea","container","display","gridTemplateColumns","gridTemplateRows","gridTemplateAreas","gridColumnGap","gridRowGap","padding","overflow","policyTitle","detailsEntry","paddingBottom","fontSize","label","fontWeight","color","theme","neutralDark","menuAnchor","border","margin","dropdownMenu","borderRadius","dropdownMenuItem","width","textAlign","lastTriggerInfo","justifyContent","alignItems","titleText","searchInfo","borderBottom","neutralLight","marginBottom","controlGroupBadge","backgroundColor","neutralMedium","marginRight","cursor","oldProps","this","goBack","isEmpty","canEdit","userHasPermission","permissionName","resourceId","canDelete","Map","firstCriteriaKey","size","keySeq","first","policyEvalType","policyEvalTarget","remediationType","policyEvalOp","alertingLevel","getNameForHelmet","toJS","EditPolicyModal","toggle","toggleEditingPolicy","style","TextLink","to","titleContainer","DropdownActions","toggleDropdown","borderless","onClick","disabled","handleDeletePolicy","BorderedCard","controlGroups","List","filter","cf","userFrameworkIds","includes","map","controlFramework","controlGroupId","Badge","pill","undefined","SavedSearchDisplay","getSearchNavParams","searchStyle","DynamicFormattedMessage","defaultMessage","messages","charAt","toUpperCase","slice","_","startCase","toLower","CreatedByBadge","createdBy","MarkdownDisplay","content","marginTop","remediation","index","CodeBlock","Helmet","title","React","Component","mapStateToProps","createStructuredSelector","selectPolicyId","selectControlGroups","selectDeleting","selectPolicy","selectUserFrameworkIds","selectSaving","withConnect","connect","dispatch","bindActionCreators","withReducer","injectReducer","key","reducer","withSaga","injectSaga","saga","sagas","compose","permissionChecker","themeable"],"mappings":"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","file":"49.4bde2ec217a1fcf45872.chunk.js","sourcesContent":["import { FETCH_POLICY, SET_POLICY } from './constants'\nimport { createAction } from 'redux-actions'\n\nexport const fetchPolicy = createAction(FETCH_POLICY)\nexport const setPolicy = createAction(SET_POLICY)\n","import { fromJS } from 'immutable'\nimport { handleActions } from 'redux-actions'\n\nimport {\n UPDATE_POLICY,\n UPDATE_POLICY_SUCCESS,\n DELETE_POLICY,\n DELETE_POLICY_SUCCESS,\n} from 'containers/ControlFrameworkData/constants'\n\nimport { SET_POLICY } from './constants'\n\nconst initialState = fromJS({\n policy: {},\n saving: false,\n deleting: false,\n})\n\nconst policyEditReducer = handleActions(\n {\n [DELETE_POLICY]: state => state.set('deleting', true),\n [DELETE_POLICY_SUCCESS]: state => state.set('deleting', false),\n [SET_POLICY]: (state, { payload }) => state.set('policy', fromJS(payload)),\n [UPDATE_POLICY]: state => state.set('saving', true),\n [UPDATE_POLICY_SUCCESS]: (state, { payload }) =>\n state.set('saving', false).set('policy', fromJS(payload)),\n },\n initialState\n)\n\nexport default policyEditReducer\n","import { all, put, takeLatest } from 'redux-saga/effects'\nimport gql from 'graphql-tag'\nimport { FETCH_POLICY_QUERY } from 'static-queries'\n\nimport { getClient } from 'apolloClient'\nimport { setPolicy } from './actions'\nimport { FETCH_POLICY } from './constants'\n\nfunction* getPolicy(action) {\n try {\n const client = getClient()\n const result = yield client.query({\n forceFetch: true,\n fetchPolicy: 'network-only',\n query: gql`\n ${FETCH_POLICY_QUERY}\n `,\n variables: {\n srn: action.payload,\n },\n })\n\n if (result.data.ControlPolicies.items === null) {\n throw new Error('Bad formatting of response from server: items is null')\n }\n\n if (result.data.ControlPolicies.count > 0) {\n const policy = result.data.ControlPolicies.items[0]\n if (typeof policy.evalCriteria === 'string') {\n policy.evalCriteria = JSON.parse(policy.evalCriteria)\n }\n\n yield put(setPolicy(policy))\n }\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error('Error fetching policy', e)\n }\n}\n\nfunction* policyEditSaga() {\n yield all([takeLatest(FETCH_POLICY, getPolicy)])\n}\n\nexport default policyEditSaga\n","import React, { Fragment } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect } from 'react-redux'\nimport { createStructuredSelector } from 'reselect'\nimport { compose, bindActionCreators } from 'redux'\nimport ImmutablePropTypes from 'react-immutable-proptypes'\nimport { List, Map } from 'immutable'\nimport qs from 'query-string'\nimport { Badge } from 'reactstrap'\nimport { Link } from 'react-router-dom'\nimport { getNameForHelmet } from 'utils/sonraiUtils'\nimport { Helmet } from 'react-helmet'\nimport BorderedCard from 'components/BorderedCard'\nimport injectReducer from 'utils/injectReducer'\nimport injectSaga from 'utils/injectSaga'\nimport LoadingAnim from 'components/LoadingAnim'\nimport { selectControlGroups } from 'containers/ControlFrameworkData/selectors'\nimport _ from 'lodash'\nimport { deletePolicy } from 'containers/ControlFrameworkData/actions'\nimport permissionChecker from 'containers/PermissionChecker'\nimport MarkdownDisplay from 'components/MarkdownDisplay'\nimport themeable, { themeShape } from 'containers/ThemeManager/Themeable'\nimport Icon from 'components/Icon'\nimport DropdownActions, {\n DropdownAnchor,\n DropdownMenu,\n DropdownItem,\n} from 'components/DropdownActions'\nimport Breadcrumb, { BreadcrumbItem } from 'components/Breadcrumb'\nimport DynamicFormattedMessage from 'components/DynamicFormattedMessage'\nimport SectionHeader from 'components/SectionHeader'\nimport CodeBlock from 'components/CodeBlock'\nimport { goBack } from 'connected-react-router'\n\nimport { fetchPolicy, setPolicy } from './actions'\nimport {\n selectPolicy,\n selectPolicyId,\n selectDeleting,\n selectUserFrameworkIds,\n selectSaving,\n} from './selectors'\nimport reducer from './reducer'\nimport sagas from './sagas'\nimport EditPolicyModal from './EditPolicyModal'\nimport messages from './messages'\nimport CreatedByBadge from 'components/CreatedByBadge'\nimport SavedSearchDisplay from 'components/SavedSearchDisplay'\nimport TextLink from 'components/TextLink'\nexport class PolicyEdit extends React.Component {\n constructor(props) {\n super(props)\n\n props.fetchPolicy(props.policyId)\n\n this.styles = {\n navContextContainer: {\n height: '24px',\n gridArea: 'breadcrumbs',\n },\n container: {\n display: 'grid',\n gridTemplateColumns: '1fr',\n gridTemplateRows: 'auto 45px 1fr',\n gridTemplateAreas: '\"breadcrumbs\" \"title\" \"policies\"',\n gridColumnGap: '1em',\n gridRowGap: '0.5em',\n padding: '1em',\n height: '100%',\n overflow: 'auto',\n },\n policyTitle: {\n display: 'grid',\n gridTemplateColumns: '1fr auto',\n gridColumnGap: '1em',\n },\n detailsEntry: {\n paddingBottom: '0.5em',\n fontSize: '0.9em',\n },\n label: {\n fontWeight: 400,\n display: 'block',\n color: props.theme.neutralDark,\n },\n menuAnchor: {\n border: 'none',\n margin: '-1em',\n },\n dropdownMenu: {\n padding: '0.7em',\n borderRadius: '3px',\n },\n dropdownMenuItem: {\n display: 'block',\n padding: '0.5em 0',\n width: '100%',\n textAlign: 'left',\n },\n lastTriggerInfo: {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n },\n titleText: {\n fontSize: '1.3em',\n },\n searchInfo: {\n borderBottom: `1px solid ${props.theme.neutralLight}`,\n marginBottom: '1em',\n paddingBottom: '0.5em',\n },\n controlGroupBadge: {\n backgroundColor: props.theme.neutralLight,\n color: props.theme.neutralMedium,\n marginRight: '0.3em',\n cursor: 'pointer',\n },\n }\n\n this.state = {\n editingPolicy: false,\n }\n }\n\n componentDidUpdate(oldProps) {\n if (oldProps.policyId !== this.props.policyId) {\n this.props.setPolicy({})\n this.props.fetchPolicy(this.props.policyId)\n }\n if (oldProps.deleting && !this.props.deleting) {\n this.props.goBack()\n }\n }\n\n componentWillUnmount() {\n this.props.setPolicy({})\n }\n\n handleDeletePolicy = () => {\n this.props.deletePolicy(this.props.policy.get('srn'))\n }\n\n toggleEditingPolicy = () => {\n this.setState(currentState => ({\n editingPolicy: !currentState.editingPolicy,\n }))\n }\n\n getSearchNavParams = () => {\n const search = this.props.policy.getIn(['contains', 'items', 0])\n\n if (search.get('__typename') === 'Savedquery') {\n return {\n pathname: '/App/GraphExplorer',\n state: {\n searchName: search.get('name'),\n },\n }\n } else {\n return {\n pathname: '/App/Search',\n search: qs.stringify({\n searchId: search.get('sid'),\n }),\n }\n }\n }\n\n render() {\n if (this.props.policy.isEmpty()) {\n return \n }\n\n const canEdit = this.props.userHasPermission({\n permissionName: 'edit.controlframeworks',\n resourceId: this.props.policy.get('resourceId'),\n })\n\n const canDelete = this.props.userHasPermission({\n permissionName: 'edit.controlframeworks',\n resourceId: this.props.policy.get('resourceId'),\n })\n\n const search = this.props.policy.getIn(['contains', 'items', 0])\n\n const evalCriteria = this.props.policy.get('evalCriteria') || Map()\n const firstCriteriaKey =\n evalCriteria.size > 0 ? evalCriteria.keySeq().first() : null\n\n const policyEvalType = this.props.policy.getIn([\n 'evalCriteria',\n firstCriteriaKey,\n 0,\n ])\n const policyEvalTarget = this.props.policy.getIn([\n 'evalCriteria',\n firstCriteriaKey,\n 1,\n ])\n const remediationType = this.props.policy.get('remediationType')\n const policyEvalOp = firstCriteriaKey\n\n const alertingLevel = this.props.policy.get('alertingLevelNumeric') || '-'\n const name = getNameForHelmet(this.props.policy.toJS())\n\n return (\n \n {this.state.editingPolicy && (\n \n )}\n
\n
\n \n \n \n All Control Frameworks\n \n \n \n \n All Policies\n \n \n Policy Details\n \n
\n
\n
\n
\n {this.props.policy.get('title')}\n
\n\n
\n \n \n {this.props.saving || this.props.deleting ? (\n \n ) : (\n \n )}\n \n\n \n \n Edit\n \n \n {this.props.deleting ? (\n \n Deleting...\n \n ) : (\n 'Delete'\n )}\n \n \n \n
\n
\n
\n\n \n
\n {this.props.controlGroups && (\n
\n {this.props.policy\n .getIn(['containedByControlFramework', 'items'], List())\n .filter(cf =>\n this.props.userFrameworkIds.includes(cf.get('srn'))\n )\n .map(cf => {\n const controlFramework = this.props.controlGroups.get(\n cf.get('srn'),\n Map()\n )\n\n return (\n \n \n {controlFramework.get('friendlyName') ||\n controlFramework.get('title')}\n \n \n )\n })}\n
\n )}\n
\n
\n
\n
\n Search\n {search !== undefined ? (\n \n ) : (\n \n No\n Search attached to policy\n \n )}\n
\n
\n Trigger\n {' '}\n {' '}\n {policyEvalTarget}\n
\n
\n Remediation Type\n\n {remediationType\n ? _.startCase(_.toLower(remediationType))\n : '-'}\n
\n
\n Alert Level\n {alertingLevel}\n
\n
\n Created By\n \n
\n
\n
\n {this.props.policy.get('description') && (\n \n Description\n \n \n )}\n\n {this.props.policy.get('hasManualRemediations') &&\n !this.props.policy\n .getIn(['hasManualRemediations', 'items'], List())\n .isEmpty() && (\n \n \n Manual Remediations\n \n {this.props.policy\n .getIn(['hasManualRemediations', 'items'], List())\n .map((remediation, index) => (\n \n {remediation.get('remediationSteps')}\n \n ))}\n \n )}\n
\n
\n \n
\n )\n }\n}\n\nPolicyEdit.propTypes = {\n canDelete: PropTypes.func,\n deleting: PropTypes.bool,\n saving: PropTypes.bool,\n deletePolicy: PropTypes.func,\n policy: ImmutablePropTypes.map.isRequired,\n policyId: PropTypes.string,\n controlGroups: ImmutablePropTypes.map.isRequired,\n fetchPolicy: PropTypes.func.isRequired,\n setPolicy: PropTypes.func.isRequired,\n theme: themeShape,\n userFrameworkIds: ImmutablePropTypes.list.isRequired,\n userHasPermission: PropTypes.func.isRequired,\n search: ImmutablePropTypes.contains({\n name: PropTypes.string,\n }),\n goBack: PropTypes.func.isRequired,\n}\n\nconst mapStateToProps = createStructuredSelector({\n policyId: selectPolicyId,\n controlGroups: selectControlGroups,\n deleting: selectDeleting,\n policy: selectPolicy,\n userFrameworkIds: selectUserFrameworkIds,\n saving: selectSaving,\n})\n\nfunction mapDispatchToProps(dispatch) {\n return bindActionCreators(\n {\n deletePolicy,\n fetchPolicy,\n setPolicy,\n goBack,\n },\n dispatch\n )\n}\n\nconst withConnect = connect(mapStateToProps, mapDispatchToProps)\n\nconst withReducer = injectReducer({ key: 'policyEdit', reducer })\n\nconst withSaga = injectSaga({\n key: 'policyEdit',\n saga: sagas,\n})\n\nexport default compose(\n withReducer,\n withSaga,\n withConnect,\n permissionChecker,\n themeable\n)(PolicyEdit)\n"],"sourceRoot":""}