Author: bbrossaud Date: 2010-08-12 18:37:31 +0200 (Thu, 12 Aug 2010) New Revision: 48 Url: http://chorem.org/repositories/revision/billy/48 Log: all is well but can create the criteria Added: trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/CategorySearchMacro.java trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/CompanySearchMacro.java trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/DateSearchMacro.java trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/InvoiceModel.java trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/ProjectSearchMacro.java trunk/billy-ui-zk/src/main/webapp/macros/categorySearchMacro.zul trunk/billy-ui-zk/src/main/webapp/macros/companySearchMacro.zul trunk/billy-ui-zk/src/main/webapp/macros/dateSearchMacro.zul trunk/billy-ui-zk/src/main/webapp/macros/projectSearchMacro.zul Modified: trunk/ trunk/billy-ui-zk/ trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/CategoryBandboxMacro.java trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/CategoryModel.java trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/CompanyBandboxMacro.java trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/CompanyModel.java trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/InvoiceController.java trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/InvoiceFormController.java trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/ProjectBandboxMacro.java trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/ProjectModel.java trunk/billy-ui-zk/src/main/webapp/WEB-INF/lang-addon.xml trunk/billy-ui-zk/src/main/webapp/invoiceFormPage.zul trunk/billy-ui-zk/src/main/webapp/invoicePage.zul trunk/billy-ui-zk/src/main/webapp/macros/companyBandboxMacro.zul trunk/billy-ui-zk/src/main/webapp/macros/projectBandboxMacro.zul trunk/pom.xml Property changes on: trunk ___________________________________________________________________ Modified: svn:ignore - target *.ipr *.iws *.iml + target *.ipr *.iws *.iml .project .settings Property changes on: trunk/billy-ui-zk ___________________________________________________________________ Added: svn:ignore + .classpath .project target .settings Modified: trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/CategoryBandboxMacro.java =================================================================== --- trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/CategoryBandboxMacro.java 2010-08-11 15:58:53 UTC (rev 47) +++ trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/CategoryBandboxMacro.java 2010-08-12 16:37:31 UTC (rev 48) @@ -29,7 +29,7 @@ public class CategoryBandboxMacro extends HtmlMacroComponent { - private final int pageSize = 2; + protected final int pageSize = 2; protected WikittyProxy proxy = ChoremDataProxy.getInstance(); protected CategoryModel categoryModel = new CategoryModel(pageSize); @@ -119,12 +119,6 @@ item.setValue(data); final SubCategory subCategory = (SubCategory) data; final String name = subCategory.getName(); - String id = subCategory.getWikittyId(); - if (id != null && id.equals(subCategoryId)) { - Bandbox categoryBandbox = (Bandbox) getFellow("categoryBandbox"); - categoryBandbox.setValue(name); - categoryBandbox.close(); - } Listcell cell = new Listcell(name); item.appendChild(cell); item.addEventListener(Events.ON_DOUBLE_CLICK, new EventListener() { @@ -164,6 +158,17 @@ */ public void setSubCategoryId(String id) { subCategoryId = id; + if (id != null) { + SubCategory subCategory = proxy.restore(SubCategory.class, id); + if (subCategory != null) { + Bandbox categoryBandbox = (Bandbox) getFellow("categoryBandbox"); + String name = subCategory.getName(); + if (name != null) { + categoryBandbox.setValue(name); + categoryBandbox.close(); + } + } + } } /* Modified: trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/CategoryModel.java =================================================================== --- trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/CategoryModel.java 2010-08-11 15:58:53 UTC (rev 47) +++ trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/CategoryModel.java 2010-08-12 16:37:31 UTC (rev 48) @@ -26,8 +26,8 @@ @Override public Object getElementAt(int index) { - Category Category = categories.get(index); - return Category; + Category category = categories.get(index); + return category; } @Override @@ -37,7 +37,7 @@ @Override public int indexOf(Object obj) { - int index = 0; + int index = -1; String id = ((Category) obj).getWikittyId(); for (Category data : categories) { String dataId = data.getWikittyId(); @@ -76,8 +76,9 @@ } public void reloadContent(int rowIndex) { - Category Category = categories.get(rowIndex); - Category = proxy.restore(Category.class, Category.getWikittyId()); + Category category = categories.get(rowIndex); + category = proxy.restore(Category.class, category.getWikittyId()); + categories.set(rowIndex, category); fireEvent(ListDataEvent.CONTENTS_CHANGED, rowIndex, rowIndex); } @@ -102,8 +103,8 @@ int first = activePage * pageSize; int end = first + (pageSize - 1); Criteria criteria = this.criteria.setFirstIndex(first).setEndIndex(end); - List<Category> Categorys = proxy.findAllByCriteria(Category.class, criteria).getAll(); - this.categories = new ArrayList<Category>(Categorys); + List<Category> categories = proxy.findAllByCriteria(Category.class, criteria).getAll(); + this.categories = new ArrayList<Category>(categories); } fireEvent(ListDataEvent.CONTENTS_CHANGED, -1, -1); } Added: trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/CategorySearchMacro.java =================================================================== --- trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/CategorySearchMacro.java (rev 0) +++ trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/CategorySearchMacro.java 2010-08-12 16:37:31 UTC (rev 48) @@ -0,0 +1,164 @@ +package org.chorem.billy.ui; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import org.chorem.data.bonzoms.Category; +import org.chorem.data.bonzoms.SubCategory; +import org.nuiton.wikitty.Criteria; +import org.nuiton.wikitty.WikittyProxy; +import org.nuiton.wikitty.search.Element; +import org.nuiton.wikitty.search.Search; +import org.zkoss.zk.ui.HtmlMacroComponent; +import org.zkoss.zk.ui.event.Event; +import org.zkoss.zk.ui.event.EventListener; +import org.zkoss.zk.ui.event.Events; +import org.zkoss.zul.Bandbox; +import org.zkoss.zul.Checkbox; +import org.zkoss.zul.Grid; +import org.zkoss.zul.Listbox; +import org.zkoss.zul.Listcell; +import org.zkoss.zul.Listhead; +import org.zkoss.zul.Listheader; +import org.zkoss.zul.Listitem; +import org.zkoss.zul.ListitemRenderer; +import org.zkoss.zul.Paging; +import org.zkoss.zul.Row; +import org.zkoss.zul.RowRenderer; +import org.zkoss.zul.event.PagingEvent; + +public class CategorySearchMacro extends HtmlMacroComponent { + + protected final int pageSize = 2; + + protected WikittyProxy proxy = ChoremDataProxy.getInstance(); + protected CategoryModel categoryModel = new CategoryModel(pageSize); + protected List<String> subCategories = new ArrayList<String>(); + + @Override + public void afterCompose() { + super.afterCompose(); + initPaging(); + initBandbox(); + initGrid(); + } + + protected void initPaging() { + Criteria criteria = Search.query().eq(Element.ELT_EXTENSION, Category.EXT_CATEGORY).criteria(); + categoryModel.setCriteria(criteria); + int totalSize = categoryModel.getTotalSize(); + Paging categoryPaging = (Paging) getFellow("categoryPaging"); + categoryPaging.setTotalSize(totalSize); + categoryPaging.setPageSize(pageSize); + categoryPaging.addEventListener("onPaging", new EventListener() { + + @Override + public void onEvent(Event event) throws Exception { + PagingEvent pagingEvent = (PagingEvent) event; + int activePage = pagingEvent.getActivePage(); + categoryModel.setActivePage(activePage); + } + }); + } + + protected void initBandbox() { + final Bandbox categoryBandbox = (Bandbox) getFellow("categoryBandbox"); + categoryBandbox.addEventListener(Events.ON_OK, new EventListener() { + + @Override + public void onEvent(Event event) throws Exception { + String search = categoryBandbox.getValue(); + Search query = Search.query().eq(Element.ELT_EXTENSION, Category.EXT_CATEGORY); + if (search != null && !search.isEmpty()) { + query = query.keyword(search); + } + Criteria criteria = query.criteria(); + categoryModel.setCriteria(criteria); + int totalSize = categoryModel.getTotalSize(); + Paging categoryPaging = (Paging) getFellow("categoryPaging"); + categoryPaging.setTotalSize(totalSize); + categoryPaging.setActivePage(0); + categoryBandbox.open(); + } + }); + } + + protected void initGrid() { + Grid categoryGrid = (Grid) getFellow("categoryGrid"); + categoryGrid.setModel(categoryModel); + RowRenderer renderer = getCategoryRenderer(); + categoryGrid.setRowRenderer(renderer); + } + + /* + * Renderer + */ + protected void setSubCategoryHeader(Listbox listbox, Category category) { + if (listbox != null) { + Listhead head = new Listhead(); + listbox.appendChild(head); + String name = category.getName(); + if (name == null) { + name = ""; + } + Listheader header = new Listheader(name); + head.appendChild(header); + } + } + + protected void createSubCategoryListbox(Listbox listbox, Set<String> subCategoryIds) { + if (subCategoryIds != null && !subCategoryIds.isEmpty()) { + List<SubCategory> subCategoriesList = proxy.restore(SubCategory.class, new ArrayList<String>(subCategoryIds)); + SubCategoryModel subCategoryModel = new SubCategoryModel(); + subCategoryModel.setSubCategories(subCategoriesList); + listbox.setModel(subCategoryModel); + listbox.setItemRenderer(new ListitemRenderer() { + + @Override + public void render(Listitem item, Object data) throws Exception { + item.setValue(data); + final SubCategory subCategory = (SubCategory) data; + final String name = subCategory.getName(); + final Checkbox checkbox = new Checkbox(name); + Listcell cell = new Listcell(); + cell.appendChild(checkbox); + item.appendChild(cell); + checkbox.addEventListener(Events.ON_CHECK, new EventListener() { + + @Override + public void onEvent(Event event) throws Exception { + String subCategoryId = subCategory.getWikittyId(); + if (checkbox.isChecked()) { + if (!subCategories.contains(subCategoryId)) { + subCategories.add(subCategoryId); + } + } else { + if (subCategories.contains(subCategoryId)) { + subCategories.remove(subCategoryId); + } + } + } + }); + } + }); + } + } + + public RowRenderer getCategoryRenderer() { + return new RowRenderer() { + + @Override + public void render(Row row, Object data) throws Exception { + row.setValue(data); + final Category category = (Category) data; + Set<String> subCategoryIds = category.getSubCategory(); + Listbox listbox = new Listbox(); + setSubCategoryHeader(listbox, category); + createSubCategoryListbox(listbox, subCategoryIds); + row.appendChild(listbox); + + } + }; + } +} Modified: trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/CompanyBandboxMacro.java =================================================================== --- trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/CompanyBandboxMacro.java 2010-08-11 15:58:53 UTC (rev 47) +++ trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/CompanyBandboxMacro.java 2010-08-12 16:37:31 UTC (rev 48) @@ -91,13 +91,7 @@ public void render(Listitem item, Object data) throws Exception { item.setValue(data); final Company company = (Company) data; - final Bandbox companyBandbox = (Bandbox) getFellow("companyBandbox"); - final String id = company.getWikittyId(); final String name = company.getName(); - if (companyId != null && companyId.equals(id)) { - companyBandbox.setValue(name); - companyBandbox.close(); - } Listcell cell1 = new Listcell(name); Listcell cell2 = new Listcell(company.getType()); item.appendChild(cell1); @@ -106,7 +100,8 @@ @Override public void onEvent(Event event) throws Exception { - companyId = id; + companyId = company.getWikittyId(); + Bandbox companyBandbox = (Bandbox) getFellow("companyBandbox"); companyBandbox.setValue(name); companyBandbox.close(); } @@ -120,6 +115,17 @@ */ public void setCompanyId(String id) { companyId = id; + if (id != null) { + Company company = proxy.restore(Company.class, id); + if (company != null) { + Bandbox companyBandbox = (Bandbox) getFellow("companyBandbox"); + String name = company.getName(); + if (name != null) { + companyBandbox.setValue(name); + companyBandbox.close(); + } + } + } } /* Modified: trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/CompanyModel.java =================================================================== --- trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/CompanyModel.java 2010-08-11 15:58:53 UTC (rev 47) +++ trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/CompanyModel.java 2010-08-12 16:37:31 UTC (rev 48) @@ -39,7 +39,7 @@ @Override public int indexOf(Object obj) { - int index = 0; + int index = -1; String id = ((Project) obj).getWikittyId(); for (Company data : companies) { String dataId = data.getWikittyId(); @@ -80,6 +80,7 @@ public void reloadContent(int rowIndex) { Company company = companies.get(rowIndex); company = proxy.restore(Company.class, company.getWikittyId()); + companies.set(rowIndex, company); fireEvent(ListDataEvent.CONTENTS_CHANGED, rowIndex, rowIndex); } Added: trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/CompanySearchMacro.java =================================================================== --- trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/CompanySearchMacro.java (rev 0) +++ trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/CompanySearchMacro.java 2010-08-12 16:37:31 UTC (rev 48) @@ -0,0 +1,122 @@ +package org.chorem.billy.ui; + +import java.util.ArrayList; +import java.util.List; + +import org.chorem.data.bonzoms.Company; +import org.nuiton.wikitty.Criteria; +import org.nuiton.wikitty.WikittyProxy; +import org.nuiton.wikitty.search.Element; +import org.nuiton.wikitty.search.Search; +import org.zkoss.zk.ui.HtmlMacroComponent; +import org.zkoss.zk.ui.event.Event; +import org.zkoss.zk.ui.event.EventListener; +import org.zkoss.zk.ui.event.Events; +import org.zkoss.zul.Bandbox; +import org.zkoss.zul.Checkbox; +import org.zkoss.zul.Listbox; +import org.zkoss.zul.Listcell; +import org.zkoss.zul.Listitem; +import org.zkoss.zul.ListitemRenderer; +import org.zkoss.zul.Paging; +import org.zkoss.zul.event.PagingEvent; + +public class CompanySearchMacro extends HtmlMacroComponent { + + private final int pageSize = 5; + + protected WikittyProxy proxy = ChoremDataProxy.getInstance(); + protected CompanyModel companyModel = new CompanyModel(pageSize); + protected List<String> companies = new ArrayList<String>(); + + @Override + public void afterCompose() { + super.afterCompose(); + initPaging(); + initBandbox(); + initListbox(); + } + + protected void initPaging() { + Criteria criteria = Search.query().eq(Element.ELT_EXTENSION, Company.EXT_COMPANY).criteria(); + companyModel.setCriteria(criteria); + + int totalSize = companyModel.getTotalSize(); + Paging companyPaging = (Paging) getFellow("companyPaging"); + companyPaging.setTotalSize(totalSize); + companyPaging.setPageSize(pageSize); + companyPaging.addEventListener("onPaging", new EventListener() { + + @Override + public void onEvent(Event event) throws Exception { + PagingEvent pagingEvent = (PagingEvent) event; + int activePage = pagingEvent.getActivePage(); + companyModel.setActivePage(activePage); + } + }); + } + + protected void initBandbox() { + final Bandbox companyBandbox = (Bandbox) getFellow("companyBandbox"); + companyBandbox.addEventListener(Events.ON_OK, new EventListener() { + + @Override + public void onEvent(Event event) throws Exception { + String search = companyBandbox.getValue(); + Search query = Search.query().eq(Element.ELT_EXTENSION, Company.EXT_COMPANY); + if (search != null && !search.isEmpty()) { + query = query.keyword(search); + } + Criteria criteria = query.criteria(); + companyModel.setCriteria(criteria); + int totalSize = companyModel.getTotalSize(); + Paging companyPaging = (Paging) getFellow("projectPaging"); + companyPaging.setTotalSize(totalSize); + companyPaging.setActivePage(0); + companyBandbox.open(); + } + }); + } + + protected void initListbox() { + Listbox companyListbox = (Listbox) getFellow("companyListbox"); + companyListbox.setModel(companyModel); + ListitemRenderer renderer = getCompanyRenderer(); + companyListbox.setItemRenderer(renderer); + } + + /* + * Renderer + */ + public ListitemRenderer getCompanyRenderer() { + return new ListitemRenderer() { + + @Override + public void render(Listitem item, Object data) throws Exception { + item.setValue(data); + final Company company = (Company) data; + final String name = company.getName(); + final Checkbox checkbox = new Checkbox(name); + Listcell cell = new Listcell(); + cell.appendChild(checkbox); + item.appendChild(cell); + checkbox.addEventListener(Events.ON_CHECK, new EventListener() { + + @Override + public void onEvent(Event event) throws Exception { + String companyId = company.getWikittyId(); + if (checkbox.isChecked()) { + if (!companies.contains(companyId)) { + companies.add(companyId); + } + } else { + if (companies.contains(companyId)) { + companies.remove(companyId); + } + } + } + }); + } + }; + } +} Added: trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/DateSearchMacro.java =================================================================== --- trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/DateSearchMacro.java (rev 0) +++ trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/DateSearchMacro.java 2010-08-12 16:37:31 UTC (rev 48) @@ -0,0 +1,67 @@ +package org.chorem.billy.ui; + +import org.zkoss.zk.ui.HtmlMacroComponent; + +public class DateSearchMacro extends HtmlMacroComponent { + + @Override + public void afterCompose() { + super.afterCompose(); + } + +// protected boolean checkPosted(Date start, Date end, Search search) throws ParseException { +// Checkbox check = (Checkbox) getFellow("postedDate"); +// if (!check.isChecked()) { +// return false; +// } +// if (start != null) { +// String formatDate = WikittyUtil.formatDate(start); +// search = search.ge(Invoice.FQ_FIELD_INVOICE_POSTED, formatDate); +// } +// if (end != null) { +// String formatDate = WikittyUtil.formatDate(end); +// search = search.le(Invoice.FQ_FIELD_INVOICE_POSTED, formatDate); +// } +// search = search.or(); +// return true; +// } +// +// protected boolean expectedPosted(Date start, Date end, Search search, boolean bool) throws ParseException { +// Checkbox check = (Checkbox) getFellow("expectedDate"); +// if (!check.isChecked()) { +// return bool; +// } +// if (bool == false) { +// search = search.or(); +// } +// if (start != null) { +// bool = true; +// String formatDate = WikittyUtil.formatDate(start); +// search = search.ge(Invoice.FQ_FIELD_INVOICE_POSTED, formatDate); +// } +// if (end != null) { +// String formatDate = WikittyUtil.formatDate(end); +// search = search.le(Invoice.FQ_FIELD_INVOICE_POSTED, formatDate); +// } +// return bool; +// } +// +// +// public Search getSearch(Search src) { +// Search search = src; +// if (search == null) { +// search = Search.query(); +// } +// Datebox startDate = (Datebox) getFellow("startDate"); +// Date start = startDate.getValue(); +// +// Datebox endDate = (Datebox) getFellow("endDate"); +// Date end = endDate.getValue(); +// +// boolean bool = checkPosted(start, end, search); +// bool = checkExpected(start, end, search, bool); +// checkPayment(start, end, search, bool); +// +// return search; +// } +} Modified: trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/InvoiceController.java =================================================================== --- trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/InvoiceController.java 2010-08-11 15:58:53 UTC (rev 47) +++ trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/InvoiceController.java 2010-08-12 16:37:31 UTC (rev 48) @@ -1,23 +1,220 @@ package org.chorem.billy.ui; -import java.util.ArrayList; -import java.util.List; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; import org.chorem.billy.ui.ChoremDataProxy; +import org.chorem.data.bonzoms.Company; +import org.chorem.data.bonzoms.Invoice; +import org.chorem.data.bonzoms.Category; import org.chorem.data.bonzoms.Project; -import org.chorem.data.bonzoms.ProjectImpl; +import org.nuiton.wikitty.Criteria; import org.nuiton.wikitty.WikittyProxy; +import org.nuiton.wikitty.search.Element; +import org.nuiton.wikitty.search.Search; +import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.Executions; +import org.zkoss.zk.ui.event.Event; +import org.zkoss.zk.ui.event.EventListener; +import org.zkoss.zk.ui.event.Events; import org.zkoss.zk.ui.util.GenericForwardComposer; +import org.zkoss.zul.Listcell; +import org.zkoss.zul.Listitem; +import org.zkoss.zul.ListitemRenderer; +import org.zkoss.zul.Paging; +import org.zkoss.zul.Window; +import org.zkoss.zul.event.PagingEvent; public class InvoiceController extends GenericForwardComposer{ + protected final int pageSize = 20; + protected WikittyProxy proxy = ChoremDataProxy.getInstance(); + protected InvoiceModel invoiceModel = new InvoiceModel(pageSize); + protected Paging invoicePaging; + + @Override + public void doAfterCompose(Component comp) throws Exception { + super.doAfterCompose(comp); + initInvoiceModel(); + initPaging(); + } + + protected void initInvoiceModel() { + Criteria criteria = Search.query().eq(Element.ELT_EXTENSION, Invoice.EXT_INVOICE).criteria(); + invoiceModel.setCriteria(criteria); + } + + protected void initPaging() { + invoicePaging.setPageSize(pageSize); + int totalSize = invoiceModel.getTotalSize(); + invoicePaging.setTotalSize(totalSize); + } + + protected Listcell getCategoryCell(Invoice invoice) { + Listcell cell = new Listcell(); + String id = invoice.getSubCategory(); + if (id != null && !id.isEmpty()) { + Criteria criteria = Search.query().contains(Category.FQ_FIELD_CATEGORY_SUBCATEGORY, id).criteria(); + Category category = proxy.findByCriteria(Category.class, criteria); + if (category != null) { + String name = category.getName(); + if (name == null) { + name = ""; + } + cell.setLabel(name); + } + } + return cell; + } + + protected Listcell getCompanyCell(Invoice invoice) { + Listcell cell = new Listcell(); + String id = invoice.getCompany(); + if (id != null && !id.isEmpty()) { + Company company = proxy.restore(Company.class, id); + if (company != null) { + String name = company.getName(); + if (name == null) { + name = ""; + } + cell.setLabel(name); + } + } + return cell; + } + + protected Listcell getProjectCell(Invoice invoice) { + Listcell cell = new Listcell(); + String id = invoice.getProject(); + if (id != null && !id.isEmpty()) { + Project project = proxy.restore(Project.class, id); + if (project != null) { + String name = project.getName(); + if (name == null) { + name = ""; + } + cell.setLabel(name); + } + } + return cell; + } + + protected Listcell getInvoiceNumberCell(Invoice invoice) { + Listcell cell = new Listcell(); + String number = invoice.getNumber(); + if (number == null) { + number = ""; + } + cell.setLabel(number); + return cell; + } + + protected Listcell getPriceCell(Double price) { + Listcell cell = new Listcell(); + String str = "-"; + if (price != null) { + str = String.valueOf(price); + } + cell.setLabel(str); + return cell; + } + + protected Listcell getDateCell(Date date) { + Listcell cell = new Listcell(); + String str = "-"; + if (date != null) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); + str = sdf.format(date); + } + cell.setLabel(str); + return cell; + } + + protected void createInvoiceFormWindow(String id) { + Map<String, Object> map = new HashMap<String, Object>(); + if (id != null) { + map.put("invoiceId", id); + } + Window win = (Window) Executions.createComponents("invoiceFormPage.zul", null, map); + win.addEventListener(InvoiceFormController.EVENT_ON_SAVE_INVOICE, new EventListener() { + + @Override + public void onEvent(Event event) throws Exception { + String id = (String) event.getData(); + Invoice invoice = proxy.restore(Invoice.class, id); + int rowIndex = invoiceModel.indexOf(invoice); + if (rowIndex != -1) { + invoiceModel.reloadContent(rowIndex); + } else { + invoiceModel.addData(invoice); + } + int totalSize = invoiceModel.getTotalSize(); + invoicePaging.setTotalSize(totalSize); + } + }); + } + /* + * Renderers + */ + public ListitemRenderer getInvoiceRenderer() { + return new ListitemRenderer() { + + @Override + public void render(Listitem item, Object data) throws Exception { + item.setValue(data); + final Invoice invoice = (Invoice) data; + Listcell cell1 = getCategoryCell(invoice); + item.appendChild(cell1); + Listcell cell2 = getCompanyCell(invoice); + item.appendChild(cell2); + Listcell cell3 = getProjectCell(invoice); + item.appendChild(cell3); + Listcell cell4 = getInvoiceNumberCell(invoice); + item.appendChild(cell4); + Listcell cell5 = getPriceCell(invoice.getHTPrice()); + item.appendChild(cell5); + Listcell cell6 = getPriceCell(invoice.getTTCPrice()); + item.appendChild(cell6); + Listcell cell7 = getDateCell(invoice.getPosted()); + item.appendChild(cell7); + Listcell cell8 = getDateCell(invoice.getExpected()); + item.appendChild(cell8); + Listcell cell9 = getDateCell(invoice.getPayment()); + item.appendChild(cell9); + item.addEventListener(Events.ON_DOUBLE_CLICK, new EventListener() { + + @Override + public void onEvent(Event event) throws Exception { + createInvoiceFormWindow(invoice.getWikittyId()); + } + }); + } + }; + } + + + /* * Events */ public void onClick$newInvoice() { - Executions.createComponents("invoiceFormPage.zul", null, null); + createInvoiceFormWindow(null); } + + public void onPaging$invoicePaging(Event event) { + PagingEvent pagingEvent = (PagingEvent) event; + int activePage = pagingEvent.getActivePage(); + invoiceModel.setActivePage(activePage); + } + + /* + * Getters + */ + public InvoiceModel getInvoiceModel() { + return invoiceModel; + } } Modified: trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/InvoiceFormController.java =================================================================== --- trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/InvoiceFormController.java 2010-08-11 15:58:53 UTC (rev 47) +++ trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/InvoiceFormController.java 2010-08-12 16:37:31 UTC (rev 48) @@ -5,6 +5,7 @@ import org.nuiton.wikitty.WikittyProxy; import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.Executions; +import org.zkoss.zk.ui.event.Events; import org.zkoss.zk.ui.util.GenericForwardComposer; import org.zkoss.zkplus.databind.AnnotateDataBinder; import org.zkoss.zkplus.databind.DataBinder; @@ -64,6 +65,21 @@ } /* + * Events + */ + public void onClick$saveInvoice() { + String subCategory = categoryMacro.getSubCategoryId(); + invoice.setSubCategory(subCategory); + String project = projectMacro.getProjectId(); + invoice.setProject(project); + String company = companyMacro.getCompanyId(); + invoice.setCompany(company); + invoice = proxy.store(invoice); + Events.postEvent(EVENT_ON_SAVE_INVOICE, this.self, invoice.getWikittyId()); + self.detach(); + } + + /* * Getters */ public Invoice getInvoice() { Added: trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/InvoiceModel.java =================================================================== --- trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/InvoiceModel.java (rev 0) +++ trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/InvoiceModel.java 2010-08-12 16:37:31 UTC (rev 48) @@ -0,0 +1,116 @@ +package org.chorem.billy.ui; + +import java.util.ArrayList; +import java.util.List; + +import org.chorem.data.bonzoms.Invoice; +import org.nuiton.wikitty.Criteria; +import org.nuiton.wikitty.PagedResult; +import org.nuiton.wikitty.WikittyProxy; +import org.zkoss.zkplus.databind.BindingListModel; +import org.zkoss.zul.AbstractListModel; +import org.zkoss.zul.event.ListDataEvent; + +public class InvoiceModel extends AbstractListModel implements BindingListModel { + + protected WikittyProxy proxy = ChoremDataProxy.getInstance(); + protected Criteria criteria = null; + protected int activePage = 0; + protected int pageSize = 1; + protected List<Invoice> invoices = new ArrayList<Invoice>(); + + public InvoiceModel(int pageSize) { + this.pageSize = pageSize; + createList(); + } + + @Override + public Object getElementAt(int index) { + Invoice invoice = invoices.get(index); + return invoice; + } + + @Override + public int getSize() { + return invoices.size(); + } + + @Override + public int indexOf(Object obj) { + int index = -1; + String id = ((Invoice) obj).getWikittyId(); + for (Invoice data : invoices) { + String dataId = data.getWikittyId(); + if (id.equals(dataId)) { + index = invoices.indexOf(data); + break; + } + } + return index; + } + + public int getTotalSize() { + if (criteria == null) { + return 0; + } + Criteria criteria = this.criteria.setFirstIndex(0).setEndIndex(0); + PagedResult<Invoice> result = proxy.findAllByCriteria(Invoice.class, criteria); + return result.getNumFound(); + } + + public void addData(Invoice newData) { + int listSize = invoices.size(); + if (listSize < (pageSize)) { + invoices.add(newData); + } + int size = getSize(); + fireEvent(ListDataEvent.INTERVAL_ADDED, size - 1, size - 1); + } + + public void removeData(Invoice data) { + int interval = invoices.indexOf(data); + if (interval != -1) { + invoices.remove(interval); + fireEvent(ListDataEvent.INTERVAL_REMOVED, interval, interval); + } + } + + public void reloadContent(int rowIndex) { + Invoice invoice = invoices.get(rowIndex); + invoice = proxy.restore(Invoice.class, invoice.getWikittyId()); + invoices.set(rowIndex, invoice); + fireEvent(ListDataEvent.CONTENTS_CHANGED, rowIndex, rowIndex); + } + + public void reload() { + fireEvent(ListDataEvent.CONTENTS_CHANGED, -1, -1); + } + + public Criteria getCriteria() { + return criteria; + } + + public void setCriteria(Criteria criteria) { + if (criteria != null) { + this.criteria = criteria; + activePage = 0; + createList(); + } + } + + protected void createList() { + if (criteria != null) { + int first = activePage * pageSize; + int end = first + (pageSize - 1); + Criteria criteria = this.criteria.setFirstIndex(first).setEndIndex(end); + List<Invoice> invoices = proxy.findAllByCriteria(Invoice.class, criteria).getAll(); + this.invoices = new ArrayList<Invoice>(invoices); + } + fireEvent(ListDataEvent.CONTENTS_CHANGED, -1, -1); + } + + public void setActivePage(int activePage) { + this.activePage = activePage; + createList(); + } +} Modified: trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/ProjectBandboxMacro.java =================================================================== --- trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/ProjectBandboxMacro.java 2010-08-11 15:58:53 UTC (rev 47) +++ trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/ProjectBandboxMacro.java 2010-08-12 16:37:31 UTC (rev 48) @@ -90,21 +90,16 @@ @Override public void render(Listitem item, Object data) throws Exception { item.setValue(data); - Project project = (Project) data; - final Bandbox projectBandbox = (Bandbox) getFellow("projectBandbox"); - final String id = project.getWikittyId(); + final Project project = (Project) data; final String name = project.getName(); - if (projectId != null && projectId.equals(id)) { - projectBandbox.setValue(name); - projectBandbox.close(); - } - Listcell cell = new Listcell(project.getName()); + Listcell cell = new Listcell(name); item.appendChild(cell); item.addEventListener(Events.ON_DOUBLE_CLICK, new EventListener() { @Override public void onEvent(Event event) throws Exception { - projectId = id; + projectId = project.getWikittyId(); + Bandbox projectBandbox = (Bandbox) getFellow("projectBandbox"); projectBandbox.setValue(name); projectBandbox.close(); } @@ -118,6 +113,17 @@ */ public void setProjectId(String id) { projectId = id; + if (id != null) { + Project project = proxy.restore(Project.class, id); + if (project != null) { + Bandbox projectBandbox = (Bandbox) getFellow("projectBandbox"); + String name = project.getName(); + if (name != null) { + projectBandbox.setValue(name); + projectBandbox.close(); + } + } + } } /* Modified: trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/ProjectModel.java =================================================================== --- trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/ProjectModel.java 2010-08-11 15:58:53 UTC (rev 47) +++ trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/ProjectModel.java 2010-08-12 16:37:31 UTC (rev 48) @@ -38,7 +38,7 @@ @Override public int indexOf(Object obj) { - int index = 0; + int index = -1; String id = ((Project) obj).getWikittyId(); for (Project data : projects) { String dataId = data.getWikittyId(); Added: trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/ProjectSearchMacro.java =================================================================== --- trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/ProjectSearchMacro.java (rev 0) +++ trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/ProjectSearchMacro.java 2010-08-12 16:37:31 UTC (rev 48) @@ -0,0 +1,122 @@ +package org.chorem.billy.ui; + +import java.util.ArrayList; +import java.util.List; + +import org.chorem.data.bonzoms.Project; +import org.nuiton.wikitty.Criteria; +import org.nuiton.wikitty.WikittyProxy; +import org.nuiton.wikitty.search.Element; +import org.nuiton.wikitty.search.Search; +import org.zkoss.zk.ui.HtmlMacroComponent; +import org.zkoss.zk.ui.event.Event; +import org.zkoss.zk.ui.event.EventListener; +import org.zkoss.zk.ui.event.Events; +import org.zkoss.zul.Bandbox; +import org.zkoss.zul.Checkbox; +import org.zkoss.zul.Listbox; +import org.zkoss.zul.Listcell; +import org.zkoss.zul.Listitem; +import org.zkoss.zul.ListitemRenderer; +import org.zkoss.zul.Paging; +import org.zkoss.zul.event.PagingEvent; + +public class ProjectSearchMacro extends HtmlMacroComponent { + + private final int pageSize = 5; + + protected WikittyProxy proxy = ChoremDataProxy.getInstance(); + protected ProjectModel projectModel = new ProjectModel(pageSize); + protected List<String> projects = new ArrayList<String>(); + + @Override + public void afterCompose() { + super.afterCompose(); + initPaging(); + initBandbox(); + initListbox(); + } + + protected void initPaging() { + Criteria criteria = Search.query().eq(Element.ELT_EXTENSION, Project.EXT_PROJECT).criteria(); + projectModel.setCriteria(criteria); + + int totalSize = projectModel.getTotalSize(); + Paging projectPaging = (Paging) getFellow("projectPaging"); + projectPaging.setTotalSize(totalSize); + projectPaging.setPageSize(pageSize); + projectPaging.addEventListener("onPaging", new EventListener() { + + @Override + public void onEvent(Event event) throws Exception { + PagingEvent pagingEvent = (PagingEvent) event; + int activePage = pagingEvent.getActivePage(); + projectModel.setActivePage(activePage); + } + }); + } + + protected void initBandbox() { + final Bandbox projectBandbox = (Bandbox) getFellow("projectBandbox"); + projectBandbox.addEventListener(Events.ON_OK, new EventListener() { + + @Override + public void onEvent(Event event) throws Exception { + String search = projectBandbox.getValue(); + Search query = Search.query().eq(Element.ELT_EXTENSION, Project.EXT_PROJECT); + if (search != null && !search.isEmpty()) { + query = query.keyword(search); + } + Criteria criteria = query.criteria(); + projectModel.setCriteria(criteria); + int totalSize = projectModel.getTotalSize(); + Paging projectPaging = (Paging) getFellow("projectPaging"); + projectPaging.setTotalSize(totalSize); + projectPaging.setActivePage(0); + projectBandbox.open(); + } + }); + } + + protected void initListbox() { + Listbox projectListbox = (Listbox) getFellow("projectListbox"); + projectListbox.setModel(projectModel); + ListitemRenderer renderer = getProjectRenderer(); + projectListbox.setItemRenderer(renderer); + } + + /* + * Renderers + */ + public ListitemRenderer getProjectRenderer() { + return new ListitemRenderer() { + + @Override + public void render(Listitem item, Object data) throws Exception { + item.setValue(data); + final Project project = (Project) data; + final String name = project.getName(); + final Checkbox checkbox = new Checkbox(name); + Listcell cell = new Listcell(); + cell.appendChild(checkbox); + item.appendChild(cell); + checkbox.addEventListener(Events.ON_CHECK, new EventListener() { + + @Override + public void onEvent(Event event) throws Exception { + String projectId = project.getWikittyId(); + if (checkbox.isChecked()) { + if (!projects.contains(projectId)) { + projects.add(projectId); + } + } else { + if (projects.contains(projectId)) { + projects.remove(projectId); + } + } + } + }); + } + }; + } +} Modified: trunk/billy-ui-zk/src/main/webapp/WEB-INF/lang-addon.xml =================================================================== --- trunk/billy-ui-zk/src/main/webapp/WEB-INF/lang-addon.xml 2010-08-11 15:58:53 UTC (rev 47) +++ trunk/billy-ui-zk/src/main/webapp/WEB-INF/lang-addon.xml 2010-08-12 16:37:31 UTC (rev 48) @@ -25,5 +25,29 @@ <component-class>org.chorem.billy.ui.CompanyBandboxMacro</component-class> <macro-uri>macros/companyBandboxMacro.zul</macro-uri> </component> + + <component> + <component-name>companySearchMacro</component-name> + <component-class>org.chorem.billy.ui.CompanySearchMacro</component-class> + <macro-uri>macros/companySearchMacro.zul</macro-uri> + </component> + + <component> + <component-name>categorySearchMacro</component-name> + <component-class>org.chorem.billy.ui.CategorySearchMacro</component-class> + <macro-uri>macros/categorySearchMacro.zul</macro-uri> + </component> + + <component> + <component-name>projectSearchMacro</component-name> + <component-class>org.chorem.billy.ui.ProjectSearchMacro</component-class> + <macro-uri>macros/projectSearchMacro.zul</macro-uri> + </component> + + <component> + <component-name>dateSearchMacro</component-name> + <component-class>org.chorem.billy.ui.DateSearchMacro</component-class> + <macro-uri>macros/dateSearchMacro.zul</macro-uri> + </component> </language-addon> Modified: trunk/billy-ui-zk/src/main/webapp/invoiceFormPage.zul =================================================================== --- trunk/billy-ui-zk/src/main/webapp/invoiceFormPage.zul 2010-08-11 15:58:53 UTC (rev 47) +++ trunk/billy-ui-zk/src/main/webapp/invoiceFormPage.zul 2010-08-12 16:37:31 UTC (rev 48) @@ -17,12 +17,12 @@ <label value="Posted date" /> <datebox format="yyyy/MM/dd" value="@{composer.invoice.posted, save-when='saveInvoice.onClick'}" /> + <categoryMacro id="categoryMacro" /> + + <companyMacro id="companyMacro" /> + <projectMacro id="projectMacro" /> - <companyMacro id="companyMacro" /> - - <categoryMacro id="categoryMacro" /> - </vbox> <space /> Modified: trunk/billy-ui-zk/src/main/webapp/invoicePage.zul =================================================================== --- trunk/billy-ui-zk/src/main/webapp/invoicePage.zul 2010-08-11 15:58:53 UTC (rev 47) +++ trunk/billy-ui-zk/src/main/webapp/invoicePage.zul 2010-08-12 16:37:31 UTC (rev 48) @@ -1,13 +1,35 @@ -<?page id="home" title="HOME" cacheable="false" language="xul/html" zscriptLanguage="Java"?> +<?page id="Invoice" title="Invoice" cacheable="false" language="xul/html" zscriptLanguage="Java"?> <?meta content="text/html; charset=UTF-8" pageEncoding="UTF-8"?> -<?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit" root="win"?> +<?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit" root="invoice"?> -<window id="win" title="Win" border="normal" apply="org.chorem.billy.ui.InvoiceController"> +<window id="invoice" title="Invoice" border="normal" apply="org.chorem.billy.ui.InvoiceController"> <vbox> <toolbarbutton id="newInvoice" label="Add new invoice" /> </vbox> <separator bar="true" /> + <vbox> + <separator/> + <dateSearchMacro id="dateSearchMacro" /> + <separator /> + <categorySearchMacro id="categorySearchMacro" /> + <companySearchMacro id="companySearchMacro" /> + <projectSearchMacro id="projectSearchMacro" /> + <separator /> + </vbox> <vbox> - + <listbox id="invoiceListbox" rows="20" model="@{invoice$composer.invoiceModel}" itemRenderer="@{invoice$composer.invoiceRenderer}"> + <listhead> + <listheader label="Category"/> + <listheader label="Client"/> + <listheader label="Project"/> + <listheader label="Invoice number"/> + <listheader label="HT price"/> + <listheader label="TTC price"/> + <listheader label="Posted date"/> + <listheader label="Expected date"/> + <listheader label="Payment date"/> + </listhead> + </listbox> + <paging id="invoicePaging"/> </vbox> </window> \ No newline at end of file Added: trunk/billy-ui-zk/src/main/webapp/macros/categorySearchMacro.zul =================================================================== --- trunk/billy-ui-zk/src/main/webapp/macros/categorySearchMacro.zul (rev 0) +++ trunk/billy-ui-zk/src/main/webapp/macros/categorySearchMacro.zul 2010-08-12 16:37:31 UTC (rev 48) @@ -0,0 +1,15 @@ +<?page title="new page title" contentType="text/html;charset=UTF-8"?> +<zk> + <hbox> + Category: + <bandbox id="categoryBandbox" mold="rounded"> + <bandpopup> + <vbox> + <grid id="categoryGrid" width="200px"> + </grid> + <paging id="categoryPaging" width="200px"/> + </vbox> + </bandpopup> + </bandbox> + </hbox> +</zk> \ No newline at end of file Modified: trunk/billy-ui-zk/src/main/webapp/macros/companyBandboxMacro.zul =================================================================== --- trunk/billy-ui-zk/src/main/webapp/macros/companyBandboxMacro.zul 2010-08-11 15:58:53 UTC (rev 47) +++ trunk/billy-ui-zk/src/main/webapp/macros/companyBandboxMacro.zul 2010-08-12 16:37:31 UTC (rev 48) @@ -4,7 +4,7 @@ <bandbox id="companyBandbox" mold="rounded"> <bandpopup> <vbox> - <listbox id="companyListbox" width="200px" > + <listbox rows="5" id="companyListbox" width="200px" > <listhead> <listheader label="Name" /> <listheader label="Type" /> Added: trunk/billy-ui-zk/src/main/webapp/macros/companySearchMacro.zul =================================================================== --- trunk/billy-ui-zk/src/main/webapp/macros/companySearchMacro.zul (rev 0) +++ trunk/billy-ui-zk/src/main/webapp/macros/companySearchMacro.zul 2010-08-12 16:37:31 UTC (rev 48) @@ -0,0 +1,19 @@ +<?page title="new page title" contentType="text/html;charset=UTF-8"?> +<zk> + <hbox> + Company: + <bandbox id="companyBandbox" mold="rounded"> + <bandpopup> + <vbox> + <listbox rows="5" id="companyListbox" width="200px" > + <listhead> + <listheader label="Name" /> + <listheader label="Type" /> + </listhead> + </listbox> + <paging id="companyPaging" width="200px"/> + </vbox> + </bandpopup> + </bandbox> + </hbox> +</zk> \ No newline at end of file Added: trunk/billy-ui-zk/src/main/webapp/macros/dateSearchMacro.zul =================================================================== --- trunk/billy-ui-zk/src/main/webapp/macros/dateSearchMacro.zul (rev 0) +++ trunk/billy-ui-zk/src/main/webapp/macros/dateSearchMacro.zul 2010-08-12 16:37:31 UTC (rev 48) @@ -0,0 +1,14 @@ +<?page title="new page title" contentType="text/html;charset=UTF-8"?> +<zk> + <hbox> + Start date : <datebox id="startDate" /> + End date : <datebox id="endDate" /> + </hbox> + <separator /> + <hbox> + Type: + <checkbox label="Posted date" id="postedDate" /> + <checkbox label="Expected date" id="expectedDate" /> + <checkbox label="Payment date" id="paymentDate" /> + </hbox> +</zk> \ No newline at end of file Modified: trunk/billy-ui-zk/src/main/webapp/macros/projectBandboxMacro.zul =================================================================== --- trunk/billy-ui-zk/src/main/webapp/macros/projectBandboxMacro.zul 2010-08-11 15:58:53 UTC (rev 47) +++ trunk/billy-ui-zk/src/main/webapp/macros/projectBandboxMacro.zul 2010-08-12 16:37:31 UTC (rev 48) @@ -4,7 +4,7 @@ <bandbox id="projectBandbox" mold="rounded"> <bandpopup> <vbox> - <listbox id="projectListbox" width="200px"> + <listbox rows="5" id="projectListbox" width="200px"> <listhead> <listheader label="Name" /> </listhead> Added: trunk/billy-ui-zk/src/main/webapp/macros/projectSearchMacro.zul =================================================================== --- trunk/billy-ui-zk/src/main/webapp/macros/projectSearchMacro.zul (rev 0) +++ trunk/billy-ui-zk/src/main/webapp/macros/projectSearchMacro.zul 2010-08-12 16:37:31 UTC (rev 48) @@ -0,0 +1,18 @@ +<?page title="new page title" contentType="text/html;charset=UTF-8"?> +<zk> + <hbox> + Project: + <bandbox id="projectBandbox" mold="rounded"> + <bandpopup> + <vbox> + <listbox rows="5" id="projectListbox" width="200px"> + <listhead> + <listheader label="Name" /> + </listhead> + </listbox> + <paging id="projectPaging" width="200px"/> + </vbox> + </bandpopup> + </bandbox> + </hbox> +</zk> \ No newline at end of file Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2010-08-11 15:58:53 UTC (rev 47) +++ trunk/pom.xml 2010-08-12 16:37:31 UTC (rev 48) @@ -138,13 +138,6 @@ </dependency> <dependency> - <groupId>junit</groupId> - <artifactId>junit</artifactId> - <version>${junit.version}</version> - <scope>test</scope> - </dependency> - - <dependency> <groupId>org.nuiton.wikitty</groupId> <artifactId>wikitty-api</artifactId> <version>${wikitty.version}</version> @@ -231,7 +224,7 @@ <chorem-data.version>0.1-SNAPSHOT</chorem-data.version> <zk.version>5.0.2</zk.version> - <wikitty.version>2.0</wikitty.version> + <wikitty.version>2.1-SNAPSHOT</wikitty.version> <!-- Nuiton librairies --> <topia.version>2.2.0</topia.version>