44 */
55package io .imunity .console .views .directory_browser .identities ;
66
7+ import static io .imunity .vaadin .elements .CssClassNames .MEDIUM_VAADIN_FORM_ITEM_LABEL ;
8+
9+ import java .time .Instant ;
10+ import java .time .LocalDateTime ;
11+ import java .time .ZoneId ;
12+ import java .util .Date ;
13+ import java .util .Locale ;
14+
715import com .vaadin .flow .component .checkbox .Checkbox ;
16+ import com .vaadin .flow .component .confirmdialog .ConfirmDialog ;
817import com .vaadin .flow .component .datetimepicker .DateTimePicker ;
918import com .vaadin .flow .component .formlayout .FormLayout ;
19+ import com .vaadin .flow .component .formlayout .FormLayout .FormItem ;
1020import com .vaadin .flow .component .html .Span ;
1121import com .vaadin .flow .component .select .Select ;
22+
1223import io .imunity .console .views .directory_browser .EntityWithLabel ;
1324import io .imunity .vaadin .elements .DialogWithActionFooter ;
25+ import io .imunity .vaadin .endpoint .common .api .HtmlTooltipFactory ;
1426import pl .edu .icm .unity .base .entity .EntityInformation ;
1527import pl .edu .icm .unity .base .entity .EntityScheduledOperation ;
1628import pl .edu .icm .unity .base .entity .EntityState ;
1729import pl .edu .icm .unity .base .message .MessageSource ;
1830
19- import java .time .Instant ;
20- import java .time .LocalDateTime ;
21- import java .time .ZoneId ;
22- import java .util .Date ;
23- import java .util .Locale ;
24-
2531
2632class ChangeEntityStateDialog extends DialogWithActionFooter
2733{
2834 private static final Locale EUROPEAN_TIME_FORMAT = Locale .forLanguageTag ("DE" );
2935
36+ private final HtmlTooltipFactory htmlTooltipFactory ;
3037 private final MessageSource msg ;
3138 private final EntityWithLabel entity ;
3239 private final Callback callback ;
@@ -35,12 +42,17 @@ class ChangeEntityStateDialog extends DialogWithActionFooter
3542 private Checkbox scheduleEnable ;
3643 private Select <EntityScheduledOperation > entityScheduledChange ;
3744 private DateTimePicker changeTime ;
38- private FormLayout .FormItem changeTimeFormItem ;
45+ private DateTimePicker removalTime ;
46+ private FormItem changeTimeFormItem ;
47+
48+ private FormItem removalFormItem ;
3949
40- ChangeEntityStateDialog (MessageSource msg , EntityWithLabel entity , Callback callback )
50+ ChangeEntityStateDialog (MessageSource msg , HtmlTooltipFactory htmlTooltipFactory , EntityWithLabel entity ,
51+ Callback callback )
4152 {
4253 super (msg ::getMessage );
4354 this .msg = msg ;
55+ this .htmlTooltipFactory = htmlTooltipFactory ;
4456 this .entity = entity ;
4557 this .callback = callback ;
4658 setHeaderTitle (msg .getMessage ("ChangeEntityStateDialog.caption" ));
@@ -58,6 +70,18 @@ private FormLayout getContents()
5870 entityState .setValue (entity .getEntity ().getState ());
5971 entityState .setWidthFull ();
6072
73+ entityState .addValueChangeListener (event ->
74+ {
75+ EntityState newValue = event .getValue ();
76+ if (newValue == EntityState .onlyLoginPermitted )
77+ {
78+ removalFormItem .setVisible (true );
79+ } else
80+ {
81+ removalFormItem .setVisible (false );
82+ }
83+ });
84+
6185 scheduleEnable = new Checkbox (msg .getMessage ("ChangeEntityStateDialog.enableScheduled" ));
6286
6387 EntityInformation initial = entity .getEntity ().getEntityInformation ();
@@ -67,10 +91,17 @@ private FormLayout getContents()
6791 entityScheduledChange .setItems (EntityScheduledOperation .values ());
6892 entityScheduledChange .setItemLabelGenerator (item -> msg .getMessage ("EntityScheduledOperation." + item ));
6993 entityScheduledChange .setValue (initialOp );
94+
7095
7196 changeTime = new DateTimePicker ();
7297 changeTime .setLocale (EUROPEAN_TIME_FORMAT );
7398 changeTime .setRequiredIndicatorVisible (true );
99+
100+ removalTime = new DateTimePicker ();
101+ removalTime .setLocale (EUROPEAN_TIME_FORMAT );
102+ removalTime .setRequiredIndicatorVisible (true );
103+
104+
74105 if (initial .getScheduledOperation () != null )
75106 {
76107 scheduleEnable .setValue (true );
@@ -90,25 +121,28 @@ private FormLayout getContents()
90121 });
91122
92123 FormLayout main = new FormLayout ();
124+ main .addClassName (MEDIUM_VAADIN_FORM_ITEM_LABEL .getName ());
93125 main .setResponsiveSteps (new FormLayout .ResponsiveStep ("0" , 1 ));
94- FormLayout embedded = new FormLayout ();
95- embedded .setResponsiveSteps (new FormLayout .ResponsiveStep ("0" , 1 ));
96- embedded .addFormItem (entityScheduledChange , msg .getMessage ("ChangeEntityStateDialog.scheduledOperation" ));
97- changeTimeFormItem = embedded .addFormItem (changeTime ,
98- msg .getMessage ("ChangeEntityStateDialog.scheduledChangeTime" ));
99-
126+ main .addFormItem (entityState , msg .getMessage ("ChangeEntityStateDialog.newState" ));
127+ removalFormItem = main .addFormItem (removalTime , msg .getMessage ("ChangeEntityStateDialog.removalGracePeriodEnd" ));
128+ removalFormItem .add (htmlTooltipFactory .get (msg .getMessage ("ChangeEntityStateDialog.removalGracePeriodEndDescription" )));
129+ removalFormItem .setVisible (false );
130+ main .addFormItem (scheduleEnable , "" );
131+ main .addFormItem (entityScheduledChange , msg .getMessage ("ChangeEntityStateDialog.scheduledOperation" ));
132+ changeTimeFormItem = main .addFormItem (changeTime ,
133+ msg .getMessage ("ChangeEntityStateDialog.scheduledChangeTime" ));
134+ main .setSizeFull ();
135+
136+
100137 if (entity .getEntity ().getEntityInformation ().getRemovalByUserTime () != null &&
101138 entity .getEntity ().getEntityInformation ().getState () == EntityState .onlyLoginPermitted )
102139 {
103- Span infoRemovalByUser = new Span ( msg . getMessage ( "ChangeEntityStateDialog.infoUserScheduledRemoval" ,
104- entity .getEntity ().getEntityInformation ().getRemovalByUserTime ()));
105- main . add ( infoRemovalByUser );
140+ removalFormItem . setVisible ( true );
141+ removalTime . setValue ( LocalDateTime . ofInstant ( entity .getEntity ().getEntityInformation ().getRemovalByUserTime ()
142+ . toInstant (), ZoneId . systemDefault ()) );
106143 }
107144
108- main .addFormItem (entityState , msg .getMessage ("ChangeEntityStateDialog.newState" ));
109- main .addFormItem (scheduleEnable , "" );
110- main .addFormItem (embedded , "" );
111- main .setSizeFull ();
145+
112146 return main ;
113147 }
114148
@@ -121,6 +155,25 @@ private void onConfirm()
121155 changeTime .setErrorMessage (null );
122156 changeTime .setInvalid (false );
123157
158+ if (newState .equals (EntityState .onlyLoginPermitted ))
159+ {
160+ LocalDateTime ldt = removalTime .getValue ();
161+ if (ldt == null )
162+ {
163+ removalTime .setErrorMessage (msg .getMessage ("fieldRequired" ));
164+ removalTime .setInvalid (true );
165+ open ();
166+ removalTime .getElement ().setAttribute ("invalid" , true );
167+ return ;
168+ }
169+ Date zonedDate = Date .from (ldt .atZone (ZoneId .systemDefault ())
170+ .toInstant ());
171+ newInfo .setRemovalByUserTime (zonedDate );
172+ } else
173+ {
174+ newInfo .setRemovalByUserTime (null );
175+ }
176+
124177 if (scheduleEnable .getValue ())
125178 {
126179 if (changeTime .getValue () == null )
@@ -137,8 +190,23 @@ private void onConfirm()
137190 newInfo .setScheduledOperationTime (zonedDate );
138191 }
139192
140- if (callback .onChanged (newInfo ))
141- close ();
193+ if (newInfo .getScheduledOperation () != null && newInfo .getRemovalByUserTime () != null )
194+ {
195+ ConfirmDialog confirm = new ConfirmDialog ();
196+ confirm .setConfirmButton (msg .getMessage ("ok" ), e ->
197+ {
198+ if (callback .onChanged (newInfo ))
199+ close ();
200+ });
201+ confirm .setCancelable (true );
202+ confirm .add (new Span (msg .getMessage ("ChangeEntityStateDialog.warningScheduledChangeAndRemoval" )));
203+ confirm .open ();
204+
205+ } else
206+ {
207+ if (callback .onChanged (newInfo ))
208+ close ();
209+ }
142210 }
143211
144212 interface Callback
0 commit comments