source: trunk/www/views/devices/list_devices.jsp @ 7816

Last change on this file since 7816 was 7816, checked in by Nicklas Nordborg, 18 months ago

References #2213: Extend registration of devices

Added isVerified flag to devices. Validation should now work again. Since all devices are now registered the "Remember device" option when verifying a device simple sets the isVerifed flag to true.

File size: 15.0 KB
Line 
1<%-- $Id $
2  ------------------------------------------------------------------
3  Copyright (C) 2017 Nicklas Nordborg
4
5  This file is part of BASE - BioArray Software Environment.
6  Available at http://base.thep.lu.se/
7
8  BASE is free software; you can redistribute it and/or
9  modify it under the terms of the GNU General Public License
10  as published by the Free Software Foundation; either version 3
11  of the License, or (at your option) any later version.
12
13  BASE is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  GNU General Public License for more details.
17
18  You should have received a copy of the GNU General Public License
19  along with BASE. If not, see <http://www.gnu.org/licenses/>.
20  ------------------------------------------------------------------
21
22  @author Nicklas
23--%>
24<%@ page pageEncoding="UTF-8" session="false"
25  import="net.sf.basedb.core.SessionControl"
26  import="net.sf.basedb.core.DbControl"
27  import="net.sf.basedb.core.Item"
28  import="net.sf.basedb.core.Include"
29  import="net.sf.basedb.core.User"
30  import="net.sf.basedb.core.UserDevice"
31  import="net.sf.basedb.core.Type"
32  import="net.sf.basedb.core.ItemQuery"
33  import="net.sf.basedb.core.ItemResultIterator"
34  import="net.sf.basedb.core.ItemContext"
35  import="net.sf.basedb.core.Nameable"
36  import="net.sf.basedb.core.Permission"
37  import="net.sf.basedb.core.PluginDefinition"
38  import="net.sf.basedb.core.plugin.GuiContext"
39  import="net.sf.basedb.core.plugin.Plugin"
40  import="net.sf.basedb.clients.web.Base"
41  import="net.sf.basedb.clients.web.ModeInfo"
42  import="net.sf.basedb.clients.web.PermissionUtil"
43  import="net.sf.basedb.clients.web.util.HTML"
44  import="net.sf.basedb.util.GeoLocation"
45  import="net.sf.basedb.util.Values"
46  import="net.sf.basedb.util.formatter.Formatter"
47  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
48  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
49  import="net.sf.basedb.clients.web.extensions.JspContext"
50  import="net.sf.basedb.clients.web.extensions.renderer.PrefixSuffixRenderer"
51  import="net.sf.basedb.clients.web.extensions.toolbar.ButtonAction" 
52  import="net.sf.basedb.clients.web.extensions.toolbar.ToolbarUtil"
53  import="net.sf.basedb.clients.web.extensions.list.ListColumnAction"
54  import="net.sf.basedb.clients.web.extensions.list.ListColumnUtil"
55  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
56  import="java.util.Date"
57  import="java.util.Iterator"
58  import="java.util.List"
59  import="java.util.Map"
60%>
61<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
62<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
63<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
64<%!
65  private static final Item itemType = Item.USERDEVICE;
66  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.LIST);
67%>
68<%
69final SessionControl sc = Base.getExistingSessionControl(pageContext, Permission.DENIED, itemType);
70final String ID = sc.getId();
71final boolean createPermission = sc.hasPermission(Permission.CREATE, itemType);
72final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
73
74final ModeInfo mode = ModeInfo.get(request.getParameter("mode"));
75final String callback = request.getParameter("callback");
76final String title = mode.generateTitle("device", "devices");
77final DbControl dc = sc.newDbControl();
78ItemResultIterator<UserDevice> devices = null;
79try
80{
81  final User user = cc.getInclude().contains(Include.OTHERS) ? 
82    null : User.getById(dc, sc.getLoggedInUserId());
83
84  Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc);
85  Formatter<Date> dateTimeFormatter = FormatterFactory.getDateTimeFormatter(sc);
86  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
87  try
88  {
89    final ItemQuery<UserDevice> query = Base.getConfiguredQuery(dc, cc, true, UserDevice.getQuery(user), mode);
90    devices = query.iterate(dc);
91  }
92  catch (Throwable t)
93  {
94    t.printStackTrace();
95    cc.setMessage(t.getMessage());
96  }
97  int numListed = 0;
98  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, guiContext, null);
99  ExtensionsInvoker<ButtonAction> invoker = ToolbarUtil.useExtensions(jspContext);
100  ExtensionsInvoker<ListColumnAction<UserDevice,?>> columnsInvoker = ListColumnUtil.useExtensions(jspContext);
101  %>
102  <base:page title="<%=title==null ? "Devices" : title%>" type="<%=mode.getPageType()%>" id="list-page">
103  <base:head scripts="table.js,~devices.js" styles="table.css,toolbar.css">
104    <ext:scripts context="<%=jspContext%>" />
105    <ext:stylesheets context="<%=jspContext%>" />
106  </base:head>
107 
108  <base:body>
109    <h1><%=title==null ? "Devices" : title%></h1>
110    <div class="content">
111    <tbl:table 
112      id="devices" 
113      columns="<%=cc.getSetting("columns")%>"
114      sortby="<%=cc.getSortProperty()%>" 
115      direction="<%=cc.getSortDirection()%>"
116      action="index.jsp"
117      sc="<%=sc%>"
118      item="<%=itemType%>"
119      filterrows="<%=cc.getFilterRows()%>"
120      subclass="fulltable"
121      >
122      <tbl:hidden 
123        name="mode" 
124        value="<%=mode.getName()%>" 
125      />
126      <tbl:hidden 
127        name="callback" 
128        value="<%=callback%>" 
129        skip="<%=callback == null%>" 
130      />
131      <tbl:columndef 
132        id="name"
133        property="name"
134        datatype="string"
135        title="Name"
136        sortable="true" 
137        filterable="true"
138        exportable="true"
139        show="always" 
140      />
141      <tbl:columndef 
142        id="id"
143        clazz="uniquecol"
144        property="id"
145        datatype="int"
146        title="ID"
147        sortable="true"
148        filterable="true"
149        exportable="true"
150      />
151      <tbl:columndef 
152        id="client"
153        property="client.name"
154        datatype="string"
155        title="Client application" 
156        sortable="true" 
157        filterable="true" 
158        exportable="true"
159      />
160      <tbl:columndef 
161        id="user"
162        property="user.name"
163        datatype="string"
164        title="User" 
165        sortable="true" 
166        filterable="true" 
167        exportable="true"
168      />
169      <tbl:columndef 
170        id="userAgent"
171        property="userAgent"
172        datatype="string"
173        title="User agent" 
174        sortable="true" 
175        filterable="true" 
176        exportable="true"
177      />
178      <tbl:columndef 
179        id="entryDate"
180        property="entryDate"
181        datatype="date"
182        title="Registered"
183        sortable="true" 
184        filterable="true"
185        exportable="true"
186        formatter="<%=dateFormatter%>"
187      />
188      <tbl:columndef 
189        id="verified"
190        property="verified"
191        datatype="boolean"
192        title="Is verified"
193        sortable="true" 
194        filterable="true"
195        exportable="true"
196      />
197      <tbl:columndef 
198        id="lastUsed"
199        property="lastUsed"
200        datatype="timestamp"
201        title="Last used"
202        sortable="true" 
203        filterable="true"
204        exportable="true"
205        formatter="<%=dateTimeFormatter%>"
206      />
207      <tbl:columndef 
208        id="lastRemoteId"
209        property="lastRemoteId"
210        datatype="string"
211        title="Last remote ID" 
212        sortable="true" 
213        filterable="true" 
214        exportable="true"
215      />
216      <tbl:columndef 
217        id="location"
218        property="location"
219        datatype="string"
220        title="Location" 
221        sortable="true" 
222        filterable="true" 
223        exportable="true"
224      />
225      <tbl:columndef 
226        id="description"
227        property="description"
228        datatype="string"
229        title="Description" 
230        sortable="true" 
231        filterable="true" 
232        exportable="true"
233      />
234      <tbl:columndef
235        id="permission"
236        title="Permission"
237      />
238      <tbl:columndef 
239        id="xt-columns" 
240        extensions="<%=columnsInvoker%>" 
241        jspcontext="<%=jspContext%>" 
242      />
243      <div class="panelgroup bg-filled-50 bottomborder">
244        <tbl:toolbar
245          subclass="bottomborder"
246          visible="<%=mode.hasToolbar()%>"
247          >
248          <tbl:button 
249            id="btnDeleteItems"
250            image="delete.png"
251            title="Delete" 
252            tooltip="Delete the selected items" 
253          />
254          <tbl:button 
255            id="btnColumns"
256            image="columns.png" 
257            title="Columns&hellip;" 
258            tooltip="Show, hide and re-order columns" 
259          />
260          <tbl:button 
261            id="btnExport"
262            data-plugin-type="EXPORT"
263            image="export.png" 
264            title="Export&hellip;" 
265            tooltip="Export data" 
266            visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
267          />
268          <tbl:button 
269            id="btnRunPlugin"
270            data-plugin-type="OTHER"
271            image="runplugin.png" 
272            title="Run plugin&hellip;" 
273            tooltip="Run a plugin" 
274            visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
275          />
276          <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
277            wrapper="<%=new PrefixSuffixRenderer<ButtonAction>(jspContext, "<td>", "</td>") %>"/>
278        </tbl:toolbar>
279        <tbl:panel>
280          <tbl:presetselector />
281          <tbl:navigator
282            page="<%=cc.getPage()%>" 
283            rowsperpage="<%=cc.getRowsPerPage()%>" 
284            totalrows="<%=devices == null ? 0 : devices.getTotalCount()%>" 
285            visible="<%=mode.hasNavigator()%>"
286          />
287        </tbl:panel>
288      </div>
289      <tbl:data>
290        <tbl:headers>
291          <tbl:headerrow>
292            <tbl:header colspan="3" />
293            <tbl:columnheaders />
294          </tbl:headerrow>
295          <%
296          int numFilters = cc.getNumPropertyFilters();
297          int numRows = cc.getFilterRows();
298          for (int filterNo = 0; filterNo < numRows; filterNo++)
299          {
300            boolean lastRow = filterNo == numRows-1;
301            %>
302            <tbl:headerrow>
303              <tbl:header subclass="index" />
304              <tbl:header 
305                subclass="check" 
306                visible="<%=mode.hasCheck()%>"
307                ><base:icon 
308                  subclass="link table-check"
309                  image="check_uncheck.png" 
310                  tooltip="Toggle all (use CTRL, ALT or SHIFT to check/uncheck)" 
311                  visible="<%=lastRow%>"
312                /></tbl:header>
313              <tbl:header 
314                subclass="check" 
315                visible="<%=mode.hasRadio()%>"
316                />
317              <tbl:header 
318                subclass="icons" 
319                visible="<%=mode.hasIcons()%>"
320                >
321                <base:icon
322                  subclass="link table-filter-row-action"
323                  image="add.png"
324                  tooltip="Add extra filter row"
325                  visible="<%=lastRow%>"
326                /><base:icon
327                  subclass="link table-filter-row-action"
328                  image="remove.png"
329                  tooltip="Remove this filter row"
330                  visible="<%=numRows > 1 || numFilters > 0 %>"
331                  data-remove-row="<%=filterNo%>"
332                />
333              </tbl:header>
334              <tbl:propertyfilter row="<%=filterNo%>" />
335            </tbl:headerrow>
336            <%
337          }
338          %>
339        </tbl:headers>
340        <tbl:rows>
341          <%
342          if (cc.getMessage() != null)
343          {
344            %>
345            <tbl:panel subclass="bg-filled-50">
346              <div class="messagecontainer error"><%=cc.getMessage()%></div>
347            </tbl:panel>
348            <%
349            cc.setMessage(null);
350          }
351          int index = cc.getPage()*cc.getRowsPerPage();
352          int selectedItemId = cc.getId();
353          if (devices != null)
354          {
355            int currentDeviceId = sc.getDeviceId();
356            while (devices.hasNext())
357            {
358              UserDevice item = devices.next();
359              int itemId = item.getId();
360             
361              boolean deletePermission = item.hasPermission(Permission.DELETE);
362              boolean writePermission = item.hasPermission(Permission.WRITE);
363              String tooltip = mode.isSelectionMode() ?
364                  "Select this item" : "View this item" + (writePermission ? " (use CTRL, ALT or SHIFT to edit)" : "");
365              String name = HTML.encodeTags(item.getName());
366              index++;
367              numListed++;
368              %>
369              <tbl:row>
370                <tbl:header 
371                  clazz="index"
372                  ><%=index%></tbl:header>
373                <tbl:header 
374                  clazz="check" 
375                  visible="<%=mode.hasCheck()%>"
376                  ><input 
377                    type="checkbox" 
378                    name="<%=itemId%>" 
379                    value="<%=itemId%>" 
380                    title="<%=name%>" 
381                    <%=cc.getSelected().contains(itemId) ? "checked" : ""%> 
382                  ></tbl:header>
383                <tbl:header 
384                  clazz="check" 
385                  visible="<%=mode.hasRadio()%>"
386                  ><input 
387                    type="radio" 
388                    name="item_id" 
389                    value="<%=itemId%>" 
390                    title="<%=name%>" 
391                    <%=selectedItemId == itemId ? "checked" : ""%>
392                  ></tbl:header>
393                <tbl:header 
394                  clazz="icons" 
395                  visible="<%=mode.hasIcons()%>"
396                  ><base:icon
397                    image="star.png"
398                    tooltip="This is the current device"
399                    visible="<%=itemId == currentDeviceId%>" 
400                  />&nbsp;</tbl:header>
401                <tbl:cell column="name"><div
402                  class="link table-item"
403                  data-item-id="<%=itemId%>"
404                  data-no-edit="<%=writePermission ? 0 : 1 %>" 
405                  tabindex="0"
406                  title="<%=tooltip%>"><%=name%></div></tbl:cell>
407                <tbl:cell column="id"><%=item.getId()%></tbl:cell>
408                <tbl:cell column="user"
409                  ><base:propertyvalue 
410                    item="<%=item%>" 
411                    property="user"
412                    enableEditLink="<%=mode.hasEditLink()%>" 
413                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
414                  /></tbl:cell>
415                <tbl:cell column="client"
416                  ><base:propertyvalue 
417                    item="<%=item%>" 
418                    property="client"
419                    enableEditLink="<%=mode.hasEditLink()%>" 
420                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
421                  /></tbl:cell>
422                <tbl:cell column="userAgent"><%=HTML.encodeTags(item.getUserAgent())%></tbl:cell>
423                <tbl:cell column="entryDate" value="<%=item.getEntryDate()%>" />
424                <tbl:cell column="verified" value="<%=item.isVerified() ? "Yes" : "No"%>" />
425                <tbl:cell column="lastUsed" value="<%=item.getLastUsed()%>" />
426                <tbl:cell column="lastRemoteId"><%=HTML.encodeTags(item.getLastRemoteId())%></tbl:cell>
427                <tbl:cell column="location"><%=HTML.encodeTags(item.getLocation())%>
428                  <% String mapURL = GeoLocation.getURLToMap(item.getLocationLatitude(), item.getLocationLongitude()); %>
429                  <base:icon href="<%=mapURL%>" image="map.png" tooltip="Show map" visible="<%=mapURL != null %>"/>
430                </tbl:cell>
431                <tbl:cell column="description"><%=HTML.encodeTags(item.getDescription())%></tbl:cell>
432                <tbl:cell column="permission"><%=PermissionUtil.getShortPermissions(item)%></tbl:cell>
433                <tbl:xt-cells dc="<%=dc%>" item="<%=item%>">
434                  <tbl:cell column="xt-columns" />
435                </tbl:xt-cells>
436              </tbl:row>
437              <%
438              }
439            }
440          if (numListed == 0)
441          {
442            %>
443            <tbl:panel subclass="bg-filled-50">
444              <div class="messagecontainer note">
445              <%=devices == null || devices.getTotalCount() == 0 ? "No devices were found" : "No devices on this page. Please select another page!" %>
446              </div>
447            </tbl:panel>
448            <%
449          }
450          %>
451        </tbl:rows>
452      </tbl:data>
453    </tbl:table>
454    </div>
455   
456    <base:buttongroup subclass="dialogbuttons">
457      <base:button id="btnOk" title="Ok" visible="<%=mode.hasOkButton()%>" />
458      <base:button id="close" title="Cancel" visible="<%=mode.hasCancelButton()%>" />
459      <base:button id="close" title="Close" visible="<%=mode.hasCloseButton()%>" />
460    </base:buttongroup>
461   
462  </base:body>
463  </base:page>
464  <%
465}
466finally
467{
468  if (devices != null) devices.close();
469  if (dc != null) dc.close();
470}
471%>
Note: See TracBrowser for help on using the repository browser.