Project

General

Profile

1
package eu.dnetlib.repo.manager.client.browsehistory;
2

    
3
import com.google.gwt.core.client.GWT;
4
import com.google.gwt.dom.client.Document;
5
import com.google.gwt.event.dom.client.ClickEvent;
6
import com.google.gwt.event.dom.client.ClickHandler;
7
import com.google.gwt.query.client.Function;
8
import com.google.gwt.user.client.Event;
9
import com.google.gwt.user.client.Window;
10
import com.google.gwt.user.client.rpc.AsyncCallback;
11
import com.google.gwt.user.client.ui.Anchor;
12
import com.google.gwt.user.client.ui.FlowPanel;
13
import com.google.gwt.user.client.ui.HTML;
14
import eu.dnetlib.domain.data.Repository;
15
import eu.dnetlib.domain.functionality.validator.JobResultEntry;
16
import eu.dnetlib.domain.functionality.validator.StoredJob;
17
import eu.dnetlib.gwt.client.help.HelpService;
18
import eu.dnetlib.gwt.client.help.HelpServiceAsync;
19
import eu.dnetlib.repo.manager.client.AbstractRepositoryManagerWidget;
20
import eu.dnetlib.repo.manager.client.HelpCallback;
21
import eu.dnetlib.repo.manager.client.RepositoryManagerWidget;
22
import eu.dnetlib.repo.manager.client.services.ValidationService;
23
import eu.dnetlib.repo.manager.client.services.ValidationServiceAsync;
24
import org.apache.lucene.document.Field;
25
import org.gwtbootstrap3.client.ui.*;
26
import org.gwtbootstrap3.client.ui.constants.AlertType;
27
import org.gwtbootstrap3.client.ui.constants.ButtonType;
28
import org.gwtbootstrap3.client.ui.constants.ModalBackdrop;
29
import org.gwtbootstrap3.client.ui.html.UnorderedList;
30

    
31
import java.util.ArrayList;
32
import java.util.List;
33

    
34
import static com.google.gwt.query.client.GQuery.$;
35

    
36
/**
37
 * Created by stefania on 4/4/16.
38
 */
39
public class ViewJobDetailsWidget extends AbstractRepositoryManagerWidget implements RepositoryManagerWidget {
40

    
41
    private String parentToken = "";
42
    private String restToken = "";
43

    
44
    private FlowPanel viewJobDetailsBoxContent = new FlowPanel();
45

    
46
    private Alert errorAlert = new Alert();
47

    
48
    private FlowPanel helpPanel = new FlowPanel();
49

    
50
    private StoredJob storedJob;
51

    
52
    private List<JobResultEntry> contentResults = new ArrayList<>();
53
    private List<JobResultEntry> usageResults = new ArrayList<>();
54

    
55
    private ValidationServiceAsync validationService = GWT.create(ValidationService.class);
56
    private static HelpServiceAsync helpService = GWT.create(HelpService.class);
57

    
58
    public ViewJobDetailsWidget() {
59

    
60
        super();
61

    
62
        HTML title = new HTML("<h1 class=\"uk-article-title\">Job details</h1>");
63
        title.addStyleName("uk-margin-medium-bottom");
64
        contentPanel.add(title);
65

    
66
        contentPanel.add(viewJobDetailsBoxContent);
67

    
68
        errorAlert.setType(AlertType.DANGER);
69
        errorAlert.setDismissable(false);
70
        errorAlert.setVisible(false);
71
        viewJobDetailsBoxContent.add(errorAlert);
72
    }
73

    
74
    @Override
75
    public void clear() {
76
        viewJobDetailsBoxContent.clear();
77
        errorAlert.setVisible(false);
78
        gridPanel.remove(helpPanel);
79
        storedJob = null;
80
    }
81

    
82
    @Override
83
    public void reload() {
84

    
85
        Document.get().getElementById("headerNoTransparent").removeClassName("tm-header-transparent");
86

    
87
        viewJobDetailsBoxContent.add(errorAlert);
88

    
89
        final HTML loadingWheel = new HTML("<div class=\"loader-big\" style=\"text-align: center; padding-top: 170px; " +
90
                "color: rgb(47, 64, 80); font-weight: bold;\">Retrieving job details...</div>" +
91
                "<div class=\"whiteFilm\"></div>");
92
        viewJobDetailsBoxContent.addStyleName("loading-big");
93
        viewJobDetailsBoxContent.add(loadingWheel);
94

    
95
        helpService.getHelpById(parentToken + "_viewJobDetails", new HelpCallback(helpPanel, gridPanel));
96

    
97
        validationService.getJobSummary(Integer.parseInt(restToken), "all", new AsyncCallback<StoredJob>() {
98

    
99
            @Override
100
            public void onFailure(Throwable caught) {
101

    
102
                viewJobDetailsBoxContent.removeStyleName("loading-big");
103
                viewJobDetailsBoxContent.remove(loadingWheel);
104

    
105
                errorAlert.setText("System error retrieving job details");
106
                errorAlert.setVisible(true);
107
            }
108

    
109
            @Override
110
            public void onSuccess(StoredJob storedJob) {
111

    
112
                ViewJobDetailsWidget.this.storedJob = storedJob;
113

    
114
                viewJobDetailsBoxContent.removeStyleName("loading-big");
115
                viewJobDetailsBoxContent.remove(loadingWheel);
116

    
117
                viewJobDetailsBoxContent.add(createGeneralInfoItem());
118
                viewJobDetailsBoxContent.add(createInfoTags());
119
                viewJobDetailsBoxContent.add(createUsageAndContentInfo());
120

    
121
                addHandlers();
122
            }
123
        });
124
    }
125

    
126
    @Override
127
    public void setToken(String parentToken, String rest) {
128
        this.parentToken = parentToken;
129
        this.restToken = rest;
130
    }
131

    
132
    @Override
133
    public void afterAdditionToRootPanel() {
134

    
135
    }
136

    
137
    private FlowPanel createGeneralInfoItem() {
138

    
139
        FlowPanel generalInfoItem = new FlowPanel();
140

    
141
        String content = "<h4 class=\"uk-h4 uk-text-primary uk-scrollspy-inview uk-animation-slide-top-medium\"" +
142
                "uk-scrollspy-class=\"\"><span>" + storedJob.getBaseUrl() + "</span></h4>" +
143
                "<div class=\"uk-margin\">by " + storedJob.getUserEmail() + "</div>";
144

    
145

    
146
        generalInfoItem.add(new HTML(content));
147
        return generalInfoItem;
148
    }
149

    
150
    private FlowPanel createInfoTags() {
151

    
152
        FlowPanel generalInfoTags = new FlowPanel();
153

    
154
        String content = "<hr class=\"uk-scrollspy-inview uk-animation-slide-bottom-small\" uk-scrollspy-class=\"\">" +
155
                "<div class=\"tags\">" +
156
                "<span class=\"label label-primary\">" + storedJob.getJobType() + "</span>" +
157
                "<span class=\"label label-primary\">" + storedJob.getGuidelinesShortName() + "</span>" +
158
                "<span class=\"label label-primary\">Validation set: " + storedJob.getValidationSet() + "</span>" +
159
                "<span class=\"label label-primary\">Started: " + storedJob.getStarted() + "</span>" +
160
                "<span class=\"label label-primary\">Ended: " + storedJob.getEnded() + "</span>" +
161
                "<span class=\"label label-primary\">Duration: " + storedJob.getDuration() + "</span>" +
162
                "<span class=\"label label-primary\">Records tested: " + storedJob.getRecordsTested() + "</span>" +
163
                "<span class=\"label label-primary\">Score for content: " + storedJob.getContentJobScore() + "</span>" +
164
                "<span class=\"label label-primary\">Score for usage: " + storedJob.getUsageJobScore() + "</span>" +
165
                "</div>" +
166
                "<hr class=\"uk-scrollspy-inview uk-animation-slide-bottom-small\" uk-scrollspy-class=\"\">";
167

    
168
        generalInfoTags.add(new HTML(content));
169
        return generalInfoTags;
170
    }
171

    
172
    private FlowPanel createUsageAndContentInfo() {
173

    
174
        FlowPanel usageAndContentTabs = new FlowPanel();
175

    
176
        UnorderedList tabTitles = new UnorderedList();
177
        tabTitles.addStyleName("uk-margin el-nav uk-tab");
178

    
179
        final ListItem contentTab = new ListItem();
180
        final ListItem usageTab = new ListItem();
181

    
182
        final ListItem contentTabContent = new ListItem();
183
        final ListItem usageTabContent = new ListItem();
184

    
185
        contentTab.addStyleName("uk-active");
186
        Anchor contentTablLink = new Anchor("for Content");
187
        contentTablLink.addClickHandler(new ClickHandler() {
188
            @Override
189
            public void onClick(ClickEvent event) {
190
                contentTab.addStyleName("uk-active");
191
                usageTab.removeStyleName("uk-active");
192
                contentTabContent.addStyleName("uk-active");
193
                usageTabContent.removeStyleName("uk-active");
194
            }
195
        });
196
        contentTab.add(contentTablLink);
197
        tabTitles.add(contentTab);
198

    
199
        Anchor usageTabLink = new Anchor("for Usage");
200
        usageTabLink.addClickHandler(new ClickHandler() {
201
            @Override
202
            public void onClick(ClickEvent event) {
203
                usageTab.addStyleName("uk-active");
204
                contentTab.removeStyleName("uk-active");
205
                usageTabContent.addStyleName("uk-active");
206
                contentTabContent.removeStyleName("uk-active");
207
            }
208
        });
209
        usageTab.add(usageTabLink);
210
        tabTitles.add(usageTab);
211

    
212
        usageAndContentTabs.add(tabTitles);
213

    
214
        UnorderedList tabContent = new UnorderedList();
215
        tabContent.addStyleName("uk-switcher");
216

    
217
        contentTabContent.addStyleName("el-item uk-active");
218
        tabContent.add(contentTabContent);
219

    
220
        usageTabContent.addStyleName("el-item");
221
        tabContent.add(usageTabContent);
222

    
223
        usageAndContentTabs.add(tabContent);
224

    
225
        if(storedJob.getResultEntries()!=null) {
226
            for (JobResultEntry jobResultEntry : storedJob.getResultEntries()) {
227
                if (jobResultEntry.getType().equals("content"))
228
                    contentResults.add(jobResultEntry);
229
                else
230
                    usageResults.add(jobResultEntry);
231
            }
232
        }
233

    
234
        contentTabContent.add(rulesTable(contentResults));
235
        usageTabContent.add(rulesTable(usageResults));
236

    
237
        return usageAndContentTabs;
238
    }
239

    
240
    private FlowPanel rulesTable(List<JobResultEntry> jobResults) {
241

    
242
        FlowPanel contentRules = new FlowPanel();
243
        contentRules.addStyleName("uk-grid-margin uk-grid uk-grid-stack");
244

    
245
        FlowPanel colPanel = new FlowPanel();
246
        colPanel.addStyleName("uk-width-1-1@m uk-first-column");
247
        contentRules.add(colPanel);
248

    
249
        FlowPanel divPanel = new FlowPanel();
250
        divPanel.addStyleName("uk-overflow-auto uk-scrollspy-inview uk-animation-slide-top-medium");
251
        colPanel.add(divPanel);
252

    
253
        String content = "<table class=\"uk-table uk-table-striped uk-table-middle rules-table\">" +
254
                "<thead><tr><th>Rule Name</th><th class=\"uk-text-nowrap\">Rule Description</th>" +
255
                "<th class=\"uk-text-nowrap\">Rule Weight</th><th class=\"uk-text-nowrap\"># of records</th>" +
256
                "<th class=\"uk-text-nowrap\">Success</th></tr></thead>";
257

    
258
        content += "<tbody>";
259

    
260
        if(jobResults==null || jobResults.size()==0) {
261

    
262
            content += "<tr class=\"el-item\">" +
263
                    "<td colspan=\"10\"><div class=\"alert alert-warning\">No result entries found</div></td>" +
264
                    "</tr>";
265

    
266
        } else {
267

    
268
            for (int i=0; i<jobResults.size(); i++) {
269

    
270
                content += "<tr class=\"el-item\">" +
271
                        "<td class=\"uk-table-shrink\">" +
272
                        "<div class=\"el-title\">" + jobResults.get(i).getName() + "</div>" +
273
                        "</td>" +
274
                        "<td class=\"uk-table-shrink\">\n" +
275
                        "<div class=\"el-title\">" + jobResults.get(i).getDescription() + "</div>" +
276
                        "</td>" +
277
                        "<td class=\"uk-table-shrink\">\n" +
278
                        "<div class=\"el-title\">" + jobResults.get(i).getWeight() + "</div>" +
279
                        "</td>" +
280
                        "<td class=\"uk-table-shrink\">\n" +
281
                        "<div class=\"el-title\">" + jobResults.get(i).getSuccesses() + "</div>" +
282
                        "</td>" +
283
                        "<td class=\"uk-table-shrink\">\n";
284

    
285
                if (jobResults.get(i).isHasErrors() && jobResults.get(i).isMandatory()) {
286
                    content += "<img src=\"img/icon_colours-x.jpg\" alt=\"Error\" class=\"el-image uk-preserve-width\" width=\"20\">" +
287
                            "<a href=\"javascript:;\" class=\"errorlink viewErrors uk-display-block\" id=\"" + jobResults.get(i).getType() + "#" + i + "\"><span>View Errors</span></a>";
288
                } else if (jobResults.get(i).isHasErrors() && !jobResults.get(i).isMandatory()) {
289
                    content += "<img src=\"img/icon_colours-warning.jpg\" alt=\"Warning\" class=\"el-image uk-preserve-width\" width=\"20\">" +
290
                            "<a href=\"javascript:;\" class=\"warninglink viewErrors uk-display-block\" id=\"" + jobResults.get(i).getType() + "#" + i + "\"><span>View Warnings</span></a>";
291
                } else
292
                    content += "<img src=\"img/icon_colours-check.jpg\" alt=\"Success\" class=\"el-image uk-preserve-width\" width=\"20\">";
293

    
294
                content += "</td>" +
295
                        "</tr>";
296
            }
297
        }
298

    
299
        content += "</tbody></table>";
300

    
301
        HTML contentRulesListHTML = new HTML();
302
        contentRulesListHTML.setHTML(content);
303

    
304
        divPanel.add(contentRulesListHTML);
305

    
306
        return contentRules;
307
    }
308

    
309
    private void addHandlers() {
310

    
311
        $(".viewErrors").click(new Function() {
312

    
313
            public boolean f(Event e) {
314

    
315
                String[] idParts = $(e).get(0).getId().split("#");
316
                String jobType = idParts[0];
317
                String index = idParts[1];
318

    
319
                JobResultEntry jobResultEntry;
320

    
321
                if(jobType.equals("content")) {
322
                    jobResultEntry = contentResults.get(Integer.parseInt(index));
323
                } else {
324
                    jobResultEntry = usageResults.get(Integer.parseInt(index));
325
                }
326

    
327
                openErrorModal(jobResultEntry);
328

    
329
                return true;
330
            }
331
        });
332
    }
333

    
334
    private void openErrorModal(JobResultEntry jobResultEntry) {
335

    
336
        final Modal errorsModal = new Modal();
337
        errorsModal.setDataBackdrop(ModalBackdrop.STATIC);
338

    
339
        FlowPanel modalContent = new FlowPanel();
340

    
341
        String content = "<h2 class=\"uk-modal-title\">Rule: " + jobResultEntry.getName() + "</h2>" +
342
                "<p>See the list of errors found for this specific rule</p>";
343

    
344
        for(String error : jobResultEntry.getErrors()) {
345
            content += "<a class=\"uk-display-block\" target=\"_blank\" href=\"" + storedJob.getBaseUrl() +
346
                    "?verb=GetRecord&metadataPrefix=oai_dc&identifier=" + error + "\">" + error + "</a>";
347
        }
348

    
349
        HTML contentHTML = new HTML(content);
350
        modalContent.add(contentHTML);
351

    
352
        FlowPanel actionButtons = new FlowPanel();
353
        actionButtons.addStyleName("uk-text-right");
354
        modalContent.add(actionButtons);
355

    
356
        Button no = new Button("Ok");
357
        no.setType(ButtonType.DEFAULT);
358
        no.addClickHandler(new ClickHandler() {
359
            @Override
360
            public void onClick(ClickEvent event) {
361
                errorsModal.hide();
362
                errorsModal.removeFromParent();
363
            }
364
        });
365
        actionButtons.add(no);
366

    
367
        ModalBody modalBody = new ModalBody();
368
        modalBody.add(modalContent);
369
        errorsModal.add(modalBody);
370
        errorsModal.getElement().getChild(0).getChild(0).getChild(0).removeFromParent();
371

    
372
        errorsModal.show();
373
    }
374
}
(3-3/3)