Merge branch 'master' into project-dashboards

This commit is contained in:
Manuel Rego Casasnovas 2011-11-18 12:40:02 +01:00
commit 75ab0d670b
67 changed files with 7879 additions and 576 deletions

View file

@ -33,6 +33,7 @@ Translators
* [es] Manuel Rego Casasnovas <rego@igalia.com>
* [gl] Manuel Rego Casasnovas <rego@igalia.com>
* [pt] Helena Grosso <lenagrosso@gmail.com>
* [ru] Pavel Rudensky <prudensky@gmail.com>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

View file

@ -1,55 +1,84 @@
About
#################
.. _acercade:
.. contents::
Licence
========
Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e
Desenvolvemento Tecnolóxico de Galicia
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Written by
================
- Javier Morán <jmoran@igalia.com>
- Oscar González <ogonzalez@igalia.com>
- Diego Pino <dpino@igalia.com>
- Manuel Rego <mrego@igalia.com>
- José María Casanova <jmcasanova@igalia.com>
- Lorenzo Tilve <ltilve@igalia.com>
- Jacobo Aragunde <jaragunde@igalia.com>
- Susana Montes <smontes@wirelessgalicia.com>
- Xavier Castaño <xcastanho@igalia.com>
- Farruco Sanjurjo <fsanjurjo@igalia.com>
- Fernando Bellas <fbellas@udc.es>
Public funding
================================
Inside the global scope that LibrePlan is designed for regarding planning management, a project was developed to solve some common polanning problems. This project is partially financed by Xunta de Galicia, Ministerio de Industria, Turismo e Comercio, and by the European Union, Fondo Europeo de Desenvolvemento Rexional.
.. figure:: images/logos.png
:scale: 100
This project was part of Plan Avanza:
.. figure:: images/avanza.gif
:scale: 100
About
#################
.. _acercade:
.. contents::
Licence
========
Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e
Desenvolvemento Tecnolóxico de Galicia
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Written by
================
LibrePlan Team
--------------
* Cristina Alavariño Pérez <cristina.alvarino@cafedered.es>
* Jacobo Aragunde Pérez <jaragunde@igalia.com>
* Nacho Barrientos Arias <nacho@igalia.com>
* Xavier Castaño García <xcastanho@igalia.com>
* Ignacio Díaz Teijido <ignacio.diaz@cafedered.es>
* Susana Montes Pedreira <smontes@wirelessgalicia.com>
* Francisco Javier Morán Rúa <jmoran@igalia.com>
* Diego Pino García <dpino@igalia.com>
* Manuel Rego Casasnovas <rego@igalia.com>
* Lorenzo Tilve Álvaro <ltilve@igalia.com>
Previous Team Members
---------------------
* Fernando Bellas Permuy <fbellas@udc.es>
* José María Casanova Crespo <jmcasanova@igalia.com>
* Óscar González Fernández <ogonzalez@igalia.com>
* Pablo Fernández de la Cigoña Nóvoa <pcigonha@igalia.com>
* Farruco Sanjurjo Arcay <fsanjurjo@igalia.com>
Translators
-----------
* [es] Manuel Rego Casasnovas <rego@igalia.com>
* [gl] Manuel Rego Casasnovas <rego@igalia.com>
* [pt] Helena Grosso <lenagrosso@gmail.com>
* [ru] Pavel Rudensky <prudensky@gmail.com>
Contributors
------------
* Eloy Calatayud <ecalatayud@wirelessgalicia.com>
* Sergio Carracedo <cto@opsou.com>
* Pedro Figueras <sales@opsou.com>
* Dmytro Melanchenko <melanchenko@gmail.com>
* Adrián Pérez <aperez@igalia.com>
Public funding
================================
Inside the global scope that LibrePlan is designed for regarding planning management, a project was developed to solve some common polanning problems. This project is partially financed by Xunta de Galicia, Ministerio de Industria, Turismo e Comercio, and by the European Union, Fondo Europeo de Desenvolvemento Rexional.
.. figure:: images/logos.png
:scale: 100
This project was part of Plan Avanza:
.. figure:: images/avanza.gif
:scale: 100

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

View file

@ -1,55 +1,85 @@
Acerca de
#################
.. _acercade:
.. contents::
Licencia
================
Este programa es software libre; puede redistribuirlo o modificarlo bajo los
términos de la Licencia Pública Generala Affero GNU tal como se publica por la
Free Software Foundation; ya sea la versión 3 de la Licencia, o (a su elección)
cualquier versión posterior.
Este programa se distribuye con la esperanza de que le sea útil, pero SIN
NINGUNA GARANTÍA; sin incluso la garantía implícita de MERCANTILIDAD o IDONEIDAD
PARA UN PROPÓSITO PARTICULAR. Vea la Licencia Pública General Affero GNU para
más detalles.
Debería haber recibido una copia de la Licencia Pública General Affero GNU junto
con este programa. Si no es así, visite <http://www.gnu.org/licenses/>.
Escrito por
================
- Javier Morán <jmoran@igalia.com>
- Oscar González <ogonzalez@igalia.com>
- Diego Pino <dpino@igalia.com>
- Manuel Rego <mrego@igalia.com>
- José María Casanova <jmcasanova@igalia.com>
- Lorenzo Tilve <ltilve@igalia.com>
- Jacobo Aragunde <jaragunde@igalia.com>
- Susana Montes <smontes@wirelessgalicia.com>
- Xavier Castaño <xcastanho@igalia.com>
- Farruco Sanjurjo <fsanjurjo@igalia.com>
- Fernando Bellas <fbellas@udc.es>
Financiación pública
========================
Dentro del marco global de LibrePlan y la gestión de la planificación, se desarrolló un proyecto que pretende resolver
una serie de problemas comunes de planificación.
Este proyecto fue cofinanciado por la Xunta de Galicia, el Ministerio de Industria, Turismo y Comercio, y la
Unión Europea, Fondo Europeo de Desarrollo Regional.
.. figure:: images/logos.png
:scale: 100
El proyecto formo parte del Plan Avanza:
.. figure:: images/avanza.gif
:scale: 100
Acerca de
#################
.. _acercade:
.. contents::
Licencia
================
Este programa es software libre; puede redistribuirlo o modificarlo bajo los
términos de la Licencia Pública Generala Affero GNU tal como se publica por la
Free Software Foundation; ya sea la versión 3 de la Licencia, o (a su elección)
cualquier versión posterior.
Este programa se distribuye con la esperanza de que le sea útil, pero SIN
NINGUNA GARANTÍA; sin incluso la garantía implícita de MERCANTILIDAD o IDONEIDAD
PARA UN PROPÓSITO PARTICULAR. Vea la Licencia Pública General Affero GNU para
más detalles.
Debería haber recibido una copia de la Licencia Pública General Affero GNU junto
con este programa. Si no es así, visite <http://www.gnu.org/licenses/>.
Escrito por
================
Equipo de LibrePlan
-------------------
* Cristina Alavariño Pérez <cristina.alvarino@cafedered.es>
* Jacobo Aragunde Pérez <jaragunde@igalia.com>
* Nacho Barrientos Arias <nacho@igalia.com>
* Xavier Castaño García <xcastanho@igalia.com>
* Ignacio Díaz Teijido <ignacio.diaz@cafedered.es>
* Susana Montes Pedreira <smontes@wirelessgalicia.com>
* Francisco Javier Morán Rúa <jmoran@igalia.com>
* Diego Pino García <dpino@igalia.com>
* Manuel Rego Casasnovas <rego@igalia.com>
* Lorenzo Tilve Álvaro <ltilve@igalia.com>
Anteriores miembros del equipo
------------------------------
* Fernando Bellas Permuy <fbellas@udc.es>
* José María Casanova Crespo <jmcasanova@igalia.com>
* Óscar González Fernández <ogonzalez@igalia.com>
* Pablo Fernández de la Cigoña Nóvoa <pcigonha@igalia.com>
* Farruco Sanjurjo Arcay <fsanjurjo@igalia.com>
Traductores
-----------
* [es] Manuel Rego Casasnovas <rego@igalia.com>
* [gl] Manuel Rego Casasnovas <rego@igalia.com>
* [pt] Helena Grosso <lenagrosso@gmail.com>
* [ru] Pavel Rudensky <prudensky@gmail.com>
Contribuidores
--------------
* Eloy Calatayud <ecalatayud@wirelessgalicia.com>
* Sergio Carracedo <cto@opsou.com>
* Pedro Figueras <sales@opsou.com>
* Dmytro Melanchenko <melanchenko@gmail.com>
* Adrián Pérez <aperez@igalia.com>
Financiación pública
========================
Dentro del marco global de LibrePlan y la gestión de la planificación, se desarrolló un proyecto que pretende resolver
una serie de problemas comunes de planificación.
Este proyecto fue cofinanciado por la Xunta de Galicia, el Ministerio de Industria, Turismo y Comercio, y la
Unión Europea, Fondo Europeo de Desarrollo Regional.
.. figure:: images/logos.png
:scale: 100
El proyecto formo parte del Plan Avanza:
.. figure:: images/avanza.gif
:scale: 100

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

View file

@ -1,52 +1,82 @@
Acerca de
#################
.. _acercade:
.. contents::
Licenza
================
Este programa é software libre; pode redistribuílo ou modificalo baixo as
condicións da Licenza Pública Xeral Affero GNU tal como a publica a Free
Software Foundation; tanto na versión 3 da Licenza como (segundo o seu
criterio) en calquera versión posterior.
Este programa distribúese esperando que sexa útil, mais SEN NINGUNHA GARANTÍA;
mesmo sen a garantía implícita de VALOR COMERCIAL ou IDONEIDADE PARA UN
PROPÓSITO PARTICULAR. Para máis detalles vexa a Licenza Pública Xeral Affero
GNU.
Debeu recibir unha copia da Licenza Pública Xeral Affero GNU xunto con este
programa. En caso contrario, visite <http://www.gnu.org/licenses/>.
Escrito por
================
- Javier Morán <jmoran@igalia.com>
- Oscar González <ogonzalez@igalia.com>
- Diego Pino <dpino@igalia.com>
- Manuel Rego <mrego@igalia.com>
- José María Casanova <jmcasanova@igalia.com>
- Lorenzo Tilve <ltilve@igalia.com>
- Jacobo Aragunde <jaragunde@igalia.com>
- Susana Montes <smontes@wirelessgalicia.com>
- Xavier Castaño <xcastanho@igalia.com>
- Farruco Sanjurjo <fsanjurjo@igalia.com>
- Fernando Bellas <fbellas@udc.es>
Financiación pública
========================
Dentro do marco global de LibrePlan e a xestión da planificación, desenvolveuse un proxecto que pretende resolver unha serie de problemas comúns de planificación. Este proxecto foi cofinanciado pola Xunta de Galicia, o Ministerio de Industria, Turismo e Comercio, e pola Unión Europea, Fondo Europeo de Desenvolvemento Rexional.
.. figure:: images/logos.png
:scale: 100
Así mesmo o proxecto formou parte do Plan Avanza:
.. figure:: images/avanza.gif
:scale: 100
Acerca de
#################
.. _acercade:
.. contents::
Licenza
================
Este programa é software libre; pode redistribuílo ou modificalo baixo as
condicións da Licenza Pública Xeral Affero GNU tal como a publica a Free
Software Foundation; tanto na versión 3 da Licenza como (segundo o seu
criterio) en calquera versión posterior.
Este programa distribúese esperando que sexa útil, mais SEN NINGUNHA GARANTÍA;
mesmo sen a garantía implícita de VALOR COMERCIAL ou IDONEIDADE PARA UN
PROPÓSITO PARTICULAR. Para máis detalles vexa a Licenza Pública Xeral Affero
GNU.
Debeu recibir unha copia da Licenza Pública Xeral Affero GNU xunto con este
programa. En caso contrario, visite <http://www.gnu.org/licenses/>.
Escrito por
================
Equipo de LibrePlan
-------------------
* Cristina Alavariño Pérez <cristina.alvarino@cafedered.es>
* Jacobo Aragunde Pérez <jaragunde@igalia.com>
* Nacho Barrientos Arias <nacho@igalia.com>
* Xavier Castaño García <xcastanho@igalia.com>
* Ignacio Díaz Teijido <ignacio.diaz@cafedered.es>
* Susana Montes Pedreira <smontes@wirelessgalicia.com>
* Francisco Javier Morán Rúa <jmoran@igalia.com>
* Diego Pino García <dpino@igalia.com>
* Manuel Rego Casasnovas <rego@igalia.com>
* Lorenzo Tilve Álvaro <ltilve@igalia.com>
Anteriores membros do equipo
----------------------------
* Fernando Bellas Permuy <fbellas@udc.es>
* José María Casanova Crespo <jmcasanova@igalia.com>
* Óscar González Fernández <ogonzalez@igalia.com>
* Pablo Fernández de la Cigoña Nóvoa <pcigonha@igalia.com>
* Farruco Sanjurjo Arcay <fsanjurjo@igalia.com>
Traductores
-----------
* [es] Manuel Rego Casasnovas <rego@igalia.com>
* [gl] Manuel Rego Casasnovas <rego@igalia.com>
* [pt] Helena Grosso <lenagrosso@gmail.com>
* [ru] Pavel Rudensky <prudensky@gmail.com>
Contribuidores
--------------
* Eloy Calatayud <ecalatayud@wirelessgalicia.com>
* Sergio Carracedo <cto@opsou.com>
* Pedro Figueras <sales@opsou.com>
* Dmytro Melanchenko <melanchenko@gmail.com>
* Adrián Pérez <aperez@igalia.com>
Financiación pública
========================
Dentro do marco global de LibrePlan e a xestión da planificación, desenvolveuse un proxecto que pretende resolver unha serie de problemas comúns de planificación. Este proxecto foi cofinanciado pola Xunta de Galicia, o Ministerio de Industria, Turismo e Comercio, e pola Unión Europea, Fondo Europeo de Desenvolvemento Rexional.
.. figure:: images/logos.png
:scale: 100
Así mesmo o proxecto formou parte do Plan Avanza:
.. figure:: images/avanza.gif
:scale: 100

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

View file

@ -26,6 +26,7 @@ import java.util.List;
import org.joda.time.LocalDate;
import org.zkoss.ganttz.adapters.IDisabilityConfiguration;
import org.zkoss.ganttz.data.GanttDiagramGraph;
import org.zkoss.ganttz.data.Task;
import org.zkoss.ganttz.timetracker.TimeTracker;
import org.zkoss.ganttz.timetracker.TimeTrackerComponent;
import org.zkoss.ganttz.timetracker.zoom.IZoomLevelChangedListener;
@ -136,6 +137,13 @@ public class GanttPanel extends XulElement implements AfterCompose {
registerZoomLevelChangedListener();
}
public void updateTooltips() {
for (Task task : this.tasksLists.getAllTasks()) {
task.updateTooltipText();
}
invalidate();
}
public TimeTrackerComponent getTimeTrackerComponent() {
return timeTrackerComponent;
}

View file

@ -45,6 +45,8 @@ public class LeftPane extends HtmlMacroComponent {
private FilterAndParentExpandedPredicates predicate;
private Planner planner;
public void setGoingDownInLastArrowCommand(
CommandContextualized<?> goingDownInLastArrowCommand) {
this.leftTasksTree
@ -52,18 +54,19 @@ public class LeftPane extends HtmlMacroComponent {
}
public LeftPane(IDisabilityConfiguration disabilityConfiguration,
List<Task> topLevelTasks,
Planner planner,
FilterAndParentExpandedPredicates predicate) {
this.topLevelTasks = topLevelTasks;
this.topLevelTasks = planner.getDiagramGraph().getTopLevelTasks();
this.disabilityConfiguration = disabilityConfiguration;
this.predicate = predicate;
this.planner = planner;
}
@Override
public void afterCompose() {
super.afterCompose();
leftTasksTree = new LeftTasksTree(disabilityConfiguration,
topLevelTasks, predicate);
leftTasksTree = new LeftTasksTree(disabilityConfiguration, planner,
predicate);
getContainer().appendChild(leftTasksTree);
leftTasksTree.afterCompose();
}

View file

@ -54,6 +54,13 @@ import org.zkoss.zul.Treecell;
import org.zkoss.zul.Treeitem;
import org.zkoss.zul.TreeitemRenderer;
/**
* Tree element to display tasks structure in the planning Gantt <br />
*
* @author Óscar González Fernández <ogonzalez@igalia.com>
* @author Manuel Rego Casasnovas <mrego@igalia.com>
* @author Lorenzo Tilve Álvaro <ltilve@igalia.com>
*/
public class LeftTasksTree extends HtmlMacroComponent {
private final class TaskBeanRenderer implements TreeitemRenderer {
@ -75,12 +82,9 @@ public class LeftTasksTree extends HtmlMacroComponent {
container.addExpandListener(expandListener);
}
final int[] path = tasksTreeModel.getPath(tasksTreeModel.getRoot(),
task);
String cssClass = "depth_" + path.length;
LeftTasksTreeRow leftTasksTreeRow = LeftTasksTreeRow.create(
disabilityConfiguration, task,
new TreeNavigator(tasksTreeModel, task));
disabilityConfiguration, task, new TreeNavigator(
tasksTreeModel, task), planner);
if (task.isContainer()) {
expandWhenOpened((TaskContainer) task, item);
}
@ -96,9 +100,6 @@ public class LeftTasksTree extends HtmlMacroComponent {
List<Object> rowChildren = row.getChildren();
List<Treecell> treeCells = ComponentsFinder.findComponentsOfType(
Treecell.class, rowChildren);
for (Treecell cell : treeCells) {
cell.setSclass(cssClass);
}
detailsForBeans.put(task, leftTasksTreeRow);
deferredFiller.isBeingRendered(task, item);
}
@ -330,12 +331,15 @@ public class LeftTasksTree extends HtmlMacroComponent {
private final List<Task> visibleTasks = new ArrayList<Task>();
private Planner planner;
public LeftTasksTree(IDisabilityConfiguration disabilityConfiguration,
List<Task> tasks,
Planner planner,
FilterAndParentExpandedPredicates predicate) {
this.disabilityConfiguration = disabilityConfiguration;
this.tasks = tasks;
this.tasks = planner.getTaskList().getAllTasks();
this.predicate = predicate;
this.planner = planner;
}
private void fillModel(Collection<? extends Task> tasks, boolean firstTime) {

View file

@ -24,10 +24,13 @@ package org.zkoss.ganttz;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.joda.time.LocalDate;
@ -47,6 +50,13 @@ import org.zkoss.zul.Treecell;
import org.zkoss.zul.api.Label;
import org.zkoss.zul.api.Treerow;
/**
* Row composer for Tasks details Tree <br />
*
* @author Óscar González Fernández <ogonzalez@igalia.com>
* @author Manuel Rego Casasnovas <mrego@igalia.com>
* @author Lorenzo Tilve Álvaro <ltilve@igalia.com>
*/
public class LeftTasksTreeRow extends GenericForwardComposer {
public interface ILeftTasksTreeNavigator {
@ -71,31 +81,32 @@ public class LeftTasksTreeRow extends GenericForwardComposer {
private Textbox endDateTextBox;
private Datebox startDateBox;
private Datebox endDateBox;
private Datebox openedDateBox = null;
private DateFormat dateFormat;
private Planner planner;
private final ILeftTasksTreeNavigator leftTasksTreeNavigator;
private final IDisabilityConfiguration disabilityConfiguration;
public static LeftTasksTreeRow create(
IDisabilityConfiguration disabilityConfiguration, Task bean,
ILeftTasksTreeNavigator taskDetailnavigator) {
ILeftTasksTreeNavigator taskDetailnavigator, Planner planner) {
return new LeftTasksTreeRow(disabilityConfiguration, bean,
taskDetailnavigator);
taskDetailnavigator, planner);
}
private LeftTasksTreeRow(IDisabilityConfiguration disabilityConfiguration,
Task task,
ILeftTasksTreeNavigator leftTasksTreeNavigator) {
Task task, ILeftTasksTreeNavigator leftTasksTreeNavigator,
Planner planner) {
this.disabilityConfiguration = disabilityConfiguration;
this.task = task;
this.dateFormat = DateFormat.getDateInstance(DateFormat.SHORT, Locales
.getCurrent());
this.leftTasksTreeNavigator = leftTasksTreeNavigator;
this.planner = planner;
}
public Task getTask() {
@ -110,19 +121,6 @@ public class LeftTasksTreeRow extends GenericForwardComposer {
this.nameBox = nameBox;
}
public Datebox getStartDateBox() {
return startDateBox;
}
public void setStartDateBox(Datebox startDateBox) {
this.startDateBox = startDateBox;
this.startDateBox.setCompact(true);
this.startDateBox.setFormat("dd/MM/yyyy");
}
public Datebox getEndDateBox() {
return endDateBox;
}
public Task getData() {
return task;
@ -137,21 +135,35 @@ public class LeftTasksTreeRow extends GenericForwardComposer {
public void userWantsDateBox(Component component) {
if (component == startDateTextBox) {
if (canChangeStartDate()) {
showDateBox(startDateBox, startDateTextBox);
createDateBox(startDateTextBox);
}
}
if (component == endDateTextBox) {
if (canChangeEndDate()) {
showDateBox(endDateBox, endDateTextBox);
createDateBox(endDateTextBox);
}
}
}
private void showDateBox(Datebox dateBox, Textbox associatedTextBox) {
associatedTextBox.setVisible(false);
dateBox.setVisible(true);
dateBox.setFocus(true);
dateBox.setOpen(true);
public void createDateBox(Textbox textbox) {
openedDateBox = new Datebox();
openedDateBox.setFormat("short");
openedDateBox.setButtonVisible(false);
try {
openedDateBox.setValue(dateFormat.parse(textbox.getValue()));
} catch (ParseException e) {
return;
}
registerOnEnterOpenDateBox(openedDateBox);
registerBlurListener(openedDateBox);
registerOnChangeDatebox(openedDateBox, textbox);
textbox.setVisible(false);
textbox.getParent().appendChild(openedDateBox);
openedDateBox.setFocus(true);
openedDateBox.setOpen(true);
}
private enum Navigation {
@ -204,20 +216,6 @@ public class LeftTasksTreeRow extends GenericForwardComposer {
case DOWN:
focusGoDown(position);
break;
case LEFT:
if (position == 0) {
focusGoUp(getTextBoxes().size() - 1);
} else {
textBoxes.get(position - 1).focus();
}
break;
case RIGHT:
if (position < textBoxes.size() - 1) {
textBoxes.get(position + 1).focus();
} else {
focusGoDown(0);
}
break;
default:
throw new RuntimeException("case not covered: " + navigation);
}
@ -233,25 +231,15 @@ public class LeftTasksTreeRow extends GenericForwardComposer {
* the component that has lost focus
*/
public void dateBoxHasLostFocus(Datebox dateBox) {
if (dateBox == startDateBox) {
hideDateBox(startDateBox, startDateTextBox);
}
if (dateBox == endDateBox) {
hideDateBox(endDateBox, endDateTextBox);
}
}
private void hideDateBox(Datebox dateBoxToDissapear,
Textbox associatedTextBox) {
dateBoxToDissapear.setVisible(false);
associatedTextBox.setVisible(true);
dateBox.getPreviousSibling().setVisible(true);
dateBox.setParent(null);
}
@Override
public void doAfterCompose(Component component) throws Exception {
super.doAfterCompose(component);
findComponents((Treerow) component);
registerListeners();
registerTextboxesListeners();
updateComponents();
task
.addFundamentalPropertiesChangeListener(new PropertyChangeListener() {
@ -263,27 +251,22 @@ public class LeftTasksTreeRow extends GenericForwardComposer {
});
}
private void registerListeners() {
private void registerTextboxesListeners() {
if (disabilityConfiguration.isTreeEditable()) {
registerKeyboardListener(nameBox);
registerOnChange(nameBox);
registerKeyboardListener(startDateTextBox);
registerKeyboardListener(endDateTextBox);
registerOnEnterListener(startDateTextBox);
registerOnEnterListener(endDateTextBox);
registerOnEnterOpenDateBox(startDateBox);
registerOnEnterOpenDateBox(endDateBox);
registerBlurListener(startDateBox);
registerBlurListener(endDateBox);
registerOnChange(nameBox);
registerOnChange(startDateBox);
registerOnChange(endDateBox);
registerOnChange(startDateTextBox);
registerOnChange(endDateTextBox);
}
}
public void registerDateboxListeners(Datebox datebox) {
}
private void findComponents(Treerow row) {
List<Object> rowChildren = row.getChildren();
List<Treecell> treeCells = ComponentsFinder.findComponentsOfType(Treecell.class,
@ -294,14 +277,10 @@ public class LeftTasksTreeRow extends GenericForwardComposer {
findComponentsForEndDateCell(treeCells.get(2));
}
private static Datebox findDateBoxOfCell(Treecell treecell) {
List<Object> children = treecell.getChildren();
return ComponentsFinder.findComponentsOfType(Datebox.class, children).get(0);
}
private static Textbox findTextBoxOfCell(Treecell treecell) {
List<Object> children = treecell.getChildren();
return ComponentsFinder.findComponentsOfType(Textbox.class, children).get(0);
return ComponentsFinder.findComponentsOfType(Textbox.class, children)
.get(0);
}
private void findComponentsForNameCell(Treecell treecell) {
@ -332,6 +311,18 @@ public class LeftTasksTreeRow extends GenericForwardComposer {
});
}
private void registerOnChangeDatebox(final Datebox datebox,
final Textbox textbox) {
datebox.addEventListener("onChange", new EventListener() {
@Override
public void onEvent(Event event) {
textbox.setValue(dateFormat.format(datebox.getValue()));
updateBean(textbox);
}
});
}
private void registerOnEnterListener(final Textbox textBox) {
textBox.addEventListener("onOK", new EventListener() {
@ -355,7 +346,6 @@ public class LeftTasksTreeRow extends GenericForwardComposer {
private void findComponentsForStartDateCell(Treecell treecell) {
if (disabilityConfiguration.isTreeEditable()) {
startDateTextBox = findTextBoxOfCell(treecell);
startDateBox = findDateBoxOfCell(treecell);
} else {
startDateLabel = (Label) treecell.getChildren().get(0);
}
@ -363,8 +353,6 @@ public class LeftTasksTreeRow extends GenericForwardComposer {
private void findComponentsForEndDateCell(Treecell treecell) {
if (disabilityConfiguration.isTreeEditable()) {
endDateBox = findDateBoxOfCell(treecell);
endDateBox.setDisabled(true);
endDateTextBox = findTextBoxOfCell(treecell);
} else {
endDateLabel = (Label) treecell.getChildren().get(0);
@ -384,13 +372,28 @@ public class LeftTasksTreeRow extends GenericForwardComposer {
public void updateBean(Component updatedComponent) {
if (updatedComponent == getNameBox()) {
task.setName(getNameBox().getValue());
} else if (updatedComponent == getStartDateBox()) {
Date begin = getStartDateBox().getValue();
task.moveTo(GanttDate.createFrom(begin));
} else if (updatedComponent == getEndDateBox()) {
Date newEnd = getEndDateBox().getValue();
task.resizeTo(LocalDate.fromDateFields(newEnd));
if (StringUtils.isEmpty(getNameBox().getValue())) {
getNameBox().setValue(task.getName());
}
} else if (updatedComponent == getStartDateTextBox()) {
try {
Date begin = dateFormat.parse(getStartDateTextBox().getValue());
task.moveTo(GanttDate.createFrom(begin));
} catch (ParseException e) {
getStartDateTextBox().setValue(
dateFormat.format(task.getBeginDate()
.toDayRoundedDate()));
}
} else if (updatedComponent == getEndDateTextBox()) {
try {
Date newEnd = dateFormat.parse(getEndDateTextBox().getValue());
task.resizeTo(LocalDate.fromDateFields(newEnd));
} catch (ParseException e) {
getEndDateTextBox().setValue(
asString(task.getEndDate().toDayRoundedDate()));
}
}
planner.updateTooltips();
}
private void updateComponents() {
@ -399,13 +402,7 @@ public class LeftTasksTreeRow extends GenericForwardComposer {
getNameBox().setDisabled(!canRenameTask());
getNameBox().setTooltiptext(task.getName());
getStartDateBox().setValue(
task.getBeginDate().toDayRoundedDate());
getStartDateBox().setDisabled(!canChangeStartDate());
getStartDateTextBox().setDisabled(!canChangeStartDate());
getEndDateBox().setValue(task.getEndDate().toDayRoundedDate());
getEndDateBox().setDisabled(!canChangeEndDate());
getEndDateTextBox().setDisabled(!canChangeEndDate());
getStartDateTextBox().setValue(

View file

@ -71,7 +71,6 @@ import org.zkoss.zul.Button;
import org.zkoss.zul.ListModel;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Listitem;
import org.zkoss.zul.Separator;
import org.zkoss.zul.SimpleListModel;
import org.zkoss.zul.South;
@ -468,8 +467,7 @@ public class Planner extends HtmlMacroComponent {
return true;
}
};
this.leftPane = new LeftPane(disabilityConfiguration, this.diagramGraph
.getTopLevelTasks(), predicate);
this.leftPane = new LeftPane(disabilityConfiguration, this, predicate);
this.ganttPanel = new GanttPanel(this,
commandsOnTasksContextualized, doubleClickCommand,
disabilityConfiguration, predicate);
@ -478,6 +476,14 @@ public class Planner extends HtmlMacroComponent {
button.setDisabled(!context.isPrintEnabled());
}
public GanttZKDiagramGraph getDiagramGraph() {
return this.diagramGraph;
}
public void updateTooltips() {
this.ganttPanel.updateTooltips();
}
@SuppressWarnings("unchecked")
private void insertGlobalCommands() {
Component commontoolbar = getCommonCommandsInsertionPoint();
@ -867,7 +873,12 @@ public class Planner extends HtmlMacroComponent {
}
public void updateCompletion(String progressType) {
getTaskList().updateCompletion(progressType);
TaskList taskList = getTaskList();
if (taskList != null) {
taskList.updateCompletion(progressType);
// FIXME Bug #1270
taskList.invalidate();
}
}
}

View file

@ -306,6 +306,9 @@ public class TaskComponent extends Div implements AfterCompose {
private transient PropertyChangeListener propertiesListener;
private IConstraintViolationListener<GanttDate> taskViolationListener;
// FIXME Bug #1270
private String progressType;
public TaskRow getRow() {
if (getParent() == null) {
throw new IllegalStateException(
@ -529,11 +532,13 @@ public class TaskComponent extends Div implements AfterCompose {
}
public void updateTooltipText() {
smartUpdate("taskTooltipText", task.updateTooltipText());
// FIXME Bug #1270
this.progressType = null;
}
public void updateTooltipText(String progressType) {
smartUpdate("taskTooltipText", task.updateTooltipText(progressType));
// FIXME Bug #1270
this.progressType = progressType;
}
private DependencyList getDependencyList() {
@ -567,7 +572,12 @@ public class TaskComponent extends Div implements AfterCompose {
}
public String getTooltipText() {
return task.getTooltipText();
// FIXME Bug #1270
if (progressType == null) {
return task.getTooltipText();
} else {
return task.updateTooltipText(progressType);
}
}
public String getLabelsText() {

View file

@ -0,0 +1,246 @@
# Portuguese translations for LibrePlan - GanttZK module
# Copyright (C) 2011 Helena Grosso <lenagrosso@gmail.com>
# This file is distributed under the same license as the NavalPlan package.
# Helena Grosso <lenagrosso@gmail.com>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: 1.1.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-08-09 16:17+0200\n"
"PO-Revision-Date: 2011-11-14 10:53+0100\n"
"Last-Translator: Helena Grosso <lenagrosso@gmail.com>\n"
"Language-Team: Português <>\n"
"Language: pt\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:215
#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:234
msgid "Erase"
msgstr "Apagar"
#: ganttzk/src/main/java/org/zkoss/ganttz/TaskList.java:319
msgid "Add Dependency"
msgstr "Adicionar Dependência"
#: ganttzk/src/main/java/org/zkoss/ganttz/data/resourceload/TimeLineRole.java:58
msgid "Worker"
msgstr "Trabalhador"
#: ganttzk/src/main/resources/web/ganttz/zul/leftTasksTree.zul:29
msgid "Start"
msgstr "Início"
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:592
msgid "Show reported hours"
msgstr "Mostrar horas registadas"
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:92
msgid "by criteria"
msgstr "por critérios"
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:72
msgid "Show/Hide reported hours"
msgstr "Mostrar/Ocultar horas registadas"
#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:35
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:46
msgid "Zoom"
msgstr "Zoom"
#: ganttzk/src/main/java/org/zkoss/ganttz/TabsRegistry.java:121
msgid "Limiting resources"
msgstr "Recursos restringentes"
#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:68
msgid "The specified dependency is not allowed"
msgstr "A dependência especificada não está permitida"
#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:254
msgid "Set End-End"
msgstr "Definir Fim-Fim"
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:80
msgid "Show/Hide progress"
msgstr "Mostrar/Ocultar progresso"
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadComponent.java:188
msgid "available effort: {0}, assigned effort: {1}"
msgstr "esforço disponível: {0}, esforço atribuído: {1}"
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:91
msgid "by resources"
msgstr "por recursos"
#: ganttzk/src/main/java/org/zkoss/ganttz/data/resourceload/TimeLineRole.java:58
msgid "Task"
msgstr "Tarefa"
#: ganttzk/src/main/java/org/zkoss/ganttz/data/resourceload/TimeLineRole.java:64
msgid "Criterion"
msgstr "Critério"
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:41
msgid "Print"
msgstr "Imprimir"
#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:71
msgid "Week"
msgstr "Semana"
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:489
msgid "filtering by name"
msgstr "a filtrar por nome"
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadLeftPane.java:111
msgid "See scheduling"
msgstr "Ver planificação"
#: ganttzk/src/main/resources/web/ganttz/zul/leftTasksTree.zul:30
msgid "End"
msgstr "Fim"
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:37
msgid "Choosing Template"
msgstr "Seleção de modelo"
#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/TimeTracker.java:243
msgid "changing zoom"
msgstr "a alterar o zoom"
#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:45
msgid "Quarter"
msgstr "Trimestre"
#: ganttzk/src/main/java/org/zkoss/ganttz/data/resourceload/TimeLineRole.java:58
msgid "None"
msgstr "Nenhum"
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:69
msgid "Flatten/Unflatten tree"
msgstr "Nivelar/Expandir árvore"
#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:43
msgid "Filter"
msgstr "Filtro"
#: ganttzk/src/main/java/org/zkoss/ganttz/data/resourceload/TimeLineRole.java:58
msgid "Project"
msgstr "Projeto"
#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:68
#: ganttzk/src/main/resources/web/ganttz/zul/leftTasksTree.zul:28
msgid "Name"
msgstr "Nome"
#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:50
msgid "Name filter"
msgstr "Filtro de nomes"
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:572
msgid "Show progress"
msgstr "Mostrar progresso"
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:66
msgid "Expand/Collapse all"
msgstr "Expandir/Colapsar tudo"
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:56
msgid "Show/Hide critical path"
msgstr "Mostrar/Ocultar caminho crítico"
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:36
msgid "Create Project"
msgstr "Criar projeto"
#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:32
msgid "Year"
msgstr "Ano"
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:145
msgid "showing criteria"
msgstr "a mostrar critérios"
#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:58
msgid "Month"
msgstr "Mês"
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:63
msgid "Show/Hide resources"
msgstr "Mostrar/Ocultar recursos"
#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:246
msgid "Set End-Start"
msgstr "Definir Fim-Início"
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:302
msgid "decreasing zoom"
msgstr "a reduzir o zoom"
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:559
msgid "Hide critical path"
msgstr "Ocultar caminho crítico"
#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:84
msgid "Day"
msgstr "Dia"
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:599
msgid "Hide reported hours"
msgstr "Ocultar horas registadas"
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadComponent.java:182
msgid "Load: {0}%"
msgstr "Carregamento: {0}%"
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:142
msgid "showing resources"
msgstr "a mostrar recursos"
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:60
msgid "Show/Hide labels"
msgstr "Mostrar/Ocultar etiquetas"
#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:97
msgid "Hour"
msgstr "Hora"
#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:91
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:116
msgid "Graphics"
msgstr "Gráficos"
#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:250
msgid "Set Start-Start"
msgstr "Definir Início-Início"
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadComponent.java:141
msgid "See resource allocation"
msgstr "Ver atribuição de recursoss"
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:285
msgid "increasing zoom"
msgstr "a aumentar o zoom"
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:455
msgid "Show all elements"
msgstr "Mostrar todos os elementos"
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:454
msgid "All"
msgstr "Todos"
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:39
msgid "Refresh"
msgstr "Atualizar"
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:554
msgid "Show critical path"
msgstr "Mostrar caminho crítico"
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:577
msgid "Hide progress"
msgstr "Ocultar progresso"

View file

@ -24,14 +24,12 @@
]]>
</zscript>
<treecell>
<textbox ctrlKeys="#down#up#right#left" class="task_title"/>
<textbox ctrlKeys="#down#up" hflex="1" sclass="task-name" />
</treecell>
<treecell>
<textbox value="" ctrlKeys="#down#up#right#left" />
<datebox compact="true" visible="${false}"/>
<textbox value="" ctrlKeys="#down#up" />
</treecell>
<treecell>
<textbox ctrlKeys="#down#up#right#left" />
<datebox compact="true" visible ="${false}"/>
<textbox value="" ctrlKeys="#down#up" />
</treecell>
</treerow>

View file

@ -191,7 +191,7 @@ ganttz.TaskComponent = zk.$extends(zul.Widget, {
this.mouseOverTask = true;
this._tooltipTimeout = setTimeout(jq.proxy(function(offset) {
var element = jq("#tasktooltip" + this.uuid);
if (element!=null) {
if (element.length > 0) {
element.show();
offset = ganttz.GanttPanel.getInstance().getXMouse()
- element.parent().offset().left

View file

@ -71,6 +71,10 @@ public class LDAPConfiguration extends BaseEntity {
// LDAP roles will be used or not
private Boolean ldapSaveRolesDB = false;
// LDAP strategy if true means group strategy if false means property
// strategy
private Boolean ldapGroupStrategy = true;
/**
* A list which stores the matching between LDAP roles and LibrePlan roles.
* {@link ConfigurationRolesLDAP} is a component.
@ -244,4 +248,12 @@ public class LDAPConfiguration extends BaseEntity {
public void setLdapSearchQuery(String ldapSearchQuery) {
this.ldapSearchQuery = ldapSearchQuery;
}
public Boolean getLdapGroupStrategy() {
return ldapGroupStrategy;
}
public void setLdapGroupStrategy(Boolean ldapGroupStrategy) {
this.ldapGroupStrategy = ldapGroupStrategy;
}
}

View file

@ -292,4 +292,9 @@ public class MaterialCategory extends IntegrationEntity {
return lastMaterialSequenceCode;
}
@Override
public String toString() {
return super.toString() + " :: " + getName();
}
}

View file

@ -210,7 +210,6 @@ public class TaskSource extends BaseEntity {
task.initializeDatesIfNeeded();
}
if (!hasSomeAllocationDone(task)) {
task.setEndDate(null);
task.initializeDatesIfNeeded();
}
task.updateDeadlineFromOrderElement();

View file

@ -135,6 +135,7 @@ public abstract class TaskElement extends BaseEntity {
taskElement.taskSource = taskSource;
taskElement.updateDeadlineFromOrderElement();
taskElement.setName(taskElement.getOrderElement().getName());
taskElement.updateAdvancePercentageFromOrderElement();
Order order = taskElement.getOrderElement().getOrder();
if (order.isScheduleBackwards()) {
taskElement.setEndDate(order.getDeadline());
@ -640,7 +641,8 @@ public abstract class TaskElement extends BaseEntity {
* depending on parameter
*/
public BigDecimal getAdvancePercentage(ProgressType progressType) {
if (progressType.equals(ProgressType.SPREAD_PROGRESS)) {
if (progressType != null
&& progressType.equals(ProgressType.SPREAD_PROGRESS)) {
return advancePercentage;
}
return BigDecimal.ZERO;
@ -723,4 +725,8 @@ public abstract class TaskElement extends BaseEntity {
public abstract void resetStatus();
public void updateAdvancePercentageFromOrderElement() {
setAdvancePercentage(getOrderElement().getAdvancePercentage());
}
}

View file

@ -35,7 +35,8 @@ public enum Language {
GALICIAN_LANGUAGE(_("Galician"), new Locale("gl")),
SPANISH_LANGUAGE(_("Spanish"), new Locale("es")),
ENGLISH_LANGUAGE(_("English"), Locale.ENGLISH),
RUSSIAN_LANGUAGE(_("Russian"), new Locale("ru"));
RUSSIAN_LANGUAGE(_("Russian"), new Locale("ru")),
PORTUGUESE_LANGUAGE(_("Portuguese"), new Locale("pt"));
private final String displayName;

View file

@ -286,4 +286,10 @@ public class User extends BaseEntity implements IHumanIdentifiable{
return loginName;
}
public String getAuthenticationType() {
if (isLibrePlanUser())
return "Database";
return "LDAP";
}
}

View file

@ -323,4 +323,18 @@
newColumnName="libreplan_user" columnDataType="BOOLEAN" />
</changeSet>
<changeSet id="add-new-column-ldap-role-strategy" author="idiazt">
<comment>Add new column to store ldap role strategy</comment>
<addColumn tableName="configuration">
<column name="ldap_group_strategy" type="BOOLEAN" />
</addColumn>
<addDefaultValue tableName="configuration"
columnName="ldap_group_strategy"
defaultValueBoolean="TRUE" />
<addNotNullConstraint tableName="configuration"
columnName="ldap_group_strategy"
defaultNullValue="TRUE"
columnDataType="BOOLEAN" />
</changeSet>
</databaseChangeLog>

View file

@ -75,6 +75,7 @@
<property name="ldapAuthEnabled" column="ldap_auth_enabled" not-null="true"/>
<property name="ldapSaveRolesDB" column="ldap_save_roles_db" not-null="true"/>
<property name="ldapSearchQuery" column="ldap_search_query"/>
<property name="ldapGroupStrategy" column="ldap_group_strategy"/>
<set name="configurationRolesLdap" table="configuration_roles_ldap" lazy="false">
<key column="id_configuration" />

View file

@ -114,6 +114,9 @@
<copy todir="src/main/webapp/help/ru" failonerror="false">
<fileset dir="../doc/src/user/en/html"/>
</copy>
<copy todir="src/main/webapp/help/pt" failonerror="false">
<fileset dir="../doc/src/user/en/html"/>
</copy>
</tasks>
</configuration>
</execution>

View file

@ -68,6 +68,7 @@ import org.zkoss.zul.Listitem;
import org.zkoss.zul.ListitemRenderer;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Radio;
import org.zkoss.zul.Radiogroup;
import org.zkoss.zul.Row;
import org.zkoss.zul.RowRenderer;
import org.zkoss.zul.Rows;
@ -112,10 +113,16 @@ public class ConfigurationController extends GenericForwardComposer {
private Checkbox scenariosVisible;
private Component ldapRoles;
private UserRole roles;
private Textbox ldapGroupPath;
private Textbox ldapRoleProperty;
private Textbox ldapSearchQuery;
private Radiogroup strategy;
@Override
public void doAfterCompose(Component comp) throws Exception {
super.doAfterCompose(comp);
@ -141,7 +148,27 @@ public class ConfigurationController extends GenericForwardComposer {
scenariosVisible
.setTooltiptext(_("Scenarios must be enabled as more elements than master exist"));
}
showLdapRoles();
loadRoleStrategyRows();
}
public void changeRoleStrategy() {
this.getLdapConfiguration().setLdapGroupStrategy(
strategy.getSelectedItem().getValue().equals("group"));
loadRoleStrategyRows();
}
private void loadRoleStrategyRows() {
if (getLdapConfiguration().getLdapGroupStrategy()) {
strategy.setSelectedIndex(0);
ldapGroupPath.setDisabled(false);
ldapSearchQuery.setDisabled(true);
ldapRoleProperty.setDisabled(true);
} else {
strategy.setSelectedIndex(1);
ldapGroupPath.setDisabled(true);
ldapSearchQuery.setDisabled(false);
ldapRoleProperty.setDisabled(false);
}
}
private void initializeProgressTypeList() {
@ -765,11 +792,6 @@ public class ConfigurationController extends GenericForwardComposer {
configurationModel.setLdapConfiguration(ldapConfiguration);
}
public void showLdapRoles() {
ldapRoles.setVisible(configurationModel.getLdapConfiguration()
.getLdapSaveRolesDB());
}
public RowRenderer getAllUserRolesRenderer() {
return new RowRenderer() {
@Override
@ -817,4 +839,12 @@ public class ConfigurationController extends GenericForwardComposer {
return configurationModel.isChangedDefaultPasswdAdmin();
}
public boolean isLdapGroupStrategy() {
return getLdapConfiguration().getLdapGroupStrategy();
}
public boolean isLdapPropertyStrategy() {
return !getLdapConfiguration().getLdapGroupStrategy();
}
}

View file

@ -69,7 +69,6 @@ import org.zkoss.zul.Treechildren;
import org.zkoss.zul.Treeitem;
import org.zkoss.zul.TreeitemRenderer;
import org.zkoss.zul.Treerow;
import org.zkoss.zul.api.Panel;
/**
* Controller for {@link Material} materials
@ -384,6 +383,7 @@ public class MaterialsController extends
}
private void reloadCategoriesTree(Treeitem treeitem) {
Util.reloadBindings(categoriesTree);
if (treeitem != null) {
final MaterialCategory materialCategory = (MaterialCategory) treeitem.getValue();
categoriesTree.invalidate();

View file

@ -29,6 +29,7 @@ import org.libreplan.business.orders.entities.OrderElement;
import org.zkoss.ganttz.util.ComponentsFinder;
import org.zkoss.util.Locales;
import org.zkoss.zk.ui.Component;
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.util.GenericForwardComposer;
@ -36,10 +37,16 @@ import org.zkoss.zul.Datebox;
import org.zkoss.zul.Hbox;
import org.zkoss.zul.Textbox;
/**
* Textbox component which is transformed into a Datebox picker on demand <br />
*
* @author Susana Montes Pedreira <smontes@wirelessgalicia.com>
* @author Lorenzo Tilve Álvaro <ltilve@igalia.com>
* @author Manuel Rego Casasnovas <mrego@igalia.com>
* @author Jacobo Aragunde Pérez <jaragunde@igalia.com>
*/
public class DynamicDatebox extends GenericForwardComposer {
private final OrderElement orderElement;
final Getter<Date> getter;
final Setter<Date> setter;
@ -52,29 +59,29 @@ public class DynamicDatebox extends GenericForwardComposer {
private boolean disabled = false;
public DynamicDatebox(final OrderElement orderElement, Getter<Date> getter,
public DynamicDatebox(Getter<Date> getter,
Setter<Date> setter) {
this.orderElement = orderElement;
this.setter = setter;
this.getter = getter;
this.dateFormat = DateFormat.getDateInstance(DateFormat.SHORT, Locales
.getCurrent());
}
public OrderElement getOrderElement() {
return orderElement;
public Datebox createDateBox() {
dateBox = new Datebox();
dateBox.setFormat("short");
dateBox.setValue(getter.get());
registerOnEnterOpenDateBox(dateBox);
registerBlurListener(dateBox);
registerOnChange(dateBox);
dateTextBox.getParent().appendChild(dateBox);
return dateBox;
}
public Datebox getDateBox() {
return dateBox;
}
public void setDateBox(Datebox dateBox) {
this.dateBox = dateBox;
this.dateBox.setCompact(true);
this.dateBox.setFormat("dd/MM/yyyy");
}
/**
* When a text box associated to a datebox is requested to show the datebox,
* the corresponding datebox is shown
@ -83,15 +90,16 @@ public class DynamicDatebox extends GenericForwardComposer {
*/
public void userWantsDateBox(Component component) {
if (component == dateTextBox) {
showDateBox(dateBox, dateTextBox);
showDateBox(dateTextBox);
}
}
private void showDateBox(Datebox currentDateBox, Textbox associatedTextBox) {
private void showDateBox(Textbox associatedTextBox) {
associatedTextBox.setVisible(false);
currentDateBox.setVisible(true);
currentDateBox.setFocus(true);
currentDateBox.setOpen(true);
getDateBox();
createDateBox();
dateBox.setFocus(true);
dateBox.setOpen(true);
}
/**
@ -101,19 +109,17 @@ public class DynamicDatebox extends GenericForwardComposer {
*/
public void dateBoxHasLostFocus(Datebox currentDateBox) {
if (currentDateBox == dateBox) {
hideDateBox(dateBox, dateTextBox);
hideDateBox(dateTextBox);
}
}
private void hideDateBox(Datebox dateBoxToDissapear,
Textbox associatedTextBox) {
dateBoxToDissapear.setVisible(false);
private void hideDateBox(Textbox associatedTextBox) {
dateBox.detach();
associatedTextBox.setVisible(true);
}
@Override
public void doAfterCompose(Component component) throws Exception {
super.doAfterCompose(component);
findComponents((Hbox) component);
registerListeners();
updateComponents();
@ -122,22 +128,14 @@ public class DynamicDatebox extends GenericForwardComposer {
private void registerListeners() {
registerOnEnterListener(dateTextBox);
registerOnEnterOpenDateBox(dateBox);
registerBlurListener(dateBox);
registerOnChange(dateBox);
}
private void findComponents(Hbox hbox) {
List<Object> children = hbox.getChildren();
assert children.size() == 2;
assert children.size() == 1;
dateTextBox = findTextBoxOfCell(children);
dateBox = findDateBoxOfCell(children);
}
private static Datebox findDateBoxOfCell(List<Object> children) {
return ComponentsFinder.findComponentsOfType(Datebox.class, children)
.get(0);
// dateBox = findDateBoxOfCell(children);
}
private static Textbox findTextBoxOfCell(List<Object> children) {
@ -206,11 +204,9 @@ public class DynamicDatebox extends GenericForwardComposer {
public void updateBean() {
Date date = getDateBox().getValue();
setter.set(date);
}
private void updateComponents() {
getDateBox().setValue(getter.get());
getDateTextBox().setValue(asString(getter.get()));
}
@ -239,9 +235,6 @@ public class DynamicDatebox extends GenericForwardComposer {
}
private void applyDisabledToElements(boolean disabled) {
if(dateBox != null) {
dateBox.setDisabled(disabled);
}
if(dateTextBox != null) {
dateTextBox.setDisabled(disabled);
}

View file

@ -116,6 +116,4 @@ public interface IManageOrderElementAdvancesModel {
AdvanceAssignment getSpreadAdvance();
void cancel();
}

View file

@ -118,10 +118,6 @@ public class ManageOrderElementAdvancesController extends
return manageOrderElementAdvancesModel.getAdvanceAssignments();
}
public void cancel() {
manageOrderElementAdvancesModel.cancel();
}
public boolean close() {
return save();
}

View file

@ -29,11 +29,9 @@ import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
@ -97,8 +95,6 @@ public class ManageOrderElementAdvancesModel implements
private List<AdvanceType> listAdvanceTypes;
private CancelOperation cancelOperation = new CancelOperation();
@Autowired
public ManageOrderElementAdvancesModel(
IAdvanceMeasurementDAO advanceMeasurementDAO,
@ -241,11 +237,6 @@ public class ManageOrderElementAdvancesModel implements
}
}
@Override
public void cancel() {
cancelOperation.restoreOriginalState();
}
@Override
public boolean addNewLineAdvanceAssignment() {
DirectAdvanceAssignment newAdvance = DirectAdvanceAssignment.create();
@ -311,7 +302,6 @@ public class ManageOrderElementAdvancesModel implements
measurement.setDate(null);
advanceAssignment.addAdvanceMeasurements(measurement);
}
cancelOperation.markAsAdded(measurement);
}
@Override
@ -324,7 +314,6 @@ public class ManageOrderElementAdvancesModel implements
@Override
public void removeLineAdvanceMeasurement(AdvanceMeasurement measurement) {
cancelOperation.markAsRemoved(measurement);
this.advanceAssignment.removeAdvanceMeasurement(measurement);
}
@ -431,7 +420,6 @@ public class ManageOrderElementAdvancesModel implements
reattachmentOrderElement();
orderElement.updateAdvancePercentageTaskElement();
validateBasicData();
cancelOperation.clear();
}
private void validateBasicData() throws InstanceNotFoundException,
@ -801,78 +789,4 @@ public class ManageOrderElementAdvancesModel implements
return false;
}
/**
* @author Diego Pino García <dpino@igalia.com>
*
* Keeps track of added and removed measurements. When the cancel button is
* pressed, restores the original state of the advance assignments
*
*/
private static class CancelOperation {
private Set<AdvanceMeasurement> addedMeasurements = new HashSet<AdvanceMeasurement>();
private Map<AdvanceAssignment, Set<AdvanceMeasurement>> removedMeasurements = new HashMap<AdvanceAssignment, Set<AdvanceMeasurement>>();
public void restoreOriginalState() {
removeAddedMeasurements();
addRemovedMeasurements();
clear();
}
private void clear() {
addedMeasurements.clear();
removedMeasurements.clear();
}
private void removeAddedMeasurements() {
for (AdvanceAssignment each : removedMeasurements.keySet()) {
if (each instanceof DirectAdvanceAssignment) {
DirectAdvanceAssignment directAdvanceAssignment = (DirectAdvanceAssignment) each;
directAdvanceAssignment
.addAdvanceMeasurements(removedMeasurements
.get(each));
}
}
removedMeasurements.clear();
}
private void addRemovedMeasurements() {
for (AdvanceMeasurement each : addedMeasurements) {
AdvanceAssignment assignment = each.getAdvanceAssignment();
if (assignment instanceof DirectAdvanceAssignment) {
DirectAdvanceAssignment directAdvanceAssignment = (DirectAdvanceAssignment) assignment;
directAdvanceAssignment.removeAdvanceMeasurement(each);
}
}
addedMeasurements.clear();
}
/**
* Keeps track of new measurement added to {@link AdvanceAssignment}. If
* the user later clicks cancel these elements will be removed
*
* @param measurement
*/
public void markAsAdded(AdvanceMeasurement measurement) {
addedMeasurements.add(measurement);
}
/**
* Keeps track of measurement removed from {@link AdvanceAssignment}. If
* the user later clicks cancel these elements will be added back again
*
* @param measurement
*/
public void markAsRemoved(AdvanceMeasurement measurement) {
AdvanceAssignment assignment = measurement.getAdvanceAssignment();
if (!removedMeasurements.containsKey(assignment)) {
removedMeasurements.put(assignment, new HashSet<AdvanceMeasurement>());
}
Set<AdvanceMeasurement> measurements = removedMeasurements.get(assignment);
measurements.add(measurement);
}
}
}

View file

@ -36,8 +36,13 @@ import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.LogFactory;
import org.hibernate.validator.InvalidValue;
import org.libreplan.business.calendars.entities.BaseCalendar;
import org.libreplan.business.common.Registry;
import org.libreplan.business.common.exceptions.InstanceNotFoundException;
import org.libreplan.business.common.exceptions.ValidationException;
import org.libreplan.business.externalcompanies.entities.ExternalCompany;
import org.libreplan.business.materials.daos.IMaterialCategoryDAO;
import org.libreplan.business.materials.entities.MaterialCategory;
import org.libreplan.business.orders.daos.IOrderDAO;
import org.libreplan.business.orders.entities.HoursGroup;
import org.libreplan.business.orders.entities.Order;
import org.libreplan.business.orders.entities.Order.SchedulingMode;
@ -217,6 +222,9 @@ public class OrderCRUDController extends GenericForwardComposer {
private ProjectDetailsController projectDetailsController;
@Autowired
private IOrderDAO orderDAO;
@Override
public void doAfterCompose(Component comp) throws Exception {
super.doAfterCompose(comp);
@ -1473,4 +1481,51 @@ public class OrderCRUDController extends GenericForwardComposer {
}
}
public Constraint chekValidProjectName() {
return new Constraint() {
@Override
public void validate(Component comp, Object value)
throws WrongValueException {
if (StringUtils.isBlank((String) value)) {
throw new WrongValueException(comp,
_("cannot be null or empty"));
}
try {
Order found = orderDAO
.findByNameAnotherTransaction((String) value);
if (!found.getId().equals(getOrder().getId())) {
throw new WrongValueException(comp,
_("project name already being used"));
}
} catch (InstanceNotFoundException e) {
return;
}
}
};
}
public Constraint chekValidProjectCode() {
return new Constraint() {
@Override
public void validate(Component comp, Object value)
throws WrongValueException {
if (StringUtils.isBlank((String) value)) {
throw new WrongValueException(comp,
_("cannot be null or empty"));
}
try {
Order found = orderDAO
.findByCodeAnotherTransaction((String) value);
if (!found.getId().equals(getOrder().getId())) {
throw new WrongValueException(comp,
_("project code already being used"));
}
} catch (InstanceNotFoundException e) {
return;
}
}
};
}
}

View file

@ -429,7 +429,7 @@ public class OrderElementTreeController extends TreeController<OrderElement> {
void addInitDateCell(final OrderElement currentOrderElement) {
DynamicDatebox dinamicDatebox = new DynamicDatebox(
currentOrderElement, new DynamicDatebox.Getter<Date>() {
new DynamicDatebox.Getter<Date>() {
@Override
public Date get() {
@ -451,7 +451,7 @@ public class OrderElementTreeController extends TreeController<OrderElement> {
void addEndDateCell(final OrderElement currentOrderElement) {
DynamicDatebox dinamicDatebox = new DynamicDatebox(
currentOrderElement, new DynamicDatebox.Getter<Date>() {
new DynamicDatebox.Getter<Date>() {
@Override
public Date get() {

View file

@ -575,19 +575,7 @@ public class TaskElementAdapter {
@Override
public GanttDate getAdvanceEndDate() {
BigDecimal advancePercentage = BigDecimal.ZERO;
if (taskElement.getOrderElement() != null) {
if (isTaskRoot(taskElement)) {
ProgressType progressType = getProgressTypeFromConfiguration();
advancePercentage = taskElement
.getAdvancePercentage(progressType);
} else {
advancePercentage = taskElement.getAdvancePercentage();
}
}
return getAdvanceEndDate(advancePercentage);
return getAdvanceEndDate(getAdvancePercentage());
}
private boolean isTaskRoot(TaskElement taskElement) {
@ -887,14 +875,21 @@ public class TaskElementAdapter {
@Override
public BigDecimal getAdvancePercentage() {
if (taskElement != null) {
return taskElement.getAdvancePercentage();
BigDecimal advancePercentage;
if (isTaskRoot(taskElement)) {
ProgressType progressType = getProgressTypeFromConfiguration();
advancePercentage = taskElement
.getAdvancePercentage(progressType);
} else {
advancePercentage = taskElement.getAdvancePercentage();
}
return advancePercentage;
}
return new BigDecimal(0);
}
private String buildTooltipText() {
return buildTooltipText(asPercentage(taskElement
.getAdvancePercentage()));
return buildTooltipText(asPercentage(getAdvancePercentage()));
}
private BigDecimal asPercentage(BigDecimal value) {

View file

@ -104,16 +104,10 @@ public class AdvanceAssignmentPlanningController extends GenericForwardComposer
}
public void onClose(Event event) {
cancel();
accept();
event.stopPropagation();
}
public void cancel() {
manageOrderElementAdvancesController.cancel();
advanceAssignmentPlanningModel.cancel();
close();
}
public void accept() {
boolean result = manageOrderElementAdvancesController.close();
if (result) {
@ -151,6 +145,7 @@ public class AdvanceAssignmentPlanningController extends GenericForwardComposer
private void updateTaskComponent(TaskComponent taskComponent) {
taskComponent.updateCompletionIfPossible();
taskComponent.updateTooltipText();
taskComponent.invalidate();
}
private void close() {

View file

@ -63,11 +63,6 @@ public class AdvanceAssignmentPlanningModel implements
private OrderElement orderElement;
@Override
public void cancel() {
}
@Override
public void accept() {
getOrderElement().updateAdvancePercentageTaskElement();

View file

@ -37,11 +37,6 @@ public interface IAdvanceAssignmentPlanningModel {
public T doInsideTransaction();
}
/**
* Cancel operation
*/
void cancel();
/**
* Save task
*/

View file

@ -379,6 +379,9 @@ public class AdvancedAllocationController extends GenericForwardComposer {
private Listbox advancedAllocationHorizontalPagination;
private Listbox advancedAllocationVerticalPagination;
private boolean fixedZoomByUser = false;
private ZoomLevel zoomLevel;
public AdvancedAllocationController(IBack back,
List<AllocationInput> allocationInputs) {
setInputData(back, allocationInputs);
@ -576,6 +579,9 @@ public class AdvancedAllocationController extends GenericForwardComposer {
private void createComponents() {
timeTracker = new TimeTracker(addMarginTointerval(), self);
paginatorFilter = new PaginatorFilter();
if (fixedZoomByUser && (zoomLevel != null)) {
timeTracker.setZoomLevel(zoomLevel);
}
paginatorFilter.setZoomLevel(timeTracker.getDetailLevel());
paginatorFilter.setInterval(timeTracker.getRealInterval());
paginationUpButton.setDisabled(isLastPage());
@ -585,6 +591,9 @@ public class AdvancedAllocationController extends GenericForwardComposer {
timeTracker.addZoomListener(new IZoomLevelChangedListener() {
@Override
public void zoomLevelChanged(ZoomLevel detailLevel) {
fixedZoomByUser = true;
zoomLevel = detailLevel;
paginatorFilter.setZoomLevel(detailLevel);
paginatorFilter.setInterval(timeTracker.getRealInterval());
timeTracker.setFilter(paginatorFilter);

View file

@ -216,6 +216,8 @@ public class ResourceAllocationController extends GenericForwardComposer {
newAllocationSelector.setAllocationsAdder(resourceAllocationModel);
newAllocationSelectorCombo
.setAllocationsAdder(resourceAllocationModel);
Util.reloadBindings(allocationsGrid);
} catch (WrongValueException e) {
LOG.error("there was a WrongValueException initializing window", e);
throw e;

View file

@ -147,15 +147,13 @@ public class CompanyPlanningController implements Composer {
cbProgressTypes.setModel(new ListModelList(ProgressType.getAll()));
cbProgressTypes.setItemRenderer(new ProgressTypeRenderer());
// FIXME: Select default configuration option
// Update completion of tasks on selecting new progress type
cbProgressTypes.addEventListener(Events.ON_SELECT, new EventListener() {
@Override
public void onEvent(Event event) {
planner.updateCompletion(getSelectedProgressType().toString());
planner.forcedShowAdvances();
planner.updateCompletion(getSelectedProgressType().toString());
}
private ProgressType getSelectedProgressType() {
@ -166,33 +164,25 @@ public class CompanyPlanningController implements Composer {
cbProgressTypes.setVisible(true);
Comboitem item = findListitemValue(cbProgressTypes,
getProgressTypeFromConfiguration());
if (item != null) {
cbProgressTypes.setSelectedItem(item);
ProgressType progressType = getProgressTypeFromConfiguration();
if (progressType != null) {
planner.updateCompletion(progressType.toString());
}
}
private static class ProgressTypeRenderer implements ComboitemRenderer {
private class ProgressTypeRenderer implements ComboitemRenderer {
@Override
public void render(Comboitem item, Object data) {
ProgressType progressType = (ProgressType) data;
item.setValue(progressType);
item.setLabel(_(progressType.getValue()));
}
}
private Comboitem findListitemValue(Combobox listbox, ProgressType value) {
for (Object each : listbox.getChildren()) {
final Comboitem item = (Comboitem) each;
if (value.equals(item.getValue())) {
return item;
if (getProgressTypeFromConfiguration().equals(progressType)) {
cbProgressTypes.setSelectedItem(item);
}
}
return null;
}
public ProgressType getProgressTypeFromConfiguration() {

View file

@ -56,6 +56,7 @@ import org.libreplan.business.orders.entities.HoursGroup;
import org.libreplan.business.orders.entities.Order;
import org.libreplan.business.orders.entities.OrderElement;
import org.libreplan.business.orders.entities.OrderLineGroup;
import org.libreplan.business.orders.entities.TaskSource;
import org.libreplan.business.planner.daos.IConsolidationDAO;
import org.libreplan.business.planner.daos.IDependencyDAO;
import org.libreplan.business.planner.daos.ISubcontractedTaskDataDAO;
@ -568,7 +569,10 @@ public class SaveCommandBuilder {
}
private void saveTaskSources(TaskElement taskElement) {
taskSourceDAO.save(taskElement.getTaskSource());
TaskSource taskSource = taskElement.getTaskSource();
if (taskSource != null) {
taskSourceDAO.save(taskSource);
}
if (taskElement.isLeaf()) {
return;
}

View file

@ -394,9 +394,11 @@ public class MultipleTabsPlannerController implements Composer,
handler.registerBookmarkListener(this, comp.getPage());
if (SecurityUtils.isUserInRole(UserRole.ROLE_CREATE_ORDER)) {
org.zkoss.zk.ui.Component createOrderButton = comp.getPage().getFellow(
org.zkoss.zk.ui.Component createOrderButton = comp.getPage()
.getFellowIfAny(
"createOrderButton");
createOrderButton.addEventListener(Events.ON_CLICK,
if (createOrderButton != null) {
createOrderButton.addEventListener(Events.ON_CLICK,
new EventListener() {
@Override
public void onEvent(Event event) throws Exception {
@ -404,6 +406,7 @@ public class MultipleTabsPlannerController implements Composer,
}
});
}
}
}

View file

@ -49,6 +49,7 @@ import org.libreplan.web.common.Util.Setter;
import org.libreplan.web.orders.DynamicDatebox;
import org.libreplan.web.orders.SchedulingStateToggler;
import org.libreplan.web.tree.TreeComponent.Column;
import org.zkoss.zk.ui.AbstractComponent;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.WrongValueException;
@ -764,7 +765,7 @@ public abstract class TreeController<T extends ITreeNode<T>> extends
}
private Intbox buildHoursIntboxFor(final T element) {
Intbox result = new Intbox();
Intbox result = new IntboxDirectValue();
if (isLine(element)) {
Util.bind(result, getHoursGetterFor(element),
getHoursSetterFor(element));
@ -795,10 +796,32 @@ public abstract class TreeController<T extends ITreeNode<T>> extends
// Order node, not an OrderElement
parentNodes.remove(parentNodes.size() - 1);
for (T node : parentNodes) {
Intbox intbox = hoursIntBoxByElement.get(node);
intbox.setValue(getHoursGroupHandler().getWorkHoursFor(node));
IntboxDirectValue intbox = (IntboxDirectValue) hoursIntBoxByElement
.get(node);
Integer hours = getHoursGroupHandler()
.getWorkHoursFor(node);
if (isInCurrentPage(intbox)) {
intbox.setValue(hours);
} else {
intbox.setValueDirectly(hours);
}
}
}
private boolean isInCurrentPage(IntboxDirectValue intbox) {
Treeitem treeItem = (Treeitem) intbox.getParent().getParent().getParent();
List<Treeitem> treeItems = new ArrayList<Treeitem>(
tree.getItems());
int position = treeItems.indexOf(treeItem);
if (position < 0) {
throw new RuntimeException("Treeitem " + treeItem
+ " has to belong to tree.getItems() list");
}
return (position / tree.getPageSize()) == tree
.getActivePage();
}
};
}
@ -1068,4 +1091,24 @@ public abstract class TreeController<T extends ITreeNode<T>> extends
this.orderElementTreeComponent = orderElementsTree;
}
/**
* This class is to give visibility to method
* {@link Intbox#setValueDirectly} which is marked as protected in
* {@link Intbox} class.
*
* <br />
*
* This is needed to prevent calling {@link AbstractComponent#smartUpdate}
* when the {@link Intbox} is not in current page. <tt>smartUpdate</tt> is
* called by {@link Intbox#setValue(Integer)}. This call causes a JavaScript
* error when trying to update {@link Intbox} that are not in current page
* in the tree.
*/
private class IntboxDirectValue extends Intbox {
@Override
public void setValueDirectly(Object value) {
super.setValueDirectly(value);
}
}
}

View file

@ -32,7 +32,6 @@ import org.libreplan.business.users.entities.Profile;
import org.libreplan.business.users.entities.User;
import org.libreplan.business.users.entities.UserRole;
import org.libreplan.web.common.BaseCRUDController;
import org.libreplan.web.common.Level;
import org.libreplan.web.common.Util;
import org.libreplan.web.common.components.Autocomplete;
import org.libreplan.web.common.entrypoints.EntryPointsHandler;
@ -216,4 +215,13 @@ public class UserCRUDController extends BaseCRUDController<User> implements
protected void delete(User user) throws InstanceNotFoundException {
userModel.confirmRemove(user);
}
public boolean isLdapUser() {
User user = userModel.getUser();
if (user == null) {
return false;
}
return !user.isLibrePlanUser();
}
}

File diff suppressed because it is too large Load diff

View file

@ -21,5 +21,4 @@
<hbox>
<textbox value="" width="110px" />
<datebox compact="true" visible="${false}"/>
</hbox>

View file

@ -239,8 +239,10 @@
<!-- Activation -->
<groupbox style="margin-top: 5px" closable="false">
<caption label="${i18n:_('Activation')}" />
<label value="${i18n:_('LDAP Authentication enabled')}" />
<label value="${i18n:_('Enable LDAP authentication')}" />
<checkbox id="ldapAuthEnabled" checked="@{configurationController.ldapConfiguration.ldapAuthEnabled}" />
<label value="${i18n:_('Use LDAP roles')}" />
<checkbox id="ldapSaveRolesDB" checked="@{configurationController.ldapConfiguration.ldapSaveRolesDB}" />
</groupbox>
<!-- Configuration -->
@ -329,27 +331,33 @@
</columns>
<rows>
<row>
<label value="${i18n:_('Import LDAP roles')}" />
<checkbox id="ldapSaveRolesDB" checked="@{configurationController.ldapConfiguration.ldapSaveRolesDB}" onCheck="configurationController.showLdapRoles()"/>
<label value="${i18n:_('Role search strategy')}" />
<radiogroup id="strategy" onCheck="configurationController.changeRoleStrategy()">
<radio label="${i18n:_('Group strategy')}" value="group" />
<radio label="${i18n:_('Property strategy')}" value="property" />
</radiogroup>
</row>
<row>
<label value="${i18n:_('Group path')}" />
<hbox>
<textbox id="ldapGroupPath" value="@{configurationController.ldapConfiguration.ldapGroupPath}" width="300px"/>
<textbox id="ldapGroupPath" value="@{configurationController.ldapConfiguration.ldapGroupPath}" width="300px"
disabled="@{configurationController.ldapPropertyStrategy}" />
<label value="${i18n:__('Example: {0}', 'ou=groups')}" /><label value="${i18n:_('(If it is empty, a node strategy is used)')}" />
</hbox>
</row>
<row>
<label value="${i18n:_('Role property')}" />
<hbox>
<textbox id="ldapRoleProperty" value="@{configurationController.ldapConfiguration.ldapRoleProperty}" width="300px"/>
<textbox id="ldapRoleProperty" value="@{configurationController.ldapConfiguration.ldapRoleProperty}" width="300px"
disabled="@{configurationController.ldapGroupStrategy}" />
<label value="${i18n:__('Example: {0}', 'member')}" />
</hbox>
</row>
<row>
<label value="${i18n:_('Role search query')}" />
<hbox>
<textbox id="ldapSearchQuery" value="@{configurationController.ldapConfiguration.ldapSearchQuery}" width="300px"/>
<textbox id="ldapSearchQuery" value="@{configurationController.ldapConfiguration.ldapSearchQuery}" width="300px"
disabled="@{configurationController.ldapGroupStrategy}" />
<label value="${i18n:__('Example: {0}', 'uid=[USER_ID],ou=people,dc=example,dc=org')}" />
</hbox>
</row>
@ -357,7 +365,7 @@
</grid>
<separator />
<separator />
<vbox id="ldapRoles" visible="false">
<vbox id="ldapRoles">
<grid id="configurationRoles"
model="@{configurationController.roles}"
rowRenderer="@{configurationController.allUserRolesRenderer}"

View file

@ -466,12 +466,18 @@ div.z-row-cnt {
padding-left: 2px;
}
.leftpanelgap .z-textbox,.leftpanelgap .z-decimalbox,.leftpanelgap .z-intbox,
.leftpanelgap .z-longbox,.leftpanelgap .z-doublebox,.leftpanelgap .z-datebox,
.leftpanelgap .z-datebox-inp,.leftpanelgap .z-datebox-focus .z-datebox-inp {
.leftpanelgap .z-textbox, .leftpanelgap .z-decimalbox, .leftpanelgap .z-intbox,
.leftpanelgap .z-longbox, .leftpanelgap .z-doublebox, .leftpanelgap .z-datebox,
.leftpanelgap .z-datebox-inp, .leftpanelgap .z-datebox-focus .z-datebox-inp,
.leftpanelgap .z-datebox-inp {
font-size: 11px;
}
tr.z-treerow td.z-treerow-focus {
background-image: none;
}
div.z-footer-cnt,div.z-row-cnt,div.z-group-cnt,div.z-group-foot-cnt,div.z-column-cnt,div.z-tree-col-cnt {
font-family: Tahoma, Arial, Helvetica, sans-serif;
font-size: 11px;
@ -572,9 +578,14 @@ div.z-grid {
.listdetails .z-textbox, .listdetails .z-decimalbox,
.listdetails .z-intbox, .listdetails .z-longbox,
.listdetails .z-doublebox {
.listdetails .z-doublebox, .listdetails .z-tree .z-datebox-inp {
height: 15px;
}
.listdetails .z-tree .z-datebox-inp {
padding-top: 3px;
}
.listdetails input {
padding-top: 5px;
}
@ -1131,8 +1142,8 @@ span.perspective, span.perspective-active {
overflow-x: auto;
}
tr.z-tree-row-seld, tr.z-list-item-seld,
.z-combobox-pp .z-combo-item-seld,
tr.z-tree-row-seld, tr.z-listitem-seld,
.z-combobox-pp .z-comboitem-seld,
tr.z-treerow-seld {
background-color: #fdd772; /* Dark orange */
color: #000000;
@ -1456,7 +1467,7 @@ display:none;
}
.progress-types {
margin-left:-10px;
margin-left:-12px;
}
.progress-types.z-combobox .z-combobox-inp {
@ -1468,11 +1479,11 @@ display:none;
border: 0;
border-width: 0;
outline: none;
text-indent: -200px;
width: 0;
}
.progress-types.z-combobox input {
display: none;
font-size: 0;
}
.show-advances img {

View file

@ -70,7 +70,7 @@
<groupbox closable="false">
<caption id="materialsCaption" label="${i18n:_('List of materials for all categories (select one to filter)')}"/>
<button id="btnAddMaterial"
label="${i18n:_('Add')}"
label="${i18n:_('New')}"
onClick="materialsController.addMaterialToMaterialCategory(categoriesTree.selectedItem)" />
<separator spacing="15px" orient="horizontal" />
<newdatasortablegrid id="gridMaterials"

View file

@ -20,24 +20,22 @@
-->
<newdatasortablegrid id="gridMaterials"
fixedLayout="false"
model="@{assignedMaterialsController.assignedMaterials}" >
<columns>
<newdatasortablecolumn label="${i18n:_('Code')}" />
sizedByContent="true"
model="@{assignedMaterialsController.assignedMaterials}">
<columns width="100%">
<newdatasortablecolumn label="${i18n:_('Code')}" hflex="1" />
<newdatasortablecolumn label="${i18n:_('Receipt date')}" />
<newdatasortablecolumn label="${i18n:_('Units')}" />
<newdatasortablecolumn label="${i18n:_('Unit type')}" />
<newdatasortablecolumn label="${i18n:_('Unit price')}" />
<newdatasortablecolumn label="${i18n:_('Total price')}" />
<newdatasortablecolumn label="${i18n:_('Category')}" />
<newdatasortablecolumn label="${i18n:_('Category')}" hflex="1"/>
<newdatasortablecolumn label="${i18n:_('Status')}" />
<newdatasortablecolumn label="${i18n:_('Op.')}" />
</columns>
<rows>
<row self="@{each='assignedMaterial'}" value="@{assignedMaterial}">
<textbox value="@{assignedMaterial.material.code}"
constraint="no empty:${i18n:_('cannot be null or empty')}"
readonly="true" />
<label value="@{assignedMaterial.material.code}" hflex="true" />
<datebox value="@{assignedMaterial.estimatedAvailability}" />
<doublebox value="@{assignedMaterial.units}"
onChange="assignedMaterialsController.updateTotalPrice(self.parent)" />
@ -48,7 +46,7 @@
<doublebox value="@{assignedMaterial.unitPrice}"
onChange="assignedMaterialsController.updateTotalPrice(self.parent)" />
<doublebox value="@{assignedMaterial.totalPrice}" disabled="${true}"/>
<label value="@{assignedMaterial.material.category.name}" width="150px" />
<label value="@{assignedMaterial.material.category.name}" />
<listbox mold="select" model="@{materialStatus}"
selectedItem="@{assignedMaterial.status}"
itemRenderer="org.libreplan.web.common.EnumsListitemRenderer" />

View file

@ -70,13 +70,15 @@
<rows>
<row>
<label value="${i18n:_('Name')}" />
<textbox value="@{controller.order.name}" width="500px"/>
<textbox value="@{controller.order.name}" width="500px"
constraint="@{controller.chekValidProjectName}" />
</row>
<row>
<label value="${i18n:_('Code')}" />
<hbox>
<textbox value="@{controller.order.code}" width="250px"
disabled="@{controller.codeAutogenerated}" />
disabled="@{controller.codeAutogenerated}"
constraint="@{controller.chekValidProjectCode}" />
<checkbox label="${i18n:_('Generate code')}"
checked="@{controller.codeAutogenerated}" />
</hbox>

View file

@ -149,7 +149,7 @@
model="@{criterionRequirementsController.hoursGroups}"
itemRenderer="@{criterionRequirementsController.renderer}">
<listhead>
<listheader label="${i18n:_('Criterion Requirements')}" width="500px"/>
<listheader label="${i18n:_('Criterion Requirements')}" width="500px" hflex="1"/>
<listheader label="${i18n:_('Type')}" align="center" width="150px" />
<listheader label="${i18n:_('Hours')}" align="center" width="150px" />
</listhead>
@ -171,8 +171,7 @@
<newdatasortablegrid id="listHoursGroups"
model="@{criterionRequirementsController.hoursGroupWrappers}"
mold="paging"
pageSize="4"
fixedLayout="true">
pageSize="4">
<columns>
<newdatasortablecolumn width="25px" sort="auto"/>
<newdatasortablecolumn label="Code" width="160px" sort="auto(code)" sortDirection="ascending" align="center"/>

View file

@ -27,7 +27,7 @@
<panelchildren>
<grid
model="@{assignedHoursToOrderElementController.workReportLines}"
mold="paging" pageSize="10" fixedLayout="true">
mold="paging" pageSize="10" >
<columns>
<column label="${i18n:_('Date')}" width="120px" />
<column label="${i18n:_('Resource')}" />

View file

@ -74,15 +74,14 @@
<tabpanel>
<!-- Material search -->
<hbox hflex="min">
<hbox width="100%" hflex="1">
<!-- Categories -->
<vbox>
<vbox hflex="1">
<panel title="${i18n:_('Categories')}" border="normal">
<panelchildren>
<toolbarbutton style="text-decoration: none" label="${i18n:_('Unselect')}"
onClick="assignedMaterialsController.clearSelectionAllCategoriesTree()" />
<tree id="allCategoriesTree"
width="280px" rows="10" vflex="true" multiple="false">
<tree id="allCategoriesTree" rows="10" vflex="true" multiple="false">
<treecols>
<treecol label="Name" />
</treecols>
@ -91,7 +90,7 @@
</panel>
</vbox>
<vbox hflex="min">
<vbox hflex="1">
<!-- Found materials -->
<panel title="${i18n:_('Materials')}" border="normal">
@ -111,10 +110,10 @@
<listbox id="lbFoundMaterials"
multiple="true"
sizedByContent="true"
model="@{assignedMaterialsController.matchingMaterials}">
<listhead sizable="true">
model="@{assignedMaterialsController.matchingMaterials}" >
<listhead sizable="true" >
<listheader label="${i18n:_('Code')}" />
<listheader label="${i18n:_('Name')}" />
<listheader label="${i18n:_('Name')}" hflex="1"/>
<listheader label="${i18n:_('Unit type')}" />
<listheader label="${i18n:_('Unit price')}" />
<listheader label="${i18n:_('Category')}" />

View file

@ -66,14 +66,14 @@
font-size: 10px !important;
border-bottom: 0px;
border-right: 0px;
border-top: 0px;
border-left: 1px dotted #86A4BE;
border-top: 0;
border-left: 0;
height: 16px;
padding-left:2px;
}
.listdetails input.task_title {
width: auto;
.listdetails input.task-name {
border-left: dotted 1px #CCC;
}
.listdetails div.z-tree-cell-cnt {
@ -97,41 +97,6 @@
height: 19px;
}
.listdetails .depth_1 input.task_title {
/*on change org.libreplan.web.print.CutyPrint.BASE_TASK_NAME_PIXEL must
be changed too */
width: 82%;
}
.listdetails .depth_2 input.task_title {
width: 78%;
}
.listdetails .depth_3 .task_title {
width: 74%;
}
.listdetails .depth_4 .task_title {
width: 70%;
}
.listdetails .depth_5 .task_title {
width: 66%;
}
.listdetails .depth_6 .task_title {
width: 62%;
}
.listdetails .depth_7 .task_title {
width: 58%;
}
.listdetails .depth_8 .task_title {
width: 54%;
}
.listdetails {
min-width:200px;
}
@ -831,6 +796,7 @@ div.z-tree {
.listdetails td {
border-bottom: 1px dotted #CCC !important;
border-right: 1px dotted #CCC;
}
.plannerlayout, .resourcesloadlayout, .advancedallocationlayout {

View file

@ -67,12 +67,9 @@
<!-- Control buttons -->
<hbox>
<button label="${i18n:_('Accept')}"
sclass="save-button global-action"
<button label="${i18n:_('Back')}"
sclass="back-button global-action"
onClick="advanceAssignmentController.accept();" />
<button label="${i18n:_('Cancel')}"
sclass="cancel-button global-action"
onClick="advanceAssignmentController.cancel();" />
</hbox>
</window>

View file

@ -23,9 +23,9 @@
<?taglib uri="/WEB-INF/tld/i18n.tld" prefix="i18n"?>
<zk>
<window border="normal" title="${i18n:_('Print configuration')}"
closable="true" id="printConfigurationWindow">
<groupbox>
<window border="none" title="${i18n:_('Print configuration')}"
closable="true" id="printConfigurationWindow" width="300px">
<groupbox style="padding:10px; margin:10px;">
<caption label="${i18n:_('Export options')}" />
<vbox>
<checkbox id="print_labels" label="${i18n:_('Show labels')}" checked="true" />
@ -41,6 +41,9 @@
label="${i18n:_('Show all reported hours')}" checked="true"/>
</vbox>
</groupbox>
<hbox>
<label style="color:#CCC;padding:5px;" value="${i18n:_('Please remember that only saved changes will be printed')}" />
</hbox>
<button id="printButton" label="${i18n:_('Print')}" sclass="save-button global-action"></button>
<button id="cancelPrintButton" label="${i18n:_('Cancel')}" sclass="cancel-button global-action" onClick="printConfigurationWindow.detach()"/>
</window>

View file

@ -27,9 +27,9 @@
<caption label="${i18n:_('Task Information')}" />
<!-- Task rows -->
<grid id="gridTaskRows" width="100%">
<grid id="gridTaskRows">
<columns>
<column label="${i18n:_('Criteria')}" width="300px" align="center"/>
<column label="${i18n:_('Criteria')}" width="290px" hflex="1" align="center"/>
<column label="${i18n:_('Type')}" width="140px" align="center"/>
<column label="${i18n:_('Hours')}" width="80px" align="center"/>
</columns>

View file

@ -44,7 +44,8 @@
<textbox id="loginName"
value="@{controller.user.loginName}" width="300px"
constraint="no empty:${i18n:_('cannot be null or empty')}"
onBlur="controller.updateWindowTitle()"/>
onBlur="controller.updateWindowTitle()"
disabled="@{controller.ldapUser}" />
</row>
<row>
<label value="${i18n:_('First name')}" />
@ -70,7 +71,8 @@
<row>
<label value="${i18n:_('Disabled')}" />
<checkbox id="disabled"
checked="@{controller.user.disabled}" width="300px" />
checked="@{controller.user.disabled}" width="300px"
disabled="@{controller.ldapUser}" />
</row>
<row>
<label value="${i18n:_('E-mail')}" />
@ -78,8 +80,8 @@
value="@{controller.user.email}" width="300px"/>
</row>
<row>
<label value="${i18n:_('LibrePlan user')}" />
<checkbox id="libreplanUser" checked="@{controller.user.librePlanUser}" />
<label value="${i18n:_('Authentication type')}" />
<label value="@{controller.user.authenticationType}" />
</row>
</rows>
</grid>

View file

@ -26,7 +26,7 @@
<newdatasortablecolumn label="${i18n:_('User login name')}" sort="auto(loginName)" />
<newdatasortablecolumn label="${i18n:_('Disabled')}" />
<newdatasortablecolumn label="${i18n:_('Administrator')}" />
<newdatasortablecolumn label="${i18n:_('LibrePlan user')}" />
<newdatasortablecolumn label="${i18n:_('Authentication type')}" />
<newdatasortablecolumn label="${i18n:_('Actions')}" />
</columns>
<rows>
@ -34,7 +34,7 @@
<label value="@{user.loginName}" />
<checkbox checked="@{user.disabled}" disabled="true" />
<checkbox checked="@{user.administrator}" disabled="true" />
<checkbox checked="@{user.librePlanUser}" disabled="true" />
<label value="@{user.authenticationType}" />
<hbox>
<button sclass="icono" image="/common/img/ico_editar1.png"
hoverImage="/common/img/ico_editar.png"

View file

@ -87,7 +87,7 @@ function unitMeasureAssign($UMeasure, $materialName){
function materialFormCreate($material, $measure){
_click(_link("Materials"));
_click(_span("z-dottree-ico z-dottree-firstspacer"));
_click(_cell("z-button-cm[3]"));
_click(_cell("New"));
_setValue(_textbox("z-textbox[2]"), $material);
_setSelected(_select(0), $measure);
_click(_cell("Save"));

View file

@ -45,10 +45,11 @@ function templateProjectCreateTemplate($projectName, $template){
function templateProjectAssignTemplate($template){
_click(_link("Projects List"));
_click(_image("ico_copy.png"));
_click(_image("ico_add.png"));
_setValue(_textbox(0, _near(_span("Name"))), "ProjectTemplate");
_click(_italic(0, _cell("z-caption-l")));
_click(_div($template));
_click(_cell("Create Project"));
_click(_cell("Accept"));
_click(_image("ico_save.png"));
_click(_cell("OK"));
_log("Assign the project template", "custom1")