Project

General

Profile

1
package eu.dnetlib.repo.manager.client.admin.metrics;
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.i18n.client.DateTimeFormat;
8
import com.google.gwt.query.client.Function;
9
import com.google.gwt.user.client.Event;
10
import com.google.gwt.user.client.Window;
11
import com.google.gwt.user.client.rpc.AsyncCallback;
12
import com.google.gwt.user.client.ui.FlowPanel;
13
import com.google.gwt.user.client.ui.HTML;
14
import eu.dnetlib.gwt.client.help.HelpService;
15
import eu.dnetlib.gwt.client.help.HelpServiceAsync;
16
import eu.dnetlib.repo.manager.client.AbstractRepositoryManagerWidget;
17
import eu.dnetlib.repo.manager.client.HelpCallback;
18
import eu.dnetlib.repo.manager.client.RepositoryManagerWidget;
19
import eu.dnetlib.repo.manager.client.services.RepositoryService;
20
import eu.dnetlib.repo.manager.client.services.RepositoryServiceAsync;
21
import eu.dnetlib.domain.data.PiwikInfo;
22
import org.gwtbootstrap3.client.ui.Alert;
23
import org.gwtbootstrap3.client.ui.Button;
24
import org.gwtbootstrap3.client.ui.Modal;
25
import org.gwtbootstrap3.client.ui.ModalBody;
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

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

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

    
35
/**
36
 * Created by stefania on 10/18/17.
37
 */
38
public class MetricsAdminWidget extends AbstractRepositoryManagerWidget implements RepositoryManagerWidget {
39

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

    
43
    private FlowPanel metricsAdminBoxContent = new FlowPanel();
44

    
45
    private Alert errorAlert = new Alert();
46

    
47
    private static HelpServiceAsync helpService = GWT.create(HelpService.class);
48
    private static RepositoryServiceAsync repositoryService = GWT.create(RepositoryService.class);
49

    
50
    private DateTimeFormat dtf = DateTimeFormat.getFormat("yyyy-MM-dd");
51

    
52
    public MetricsAdminWidget() {
53

    
54
        super();
55

    
56
        HTML title = new HTML("<h1 class=\"uk-article-title\">Metrics Admin</h1>");
57
        title.addStyleName("uk-margin-medium-bottom");
58
        contentPanel.add(title);
59

    
60
        errorAlert.setType(AlertType.DANGER);
61
        errorAlert.setDismissable(false);
62
        errorAlert.setVisible(false);
63
        metricsAdminBoxContent.add(errorAlert);
64

    
65
        contentPanel.add(metricsAdminBoxContent);
66
    }
67

    
68
    @Override
69
    public void clear() {
70

    
71
        metricsAdminBoxContent.clear();
72
        errorAlert.setVisible(false);
73
        gridPanel.remove(helpPanel);
74
    }
75

    
76
    @Override
77
    public void reload() {
78

    
79
        Document.get().getElementById("headerNoTransparent").removeClassName("tm-header-transparent");
80
        metricsAdminBoxContent.add(errorAlert);
81

    
82
        helpService.getHelpById(parentToken, new HelpCallback(helpPanel, gridPanel));
83

    
84
        final HTML loadingWheel = new HTML("<div class=\"loader-big\" style=\"text-align: center; padding-top: 170px; " +
85
                "color: rgb(47, 64, 80); font-weight: bold;\">Retrieving piwik sites info...</div>" +
86
                "<div class=\"whiteFilm\"></div>");
87
        metricsAdminBoxContent.addStyleName("loading-big");
88
        metricsAdminBoxContent.add(loadingWheel);
89

    
90
        repositoryService.getPiwikSitesForRepositories(new AsyncCallback<List<PiwikInfo>>() {
91

    
92
            @Override
93
            public void onFailure(Throwable caught) {
94

    
95
                metricsAdminBoxContent.removeStyleName("loading-big");
96
                metricsAdminBoxContent.remove(loadingWheel);
97

    
98
                errorAlert.setText("System error retrieving piwik sites info.");
99
                errorAlert.setVisible(true);
100
            }
101

    
102
            @Override
103
            public void onSuccess(List<PiwikInfo> results) {
104

    
105
                metricsAdminBoxContent.removeStyleName("loading-big");
106
                metricsAdminBoxContent.remove(loadingWheel);
107

    
108
                if(results!=null) {
109
                    createPiwikSitesInfoList(results, metricsAdminBoxContent);
110
                } else {
111
                    errorAlert.setText("System error retrieving piwik sites info.");
112
                    errorAlert.setVisible(true);
113
                }
114
            }
115
        });
116
    }
117

    
118
    @Override
119
    public void setToken(String parentToken, String rest) {
120
        this.parentToken = parentToken;
121
        this.restToken = rest;
122
    }
123

    
124
    @Override
125
    public void afterAdditionToRootPanel() {
126

    
127
    }
128

    
129
    private void addWidgetHandlers() {
130

    
131
        $(".validate").click(new Function() {
132

    
133
            public boolean f(Event e) {
134

    
135
                errorAlert.setVisible(false);
136

    
137
                String[] idParts = $(e).get(0).getId().split("#");
138
                List<String> repositoryIds = new ArrayList<String>();
139
                repositoryIds.add(idParts[0]);
140

    
141
                validatePiwikSites(repositoryIds);
142

    
143
                return true;
144
            }
145
        });
146
    }
147

    
148
    private void createPiwikSitesInfoList(List<PiwikInfo> results, FlowPanel piwikInfosPanel) {
149

    
150
        if(results.isEmpty()) {
151
            piwikInfosPanel.add(new HTML("There are no piwik sites available yet."));
152
        } else {
153

    
154
//                HTML datasourceTitle = new HTML();
155
//                datasourceTitle.setHTML("<h4 class=\"uk-h4 uk-text-primary uk-scrollspy-inview uk-animation-slide-top-medium\"" +
156
//                        "uk-scrollspy-class=\"\"><span>" + piwikInfo + "</span></h4>");
157
//                piwikInfosPanel.add(datasourceTitle);
158

    
159
            FlowPanel colPanel = new FlowPanel();
160
            colPanel.addStyleName("uk-width-1-1@m uk-first-column uk-margin-medium-bottom");
161
            piwikInfosPanel.add(colPanel);
162

    
163
            FlowPanel divPanel = new FlowPanel();
164
            divPanel.addStyleName("uk-overflow-auto uk-scrollspy-inview uk-animation-slide-top-medium");
165
            colPanel.add(divPanel);
166

    
167
            String content = "<table class=\"uk-table uk-table-striped uk-table-middle\" style=\"font-size: 12px\">" +
168
                    "<thead><tr><th class=\"uk-text-nowrap\">Repository</th><th class=\"uk-text-nowrap\">Piwik site</th>" +
169
                    "<th class=\"uk-text-nowrap\">Requested on</th><th class=\"uk-text-nowrap\">Requestor</th>" +
170
                    "<th class=\"uk-text-nowrap\">Validated</th>" +
171
                    "<th class=\"uk-text-nowrap\">Actions</th></tr></thead>";
172

    
173
            content += "<tbody>";
174

    
175
            for(PiwikInfo piwikInfo : results) {
176

    
177
                content += "<tr class=\"el-item\">" +
178
                        "";
179

    
180
                // REPOSITORY
181
                content += "<td class=\"uk-table-shrink\">";
182
                if(piwikInfo.getRepositoryName()!=null && !piwikInfo.getRepositoryName().trim().equals(""))
183
                    content += "<div class=\"el-title\">" + piwikInfo.getRepositoryName() + "</div>";
184
                else
185
                    content += "--";
186
                if(piwikInfo.getCountry()!=null && !piwikInfo.getCountry().trim().equals(""))
187
                    content += "<div class=\"el-title\">" + piwikInfo.getCountry() + "</div>";
188
                else
189
                    content += "--";
190
                if(piwikInfo.getRepositoryId()!=null && !piwikInfo.getRepositoryId().trim().equals(""))
191
                    content += "<div class=\"el-title\">(ID: " + piwikInfo.getRepositoryId() + ")</div>";
192
                else
193
                    content += "--";
194

    
195
                content += "</td>";
196

    
197
                // PIWIK SITE
198
                content += "<td class=\"uk-table-shrink\">";
199
                if(piwikInfo.getSiteId()!=null && !piwikInfo.getSiteId().trim().equals(""))
200
                    content += "<div class=\"el-title\">ID: " + piwikInfo.getSiteId() + "</div>";
201
                else
202
                    content += "--";
203
                if(piwikInfo.getAuthenticationToken()!=null && !piwikInfo.getAuthenticationToken().trim().equals(""))
204
                    content += "<div class=\"el-title\">Authentication token: " + piwikInfo.getAuthenticationToken() + "</div>";
205
                else
206
                    content += "--";
207
                content += "</td>";
208

    
209
                // REQUEST DATE
210
                if(piwikInfo.getCreationDate()!=null)
211
                    content += "<td class=\"uk-text-nowrap uk-table-shrink\"><div class=\"el-title\">" + dtf.format(piwikInfo.getCreationDate()) + "</div></td>";
212
                else
213
                    content += "<td class=\"uk-text-nowrap uk-table-shrink\"><div class=\"el-title\">--</div></td>";
214

    
215
                // REQUESTOR
216
                content += "<td class=\"uk-text-nowrap uk-table-shrink\">";
217
                if(piwikInfo.getRequestorName()!=null && !piwikInfo.getRequestorName().trim().equals(""))
218
                    content += "<div class=\"el-title\">" + piwikInfo.getRequestorName() + "</div>";
219
                else
220
                    content += "--";
221
                if(piwikInfo.getRequestorEmail()!=null && !piwikInfo.getRequestorEmail().trim().equals(""))
222
                    content += "<div class=\"el-title\">" + piwikInfo.getRequestorEmail() + "</div>";
223
                else
224
                    content += "--";
225
                content += "</td>";
226

    
227
                // APPROVED
228
                if(piwikInfo.isValidated()) {
229
                    content += "<td class=\"uk-text-nowrap uk-table-shrink\">";
230
                    content += "<div class=\"el-title\">YES</div>" ;
231
                    if(piwikInfo.getValidationDate()!=null)
232
                        content += "<div class=\"el-title\">on " + dtf.format(piwikInfo.getValidationDate()) + "</div>" ;
233
                    content += "</td>";
234
                }  else
235
                    content += "<td class=\"uk-text-nowrap uk-table-shrink\"><div class=\"el-title\">NO</div></td>";
236

    
237
                content += "<td class=\"uk-text-nowrap uk-table-shrink\">";
238

    
239
                // ACTIONS
240
                if(!piwikInfo.isValidated())
241
                    content += "<a href=\"javascript:;\" id=\"" + piwikInfo.getRepositoryId() + "#validate\" " +
242
                            "class=\"uk-button uk-button-primary validate\">Validate</button>";
243
                content += "</td>" +
244
                        "</tr>";
245
            }
246

    
247
            content += "</tbody></table>";
248

    
249
            HTML reposListHTML = new HTML();
250
            reposListHTML.setHTML(content);
251

    
252
            divPanel.add(reposListHTML);
253
        }
254

    
255
        addWidgetHandlers();
256
    }
257

    
258
    private void validatePiwikSites(final List<String> repositoryIds) {
259

    
260
        final Modal approvePiwikSitesConfirmationPopup = new Modal();
261
        approvePiwikSitesConfirmationPopup.setDataBackdrop(ModalBackdrop.STATIC);
262

    
263
        FlowPanel modalContent = new FlowPanel();
264

    
265
        HTML description = new HTML("<h2 class=\"uk-modal-title\">Approval Confirmation</h2>\n" +
266
                "<p>Are you sure you want to validate the selected piwik site(s)?</p>");
267
        modalContent.add(description);
268

    
269
        FlowPanel actionButtons = new FlowPanel();
270
        actionButtons.addStyleName("uk-text-right");
271
        modalContent.add(actionButtons);
272

    
273
        Button no = new Button("Cancel");
274
        no.setType(ButtonType.DEFAULT);
275
        no.addClickHandler(new ClickHandler() {
276
            @Override
277
            public void onClick(ClickEvent event) {
278
                approvePiwikSitesConfirmationPopup.hide();
279
                approvePiwikSitesConfirmationPopup.removeFromParent();
280
            }
281
        });
282
        actionButtons.add(no);
283

    
284
        Button yes = new Button("Yes, validate");
285
        yes.setType(ButtonType.PRIMARY);
286
        yes.addClickHandler(new ClickHandler() {
287
            @Override
288
            public void onClick(ClickEvent event) {
289

    
290
                approvePiwikSitesConfirmationPopup.hide();
291
                approvePiwikSitesConfirmationPopup.removeFromParent();
292

    
293
                final HTML loadingWheel = new HTML("<div class=\"loader-big\"></div><div class=\"whiteFilm\"></div>");
294
                metricsAdminBoxContent.addStyleName("loading-big");
295
                metricsAdminBoxContent.add(loadingWheel);
296

    
297
                repositoryService.markPiwikSiteAsValidated(repositoryIds.get(0), new AsyncCallback<Void>() {
298

    
299
                    @Override
300
                    public void onFailure(Throwable caught) {
301

    
302
                        metricsAdminBoxContent.removeStyleName("loading-big");
303
                        metricsAdminBoxContent.remove(loadingWheel);
304

    
305
                        errorAlert.setText("System error validating the specified piwik site(s)");
306
                        errorAlert.setVisible(true);
307
                    }
308

    
309
                    @Override
310
                    public void onSuccess(Void result) {
311

    
312
                        metricsAdminBoxContent.removeStyleName("loading-big");
313
                        metricsAdminBoxContent.remove(loadingWheel);
314

    
315
                        clear();
316
                        reload();
317

    
318
                        Window.scrollTo(0, 0);
319
                    }
320
                });
321
            }
322
        });
323
        actionButtons.add(yes);
324

    
325
        ModalBody modalBody = new ModalBody();
326
        modalBody.add(modalContent);
327
        approvePiwikSitesConfirmationPopup.add(modalBody);
328
        approvePiwikSitesConfirmationPopup.getElement().getChild(0).getChild(0).getChild(0).removeFromParent();
329

    
330
        approvePiwikSitesConfirmationPopup.show();
331
    }
332
}
(2-2/2)