Project

General

Profile

Download (16.1 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2017 EDIT
3
* European Distributed Institute of Taxonomy
4
* http://www.e-taxonomy.eu
5
*
6
* The contents of this file are subject to the Mozilla Public License Version 1.1
7
* See LICENSE.TXT at the top of this package for the full license terms.
8
*/
9
package eu.etaxonomy.cdm.vaadin.view.registration;
10

    
11
import java.util.ArrayList;
12
import java.util.Collection;
13
import java.util.EnumSet;
14
import java.util.List;
15
import java.util.UUID;
16

    
17
import org.springframework.security.core.GrantedAuthority;
18
import org.vaadin.viritin.fields.LazyComboBox;
19

    
20
import com.vaadin.navigator.View;
21
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
22
import com.vaadin.server.FontAwesome;
23
import com.vaadin.server.Page;
24
import com.vaadin.spring.annotation.SpringView;
25
import com.vaadin.ui.Alignment;
26
import com.vaadin.ui.Button;
27
import com.vaadin.ui.Component;
28
import com.vaadin.ui.CssLayout;
29
import com.vaadin.ui.GridLayout;
30
import com.vaadin.ui.HorizontalLayout;
31
import com.vaadin.ui.Label;
32
import com.vaadin.ui.Notification;
33
import com.vaadin.ui.Panel;
34
import com.vaadin.ui.UI;
35
import com.vaadin.ui.VerticalLayout;
36
import com.vaadin.ui.Window;
37
import com.vaadin.ui.themes.ValoTheme;
38

    
39
import eu.etaxonomy.cdm.model.name.Registration;
40
import eu.etaxonomy.cdm.model.name.RegistrationStatus;
41
import eu.etaxonomy.cdm.model.name.TaxonName;
42
import eu.etaxonomy.cdm.persistence.hibernate.permission.CRUD;
43
import eu.etaxonomy.cdm.vaadin.component.registration.RegistrationItem;
44
import eu.etaxonomy.cdm.vaadin.component.registration.RegistrationItemEditButtonGroup;
45
import eu.etaxonomy.cdm.vaadin.component.registration.RegistrationItemEditButtonGroup.TypeDesignationWorkingSetButton;
46
import eu.etaxonomy.cdm.vaadin.component.registration.RegistrationStateLabel;
47
import eu.etaxonomy.cdm.vaadin.component.registration.RegistrationStyles;
48
import eu.etaxonomy.cdm.vaadin.event.RegistrationEditorAction;
49
import eu.etaxonomy.cdm.vaadin.event.ShowDetailsEvent;
50
import eu.etaxonomy.cdm.vaadin.event.TaxonNameEditorAction;
51
import eu.etaxonomy.cdm.vaadin.event.TypeDesignationWorkingsetEditorAction;
52
import eu.etaxonomy.cdm.vaadin.event.registration.RegistrationWorkingsetAction;
53
import eu.etaxonomy.cdm.vaadin.model.registration.RegistrationWorkingSet;
54
import eu.etaxonomy.cdm.vaadin.security.AccessRestrictedView;
55
import eu.etaxonomy.cdm.vaadin.security.PermissionDebugUtils;
56
import eu.etaxonomy.cdm.vaadin.security.UserHelper;
57
import eu.etaxonomy.cdm.vaadin.util.converter.TypeDesignationSetManager.TypeDesignationWorkingSetType;
58
import eu.etaxonomy.cdm.vaadin.view.AbstractPageView;
59
import eu.etaxonomy.vaadin.event.EditorActionType;
60

    
61
/**
62
 * @author a.kohlbecker
63
 * @since Mar 2, 2017
64
 *
65
 */
66
@SpringView(name=RegistrationWorksetViewBean.NAME)
67
public class RegistrationWorksetViewBean extends AbstractPageView<RegistrationWorkingsetPresenter>
68
    implements RegistrationWorkingsetView, View, AccessRestrictedView {
69

    
70
    public static final String DOM_ID_WORKINGSET = "workingset";
71

    
72
    private static final long serialVersionUID = -213040114015958970L;
73

    
74
    public static final String NAME = "workingset";
75

    
76
    public RegistrationType regType = null;
77

    
78
    private List<CssLayout> registrations = new ArrayList<>();
79

    
80
    private String headerText = "Registration Workingset Editor";
81
    private String subheaderText = "";
82

    
83
    private Integer citationID;
84

    
85
    private Button addNewNameRegistrationButton;
86

    
87
    private LazyComboBox<TaxonName> existingNameCombobox;
88

    
89
    private GridLayout registrationsGrid;
90

    
91
    private Button addExistingNameButton;
92

    
93
    private RegistrationItem workingsetHeader;
94

    
95
    private Panel registrationListPanel;
96

    
97
    public RegistrationWorksetViewBean() {
98
        super();
99
    }
100

    
101

    
102
    /**
103
     * {@inheritDoc}
104
     */
105
    @Override
106
    protected void initContent() {
107
        getLayout().setId(NAME);
108
        updateHeader();
109
        // all content is added in createRegistrationsList()
110
    }
111

    
112

    
113
    /**
114
     * {@inheritDoc}
115
     */
116
    @Override
117
    public void enter(ViewChangeEvent event) {
118
        if(event.getParameters() != null){
119
            this.citationID = Integer.valueOf(event.getParameters());
120

    
121
            getPresenter().handleViewEntered();
122
        }
123
    }
124

    
125
    /**
126
     * {@inheritDoc}
127
     */
128
    @Override
129
    public void setWorkingset(RegistrationWorkingSet workingset) {
130

    
131
        if(workingsetHeader != null){
132
            getLayout().removeComponent(workingsetHeader);
133
            getLayout().removeComponent(registrationListPanel);
134
        }
135
        workingsetHeader = new RegistrationItem(workingset, this);
136
        if(UserHelper.fromSession().userIsRegistrationCurator() || UserHelper.fromSession().userIsAdmin()){
137
            workingsetHeader.getSubmitterLabel().setVisible(true);
138
        }
139
        addContentComponent(workingsetHeader, null);
140

    
141
        registrationListPanel = createRegistrationsList(workingset);
142
        registrationListPanel.setHeight("100%");
143
        registrationListPanel.setStyleName("registration-list");
144
        registrationListPanel.setCaption("Registrations");
145
        addContentComponent(registrationListPanel, 1.0f);
146

    
147
    }
148

    
149
    /**
150
     * {@inheritDoc}
151
     */
152
    @Override
153
    public void addBlockingRegistration(RegistrationDTO blocking) {
154
        if(registrations == null) {
155
            throw new RuntimeException("A Workingset must be present prior adding blocking registrations.");
156
        }
157
        // add the blocking registration
158

    
159
    }
160

    
161
    /**
162
     * @param workingset
163
     * @return
164
     */
165
    public Panel createRegistrationsList(RegistrationWorkingSet workingset) {
166

    
167
        registrationsGrid = new GridLayout(3, 1);
168
        registrationsGrid.setWidth("100%");
169
        // allow vertical scrolling:
170
        registrationsGrid.setHeightUndefined();
171

    
172
        //registrationsGrid.setColumnExpandRatio(0, 0.1f);
173
        registrationsGrid.setColumnExpandRatio(1, 1f);
174

    
175
        int row = 0;
176
        for(RegistrationDTO dto : workingset.getRegistrationDTOs()) {
177
            putRegistrationListComponent(registrationsGrid, row++, dto);
178
        }
179

    
180
        Label addRegistrationLabel_1 = new Label("Add a new registration for a");
181
        Label addRegistrationLabel_2 = new Label("or an");
182

    
183
        addNewNameRegistrationButton = new Button("new name");
184
        addNewNameRegistrationButton.setDescription("A name which is newly published in this publication.");
185
        addNewNameRegistrationButton.addClickListener(
186
                e -> eventBus.publishEvent(new TaxonNameEditorAction(EditorActionType.ADD, null, addNewNameRegistrationButton, this))
187
                );
188

    
189
        addExistingNameButton = new Button("existing name:");
190
        addExistingNameButton.setDescription("A name which was previously published in a earlier publication.");
191
        addExistingNameButton.setEnabled(false);
192
        addExistingNameButton.addClickListener(
193
                e -> eventBus.publishEvent(new RegistrationWorkingsetAction(citationID, RegistrationWorkingsetAction.Action.start))
194
                );
195

    
196
        existingNameCombobox = new LazyComboBox<TaxonName>(TaxonName.class);
197
        existingNameCombobox.addValueChangeListener(
198
                e -> addExistingNameButton.setEnabled(e.getProperty().getValue() != null)
199
                );
200

    
201
        HorizontalLayout buttonContainer = new HorizontalLayout(addRegistrationLabel_1, addNewNameRegistrationButton, addRegistrationLabel_2, addExistingNameButton, existingNameCombobox);
202
        buttonContainer.setSpacing(true);
203
//        buttonContainer.setWidth(100, Unit.PERCENTAGE);
204
        buttonContainer.setComponentAlignment(addRegistrationLabel_1, Alignment.MIDDLE_LEFT);
205
        buttonContainer.setComponentAlignment(addRegistrationLabel_2, Alignment.MIDDLE_LEFT);
206
        registrationsGrid.addComponent(buttonContainer, 0, row, 2, row);
207
        registrationsGrid.setComponentAlignment(buttonContainer, Alignment.MIDDLE_RIGHT);
208

    
209
        Panel namesTypesPanel = new Panel(registrationsGrid);
210
        return namesTypesPanel;
211
    }
212

    
213

    
214
    /**
215
     * @param grid
216
     * @param row If null, the new row will be inserted as last registration item, that is before the button row.
217
     * @param dto
218
     */
219
    protected void putRegistrationListComponent(GridLayout grid, int row, RegistrationDTO dto) {
220

    
221
        grid.setRows(grid.getRows() + 1);
222

    
223
        CssLayout buttonGroup = new CssLayout();
224
        buttonGroup.setStyleName(ValoTheme.LAYOUT_COMPONENT_GROUP);
225

    
226
        Button messageButton = new Button(FontAwesome.COMMENT);
227
        messageButton.setStyleName(ValoTheme.BUTTON_TINY); //  + " " + RegistrationStyles.STYLE_FRIENDLY_FOREGROUND);
228
        if(dto.getMessages().isEmpty()){
229
            messageButton.setEnabled(false);
230
        } else {
231
            messageButton.addClickListener(e -> eventBus.publishEvent(
232
                    new ShowDetailsEvent<RegistrationDTO, Integer>(
233
                        e,
234
                        RegistrationDTO.class,
235
                        dto.getId(),
236
                        "messages"
237
                        )
238
                    )
239
                );
240
        }
241
        messageButton.setCaption("<span class=\"" + RegistrationStyles.BUTTON_BADGE +"\"> " + dto.getMessages().size() + "</span>");
242
        messageButton.setCaptionAsHtml(true);
243
        buttonGroup.addComponent(messageButton);
244

    
245
        RegistrationStateLabel stateLabel = new RegistrationStateLabel().update(dto.getStatus());
246

    
247

    
248
        if(UserHelper.fromSession().userIsRegistrationCurator() || UserHelper.fromSession().userIsAdmin()) {
249
            Button editRegistrationButton = new Button(FontAwesome.COG);
250
            editRegistrationButton.setStyleName(ValoTheme.BUTTON_TINY);
251
            editRegistrationButton.setDescription("Edit registration");
252
            editRegistrationButton.addClickListener(e -> getEventBus().publishEvent(new RegistrationEditorAction(
253
                EditorActionType.EDIT,
254
                dto.getId(),
255
                null,
256
                this
257
                )));
258
            buttonGroup.addComponent(editRegistrationButton);
259
        }
260

    
261
        PermissionDebugUtils.addGainPerEntityPermissionButton(buttonGroup, Registration.class, dto.getId(),
262
                EnumSet.of(CRUD.UPDATE), RegistrationStatus.PREPARATION.name());
263

    
264
        Component regItem;
265

    
266
        RegistrationItemEditButtonGroup editButtonGroup = new RegistrationItemEditButtonGroup(dto);
267

    
268
        if(editButtonGroup.getNameButton() != null){
269
            editButtonGroup.getNameButton().getButton().addClickListener(e -> {
270
                Integer nameId = editButtonGroup.getNameButton().getId();
271
                getEventBus().publishEvent(new TaxonNameEditorAction(
272
                    EditorActionType.EDIT,
273
                    nameId,
274
                    e.getButton(),
275
                    this
276
                    )
277
                );
278
            });
279
        }
280

    
281
        for(TypeDesignationWorkingSetButton workingsetButton : editButtonGroup.getTypeDesignationButtons()){
282
            workingsetButton.getButton().addClickListener(e -> {
283
                Integer typeDesignationWorkingsetId = workingsetButton.getId();
284
                TypeDesignationWorkingSetType workingsetType = workingsetButton.getType();
285
                Integer registrationEntityID = dto.getId();
286
                getEventBus().publishEvent(new TypeDesignationWorkingsetEditorAction(
287
                        EditorActionType.EDIT,
288
                        typeDesignationWorkingsetId,
289
                        workingsetType,
290
                        registrationEntityID,
291
                        e.getButton(),
292
                        this
293
                        )
294
                    );
295
            });
296
        }
297

    
298
        editButtonGroup.getAddTypeDesignationButton().addClickListener(
299
                e -> chooseNewTypeRegistrationWorkingset(dto.getId())
300
                );
301
        regItem = editButtonGroup;
302

    
303

    
304
        grid.addComponent(stateLabel, 0, row);
305
        grid.setComponentAlignment(stateLabel, Alignment.TOP_LEFT);
306
        grid.addComponent(regItem, 1, row);
307
        grid.addComponent(buttonGroup, 2, row);
308
        grid.setComponentAlignment(buttonGroup, Alignment.TOP_LEFT);
309
    }
310

    
311
    /**
312
     * @param button
313
     * @param registrationEntityId
314
     *
315
     */
316
    @Override
317
    public void chooseNewTypeRegistrationWorkingset(Integer registrationEntityId) {
318

    
319
        Window typeDesignationTypeCooser = new Window();
320
        typeDesignationTypeCooser.setModal(true);
321
        typeDesignationTypeCooser.setResizable(false);
322
        typeDesignationTypeCooser.setCaption("Add new type designation");
323
        Label label = new Label("Please select kind of type designation to be created.");
324
        Button newSpecimenTypeDesignationButton = new Button("Specimen type designation",
325
                e -> addNewTypeDesignationWorkingset(TypeDesignationWorkingSetType.SPECIMEN_TYPE_DESIGNATION_WORKINGSET, registrationEntityId, typeDesignationTypeCooser));
326
        Button newNameTypeDesignationButton = new Button("Name type designation",
327
                e -> addNewTypeDesignationWorkingset(TypeDesignationWorkingSetType.NAME_TYPE_DESIGNATION_WORKINGSET, registrationEntityId, typeDesignationTypeCooser));
328

    
329
        VerticalLayout layout = new VerticalLayout(label, newSpecimenTypeDesignationButton, newNameTypeDesignationButton);
330
        layout.setMargin(true);
331
        layout.setSpacing(true);
332
        layout.setComponentAlignment(newSpecimenTypeDesignationButton, Alignment.MIDDLE_CENTER);
333
        layout.setComponentAlignment(newNameTypeDesignationButton, Alignment.MIDDLE_CENTER);
334
        typeDesignationTypeCooser.setContent(layout);
335
        UI.getCurrent().addWindow(typeDesignationTypeCooser);
336
    }
337

    
338
    /**
339
     * @param button
340
     *
341
     */
342
    protected void addNewTypeDesignationWorkingset(TypeDesignationWorkingSetType newWorkingsetType, Integer registrationEntityId, Window typeDesignationTypeCooser) {
343
        UI.getCurrent().removeWindow(typeDesignationTypeCooser);
344
        getEventBus().publishEvent(new TypeDesignationWorkingsetEditorAction(
345
                EditorActionType.ADD,
346
                newWorkingsetType,
347
                registrationEntityId,
348
                null,
349
                this
350
                ));
351
    }
352

    
353
    /**
354
     * {@inheritDoc}
355
     */
356
    @Override
357
    public void openReferenceEditor(UUID referenceUuid) {
358
        // TODO Auto-generated method stub
359

    
360
    }
361

    
362
    /**
363
     * {@inheritDoc}
364
     */
365
    @Override
366
    public void openNameEditor(UUID nameUuid) {
367
        // TODO Auto-generated method stub
368

    
369
    }
370

    
371
    /**
372
     * {@inheritDoc}
373
     */
374
    @Override
375
    protected String getHeaderText() {
376
        return headerText;
377
    }
378

    
379
    /**
380
     * {@inheritDoc}
381
     */
382
    @Override
383
    public void setHeaderText(String text) {
384
        this.headerText = text;
385
        updateHeader();
386

    
387
    }
388

    
389
    /**
390
     * @return the subheaderText
391
     */
392
    public String getSubheaderText() {
393
        return subheaderText;
394
    }
395

    
396
    /**
397
     * {@inheritDoc}
398
     */
399
    @Override
400
    public void setSubheaderText(String text) {
401
        subheaderText = text;
402
        updateHeader();
403
    }
404

    
405
    /**
406
     * {@inheritDoc}
407
     */
408
    @Override
409
    protected String getSubHeaderText() {
410
        return subheaderText;
411
    }
412

    
413
    /**
414
     * {@inheritDoc}
415
     */
416
    @Override
417
    public void openDetailsPopup(String caption, List<String> messages) {
418
        StringBuffer sb = new StringBuffer();
419
        sb.append("<div class=\"details-popup-content\">");
420
        messages.forEach(s -> sb.append(s).append("</br>"));
421
        sb.append("</div>");
422
        new Notification(caption, sb.toString(), Notification.Type.HUMANIZED_MESSAGE, true).show(Page.getCurrent());
423
    }
424

    
425
    /**
426
     * {@inheritDoc}
427
     */
428
    @Override
429
    public boolean allowAnonymousAccess() {
430
        return false;
431
    }
432

    
433
    /**
434
     * {@inheritDoc}
435
     */
436
    @Override
437
    public Collection<Collection<GrantedAuthority>> allowedGrantedAuthorities() {
438
        return null;
439
    }
440

    
441
    /**
442
     * @return the addNewNameRegistrationButton
443
     */
444
    @Override
445
    public Button getAddNewNameRegistrationButton() {
446
        return addNewNameRegistrationButton;
447
    }
448

    
449
    @Override
450
    public Button getAddExistingNameRegistrationButton() {
451
        return addExistingNameButton;
452
    }
453

    
454
    @Override
455
    public LazyComboBox<TaxonName> getAddExistingNameCombobox() {
456
        return existingNameCombobox;
457
    }
458

    
459
    /**
460
     * @return the citationID
461
     */
462
    @Override
463
    public Integer getCitationID() {
464
        return citationID;
465
    }
466

    
467

    
468
}
(14-14/19)