From 60f46963d3246d577ea9359253048d854004ba3d Mon Sep 17 00:00:00 2001 From: Lorenzo Tilve Date: Fri, 5 Mar 2010 22:19:13 +0100 Subject: [PATCH] ItEr49S17CUAsignacionGrupoRecursosAPlanificacionItEr47S16: Added pagination in advanced assignment window --- .../TimeTrackedTableWithLeftPane.java | 5 + .../zkoss/ganttz/timetracker/TimeTracker.java | 36 +++- .../zoom/DetailFiveTimeTrackerState.java | 3 +- .../zoom/DetailFourTimeTrackerState.java | 3 +- .../zoom/DetailOneTimeTrackerState.java | 3 +- .../zoom/DetailThreeTimeTrackerState.java | 3 +- .../zoom/DetailTwoTimeTrackerState.java | 7 +- .../AdvancedAllocationController.java | 171 +++++++++++++++++- .../main/webapp/common/css/navalplan_zk.css | 120 ++++++++---- .../src/main/webapp/common/img/ico_left.png | Bin 0 -> 647 bytes .../src/main/webapp/common/img/ico_right.png | Bin 0 -> 664 bytes .../src/main/webapp/common/img/toolbar-hm.png | Bin 0 -> 986 bytes .../src/main/webapp/js/advanceAllocations.js | 30 ++- .../webapp/planner/advance_allocation.zul | 100 +++++----- 14 files changed, 367 insertions(+), 114 deletions(-) create mode 100644 navalplanner-webapp/src/main/webapp/common/img/ico_left.png create mode 100644 navalplanner-webapp/src/main/webapp/common/img/ico_right.png create mode 100644 navalplanner-webapp/src/main/webapp/common/img/toolbar-hm.png diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/TimeTrackedTableWithLeftPane.java b/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/TimeTrackedTableWithLeftPane.java index 81fae77f7..91c0e46b7 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/TimeTrackedTableWithLeftPane.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/TimeTrackedTableWithLeftPane.java @@ -51,6 +51,7 @@ public class TimeTrackedTableWithLeftPane { timeTrackedTable = new TimeTrackedTable( dataForTimeTracker(dataSource), cellRendererForTimeTracker, timeTracker); + timeTrackedTable.setSclass("inner-timetracked-table"); leftPane = new Grid(); zoomLevelListener = new IZoomLevelChangedListener() { @Override @@ -133,4 +134,8 @@ public class TimeTrackedTableWithLeftPane { return leftPane; } + public void reload() { + timeTrackedTable.recreate(); + } + } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/TimeTracker.java b/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/TimeTracker.java index bc5998a75..211c69be7 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/TimeTracker.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/TimeTracker.java @@ -47,6 +47,16 @@ import org.zkoss.zk.ui.Component; public class TimeTracker { + public interface IDetailItemFilter { + + public Collection selectsFirstLevel( + Collection firstLevelDetails); + + public Collection selectsSecondLevel( + Collection secondLevelDetails); + + } + private ZoomLevel detailLevel = ZoomLevel.DETAIL_ONE; private WeakReferencedListeners zoomListeners = WeakReferencedListeners @@ -68,6 +78,8 @@ public class TimeTracker { private boolean registeredFirstTask = false; + private IDetailItemFilter filter = null; + public TimeTracker(Interval interval, ZoomLevel zoomLevel, Component parent) { this(interval, zoomLevel, SeveralModificators.empty(), SeveralModificators.empty(), parent); @@ -101,6 +113,10 @@ public class TimeTracker { detailLevel = zoomLevel; } + public void setFilter(IDetailItemFilter filter) { + this.filter = filter; + } + public ZoomLevel getDetailLevel() { return detailLevel; } @@ -114,7 +130,15 @@ public class TimeTracker { detailsFirstLevelCached = getTimeTrackerState() .getFirstLevelDetails(interval); } - return detailsFirstLevelCached; + return filterFirstLevel(detailsFirstLevelCached); + } + + private Collection filterFirstLevel( + Collection firstLevelDetails) { + if (filter == null) { + return firstLevelDetails; + } + return filter.selectsFirstLevel(firstLevelDetails); } public Collection getDetailsSecondLevel() { @@ -122,7 +146,15 @@ public class TimeTracker { detailsSecondLevelCached = getTimeTrackerState() .getSecondLevelDetails(interval); } - return detailsSecondLevelCached; + return filterSecondLevel(detailsSecondLevelCached); + } + + private Collection filterSecondLevel( + Collection secondLevelDetails) { + if (filter == null) { + return secondLevelDetails; + } + return filter.selectsSecondLevel(secondLevelDetails); } private Interval realIntervalCached; diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/DetailFiveTimeTrackerState.java b/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/DetailFiveTimeTrackerState.java index 0a6aeff91..15c68c0b6 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/DetailFiveTimeTrackerState.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/DetailFiveTimeTrackerState.java @@ -53,7 +53,8 @@ public class DetailFiveTimeTrackerState extends TimeTrackerStateUsingJodaTime { public DetailItem create(DateTime dateTime) { return new DetailItem(FIRST_LEVEL_SIZE, dateTime .getWeekOfWeekyear() - + dateTime.toString(", MMM YYYY")); + + dateTime.toString(", MMM YYYY"), dateTime, dateTime + .plusDays(7)); } }; } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/DetailFourTimeTrackerState.java b/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/DetailFourTimeTrackerState.java index b58e8413f..198ecd664 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/DetailFourTimeTrackerState.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/DetailFourTimeTrackerState.java @@ -56,7 +56,8 @@ public class DetailFourTimeTrackerState extends TimeTrackerStateUsingJodaTime { @Override public DetailItem create(DateTime dateTime) { return new DetailItem(FIRST_LEVEL_SIZE, dateTime - .toString("MMMM,YYYY")); + .toString("MMMM,YYYY"), dateTime, dateTime + .plusMonths(1)); } }; } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/DetailOneTimeTrackerState.java b/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/DetailOneTimeTrackerState.java index 0a51bb784..92ea7f63a 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/DetailOneTimeTrackerState.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/DetailOneTimeTrackerState.java @@ -52,7 +52,8 @@ public class DetailOneTimeTrackerState extends TimeTrackerState { for (int i = initialYear; i <= endYear; i++) { DetailItem d = new DetailItem(FIRST_LEVEL_ITEM_SIZE, String - .valueOf(i)); + .valueOf(i), new DateTime(i, 1, 1, 0, 0, 0, 0), + new DateTime(i, 12, 31, 0, 0, 0, 0)); detailsVector.add(d); } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/DetailThreeTimeTrackerState.java b/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/DetailThreeTimeTrackerState.java index d5f4e19ae..cc038ed05 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/DetailThreeTimeTrackerState.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/DetailThreeTimeTrackerState.java @@ -103,7 +103,8 @@ public class DetailThreeTimeTrackerState extends TimeTrackerStateUsingJodaTime { @Override public DetailItem create(DateTime dateTime) { return new DetailItem(FIRST_LEVEL_SIZE, - getYearWithSemesterString(dateTime)); + getYearWithSemesterString(dateTime), dateTime, dateTime + .plusMonths(6)); } }; } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/DetailTwoTimeTrackerState.java b/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/DetailTwoTimeTrackerState.java index b7fe2587c..bcfe93281 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/DetailTwoTimeTrackerState.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/DetailTwoTimeTrackerState.java @@ -82,11 +82,14 @@ public class DetailTwoTimeTrackerState extends TimeTrackerState { int quarter = calculateInQuarterPeriodDateInYear(initialDate, initialYear); detailsVector.add(new DetailItem((4 - (quarter - 1)) - * FIRST_LEVEL_ITEM_SIZE / 4, String.valueOf(initialYear))); + * FIRST_LEVEL_ITEM_SIZE / 4, String.valueOf(initialYear), + new DateTime(initialYear, 1, 1, 0, 0, 0, 0), new DateTime( + initialYear, 1, 1, 0, 0, 0, 0))); for (int i = (initialYear + 1); i < endYear; i++) { DetailItem d = new DetailItem(FIRST_LEVEL_ITEM_SIZE, String - .valueOf(i)); + .valueOf(i), new DateTime(i, 1, 1, 0, 0, 0, 0), + new DateTime(i, 12, 31, 0, 0, 0, 0)); detailsVector.add(d); } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/AdvancedAllocationController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/AdvancedAllocationController.java index b260d4c74..f5079b6ae 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/AdvancedAllocationController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/AdvancedAllocationController.java @@ -39,6 +39,7 @@ import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; import org.joda.time.DateTime; import org.joda.time.LocalDate; +import org.joda.time.Period; import org.navalplanner.business.planner.entities.AggregateOfResourceAllocations; import org.navalplanner.business.planner.entities.AssignmentFunction; import org.navalplanner.business.planner.entities.CalculatedValue; @@ -60,6 +61,7 @@ import org.zkoss.ganttz.timetracker.TimeTrackedTable; import org.zkoss.ganttz.timetracker.TimeTrackedTableWithLeftPane; import org.zkoss.ganttz.timetracker.TimeTracker; import org.zkoss.ganttz.timetracker.TimeTrackerComponentWithoutColumns; +import org.zkoss.ganttz.timetracker.TimeTracker.IDetailItemFilter; import org.zkoss.ganttz.timetracker.zoom.DetailItem; import org.zkoss.ganttz.timetracker.zoom.IZoomLevelChangedListener; import org.zkoss.ganttz.timetracker.zoom.ZoomLevel; @@ -152,6 +154,7 @@ public class AdvancedAllocationController extends GenericForwardComposer { return end; } + private static ArrayList> reverse( List> all) { ArrayList> reversed = new ArrayList>( @@ -370,8 +373,13 @@ public class AdvancedAllocationController extends GenericForwardComposer { private Div insertionPointLeftPanel; private Div insertionPointRightPanel; + private Button paginationDownButton; + private Button paginationUpButton; + private TimeTracker timeTracker; + private PaginatorFilter paginatorFilter; + private TimeTrackerComponentWithoutColumns timeTrackerComponent; private Grid leftPane; private TimeTrackedTable table; @@ -405,6 +413,7 @@ public class AdvancedAllocationController extends GenericForwardComposer { onlyOneVisible = new OnlyOneVisible(normalLayout, noDataLayout); this.associatedComponent = comp; loadAndInitializeComponents(); + Clients.evalJavaScript("ADVANCE_ALLOCATIONS.listenToScroll();"); } @@ -422,24 +431,171 @@ public class AdvancedAllocationController extends GenericForwardComposer { } } + private class PaginatorFilter implements IDetailItemFilter { + + private DateTime intervalStart; + private DateTime intervalEnd; + + private DateTime paginatorStart; + private DateTime paginatorEnd; + + private ZoomLevel zoomLevel = ZoomLevel.DETAIL_ONE; + + private Period intervalIncrease() { + switch (zoomLevel) { + case DETAIL_ONE: + return Period.years(5); + case DETAIL_TWO: + return Period.years(3); + case DETAIL_THREE: + return Period.years(2); + case DETAIL_FOUR: + return Period.months(6); + case DETAIL_FIVE: + return Period.months(2); + } + return Period.years(5); + } + + @Override + public Collection selectsFirstLevel( + Collection firstLevelDetails) { + ArrayList result = new ArrayList(); + for (DetailItem each : firstLevelDetails) { + if ((each.getStartDate() == null) + || !(each.getStartDate().isBefore(paginatorStart)) + && (each.getStartDate().isBefore(paginatorEnd))) { + result.add(each); + } + } + return result; + } + + @Override + public Collection selectsSecondLevel( + Collection secondLevelDetails) { + ArrayList result = new ArrayList(); + for (DetailItem each : secondLevelDetails) { + if ((each.getStartDate() == null) + || !(each.getStartDate().isBefore(paginatorStart)) + && (each.getStartDate().isBefore(paginatorEnd))) { + result.add(each); + } + } + return result; + } + + public void next() { + paginatorStart = paginatorStart.plus(intervalIncrease()); + paginatorEnd = paginatorEnd.plus(intervalIncrease()); + // Avoid reduced last intervals + if ((paginatorEnd.plus(intervalIncrease()).isAfter(intervalEnd))) { + paginatorEnd = paginatorEnd.plus(intervalIncrease()); + } + updatePaginationButtons(); + } + + public void previous() { + paginatorStart = paginatorStart.minus(intervalIncrease()); + paginatorEnd = paginatorEnd.minus(intervalIncrease()); + updatePaginationButtons(); + } + + private void updatePaginationButtons() { + paginationDownButton.setDisabled(isFirstPage()); + paginationUpButton.setDisabled(isLastPage()); + } + + public boolean isFirstPage() { + return !(paginatorStart.isAfter(intervalStart)); + } + + public boolean isLastPage() { + return ((paginatorEnd.isAfter(intervalEnd)) || (paginatorEnd + .isEqual(intervalEnd))); + } + + public void setZoomLevel(ZoomLevel detailLevel) { + zoomLevel = detailLevel; + } + + public void setInterval(Interval realInterval) { + intervalStart = new DateTime(realInterval.getStart()); + intervalEnd = new DateTime(realInterval.getFinish()); + paginatorStart = intervalStart; + paginatorEnd = intervalStart.plus(intervalIncrease()); + if ((paginatorEnd.plus(intervalIncrease()).isAfter(intervalEnd))) { + paginatorEnd = intervalEnd; + } + updatePaginationButtons(); + } + } + private void createComponents() { timeTracker = new TimeTracker(addMarginTointerval(), self); - timeTrackerComponent = new TimeTrackerComponentWithoutColumns( - timeTracker, "timeTracker"); - TimeTrackedTableWithLeftPane timeTrackedTableWithLeftPane = new TimeTrackedTableWithLeftPane( - getDataSource(), getColumnsForLeft(), getLeftRenderer(), - getRightRenderer(), timeTracker); - Clients.evalJavaScript("ADVANCE_ALLOCATIONS.listenToScroll();"); + paginatorFilter = new PaginatorFilter(); + paginatorFilter.setZoomLevel(timeTracker.getDetailLevel()); + paginatorFilter.setInterval(timeTracker.getRealInterval()); + paginationUpButton.setDisabled(isLastPage()); + timeTracker.setFilter(paginatorFilter); timeTracker.addZoomListener(new IZoomLevelChangedListener() { @Override public void zoomLevelChanged(ZoomLevel detailLevel) { - Clients.evalJavaScript("ADVANCE_ALLOCATIONS.listenToScroll();"); + paginatorFilter.setZoomLevel(detailLevel); + paginatorFilter.setInterval(timeTracker.getRealInterval()); + timeTracker.setFilter(paginatorFilter); + Clients + .evalJavaScript("ADVANCE_ALLOCATIONS.listenToHorizontalScroll();"); } }); + timeTrackerComponent = new TimeTrackerComponentWithoutColumns( + timeTracker, "timeTracker"); + timeTrackedTableWithLeftPane = new TimeTrackedTableWithLeftPane( + getDataSource(), getColumnsForLeft(), getLeftRenderer(), + getRightRenderer(), timeTracker); table = timeTrackedTableWithLeftPane.getRightPane(); table.setSclass("timeTrackedTableWithLeftPane"); leftPane = timeTrackedTableWithLeftPane.getLeftPane(); leftPane.setFixedLayout(true); + Clients.evalJavaScript("ADVANCE_ALLOCATIONS.listenToScroll();"); + Clients + .evalJavaScript("ADVANCE_ALLOCATIONS.listenToHorizontalScroll();"); + } + + public void paginationDown() { + paginatorFilter.previous(); + reloadComponent(); + } + + public void paginationUp() { + paginatorFilter.next(); + reloadComponent(); + } + + private void reloadComponent() { + timeTrackedTableWithLeftPane.reload(); + timeTrackerComponent.recreate(); + // Reattach listener for zoomLevel changes. May be optimized + timeTracker.addZoomListener(new IZoomLevelChangedListener() { + @Override + public void zoomLevelChanged(ZoomLevel detailLevel) { + paginatorFilter.setZoomLevel(detailLevel); + paginatorFilter.setInterval(timeTracker.getRealInterval()); + timeTracker.setFilter(paginatorFilter); + Clients + .evalJavaScript("ADVANCE_ALLOCATIONS.listenToHorizontalScroll();"); + } + }); + Clients + .evalJavaScript("ADVANCE_ALLOCATIONS.listenToHorizontalScroll();"); + } + + public boolean isFirstPage() { + return paginatorFilter.isFirstPage(); + } + + public boolean isLastPage() { + return paginatorFilter.isLastPage(); } private void insertComponentsInLayout() { @@ -497,6 +653,7 @@ public class AdvancedAllocationController extends GenericForwardComposer { private OnlyOneVisible onlyOneVisible; private Component normalLayout; private Component noDataLayout; + private TimeTrackedTableWithLeftPane timeTrackedTableWithLeftPane; private List getRows() { if (rowsCached != null) { diff --git a/navalplanner-webapp/src/main/webapp/common/css/navalplan_zk.css b/navalplanner-webapp/src/main/webapp/common/css/navalplan_zk.css index da10dff2a..7a3f37486 100644 --- a/navalplanner-webapp/src/main/webapp/common/css/navalplan_zk.css +++ b/navalplanner-webapp/src/main/webapp/common/css/navalplan_zk.css @@ -171,12 +171,16 @@ button.z-button { .z-button-cm:active { background-color: #A1D586; /* green2 (active background)*/ - border-right: 1px solid #439e32; + border-right: 0 solid #439e32; border-bottom: 1px solid #439e32; border-top: 2px solid #3f5917; border-left: 2px solid #3f5917; } +.z-button.z-button-disd .z-button-cm:active { + border: inherit; +} + .z-button.z-button-disd .z-button-cm { background-color: #EAEAEA; color: #A0A0A0; @@ -900,7 +904,7 @@ span.z-dottree-line { } -/* --- START -- menubar -- +/* --- START -- menus and toolbar -- =================================================== */ .z-menubar-hor, .z-menubar-ver { @@ -1050,8 +1054,63 @@ span.z-dottree-line { background-image: url(../img/ico_advanced-allocation.png); } +.perspectives-column { + display:none; +} -/* End perspectives */ +/* ---- Toolbar ------ */ + +.toolbar-box .z-button-cm { + height: 24px; +} + +.toolbar-box .z-label { + color:#0068B1; + padding-left:4px; +} + +.toolbar-box span.z-button { + margin: 0 0 0 0; +} + +.toolbar-box .planner-icon, +.toolbar-box .planner-command { + padding-top: 1px; + padding-right: 1px; +} + +.toolbar-box .z-button-cm { + background-color: transparent; + border-color:transparent; +} + +.toolbar-box .z-button-cm:hover { + background-color: #E6F2F9; + border-color:#006699 #DFF5FE #DFF5FE #006699; +} + +.toolbar-box .z-button.z-button-disd .z-button-cm { + background-color: transparent; + border-color: transparent; +} + +.toolbar-box { + background:transparent url(../img/toolbar-hm.png) repeat-x scroll 0 0; + border-bottom:1px solid #9ECAD8; + font-size:11px; +} + +.toolbar-box table.z-button-disd:active { + margin-top: 1px; + margin-right: 1px; + border-top: 0; + border-left: 0; + padding-left: 2px; +} + + + +/* =================================================== */ .vertical-separator { display:none; @@ -1109,31 +1168,6 @@ tr.z-tree-row-seld, tr.z-list-item-seld, padding: 10px; } -.perspectives-column { - display:none; -} - -.toolbar-box .z-button-cm { - height: 24px; -} - -.toolbar-box .z-label { - color:#0068B1; - padding-left:4px; -} - -.toolbar-box span.z-button { - margin: 0 0 0 0; -} - -.toolbar-box .planner-icon, -.toolbar-box .planner-command { - padding-top: 1px; - padding-right: 1px; -} - - - .z-tab-accordion-hm, .z-tab-accordion-hr, .z-tab-accordion-hl { -moz-background-clip:border; @@ -1189,21 +1223,29 @@ tr.z-tree-row-seld, tr.z-list-item-seld, cursor: help; } - -.toolbar-box .z-button-cm { - background-color: transparent; - border-color:transparent; +.timeTrackedTableWithLeftPane input[value="0"] { + color: #DDDDDD; } -.toolbar-box .z-button-cm:hover { - background-color: #E6F2F9; - border-color:#006699 #DFF5FE #DFF5FE #006699; +/* for horizontal scrolling */ +.timeTrackedTableWithLeftPane .z-grid-body table { + position:relative; } -.toolbar-box { - background:transparent url(/navalplanner-webapp/zkau/web/zkex/zul/img/layout/borderlayout-hm.png) repeat-x scroll 0 0; - border-bottom:1px solid #9ECAD8; - font-size:11px; +/* Test*/ +.timeTrackedTableWithLeftPane div.z-grid-body { +overflow: hidden; } +.advancedallocationlayout #timeTracker .z-vbox { + position:relative; +} + +.z-button-disd { + opacity:0.3; +} + +.advancedallocationlayout #timeTracker { + background-color: #CDE6F5; +} diff --git a/navalplanner-webapp/src/main/webapp/common/img/ico_left.png b/navalplanner-webapp/src/main/webapp/common/img/ico_left.png new file mode 100644 index 0000000000000000000000000000000000000000..533e237ffb21d20ab86f73bdd762d01327696435 GIT binary patch literal 647 zcmV;20(kw2P)G-#z!7^UnJi5uudjK#A)} zfPM4ViN%?%B&8Uj&EIR}p9umwf6$6#$nG%`YyS&#-(He`Jcy>Uvv?jEE_k^u!`}HA zz5Tw3uBIqj&a|Myb?SJ4|4O`n`8INT4$E81=x*)-oLtS*eM-1a8Y6Zfppbay-5@TW zu0cmAhSguINa<-*x_xjkhS!}Fa63IP$>0}dku|b-@P6cQh61dsF^XEX7N0i0$e!x* zf^o3VKR&|e@xkl%BCBVR%%^ZQ&}J|BaqC^AIivN&IvUh~>}B|2@dKD-B5&s9zF`@1 z74*=fc%WN4Tuv7hhk|mY40Y;xXr_ilE+HifAd7>Go?#mH!HzFYAf+V{3A97y(gdhj zRpnI(RfnV%;!=w<7QlkFEyLLxQ_{!qxe)p<4PYa&hIBs7J#-*k-wr2Ju5(>PFpY>nEU#(l&^=DN;~GP!Km2)M{5P zR14}#p^GlWfFB5c7fNu`+Eyh{1gVWlCU55X-e?PIGO08RFI;#t!<>80x%XY-oTHMV zpu*t`NEe8=4e$OZ3FIf4&JssZ9CTo+V+^a7HqxRcU)t7#^}#wc^sdFNS2zBuP94N$ zE*P*%uSQ$b0qkG59kKgyv<|oUTA#OkihZ2R77vM(jbnd{daqV7mom3K_xBhQl4mNifwQ z)>siQC%#S~Y=zOiwH>|;nZuA5GL-^B5i$z`*yXPGv!NP-@i$~y4vZKA!dpW#`~f8! z$jD1VAxuTC*uk4 zd4*Mv$g)NZz8OF=osvyKtUq4-rW73;;qb_zdwBLCfjR*u(S5FblHq~!Ia`Gv9Uku=2(=OaOJW6E;yHtF)Gr0NuIuajWV`yI=jz+s^amyj} y^E}mAiRB=sqP3v~{4}S9fR$zVUu^6j0t^7Cea>5R5;d~`0000VM%xNb!1@J z*w6hZkrkve*(1o8fuTx`fuW&=f#DZWsNn?zL#Y7+!>a@a2CEqi4B`cIb_LonFfcO& z_=LFbdj5a!i~k2-{y+Ts|It_fkH7hU^3DI#@BW{C`~Teg{}(^}zw+__^-uqAe*O. --> - + @@ -26,55 +26,55 @@ advancedAllocationController = arg.get("advancedAllocationController"); ]]> -
-
- ${i18n:_('No Allocations have been done')} -
- - - -