10
10
import { i18next } from "@translations/invenio_communities/i18next" ;
11
11
import { CommunitySettingsForm } from "..//components/CommunitySettingsForm" ;
12
12
import _get from "lodash/get" ;
13
+ import _isEmpty from "lodash/isEmpty" ;
13
14
import { useField } from "formik" ;
14
15
import React , { Component } from "react" ;
15
16
import { RadioField } from "react-invenio-forms" ;
@@ -18,17 +19,31 @@ import PropTypes from "prop-types";
18
19
19
20
const VisibilityField = ( { label, formConfig, ...props } ) => {
20
21
const [ field ] = useField ( props ) ;
22
+ const fieldPath = "access.visibility" ;
23
+
24
+ function createHandleChange ( radioValue ) {
25
+ function handleChange ( { event, data, formikProps } ) {
26
+ formikProps . form . setFieldValue ( fieldPath , radioValue ) ;
27
+ // dependent fields
28
+ if ( radioValue === "restricted" ) {
29
+ formikProps . form . setFieldValue ( "access.member_policy" , "closed" ) ;
30
+ }
31
+ }
32
+ return handleChange ;
33
+ }
34
+
21
35
return (
22
36
< >
23
37
{ formConfig . access . visibility . map ( ( item ) => (
24
38
< React . Fragment key = { item . value } >
25
39
< RadioField
26
40
key = { item . value }
27
- fieldPath = "access.visibility"
41
+ fieldPath = { fieldPath }
28
42
label = { item . text }
29
43
labelIcon = { item . icon }
30
- checked = { _get ( field . value , "access.visibility" ) === item . value }
44
+ checked = { _get ( field . value , fieldPath ) === item . value }
31
45
value = { item . value }
46
+ onChange = { createHandleChange ( item . value ) }
32
47
/>
33
48
< label className = "helptext" > { item . helpText } </ label >
34
49
</ React . Fragment >
@@ -76,14 +91,47 @@ MembersVisibilityField.defaultProps = {
76
91
label : "" ,
77
92
} ;
78
93
94
+ const MemberPolicyField = ( { label, formConfig, ...props } ) => {
95
+ const [ field ] = useField ( props ) ;
96
+ const isDisabled = _get ( field . value , "access.visibility" ) === "restricted" ;
97
+
98
+ return (
99
+ < >
100
+ { formConfig . access . member_policy . map ( ( item ) => (
101
+ < React . Fragment key = { item . value } >
102
+ < RadioField
103
+ key = { item . value }
104
+ fieldPath = "access.member_policy"
105
+ label = { item . text }
106
+ labelIcon = { item . icon }
107
+ checked = { item . value === _get ( field . value , "access.member_policy" ) }
108
+ value = { item . value }
109
+ disabled = { isDisabled }
110
+ />
111
+ < label className = "helptext" > { item . helpText } </ label >
112
+ </ React . Fragment >
113
+ ) ) }
114
+ </ >
115
+ ) ;
116
+ } ;
117
+
118
+ MemberPolicyField . propTypes = {
119
+ label : PropTypes . string ,
120
+ formConfig : PropTypes . object . isRequired ,
121
+ } ;
122
+
123
+ MemberPolicyField . defaultProps = {
124
+ label : "" ,
125
+ } ;
126
+
79
127
class CommunityPrivilegesForm extends Component {
80
128
getInitialValues = ( ) => {
81
129
return {
82
130
access : {
83
131
visibility : "public" ,
84
132
members_visibility : "public" ,
133
+ member_policy : "closed" ,
85
134
// TODO: Re-enable once properly integrated to be displayed
86
- // member_policy: "open",
87
135
// record_policy: "open",
88
136
} ,
89
137
} ;
@@ -105,6 +153,7 @@ class CommunityPrivilegesForm extends Component {
105
153
</ Header . Subheader >
106
154
</ Header >
107
155
< VisibilityField formConfig = { formConfig } />
156
+
108
157
< Header as = "h2" size = "small" >
109
158
{ i18next . t ( "Members visibility" ) }
110
159
< Header . Subheader className = "mt-5" >
@@ -114,6 +163,19 @@ class CommunityPrivilegesForm extends Component {
114
163
</ Header . Subheader >
115
164
</ Header >
116
165
< MembersVisibilityField formConfig = { formConfig } />
166
+
167
+ { ! _isEmpty ( formConfig . access . member_policy ) && (
168
+ < >
169
+ < Header as = "h2" size = "small" >
170
+ { i18next . t ( "Membership Policy" ) }
171
+ < Header . Subheader className = "mt-5" >
172
+ { i18next . t ( "Controls if anyone can request to join your community." ) }
173
+ </ Header . Subheader >
174
+ </ Header >
175
+ < MemberPolicyField formConfig = { formConfig } />
176
+ </ >
177
+ ) }
178
+
117
179
{ /* TODO: Re-enable once properly integrated to be displayed */ }
118
180
{ /*
119
181
<Grid.Column width={6}>
0 commit comments