UserGroupForm.tsx 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. import React, { FC, useCallback, useState } from 'react';
  2. import dateFnsFormat from 'date-fns/format';
  3. import { useTranslation } from 'next-i18next';
  4. import { IUserGroupHasId } from '~/interfaces/user';
  5. type Props = {
  6. userGroup: IUserGroupHasId,
  7. selectableParentUserGroups?: IUserGroupHasId[],
  8. submitButtonLabel: string;
  9. onSubmit?: (targetGroup: IUserGroupHasId, userGroupData: Partial<IUserGroupHasId>) => Promise<void> | void
  10. };
  11. export const UserGroupForm: FC<Props> = (props: Props) => {
  12. const { t } = useTranslation('admin');
  13. const {
  14. userGroup, selectableParentUserGroups, submitButtonLabel, onSubmit,
  15. } = props;
  16. /*
  17. * State
  18. */
  19. const [currentName, setName] = useState(userGroup != null ? userGroup.name : '');
  20. const [currentDescription, setDescription] = useState(userGroup != null ? userGroup.description : '');
  21. const [selectedParent, setSelectedParent] = useState<IUserGroupHasId | undefined>(userGroup?.parent as IUserGroupHasId);
  22. /*
  23. * Function
  24. */
  25. const onChangeNameHandler = useCallback((e) => {
  26. setName(e.target.value);
  27. }, []);
  28. const onChangeDescriptionHandler = useCallback((e) => {
  29. setDescription(e.target.value);
  30. }, []);
  31. const onChangeParerentButtonHandler = useCallback((userGroup: IUserGroupHasId) => {
  32. if (userGroup._id !== selectedParent?._id) {
  33. setSelectedParent(userGroup);
  34. }
  35. }, [selectedParent, setSelectedParent]);
  36. return (
  37. <form onSubmit={(e) => {
  38. e.preventDefault();
  39. onSubmit?.(props.userGroup, {
  40. name: currentName,
  41. description: currentDescription,
  42. parent: selectedParent,
  43. });
  44. }}
  45. >
  46. <fieldset>
  47. <h2 className="admin-setting-header">{t('user_group_management.basic_info')}</h2>
  48. {
  49. userGroup?.createdAt != null && (
  50. <div className="form-group row">
  51. <p className="col-md-2 col-form-label">{t('Created')}</p>
  52. <p className="col-md-4 my-auto">{dateFnsFormat(new Date(userGroup.createdAt), 'yyyy-MM-dd')}</p>
  53. </div>
  54. )
  55. }
  56. <div className="form-group row">
  57. <label htmlFor="name" className="col-md-2 col-form-label">
  58. {t('user_group_management.group_name')}
  59. </label>
  60. <div className="col-md-4">
  61. <input
  62. className="form-control"
  63. type="text"
  64. name="name"
  65. placeholder={t('user_group_management.group_example')}
  66. value={currentName}
  67. onChange={onChangeNameHandler}
  68. required
  69. />
  70. </div>
  71. </div>
  72. <div className="form-group row">
  73. <label htmlFor="description" className="col-md-2 col-form-label">
  74. {t('Description')}
  75. </label>
  76. <div className="col-md-4">
  77. <textarea className="form-control" name="description" value={currentDescription} onChange={onChangeDescriptionHandler} />
  78. </div>
  79. </div>
  80. <div className="form-group row">
  81. <label htmlFor="parent" className="col-md-2 col-form-label">
  82. {t('user_group_management.parent_group')}
  83. </label>
  84. <div className="dropdown col-md-4">
  85. <button
  86. type="button"
  87. id="dropdownMenuButton"
  88. data-toggle="dropdown"
  89. className={`
  90. btn btn-outline-secondary dropdown-toggle mb-3 ${selectableParentUserGroups != null && selectableParentUserGroups.length > 0 ? '' : 'disabled'}
  91. `}
  92. >
  93. {selectedParent?.name ?? t('user_group_management.select_parent_group')}
  94. </button>
  95. <div className="dropdown-menu" aria-labelledby="dropdownMenuButton">
  96. {
  97. (selectableParentUserGroups != null && selectableParentUserGroups.length > 0) && (
  98. <>
  99. {
  100. selectableParentUserGroups.map(userGroup => (
  101. <button
  102. key={userGroup._id}
  103. type="button"
  104. className={`dropdown-item ${selectedParent?._id === userGroup._id ? 'active' : ''}`}
  105. onClick={() => onChangeParerentButtonHandler(userGroup)}
  106. >
  107. {userGroup.name}
  108. </button>
  109. ))
  110. }
  111. </>
  112. )
  113. }
  114. <div className="dropdown-divider" />
  115. <button
  116. className="dropdown-item"
  117. type="button"
  118. onClick={() => { setSelectedParent(undefined) }}
  119. >{t('user_group_management.release_parent_group')}
  120. </button>
  121. </div>
  122. </div>
  123. </div>
  124. <div className="form-group row">
  125. <div className="offset-md-2 col-md-10">
  126. <button type="submit" className="btn btn-primary">
  127. {submitButtonLabel}
  128. </button>
  129. </div>
  130. </div>
  131. </fieldset>
  132. </form>
  133. );
  134. };