Author: bbrossaud Date: 2010-08-11 17:58:53 +0200 (Wed, 11 Aug 2010) New Revision: 47 Url: http://chorem.org/repositories/revision/billy/47 Log: addition macro, use a better pagination, can select a subcategory Added: trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/CategoryBandboxMacro.java trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/CategoryGroupModel.java trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/CategoryRenderer.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/ProjectBandboxMacro.java trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/ProjectFormController.java trunk/billy-ui-zk/src/main/webapp/WEB-INF/lang-addon.xml trunk/billy-ui-zk/src/main/webapp/macros/ trunk/billy-ui-zk/src/main/webapp/macros/categoryBandboxMacro.zul trunk/billy-ui-zk/src/main/webapp/macros/companyBandboxMacro.zul trunk/billy-ui-zk/src/main/webapp/macros/projectBandboxMacro.zul 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/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/ProjectModel.java trunk/billy-ui-zk/src/main/webapp/WEB-INF/zk.xml trunk/billy-ui-zk/src/main/webapp/invoiceFormPage.zul Added: 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 (rev 0) +++ trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/CategoryBandboxMacro.java 2010-08-11 15:58:53 UTC (rev 47) @@ -0,0 +1,175 @@ +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.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 CategoryBandboxMacro extends HtmlMacroComponent { + + private final int pageSize = 2; + + protected WikittyProxy proxy = ChoremDataProxy.getInstance(); + protected CategoryModel categoryModel = new CategoryModel(pageSize); + protected String subCategoryId = null; + + @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> subCategories = proxy.restore(SubCategory.class, new ArrayList<String>(subCategoryIds)); + SubCategoryModel subCategoryModel = new SubCategoryModel(); + subCategoryModel.setSubCategories(subCategories); + 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(); + 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() { + + @Override + public void onEvent(Event event) throws Exception { + Bandbox categoryBandbox = (Bandbox) getFellow("categoryBandbox"); + subCategoryId = subCategory.getWikittyId(); + categoryBandbox.setValue(name); + categoryBandbox.close(); + } + }); + } + }); + } + } + + 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); + + } + }; + } + + /* + * Setters + */ + public void setSubCategoryId(String id) { + subCategoryId = id; + } + + /* + * Getters + */ + public String getSubCategoryId() { + return subCategoryId; + } +} Added: trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/CategoryGroupModel.java =================================================================== --- trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/CategoryGroupModel.java (rev 0) +++ trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/CategoryGroupModel.java 2010-08-11 15:58:53 UTC (rev 47) @@ -0,0 +1,142 @@ +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.PagedResult; +import org.nuiton.wikitty.WikittyProxy; +import org.nuiton.wikitty.search.Search; +import org.zkoss.zul.AbstractGroupsModel; +import org.zkoss.zul.event.GroupsDataEvent; + +public class CategoryGroupModel extends AbstractGroupsModel { + + protected WikittyProxy proxy = ChoremDataProxy.getInstance(); + protected Criteria criteria = null; + protected int itemsByPage = 1; + protected int currentPage = 0; + protected List<Category> categories = new ArrayList<Category>(); + protected List<Boolean> closes = new ArrayList<Boolean>(); + + public CategoryGroupModel(int itemsByPage) { + this.itemsByPage = itemsByPage; + createList(); + } + + @Override + public Object getGroup(int groupIndex) { + pageChange(groupIndex); + int indexList = groupIndex % itemsByPage; + Category category = categories.get(indexList); + return category; + } + + @Override + public int getGroupCount() { + if (criteria == null) { + return 0; + } + Criteria criteria = this.criteria.setFirstIndex(0).setEndIndex(0); + PagedResult<Category> result = proxy.findAllByCriteria(Category.class, criteria); + return result.getNumFound(); + } + + @Override + public Object getChild(int groupIndex, int index) { + pageChange(groupIndex); + int indexList = groupIndex % itemsByPage; + Category category = categories.get(indexList); + Set<String> ids = category.getSubCategory(); + if (ids != null && ids.size() > 0) { + List<String> subCategories = new ArrayList<String>(ids); + String id = subCategories.get(0); + SubCategory subCategory = proxy.restore(SubCategory.class, id); + return subCategory; + } + return null; + } + + @Override + public int getChildCount(int groupIndex) { + pageChange(groupIndex); + int indexList = groupIndex % itemsByPage; + Category category = categories.get(indexList); + Set<String> subCategories = category.getSubCategory(); + if (subCategories == null || subCategories.isEmpty()) { + return 0; + } + int size = subCategories.size(); + return size; + } + + @Override + public Object getGroupfoot(int groupIndex) { + return null; + } + + @Override + public boolean hasGroupfoot(int groupIndex) { + return false; + } + + @Override + public boolean isClose(int groupIndex) { + int indexList = groupIndex % itemsByPage; + boolean bool = closes.get(indexList); + return bool; + } + + @Override + public void setClose(int groupIndex, boolean close) { + int indexList = groupIndex % itemsByPage; + Boolean bool = closes.get(indexList); + bool = close; + } + + public void pageChange(int index) { + int item = index; + int page = item / itemsByPage; + if (page != currentPage ) { + currentPage = page; + createList(); + } + } + + protected void createList() { + if (criteria != null) { + int first = currentPage * itemsByPage; + int end = first + (itemsByPage - 1); + Criteria criteria = this.criteria.setFirstIndex(first).setEndIndex(end); + List<Category> Categorys = proxy.findAllByCriteria(Category.class, criteria).getAll(); + this.categories = new ArrayList<Category>(Categorys); + createOpenList(); + } + } + + protected void createOpenList() { + closes = new ArrayList<Boolean>(); + if (categories != null) { + int size = categories.size(); + for (int count = 0; count < size; ++count) { + Boolean bool = new Boolean(false); + closes.add(bool); + } + } + } + + public void reload() { + createList(); + fireEvent(GroupsDataEvent.CONTENTS_CHANGED, 0, -1, -1); + } + + public void setCriteria(Criteria criteria) { + if (criteria != null) { + this.criteria = criteria; + reload(); + } + } +} 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 14:49:43 UTC (rev 46) +++ trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/CategoryModel.java 2010-08-11 15:58:53 UTC (rev 47) @@ -15,31 +15,24 @@ protected WikittyProxy proxy = ChoremDataProxy.getInstance(); protected Criteria criteria = null; - protected int itemsByPage = 1; - protected int currentPage = 0; + protected int pageSize = 1; + protected int activePage = 0; protected List<Category> categories = new ArrayList<Category>(); - public CategoryModel(int itemsByPage) { - this.itemsByPage = itemsByPage; + public CategoryModel(int pageSize) { + this.pageSize = pageSize; createList(); } @Override public Object getElementAt(int index) { - pageChange(index); - int indexList = index % itemsByPage; - Category Category = categories.get(indexList); + Category Category = categories.get(index); return Category; } @Override public int getSize() { - if (criteria == null) { - return 0; - } - Criteria criteria = this.criteria.setFirstIndex(0).setEndIndex(0); - PagedResult<Category> result = proxy.findAllByCriteria(Category.class, criteria); - return result.getNumFound(); + return categories.size(); } @Override @@ -49,16 +42,25 @@ for (Category data : categories) { String dataId = data.getWikittyId(); if (id.equals(dataId)) { - index = categories.indexOf(data) + (itemsByPage * currentPage); + index = categories.indexOf(data); break; } } return index; } + public int getTotalSize() { + if (criteria == null) { + return 0; + } + Criteria criteria = this.criteria.setFirstIndex(0).setEndIndex(0); + PagedResult<Category> result = proxy.findAllByCriteria(Category.class, criteria); + return result.getNumFound(); + } + public void addData(Category newData) { int listSize = categories.size(); - if (listSize < (itemsByPage)) { + if (listSize < (pageSize)) { categories.add(newData); } int size = getSize(); @@ -69,20 +71,17 @@ int index = categories.indexOf(data); if (index != -1) { categories.remove(index); - int interval = index + (itemsByPage * currentPage); - fireEvent(ListDataEvent.INTERVAL_REMOVED, interval, interval); + fireEvent(ListDataEvent.INTERVAL_REMOVED, index, index); } } public void reloadContent(int rowIndex) { - int indexList = rowIndex % itemsByPage; - Category Category = categories.get(indexList); + Category Category = categories.get(rowIndex); Category = proxy.restore(Category.class, Category.getWikittyId()); fireEvent(ListDataEvent.CONTENTS_CHANGED, rowIndex, rowIndex); } public void reload() { - createList(); fireEvent(ListDataEvent.CONTENTS_CHANGED, -1, -1); } @@ -93,26 +92,24 @@ public void setCriteria(Criteria criteria) { if (criteria != null) { this.criteria = criteria; - reload(); - } - } - - public void pageChange(int index) { - int item = index; - int page = item / itemsByPage; - if (page != currentPage ) { - currentPage = page; + activePage = 0; createList(); } } protected void createList() { if (criteria != null) { - int first = currentPage * itemsByPage; - int end = first + (itemsByPage - 1); + 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); } + fireEvent(ListDataEvent.CONTENTS_CHANGED, -1, -1); } + + public void setActivePage(int activePage) { + this.activePage = activePage; + createList(); + } } \ No newline at end of file Added: trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/CategoryRenderer.java =================================================================== --- trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/CategoryRenderer.java (rev 0) +++ trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/CategoryRenderer.java 2010-08-11 15:58:53 UTC (rev 47) @@ -0,0 +1,7 @@ +package org.chorem.billy.ui; + +import org.zkoss.zul.ListgroupRendererExt; +import org.zkoss.zul.ListitemRenderer; + +public interface CategoryRenderer extends ListitemRenderer, ListgroupRendererExt { +} Added: 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 (rev 0) +++ trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/CompanyBandboxMacro.java 2010-08-11 15:58:53 UTC (rev 47) @@ -0,0 +1,131 @@ +package org.chorem.billy.ui; + +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.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 CompanyBandboxMacro extends HtmlMacroComponent { + + private final int pageSize = 5; + + protected WikittyProxy proxy = ChoremDataProxy.getInstance(); + protected CompanyModel companyModel = new CompanyModel(pageSize); + protected String companyId = null; + + @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 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); + item.appendChild(cell2); + item.addEventListener(Events.ON_DOUBLE_CLICK, new EventListener() { + + @Override + public void onEvent(Event event) throws Exception { + companyId = id; + companyBandbox.setValue(name); + companyBandbox.close(); + } + }); + } + }; + } + + /* + * Setters + */ + public void setCompanyId(String id) { + companyId = id; + } + + /* + * Getters + */ + public String getCompanyId() { + return companyId; + } +} 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 14:49:43 UTC (rev 46) +++ trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/CompanyModel.java 2010-08-11 15:58:53 UTC (rev 47) @@ -5,6 +5,7 @@ import org.chorem.billy.ui.ChoremDataProxy; import org.chorem.data.bonzoms.Company; +import org.chorem.data.bonzoms.Project; import org.nuiton.wikitty.Criteria; import org.nuiton.wikitty.PagedResult; import org.nuiton.wikitty.WikittyProxy; @@ -16,50 +17,52 @@ protected WikittyProxy proxy = ChoremDataProxy.getInstance(); protected Criteria criteria = null; - protected int itemsByPage = 1; - protected int currentPage = 0; + protected int activePage = 0; + protected int pageSize = 1; protected List<Company> companies = new ArrayList<Company>(); - public CompanyModel(int itemsByPage) { - this.itemsByPage = itemsByPage; + public CompanyModel(int pageSize) { + this.pageSize = pageSize; createList(); } @Override public Object getElementAt(int index) { - pageChange(index); - int indexList = index % itemsByPage; - Company Company = companies.get(indexList); - return Company; + Company company = companies.get(index); + return company; } @Override public int getSize() { - if (criteria == null) { - return 0; - } - Criteria criteria = this.criteria.setFirstIndex(0).setEndIndex(0); - PagedResult<Company> result = proxy.findAllByCriteria(Company.class, criteria); - return result.getNumFound(); + return companies.size(); } @Override public int indexOf(Object obj) { int index = 0; - String id = ((Company) obj).getWikittyId(); + String id = ((Project) obj).getWikittyId(); for (Company data : companies) { String dataId = data.getWikittyId(); if (id.equals(dataId)) { - index = companies.indexOf(data) + (itemsByPage * currentPage); + index = companies.indexOf(data); break; } } return index; } + public int getTotalSize() { + if (criteria == null) { + return 0; + } + Criteria criteria = this.criteria.setFirstIndex(0).setEndIndex(0); + PagedResult<Company> result = proxy.findAllByCriteria(Company.class, criteria); + return result.getNumFound(); + } + public void addData(Company newData) { - int listSize = companies.size(); - if (listSize < (itemsByPage)) { + int listSize = companies.size(); + if (listSize < (pageSize)) { companies.add(newData); } int size = getSize(); @@ -67,23 +70,20 @@ } public void removeData(Company data) { - int index = companies.indexOf(data); - if (index != -1) { - companies.remove(index); - int interval = index + (itemsByPage * currentPage); + int interval = companies.indexOf(data); + if (interval != -1) { + companies.remove(interval); fireEvent(ListDataEvent.INTERVAL_REMOVED, interval, interval); } } public void reloadContent(int rowIndex) { - int indexList = rowIndex % itemsByPage; - Company Company = companies.get(indexList); - Company = proxy.restore(Company.class, Company.getWikittyId()); + Company company = companies.get(rowIndex); + company = proxy.restore(Company.class, company.getWikittyId()); fireEvent(ListDataEvent.CONTENTS_CHANGED, rowIndex, rowIndex); } public void reload() { - createList(); fireEvent(ListDataEvent.CONTENTS_CHANGED, -1, -1); } @@ -94,26 +94,24 @@ public void setCriteria(Criteria criteria) { if (criteria != null) { this.criteria = criteria; - reload(); - } - } - - public void pageChange(int index) { - int item = index; - int page = item / itemsByPage; - if (page != currentPage ) { - currentPage = page; + activePage = 0; createList(); } } protected void createList() { if (criteria != null) { - int first = currentPage * itemsByPage; - int end = first + (itemsByPage - 1); + int first = activePage * pageSize; + int end = first + (pageSize - 1); Criteria criteria = this.criteria.setFirstIndex(first).setEndIndex(end); - List<Company> Companies = proxy.findAllByCriteria(Company.class, criteria).getAll(); - this.companies = new ArrayList<Company>(Companies); + List<Company> companies = proxy.findAllByCriteria(Company.class, criteria).getAll(); + this.companies = new ArrayList<Company>(companies); } + 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/InvoiceController.java =================================================================== --- trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/InvoiceController.java 2010-08-11 14:49:43 UTC (rev 46) +++ trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/InvoiceController.java 2010-08-11 15:58:53 UTC (rev 47) @@ -1,8 +1,12 @@ package org.chorem.billy.ui; +import java.util.ArrayList; +import java.util.List; + import org.chorem.billy.ui.ChoremDataProxy; +import org.chorem.data.bonzoms.Project; +import org.chorem.data.bonzoms.ProjectImpl; import org.nuiton.wikitty.WikittyProxy; -import org.zkoss.zk.ui.Execution; import org.zkoss.zk.ui.Executions; import org.zkoss.zk.ui.util.GenericForwardComposer; 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 14:49:43 UTC (rev 46) +++ trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/InvoiceFormController.java 2010-08-11 15:58:53 UTC (rev 47) @@ -1,37 +1,13 @@ 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.Company; import org.chorem.data.bonzoms.Invoice; import org.chorem.data.bonzoms.InvoiceImpl; -import org.chorem.data.bonzoms.Project; -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.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.zkplus.databind.AnnotateDataBinder; import org.zkoss.zkplus.databind.DataBinder; -import org.zkoss.zul.Bandbox; -import org.zkoss.zul.Checkbox; -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.Row; -import org.zkoss.zul.RowRenderer; import org.zkoss.zul.Window; public class InvoiceFormController extends GenericForwardComposer { @@ -39,13 +15,11 @@ protected WikittyProxy proxy = ChoremDataProxy.getInstance(); protected Invoice invoice = new InvoiceImpl(); - protected CategoryModel categoryModel = new CategoryModel(2); - protected CompanyModel companyModel = new CompanyModel(5); - protected ProjectModel projectModel = new ProjectModel(5); + protected CategoryBandboxMacro categoryMacro; + protected ProjectBandboxMacro projectMacro; + protected CompanyBandboxMacro companyMacro; - protected Bandbox categoryBandbox; - protected Bandbox companyBandbox; - protected Bandbox projectBandbox; + public static final String EVENT_ON_SAVE_INVOICE = "onSaveInvoice"; @Override public void doAfterCompose(Component comp) throws Exception { @@ -60,223 +34,39 @@ if (invoiceId != null) { invoice = proxy.restore(Invoice.class, invoiceId); } - initCategoryBandbox(); - initCompanyBandbox(); - initProjectBandbox(); + initCategoryMacro(); + initCompanyMacro(); + initProjectMacro(); DataBinder binder = new AnnotateDataBinder(comp); binder.bindBean("composer", this); binder.loadAll(); } - protected void initCategoryBandbox() { - onOK$categoryBandbox(); - categoryBandbox.close(); + protected void initCategoryMacro() { + String id = invoice.getSubCategory(); + if (id != null) { + categoryMacro.setSubCategoryId(id); + } } - protected void initCompanyBandbox() { - onOK$companyBandbox(); - String companyId = invoice.getCompany(); - if (companyId != null && !companyId.isEmpty()) { - Company company = proxy.restore(Company.class, companyId); - companyBandbox.setValue(company.getName()); + protected void initCompanyMacro() { + String id = invoice.getCompany(); + if (id != null) { + companyMacro.setCompanyId(id); } - companyBandbox.close(); } - protected void initProjectBandbox() { - onOK$projectBandbox(); - String projectId = invoice.getProject(); - if (projectId != null && !projectId.isEmpty()) { - Project project = proxy.restore(Project.class, projectId); - projectBandbox.setValue(project.getName()); + protected void initProjectMacro() { + String id = invoice.getProject(); + if (id != null) { + projectMacro.setProjectId(id); } - projectBandbox.close(); } - - 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); - } - } /* - * Renderers - */ - public ListitemRenderer getCompanyRenderer() { - return new ListitemRenderer() { - - @Override - public void render(Listitem item, Object data) throws Exception { - item.setValue(data); - final Company company = (Company) data; - Listcell name = new Listcell(company.getName()); - Listcell type = new Listcell(company.getType()); - item.appendChild(name); - item.appendChild(type); - item.addEventListener(Events.ON_DOUBLE_CLICK, new EventListener() { - - @Override - public void onEvent(Event event) throws Exception { - invoice.setCompany(company.getWikittyId()); - companyBandbox.setValue(company.getName()); - companyBandbox.close(); - } - }); - } - }; - } - - protected void createSubCategoryListbox(Listbox listbox, Set<String> subCategoryIds) { - if (subCategoryIds != null && !subCategoryIds.isEmpty()) { - List<SubCategory> subCategories = proxy.restore(SubCategory.class, new ArrayList<String>(subCategoryIds)); - SubCategoryModel subCategoryModel = new SubCategoryModel(); - subCategoryModel.setSubCategories(subCategories); - 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; - Listcell cell = new Listcell(); - Checkbox checkbox = new Checkbox(subCategory.getName()); - Set<String> ids = invoice.getSubCategory(); - if (ids != null && ids.contains(subCategory.getWikittyId())) { - checkbox.setChecked(true); - } - cell.appendChild(checkbox); - item.appendChild(cell); - checkbox.addEventListener(Events.ON_CHECK, new EventListener() { - - @Override - public void onEvent(Event event) throws Exception { - Checkbox checkbox = (Checkbox) event.getTarget(); - if (checkbox.isChecked()) { - invoice.addSubCategory(subCategory.getWikittyId()); - } else { - String id = subCategory.getWikittyId(); - Set<String> subCategories = invoice.getSubCategory(); - if (subCategories != null && subCategories.contains(id)) { - invoice.removeSubCategory(id); - } - } - } - }); - } - }); - } - } - - 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); - - } - }; - } - - public ListitemRenderer getProjectRenderer() { - return new ListitemRenderer() { - - @Override - public void render(Listitem item, Object data) throws Exception { - item.setValue(data); - final Project project = (Project) data; - Listcell name = new Listcell(project.getName()); - item.appendChild(name); - item.addEventListener(Events.ON_DOUBLE_CLICK, new EventListener() { - - @Override - public void onEvent(Event event) throws Exception { - invoice.setProject(project.getWikittyId()); - projectBandbox.setValue(project.getName()); - projectBandbox.close(); - } - }); - } - }; - } - - /* - * Events - */ - public void onOK$companyBandbox() { - 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); - companyBandbox.open(); - } - - public void onOK$projectBandbox() { - 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); - projectBandbox.open(); - } - - public void onOK$categoryBandbox() { - 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); - categoryBandbox.open(); - } - - public void onClick$newCategory() { - Window win = (Window) Executions.createComponents("categoryFormPage.zul", null, null); - win.addEventListener(CategoryFormController.EVENT_ON_SAVE_CATEGORY, new EventListener() { - - @Override - public void onEvent(Event event) throws Exception { - categoryModel.reload(); - } - }); - } - - /* * Getters */ public Invoice getInvoice() { return invoice; } - - public CategoryModel getCategoryModel() { - return categoryModel; - } - - public ProjectModel getProjectModel() { - return projectModel; - } - - public CompanyModel getCompanyModel() { - return companyModel; - } } \ No newline at end of file Added: 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 (rev 0) +++ trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/ProjectBandboxMacro.java 2010-08-11 15:58:53 UTC (rev 47) @@ -0,0 +1,129 @@ +package org.chorem.billy.ui; + +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.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 ProjectBandboxMacro extends HtmlMacroComponent { + + private final int pageSize = 5; + + protected WikittyProxy proxy = ChoremDataProxy.getInstance(); + protected ProjectModel projectModel = new ProjectModel(pageSize); + protected String projectId = null; + + @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); + Project project = (Project) data; + final Bandbox projectBandbox = (Bandbox) getFellow("projectBandbox"); + final String id = project.getWikittyId(); + final String name = project.getName(); + if (projectId != null && projectId.equals(id)) { + projectBandbox.setValue(name); + projectBandbox.close(); + } + Listcell cell = new Listcell(project.getName()); + item.appendChild(cell); + item.addEventListener(Events.ON_DOUBLE_CLICK, new EventListener() { + + @Override + public void onEvent(Event event) throws Exception { + projectId = id; + projectBandbox.setValue(name); + projectBandbox.close(); + } + }); + } + }; + } + + /* + * Setters + */ + public void setProjectId(String id) { + projectId = id; + } + + /* + * Getters + */ + public String getProjectId() { + return projectId; + } +} Added: trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/ProjectFormController.java =================================================================== --- trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/ProjectFormController.java (rev 0) +++ trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/ProjectFormController.java 2010-08-11 15:58:53 UTC (rev 47) @@ -0,0 +1,40 @@ +package org.chorem.billy.ui; + +import org.chorem.data.bonzoms.Project; +import org.chorem.data.bonzoms.ProjectImpl; +import org.nuiton.wikitty.WikittyProxy; +import org.zkoss.zk.ui.Component; +import org.zkoss.zk.ui.Executions; +import org.zkoss.zk.ui.util.GenericForwardComposer; +import org.zkoss.zkplus.databind.AnnotateDataBinder; +import org.zkoss.zkplus.databind.DataBinder; +import org.zkoss.zul.Window; + +public class ProjectFormController extends GenericForwardComposer{ + + protected WikittyProxy proxy = ChoremDataProxy.getInstance(); + protected Project project = new ProjectImpl(); + + public static final String EVENT_ON_SAVE_PROJECT = "onSaveProject"; + + @Override + public void doAfterCompose(Component comp) throws Exception { + super.doAfterCompose(comp); + Window win = (Window) self; + win.doModal(); + win.setPosition("center"); + String projectId = Executions.getCurrent().getParameter("projectId"); + if (projectId == null) { + projectId = (String) arg.get("projectId"); + } + if (projectId != null) { + project = proxy.restore(Project.class, projectId); + } +// initCategoryBandbox(); +// initCompanyBandbox(); +// initProjectBandbox(); + DataBinder binder = new AnnotateDataBinder(comp); + binder.bindBean("composer", this); + binder.loadAll(); + } +} 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 14:49:43 UTC (rev 46) +++ trunk/billy-ui-zk/src/main/java/org/chorem/billy/ui/ProjectModel.java 2010-08-11 15:58:53 UTC (rev 47) @@ -16,31 +16,24 @@ protected WikittyProxy proxy = ChoremDataProxy.getInstance(); protected Criteria criteria = null; - protected int itemsByPage = 1; - protected int currentPage = 0; + protected int activePage = 0; + protected int pageSize = 1; protected List<Project> projects = new ArrayList<Project>(); - public ProjectModel(int itemsByPage) { - this.itemsByPage = itemsByPage; + public ProjectModel(int pageSize) { + this.pageSize = pageSize; createList(); } @Override public Object getElementAt(int index) { - pageChange(index); - int indexList = index % itemsByPage; - Project Project = projects.get(indexList); + Project Project = projects.get(index); return Project; } @Override public int getSize() { - if (criteria == null) { - return 0; - } - Criteria criteria = this.criteria.setFirstIndex(0).setEndIndex(0); - PagedResult<Project> result = proxy.findAllByCriteria(Project.class, criteria); - return result.getNumFound(); + return projects.size(); } @Override @@ -50,16 +43,25 @@ for (Project data : projects) { String dataId = data.getWikittyId(); if (id.equals(dataId)) { - index = projects.indexOf(data) + (itemsByPage * currentPage); + index = projects.indexOf(data); break; } } return index; } + public int getTotalSize() { + if (criteria == null) { + return 0; + } + Criteria criteria = this.criteria.setFirstIndex(0).setEndIndex(0); + PagedResult<Project> result = proxy.findAllByCriteria(Project.class, criteria); + return result.getNumFound(); + } + public void addData(Project newData) { int listSize = projects.size(); - if (listSize < (itemsByPage)) { + if (listSize < (pageSize)) { projects.add(newData); } int size = getSize(); @@ -67,23 +69,20 @@ } public void removeData(Project data) { - int index = projects.indexOf(data); - if (index != -1) { - projects.remove(index); - int interval = index + (itemsByPage * currentPage); + int interval = projects.indexOf(data); + if (interval != -1) { + projects.remove(interval); fireEvent(ListDataEvent.INTERVAL_REMOVED, interval, interval); } } public void reloadContent(int rowIndex) { - int indexList = rowIndex % itemsByPage; - Project Project = projects.get(indexList); - Project = proxy.restore(Project.class, Project.getWikittyId()); + Project project = projects.get(rowIndex); + project = proxy.restore(Project.class, project.getWikittyId()); fireEvent(ListDataEvent.CONTENTS_CHANGED, rowIndex, rowIndex); } public void reload() { - createList(); fireEvent(ListDataEvent.CONTENTS_CHANGED, -1, -1); } @@ -94,26 +93,24 @@ public void setCriteria(Criteria criteria) { if (criteria != null) { this.criteria = criteria; - reload(); - } - } - - public void pageChange(int index) { - int item = index; - int page = item / itemsByPage; - if (page != currentPage ) { - currentPage = page; + activePage = 0; createList(); } } protected void createList() { if (criteria != null) { - int first = currentPage * itemsByPage; - int end = first + (itemsByPage - 1); + int first = activePage * pageSize; + int end = first + (pageSize - 1); Criteria criteria = this.criteria.setFirstIndex(first).setEndIndex(end); List<Project> projects = proxy.findAllByCriteria(Project.class, criteria).getAll(); this.projects = new ArrayList<Project>(projects); } + fireEvent(ListDataEvent.CONTENTS_CHANGED, -1, -1); } + + public void setActivePage(int activePage) { + this.activePage = activePage; + createList(); + } } Added: trunk/billy-ui-zk/src/main/webapp/WEB-INF/lang-addon.xml =================================================================== --- trunk/billy-ui-zk/src/main/webapp/WEB-INF/lang-addon.xml (rev 0) +++ trunk/billy-ui-zk/src/main/webapp/WEB-INF/lang-addon.xml 2010-08-11 15:58:53 UTC (rev 47) @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<language-addon> + + <addon-name>My macros</addon-name> + <language-name>xul/html</language-name> + + <!-- My first macro --> + <component> + <component-name>categoryMacro</component-name> + <component-class>org.chorem.billy.ui.CategoryBandboxMacro</component-class> + <macro-uri>macros/categoryBandboxMacro.zul</macro-uri> + </component> + + <!-- My second macro --> + <component> + <component-name>projectMacro</component-name> + <component-class>org.chorem.billy.ui.ProjectBandboxMacro</component-class> + <macro-uri>macros/projectBandboxMacro.zul</macro-uri> + </component> + + <!-- My third macro --> + <component> + <component-name>companyMacro</component-name> + <component-class>org.chorem.billy.ui.CompanyBandboxMacro</component-class> + <macro-uri>macros/companyBandboxMacro.zul</macro-uri> + </component> + +</language-addon> Modified: trunk/billy-ui-zk/src/main/webapp/WEB-INF/zk.xml =================================================================== --- trunk/billy-ui-zk/src/main/webapp/WEB-INF/zk.xml 2010-08-11 14:49:43 UTC (rev 46) +++ trunk/billy-ui-zk/src/main/webapp/WEB-INF/zk.xml 2010-08-11 15:58:53 UTC (rev 47) @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> - -<!-- - Created by ZK Studio ---> <zk> + <language-config> + <addon-uri>/WEB-INF/lang-addon.xml</addon-uri> + </language-config> </zk> \ No newline at end of file Modified: trunk/billy-ui-zk/src/main/webapp/invoiceFormPage.zul =================================================================== --- trunk/billy-ui-zk/src/main/webapp/invoiceFormPage.zul 2010-08-11 14:49:43 UTC (rev 46) +++ trunk/billy-ui-zk/src/main/webapp/invoiceFormPage.zul 2010-08-11 15:58:53 UTC (rev 47) @@ -17,54 +17,11 @@ <label value="Posted date" /> <datebox format="yyyy/MM/dd" value="@{composer.invoice.posted, save-when='saveInvoice.onClick'}" /> - <hbox> - <toolbarbutton id="editProject" label="Edit project" /> / <toolbarbutton id="newProject" label="New project" /> - </hbox> - - <bandbox id="projectBandbox" mold="rounded"> - <bandpopup> - <vbox> - <listbox autopaging="true" mold="paging" id="projectListbox" rows="5" width="200px" model="@{composer.projectModel}" - itemRenderer="@{composer.projectRenderer}"> - <listhead> - <listheader label="Name" /> - </listhead> - </listbox> - </vbox> - </bandpopup> - </bandbox> + <projectMacro id="projectMacro" /> - <hbox> - <toolbarbutton id="editCompany" label="Edit company" /> / <toolbarbutton id="newCompany" label="New company" /> - </hbox> - - <bandbox id="companyBandbox" mold="rounded"> - <bandpopup> - <vbox> - <listbox autopaging="true" mold="paging" id="companyListbox" rows="5" width="200px" model="@{composer.companyModel}" - itemRenderer="@{composer.companyRenderer}"> - <listhead> - <listheader label="Name" /> - <listheader label="Type" /> - </listhead> - </listbox> - </vbox> - </bandpopup> - </bandbox> + <companyMacro id="companyMacro" /> - <hbox> - <toolbarbutton id="editCategory" label="Edit category" /> / <toolbarbutton id="newCategory" label="New category" /> - </hbox> - - <bandbox id="categoryBandbox" mold="rounded"> - <bandpopup> - <vbox> - <grid mold="paging" id="categoryGrid" pageSize="2" width="200px" model="@{composer.categoryModel}" - rowRenderer="@{composer.categoryRenderer}"> - </grid> - </vbox> - </bandpopup> - </bandbox> + <categoryMacro id="categoryMacro" /> </vbox> @@ -78,7 +35,7 @@ <label value="Invoice number" /> <textbox value="@{composer.invoice.number, save-when='saveInvoice.onClick'}" /> <label value="Description" /> - <textbox rows="8" value="@{composer.invoice.description, save-when='saveInvoice.onClick'}" /> + <textbox rows="5" value="@{composer.invoice.description, save-when='saveInvoice.onClick'}" /> <separator /> </vbox> </hbox> Added: trunk/billy-ui-zk/src/main/webapp/macros/categoryBandboxMacro.zul =================================================================== --- trunk/billy-ui-zk/src/main/webapp/macros/categoryBandboxMacro.zul (rev 0) +++ trunk/billy-ui-zk/src/main/webapp/macros/categoryBandboxMacro.zul 2010-08-11 15:58:53 UTC (rev 47) @@ -0,0 +1,13 @@ +<?page title="new page title" contentType="text/html;charset=UTF-8"?> +<zk> + Sub category: + <bandbox id="categoryBandbox" mold="rounded"> + <bandpopup> + <vbox> + <grid id="categoryGrid" width="200px"> + </grid> + <paging id="categoryPaging" width="200px"/> + </vbox> + </bandpopup> + </bandbox> +</zk> \ No newline at end of file Added: trunk/billy-ui-zk/src/main/webapp/macros/companyBandboxMacro.zul =================================================================== --- trunk/billy-ui-zk/src/main/webapp/macros/companyBandboxMacro.zul (rev 0) +++ trunk/billy-ui-zk/src/main/webapp/macros/companyBandboxMacro.zul 2010-08-11 15:58:53 UTC (rev 47) @@ -0,0 +1,17 @@ +<?page title="new page title" contentType="text/html;charset=UTF-8"?> +<zk> + Company: + <bandbox id="companyBandbox" mold="rounded"> + <bandpopup> + <vbox> + <listbox id="companyListbox" width="200px" > + <listhead> + <listheader label="Name" /> + <listheader label="Type" /> + </listhead> + </listbox> + <paging id="companyPaging" width="200px"/> + </vbox> + </bandpopup> + </bandbox> +</zk> \ No newline at end of file Added: trunk/billy-ui-zk/src/main/webapp/macros/projectBandboxMacro.zul =================================================================== --- trunk/billy-ui-zk/src/main/webapp/macros/projectBandboxMacro.zul (rev 0) +++ trunk/billy-ui-zk/src/main/webapp/macros/projectBandboxMacro.zul 2010-08-11 15:58:53 UTC (rev 47) @@ -0,0 +1,16 @@ +<?page title="new page title" contentType="text/html;charset=UTF-8"?> +<zk> + Project: + <bandbox id="projectBandbox" mold="rounded"> + <bandpopup> + <vbox> + <listbox id="projectListbox" width="200px"> + <listhead> + <listheader label="Name" /> + </listhead> + </listbox> + <paging id="projectPaging" width="200px"/> + </vbox> + </bandpopup> + </bandbox> +</zk> \ No newline at end of file