UserGroupModal.tsx 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import React, {
  2. FC, useState, useEffect, useCallback,
  3. } from 'react';
  4. import { Ref } from '@growi/core';
  5. import { TFunctionResult } from 'i18next';
  6. import { useTranslation } from 'next-i18next';
  7. import {
  8. Modal, ModalHeader, ModalBody, ModalFooter,
  9. } from 'reactstrap';
  10. import { IUserGroup, IUserGroupHasId } from '~/interfaces/user';
  11. type Props = {
  12. userGroup?: IUserGroupHasId,
  13. buttonLabel?: TFunctionResult,
  14. onClickSubmit?: (userGroupData: Partial<IUserGroupHasId>) => Promise<IUserGroupHasId | void>
  15. isShow?: boolean
  16. onHide?: () => Promise<void> | void
  17. };
  18. export const UserGroupModal: FC<Props> = (props: Props) => {
  19. const { t } = useTranslation('admin');
  20. const {
  21. userGroup, buttonLabel, onClickSubmit, isShow, onHide,
  22. } = props;
  23. /*
  24. * State
  25. */
  26. const [currentName, setName] = useState('');
  27. const [currentDescription, setDescription] = useState('');
  28. const [currentParent, setParent] = useState<Ref<IUserGroup> | null>(null);
  29. /*
  30. * Function
  31. */
  32. const onChangeNameHandler = useCallback((e) => {
  33. setName(e.target.value);
  34. }, []);
  35. const onChangeDescriptionHandler = useCallback((e) => {
  36. setDescription(e.target.value);
  37. }, []);
  38. const onSubmitHandler = useCallback(async(e) => {
  39. e.preventDefault(); // no reload
  40. if (onClickSubmit == null) {
  41. return;
  42. }
  43. await onClickSubmit({
  44. _id: userGroup?._id,
  45. name: currentName,
  46. description: currentDescription,
  47. parent: currentParent,
  48. });
  49. }, [userGroup, currentName, currentDescription, currentParent, onClickSubmit]);
  50. // componentDidMount
  51. useEffect(() => {
  52. if (userGroup != null) {
  53. setName(userGroup.name);
  54. setDescription(userGroup.description);
  55. setParent(userGroup.parent);
  56. }
  57. }, [userGroup]);
  58. return (
  59. <Modal className="modal-md" isOpen={isShow} toggle={onHide}>
  60. <form onSubmit={onSubmitHandler}>
  61. <ModalHeader tag="h4" toggle={onHide} className="bg-primary text-light">
  62. {t('user_group_management.basic_info')}
  63. </ModalHeader>
  64. <ModalBody>
  65. <div className="form-group">
  66. <label htmlFor="name">
  67. {t('user_group_management.group_name')}
  68. </label>
  69. <input
  70. className="form-control"
  71. type="text"
  72. name="name"
  73. placeholder={t('user_group_management.group_example')}
  74. value={currentName}
  75. onChange={onChangeNameHandler}
  76. required
  77. />
  78. </div>
  79. <div className="form-group">
  80. <label htmlFor="description">
  81. {t('Description')}
  82. </label>
  83. <textarea className="form-control" name="description" value={currentDescription} onChange={onChangeDescriptionHandler} />
  84. </div>
  85. {/* TODO 90732: Add a drop-down to show selectable parents */}
  86. {/* TODO 85462: Add a note that "if you change the parent, the offspring will also be moved together */}
  87. </ModalBody>
  88. <ModalFooter>
  89. <div className="form-group">
  90. <button type="submit" className="btn btn-primary">
  91. {buttonLabel}
  92. </button>
  93. </div>
  94. </ModalFooter>
  95. </form>
  96. </Modal>
  97. );
  98. };