Advertisement
Guest User

Untitled

a guest
Jan 10th, 2019
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.44 KB | None | 0 0
  1. import {
  2. Alert,
  3. Card,
  4. CardBody,
  5. CardFooter,
  6. CardHeader,
  7. Col,
  8. Form,
  9. FormFeedback,
  10. FormGroup,
  11. Input,
  12. Label,
  13. Row,
  14. } from 'reactstrap';
  15.  
  16. import FormFooter from 'components/FormFooter';
  17. import {FormattedMessage} from 'react-intl';
  18. import LocaleCombo from 'components/LocaleSelector/LocaleCombo';
  19. import {PasswordItem} from 'components/Password/PasswordItem';
  20. import PlatformsWidget from 'components/Platforms/PlatformsWidget';
  21. import PoliciesSelect from 'containers/PoliciesSelect';
  22. import PropTypes from 'prop-types';
  23. import ProtectedNavigation from 'components/ProtectedNavigation';
  24. import React from 'react';
  25. import ShowMore from 'components/ShowMore';
  26. import {injectIntl} from 'react-intl';
  27. import styled from 'styled-components';
  28. import {toast} from 'react-toastify';
  29. import {withFormik} from 'formik';
  30. import {withRouter} from 'react-router-dom';
  31. import injectRoles, {RoleEnum} from 'utils/injectRoles';
  32. import {compose} from 'redux';
  33.  
  34. const Checkbox = styled(Label)`
  35. opacity: ${(props) => (props.disabled ? 0.3 : 1)};
  36. `;
  37.  
  38. const cleanSubmitDatas = (values, user) => {
  39. let submitedValues = Object.assign({}, values);
  40. if (submitedValues.password === '') {
  41. delete submitedValues.password;
  42. }
  43. delete submitedValues.email;
  44. delete submitedValues.id;
  45.  
  46. submitedValues.status = submitedValues.status
  47. ? 'ENABLED'
  48. : user.status === 'PENDING' ? 'PENDING' : 'DISABLED';
  49.  
  50. if (submitedValues.policyId === user.policy.id) {
  51. delete submitedValues.policyId;
  52. }
  53.  
  54. if (submitedValues.platformId === user.platform.id) {
  55. delete submitedValues.platformId;
  56. }
  57. return submitedValues;
  58. };
  59.  
  60. export class UserInnerEditForm extends React.PureComponent {
  61. constructor(props) {
  62. super(props);
  63. }
  64. componentDidUpdate(prevProps) {
  65. if (this.props.location.pathname !== prevProps.location.pathname) {
  66. //eslint-disable-next-line
  67. this.setState({policyEdit: false});
  68. }
  69. }
  70. render() {
  71. const {
  72. user,
  73. values,
  74. errors,
  75. handleChange,
  76. handleBlur,
  77. handleSubmit,
  78. handleReset,
  79. domainId,
  80. userId,
  81. isSubmitting,
  82. deleteUserPromise,
  83. setFieldError,
  84. setFieldValue,
  85. passwordRules,
  86. dirty,
  87. initialValues,
  88. intl: {formatMessage},
  89. roles: {isSysadmin, hasRole},
  90. loggedUserEmail,
  91. } = this.props;
  92. const sameEmail = loggedUserEmail === values.email;
  93. const readOnly = !hasRole(RoleEnum.DOMAIN, 'WRITE');
  94. return (
  95. <ProtectedNavigation dirty={dirty}>
  96. <Row>
  97. <Col>
  98. <Form onSubmit={handleSubmit} onReset={handleReset}>
  99. <Card>
  100. <CardHeader>
  101. <Row>
  102. <Col xs={10} sm={8}>
  103. <h4>{values.email}</h4>
  104. <h6>
  105. <FormattedMessage
  106. id="userForm.userId"
  107. values={{userId: values.id}}
  108. />
  109. </h6>
  110. </Col>
  111. <Col xs={2} sm={4}>
  112. <span className="float-right">
  113. <span className="d-block d-sm-inline">
  114. <Checkbox
  115. title={
  116. sameEmail
  117. ? formatMessage({
  118. // eslint-disable-next-line prettier/prettier
  119. id: 'user.form.disabledTitle',
  120. // eslint-disable-next-line prettier/prettier
  121. })
  122. : undefined
  123. }
  124. disabled={readOnly || sameEmail}
  125. className={' switch switch-3d switch-primary'}
  126. >
  127. <Input
  128. id="status"
  129. type="checkbox"
  130. disabled={readOnly || sameEmail}
  131. className="switch-input"
  132. value={values.status}
  133. checked={values.status}
  134. onChange={handleChange}
  135. onBlur={handleBlur}
  136. />
  137. <span className="switch-label" />
  138. <span className="switch-handle" />
  139. </Checkbox>
  140. </span>
  141. <span className="d-block d-sm-inline">
  142. <Label htmlFor="status" className="ml-sm-2">
  143. {this.props.user.status === 'PENDING' &&
  144. !values.status ? (
  145. <FormattedMessage id="userForm.status.pending" />
  146. ) : values.status ? (
  147. <FormattedMessage id="userForm.active" />
  148. ) : (
  149. <FormattedMessage id="userFrom.inactive" />
  150. )}
  151. </Label>
  152. </span>
  153. </span>
  154. </Col>
  155. </Row>
  156. </CardHeader>
  157. <CardBody>
  158. <Row>
  159. <Col xs={12}>
  160. {values.status === true ? null : this.props.user
  161. .status === 'PENDING' ? (
  162. // eslint-disable-next-line
  163. <Alert color="warning">
  164. <FormattedMessage id="userForm.status.pendingDesc" />
  165. </Alert>
  166. ) : (
  167. <Alert color="warning">
  168. <FormattedMessage id="userForm.status.disabledDesc" />
  169. </Alert>
  170. )}
  171. </Col>
  172. </Row>
  173. <FormGroup row>
  174. <Col xs={12} sm={3}>
  175. <Label htmlFor="firstname">
  176. <FormattedMessage id="userForm.firstname" />
  177. </Label>
  178. </Col>
  179. <Col xs={12} sm={9}>
  180. <Input
  181. type="text"
  182. id="firstname"
  183. name="firstname"
  184. value={values.firstname || ''}
  185. onChange={handleChange}
  186. onBlur={handleBlur}
  187. valid={
  188. errors.firstname === undefined
  189. ? undefined
  190. : errors.firstname ? false : true
  191. }
  192. disabled={readOnly}
  193. />
  194. <FormFeedback>{errors.firstname}</FormFeedback>
  195. </Col>
  196. </FormGroup>
  197. <FormGroup row>
  198. <Col xs={12} sm={3}>
  199. <Label htmlFor="lastname">
  200. <FormattedMessage id="userForm.lastname" />
  201. </Label>
  202. </Col>
  203. <Col xs={12} sm={9}>
  204. <Input
  205. type="text"
  206. id="lastname"
  207. name="lastname"
  208. value={values.lastname || ''}
  209. onChange={handleChange}
  210. onBlur={handleBlur}
  211. valid={
  212. errors.lastname === undefined
  213. ? undefined
  214. : errors.lastname ? false : true
  215. }
  216. disabled={readOnly}
  217. required
  218. />
  219. <FormFeedback>{errors.lastname}</FormFeedback>
  220. </Col>
  221. </FormGroup>
  222. <FormGroup row>
  223. <Col xs={12} sm={3}>
  224. <Label for="language">
  225. <FormattedMessage id="profile.language" />
  226. </Label>
  227. </Col>
  228. <Col xs={12} sm={9}>
  229. <LocaleCombo
  230. id="language"
  231. valueName="language"
  232. value={values.language || ''}
  233. setFieldValue={setFieldValue}
  234. error={errors.language}
  235. disabled={readOnly}
  236. />
  237. </Col>
  238. </FormGroup>
  239. <FormGroup row>
  240. <Col xs={12} sm={3}>
  241. <Label for="platformId">
  242. <FormattedMessage id="userForm.platform" />
  243. </Label>
  244. </Col>
  245. <Col xs={12} sm={9}>
  246. <PlatformsWidget
  247. id="platformId"
  248. valueName={'platformId'}
  249. platformId={values.platformId}
  250. platform={user.platform}
  251. setFieldValue={setFieldValue}
  252. error={errors.platform}
  253. initialPlatform={initialValues.platformId}
  254. isSubmitting={isSubmitting}
  255. isEditable={!readOnly}
  256. />
  257. </Col>
  258. </FormGroup>
  259. <FormGroup row>
  260. <Col xs={12} sm={3}>
  261. <Label htmlFor={'policy'}>
  262. <FormattedMessage id="policy.form.name" />
  263. </Label>
  264. </Col>
  265. <Col xs={12} sm={9}>
  266. <PoliciesSelect
  267. valueName={'policyId'}
  268. domainId={domainId}
  269. policyId={values.policyId}
  270. setFieldValue={setFieldValue}
  271. isSubmitting={isSubmitting}
  272. isEditable={!readOnly}
  273. />
  274. </Col>
  275. </FormGroup>
  276.  
  277. <FormGroup row>
  278. <Col xs={7} sm={3}>
  279. {/* prettier-ignore */}
  280. <FormattedMessage id='userForm.senderVerify'/>
  281. </Col>
  282. <Col xs={5} sm={9}>
  283. <Label className={'switch switch-3d switch-primary'}>
  284. <Input
  285. id="senderVerifyOn"
  286. type="checkbox"
  287. className="switch-input "
  288. value={values.status}
  289. checked={values.senderVerifyOn}
  290. onChange={handleChange}
  291. onBlur={handleBlur}
  292. disabled={readOnly}
  293. />
  294. <span className="switch-label" />
  295. <span className="switch-handle" />
  296. </Label>
  297. </Col>
  298. </FormGroup>
  299. {!readOnly && (
  300. <FormGroup row>
  301. <ShowMore
  302. label={
  303. <FormattedMessage id="userForm.collapsePassword" />
  304. }
  305. >
  306. <PasswordItem
  307. id="userPwd"
  308. name="password"
  309. values={values}
  310. errors={errors}
  311. onChange={handleChange}
  312. setFieldError={setFieldError}
  313. rules={passwordRules}
  314. firstColSize={3}
  315. secondColSize={9}
  316. />
  317. </ShowMore>
  318. </FormGroup>
  319. )}
  320. </CardBody>
  321. <CardFooter>
  322. <FormFooter
  323. id="userFormFooter"
  324. isSubmitting={this.props.isSubmitting}
  325. errors={errors}
  326. dirty={dirty}
  327. // eslint-disable-next-line react/jsx-handler-names
  328. handleReset={this.props.handleReset}
  329. entityId={userId}
  330. deleteEntityPromise={deleteUserPromise}
  331. askDeleteLabel={
  332. <FormattedMessage
  333. id="userForm.delete.ask"
  334. values={{userName: this.props.values.email}}
  335. />
  336. }
  337. canDelete={isSysadmin}
  338. canSubmit={!readOnly}
  339. disabledDelete={sameEmail}
  340. disabledDeleteMessage={formatMessage({
  341. id: 'domain.form.disabledDelete',
  342. })}
  343. />
  344. </CardFooter>
  345. </Card>
  346. </Form>
  347. </Col>
  348. </Row>
  349. </ProtectedNavigation>
  350. );
  351. }
  352. }
  353.  
  354. UserInnerEditForm.propTypes = {
  355. dirty: PropTypes.bool,
  356. location: PropTypes.shape({
  357. pathname: PropTypes.string,
  358. }),
  359. values: PropTypes.shape({
  360. email: PropTypes.string,
  361. firstname: PropTypes.string,
  362. lastname: PropTypes.string,
  363. }),
  364. errors: PropTypes.object,
  365. domainId: PropTypes.string,
  366. touched: PropTypes.oneOfType([PropTypes.bool, PropTypes.object]),
  367. handleChange: PropTypes.func,
  368. handleBlur: PropTypes.func,
  369. handleSubmit: PropTypes.func,
  370. handleReset: PropTypes.func,
  371. isSubmitting: PropTypes.bool,
  372. initialValues: PropTypes.object,
  373. deleteUserPromise: PropTypes.func.isRequired,
  374. fetchUserPromise: PropTypes.func.isRequired,
  375. patchUserPromise: PropTypes.func.isRequired,
  376. userId: PropTypes.string,
  377. setFieldValue: PropTypes.func,
  378. setFieldError: PropTypes.func,
  379. passwordRules: PropTypes.shape({
  380. count: PropTypes.number,
  381. digit: PropTypes.number,
  382. uppercase: PropTypes.number,
  383. lowercase: PropTypes.number,
  384. }),
  385. user: PropTypes.shape({
  386. id: PropTypes.string,
  387. status: PropTypes.string,
  388. }),
  389. intl: PropTypes.shape({
  390. formatMessage: PropTypes.func,
  391. }),
  392. loggedUserEmail: PropTypes.string,
  393. roles: PropTypes.shape({
  394. isSysadmin: PropTypes.bool,
  395. hasRole: PropTypes.func,
  396. }),
  397. };
  398.  
  399. const UserEditForm = withFormik({
  400. mapPropsToValues: (props) => {
  401. const statusValue = props.user.status === 'ENABLED' ? true : false;
  402. return {
  403. id: props.user.id,
  404. email: props.user.email,
  405. firstname: props.user.firstname,
  406. lastname: props.user.lastname,
  407. language: props.user.language,
  408. senderVerifyOn: props.user.senderVerifyOn,
  409. password: '',
  410. status: statusValue,
  411. policyId: props.user.policy.id,
  412. platformId: props.user.platform.id,
  413. };
  414. },
  415. validate: (values, props) => {
  416. const errors = {};
  417. let errorMessage = <FormattedMessage id="form.required" />;
  418. if (!values.firstname || !values.firstname.trim()) {
  419. errors.firstname = errorMessage;
  420. }
  421. if (!values.lastname || !values.lastname.trim()) {
  422. errors.lastname = errorMessage;
  423. }
  424. return errors;
  425. },
  426.  
  427. handleSubmit: (values, bag) => {
  428. const {props, setSubmitting} = bag;
  429. const {userId} = props;
  430. const patchPromise =
  431. props.loggedUserEmail === values.email
  432. ? props.patchAdminPromise
  433. : props.patchUserPromise;
  434. const submitedValues = cleanSubmitDatas(values, props.user);
  435. // const submitedValues = values;
  436. return patchPromise({userId, values: submitedValues})
  437. .then((res) => {
  438. return props.fetchUserPromise({userId, values});
  439. })
  440. .then((res) => {
  441. toast.success(<FormattedMessage id="form.savedSuccesfully" />, {
  442. autoClose: 5000,
  443. });
  444. })
  445. .catch((error) => {
  446. const errMsg = (
  447. <FormattedMessage id="form.savedError" values={{error: error}} />
  448. );
  449. toast.error(errMsg, {autoClose: false});
  450. setSubmitting(false);
  451. });
  452. },
  453.  
  454. displayName: 'UserEditForm',
  455. enableReinitialize: true,
  456. })(UserInnerEditForm);
  457.  
  458. export default compose(withRouter, injectIntl, injectRoles)(UserEditForm);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement