Merge branch 'master' into subcontracting

This commit is contained in:
Susana Montes Pedreira 2012-01-10 17:54:45 +01:00
commit b8d76639f3
351 changed files with 21205 additions and 9050 deletions

10
.gitignore vendored
View file

@ -1,7 +1,7 @@
# ignore build output directory
navalplanner-webapp/target
navalplanner-business/target
navalplanner-gantt-zk/target
libreplan-webapp/target
libreplan-business/target
libreplan-gantt-zk/target
ganttzk-demo-webapp/target
ganttzk/target
@ -14,8 +14,8 @@ ganttzk/target
*.patch
#ignore logs
navalplanner-webapp/*.log
navalplanner-webapp/*.log.????-??-??
libreplan-webapp/*.log
libreplan-webapp/*.log.????-??-??
#ignore backup files
*~

45
AUTHORS
View file

@ -1,16 +1,47 @@
Authors
=======
* Cristina Alavariño Pérez <cristina.alvarino@comtecsf.es>
LibrePlan Team
--------------
* Cristina Alvariño Pérez <cristina.alvarino@cafedered.es>
* Jacobo Aragunde Pérez <jaragunde@igalia.com>
* Fernando Bellas Permuy <fbellas@udc.es>
* José María Casanova Crespo <jmcasanova@igalia.com>
* Nacho Barrientos Arias <nacho@igalia.com>
* Xavier Castaño García <xcastanho@igalia.com>
* Ignacio Díaz Teijido <ignacio.diaz@comtecsf.es>
* Óscar González Fernández <ogonzalez@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 <mrego@igalia.com>
* Farruco Sanjurjo Arcay <fsanjurjo@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>

45
HACKING
View file

@ -64,11 +64,11 @@ Debian/Ubuntu
* Use SQL sentences::
CREATE DATABASE navaldev;
CREATE DATABASE navaldevtest;
CREATE USER naval WITH PASSWORD 'naval';
GRANT ALL PRIVILEGES ON DATABASE navaldev TO naval;
GRANT ALL PRIVILEGES ON DATABASE navaldevtest TO naval;
CREATE DATABASE libreplandev;
CREATE DATABASE libreplandevtest;
CREATE USER libreplan WITH PASSWORD 'libreplan';
GRANT ALL PRIVILEGES ON DATABASE libreplandev TO libreplan;
GRANT ALL PRIVILEGES ON DATABASE libreplandevtest TO libreplan;
* Download source code::
@ -76,6 +76,7 @@ Debian/Ubuntu
* Compile project::
$ cd libreplan/
$ mvn clean install
* Launch application::
@ -103,11 +104,11 @@ Fedora
* Use SQL sentences::
CREATE DATABASE navaldev;
CREATE DATABASE navaldevtest;
CREATE USER naval WITH PASSWORD 'naval';
GRANT ALL PRIVILEGES ON DATABASE navaldev TO naval;
GRANT ALL PRIVILEGES ON DATABASE navaldevtest TO naval;
CREATE DATABASE libreplandev;
CREATE DATABASE libreplandevtest;
CREATE USER libreplan WITH PASSWORD 'libreplan';
GRANT ALL PRIVILEGES ON DATABASE libreplandev TO libreplan;
GRANT ALL PRIVILEGES ON DATABASE libreplandevtest TO libreplan;
* Set ``postgres`` user password::
@ -125,6 +126,7 @@ Fedora
* Compile project::
$ cd libreplan/
$ mvn clean install
* Launch application::
@ -163,11 +165,11 @@ openSUSE
* Use SQL sentences::
CREATE DATABASE navaldev;
CREATE DATABASE navaldevtest;
CREATE USER naval WITH PASSWORD 'naval';
GRANT ALL PRIVILEGES ON DATABASE navaldev TO naval;
GRANT ALL PRIVILEGES ON DATABASE navaldevtest TO naval;
CREATE DATABASE libreplandev;
CREATE DATABASE libreplandevtest;
CREATE USER libreplan WITH PASSWORD 'libreplan';
GRANT ALL PRIVILEGES ON DATABASE libreplandev TO libreplan;
GRANT ALL PRIVILEGES ON DATABASE libreplandevtest TO libreplan;
* Set ``postgres`` user password::
@ -185,6 +187,7 @@ openSUSE
* Compile project::
$ cd libreplan/
$ mvn clean install
* Launch application::
@ -275,11 +278,11 @@ profiles defined in ``pom.xml`` of business and webapp modules).
* *dev* - Development environment (default)
It uses databases ``navaldev`` and ``navaldevtest``.
It uses databases ``libreplandev`` and ``libreplandevtest``.
* *prod* - Production environment
Unlike *dev* it uses database ``navalprod`` and `navalprodtest``.
Unlike *dev* it uses database ``libreplanprod`` and `libreplanprodtest``.
It is needed to use it in combination with *postgresql* or *mysql* profiles.
@ -361,10 +364,10 @@ For MySQL users here are specific instructions.
* SQL sentences to create database::
CREATE DATABASE navaldev;
CREATE DATABASE navaldevtest;
GRANT ALL ON navaldev.* to 'naval'@'localhost' identified by 'naval';
GRANT ALL ON navaldevtest.* to 'naval'@'localhost' identified by 'naval';
CREATE DATABASE libreplandev;
CREATE DATABASE libreplandevtest;
GRANT ALL ON libreplandev.* to 'libreplan'@'localhost' identified by 'libreplan';
GRANT ALL ON libreplandevtest.* to 'libreplan'@'localhost' identified by 'libreplan';
* Compile project::

68
INSTALL
View file

@ -35,16 +35,21 @@ Instructions:
* Download the package::
$ wget http://downloads.sourceforge.net/project/libreplan/LibrePlan/libreplan_1.1.1-1_amd64.deb
$ wget http://downloads.sourceforge.net/project/libreplan/files/LibrePlan/libreplan_1.2.0-1_amd64.deb
* Install package::
# dpkg -i libreplan_1.1.1-1_amd64.deb
# dpkg -i libreplan_1.2.0-1_amd64.deb
* Install dependencies::
# apt-get install -f
.. WARNING::
If you have problems with printing support review the last section `Fix
printing in Debian Squeeze`_.
LibrePlan manual installation
-----------------------------
@ -68,15 +73,24 @@ Debian/Ubuntu
* Download database installation script::
$ wget -O install.sql http://downloads.sourceforge.net/project/libreplan/LibrePlan/install_1.1.1.sql
$ wget -O install.sql http://downloads.sourceforge.net/project/librelplan/LibrePlan/install_1.2.0.sql
* Create database structure::
$ psql -h localhost -U libreplan -W libreplan < install.sql
.. WARNING::
It is very important to execute the previous command specifiying
``libreplan`` user (as you can see in the ``-U`` option). Otherwise your
LibrePlan installation is not going to start properly and you could find in
your log files something like that::
JDBCExceptionReporter - ERROR: permission denied for relation entity_sequence
* Download ``.war`` file from SourceForge.net::
$ wget -O libreplan.war http://downloads.sourceforge.net/project/libreplan/LibrePlan/libreplan_1.1.1.war
$ wget -O libreplan.war http://downloads.sourceforge.net/project/libreplan/LibrePlan/libreplan_1.2.0.war
* Create a new file ``/etc/tomcat6/Catalina/localhost/libreplan.xml`` (file
name has to match with ``.war`` name) with database configuration for
@ -128,6 +142,11 @@ Debian/Ubuntu
* Go to http://localhost:8080/libreplan/
.. WARNING::
If you have problems with printing support review the last section `Fix
printing in Debian Squeeze`_.
openSUSE
~~~~~~~~
@ -170,15 +189,24 @@ openSUSE
* Download database installation script::
$ wget -O install.sql http://downloads.sourceforge.net/project/libreplan/LibrePlan/install_1.1.1.sql
$ wget -O install.sql http://downloads.sourceforge.net/project/libreplan/LibrePlan/install_1.2.0.sql
* Create database structure::
$ psql -h localhost -U libreplan -W libreplan < install.sql
.. WARNING::
It is very important to execute the previous command specifiying
``libreplan`` user (as you can see in the ``-U`` option). Otherwise your
LibrePlan installation is not going to start properly and you could find in
your log files something like that::
JDBCExceptionReporter - ERROR: permission denied for relation entity_sequence
* Download ``.war`` file from SourceForge.net::
$ wget -O libreplan.war http://downloads.sourceforge.net/project/libreplan/LibrePlan/libreplan_1.1.1.war
$ wget -O libreplan.war http://downloads.sourceforge.net/project/libreplan/LibrePlan/libreplan_1.2.0.war
* Create a new file ``/etc/tomcat6/Catalina/localhost/libreplan.xml`` (file
name has to match with ``.war`` name) with database configuration for
@ -215,7 +243,33 @@ Logs
Since *LibrePlan 1.1.1* log system is configured automatically creating a new
folder under ``/var/log/tomcat6/`` with ``.war`` name. For example:
``/var/log/tomcat6/libreplan.war``.
``/var/log/tomcat6/libreplan/``.
Inside this new directory there will be two files (``libreplan.log`` and
``libreplan-error.log``) that will be rotated every day.
Fix printing in Debian Squeeze
------------------------------
Since LibrePlan 1.2 printing support is not working properly in Debian Squeeze.
To fix this issue, basically, you have to get a newer version of CutyCapt and
WebKit dependencies from Debian testing.
Instructions:
* Make sure stable remains the default distribution to pull packages from::
# echo 'APT::Default-Release "stable";' >> /etc/apt/apt.conf
* Add a new repository to make testing packages available to ``apt-get``::
# echo "deb http://ftp.debian.org/debian testing main" >> /etc/apt/sources.list
* Refresh package index::
# apt-get update
* Fetch and install ``cutycapt`` (and its dependencies) from testing::
# apt-get -t testing install cutycapt

1403
NEWS

File diff suppressed because it is too large Load diff

107
README
View file

@ -5,32 +5,84 @@ LibrePlan
Description
-----------
*LibrePlan* is a free software web application for project management.
*LibrePlan* is a free software web application for project management,
monitoring and control.
*LibrePlan* is a planning tool for users based on some concepts: company and
multi-project overview, criteria assignments, tasks tagging, resources
management, resource allocation (specific and generic), company load control,
external integration, etc.
*LibrePlan* is a collaborative tool to plan, monitor and control projects and
has a rich web interface which provides a desktop alike user experience. All the
team members can take part in the planning and this makes possible to have a
real-time planning.
It was designed thinking on a scenario where multiple projects and resources
interact to carry out the work inside a company. Besides, it makes possible
the communication with other company tools providing a wide set of web
services to import and export data.
Although its name is clearly related to shipbuilding, *LibrePlan* is a fully
useful planning tool for any type of company whose workflow requires project and
order administration and scheduling.
Features
~~~~~~~~
* Multiproject management. It offers a global vision of the company managing
several projects sharing resources.
* Group resource allocations: dynamic groups based on criteria.
* Flexible calendars.
* Configurable Gantt chart from Work Breakdown Structure (WBS) [1]_.
* Resource Breakdown Structure (RBS) chart [2]_.
* Overload resource allocation control.
* Earned Value Management [3]_.
* Cost analysis based on work reports.
* Integration with other *LibrePlan* instances and third-parties.
* Other functionalities: Materials, quality forms, project templates, planning
scenarios, multiple task progress measurement ...
* Resource management:
* Two type of resources: machines and workers.
* Flexible calendars easily reusable.
* Resource configuration based on skills and roles.
* Planning:
* Simple way to configure and estimate the work to plan. It is carried out
through Work Breakdown Structures (WBS) [1]_.
* Different detail levels during the planning.
* Two ways to allocate resources:
* Specific allocation: Concrete individuals.
* Assisted generic allocation: Based on skills and roles fulfilled by the
resources.
* Templates to reuse work. Projects can be created based on templates for
repeatable tasks being able to save time.
* Automatic resource reallocation in order to minimize overload (overtime).
* Advanced allocation. Manual configuration of daily work hours on a task
when automatic allocation does not suit your needs.
* Monte Carlo method. Statistical simulation to calculate the possibility to
complete a project in a range of dates.
* Projects control and monitoring:
* Company global analysis.
* Earned Value Management [2]_. Project management method to objectively
measure progress and performance of a project.
* Planning quality management. It is possible to control quality of the tasks
to be performed through forms.
* Projects cost analysis.
* Reported hours: worked hours are assigned to each task to track costs during
the planning
* Progress measurement through different unit types.
* Outsourcing
LibrePlan provides support for companies that do outsourcing:
* Project tasks can be outsourced and sent to the LibrePlan installation of
the supplier.
* You can receive progress notifications of the subcontractors to know how
outsourced tasks are evolving .
* Other features:
* Materials. You can manage the materials that planned tasks need to be
carried out.
* Complete users system with permissions, LDAP authentication, etc.
Requirements
@ -77,14 +129,14 @@ The cutting-edge version of this project is always available from the Git
repository at http://libreplan.git.sourceforge.net/.
Released versions are available at
http://sourceforge.net/projects/libreplan/files.
http://sourceforge.net/projects/libreplan/files/.
Webpage
-------
You can find more information about *LibrePlan* at
http://www.libreplan.org/en/.
http://www.libreplan.com/.
For information related with *LibrePlan* development you can visit the wiki at
http://wiki.libreplan.org/.
@ -100,7 +152,7 @@ License
-------
*LibrePlan* is released under the terms of the GNU Affero General Public
License version 3 [4]_.
License version 3 [3]_.
Please read the ``COPYING`` file for details.
@ -109,14 +161,13 @@ Authors
-------
This project is sponsored by *Fundación para o Fomento da Calidade Industrial e
o Desenvolvemento Tecnolóxico de Galicia* [5]_.
o Desenvolvemento Tecnolóxico de Galicia* [4]_.
Please see ``AUTHORS`` file for more information about the authors.
.. [1] http://en.wikipedia.org/wiki/Work_Breakdown_Structure
.. [2] http://en.wikipedia.org/wiki/Resource_Breakdown_Structure
.. [3] http://en.wikipedia.org/wiki/Earned_Value_Management
.. [4] http://www.fsf.org/licensing/licenses/agpl.html
.. [5] http://www.fundacioncalidade.org/
.. [2] http://en.wikipedia.org/wiki/Earned_Value_Management
.. [3] http://www.fsf.org/licensing/licenses/agpl.html
.. [4] http://www.fundacioncalidade.org/

12
UPDATE
View file

@ -26,11 +26,11 @@ Instructions:
* Download the new package::
$ wget http://downloads.sourceforge.net/project/libreplan/LibrePlan/libreplan_1.1.1-1_amd64.deb
$ wget http://downloads.sourceforge.net/project/libreplan/NavalPlan/navalplan_1.1.1-1_amd64.deb
* Install package::
# dpkg -i libreplan_1.1.1-1_amd64.deb
# dpkg -i navalplan_1.1.1-1_amd64.deb
* Install new dependencies if needed::
@ -51,7 +51,7 @@ Debian/Ubuntu
are upgrading from *LibrePlan 1.0.4* to *LibrePlan 1.1.1* you should download
``upgrade_1.1.0.sql``::
$ wget http://downloads.sourceforge.net/project/libreplan/LibrePlan/upgrade_1.1.0.sql
$ wget http://downloads.sourceforge.net/project/libreplan/NavalPlan/upgrade_1.1.0.sql
* Upgrade database::
@ -59,7 +59,7 @@ Debian/Ubuntu
* Download ``.war`` file of new version from SourceForge.net::
$ wget -O libreplan.war http://downloads.sourceforge.net/project/libreplan/LibrePlan/libreplan_1.1.1.war
$ wget -O libreplan.war http://downloads.sourceforge.net/project/libreplan/NavalPlan/navalplan_1.1.1.war
* Backup current deployed application::
@ -87,7 +87,7 @@ openSUSE
are upgrading from *LibrePlan 1.0.4* to *LibrePlan 1.1.1* you should download
``upgrade_1.1.0.sql``::
$ wget http://downloads.sourceforge.net/project/libreplan/LibrePlan/upgrade_1.1.0.sql
$ wget http://downloads.sourceforge.net/project/libreplan/NavalPlan/upgrade_1.1.0.sql
* Upgrade database::
@ -95,7 +95,7 @@ openSUSE
* Download ``.war`` file of new version from SourceForge.net::
$ wget -O libreplan.war http://downloads.sourceforge.net/project/libreplan/LibrePlan/libreplan_1.1.1.war
$ wget -O libreplan.war http://downloads.sourceforge.net/project/libreplan/NavalPlan/navalplan_1.1.1.war
* Backup current deployed application::

46
debian/changelog vendored
View file

@ -1,4 +1,12 @@
libreplan (1.1.3-1) maverick; urgency=low
libreplan (1.2.0-1) maverick; urgency=low
* Released LibrePlan 1.2.0
* Created a transitional package navalplan-1.2.0-1 in order to ease the
migration from NavalPlan 1.1 to LibrePlan 1.2
-- Manuel Rego Casasnovas <rego@igalia.com> Thu, 01 Dec 2011 16:40:00 +0100
navalplan (1.1.3-1) maverick; urgency=low
* Fixed important issue in Gantt view for big projects with labels.
* Added bugs fixed from stable branch.
@ -6,7 +14,7 @@ libreplan (1.1.3-1) maverick; urgency=low
-- Manuel Rego Casasnovas <rego@igalia.com> Fri, 12 Aug 2011 13:08:00 +0200
libreplan (1.1.2-1) maverick; urgency=low
navalplan (1.1.2-1) maverick; urgency=low
* Fixed critical bug that causes concurrency issues editing projects with
labels.
@ -15,7 +23,7 @@ libreplan (1.1.2-1) maverick; urgency=low
-- Manuel Rego Casasnovas <rego@igalia.com> Wed, 18 Jul 2011 13:23:00 +0200
libreplan (1.1.1-1) maverick; urgency=low
navalplan (1.1.1-1) maverick; urgency=low
* Changed dependency from OpenJDK to default-jdk or default-jre.
* Added bugs fixed from stable branch.
@ -23,7 +31,7 @@ libreplan (1.1.1-1) maverick; urgency=low
-- Manuel Rego Casasnovas <rego@igalia.com> Wed, 07 Jun 2011 09:15:00 +0200
libreplan (1.1.0-1) maverick; urgency=low
navalplan (1.1.0-1) maverick; urgency=low
* Removed unnecessary dependency with texlive-latex-recommended and pgf
packages.
@ -33,35 +41,35 @@ libreplan (1.1.0-1) maverick; urgency=low
-- Manuel Rego Casasnovas <mrego@igalia.com> Wed, 19 Apr 2011 07:50:00 +0200
libreplan (1.0.6-1) maverick; urgency=low
navalplan (1.0.6-1) maverick; urgency=low
* Several important bugs fixed during 1.1 stabilization.
* Released version 1.0.6.
-- Manuel Rego Casasnovas <mrego@igalia.com> Tue, 27 Apr 2011 11:49:00 +0200
libreplan (1.0.5-1) maverick; urgency=low
navalplan (1.0.5-1) maverick; urgency=low
* Added bugs fixed from stable branch.
* Released version 1.0.5.
-- Manuel Rego Casasnovas <mrego@igalia.com> Fri, 08 Apr 2011 11:20:46 +0200
libreplan (1.0.4-1) maverick; urgency=low
navalplan (1.0.4-1) maverick; urgency=low
* Added bugs fixed from stable branch.
* Released version 1.0.4.
-- Manuel Rego Casasnovas <mrego@igalia.com> Thu, 17 Mar 2011 12:27:47 +0100
libreplan (1.0.3-1) maverick; urgency=low
navalplan (1.0.3-1) maverick; urgency=low
* Added bugs fixed from stable branch.
* Released version 1.0.3.
-- Manuel Rego Casasnovas <mrego@igalia.com> Mon, 14 Feb 2011 07:23:58 +0100
libreplan (1.0.2-1) maverick; urgency=low
navalplan (1.0.2-1) maverick; urgency=low
* Fixed database installation script.
* Added bugfixed from stable branch.
@ -69,7 +77,7 @@ libreplan (1.0.2-1) maverick; urgency=low
-- Manuel Rego Casasnovas <mrego@igalia.com> Fri, 21 Jan 2011 12:07:33 +0100
libreplan (1.0.1-1) maverick; urgency=low
navalplan (1.0.1-1) maverick; urgency=low
* Added dependency with ttf-freefont on Debian package (needed for Jasper
reports).
@ -78,7 +86,7 @@ libreplan (1.0.1-1) maverick; urgency=low
-- Manuel Rego Casasnovas <mrego@erizana> Fri, 14 Jan 2011 09:58:33 +0100
libreplan (1.0.0-1) maverick; urgency=low
navalplan (1.0.0-1) maverick; urgency=low
* Updated to upstream. Released version 1.0.
* Added upgrade script needed to upgrade to version 1.0.
@ -86,33 +94,33 @@ libreplan (1.0.0-1) maverick; urgency=low
-- Manuel Rego Casasnovas <mrego@igalia.com> Tue, 07 Jan 2011 16:45:00 +0100
libreplan (0.9.2-3) maverick; urgency=low
navalplan (0.9.2-3) maverick; urgency=low
* Added missing postgresql dependency.
-- Manuel Rego Casasnovas <mrego@igalia.com> Tue, 07 Jan 2011 10:00:00 +0100
libreplan (0.9.2-2) maverick; urgency=low
navalplan (0.9.2-2) maverick; urgency=low
* Added postgresql-client dependency needed because of dbconfig.
-- Manuel Rego Casasnovas <mrego@igalia.com> Tue, 05 Jan 2011 16:12:00 +0100
libreplan (0.9.2-1) maverick; urgency=low
navalplan (0.9.2-1) maverick; urgency=low
* Updated to upstream.
* Fixed issues on debian package.
-- Manuel Rego Casasnovas <mrego@igalia.com> Tue, 04 Jan 2011 15:58:19 +0100
libreplan (0.9.1) maverick; urgency=low
navalplan (0.9.1) maverick; urgency=low
* Updated to upstream.
* Fixed problems with translations.
-- Manuel Rego Casasnovas <mrego@igalia.com> Thu, 23 Dec 2010 00:14:54 +0100
libreplan (0.9.0) maverick; urgency=low
navalplan (0.9.0) maverick; urgency=low
* Updated to upstream.
* Fixed issues with context.xml file.
@ -121,19 +129,19 @@ libreplan (0.9.0) maverick; urgency=low
-- Manuel Rego Casasnovas <mrego@igalia.com> Tue, 21 Dec 2010 17:31:08 +0100
libreplan (20100908) lucid; urgency=low
navalplan (20100908) lucid; urgency=low
* Updated to upstream.
-- Jose Maria Casanova Crespo (Chema) <jmcasanova@igalia.com> Wed, 8 Sep 2010 00:00:00 +0000
libreplan (20100415) karmic; urgency=low
navalplan (20100415) karmic; urgency=low
* Updated to upstream.
-- Jose Maria Casanova Crespo (Chema) <jmcasanova@igalia.com> Thu, 15 Mar 2010 14:30:00 +0000
libreplan (20100324) karmic; urgency=low
navalplan (20100324) karmic; urgency=low
* Initial release.

25
debian/control vendored
View file

@ -5,19 +5,32 @@ Maintainer: Adrian Perez <aperez@igalia.com>
Build-Depends: debhelper (>= 7.0.50), maven2, python-docutils,
gettext (>= 0.17), default-jdk
Standards-Version: 3.8.4
Homepage: http://www.libreplan.org/en/
Homepage: http://www.libreplan.com/
Package: libreplan
Architecture: any
Depends: cutycapt, postgresql, postgresql-client, xvfb, dbconfig-common, ucf,
tomcat6, default-jre-headless | default-jre, libpg-java, ttf-freefont,
${misc:Depends}
Description: Web application for project management.
LibrePlan is a planning tool for users based on some concepts: company and
Description: Web application for project planning, monitoring and control.
LibrePlan is a collaborative tool to plan, monitor and control projects and has
a rich web interface which provides a desktop alike user experience. All the
team members can take part in the planning and this makes possible to have a
real-time planning.
.
It was designed thinking on a scenario where multiple projects and resources
interact to carry out the work inside a company. Besides, it makes possible
the communication with other company tools providing a wide set of web
services to import and export data.
Package: navalplan
Architecture: all
Pre-Depends: libreplan (>= 1.2.0-1)
Depends: ${misc:Depends}
Description: Web application for project management (transitional package)
NavalPlan is a planning tool for users based on some concepts: company and
multi-project overview, criteria assignments, tasks tagging, resources
management, resource allocation (specific and generic), company load control,
external integration, etc.
.
Although its name is clearly related to shipbuilding, LibrePlan is a fully
useful planning tool for any type of company whose workflow requires project
and order administration and scheduling.
This package can be safely deleted after Libreplan is successfully installed.

27
debian/control.lucid vendored
View file

@ -3,21 +3,34 @@ Section: web
Priority: optional
Maintainer: Adrian Perez <aperez@igalia.com>
Build-Depends: debhelper (>= 7.0.50), maven2, python-docutils,
gettext (>= 0.17), texlive-latex-recommended, pgf, openjdk-6-jdk
gettext (>= 0.17), openjdk-6-jdk
Standards-Version: 3.8.4
Homepage: http://www.libreplan.org/en/
Homepage: http://www.libreplan.com/
Package: libreplan
Architecture: any
Depends: cutycapt, postgresql, postgresql-client, xvfb, dbconfig-common, ucf,
tomcat6, openjdk-6-jre-headless | openjdk-6-jre, libpg-java, ttf-freefont,
${misc:Depends}
Description: Web application for project management.
LibrePlan is a planning tool for users based on some concepts: company and
Description: Web application for project planning, monitoring and control.
LibrePlan is a collaborative tool to plan, monitor and control projects and has
a rich web interface which provides a desktop alike user experience. All the
team members can take part in the planning and this makes possible to have a
real-time planning.
.
It was designed thinking on a scenario where multiple projects and resources
interact to carry out the work inside a company. Besides, it makes possible
the communication with other company tools providing a wide set of web
services to import and export data.
Package: navalplan
Architecture: all
Pre-Depends: libreplan (>= 1.2.0-1)
Depends: ${misc:Depends}
Description: Web application for project management (transitional package)
NavalPlan is a planning tool for users based on some concepts: company and
multi-project overview, criteria assignments, tasks tagging, resources
management, resource allocation (specific and generic), company load control,
external integration, etc.
.
Although its name is clearly related to shipbuilding, LibrePlan is a fully
useful planning tool for any type of company whose workflow requires project
and order administration and scheduling.
This package can be safely deleted after Libreplan is successfully installed.

View file

@ -3,21 +3,34 @@ Section: web
Priority: optional
Maintainer: Adrian Perez <aperez@igalia.com>
Build-Depends: debhelper (>= 7.0.50), maven2, python-docutils,
gettext (>= 0.17), texlive-latex-recommended, pgf, openjdk-6-jdk
gettext (>= 0.17), openjdk-6-jdk
Standards-Version: 3.8.4
Homepage: http://www.libreplan.org/en/
Homepage: http://www.libreplan.com/
Package: libreplan
Architecture: any
Depends: cutycapt, postgresql, postgresql-client, xvfb, dbconfig-common, ucf,
tomcat6, openjdk-6-jre-headless | openjdk-6-jre, libpg-java, ttf-freefont,
${misc:Depends}
Description: Web application for project management.
LibrePlan is a planning tool for users based on some concepts: company and
Description: Web application for project planning, monitoring and control.
LibrePlan is a collaborative tool to plan, monitor and control projects and has
a rich web interface which provides a desktop alike user experience. All the
team members can take part in the planning and this makes possible to have a
real-time planning.
.
It was designed thinking on a scenario where multiple projects and resources
interact to carry out the work inside a company. Besides, it makes possible
the communication with other company tools providing a wide set of web
services to import and export data.
Package: navalplan
Architecture: all
Pre-Depends: libreplan (>= 1.2.0-1)
Depends: ${misc:Depends}
Description: Web application for project management (transitional package)
NavalPlan is a planning tool for users based on some concepts: company and
multi-project overview, criteria assignments, tasks tagging, resources
management, resource allocation (specific and generic), company load control,
external integration, etc.
.
Although its name is clearly related to shipbuilding, LibrePlan is a fully
useful planning tool for any type of company whose workflow requires project
and order administration and scheduling.
This package can be safely deleted after Libreplan is successfully installed.

View file

@ -3,4 +3,4 @@ debian/tmp/etc/tomcat6/policy.d/51libreplan.policy
debian/tmp/usr/share/dbconfig-common/data/libreplan/install/pgsql
debian/tmp/usr/share/dbconfig-common/data/libreplan/upgrade/pgsql/1.0.0
debian/tmp/usr/share/dbconfig-common/data/libreplan/upgrade/pgsql/1.1.0
debian/tmp/usr/share/tomcat6/lib/postgresql-jdbc3.jar
debian/tmp/usr/share/dbconfig-common/data/libreplan/upgrade/pgsql/1.2.0

View file

@ -68,6 +68,9 @@ then
fi
if [ ! -L /usr/share/tomcat6/lib/postgresql-jdbc3.jar ] ; then
ln -sf /usr/share/java/postgresql-jdbc3.jar /usr/share/tomcat6/lib/
fi
if [ -x /etc/init.d/tomcat6 ] ; then
if [ -x "$(which invoke-rc.d 2> /dev/null)" ] ; then

26
debian/navalplan.postinst vendored Executable file
View file

@ -0,0 +1,26 @@
#! /bin/bash
if [[ $1 = configure ]]
then
# Remove old deployment directory as it's no longer necessary.
if [ -d /var/lib/tomcat6/webapps/navalplan/ ] ; then
rm -r /var/lib/tomcat6/webapps/navalplan/
fi
# Make sure the driver is there, as it might be removed when
# uninstalling older versions of the package.
if [ ! -L /usr/share/tomcat6/lib/postgresql-jdbc3.jar ] ; then
ln -sf /usr/share/java/postgresql-jdbc3.jar /usr/share/tomcat6/lib/
fi
# Start tomcat again
if [ -x /etc/init.d/tomcat6 ] ; then
if [ -x "$(which invoke-rc.d 2> /dev/null)" ] ; then
invoke-rc.d tomcat6 start
else
/etc/init.d/tomcat6 start
fi
fi
fi
#DEBHELPER#

95
debian/navalplan.preinst vendored Executable file
View file

@ -0,0 +1,95 @@
#! /bin/bash
base_dbconfig_data_dir="/usr/share/dbconfig-common/data"
install_upgrade_to() {
upgrade_file="$base_dbconfig_data_dir/libreplan/upgrade/pgsql/$1"
echo "Applying SQL statements to upgrade to version $1..."
push_sql_from_file_as_user $upgrade_file $navalplan_user $navalplan_db
}
push_sql_from_file_as_user() {
filepath=$1
username=$2
database=$3
psql -U $username -h $database_host \
$database < $filepath > /dev/null 2>&1
}
execute_sql_as_admin() {
sql=$1
su - -s /bin/sh $navalplan_admin_user -c "psql -c \"$sql\"" > /dev/null
}
if [[ $1 = upgrade && -r /etc/dbconfig-common/libreplan.conf
&& -r /etc/dbconfig-common/navalplan.conf ]]
then
old_version=$2
. /etc/dbconfig-common/libreplan.conf
libreplan_user=${dbc_dbuser}
libreplan_passwd=${dbc_dbpass}
libreplan_db=${dbc_dbname}
. /etc/dbconfig-common/navalplan.conf
navalplan_user=${dbc_dbuser}
navalplan_passwd=${dbc_dbpass}
navalplan_db=${dbc_dbname}
navalplan_admin_user=${dbc_dbadmin}
if [ -z "${dbc_dbhost}" ] ; then
database_host='localhost'
else
database_host=${dbc_dbhost}
fi
export PGPASSFILE=`mktemp`
chmod 600 $PGPASSFILE
old_db_dump=`mktemp`
chown $navalplan_admin_user:root $old_db_dump;
chmod 660 $old_db_dump;
# Stop tomcat to flush active connections.
if [ -x /etc/init.d/tomcat6 ] ; then
if [ -x "$(which invoke-rc.d 2> /dev/null)" ] ; then
invoke-rc.d tomcat6 stop
else
/etc/init.d/tomcat6 stop
fi
fi
echo "Dropping newly created empty database...";
execute_sql_as_admin "DROP DATABASE $libreplan_db;"
echo "Trying to apply upgrades to old database..."
echo "*:*:*:*:$navalplan_passwd" > $PGPASSFILE
dpkg --compare-versions $old_version "<<" "1.0.0-1"
if [ $? -eq 0 ]; then
install_upgrade_to "1.0.0"
fi
dpkg --compare-versions $old_version "<<" "1.1.0-1"
if [ $? -eq 0 ]; then
install_upgrade_to "1.1.0"
fi
dpkg --compare-versions $old_version "<<" "1.2.0-1"
if [ $? -eq 0 ]; then
install_upgrade_to "1.2.0"
fi
echo "Dumping old database..."
su - -s /bin/sh $navalplan_admin_user -c "pg_dump $navalplan_db >> $old_db_dump" > /dev/null
echo "Creating and populating new database...";
execute_sql_as_admin "CREATE DATABASE $libreplan_db;"
execute_sql_as_admin "GRANT ALL PRIVILEGES ON DATABASE $libreplan_db TO $libreplan_user;"
execute_sql_as_admin "ALTER DATABASE $libreplan_db OWNER TO $libreplan_user;"
echo "*:*:*:*:$libreplan_passwd" > $PGPASSFILE
push_sql_from_file_as_user $old_db_dump $libreplan_user $libreplan_db
rm $PGPASSFILE $old_db_dump
fi
#DEBHELPER#

7
debian/rules vendored
View file

@ -81,13 +81,16 @@ install:
# Copy SQL upgrade script for version 1.1.0
$(call CMD,cp $(CURDIR)/scripts/database/upgrade_1.1.0.sql \
$(CURDIR)/debian/tmp/usr/share/dbconfig-common/data/libreplan/upgrade/pgsql/1.1.0)
# Copy SQL upgrade script for version 1.2.0
$(call CMD,cp $(CURDIR)/scripts/database/upgrade_1.2.0.sql \
$(CURDIR)/debian/tmp/usr/share/dbconfig-common/data/libreplan/upgrade/pgsql/1.2.0)
# Install Policy file
$(call CMD,mkdir -p $(CURDIR)/debian/tmp/etc/tomcat6/policy.d)
$(call CMD,cp $(CURDIR)/debian/51libreplan.policy \
$(CURDIR)/debian/tmp/etc/tomcat6/policy.d/)
# Link Java PostgreSQL library
$(call CMD,mkdir -p $(CURDIR)/debian/tmp/usr/share/tomcat6/lib)
$(call CMD,ln -sf /usr/share/java/postgresql-jdbc3.jar $(CURDIR)/debian/tmp/usr/share/tomcat6/lib)
#$(call CMD,mkdir -p $(CURDIR)/debian/tmp/usr/share/tomcat6/lib)
#$(call CMD,ln -sf /usr/share/java/postgresql-jdbc3.jar $(CURDIR)/debian/tmp/usr/share/tomcat6/lib)
$(call CMD,dh_install)
binary-indep: build install

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

View file

@ -44,9 +44,9 @@ work as ``.zul`` page still does not exist.
If you want to run LibrePlan in development mode you need to follow the next
instructions:
* Create a PostgreSQL database called ``navaldev`` with permissions for a
user ``naval`` with password ``naval`` (see ``INSTALL`` file for other
databases and more info).
* Create a PostgreSQL database called ``libreplandev`` with permissions for a
user ``libreplan`` with password ``libreplan`` (see ``INSTALL`` file for
other databases and more info).
* Compile LibrePlan with the following command from project root folder::
@ -381,7 +381,7 @@ Now you have defined a very basic report layout using some common elements
with other LibrePlan reports like header and footer. The result in iReport would
be something similar to the screenshot.
.. figure:: ireport-resources-list-report.png
.. figure:: img/ireport-resources-list-report.png
:alt: iRerpot screenshot for Resources List report
:width: 100%
@ -568,7 +568,7 @@ are able to see how the basic functionality of JasperReports in LibrePlan is
integrated. The next step will be to show real data in the report getting it
from database.
.. figure:: resources-list-report-example-data-pdf.png
.. figure:: img/resources-list-report-example-data-pdf.png
:alt: Resources List report with example data in PDF format
:width: 100%

View file

@ -82,9 +82,9 @@ this behaviour and use it in all the tasks they want.
If you want to run LibrePlan in development mode you need to follow the next
instructions:
* Create a PostgreSQL database called ``navaldev`` with permissions for a
user ``naval`` with password ``naval`` (see ``HACKING`` file for other
databases and more info).
* Create a PostgreSQL database called ``libreplandev`` with permissions for a
user ``libreplan`` with password ``libreplan`` (see ``HACKING`` file for
other databases and more info).
* Compile LibrePlan with the following command from project root folder::
@ -2637,7 +2637,7 @@ developing new web services. For each web service, some test scripts are
provided in order to check implementation.
.. _LibrePlan: http://www.libreplan.org/en/
.. _LibrePlan: http://www.libreplan.com/
.. _CRUD: http://en.wikipedia.org/wiki/Create,_read,_update_and_delete
.. _Hibernate: http://www.hibernate.org/
.. _`Optimistic Locking`: http://en.wikipedia.org/wiki/Optimistic_locking

View file

@ -5,9 +5,9 @@ $ sudo apt-get install postgresql
$ sudo su -c "psql" postgres
<----------------- Executar os seguintes comandos SQL ----------
create database navaldev;
create user naval with password 'naval';
grant all privileges on database navaldev to naval;
create database libreplandev;
create user libreplan with password 'libreplan';
grant all privileges on database libreplandev to libreplan;
\q
------------------------------------------------------------------
@ -40,9 +40,9 @@ para permitir o acceso a base de datos
<Resource name="jdbc/libreplan-ds" auth="Container"
type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="naval" password="naval"
username="libreplan" password="libreplan"
driverClassName="org.postgresql.Driver"
url="jdbc:postgresql://localhost/navaldev"/>
url="jdbc:postgresql://localhost/libreplandev"/>
...
</Context>
---------------------- ---------------------------------------
@ -96,4 +96,4 @@ Neste intre a aplicación debería estar accesible en : http://localhost:8080/li
------------------------------------------------------------------------
Se quixeramos facer un volcado da base de datos so precisariamos empregar o seguinte comando, isto non é necesario para a instalación.
$ pg_dump -h localhost -U naval -c -F p -v -f bdxestionproducion.dump navaldev
$ pg_dump -h localhost -U libreplan -c -F p -v -f bdxestionproducion.dump libreplandev

View file

@ -0,0 +1,196 @@
How To Start Development With Eclipse
=====================================
.. sectnum::
:Author: Manuel Rego Casasnovas
:Contact: rego@igalia.com
:Date: 16/12/2011
:Copyright:
Some rights reserved. This document is distributed under the Creative
Commons Attribution-ShareAlike 3.0 licence, available in
http://creativecommons.org/licenses/by-sa/3.0/.
:Abstract:
Quick guide to start the development of LibrePlan_ using Eclipse_ IDE.
As this is the most common way of work among LibrePlan developers team.
.. contents:: Table of Contents
Download LibrePlan source code
------------------------------
You need to download LibrePlan_ source code to start hacking on it. You have two
options:
a) Clone Git repository (recommended)::
$ git clone git://libreplan.git.sourceforge.net/gitroot/libreplan/libreplan libreplan
b) Download last version source code::
$ wget http://downloads.sourceforge.net/project/libreplan/files/LibrePlan/libreplan_1.2.0.tar.gz
$ tar -xzvf libreplan_1.2.0.tar.gz
You should review ``HACKING`` file to check that you have installed all the
requirements.
Download Eclipse Java EE
------------------------
* Go to download Eclipse page: http://www.eclipse.org/downloads/
* Download Eclipse IDE for **Java EE Developers** for your architecture
.. figure:: img/libreplan-download-eclipse.png
:alt: Eclipse downloads webpage
:width: 100%
Eclipse downloads webpage
Install Ecliplse
----------------
* Go to ``/opt/`` (or any other folder when you want to install Eclipse)::
# cd /opt/
* Uncompress downloaded file and set proper permissions::
# tar -xzvf ~/Downloads/eclipse-jee-indigo-SR1-linux-gtk-x86_64.tar.gz
# chown -R root:root eclipse/
* Add symbolic link to launch Eclipse::
# cd /usr/local/bin/
# ln -s /opt/eclipse/eclipse
Install Eclipse Maven plugin (m2e)
----------------------------------
* Run Eclipse::
$ eclipse
* Choose your workspace folder (or accept the default one) and mark to don't ask
about it again
* Go to *Help* > *Install New Software...*
* Click in option *Add* and set the following values and click *Ok*:
* Name: m2e
* Location: http://download.eclipse.org/technology/m2e/releases/
* Click *Next* to install plugin
.. figure:: img/libreplan-m2e.png
:alt: Instal Eclipse Maven plugin (m2e)
:width: 100%
Install Eclipse Maven plugin (m2e)
* Accept license agreements and click *Finish*
* Restart Eclipse once plugin installation has finished
Import LibrePlan project
------------------------
* Go to *File* > *Import*
* Select as import source *Maven* > *Exising Maven Projects* and click *Next*
.. figure:: img/libreplan-import-maven.png
:alt: Import LibrePlan as Maven project
:width: 100%
Import LibrePlan as Maven project
* Set as *Root Directory* the path where you downloaded LibrePlan source code
* Then mark all projects and click *Finish*
.. figure:: img/libreplan-poms.png
:alt: Import LibrePlan from existent path
:width: 100%
Import LibrePlan from existent path
* It is recommended to close ``libreplan`` project (right click over the project
and choose *Close*)
Configure project to run
------------------------
* Go to *Run* > *Run Configurations...*
* Create a new *Maven Build* called *New_configuration*
* Change the following values:
* Name: LibrePlan
* Base directory: Choose ``libreplan-webapp`` folder in your workspace
* Goals: ``jetty:stop jetty:run``
* Profiles (optional): ``-userguide,-reports`` (to disable userguide and
reports profiles to save compilation time as they are not mandatory to run
LibrePlan)
* Mark the following checkboxes (recommended):
* Resolve Workspace artifacts
* Update Snapshots
* Skip Tests
.. figure:: img/libreplan-run-configurations.png
:alt: Configure how to run LibrePlan in Eclipse
:width: 100%
Configure how to run LibrePlan in Eclipse
* Click *Run* and application will be available at
http://localhost:8080/libreplan-webapp/
Configure Eclipse to follow coding style guidelines
---------------------------------------------------
* Go to *Window* > *Preferences*
* Look for the different options to use always spaces instead of tabs and use 4
spaces size for indentation
.. figure:: img/libreplan-preferences-tab.png
:alt: Eclipse Preferences window
:width: 100%
Eclipse Preferences window
* Create new profile to follow the coding style guidelines
.. figure:: img/libreplan-eclipse-profile.png
:alt: New profile based on Eclipse default one
:width: 100%
New profile based on Eclipse default one
* Configure *Save Actions* marking the following options:
* Perform the selected actions on save
* Format source code
* Format edited lines
* Organize imports
.. figure:: img/libreplan-preferences-save-actions.png
:alt: Save Actions configuration
:width: 100%
Save Actions configuration
.. _LibrePlan: http://www.libreplan.com/
.. _Eclipse: http://www.eclipse.org

View file

Before

Width:  |  Height:  |  Size: 131 KiB

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 316 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

View file

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 40 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

@ -6,7 +6,7 @@ Introduction
The purpose of this document is to describe the features of LibrePlan and provide user information on how to configure and use the application.
LibrePlan is an opensource web application for project planning. Its main goal is to provide a complete solution for company project management.
For any specific information you may need about this software, please contact the development team at http://www.libreplan.org/en/contact
For any specific information you may need about this software, please contact the development team at http://www.libreplan.com/contact/
.. figure:: images/company_view.png

View file

@ -4,16 +4,20 @@ Assignment of resources
.. asigacion_
.. contents::
The assignment of resources is one of the program's most important features, and can be carried out in two different ways:
The assignment of resources is one of the program's most important features,
and can be carried out in two different ways:
* Specific assignment.
* Generic assignment.
Both types of assignment are explained in the following sections.
To carry out either of the two types of resource assignment, the following steps are necessary:
To carry out either of the two types of resource assignment, the following
steps are necessary:
* Go to the planning of an order.
* Right click on the task to be planned.
.. figure:: images/resource-assignment-planning.png
@ -23,16 +27,37 @@ To carry out either of the two types of resource assignment, the following steps
* The program shows a screen in which the following information can be viewed:
* List of criteria that must be fulfilled. For each hour group, a list of hour groups is shown, each of which requires a list of criteria.
* Task information: start and end date of the task.
* Type of calculation: The system allows users to choose the strategy to be used to calculate assignments:
* List of criteria that must be fulfilled. For each hour group, a list of
hour groups is shown, each of which requires a list of criteria.
* Calculate number of hours: This calculates the number of hours required to be devoted to the assigned resources, which are given an end date and a resource number per day.
* Calculate end date: This calculates the end date of the task based on the number of task resources and the total number of hours to finish the task.
* Calculate number of resources: This calculates the number of resources required to finish the task on a specific date and devotes a known number of hours to them.
* Task information: start and end date of the task.
* Recommended assignment: This option allows the program to gather criteria that must be fulfilled and the total number of hours from all hour groups, and then recommends a generic assignment. If there was a prior assignment, the system deletes it and replaces it with the new one.
* Assignments: A list of assignments that have been carried out. This list shows the generic assignments (the number will be the list of fulfilled criteria, and the number of hours and resources per day). Every assignment carried out can be explicitly removed by clicking the delete button.
* Type of calculation: The system allows users to choose the strategy to
be used to calculate assignments:
* Calculate number of hours: This calculates the number of hours
required to be devoted to the assigned resources, which are given an
end date and a resource number per day.
* Calculate end date: This calculates the end date of the task based on
the number of task resources and the total number of hours to finish
the task.
* Calculate number of resources: This calculates the number of resources
required to finish the task on a specific date and devotes a known
number of hours to them.
* Recommended assignment: This option allows the program to gather
criteria that must be fulfilled and the total number of hours from all
hour groups, and then recommends a generic assignment. If there was
a prior assignment, the system deletes it and replaces it with the new
one.
* Assignments: A list of assignments that have been carried out. This list
shows the generic assignments (the number will be the list of fulfilled
criteria, and the number of hours and resources per day). Every
assignment carried out can be explicitly removed by clicking the delete
button.
.. figure:: images/resource-assignment.png
:scale: 50
@ -40,7 +65,9 @@ To carry out either of the two types of resource assignment, the following steps
Resource assignment
* Users select "Search resources".
* The program shows a new screen consisting of a criteria tree and a list to the right of workers that fulfil the selected criteria:
* The program shows a new screen consisting of a criteria tree and a list to
the right of workers that fulfil the selected criteria:
.. figure:: images/resource-assignment-search.png
:scale: 50
@ -49,22 +76,34 @@ To carry out either of the two types of resource assignment, the following steps
* Users can select:
* Specific assignment. See the "Specific assignment" section to find out what is involved when choosing this option.
* Generic assignment. See the "Generic assignment" section to find out what is involved when choosing this option.
* Specific assignment. See the "Specific assignment" section to find out
what is involved when choosing this option.
* Users select a list of criteria (generic) or a list of workers (specific). A multiple-choice selection is performed by pressing the "Ctrl" button when clicking each worker/criterion.
* Generic assignment. See the "Generic assignment" section to find out
what is involved when choosing this option.
* Users then click the "Select" button. It is important to remember that if a generic assignment is not marked, users need to choose a worker or machine to perform an assignment. If this is not done, it is sufficient for users to choose one or several criteria.
* Users select a list of criteria (generic) or a list of workers (specific).
A multiple-choice selection is performed by pressing the "Ctrl" button
when clicking each worker/criterion.
* The program then shows the selected criteria or resource list on the list of assignments from the original resource assignment screen.
* Users then click the "Select" button. It is important to remember that if
a generic assignment is not marked, users need to choose a worker or
machine to perform an assignment. If this is not done, it is sufficient
for users to choose one or several criteria.
* Users must choose the hours or resources per day depending on the assignment method used on the program.
* The program then shows the selected criteria or resource list on the list
of assignments from the original resource assignment screen.
* Users must choose the hours or resources per day depending on the
assignment method used on the program.
Specific assignment
===================
This is the specific assignment of a resource to a project task, i.e. the user decides which specific "name and surname(s)" or "machine" must be assigned to a task.
This is the specific assignment of a resource to a project task, i.e. the
user decides which specific "name and surname(s)" or "machine" must be
assigned to a task.
Specific assignment can be carried out on the screen shown in this image:
@ -74,20 +113,38 @@ Specific assignment can be carried out on the screen shown in this image:
Specific resource assignment
When a resource is specifically assigned, the program creates daily assignments in relation to the percentage of daily assigned resources selected, by previously comparing it with the available resource calendar. For example, an assignment of 0.5 resources for a 32-hour task means that 4 hours per day are assigned to the specific resource to fulfil the task (supposing a working calendar of 8 hours per day).
When a resource is specifically assigned, the program creates daily
assignments in relation to the percentage of daily assigned resources
selected, by previously comparing it with the available resource calendar.
For example, an assignment of 0.5 resources for a 32-hour task means that
4 hours per day are assigned to the specific resource to fulfil the
task (supposing a working calendar of 8 hours per day).
Specific machine assignment
---------------------------
Specific machine assignment functions in the same way as that for workers. When a machine is assigned a task, the system stores a specific assignment of hours for the chosen machine. The main difference is that the system searches the list of assigned workers or criteria at the moment the machine is assigned:
Specific machine assignment functions in the same way as that for workers.
When a machine is assigned a task, the system stores a specific assignment
of hours for the chosen machine. The main difference is that the system
searches the list of assigned workers or criteria at the moment the machine
is assigned:
* If the machine has a list of assigned workers, the program chooses from those that are required by the machine for the assigned calendar. For example, if the machine calendar is 16 hours per day and the resource calendar is 8 hours, two resources are assigned from the list of available resources.
* If the machine has one or several assigned criteria, generic assignments are carried out from among the resources that fulfil the criteria assigned to the machine.
* If the machine has a list of assigned workers, the program chooses from
those that are required by the machine for the assigned calendar. For
example, if the machine calendar is 16 hours per day and the resource
calendar is 8 hours, two resources are assigned from the list of available
resources.
* If the machine has one or several assigned criteria, generic assignments
are carried out from among the resources that fulfil the criteria assigned
to the machine.
Generic assignment
==================
Generic assignment occurs when users do not choose resources specifically, but leave the decision to the program, which distributes the loads among the company's available resources.
Generic assignment occurs when users do not choose resources specifically,
but leave the decision to the program, which distributes the loads among the
company's available resources.
.. figure:: images/asignacion-xenerica.png
:scale: 50
@ -97,42 +154,77 @@ Generic assignment occurs when users do not choose resources specifically, but l
The assignment system uses the following assumptions as a basis:
* Tasks have criteria that are required from resources.
* Resources are configured to fulfil criteria.
However, the system does not fail when criteria have not been assigned, but when all resources fulfil the non-requirement of criteria.
However, the system does not fail when criteria have not been assigned, but
when all resources fulfil the non-requirement of criteria.
The generic assignment algorithm functions in the following way:
* All resources and days are treated as containers where daily assignment of hours fit, based on the maximum assignment capacity in the task calendar.
* All resources and days are treated as containers where daily assignment of
hours fit, based on the maximum assignment capacity in the task calendar.
* The system searches for the resources that fulfil the criterion.
* The system analyses which assignments currently have different resources that fulfil criteria.
* The resources that fulfil the criteria are chosen from those that have sufficient availability.
* If freer resources are not available, assignments are made to the resources that have less availability.
* Over-assignment of resources only starts when all the resources that fulfil the respective criteria are 100% assigned until the total amount required to carry out the task is attained.
* The system analyses which assignments currently have different resources
that fulfil criteria.
* The resources that fulfil the criteria are chosen from those that have
sufficient availability.
* If freer resources are not available, assignments are made to the
resources that have less availability.
* Over-assignment of resources only starts when all the resources that
fulfil the respective criteria are 100% assigned until the total amount
required to carry out the task is attained.
Generic machine assignment
--------------------------
Generic machine assignment functions in the same way as worker assignment. For example, when a machine is assigned to a task, the system stores a generic assignment of hours for all machines that fulfil the criteria as described for the resources in general. However, in addition, the system performs the following procedure for machines:
Generic machine assignment functions in the same way as worker assignment.
For example, when a machine is assigned to a task, the system stores
a generic assignment of hours for all machines that fulfil the criteria as
described for the resources in general. However, in addition, the system
performs the following procedure for machines:
* For all machines chosen for generic assignment:
* It collects the machine's configuration information: alpha value, assigned workers and criteria.
* If the machine has an assigned list of workers, the program chooses the number required by the machine depending on the assigned calendar. For example, if the machine calendar is 16 hours per day and the resource calendar is 8 hours, the program assigns two resources from the list of available resources.
* If the machine has one or several assigned criteria, the program makes generic assignments from among the resources that fulfil the criteria assigned to the machine.
* It collects the machine's configuration information: alpha value,
assigned workers and criteria.
* If the machine has an assigned list of workers, the program chooses the
number required by the machine depending on the assigned calendar. For
example, if the machine calendar is 16 hours per day and the resource
calendar is 8 hours, the program assigns two resources from the list of
available resources.
* If the machine has one or several assigned criteria, the program makes
generic assignments from among the resources that fulfil the criteria
assigned to the machine.
Advanced assignment
===================
Advanced assignments allow users to design assignments that are automatically carried out by the application in order to personalise them. This procedure allows users to manually choose the daily hours that are dedicated by resources to tasks that are assigned or define a function that is applied to the assignment.
Advanced assignments allow users to design assignments that are
automatically carried out by the application in order to personalise them.
This procedure allows users to manually choose the daily hours that are
dedicated by resources to tasks that are assigned or define a function that
is applied to the assignment.
The steps to follow in order to manage advanced assignments are:
* Go to the advanced assignment window. There are two ways to access advanced assignments:
* Go to a specific order and change the view to advanced assignment. In this case, all the tasks on the order and assigned resources (specific and generic) will be shown.
* Go to the resource assignment window by clicking the "Advanced assignment" button. In this case, the assignments that show the resources (generic and specific) assigned for a task will be shown.
* Go to a specific order and change the view to advanced assignment. In
this case, all the tasks on the order and assigned resources (specific
and generic) will be shown.
* Go to the resource assignment window by clicking the "Advanced
assignment" button. In this case, the assignments that show the
resources (generic and specific) assigned for a task will be shown.
.. figure:: images/advance-assignment.png
:scale: 45
@ -141,25 +233,45 @@ The steps to follow in order to manage advanced assignments are:
* Users can choose the required zoom level they want:
* If the chosen zoom is more than one day. If users change the assigned hour value to a week, month, four-month or six-month period, the system distributes the hours lineally for all days throughout the chosen period.
* If the chosen zoom is one day. If users change the assigned hour value to a day, these hours only apply to a day. Consequently, users can decide how many hours they want to assign per day to task resources.
* If the chosen zoom is more than one day. If users change the assigned
hour value to a week, month, four-month or six-month period, the system
distributes the hours lineally for all days throughout the chosen
period.
* If the chosen zoom is one day. If users change the assigned hour value
to a day, these hours only apply to a day. Consequently, users can
decide how many hours they want to assign per day to task resources.
* Users can choose to design an advanced assignment function. In order to do so, users have to:
* Choose the function on the selection list that appears at the side of each resource and click "Configure".
* The system shows a new window if the chosen function needs to be specifically configured. Supported functions:
* Choose the function on the selection list that appears at the side of
each resource and click "Configure".
* Segments: A function that allows users to define segments to which a polynomial function is applied. The function per segment is configured as follows:
* The system shows a new window if the chosen function needs to be
specifically configured. Supported functions:
* Segments: A function that allows users to define segments to which
a polynomial function is applied. The function per segment is
configured as follows:
* Date. Date on which the segment ends. If the following value is established (length), the date is calculated, alternatively, length is calculated.
* Defining the length of each segment. This indicates what percentage of the task's duration is required for the segment.
* Defining the amount of work. This indicates what workload percentage is expected to be completed in this segment. The quantity of work must be incremental. For example, if there is a 10% segment, the next one must be larger (for example, 20%).
* Segment graphs and accumulated loads.
* Date. Date on which the segment ends. If the following value is
established (length), the date is calculated, alternatively, length is
calculated.
* Defining the length of each segment. This indicates what percentage of
the task's duration is required for the segment.
* Users then click "Accept".
* The program stores the function and applies it to the daily resource assignments.
* Defining the amount of work. This indicates what workload percentage
is expected to be completed in this segment. The quantity of work must
be incremental. For example, if there is a 10% segment, the next one
must be larger (for example, 20%).
* Segment graphs and accumulated loads.
* Users then click "Accept".
* The program stores the function and applies it to the daily resource
assignments.
.. figure:: images/stretches.png
:scale: 40

View file

@ -1,17 +1,21 @@
Reports
########
.. _informes:
.. contents::
Reports
=======
"LibrePlan" is integrated with *JasperReports* to manage reports, which allows users to enter various reports to analyse available data in the program.
The defined reports are:
#. `Report on worked hours by resource <15-1-report-hours-worked-by-resource.html>`__
#. `Report on the total hours worked by resource in a month <15-2-total-hours-by-resource-month.html>`__
#. `Report on the work and progress per report <15-3-work-progress-per-project.html>`__
Reports
#######
.. _informes:
.. contents::
"LibrePlan" is integrated with *JasperReports* to manage reports, which allows users to enter various reports to analyse available data in the program.
The defined reports are:
.. raw:: html
<ul>
<li>
<a href="15-1-report-hours-worked-by-resource.html">Report on worked hours by resource</a>
</li><li>
<a href="15-2-total-hours-by-resource-month.html">Report on the total hours worked by resource in a month</a>
</li><li>
<a href="15-3-work-progress-per-project.html">Report on the work and progress per report</a>
</ul>

View file

@ -0,0 +1,83 @@
LDAP Configuration
##################
.. contents::
This screen allows to establish a connection with LDAP to delegate
authentication and/or authorization.
It is divided in four different areas related which are explained below:
Activation
==========
This area is used to set the properties about the way in which *LibrePlan* uses
LDAP.
If the field *Enable LDAP authentication* is checked, *LibrePlan* will look in
LDAP each time an user tries to login in the application.
The field *Use LDAP roles* checked means that a mapping between LDAP roles and
LibrePlan roles is established, so the permissions for an user in LibrePlan
will depend on the roles in LDAP that the user has.
Configuration
=============
This section has the parameter values for accessing LDAP.*Base, UserDN and
Password* are parameters used to connect to LDAP and search for the users, so
given user must have permission to do that operation in LDAP. At bottom part of
this section there is a button to check if LDAP connection is possible with the
given parameters. It is a good idea to try it before continuing the
configuration.
Authentication
==============
Here can be configured the property in LDAP nodes where should be found the
given login name. The property *UserId* must be filled with the name of the
property where the login name is stored in LDAP.
The checkbox *Save passwords in database* when it is checked, means that the
password is stored also in LibrePlan database. In this way, if LDAP is offline
or unreachable, LDAP users could authenticate against LibrePlan database. If it
is not checked, LDAP users can only be authenticated against LDAP.
Authorization
=============
This section allows to define an strategy for matching LDAP roles with
LibrePlan roles. In fact, the first choice is the strategy to use, depending on
LDAP implementation.
Group strategy
--------------
When this strategy is used, it means that LDAP has a role-group strategy. It
means that users in LDAP are nodes that hang directly from a branch which
represents the group. In this way, considering as example an LDAP with a branch
(group) called *Admin* and two nodes (users) in the branch called *John* and
*William*, an administrator could assign to both users a role in LibrePlan. The
only parameter needed in this case is the *Group path* that represents the path
in LDAP to find the branches with the groups.
Property strategy
-----------------
When administrator decides to use this strategy, it means that each user is a
LDAP node and in the node exists a property that represents the group(s) for
the user. In this case, the configuration needs two parameters:
* *Role property*. It represents the property in user's node in LDAP which
contains all the roles for that user.
* *Role search query*. It represents the path in LDAP to find the nodes of
the users; in this case, note that is important to know that string
"[USER_ID]" represents the place where the login name given in the login
form should be placed to get the correct user's node in LDAP.
At the bottom of this section there is a table with all the LibrePlan roles and
a text field next to each one. This is for matching roles. For instance, if
administrator decides that *Administration* LibrePlan role matches with *admin*
and *administrators* roles of LDAP, in the text field should appear:
"admin;administrators". The character for splitting roles is ";".

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 Alvariñ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.png
:scale: 100

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

View file

@ -23,4 +23,5 @@
12-formularios-calidad Xavier Castaño (xcastanho@igalia.com)
13-usuarios Xavier Castaño (xcastanho@igalia.com)
14-custos Xavier Castaño (xcastanho@igalia.com)
15-informes Xavier Castaño (xcastanho@igalia.com)
15-informes Xavier Castaño (xcastanho@igalia.com)
16-ldap-authentication Ignacio Diaz Teijido (ignacio.diaz@cafedered.com)y Javier Moran Rua (jmoran@igalia.com)

View file

@ -12,7 +12,7 @@ proyectos. Su objetivo principal es proporcionar una solución completa para la
gestión de los proyectos de la empresa.
Para cualquier información específica que necesites sobre este software, por
favor ponte en contacto con el equipo de desarrollo en
http://www.libreplan.org/es/contacto
http://www.libreplan.com/contact/
.. figure:: images/company_view.png

View file

@ -0,0 +1,90 @@
Configuracion LDAP
##################
.. contents::
Esta pantalla permite establecer una conexión LDAP para delegar autenticación y/o autorización.
Está dividida en catro áreas diferentes relacionadas que se explican debajo:
Activación
==========
Esta área se usa para establecer las propiedades que configuran como *LibrePlan* usa LDAP.
Si el campo *Habilita autenticación LDAP* está marcado, *LibrePlan* utiliza el
LDAP para autenticar cada vez que el usuario intenta entrar en la aplicación.
El campo *Usar LDAP roles* marcado significa que el mapping entre el roles LDAP
y roles LibrePlan está establecido, de manera que los permisos en LibrePlan dependen
de los roles que el usuario tiene en el LDAP.
Configuración
=============
Esta sección tiene los parámentros para el acceso al LDAP. Los parámetros
*Base, UserDN y Password* son los parámetros para conectar al LDAP y buscar a
los usuarios. El usuario configurado debe tener permiso en
el LDAP. En la última parte de esta sección hay un botón para comprobar que la
conexión con el LDAP es posible con los parámetros configurados. Es una buena idea
probar la conexión antes de continuar con la configuración.
Autenticación
=============
En esta sección se configuran la propiedad de los nodos de LDAP donde se
encuentra almacenada el login del usuario. La propiedad *UserId* debe ser
rellenado con el nombre de la propiedad donde el login está almacenado en el
LDAP.
El checkbox *Almacenar contraseñas en la base de datos* cuando se encuentra
marcado, indica que la contraseña se almacena también en la base de datos
LibrePlan. De esta forma, si el LDAP está offline o no existe conectividad, los
usuarios del LDAP pueden autenticarse contra la base de datos de LibrePlan. Si
no está marcado, los usuario de LDAP sólo pueden ser autenticados contro el
LDAP.
Autorización
============
Esta sección permite definir la estrategia para asociar los roles de LDAP con
los roles de LibrePlan.
Estrategia de grupo
-------------------
Cuando se usa esta estrategia, implica que el LDAP está usando una estrageia de
grupo de rol. Significa que los usuarios en el LDAP son nodos que cuelgan
directamente de una rama que representa el grupo. Un ejemplo de ello sería tener
un LDAP con una rama (grupo) llamada *Admin* y que tuviera debajo dos nodos
(usuarios) llamados *John* y *William*. En este caso un administrador de
LibrePlan podría asignar ambos usuarios a un rol en LibrePlan.
El único parámetro en este caso es el *Path de grupo* que representa la ruta en
LDAP para encontras las ramas que representan los grupos.
Estrategia de propiedad
-----------------------
Cuando un usuario administrador decide usar esta estrategia, implica que cada
usuario es un nodo de LDAP y que en el nodo existe una propiedad que representa
el grupo o grupos al que pertenece el usuairo. En este caso, la configuración
necesita dos parámetros:
* *Propiedad del rol*. Representa la propiedad en el nodo del usuario que
contiene todos los roles para el mismo.
* *Consulta para la búsqueda de roles*. Representa la ruta en el LDAP para
encontrar los nodos de los usuarios. En este caso, hay que tener en cuenta que
la cadena "[USER_ID]" representa el lugar en el que el nombre del usuario
proporcionado en el formulario de entrada debe ser situado para obtener el
nodo apropiado correspondiente al usuario en el LDAP.
En el fondo de la pantalla de esta sección hay una tabla con todos los roles de
LibrePlan y un campo de texto anexo a cada uno de ellos. Esta área es para la
asociación de los roles. Por ejemplo, si un usuario administrador de LibrePlan
decide que rol de LibrePlan *Administración* se corresponde con los roles
*admin* y *administrators* del LDAP en el campo de texto hay que configurar:
"admin;administrators". El carácter de separación de roles es ";".

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 Alvariñ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

@ -23,4 +23,5 @@
12-formularios-calidad Xavier Castaño (xcastanho@igalia.com)
13-usuarios Xavier Castaño (xcastanho@igalia.com)
14-custos Xavier Castaño (xcastanho@igalia.com)
15-informes Xavier Castaño (xcastanho@igalia.com)
15-informes Xavier Castaño (xcastanho@igalia.com)
16-ldap-authentication Ignacio Diaz Teijido (ignacio.diaz@cafedered.com) y Javier Moran Rua (jmoran@igalia.com)

View file

@ -12,7 +12,7 @@ proxectos. O seu obxectivo principal é proporcionar unha solución completa par
xestión dos proxectos da empresa.
Para calquera información específica que necesites sobre este software, por
favor ponte en contacto co equipo de desenvolvemento en
http://www.libreplan.org/contacto
http://www.libreplan.com/contact/
.. figure:: images/company_view.png

View file

@ -0,0 +1,90 @@
Configuracion LDAP
##################
.. contents::
Esta pantalla permite establecer unha conexión LDAP para delegar autenticación e/ou autorización.
Está dividida en catro áreas diferentes relacionadas que se explican debaixo:
Activación
==========
Esta área úsase para establecer as propiedades que configuran como *LibrePlan* usa LDAP.
Se o campo *Habilita autenticación LDAP* está marcado, *LibrePlan* utiliza o
LDAP para autenticar cada vez que o usuario tenta entrar na aplicación.
O campo *Usar LDAP roles* marcado significa que o mapping entre os roles LDAP
e os roles de LibrePlan está establecido, de maneira que os permisos en LibrePlan dependen
dos roles que o usuario ten no LDAP.
Configuración
=============
Esta sección ten os parámentros para o acceso ao LDAP. Os parámetros
*Basee, UserDN e Password* son os parámetros para conectar ao LDAP e buscar aos
usuarios. O usuario configurado debe ter permiso no
LDAP. Na última parte desta sección hai un botón para comprobar que a
conexión co LDAP é posible cos parámetros configurados. É unha boa idea
probar a conexión antes de continuar coa configuración.
Autenticación
=============
Nesta sección configúranse a propiedade dos nodos de LDAP onde se atopa
almacenada o login do usuario. A propiedade *UserId* debe ser
enchido co nome da propiedade onde o login está almacenado no
LDAP.
O checkbox *Almacenar contrasinais na base de datos* cando se atopa
marcado, indica que a contrasinal se almacena tamén na base de datos
LibrePlan. Desta forma, se o LDAP está offline ou non existe conectividad, os
usuarios do LDAP poden autenticarse contra a base de datos de LibrePlan. Se
non está marcado, o usuario de LDAP só poden ser autenticados contro o
LDAP.
Autorización
============
Esta sección permite definir a estratexia para asociar os roles de LDAP cos
roles de LibrePlan.
Estratexia de grupo
-------------------
Cando se usa esta estratexia, implica que o LDAP está a usar unha estratexia de grupo
de rol. Significa que os usuarios no LDAP son nodos que colgan
directamente dunha rama que representa o grupo. Un exemplo diso sería ter
un LDAP cunha rama (grupo) chamada *Admin* e que tivese debaixo dous nodos
(usuarios) chamados *John* e *William*. Neste caso un administrador de LibrePlan
podería asignar ambos usuarios a un rol en LibrePlan.
O único parámetro neste caso é o *Path de grupo* que representa a ruta en LDAP
para atopar as ramas que representan os grupos.
Estratexia de propiedade
------------------------
Cando un usuario administrador decide usar esta estratexia, implica que cada
usuario é un nodo de LDAP e que no nodo existe unha propiedade que representa
o grupo ou grupos ao que pertence o usuairo. Neste caso, a configuración
necesita dous parámetros:
* *Propiedade do rol*. Representa a propiedade no nodo do usuario que
contén todos os roles para o mesmo.
* *Consulta para a procura de roles*. Representa a ruta no LDAP para
atopar os nodos dos usuarios. Neste caso, hai que ter en conta que
a cadea "[USER_IDE]" representa o lugar no que o nome do usuario
proporcionado no formulario de entrada debe ser situado para obter o
nodo apropiado correspondente ao usuario no LDAP.
No fondo da pantalla desta sección hai unha táboa con todos os roles de LibrePlan
e un campo de texto anexo a cada un deles. Esta área é para a
asociación dos roles. Por exemplo, se un usuario administrador de LibrePlan
decide que rol de LibrePlan *Administración* correspóndese cos roles
*admin* e *administrators* do LDAP no campo de texto hai que configurar:
"admin;administrators". O carácter de separación de roles é ";".

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 Alvariñ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

@ -23,4 +23,5 @@
12-formularios-calidad Xavier Castaño (xcastanho@igalia.com)
13-usuarios Xavier Castaño (xcastanho@igalia.com)
14-custos Xavier Castaño (xcastanho@igalia.com)
15-informes Xavier Castaño (xcastanho@igalia.com)
15-informes Xavier Castaño (xcastanho@igalia.com)
16-ldap-authentication Ignacio Diaz Teijido (ignacio.diaz@cafedered.com) e Javier Moran Rua (jmoran@igalia.com)

View file

@ -3,6 +3,7 @@
import sys, shlex, subprocess
from optparse import OptionParser, OptionGroup
from docutils.writers import latex2e
import re
try:
import locale
@ -42,6 +43,23 @@ OPT.docinfo.add_option("-i", "--info", dest="docinfo",
help="Read project information from FILE")
is_index_filename = re.compile(r'^[0-9]{2}-[a-zA-Z].*').match
def str_to_numeric_tuple(s):
r = []
for item in s.split("-"):
try:
r.append(int(item, 10))
except ValueError:
# Tried to convert a non-integer, bail out
break
return tuple(r)
def str_tuple_sort(a, b):
return cmp(str_to_numeric_tuple(a), str_to_numeric_tuple(b))
def optparser(*groups):
parser.add_option_group(OPT.common)
[parser.add_option_group(g) for g in groups]
@ -50,7 +68,12 @@ def optparser(*groups):
class DupRefsRemover(object):
def __init__(self, out):
self.out = out
if hasattr(out, "write"):
self.out = out.write
elif hasattr(out, "handle_line"):
self.out = out.handle_line
else:
raise ValueError("%r has no write/handle_line" % out)
self.ref = dict()
def handle_line(self, line):
@ -64,9 +87,35 @@ class DupRefsRemover(object):
else:
# Add reference and print it out
self.ref[r[0]] = r[1]
self.out.write(line)
self.out(line)
else:
self.out.write(line)
self.out(line)
class UnderlineXlate(object):
_XLATE = {
"#": "=",
"=": "-",
"-": "~",
"~": "^",
}
def __init__(self, out):
if hasattr(out, "write"):
self.out = out.write
elif hasattr(out, "handle_line"):
self.out = out.handle_line
else:
raise ValueError("%r has no write/handle_line" % out)
def handle_line(self, line):
sline = line.strip()
if len(sline):
if sline[0] in self._XLATE:
sline = sline.replace(sline[0], self._XLATE[sline[0]])
self.out(sline)
return
self.out(line)
@ -135,10 +184,10 @@ class LaTeXStandaloneTranslator(latex2e.LaTeXTranslator):
if self.d_class.document_class == "igaliabk":
self.d_class.document_class = "book"
try:
del self.head_prefix[self.head_prefix.index(self.typearea)]
except AttributeError:
pass
try:
del self.head_prefix[self.head_prefix.index(self.typearea)]
except AttributeError:
pass
def __get_typearea(self):
if self._class == "igaliabk" or self._class.startswith("scr"):
@ -239,13 +288,17 @@ class DocTool(object):
print
out = DupRefsRemover(sys.stdout)
out_xlate = UnderlineXlate(out)
args = list(args)
args.sort(str_tuple_sort)
for name in args:
if not name.endswith(".rst"):
continue
f = file(name, "rU")
map(out.handle_line,
map(is_index_filename(name) and out.handle_line or out_xlate.handle_line,
filter(lambda l: ".. contents::" not in l,
f.readlines())
)
@ -263,9 +316,12 @@ class DocTool(object):
f.close()
print
args = list(args)
args.sort(str_tuple_sort)
for name in args:
# Skip non-RST inputs
if not name.endswith(".rst"):
if not name.endswith(".rst") or not is_index_filename(name):
continue
f = file(name, "rU")

View file

@ -6,7 +6,7 @@
<parent>
<groupId>org.libreplan</groupId>
<artifactId>libreplan</artifactId>
<version>1.1.3</version>
<version>1.2.0</version>
</parent>
<artifactId>ganttzk</artifactId>
<packaging>jar</packaging>

View file

@ -221,6 +221,9 @@ public class FunctionalityExposedForExtensions<T> implements IContext<T> {
accumulatedDependencies, child));
i++;
}
} else if (navigator.isMilestone(data)) {
Milestone milestone = (Milestone) result;
milestone.setOwner(position.getParent());
}
result.setShowingReportedHours(planner.showReportedHoursRightNow());

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,15 +24,19 @@ package org.zkoss.ganttz;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.text.DateFormat;
import java.text.ParseException;
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;
import org.zkoss.ganttz.adapters.IDisabilityConfiguration;
import org.zkoss.ganttz.data.GanttDate;
import org.zkoss.ganttz.data.ITaskFundamentalProperties.IModifications;
import org.zkoss.ganttz.data.ITaskFundamentalProperties.IUpdatablePosition;
import org.zkoss.ganttz.data.Task;
import org.zkoss.ganttz.util.ComponentsFinder;
import org.zkoss.util.Locales;
@ -47,6 +51,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 +82,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 +122,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 +136,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 +217,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 +232,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 +252,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 +278,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 +312,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 +347,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 +354,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 +373,35 @@ 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 {
final Date begin = dateFormat.parse(getStartDateTextBox()
.getValue());
task.doPositionModifications(new IModifications() {
@Override
public void doIt(IUpdatablePosition position) {
position.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 +410,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,11 +476,21 @@ 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();
Component plannerToolbar = getSpecificCommandsInsertionPoint();
commontoolbar.getChildren().removeAll(commontoolbar.getChildren());
if (!contextualizedGlobalCommands.isEmpty()) {
commontoolbar.getChildren().removeAll(commontoolbar.getChildren());
}
for (CommandContextualized<?> c : contextualizedGlobalCommands) {
// Comparison through icon as name is internationalized
if (c.getCommand().getImage()
@ -865,7 +873,14 @@ 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
for (TaskComponent each : taskList.getTaskComponents()) {
each.invalidate();
}
}
}
}

View file

@ -34,6 +34,8 @@ import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.zkoss.ganttz.adapters.IDisabilityConfiguration;
import org.zkoss.ganttz.data.GanttDate;
import org.zkoss.ganttz.data.ITaskFundamentalProperties.IModifications;
import org.zkoss.ganttz.data.ITaskFundamentalProperties.IUpdatablePosition;
import org.zkoss.ganttz.data.Milestone;
import org.zkoss.ganttz.data.Task;
import org.zkoss.ganttz.data.Task.IReloadResourcesTextRequested;
@ -238,9 +240,7 @@ public class TaskComponent extends Div implements AfterCompose {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (isInPage()) {
updateProperties();
}
updateProperties();
}
};
}
@ -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(
@ -342,8 +345,14 @@ public class TaskComponent extends Div implements AfterCompose {
void doUpdatePosition(int leftX, int topY) {
GanttDate startBeforeMoving = this.task.getBeginDate();
LocalDate newPosition = getMapper().toDate(leftX);
this.task.moveTo(GanttDate.createFrom(newPosition));
final LocalDate newPosition = getMapper().toDate(leftX);
this.task.doPositionModifications(new IModifications() {
@Override
public void doIt(IUpdatablePosition position) {
position.moveTo(GanttDate.createFrom(newPosition));
}
});
boolean remainsInOriginalPosition = this.task.getBeginDate().equals(
startBeforeMoving);
if (remainsInOriginalPosition) {
@ -482,7 +491,7 @@ public class TaskComponent extends Div implements AfterCompose {
updateCompletionAdvance();
}
private void updateCompletionReportedHours() {
public void updateCompletionReportedHours() {
if (task.isShowingReportedHours()) {
int startPixels = this.task.getBeginDate().toPixels(getMapper());
String widthHoursAdvancePercentage = pixelsFromStartUntil(
@ -529,11 +538,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 +578,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

@ -25,6 +25,8 @@ import java.util.Date;
import org.joda.time.LocalDate;
import org.zkoss.ganttz.data.GanttDate;
import org.zkoss.ganttz.data.ITaskFundamentalProperties.IModifications;
import org.zkoss.ganttz.data.ITaskFundamentalProperties.IUpdatablePosition;
import org.zkoss.ganttz.data.Task;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.util.GenericForwardComposer;
@ -120,12 +122,19 @@ public class TaskEditFormComposer extends GenericForwardComposer {
return localDate.toDateTimeAtStartOfDay().toDate();
}
private void copyFromDTO(TaskDTO taskDTO, Task currentTask,
private void copyFromDTO(final TaskDTO taskDTO, Task currentTask,
boolean copyDates) {
currentTask.setName(taskDTO.name);
if (copyDates) {
currentTask.setBeginDate(GanttDate.createFrom(taskDTO.beginDate));
currentTask.resizeTo(GanttDate.createFrom(taskDTO.endDate));
currentTask.doPositionModifications(new IModifications() {
@Override
public void doIt(IUpdatablePosition position) {
position.setBeginDate(GanttDate
.createFrom(taskDTO.beginDate));
position.resizeTo(GanttDate.createFrom(taskDTO.endDate));
}
});
}
currentTask.setNotes(taskDTO.notes);
currentTask.setDeadline(taskDTO.deadlineDate);

View file

@ -97,6 +97,7 @@ public class TaskList extends XulElement implements AfterCompose {
public void updateCompletion(String progressType) {
for (TaskComponent task: getTaskComponents()) {
task.updateCompletion(progressType);
task.updateCompletionReportedHours();
task.updateTooltipText(progressType);
}
}
@ -198,7 +199,7 @@ public class TaskList extends XulElement implements AfterCompose {
return getTimeTrackerComponent().getTimeTracker();
}
private List<TaskComponent> getTaskComponents() {
protected List<TaskComponent> getTaskComponents() {
ArrayList<TaskComponent> result = new ArrayList<TaskComponent>();
for (Object child : getChildren()) {
if (child instanceof TaskRow) {

View file

@ -59,6 +59,33 @@ public class DefaultFundamentalProperties implements ITaskFundamentalProperties
private String resourcesText;
private IUpdatablePosition position = new IUpdatablePosition() {
private final DefaultFundamentalProperties parent = DefaultFundamentalProperties.this;
@Override
public void setBeginDate(GanttDate beginDate) {
parent.beginDate = toMilliseconds(beginDate);
}
@Override
public void setEndDate(GanttDate endDate) {
parent.beginDate = toMilliseconds(endDate)
- parent.lengthMilliseconds;
}
@Override
public void resizeTo(GanttDate endDate) {
parent.lengthMilliseconds = toMilliseconds(endDate) - beginDate;
}
@Override
public void moveTo(GanttDate date) {
setBeginDate(date);
}
};
public DefaultFundamentalProperties() {
}
@ -80,6 +107,11 @@ public class DefaultFundamentalProperties implements ITaskFundamentalProperties
this.resourcesText = "";
}
@Override
public void doPositionModifications(IModifications modifications) {
modifications.doIt(position);
}
public String getName() {
return name;
}
@ -115,11 +147,6 @@ public class DefaultFundamentalProperties implements ITaskFundamentalProperties
return toGanttDate(beginDate);
}
@Override
public void setBeginDate(GanttDate beginDate) {
this.beginDate = toMilliseconds(beginDate);
}
public long getLengthMilliseconds() {
return lengthMilliseconds;
}
@ -129,16 +156,6 @@ public class DefaultFundamentalProperties implements ITaskFundamentalProperties
return toGanttDate(beginDate + getLengthMilliseconds());
}
@Override
public void setEndDate(GanttDate endDate) {
this.beginDate = toMilliseconds(endDate) - this.lengthMilliseconds;
}
@Override
public void resizeTo(GanttDate endDate) {
this.lengthMilliseconds = toMilliseconds(endDate) - beginDate;
}
public String getNotes() {
return notes;
}
@ -193,11 +210,6 @@ public class DefaultFundamentalProperties implements ITaskFundamentalProperties
return Collections.emptyList();
}
@Override
public void moveTo(GanttDate date) {
setBeginDate(date);
}
@Override
public Date getDeadline() {
return null;

View file

@ -46,12 +46,16 @@ import org.apache.commons.logging.LogFactory;
import org.jgrapht.DirectedGraph;
import org.jgrapht.graph.SimpleDirectedGraph;
import org.zkoss.ganttz.data.DependencyType.Point;
import org.zkoss.ganttz.data.ITaskFundamentalProperties.IModifications;
import org.zkoss.ganttz.data.ITaskFundamentalProperties.IUpdatablePosition;
import org.zkoss.ganttz.data.constraint.Constraint;
import org.zkoss.ganttz.data.constraint.ConstraintOnComparableValues;
import org.zkoss.ganttz.data.constraint.ConstraintOnComparableValues.ComparisonType;
import org.zkoss.ganttz.data.criticalpath.ICriticalPathCalculable;
import org.zkoss.ganttz.util.IAction;
import org.zkoss.ganttz.util.PreAndPostNotReentrantActionsWrapper;
import org.zkoss.ganttz.util.ReentranceGuard;
import org.zkoss.ganttz.util.ReentranceGuard.IReentranceCases;
/**
* This class contains a graph with the {@link Task tasks} as vertexes and the
@ -87,6 +91,8 @@ public class GanttDiagramGraph<V, D extends IDependency<V>> implements
public interface IAdapter<V, D extends IDependency<V>> {
List<V> getChildren(V task);
V getOwner(V task);
boolean isContainer(V task);
void registerDependenciesEnforcerHookOn(V task,
@ -131,6 +137,15 @@ public class GanttDiagramGraph<V, D extends IDependency<V>> implements
return task.getTasks();
}
@Override
public Task getOwner(Task task) {
if (task instanceof Milestone) {
Milestone milestone = (Milestone) task;
return milestone.getOwner();
}
return null;
}
@Override
public Task getDestination(Dependency dependency) {
return dependency.getDestination();
@ -180,8 +195,14 @@ public class GanttDiagramGraph<V, D extends IDependency<V>> implements
@Override
public void setEndDateFor(Task task, GanttDate newEnd) {
task.setEndDate(newEnd);
public void setEndDateFor(Task task, final GanttDate newEnd) {
task.doPositionModifications(new IModifications() {
@Override
public void doIt(IUpdatablePosition position) {
position.setEndDate(newEnd);
}
});
}
@Override
@ -190,8 +211,14 @@ public class GanttDiagramGraph<V, D extends IDependency<V>> implements
}
@Override
public void setStartDateFor(Task task, GanttDate newStart) {
task.setBeginDate(newStart);
public void setStartDateFor(Task task, final GanttDate newStart) {
task.doPositionModifications(new IModifications() {
@Override
public void doIt(IUpdatablePosition position) {
position.setBeginDate(newStart);
}
});
}
@Override
@ -513,6 +540,14 @@ public class GanttDiagramGraph<V, D extends IDependency<V>> implements
dependenciesToAdd.add(adapter.createInvisibleDependency(
task, child, DependencyType.START_START));
}
} else {
V owner = adapter.getOwner(task);
if(owner != null) {
dependenciesToAdd.add(adapter.createInvisibleDependency(
task, owner, DependencyType.END_END));
dependenciesToAdd.add(adapter.createInvisibleDependency(
owner, task, DependencyType.START_START));
}
}
}
for (D each : dependenciesToAdd) {
@ -1933,16 +1968,27 @@ public class GanttDiagramGraph<V, D extends IDependency<V>> implements
}
public boolean hasVisibleIncomingDependencies(V task) {
return isSomeVisible(graph.incomingEdgesOf(task));
return isSomeVisibleAndNotEndEnd(graph.incomingEdgesOf(task));
}
private boolean isSomeVisibleAndNotEndEnd(Set<D> dependencies) {
for (D each : dependencies) {
if (!each.getType().equals(DependencyType.END_END)
&& adapter.isVisible(each)) {
return true;
}
}
return false;
}
public boolean hasVisibleOutcomingDependencies(V task) {
return isSomeVisible(graph.outgoingEdgesOf(task));
return isSomeVisibleAndNotStartStart(graph.outgoingEdgesOf(task));
}
private boolean isSomeVisible(Set<D> dependencies) {
private boolean isSomeVisibleAndNotStartStart(Set<D> dependencies) {
for (D each : dependencies) {
if (adapter.isVisible(each)) {
if (!each.getType().equals(DependencyType.START_START)
&& adapter.isVisible(each)) {
return true;
}
}
@ -2273,31 +2319,4 @@ public class GanttDiagramGraph<V, D extends IDependency<V>> implements
return adapter.getChildren(task);
}
}
interface IReentranceCases {
public void ifNewEntrance();
public void ifAlreadyInside();
}
class ReentranceGuard {
private final ThreadLocal<Boolean> inside = new ThreadLocal<Boolean>() {
protected Boolean initialValue() {
return false;
};
};
public void entranceRequested(IReentranceCases reentranceCases) {
if (inside.get()) {
reentranceCases.ifAlreadyInside();
return;
}
inside.set(true);
try {
reentranceCases.ifNewEntrance();
} finally {
inside.set(false);
}
}
}

View file

@ -32,15 +32,30 @@ import org.zkoss.ganttz.data.constraint.Constraint;
*/
public interface ITaskFundamentalProperties {
public interface IUpdatablePosition {
public void setBeginDate(GanttDate beginDate);
public void setEndDate(GanttDate endDate);
public void resizeTo(GanttDate endDate);
public void moveTo(GanttDate newStart);
}
/**
* The position modifications must be wrapped inside this
*/
public interface IModifications {
public void doIt(IUpdatablePosition position);
}
public void doPositionModifications(IModifications modifications);
public String getName();
public void setName(String name);
/**
* Sets the beginDate.
*/
public void setBeginDate(GanttDate beginDate);
public GanttDate getBeginDate();
/**
@ -55,10 +70,6 @@ public interface ITaskFundamentalProperties {
public GanttDate getEndDate();
public void setEndDate(GanttDate endDate);
public void resizeTo(GanttDate endDate);
public String getNotes();
public void setNotes(String notes);
@ -81,8 +92,6 @@ public interface ITaskFundamentalProperties {
public List<Constraint<GanttDate>> getEndConstraints();
public void moveTo(GanttDate newStart);
public boolean isSubcontracted();
public boolean isLimiting();

View file

@ -35,6 +35,8 @@ public class Milestone extends Task {
private List<Task> tasks = new ArrayList<Task>();
private TaskContainer owner;
private boolean expanded = false;
@Override
@ -73,4 +75,12 @@ public class Milestone extends Task {
return true;
}
public void setOwner(TaskContainer owner) {
this.owner = owner;
}
public TaskContainer getOwner() {
return this.owner;
}
}

View file

@ -32,7 +32,6 @@ import java.util.Collections;
import java.util.Date;
import java.util.List;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.Validate;
import org.joda.time.Duration;
import org.joda.time.LocalDate;
@ -96,7 +95,6 @@ public abstract class Task implements ITaskFundamentalProperties {
fundamentalPropertiesListeners.firePropertyChange("beginDate",
previousStart, fundamentalProperties.getBeginDate());
fireEndDate(previousEnd);
reloadResourcesTextIfChange(newStart, previousStart);
}
@Override
@ -125,6 +123,70 @@ public abstract class Task implements ITaskFundamentalProperties {
.getEndConstraints());
}
@Override
public void doPositionModifications(final IModifications modifications) {
fundamentalProperties.doPositionModifications(new IModifications() {
@Override
public void doIt(IUpdatablePosition p) {
modifications.doIt(position);
}
});
}
private final IUpdatablePosition position = new IUpdatablePosition() {
@Override
public void setEndDate(GanttDate value) {
if (value == null) {
return;
}
GanttDate previousEnd = fundamentalProperties.getEndDate();
getFundamentalPropertiesPosition().setEndDate(value);
dependenciesEnforcerHook.setNewEnd(previousEnd,
fundamentalProperties.getEndDate());
}
@Override
public void setBeginDate(GanttDate newStart) {
GanttDate previousValue = fundamentalProperties.getBeginDate();
GanttDate previousEnd = fundamentalProperties.getEndDate();
getFundamentalPropertiesPosition().setBeginDate(newStart);
dependenciesEnforcerHook.setStartDate(previousValue, previousEnd,
newStart);
}
@Override
public void resizeTo(GanttDate newEnd) {
GanttDate previousEnd = getEndDate();
getFundamentalPropertiesPosition().resizeTo(newEnd);
dependenciesEnforcerHook.setNewEnd(previousEnd, newEnd);
}
@Override
public void moveTo(GanttDate date) {
GanttDate previousStart = getBeginDate();
GanttDate previousEnd = getEndDate();
getFundamentalPropertiesPosition().moveTo(date);
dependenciesEnforcerHook.setStartDate(previousStart, previousEnd,
date);
}
private IUpdatablePosition getFundamentalPropertiesPosition() {
final IUpdatablePosition[] result = new IUpdatablePosition[1];
fundamentalProperties.doPositionModifications(new IModifications() {
@Override
public void doIt(IUpdatablePosition position) {
result[0] = position;
}
});
assert result[0] != null;
return result[0];
}
};
public abstract boolean isLeaf();
public abstract boolean isContainer();
@ -196,21 +258,6 @@ public abstract class Task implements ITaskFundamentalProperties {
Validate.notNull(dependenciesEnforcerHook);
}
public void setBeginDate(GanttDate newStart) {
GanttDate previousValue = fundamentalProperties.getBeginDate();
GanttDate previousEnd = fundamentalProperties.getEndDate();
fundamentalProperties.setBeginDate(newStart);
dependenciesEnforcerHook.setStartDate(previousValue, previousEnd,
newStart);
}
private void reloadResourcesTextIfChange(GanttDate newDate,
GanttDate previousDate) {
if (!ObjectUtils.equals(newDate, previousDate)) {
reloadResourcesText();
}
}
public void fireChangesForPreviousValues(GanttDate previousStart,
GanttDate previousEnd) {
dependenciesEnforcerHook.setStartDate(previousStart, previousStart,
@ -292,28 +339,17 @@ public abstract class Task implements ITaskFundamentalProperties {
previousValue, this.fundamentalProperties.getNotes());
}
@Override
public void setEndDate(GanttDate value) {
if (value == null) {
return;
}
GanttDate previousEnd = fundamentalProperties.getEndDate();
fundamentalProperties.setEndDate(value);
dependenciesEnforcerHook.setNewEnd(previousEnd,
fundamentalProperties.getEndDate());
}
public void resizeTo(LocalDate date) {
public void resizeTo(final LocalDate date) {
if (date.compareTo(getBeginDateAsLocalDate()) < 0) {
return;
}
resizeTo(GanttDate.createFrom(date));
}
doPositionModifications(new IModifications() {
public void resizeTo(GanttDate newEnd) {
GanttDate previousEnd = getEndDate();
fundamentalProperties.resizeTo(newEnd);
dependenciesEnforcerHook.setNewEnd(previousEnd, newEnd);
@Override
public void doIt(IUpdatablePosition position) {
position.resizeTo(GanttDate.createFrom(date));
}
});
}
public void removed() {
@ -364,13 +400,6 @@ public abstract class Task implements ITaskFundamentalProperties {
return fundamentalProperties.getResourcesText();
}
public void moveTo(GanttDate date) {
GanttDate previousStart = getBeginDate();
GanttDate previousEnd = getEndDate();
fundamentalProperties.moveTo(date);
dependenciesEnforcerHook.setStartDate(previousStart, previousEnd, date);
}
@Override
public Date getDeadline() {
return fundamentalProperties.getDeadline();

View file

@ -36,7 +36,7 @@ import org.joda.time.Years;
public class DetailOneTimeTrackerState extends
TimeTrackerStateWithSubintervalsFitting {
public static final Period MINIMUN_PERIOD = PeriodType.YEARS.amount(4);
public static final Period MINIMUN_PERIOD = PeriodType.YEARS.amount(6);
private static final int FIRST_LEVEL_ITEM_SIZE = 200;
private static final int SECOND_LEVEL_ITEM_SIZE = 100;

View file

@ -35,7 +35,7 @@ import org.zkoss.util.Locales;
public class DetailThreeTimeTrackerState extends
TimeTrackerStateWithSubintervalsFitting {
private static final int NUMBER_OF_MONTHS_MINIMUM = 20;
private static final int NUMBER_OF_MONTHS_MINIMUM = 30;
DetailThreeTimeTrackerState(IDetailItemModificator firstLevelModificator,
IDetailItemModificator secondLevelModificator) {
@ -125,4 +125,4 @@ public class DetailThreeTimeTrackerState extends
return SECOND_LEVEL_SIZE;
}
}
}

View file

@ -0,0 +1,50 @@
/*
* This file is part of LibrePlan
*
* Copyright (C) 2010-2011 Igalia, S.L.
*
* 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/>.
*/
package org.zkoss.ganttz.util;
/**
* @author Óscar González Fernández <ogfernandez@gmail.com>
*/
public class ReentranceGuard {
public interface IReentranceCases {
public void ifNewEntrance();
public void ifAlreadyInside();
}
private final ThreadLocal<Boolean> inside = new ThreadLocal<Boolean>() {
protected Boolean initialValue() {
return false;
};
};
public void entranceRequested(IReentranceCases reentranceCases) {
if (inside.get()) {
reentranceCases.ifAlreadyInside();
return;
}
inside.set(true);
try {
reentranceCases.ifNewEntrance();
} finally {
inside.set(false);
}
}
}

View file

@ -1,5 +1,5 @@
# Spanish translations for LibrePlan package
# Traducciones al español para el paquete LibrePlan.
# Spanish translations for LibrePlan - GanttZK module
# Traducciones al español para LibrePlan - módulo GanttZK
# Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e
# Desenvolvemento Tecnolóxico de Galicia
# Copyright (C) 2010-2011 Igalia, S.L.
@ -10,11 +10,11 @@
#
msgid ""
msgstr ""
"Project-Id-Version: 1.1.0\n"
"Project-Id-Version: 1.2.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-08-09 16:17+0200\n"
"PO-Revision-Date: 2011-08-09 16:29+0200\n"
"Last-Translator: Manuel Rego Casasnovas <mrego@igalia.com>\n"
"POT-Creation-Date: 2011-11-10 20:11+0100\n"
"PO-Revision-Date: 2011-11-10 20:18+0100\n"
"Last-Translator: Manuel Rego Casasnovas <rego@igalia.com>\n"
"Language-Team: Spanish <>\n"
"Language: es\n"
"MIME-Version: 1.0\n"
@ -27,7 +27,7 @@ msgstr ""
msgid "Erase"
msgstr "Borrar"
#: ganttzk/src/main/java/org/zkoss/ganttz/TaskList.java:319
#: ganttzk/src/main/java/org/zkoss/ganttz/TaskList.java:299
msgid "Add Dependency"
msgstr "Añadir dependencia"
@ -39,20 +39,20 @@ msgstr "Trabajador"
msgid "Start"
msgstr "Inicio"
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:592
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:629
msgid "Show reported hours"
msgstr "Mostrar horas reportadas"
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:92
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:90
msgid "by criteria"
msgstr "por criterios"
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:72
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:85
msgid "Show/Hide reported hours"
msgstr "Mostrar/Ocultar horas reportardas"
#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:35
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:46
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:49
msgid "Zoom"
msgstr "Zoom"
@ -60,7 +60,7 @@ msgstr "Zoom"
msgid "Limiting resources"
msgstr "Recursos limitantes"
#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:68
#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:67
msgid "The specified dependency is not allowed"
msgstr "La dependencia especificada no está permitida"
@ -68,15 +68,15 @@ msgstr "La dependencia especificada no está permitida"
msgid "Set End-End"
msgstr "Definir Fin-Fin"
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:80
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:78
msgid "Show/Hide progress"
msgstr "Mostrar/Ocultar progreso"
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadComponent.java:188
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadComponent.java:199
msgid "available effort: {0}, assigned effort: {1}"
msgstr "esfuerzo disponible: {0}, esfuerzo asignado: {1}"
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:91
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:89
msgid "by resources"
msgstr "por recursos"
@ -88,7 +88,7 @@ msgstr "Tarea"
msgid "Criterion"
msgstr "Criterio"
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:41
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:44
msgid "Print"
msgstr "Imprimir"
@ -96,7 +96,7 @@ msgstr "Imprimir"
msgid "Week"
msgstr "Semana"
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:489
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:501
msgid "filtering by name"
msgstr "filtrando por nombre"
@ -108,10 +108,6 @@ msgstr "Ver planificación"
msgid "End"
msgstr "Fin"
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:37
msgid "Choosing Template"
msgstr "Selección de plantilla"
#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/TimeTracker.java:243
msgid "changing zoom"
msgstr "cambiando zoom"
@ -124,7 +120,7 @@ msgstr "Trimestre"
msgid "None"
msgstr "Ninguno"
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:69
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:71
msgid "Flatten/Unflatten tree"
msgstr "Aplanar/Expandir árbol"
@ -136,7 +132,7 @@ msgstr "Filtro"
msgid "Project"
msgstr "Proyecto"
#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:68
#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:67
#: ganttzk/src/main/resources/web/ganttz/zul/leftTasksTree.zul:28
msgid "Name"
msgstr "Nombre"
@ -145,27 +141,23 @@ msgstr "Nombre"
msgid "Name filter"
msgstr "Filtro por nombres"
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:572
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:609
msgid "Show progress"
msgstr "Mostrar progreso"
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:66
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:67
msgid "Expand/Collapse all"
msgstr "Expandir/Plegar todo"
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:56
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:58
msgid "Show/Hide critical path"
msgstr "Mostrar/Ocultar camino crítico"
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:36
msgid "Create Project"
msgstr "Crear proyecto"
#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:32
msgid "Year"
msgstr "Año"
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:145
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:150
msgid "showing criteria"
msgstr "mostrando criterios"
@ -173,7 +165,7 @@ msgstr "mostrando criterios"
msgid "Month"
msgstr "Mes"
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:63
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:64
msgid "Show/Hide resources"
msgstr "Mostrar/Ocultar recursos"
@ -181,11 +173,11 @@ msgstr "Mostrar/Ocultar recursos"
msgid "Set End-Start"
msgstr "Definir Fin-Inicio"
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:302
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:298
msgid "decreasing zoom"
msgstr "reduciendo zoom"
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:559
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:590
msgid "Hide critical path"
msgstr "Ocultar camino crítico"
@ -193,19 +185,19 @@ msgstr "Ocultar camino crítico"
msgid "Day"
msgstr "Día"
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:599
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:636
msgid "Hide reported hours"
msgstr "Ocultar horas reportadas"
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadComponent.java:182
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadComponent.java:193
msgid "Load: {0}%"
msgstr "Carga: {0}%"
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:142
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:147
msgid "showing resources"
msgstr "mostrando recursos"
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:60
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:61
msgid "Show/Hide labels"
msgstr "Mostrar/Ocultar etiquetas"
@ -213,8 +205,8 @@ msgstr "Mostrar/Ocultar etiquetas"
msgid "Hour"
msgstr "Hora"
#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:91
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:116
#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:90
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:114
msgid "Graphics"
msgstr "Gráficas"
@ -222,30 +214,30 @@ msgstr "Gráficas"
msgid "Set Start-Start"
msgstr "Definir Inicio-Inicio"
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadComponent.java:141
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadComponent.java:152
msgid "See resource allocation"
msgstr "Ver asignación de recursos"
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:285
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:281
msgid "increasing zoom"
msgstr "aumentando zoom"
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:455
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:467
msgid "Show all elements"
msgstr "Mostrar todos los elementos"
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:454
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:466
msgid "All"
msgstr "Todos"
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:39
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:38
msgid "Refresh"
msgstr "Actualizar"
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:554
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:585
msgid "Show critical path"
msgstr "Mostrar camino crítico"
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:577
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:614
msgid "Hide progress"
msgstr "Ocultar progreso"

View file

@ -1,20 +1,20 @@
# Galician translations for LibrePlan package
# Traducciones al español para el paquete LibrePlan.
# Galician translations for LibrePlan - GanttZK module
# Traducciones al español para LibrePlan - módulo GanttZK
# Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e
# Desenvolvemento Tecnolóxico de Galicia
# Copyright (C) 2010-2011 Igalia, S.L.
# This file is distributed under the same license as the LibrePlan package.
# Igalia <dpino@igalia.com>, 2009.
# Jacobo Aragunde Pérez <jaragunde@igalia.com>, 2010.
# Manuel Rego Casasnovas <mrego@igalia.com>, 2010, 2011.
# Manuel Rego Casasnovas <rego@igalia.com>, 2010, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: 1.1.0\n"
"Project-Id-Version: 1.2.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-08-09 16:17+0200\n"
"PO-Revision-Date: 2011-08-09 16:30+0200\n"
"Last-Translator: Manuel Rego Casasnovas <mrego@igalia.com>\n"
"POT-Creation-Date: 2011-11-10 20:11+0100\n"
"PO-Revision-Date: 2011-11-10 20:20+0100\n"
"Last-Translator: Manuel Rego Casasnovas <rego@igalia.com>\n"
"Language-Team: Galician <>\n"
"Language: gl\n"
"MIME-Version: 1.0\n"
@ -27,7 +27,7 @@ msgstr ""
msgid "Erase"
msgstr "Borrar"
#: ganttzk/src/main/java/org/zkoss/ganttz/TaskList.java:319
#: ganttzk/src/main/java/org/zkoss/ganttz/TaskList.java:299
msgid "Add Dependency"
msgstr "Engadir dependencia"
@ -39,20 +39,20 @@ msgstr "Traballador"
msgid "Start"
msgstr "Inicio"
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:592
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:629
msgid "Show reported hours"
msgstr "Mostrar horas reportadas"
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:92
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:90
msgid "by criteria"
msgstr "por criterios"
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:72
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:85
msgid "Show/Hide reported hours"
msgstr "Mostrar/Ocultar horas reportadas"
#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:35
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:46
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:49
msgid "Zoom"
msgstr "Zoom"
@ -60,7 +60,7 @@ msgstr "Zoom"
msgid "Limiting resources"
msgstr "Recursos limitantes"
#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:68
#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:67
msgid "The specified dependency is not allowed"
msgstr "A dependencia especificada non está permitida"
@ -68,15 +68,15 @@ msgstr "A dependencia especificada non está permitida"
msgid "Set End-End"
msgstr "Definir Fin-Fin"
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:80
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:78
msgid "Show/Hide progress"
msgstr "Mostrar/Ocultar progreso"
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadComponent.java:188
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadComponent.java:199
msgid "available effort: {0}, assigned effort: {1}"
msgstr "esforzo dispoñible: {0}, esforzo asignado: {1}"
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:91
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:89
msgid "by resources"
msgstr "por recursos"
@ -88,7 +88,7 @@ msgstr "Tarefa"
msgid "Criterion"
msgstr "Criterio"
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:41
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:44
msgid "Print"
msgstr "Imprimir"
@ -96,7 +96,7 @@ msgstr "Imprimir"
msgid "Week"
msgstr "Semana"
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:489
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:501
msgid "filtering by name"
msgstr "filtrando por nome"
@ -108,10 +108,6 @@ msgstr "Ver planificación"
msgid "End"
msgstr "Fin"
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:37
msgid "Choosing Template"
msgstr "Selección de modelo"
#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/TimeTracker.java:243
msgid "changing zoom"
msgstr "cambiando zoom"
@ -124,7 +120,7 @@ msgstr "Trimestre"
msgid "None"
msgstr "Ningún"
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:69
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:71
msgid "Flatten/Unflatten tree"
msgstr "Aplanar/Expandir árbore"
@ -136,7 +132,7 @@ msgstr "Filtro"
msgid "Project"
msgstr "Proxecto"
#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:68
#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:67
#: ganttzk/src/main/resources/web/ganttz/zul/leftTasksTree.zul:28
msgid "Name"
msgstr "Nome"
@ -145,27 +141,23 @@ msgstr "Nome"
msgid "Name filter"
msgstr "Filtro por nomes"
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:572
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:609
msgid "Show progress"
msgstr "Mostrar progreso"
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:66
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:67
msgid "Expand/Collapse all"
msgstr "Expandir/Pregar todo"
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:56
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:58
msgid "Show/Hide critical path"
msgstr "Mostrar/Ocultar camiño crítico"
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:36
msgid "Create Project"
msgstr "Crear proxecto"
#: 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
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:150
msgid "showing criteria"
msgstr "mostrando criterios"
@ -173,7 +165,7 @@ msgstr "mostrando criterios"
msgid "Month"
msgstr "Mes"
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:63
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:64
msgid "Show/Hide resources"
msgstr "Mostrar/Ocultar recursos"
@ -181,11 +173,11 @@ msgstr "Mostrar/Ocultar recursos"
msgid "Set End-Start"
msgstr "Definir Fin-Inicio"
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:302
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:298
msgid "decreasing zoom"
msgstr "reducindo zoom"
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:559
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:590
msgid "Hide critical path"
msgstr "Ocultar camiño crítico"
@ -193,19 +185,19 @@ msgstr "Ocultar camiño crítico"
msgid "Day"
msgstr "Día"
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:599
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:636
msgid "Hide reported hours"
msgstr "Ocultar horas reportadas"
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadComponent.java:182
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadComponent.java:193
msgid "Load: {0}%"
msgstr "Carga: {0}%"
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:142
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:147
msgid "showing resources"
msgstr "mostrando recursos"
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:60
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:61
msgid "Show/Hide labels"
msgstr "Mostrar/Ocultar etiquetas"
@ -213,8 +205,8 @@ msgstr "Mostrar/Ocultar etiquetas"
msgid "Hour"
msgstr "Hora"
#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:91
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:116
#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:90
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:114
msgid "Graphics"
msgstr "Gráficas"
@ -222,30 +214,30 @@ msgstr "Gráficas"
msgid "Set Start-Start"
msgstr "Definir Inicio-Inicio"
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadComponent.java:141
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadComponent.java:152
msgid "See resource allocation"
msgstr "Ver asignación de recursoss"
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:285
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:281
msgid "increasing zoom"
msgstr "aumentando zoom"
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:455
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:467
msgid "Show all elements"
msgstr "Mostrar tódolos elementos"
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:454
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:466
msgid "All"
msgstr "Todos"
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:39
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:38
msgid "Refresh"
msgstr "Actualizar"
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:554
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:585
msgid "Show critical path"
msgstr "Mostrar camiño crítico"
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:577
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:614
msgid "Hide progress"
msgstr "Ocultar progreso"

View file

@ -5,14 +5,14 @@
# This file is distributed under the same license as the LibrePlan package.
# Diego Pino García <dpino@igalia.com>, 2009.
# Jacobo Aragunde Pérez <jaragunde@igalia.com>, 2009, 2010.
# Manuel Rego Casasnovas <mrego@igalia.com>, 2010, 2011.
# Manuel Rego Casasnovas <rego@igalia.com>, 2010, 2011.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: 1.1.3\n"
"Project-Id-Version: 1.2.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-08-09 16:17+0200\n"
"POT-Creation-Date: 2011-11-10 20:11+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -26,7 +26,7 @@ msgstr ""
msgid "Erase"
msgstr ""
#: ganttzk/src/main/java/org/zkoss/ganttz/TaskList.java:319
#: ganttzk/src/main/java/org/zkoss/ganttz/TaskList.java:299
msgid "Add Dependency"
msgstr ""
@ -38,20 +38,20 @@ msgstr ""
msgid "Start"
msgstr ""
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:592
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:629
msgid "Show reported hours"
msgstr ""
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:92
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:90
msgid "by criteria"
msgstr ""
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:72
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:85
msgid "Show/Hide reported hours"
msgstr ""
#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:35
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:46
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:49
msgid "Zoom"
msgstr ""
@ -59,7 +59,7 @@ msgstr ""
msgid "Limiting resources"
msgstr ""
#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:68
#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:67
msgid "The specified dependency is not allowed"
msgstr ""
@ -67,15 +67,15 @@ msgstr ""
msgid "Set End-End"
msgstr ""
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:80
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:78
msgid "Show/Hide progress"
msgstr ""
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadComponent.java:188
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadComponent.java:199
msgid "available effort: {0}, assigned effort: {1}"
msgstr ""
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:91
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:89
msgid "by resources"
msgstr ""
@ -87,7 +87,7 @@ msgstr ""
msgid "Criterion"
msgstr ""
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:41
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:44
msgid "Print"
msgstr ""
@ -95,7 +95,7 @@ msgstr ""
msgid "Week"
msgstr ""
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:489
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:501
msgid "filtering by name"
msgstr ""
@ -107,10 +107,6 @@ msgstr ""
msgid "End"
msgstr ""
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:37
msgid "Choosing Template"
msgstr ""
#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/TimeTracker.java:243
msgid "changing zoom"
msgstr ""
@ -123,7 +119,7 @@ msgstr ""
msgid "None"
msgstr ""
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:69
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:71
msgid "Flatten/Unflatten tree"
msgstr ""
@ -135,7 +131,7 @@ msgstr ""
msgid "Project"
msgstr ""
#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:68
#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:67
#: ganttzk/src/main/resources/web/ganttz/zul/leftTasksTree.zul:28
msgid "Name"
msgstr ""
@ -144,27 +140,23 @@ msgstr ""
msgid "Name filter"
msgstr ""
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:572
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:609
msgid "Show progress"
msgstr ""
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:66
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:67
msgid "Expand/Collapse all"
msgstr ""
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:56
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:58
msgid "Show/Hide critical path"
msgstr ""
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:36
msgid "Create Project"
msgstr ""
#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:32
msgid "Year"
msgstr ""
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:145
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:150
msgid "showing criteria"
msgstr ""
@ -172,7 +164,7 @@ msgstr ""
msgid "Month"
msgstr ""
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:63
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:64
msgid "Show/Hide resources"
msgstr ""
@ -180,11 +172,11 @@ msgstr ""
msgid "Set End-Start"
msgstr ""
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:302
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:298
msgid "decreasing zoom"
msgstr ""
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:559
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:590
msgid "Hide critical path"
msgstr ""
@ -192,19 +184,19 @@ msgstr ""
msgid "Day"
msgstr ""
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:599
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:636
msgid "Hide reported hours"
msgstr ""
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadComponent.java:182
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadComponent.java:193
msgid "Load: {0}%"
msgstr ""
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:142
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:147
msgid "showing resources"
msgstr ""
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:60
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:61
msgid "Show/Hide labels"
msgstr ""
@ -212,8 +204,8 @@ msgstr ""
msgid "Hour"
msgstr ""
#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:91
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:116
#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:90
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:114
msgid "Graphics"
msgstr ""
@ -221,30 +213,30 @@ msgstr ""
msgid "Set Start-Start"
msgstr ""
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadComponent.java:141
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadComponent.java:152
msgid "See resource allocation"
msgstr ""
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:285
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:281
msgid "increasing zoom"
msgstr ""
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:455
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:467
msgid "Show all elements"
msgstr ""
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:454
#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:466
msgid "All"
msgstr ""
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:39
#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:38
msgid "Refresh"
msgstr ""
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:554
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:585
msgid "Show critical path"
msgstr ""
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:577
#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:614
msgid "Hide progress"
msgstr ""

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

@ -32,7 +32,6 @@ planner = self;
<separator/>
<!-- Commands -->
<templateFinderPopup id="templateFinderPopup" acceptButtonLabel="${ganttzk_i18n:_('Create Project')}" caption="${i18n:_('Choosing Template')}" />
<button onClick="planner.invalidate()"
image="/common/img/ico_refresh.png"

View file

@ -40,7 +40,7 @@ resourcesLoadPanel = self;
<separator/>
<hbox id="additionalFilterInsertionPoint1" />
<separator/>
${ganttzk_i18n:_('Filter')}:
${ganttzk_i18n:_('Show')}:
<listbox id="listFilters" mold="select" rows="1" width="100px"
model="${resourcesLoadPanel.filters}"
selectedIndex="0"
@ -58,11 +58,11 @@ resourcesLoadPanel = self;
<center border="0">
<borderlayout sclass="resourcesload">
<west size="250px" flex="true" collapsible="true"
splittable="true" autoscroll="false">
<borderlayout >
splittable="true" autoscroll="false" border="0">
<borderlayout>
<north border="0" height="35px" flex="true" collapsible="true">
<vbox pack="top" align="center">
<tree fixedLayout="true" hflex="true">
<tree fixedLayout="true" hflex="true" sclass="resourceloaddetailsContainer">
<treecols>
<treecol label="${ganttzk_i18n:_('Name')}" height="29px"/>
</treecols>

View file

@ -60,7 +60,13 @@ ganttz.TaskComponent = zk.$extends(zul.Widget, {
$define :{
resourcesText : null,
labelsText : null,
tooltipText : null
tooltipText : null,
left: function() {
this.$supers('setLeft', arguments);
this._getRelatedDependencies().forEach(function(dependency) {
dependency.draw();
});
}
},
$init : function(){
this.$supers('$init', arguments);
@ -114,6 +120,14 @@ ganttz.TaskComponent = zk.$extends(zul.Widget, {
consolidateNewDependency : function(task){
zAu.send(new zk.Event(this, 'onAddDependency', {dependencyId : task.id}));
},
_getRelatedDependencies: function() {
return jq('.dependency[idtaskorig='+ this.uuid + ']')
.add('.dependency[idtaskend='+ this.uuid + ']')
.get()
.map(function(dep) {
return ganttz.DependencyComponentBase.$(dep);
});
},
_addDragDrop : function(){
var dragdropregion = this._getDragDropRegion();
var thisTaskId = this.$n().id;
@ -177,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
@ -202,10 +216,10 @@ ganttz.TaskComponent = zk.$extends(zul.Widget, {
jq('#consolidatedline' + this.parent.uuid).css('left', width);
},
resizeCompletionAdvance : function(width){
jq('#' + this.uuid + ' > .completion:first').css('width', width);
jq('#' + this.uuid + ' .completion:first').css('width', width);
},
resizeCompletion2Advance : function(width){
jq('#' + this.uuid + ' > .completion2:first').css('width', width);
jq('#' + this.uuid + ' .completion2:first').css('width', width);
},
showResourceTooltip : function(){
jq('#'+ this.uuid + ' .task-resources').show();
@ -213,6 +227,12 @@ ganttz.TaskComponent = zk.$extends(zul.Widget, {
hideResourceTooltip : function(){
jq('#'+ this.uuid + ' .task-resources').hide();
},
showLabels : function(){
jq('.task-labels',this.$n()).show();
},
hideLabels : function(){
jq('.task-labels',this.$n()).hide();
},
setClass : function(cssClass){
jq(this.$n()).addClass(cssClass);
}

View file

@ -6,7 +6,8 @@ ganttz.TaskList = zk.$extends(zk.Widget, {
this.$class.setInstance(this);
},
showAllTaskLabels : function(){
jq('.task-labels').css('display','inline');
for(var child = this.firstChild; child; child = child.nextSibling)
child.showLabels();
},
hideAllTaskLabels : function(){
jq('.task-labels').css('display','none');

View file

@ -1,10 +1,22 @@
zk.$package("ganttz");
ganttz.TaskRow = zk.$extends(zk.Widget, {
_labelsHidden : true,
showLabels : function(){
this._labelsHidden = false;
this.firstChild.showLabels();
},
hideLabels : function(){
this._labelsHidden = true;
this.firstChild.hideLabels();
},
_resourcesHidden : true,
hideResourceTooltip : function(){
this._resourcesHidden = true;
this.firstChild.hideResourceTooltip();
},
showResourceTooltip : function(){
this._resourcesHidden = false;
this.firstChild.showResourceTooltip();
}
});

View file

@ -3,8 +3,11 @@ function(out){
' z.type="ganttz.task.Task" idTask="', this.id,'"',
' class="box" >');
out.push('<div class="task-labels">', this.getLabelsText(),'</div>');
out.push('<div class="task-resources">');
out.push('<div class="task-labels" ',
this.parent._labelsHidden?'>':'style="display:block;">',
this.getLabelsText(),'</div>');
out.push('<div class="task-resources" ',
this.parent._resourcesHidden?'>':'style="display:block;">');
out.push('<div class="task-resources-inner">', this.getResourcesText(),'</div>');
out.push('</div>');

View file

@ -5,7 +5,7 @@
<parent>
<groupId>org.libreplan</groupId>
<artifactId>libreplan</artifactId>
<version>1.1.3</version>
<version>1.2.0</version>
</parent>
<artifactId>libreplan-business</artifactId>
<packaging>jar</packaging>

View file

@ -95,7 +95,7 @@ public class AdvanceMeasurement extends BaseEntity {
@NotNull(message = "value not specified")
public BigDecimal getValue() {
return value != null ? value : BigDecimal.ZERO;
return value;
}
public void setAdvanceAssignment(AdvanceAssignment advanceAssignment) {

View file

@ -144,12 +144,6 @@ public class DirectAdvanceAssignment extends AdvanceAssignment {
RoundingMode.DOWN);
}
public void addAdvanceMeasurements(Set<AdvanceMeasurement> measurements) {
for (AdvanceMeasurement each: measurements) {
addAdvanceMeasurements(each);
}
}
public boolean addAdvanceMeasurements(AdvanceMeasurement advanceMeasurement) {
boolean result = this.advanceMeasurements.add(advanceMeasurement);
if (result) {
@ -265,4 +259,8 @@ public class DirectAdvanceAssignment extends AdvanceAssignment {
return copy;
}
public boolean hasAnyConsolidationValue() {
return !nonCalculatedConsolidations.isEmpty();
}
}

View file

@ -81,4 +81,8 @@ public class IndirectAdvanceAssignment extends AdvanceAssignment {
return calculatedConsolidations;
}
public boolean hasAnyConsolidationValue() {
return !calculatedConsolidations.isEmpty();
}
}

View file

@ -22,12 +22,12 @@
package org.libreplan.business.calendars.daos;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.criterion.Restrictions;
import org.libreplan.business.calendars.entities.BaseCalendar;
import org.libreplan.business.calendars.entities.CalendarData;
@ -60,6 +60,7 @@ public class BaseCalendarDAO extends IntegrationEntityDAO<BaseCalendar>
public List<BaseCalendar> getBaseCalendars() {
List<BaseCalendar> list = list(BaseCalendar.class);
removeResourceCalendarInstances(list);
Collections.sort(list);
return list;
}

View file

@ -23,7 +23,6 @@ package org.libreplan.business.calendars.entities;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@ -58,7 +57,7 @@ import org.libreplan.business.workingday.ResourcesPerDay;
* @author Manuel Rego Casasnovas <mrego@igalia.com>
*/
public class BaseCalendar extends IntegrationEntity implements ICalendar,
IHumanIdentifiable {
IHumanIdentifiable, Comparable<BaseCalendar> {
private static final Capacity DEFAULT_VALUE = Capacity.zero()
.overAssignableWithoutLimit();
@ -83,23 +82,6 @@ public class BaseCalendar extends IntegrationEntity implements ICalendar,
return calendar;
}
public static List<BaseCalendar> sortByName(List<BaseCalendar> baseCalendars) {
Collections.sort(baseCalendars, new Comparator<BaseCalendar>() {
@Override
public int compare(BaseCalendar o1, BaseCalendar o2) {
if (o2.getName() == null) {
return -1;
}
if (o1.getName() == null) {
return 1;
}
return o1.getName().compareTo(o2.getName());
}
});
return baseCalendars;
}
private static void resetDefaultCapacities(BaseCalendar calendar) {
CalendarData calendarData = calendar.getLastCalendarData();
if (calendarData != null) {
@ -1227,4 +1209,9 @@ public class BaseCalendar extends IntegrationEntity implements ICalendar,
return name;
}
@Override
public int compareTo(BaseCalendar calendar) {
return this.getName().compareToIgnoreCase(calendar.getName());
}
}

View file

@ -47,11 +47,11 @@ public class CalendarBootstrap implements ICalendarBootstrap {
@Override
@Transactional
public void loadRequiredData() {
for (PredefinedCalendarExceptionTypes type : PredefinedCalendarExceptionTypes
.values()) {
if (calendarExceptionTypeDAO.getAll().size() == 0) {
for (PredefinedCalendarExceptionTypes type : PredefinedCalendarExceptionTypes
.values()) {
CalendarExceptionType calendarExceptionType = type
.getCalendarExceptionType();
if (!calendarExceptionTypeDAO.existsByName(calendarExceptionType)) {
.getCalendarExceptionType();
calendarExceptionType
.setCode(entitySequenceDAO
.getNextEntityCodeWithoutTransaction(EntityNameEnum.CALENDAR_EXCEPTION_TYPE));

View file

@ -29,12 +29,11 @@ package org.libreplan.business.calendars.entities;
*/
public enum PredefinedCalendarExceptionTypes {
HOLIDAY("HOLIDAY", CalendarExceptionTypeColor.DEFAULT, true),
SICK_LEAVE("SICK_LEAVE", CalendarExceptionTypeColor.DEFAULT, true),
LEAVE("LEAVE", CalendarExceptionTypeColor.DEFAULT, true),
STRIKE("STRIKE", CalendarExceptionTypeColor.DEFAULT, true),
RESOURCE_HOLIDAY("RESOURCE_HOLIDAY", CalendarExceptionTypeColor.YELLOW, true),
LEAVE("LEAVE", CalendarExceptionTypeColor.MAGENTA, true),
STRIKE("STRIKE", CalendarExceptionTypeColor.PURPLE, true),
BANK_HOLIDAY("BANK_HOLIDAY", CalendarExceptionTypeColor.DEFAULT, true),
WORKABLE_BANK_HOLIDAY("WORKABLE_BANK_HOLIDAY", CalendarExceptionTypeColor.DEFAULT, false);
HALF_DAY_HOLIDAY("HALF_DAY_HOLIDAY", CalendarExceptionTypeColor.ORANGE, false);
private CalendarExceptionType calendarExceptionType;

View file

@ -291,7 +291,8 @@ public class Configuration extends BaseEntity {
}
public ProgressType getProgressType() {
return progressType;
return (progressType == null) ? ProgressType.SPREAD_PROGRESS
: progressType;
}
public void setCompanyLogoURL(String companyLogoURL) {

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

@ -46,6 +46,8 @@ public interface ITypeOfWorkHoursDAO extends
boolean existsByCode(TypeOfWorkHours typeOfWorkHours);
boolean existsByName(TypeOfWorkHours typeOfWorkHours);
boolean existsTypeWithCodeInAnotherTransaction(String code);
List<TypeOfWorkHours> findActive();

View file

@ -167,4 +167,11 @@ public class TypeOfWorkHoursDAO extends IntegrationEntityDAO<TypeOfWorkHours>
}
}
@Override
public boolean existsByName(TypeOfWorkHours typeOfWorkHours) {
Criteria c = getSession().createCriteria(TypeOfWorkHours.class).add(
Restrictions.eq("name", typeOfWorkHours.getName()));
return c.uniqueResult() != null;
}
}

View file

@ -0,0 +1,32 @@
/*
* This file is part of LibrePlan
*
* Copyright (C) 2011 CafédeRed Solutions, S.L.
*
* 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/>.
*/
package org.libreplan.business.costcategories.entities;
import org.libreplan.business.IDataBootstrap;
/**
* Interface for {@link TypeOfWorkHoursBootstrap}.
*
* @author Ignacio Díaz Teijido <ignacio.diaz@cafedered.com>
*/
public interface ITypeOfWorkHoursBootstrap extends IDataBootstrap {
void loadRequiredData();
}

View file

@ -0,0 +1,56 @@
/*
* This file is part of LibrePlan
*
* Copyright (C) 2011 CafédeRed Solutions, S.L.
*
* 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/>.
*/
package org.libreplan.business.costcategories.entities;
import java.math.BigDecimal;
/**
* Defines the default {@link TypeOfWorkHours}.
*
* @author Ignacio Díaz Teijido <ignacio.diaz@cafedered.com>
*/
public enum PredefinedTypeOfWorkHours {
DEFAULT("Default", 30), OVERTIME("Overtime", 50);
private TypeOfWorkHours typeOfWorkHours;
private PredefinedTypeOfWorkHours(String name, double price) {
typeOfWorkHours = TypeOfWorkHours.create();
typeOfWorkHours.setName(name);
typeOfWorkHours.setDefaultPrice(new BigDecimal(price).setScale(2));
}
public TypeOfWorkHours getTypeOfWorkHours() {
return typeOfWorkHours;
}
public static boolean contains(TypeOfWorkHours typeOfWorkHours) {
PredefinedTypeOfWorkHours[] types = PredefinedTypeOfWorkHours.values();
for (PredefinedTypeOfWorkHours each : types) {
if (each.getTypeOfWorkHours().getName()
.equals(typeOfWorkHours.getName())) {
return true;
}
}
return false;
}
}

View file

@ -0,0 +1,62 @@
/*
* This file is part of LibrePlan
*
* Copyright (C) 2011 CafédeRed Solutions, S.L.
*
* 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/>.
*/
package org.libreplan.business.costcategories.entities;
import org.libreplan.business.common.daos.IEntitySequenceDAO;
import org.libreplan.business.common.entities.EntityNameEnum;
import org.libreplan.business.costcategories.daos.ITypeOfWorkHoursDAO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
/**
* Creates the default {@link TypeOfWorkHours}.
*
* @author Ignacio Díaz Teijido <ignacio.diaz@cafedered.com>
*/
@Component
@Scope("singleton")
public class TypeOfWorkHoursBootstrap implements ITypeOfWorkHoursBootstrap {
@Autowired
private ITypeOfWorkHoursDAO typeOfWorkHoursDAO;
@Autowired
private IEntitySequenceDAO entitySequenceDAO;
@Override
@Transactional
public void loadRequiredData() {
if (typeOfWorkHoursDAO.findAll().size() == 0) {
for (PredefinedTypeOfWorkHours predefinedTypeOfWorkHours : PredefinedTypeOfWorkHours
.values()) {
TypeOfWorkHours typeOfWorkHours = predefinedTypeOfWorkHours
.getTypeOfWorkHours();
typeOfWorkHours.setCodeAutogenerated(true);
typeOfWorkHours
.setCode(entitySequenceDAO
.getNextEntityCodeWithoutTransaction(EntityNameEnum.WORK_HOURS_TYPE));
typeOfWorkHoursDAO.save(typeOfWorkHours);
}
}
}
}

View file

@ -36,7 +36,8 @@ import org.libreplan.business.users.entities.User;
*
* @author Jacobo Aragunde Perez <jaragunde@igalia.com>
*/
public class ExternalCompany extends BaseEntity implements IHumanIdentifiable{
public class ExternalCompany extends BaseEntity implements IHumanIdentifiable,
Comparable<ExternalCompany> {
private String name;
@ -195,4 +196,9 @@ public class ExternalCompany extends BaseEntity implements IHumanIdentifiable{
return name;
}
@Override
public int compareTo(ExternalCompany company) {
return this.getName().compareToIgnoreCase(company.getName());
}
}

Some files were not shown because too many files have changed in this diff Show more