11import React , { PureComponent , ReactNode } from 'react' ;
2+ import { List } from 'immutable' ;
23
34import { HelpLink , URL_ENCODING_TOPIC } from '../../util/helpLinks' ;
45
@@ -9,15 +10,16 @@ import { ONTOLOGY_MODULE_NAME } from '../ontology/actions';
910import { hasModule } from '../../app/utils' ;
1011
1112import { isFieldFullyLocked } from './propertiesUtil' ;
12- import { createFormInputId , createFormInputName } from './utils' ;
13+ import { createFormInputId , createFormInputName , isEmptyString } from './utils' ;
1314import {
1415 DOMAIN_FIELD_DESCRIPTION ,
1516 DOMAIN_FIELD_IMPORTALIASES ,
1617 DOMAIN_FIELD_LABEL ,
1718 DOMAIN_FIELD_ONTOLOGY_PRINCIPAL_CONCEPT ,
1819 DOMAIN_FIELD_URL ,
20+ DOMAIN_FIELD_URL_TARGET ,
1921} from './constants' ;
20- import { DomainField , IDomainFormDisplayOptions } from './models' ;
22+ import { DomainField , IDomainFormDisplayOptions , IFieldChange } from './models' ;
2123import { SectionHeading } from './SectionHeading' ;
2224import { DomainFieldLabel } from './DomainFieldLabel' ;
2325
@@ -28,6 +30,7 @@ interface NameAndLinkingProps {
2830 field : DomainField ;
2931 index : number ;
3032 onChange : ( string , any ) => void ;
33+ onMultiChange : ( changes : List < IFieldChange > ) => void ;
3134}
3235
3336export class NameAndLinkingOptions extends PureComponent < NameAndLinkingProps > {
@@ -36,7 +39,30 @@ export class NameAndLinkingOptions extends PureComponent<NameAndLinkingProps> {
3639 } ;
3740
3841 onChange = ( id : string , value : any ) : void => {
39- this . props ?. onChange ( id , value ) ;
42+ this . props . onChange ( id , value ) ;
43+ } ;
44+
45+ handleURLChange = ( evt : any ) : void => {
46+ const { index, domainIndex } = this . props ;
47+ const val = evt . target . value ;
48+ const isEmpty = isEmptyString ( val ) ;
49+
50+ // make sure to uncheck the "open in new tab" option if URL is cleared out
51+ if ( isEmpty ) {
52+ let changes = List < IFieldChange > ( ) ;
53+ changes = changes . push ( { id : evt . target . id , value : null } ) ;
54+ changes = changes . push ( {
55+ id : createFormInputId ( DOMAIN_FIELD_URL_TARGET , domainIndex , index ) ,
56+ value : false ,
57+ } ) ;
58+ this . props . onMultiChange ( changes ) ;
59+ } else {
60+ this . onChange ( evt . target . id , isEmpty ? null : val ) ;
61+ }
62+ } ;
63+
64+ handleURLTargetChange = ( evt : any ) : void => {
65+ this . onChange ( evt . target . id , evt . target . checked ) ;
4066 } ;
4167
4268 getImportAliasHelpText = ( ) : ReactNode => {
@@ -70,78 +96,91 @@ export class NameAndLinkingOptions extends PureComponent<NameAndLinkingProps> {
7096 < div >
7197 < div className = "row" >
7298 < div className = "col-xs-12" >
73- < SectionHeading title = "Name and Linking Options" cls = "domain-field-section-hdr" />
99+ < SectionHeading cls = "domain-field-section-hdr" title = "Name and Linking Options " />
74100 </ div >
75101 </ div >
76102 < div className = "row" >
77103 < div className = "col-xs-5" >
78104 < div className = "domain-field-label" > Description</ div >
79105 < textarea
80106 className = "form-control"
81- rows = { 4 }
82- value = { field . description || '' }
107+ disabled = { isFieldFullyLocked ( field . lockType ) }
83108 id = { createFormInputId ( DOMAIN_FIELD_DESCRIPTION , domainIndex , index ) }
84109 name = { createFormInputName ( DOMAIN_FIELD_DESCRIPTION ) }
85110 onChange = { this . handleChange }
86- disabled = { isFieldFullyLocked ( field . lockType ) }
111+ rows = { 4 }
112+ value = { field . description || '' }
87113 />
88114 </ div >
89115 < div className = "col-xs-3" >
90116 < div className = "domain-field-label" > Label</ div >
91117 < input
92118 className = "form-control"
93- type = "text"
94- value = { field . label || '' }
119+ disabled = { isFieldFullyLocked ( field . lockType ) }
95120 id = { createFormInputId ( DOMAIN_FIELD_LABEL , domainIndex , index ) }
96121 name = { createFormInputName ( DOMAIN_FIELD_LABEL ) }
97122 onChange = { this . handleChange }
98- disabled = { isFieldFullyLocked ( field . lockType ) }
123+ type = "text"
124+ value = { field . label || '' }
99125 />
100126 { ! field . isUniqueIdField ( ) &&
101127 ! field . isCalculatedField ( ) &&
102128 ! domainFormDisplayOptions ?. hideImportAliases && (
103129 < >
104130 < div className = "domain-field-label" >
105131 < DomainFieldLabel
106- label = "Import Aliases"
107132 helpTipBody = { this . getImportAliasHelpText ( ) }
133+ label = "Import Aliases"
108134 />
109135 </ div >
110136 < input
111137 className = "form-control"
112- type = "text"
113- value = { field . importAliases || '' }
138+ disabled = { isFieldFullyLocked ( field . lockType ) }
114139 id = { createFormInputId ( DOMAIN_FIELD_IMPORTALIASES , domainIndex , index ) }
115140 name = { createFormInputName ( DOMAIN_FIELD_IMPORTALIASES ) }
116141 onChange = { this . handleChange }
117- disabled = { isFieldFullyLocked ( field . lockType ) }
142+ type = "text"
143+ value = { field . importAliases || '' }
118144 />
119145 </ >
120146 ) }
121147 </ div >
122148 < div className = "col-xs-4" >
123- < div className = "domain-field-label" >
124- < DomainFieldLabel label = "URL" helpTipBody = { this . getURLHelpText ( ) } />
125- </ div >
126- < input
127- className = "form-control"
128- type = "text"
129- value = { field . URL || '' }
130- id = { createFormInputId ( DOMAIN_FIELD_URL , domainIndex , index ) }
131- name = { createFormInputName ( DOMAIN_FIELD_URL ) }
132- onChange = { this . handleChange }
133- disabled = { isFieldFullyLocked ( field . lockType ) }
134- />
135149 { ! appPropertiesOnly &&
136150 hasModule ( ONTOLOGY_MODULE_NAME ) &&
137151 ! field . isUniqueIdField ( ) &&
138152 ! field . isCalculatedField ( ) && (
139153 < OntologyConceptAnnotation
140- id = { createFormInputId ( DOMAIN_FIELD_ONTOLOGY_PRINCIPAL_CONCEPT , domainIndex , index ) }
141154 field = { field }
155+ id = { createFormInputId ( DOMAIN_FIELD_ONTOLOGY_PRINCIPAL_CONCEPT , domainIndex , index ) }
142156 onChange = { this . onChange }
143157 />
144158 ) }
159+ < div className = "domain-field-label" >
160+ < DomainFieldLabel helpTipBody = { this . getURLHelpText ( ) } label = "URL" />
161+ </ div >
162+ < input
163+ className = "form-control"
164+ disabled = { isFieldFullyLocked ( field . lockType ) }
165+ id = { createFormInputId ( DOMAIN_FIELD_URL , domainIndex , index ) }
166+ name = { createFormInputName ( DOMAIN_FIELD_URL ) }
167+ onChange = { this . handleURLChange }
168+ type = "text"
169+ value = { field . URL || '' }
170+ />
171+ { /*GitHub Issue 503: Field editor URL option to set target window (i.e. _blank)*/ }
172+ < div className = "domain-text-options-col" >
173+ < input
174+ checked = { field . isTargetBlank }
175+ className = "form-control domain-text-option-istargetblank"
176+ disabled = { isFieldFullyLocked ( field . lockType ) || isEmptyString ( field . URL ) }
177+ id = { createFormInputId ( DOMAIN_FIELD_URL_TARGET , domainIndex , index ) }
178+ name = { createFormInputName ( DOMAIN_FIELD_URL_TARGET ) }
179+ onChange = { this . handleURLTargetChange }
180+ type = "checkbox"
181+ />
182+ < span > Open links in a new tab</ span >
183+ </ div >
145184 </ div >
146185 </ div >
147186 </ div >
0 commit comments