Skip to content

Commit df6e622

Browse files
obfromeviTimotheeHrl
authored andcommitted
LUT-27671 : no deletion of fields already filled in and deactivation
1 parent bd2b0ca commit df6e622

File tree

5 files changed

+101
-82
lines changed

5 files changed

+101
-82
lines changed

src/java/fr/paris/lutece/plugins/forms/service/FormService.java

Lines changed: 59 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,11 @@
4141
import javax.servlet.http.HttpServletRequest;
4242

4343
import org.apache.commons.collections.CollectionUtils;
44+
import org.apache.commons.lang3.StringUtils;
4445
import org.springframework.transaction.annotation.Transactional;
4546

4647
import fr.paris.lutece.api.user.User;
48+
import fr.paris.lutece.plugins.forms.business.CompositeDisplayType;
4749
import fr.paris.lutece.plugins.forms.business.Form;
4850
import fr.paris.lutece.plugins.forms.business.FormDisplay;
4951
import fr.paris.lutece.plugins.forms.business.FormHome;
@@ -608,21 +610,68 @@ public void saveOrUpdateField( Entry entry, String fieldName, String title, Stri
608610
}
609611

610612
/**
611-
* Get the responses which verify the filter
613+
* Check if responses exist for a composite (question or group of questions)
614+
*
615+
* @param formDisplay
616+
* the form display
617+
* @param nIdEntry
618+
* the entry id
619+
* @return true if responses exist, false otherwise
620+
*/
621+
public boolean existCompositeResponses( FormDisplay formDisplay, int nIdEntry )
622+
{
623+
boolean existCompositeResponses = false;
624+
625+
if ( CollectionUtils.isEmpty( FormResponseHome.selectAllFormResponsesUncompleteByIdForm( formDisplay.getFormId( ) ) ) )
626+
{
627+
return false;
628+
}
629+
630+
if ( CompositeDisplayType.GROUP.getLabel( ).equalsIgnoreCase( formDisplay.getCompositeType( ) ) )
631+
{
632+
List<Question> questionsList = new ArrayList<>( );
633+
ICompositeDisplay composite = formDisplayToComposite( formDisplay, null, 0 );
634+
composite.addQuestions( questionsList );
635+
636+
if ( CollectionUtils.isNotEmpty( questionsList ) )
637+
{
638+
List<Integer> idEntryList = questionsList.stream( ).map( Question::getIdEntry ).collect( Collectors.toList( ) );
639+
ResponseFilter responsefilter = new ResponseFilter( );
640+
responsefilter.setListIdEntry( idEntryList );
641+
642+
existCompositeResponses = existsFilledResponse( responsefilter );
643+
}
644+
}
645+
else if ( CompositeDisplayType.QUESTION.getLabel( ).equalsIgnoreCase( formDisplay.getCompositeType( ) ) && nIdEntry > 0 )
646+
{
647+
ResponseFilter responsefilter = new ResponseFilter( );
648+
responsefilter.setIdEntry( nIdEntry );
649+
650+
existCompositeResponses = existsFilledResponse( responsefilter );
651+
}
652+
653+
return existCompositeResponses;
654+
}
655+
656+
/**
657+
* Check if any response value filled exists for a question
612658
*
613659
* @param responseFilter
614-
* the filter
615-
* @return the list of responses
660+
* the response filter
661+
* @return true if a response filled exist, false otherwise
616662
*/
617-
public List<Response> getResponseList( ResponseFilter responseFilter )
663+
private boolean existsFilledResponse( ResponseFilter responseFilter )
618664
{
619-
List<Response> responseList = new ArrayList<>( );
665+
boolean existsFilledResponse = false ;
620666

621-
if ( responseFilter != null )
622-
{
623-
responseList = ResponseHome.getResponseList( responseFilter );
624-
}
667+
List<Response> responseList = ResponseHome.getResponseList( responseFilter );
668+
669+
if ( CollectionUtils.isNotEmpty( responseList )
670+
&& responseList.stream( ).anyMatch( response -> StringUtils.isNotBlank( response.getResponseValue( ) ) ) )
671+
{
672+
existsFilledResponse = true;
673+
}
625674

626-
return responseList;
675+
return existsFilledResponse;
627676
}
628677
}

src/java/fr/paris/lutece/plugins/forms/web/CompositeQuestionDisplay.java

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ public String getCompositeHtml( HttpServletRequest request, List<FormQuestionRes
203203

204204
IEntryDisplayService displayService = EntryServiceManager.getInstance( ).getEntryDisplayService( entry.getEntryType( ) );
205205

206-
if ( displayService != null && isCompositeEnabled( entry, listFormQuestionResponse, displayType ) )
206+
if ( displayService != null && isQuestionEnabled( entry, listFormQuestionResponse, displayType ) )
207207
{
208208
List<Response> listResponse = findResponses( listFormQuestionResponse );
209209
setQuestionVisibility( listResponse, displayType );
@@ -284,31 +284,49 @@ public String getCompositeHtml( HttpServletRequest request, List<FormQuestionRes
284284
return strQuestionTemplate;
285285
}
286286

287-
private boolean isCompositeEnabled( Entry entry, List<FormQuestionResponse> listFormQuestionResponse, DisplayType displayType )
287+
/**
288+
* Check if the question is enabled so that it can be displayed in the form
289+
*
290+
* @param entry
291+
* the entry
292+
* @param listFormQuestionResponse
293+
* the list of form question responses
294+
* @param displayType
295+
* the display type
296+
* @return true if the question is enabled, false otherwise
297+
*/
298+
private boolean isQuestionEnabled( Entry entry, List<FormQuestionResponse> listFormQuestionResponse, DisplayType displayType )
288299
{
289-
boolean isCompositeEnabled = true;
300+
boolean isQuestionEnabled = true;
290301
Field disabledField = entry.getFieldByCode( IEntryTypeService.FIELD_DISABLED );
291302

292303
if ( disabledField != null && Boolean.parseBoolean( disabledField.getValue( ) ) )
293304
{
294305
switch( displayType.getMode( ) )
295306
{
296307
case EDITION:
297-
isCompositeEnabled = false;
308+
isQuestionEnabled = false;
298309
break;
299310
case READONLY:
300-
isCompositeEnabled = isResponseValueExiste( listFormQuestionResponse );
311+
isQuestionEnabled = existsResponseFilled( listFormQuestionResponse );
301312
break;
302313
default: // Nothing to do
303314
}
304315
}
305316

306-
return isCompositeEnabled;
317+
return isQuestionEnabled;
307318
}
308319

309-
private boolean isResponseValueExiste( List<FormQuestionResponse> listFormQuestionResponse )
320+
/**
321+
* Check if a response value filled exists to a question
322+
*
323+
* @param listFormQuestionResponse
324+
* the list of form question responses
325+
* @return true if a response value filled exists, false otherwise
326+
*/
327+
private boolean existsResponseFilled( List<FormQuestionResponse> listFormQuestionResponse )
310328
{
311-
boolean isResponseValueExiste = false;
329+
boolean existsResponseFilled = false;
312330

313331
if ( CollectionUtils.isNotEmpty( listFormQuestionResponse ) )
314332
{
@@ -317,11 +335,11 @@ private boolean isResponseValueExiste( List<FormQuestionResponse> listFormQuesti
317335
if ( CollectionUtils.isNotEmpty( listResponse )
318336
&& listResponse.stream( ).anyMatch( response -> StringUtils.isNotBlank( response.getResponseValue( ) ) ) )
319337
{
320-
isResponseValueExiste = true;
338+
existsResponseFilled = true;
321339
}
322340
}
323341

324-
return isResponseValueExiste;
342+
return existsResponseFilled;
325343
}
326344

327345
/**

src/java/fr/paris/lutece/plugins/forms/web/admin/AbstractFormQuestionJspBean.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ public abstract class AbstractFormQuestionJspBean extends AbstractJspBean
9797
protected static final String ACTION_MODIFY_GROUP = "modifyGroup";
9898
protected static final String ACTION_DUPLICATE_QUESTION = "duplicateQuestion";
9999
protected static final String ACTION_SAVE_QUESTION = "saveQuestion";
100-
protected static final String ACTION_MODIFY_FIELD_DISABLED = "modifyFieldDisabled";
100+
protected static final String ACTION_DISABLE_QUESTION = "disableQuestion";
101101

102102
// Views
103103
protected static final String VIEW_CREATE_GROUP = "createGroup";

src/java/fr/paris/lutece/plugins/forms/web/admin/FormQuestionJspBean.java

Lines changed: 9 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,6 @@
6969
import fr.paris.lutece.plugins.genericattributes.business.EntryHome;
7070
import fr.paris.lutece.plugins.genericattributes.business.Field;
7171
import fr.paris.lutece.plugins.genericattributes.business.FieldHome;
72-
import fr.paris.lutece.plugins.genericattributes.business.Response;
73-
import fr.paris.lutece.plugins.genericattributes.business.ResponseFilter;
7472
import fr.paris.lutece.plugins.genericattributes.service.entrytype.EntryTypeServiceManager;
7573
import fr.paris.lutece.plugins.genericattributes.service.entrytype.IEntryTypeService;
7674
import fr.paris.lutece.portal.service.admin.AccessDeniedException;
@@ -126,7 +124,7 @@ public class FormQuestionJspBean extends AbstractFormQuestionJspBean
126124

127125
// Markers
128126
private static final String MARK_FIELDS_LIST_BY_ID_ENTRIES = "fields_list_by_id_entries";
129-
private static final String MARK_ID_QUESTION_ENTRY_MAP = "idQuestionEntryMap";
127+
private static final String MARK_QUESTION_ENTRY_MAP = "questionEntryMap";
130128

131129
// Constants
132130
private static final String PUBLIC_IMAGE_RESOURCE = "public_image_resource";
@@ -168,7 +166,7 @@ public String getManageQuestions( HttpServletRequest request )
168166
model.put( FormsConstants.MARK_ENTRY_TYPE_REF_LIST, FormsEntryUtils.initListEntryType( ) );
169167
model.put( FormsConstants.MARK_ID_PARENT, _nIdParentSelected );
170168
model.put( SecurityTokenService.MARK_TOKEN, SecurityTokenService.getInstance( ).getToken( request, ACTION_SAVE_QUESTION ) );
171-
model.put( MARK_ID_QUESTION_ENTRY_MAP, getIdQuestionEntryMap( listICompositeDisplay ) );
169+
model.put( MARK_QUESTION_ENTRY_MAP, getQuestionEntryMap( listICompositeDisplay ) );
172170

173171
setPageTitleProperty( StringUtils.EMPTY );
174172
HtmlTemplate templateList = AppTemplateService.getTemplate( TEMPLATE_MANAGE_QUESTIONS, locale, model );
@@ -568,7 +566,7 @@ public String getConfirmRemoveComposite( HttpServletRequest request )
568566
_formDisplay = FormDisplayHome.findByPrimaryKey( nIdDisplay );
569567
}
570568

571-
if ( isCompositeHasResponses( nIdEntry ) )
569+
if ( _formService.existCompositeResponses( _formDisplay, nIdEntry ) )
572570
{
573571
boolean bIsQuestion = CompositeDisplayType.QUESTION.getLabel( ).equalsIgnoreCase( _formDisplay.getCompositeType( ) );
574572
String strMessage = bIsQuestion ? MESSAGE_CANT_REMOVE_ENTRY_RESOURCES_ATTACHED : MESSAGE_CANT_REMOVE_GROUP_RESOURCES_ATTACHED;
@@ -587,51 +585,6 @@ public String getConfirmRemoveComposite( HttpServletRequest request )
587585

588586
return redirect( request, strMessageUrl );
589587
}
590-
591-
private boolean isCompositeHasResponses( int nIdEntry )
592-
{
593-
boolean isCompositeHasResponses = false ;
594-
595-
if ( CompositeDisplayType.QUESTION.getLabel( ).equalsIgnoreCase( _formDisplay.getCompositeType( ) ) && nIdEntry > 0 )
596-
{
597-
ResponseFilter responsefilter = new ResponseFilter( );
598-
responsefilter.setIdEntry( nIdEntry );
599-
600-
isCompositeHasResponses = isExisteQuestionFilled( responsefilter );
601-
}
602-
else if ( CompositeDisplayType.GROUP.getLabel( ).equalsIgnoreCase( _formDisplay.getCompositeType( ) ) )
603-
{
604-
List<Question> questionsList = new ArrayList<>( );
605-
ICompositeDisplay composite = _formService.formDisplayToComposite( _formDisplay, null, 0 );
606-
composite.addQuestions( questionsList );
607-
608-
if ( CollectionUtils.isNotEmpty( questionsList ) )
609-
{
610-
List<Integer> idEntryList = questionsList.stream( ).map( Question::getIdEntry ).collect( Collectors.toList( ) );
611-
ResponseFilter responsefilter = new ResponseFilter( );
612-
responsefilter.setListIdEntry( idEntryList );
613-
614-
isCompositeHasResponses = isExisteQuestionFilled( responsefilter );
615-
}
616-
}
617-
618-
return isCompositeHasResponses;
619-
}
620-
621-
private boolean isExisteQuestionFilled( ResponseFilter responsefilter )
622-
{
623-
boolean isExisteQuestionFilled = false ;
624-
625-
List<Response> responseList = _formService.getResponseList( responsefilter );
626-
627-
if ( CollectionUtils.isNotEmpty(responseList)
628-
&& responseList.stream( ).anyMatch( response -> StringUtils.isNotBlank( response.getResponseValue( ) ) ) )
629-
{
630-
isExisteQuestionFilled = true;
631-
}
632-
633-
return isExisteQuestionFilled;
634-
}
635588

636589
private String getConfirmMessageRemoveQuestion( Form form, FormDisplay formDisplay )
637590
{
@@ -796,14 +749,14 @@ public String doMoveComposite( HttpServletRequest request )
796749
}
797750

798751
/**
799-
* Modify the field attribute disabled
752+
* change the deactivation of a question
800753
*
801754
* @param request
802755
* The HTTP request
803756
* @return The URL to go after performing the action
804757
*/
805-
@Action( value = ACTION_MODIFY_FIELD_DISABLED )
806-
public String doModifyFieldDisabled( HttpServletRequest request )
758+
@Action( value = ACTION_DISABLE_QUESTION )
759+
public String doToggleQuestionDisabled( HttpServletRequest request )
807760
{
808761
int nIdStep = NumberUtils.toInt( request.getParameter( FormsConstants.PARAMETER_ID_STEP ), INTEGER_MINUS_ONE );
809762
int nIdQuestion = NumberUtils.toInt( request.getParameter( FormsConstants.PARAMETER_ID_QUESTION ), INTEGER_MINUS_ONE );
@@ -815,10 +768,9 @@ public String doModifyFieldDisabled( HttpServletRequest request )
815768

816769
if ( entry != null )
817770
{
818-
Field disabledField = entry.getFieldByCode( IEntryTypeService.FIELD_DISABLED );
819-
boolean valueField = disabledField != null ? !Boolean.parseBoolean( disabledField.getValue( ) ) : false;
771+
boolean bFieldDisabled = entry.isDisabled( );
820772

821-
_formService.saveOrUpdateField( entry, IEntryTypeService.FIELD_DISABLED, null, Boolean.toString( valueField ) );
773+
_formService.saveOrUpdateField( entry, IEntryTypeService.FIELD_DISABLED, null, Boolean.toString( !bFieldDisabled ) );
822774

823775
getFormDatabaseService( ).updateQuestion( questionToUpdate );
824776
}
@@ -834,7 +786,7 @@ public String doModifyFieldDisabled( HttpServletRequest request )
834786
* list of compositeDisplay objects
835787
* @return map
836788
*/
837-
private Map<String, Entry> getIdQuestionEntryMap( List<ICompositeDisplay> listICompositeDisplay )
789+
private Map<String, Entry> getQuestionEntryMap( List<ICompositeDisplay> listICompositeDisplay )
838790
{
839791
Map<String, Entry> questionEntryMap = new HashMap<>( );
840792

webapp/WEB-INF/templates/admin/plugins/forms/manage_questions.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,18 +88,18 @@
8888
<#if group>
8989
<@aButton hideTitle=['all'] href='jsp/admin/plugins/forms/ManageQuestions.jsp?view=modifyGroup&id_step=${step.id}&id_group=${composite.formDisplay.compositeId}' title='#i18n{forms.manage_questions.action.modifyGroup}' buttonIcon='pencil' size='sm' />
9090
<#else>
91-
<#if idQuestionEntryMap?? && idQuestionEntryMap?has_content>
92-
<#assign entry=idQuestionEntryMap[composite.formDisplay.compositeId?c] />
91+
<#if questionEntryMap?? && questionEntryMap?has_content>
92+
<#assign entry=questionEntryMap[composite.formDisplay.compositeId?c] />
9393
<#if entry??><#assign idEntry>${entry.idEntry}</#assign></#if>
9494
</#if>
9595
<@aButton hideTitle=['all'] href='jsp/admin/plugins/forms/ManageQuestions.jsp?view=modifyQuestion&id_step=${step.id}&id_question=${composite.formDisplay.compositeId}' title='#i18n{forms.manage_questions.action.modifyQuestion}' buttonIcon='pencil' size='sm' />
9696
<@button type='button' style='modal' buttonTargetId='#qModal' params='data-url="jsp/admin/plugins/forms/ManageControls.jsp?view=manageConditionControl&id_step=${step.id}&id_target=${composite.formDisplay.id}&control_type=CONDITIONAL"' title='#i18n{forms.manage_questions.action.condition}' hideTitle=['all'] buttonIcon='question' size='sm' />
9797
<@button type='button' style='modal' buttonTargetId='#qModal' params='data-url="jsp/admin/plugins/forms/ManageControls.jsp?view=manageControl&id_step=${step.id}&id_target=${composite.formDisplay.compositeId}&control_type=VALIDATION"' title='#i18n{forms.manage_questions.action.control}' hideTitle=['all'] buttonIcon='check' size='sm' />
9898
<@aButton hideTitle=['all'] href='jsp/admin/plugins/forms/ManageQuestions.jsp?action=duplicateQuestion&id_step=${step.id}&id_target=${composite.formDisplay.compositeId}&token=${token}' class='btn-into' title='#i18n{forms.manage_questions.action.copy}' buttonIcon='copy' size='sm' />
9999
<#if entry?? && entry.disabled>
100-
<@aButton hideTitle=['all'] href='jsp/admin/plugins/forms/ManageQuestions.jsp?action=modifyFieldDisabled&id_step=${step.id}&id_question=${composite.formDisplay.compositeId}' title='#i18n{forms.manage_questions.action.enable}' class='btn-into' buttonIcon='play' size='sm' />
100+
<@aButton hideTitle=['all'] href='jsp/admin/plugins/forms/ManageQuestions.jsp?action=disableQuestion&id_step=${step.id}&id_question=${composite.formDisplay.compositeId}' title='#i18n{forms.manage_questions.action.enable}' class='btn-into' buttonIcon='play' size='sm' />
101101
<#else>
102-
<@aButton hideTitle=['all'] href='jsp/admin/plugins/forms/ManageQuestions.jsp?action=modifyFieldDisabled&id_step=${step.id}&id_question=${composite.formDisplay.compositeId}' title='#i18n{forms.manage_questions.action.disable}' class='btn-into' buttonIcon='stop' size='sm' />
102+
<@aButton hideTitle=['all'] href='jsp/admin/plugins/forms/ManageQuestions.jsp?action=disableQuestion&id_step=${step.id}&id_question=${composite.formDisplay.compositeId}' title='#i18n{forms.manage_questions.action.disable}' class='btn-into' buttonIcon='stop' size='sm' />
103103
</#if>
104104
</#if>
105105
<@button type='button' style='modal' buttonTargetId='#qModal' params='data-url="jsp/admin/plugins/forms/ManageQuestions.jsp?view=moveComposite&id_step=${step.id}&id_display=${composite.formDisplay.id}"' title='#i18n{forms.manage_questions.action.move}' hideTitle=['all'] buttonIcon='sort' size='sm' />

0 commit comments

Comments
 (0)