Merge branch 'datatable' into develop

This commit is contained in:
fred-fri 2012-05-09 14:07:29 +09:00
commit 6edb37aed5
14 changed files with 511 additions and 24 deletions

@ -7,15 +7,14 @@
<body>
<wicket:extend>
<div class="span-24 last">
<!-- Left column -->
<!-- <div class="span-11 last"> -->
<!-- <div wicket:id="cCLPanel"></div> -->
<!-- </div> -->
<!-- Right column -->
<!-- <div class="span-11 last"> -->
<div wicket:id="listCLPanel"></div>
<!-- <div wicket:id="flcltp"></div> -->
<!-- </div> -->
<div wicket:id="dialog">
<div wicket:id="editpanel"></div>
</div>
<!--<div wicket:id="listCLPanel"></div>-->
<div wicket:id="datapanel"></div>
</div>
</wicket:extend>
</body>

@ -2,27 +2,61 @@ package se.su.dsv.scipro.admin.pages;
import org.apache.wicket.PageParameters;
import se.su.dsv.scipro.admin.panels.AdminListCheckListTemplatePanel;
import se.su.dsv.scipro.data.enums.CheckListRole;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.markup.html.panel.EmptyPanel;
import org.apache.wicket.model.IModel;
import org.odlabs.wiquery.ui.dialog.Dialog;
import se.su.dsv.scipro.checklists.panels.FunctionalEditChecklistTemplatePanel;
import se.su.dsv.scipro.checklists.panels.FunctionalListCheckListTemplatePanel;
import se.su.dsv.scipro.data.dataobjects.CheckListTemplate;
import se.su.dsv.scipro.datatables.checklist.CheckListTemplateDataPanel;
import se.su.dsv.scipro.security.auth.Authorization;
import se.su.dsv.scipro.security.auth.roles.Roles;
/**
* @author Fredrik Norberg - fnorbe@dsv.su.se
*
*/
@Authorization(authorizedRoles={Roles.SYSADMIN, Roles.ADMIN})
@Authorization(authorizedRoles = {Roles.SYSADMIN, Roles.ADMIN})
public class AdminCheckListPage extends AbstractAdminPage {
public static final String MAIN_MENU_LABEL = "CheckLists";
public AdminCheckListPage(PageParameters pp) {
super(pp);
// add(new CreateChecklistTemplatePanel("cCLPanel"));
add(new AdminListCheckListTemplatePanel("listCLPanel", pp, CheckListRole.ADMIN));
// add(new FunctionalListCheckListTemplatePanel("flcltp"));
}
public static final String MAIN_MENU_LABEL = "CheckLists";
private Dialog dialog;
private CheckListTemplateDataPanel cltdp;
public AdminCheckListPage(PageParameters pp) {
super(pp);
// add(new AdminListCheckListTemplatePanel("listCLPanel", pp, CheckListRole.ADMIN));
dialog = new Dialog("dialog");
dialog.setModal(true);
dialog.setAutoOpen(false);
dialog.setWidth(550);
dialog.setHeight(700);
dialog.add(new EmptyPanel("editpanel"));
add(dialog);
add(cltdp = new CheckListTemplateDataPanel("datapanel", true) {
@Override
public void onClick(IModel<CheckListTemplate> clicked, AjaxRequestTarget target) {
System.out.println(clicked.getObject().getCreator());
dialog.replace(new FunctionalEditChecklistTemplatePanel("editpanel", clicked.getObject()) {
@Override
public void onUpdate(AjaxRequestTarget target) {
dialog.close(target);
target.addComponent(cltdp);
}
});
target.addComponent(dialog);
dialog.open(target);
}
});
cltdp.setOutputMarkupId(true);
}
}

@ -83,6 +83,10 @@ public class ChecklistCategory extends DomainObject{
return false;
return true;
}
@Override
public String toString(){
return categoryName;
}
}

@ -0,0 +1,12 @@
<!DOCTYPE html>
<html
xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
<body>
<wicket:panel>
<div>Filter by title or creator:</div>
<div wicket:id="filterStringPanel"></div>
<div>Rows per page: <span wicket:id="numberDropDown"></span></div>
<table wicket:id="datatable"></table>
</wicket:panel>
</body>
</html>

@ -0,0 +1,151 @@
package se.su.dsv.scipro.datatables.checklist;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.markup.html.repeater.data.table.*;
import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import se.su.dsv.scipro.data.dataobjects.CheckListTemplate;
import se.su.dsv.scipro.reusable.AjaxDropDown;
import se.su.dsv.scipro.reusable.FilterBooleanPanel;
import se.su.dsv.scipro.reusable.FilterStringPanel;
import se.su.dsv.scipro.springdata.services.ChecklistTemplateService;
import java.util.ArrayList;
import java.util.Iterator;
/**
* Author: fred-fri
* Date: 5/2/12
*/
public abstract class CheckListTemplateDataPanel extends Panel {
@SpringBean
public ChecklistTemplateService checklistTemplateService;
CheckListTemplateDataPanel cltdp; //must be kept as a reference to self for abstract method cascading
DataTable<CheckListTemplate> table;
NavigationToolbar navigationToolbar;
FilterStringPanel filterStringPanel;
Integer number;
AjaxDropDown<Integer> numberDropDown;
ChecklistTemplateProvider checklistTemplateProvider;
public abstract void onClick(IModel<CheckListTemplate> clicked, AjaxRequestTarget target);
public CheckListTemplateDataPanel(String id, boolean adminPrivileges) {
super(id);
cltdp = this;
filterStringPanel = new FilterStringPanel("filterStringPanel") {
@Override
public void onUpdateFilter(AjaxRequestTarget target) {
checklistTemplateProvider.setFilterString(getFilterString());
target.addComponent(table);
}
};
add(filterStringPanel);
number = new Integer(10);
ArrayList<Integer> numberList = new ArrayList<Integer>();
numberList.add(new Integer(10));
numberList.add(new Integer(25));
numberList.add(new Integer(100));
numberDropDown = new AjaxDropDown<Integer>("numberDropDown", new Model<Integer>(number), new Model<ArrayList<Integer>>(numberList)) {
@Override
public void onNewSelection(AjaxRequestTarget target, Integer objectSelected) {
table.setRowsPerPage(objectSelected);
target.addComponent(table);
}
};
add(numberDropDown);
IColumn[] columns = new IColumn[4];
columns[0] = new ClickableTitleColumn<CheckListTemplate>(Model.of("Name"), "name", "name") {
@Override
protected void onClick(IModel<CheckListTemplate> clicked, AjaxRequestTarget target) {
// System.out.println(clicked.getObject().getName());
cltdp.onClick(clicked, target);
}
};
columns[1] = new PropertyColumn<CheckListTemplate>(Model.of("Creator"), "creator", "creator");
columns[2] = new PropertyColumn<CheckListTemplate>(Model.of("Categories"), "categories");
columns[3] = new ClickableOrderColumn<CheckListTemplate>(Model.of("Order"), "templateNumber", "templateNumber", adminPrivileges) {
@Override
protected void onClick(IModel<CheckListTemplate> clicked, AjaxRequestTarget target, boolean up) {
System.out.println(up);
if (up){
checklistTemplateService.upChecklistTemplate(clicked.getObject());
target.addComponent(table);
} else {
checklistTemplateService.downChecklistTemplate(clicked.getObject());
target.addComponent(table);
}
}
};
table = new DataTable<CheckListTemplate>("datatable", columns, checklistTemplateProvider = new ChecklistTemplateProvider(), 10);
table.setOutputMarkupId(true);
table.addBottomToolbar(navigationToolbar = new NavigationToolbar(table));
table.addTopToolbar(new HeadersToolbar(table, checklistTemplateProvider));
add(table);
}
private class ChecklistTemplateProvider extends SortableDataProvider<CheckListTemplate> {
private String filterString;
public ChecklistTemplateProvider() {
setSort("templateNumber", true);
}
@Override
public Iterator<? extends CheckListTemplate> iterator(int first, int count) {
// Sort(Direction direction, String... properties)
// new Sort(Sort.Direction.ASC, "name")
Sort sort;
if (getSort().isAscending()){
sort = new Sort(Sort.Direction.ASC, getSort().getProperty());
}
else {
sort = new Sort(Sort.Direction.DESC, getSort().getProperty());
}
// new Sort(Sort.Direction.ASC, getSort().toString())
//Changed from count to table.getRowsPerPage to make pagination work.
//return checklistTemplateService.find(filterString, new PageRequest(table.getCurrentPage(), count, sort)).iterator();
return checklistTemplateService.find(filterString, new PageRequest(table.getCurrentPage(), table.getRowsPerPage(), sort)).iterator();
}
@Override
public int size() {
return safeLongToInt(checklistTemplateService.count(filterString));
}
@Override
public IModel<CheckListTemplate> model(CheckListTemplate object) {
return Model.of(object);
}
public void setFilterString(String filterString){
this.filterString = filterString;
}
}
public static int safeLongToInt(long l) {
if (l < Integer.MIN_VALUE || l > Integer.MAX_VALUE) {
throw new IllegalArgumentException
(l + " cannot be cast to int without changing its value.");
}
return (int) l;
}
}

@ -0,0 +1,3 @@
<wicket:panel>
<span wicket:id="label"></span> <button wicket:id="uplink">+</button> <button wicket:id="downlink">-</button>
</wicket:panel>

@ -0,0 +1,70 @@
package se.su.dsv.scipro.datatables.checklist;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import se.su.dsv.scipro.icons.ImageObject;
/**
* Author: fred-fri
* Date: 5/4/12
*/
public abstract class ClickableOrderColumn<T> extends AbstractColumn<T> {
private boolean adminPrivileges;
private final String property;
public ClickableOrderColumn(IModel<String> displayModel,
String property, boolean adminPrivileges) {
this(displayModel, property, null, adminPrivileges);
}
public ClickableOrderColumn(IModel<String> displayModel,
String property, String sort, boolean adminPrivileges) {
super(displayModel, sort);
this.property = property;
this.adminPrivileges = adminPrivileges;
}
public void populateItem(Item<ICellPopulator<T>> cellItem,
String componentId, IModel<T> rowModel) {
cellItem.add(new LinkPanel(componentId, rowModel,
new PropertyModel<Object>(rowModel, property)));
}
protected abstract void onClick(IModel<T> clicked, AjaxRequestTarget target, boolean up);
private class LinkPanel extends Panel {
public LinkPanel(String id, IModel<T> rowModel, IModel<?>
labelModel) {
super(id);
add(new Label("label", labelModel));
AjaxLink<T> uplink = new AjaxLink<T>("uplink", rowModel) {
@Override
public void onClick(AjaxRequestTarget target) {
ClickableOrderColumn.this.onClick(getModel(), target, true);
}
};
uplink.setVisible(adminPrivileges);
add(uplink);
AjaxLink<T> downlink = new AjaxLink<T>("downlink", rowModel) {
@Override
public void onClick(AjaxRequestTarget target) {
ClickableOrderColumn.this.onClick(getModel(), target, false);
}
};
downlink.setVisible(adminPrivileges);
add(downlink);
}
}
}

@ -0,0 +1,3 @@
<wicket:panel>
<a wicket:id="link"><span wicket:id="label"></span></a>
</wicket:panel>

@ -0,0 +1,66 @@
package se.su.dsv.scipro.datatables.checklist;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.PropertyModel;
/**
* Author: fred-fri
* Date: 5/4/12
*/
public abstract class ClickableTitleColumn<T> extends AbstractColumn<T> {
private final String property;
public ClickableTitleColumn(IModel<String> displayModel,
String property) {
this(displayModel, property, null);
}
public ClickableTitleColumn(IModel<String> displayModel,
String property, String sort) {
super(displayModel, sort);
this.property = property;
}
public void populateItem(Item<ICellPopulator<T>> cellItem,
String componentId, IModel<T> rowModel) {
cellItem.add(new LinkPanel(componentId, rowModel,
new PropertyModel<Object>(rowModel, property)));
}
protected abstract void onClick(IModel<T> clicked, AjaxRequestTarget target);
private class LinkPanel extends Panel {
public LinkPanel(String id, IModel<T> rowModel, IModel<?>
labelModel) {
super(id);
// Link<T> link = new Link<T>("link", rowModel) {
// @Override
// public void onClick() {
// ClickableTitleColumn.this.onClick(getModel());
// }
// };
// add(link);
// link.add(new Label("label", labelModel));
AjaxLink<T> link = new AjaxLink<T>("link", rowModel) {
@Override
public void onClick(AjaxRequestTarget target) {
ClickableTitleColumn.this.onClick(getModel(), target);
}
};
add(link);
link.add(new Label("label", labelModel));
}
}
}

@ -0,0 +1,17 @@
package se.su.dsv.scipro.springdata.repos;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.querydsl.QueryDslPredicateExecutor;
import org.springframework.transaction.annotation.Transactional;
import se.su.dsv.scipro.data.dataobjects.CheckListTemplate;
/**
* @author: fred-fri
* date: 2012 03 26
*/
@Transactional(readOnly = true)
public interface ChecklistTemplateRepo extends JpaRepository<CheckListTemplate, Long>, QueryDslPredicateExecutor<CheckListTemplate> {
CheckListTemplate findByTemplateNumber(int templateNumber);
}

@ -43,8 +43,13 @@ public class AbstractServiceImpl<T, ID extends Serializable> implements CrudServ
return repository.findOne(id);
}
@Override
public Iterable<T> findAll() {
return repository.findAll();
}
/**
/**
* Returns whether an entity with the given id exists.
*
* @param id

@ -0,0 +1,103 @@
package se.su.dsv.scipro.springdata.serviceimpls;
import com.mysema.query.types.expr.BooleanExpression;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import se.su.dsv.scipro.data.dataobjects.CheckListTemplate;
import se.su.dsv.scipro.data.dataobjects.QCheckListTemplate;
import se.su.dsv.scipro.springdata.repos.ChecklistTemplateRepo;
import se.su.dsv.scipro.springdata.services.ChecklistTemplateService;
import javax.annotation.Resource;
/**
* @author: fred-fri
* date: 2012 03 26
*/
@Service ( "checkListTemplateService" )
@Transactional ( readOnly = true )
public class ChecklistTemplateServiceImpl extends AbstractQueryService<CheckListTemplate, Long> implements ChecklistTemplateService {
@Resource
private ChecklistTemplateRepo checklistTemplateRepo;
@Autowired
public ChecklistTemplateServiceImpl(
@Qualifier("checklistTemplateRepo")
ChecklistTemplateRepo checklistTemplateRepo) {
super(checklistTemplateRepo, checklistTemplateRepo);
System.out.println("CheckListTemplateServiceImpl instantiating...");
}
@Override
public Page<CheckListTemplate> findAll(Pageable pageable) {
return checklistTemplateRepo.findAll(pageable);
}
@Override
public Page<CheckListTemplate> find(String filterString, Pageable pageable) {
if (filterString==null || filterString.isEmpty()){
return checklistTemplateRepo.findAll(pageable);
}
else {
return checklistTemplateRepo.findAll(filterStringIsCreatorName(filterString).or(filterStringIsChecklistTemplateName(filterString)), pageable);
}
}
@Override
public Long count(String filterString) {
if (filterString==null || filterString.isEmpty()){
return checklistTemplateRepo.count();
}
else {
return checklistTemplateRepo.count(filterStringIsCreatorName(filterString).or(filterStringIsChecklistTemplateName(filterString)));
}
}
@Transactional ( readOnly = false )
@Override
public void upChecklistTemplate(CheckListTemplate checkListTemplate) {
//if there is one above
if (checklistTemplateRepo.findByTemplateNumber(checkListTemplate.getTemplateNumber() + 1) !=null){
//find the one with value 1 higher
CheckListTemplate downChecklistTemplate = checklistTemplateRepo.findByTemplateNumber(checkListTemplate.getTemplateNumber() + 1);
//give that one the one to be upped's value
downChecklistTemplate.setTemplateNumber(checkListTemplate.getTemplateNumber());
//increase the value of the one to be upped with 1
checkListTemplate.setTemplateNumber(checkListTemplate.getTemplateNumber() + 1);
//save both
checklistTemplateRepo.save(downChecklistTemplate);
checklistTemplateRepo.save(checkListTemplate);
}
}
@Transactional ( readOnly = false )
@Override
public void downChecklistTemplate(CheckListTemplate checkListTemplate) {
//if there is one below
if (checklistTemplateRepo.findByTemplateNumber(checkListTemplate.getTemplateNumber() -1) != null){
//find the one with value 1 lower
CheckListTemplate upChecklistTemplate = checklistTemplateRepo.findByTemplateNumber(checkListTemplate.getTemplateNumber() -1);
//give that one the one to be downed's value
upChecklistTemplate.setTemplateNumber(checkListTemplate.getTemplateNumber());
//decrease the value of the one to be downed with 1
checkListTemplate.setTemplateNumber(checkListTemplate.getTemplateNumber() -1);
//save both
checklistTemplateRepo.save(upChecklistTemplate);
checklistTemplateRepo.save(checkListTemplate);
}
}
private BooleanExpression filterStringIsCreatorName(String filterString){
return QCheckListTemplate.checkListTemplate.creator.firstName.contains(filterString).or(QCheckListTemplate.checkListTemplate.creator.lastName.contains(filterString));
}
private BooleanExpression filterStringIsChecklistTemplateName(String filterString){
return QCheckListTemplate.checkListTemplate.name.contains(filterString);
}
}

@ -0,0 +1,18 @@
package se.su.dsv.scipro.springdata.services;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import se.su.dsv.scipro.data.dataobjects.CheckListTemplate;
/**
* @author: fred-fri
* date: 2012 03 26
*/
public interface ChecklistTemplateService extends CrudService<CheckListTemplate, Long>, QueryService<CheckListTemplate, Long> {
Page<CheckListTemplate> findAll(Pageable pageable);
Page<CheckListTemplate> find(String filterString, Pageable pageable);
Long count(String filterString);
void upChecklistTemplate(CheckListTemplate checkListTemplate);
void downChecklistTemplate(CheckListTemplate checkListTemplate);
}

@ -27,6 +27,8 @@ public abstract interface CrudService<T, ID> {
*/
T findOne(ID id);
Iterable<T> findAll();
/**
* Returns whether an entity with the given id exists.
*