diff --git a/AUTHORS b/AUTHORS index ccecbc2ce..32ea817b1 100644 --- a/AUTHORS +++ b/AUTHORS @@ -31,9 +31,19 @@ Previous Team Members Translators ----------- -* [es] Manuel Rego Casasnovas -* [gl] Manuel Rego Casasnovas -* [pt] Helena Grosso +* [es] Jacobo Aragunde Pérez , + Manuel Rego Casasnovas , + Diego Pino García +* [fr] Stephane Ayache , + Guillaume Postaire , + Philippe Poumaroux +* [gl] Jacobo Aragunde Pérez , + Manuel Rego Casasnovas , + Diego Pino García +* [it] Giuseppe Zizza +* [nl] Jeroen Baten +* [pt] Helena Grosso , + Joaquim Rocha * [ru] Pavel Rudensky diff --git a/HACKING b/HACKING index d61b2fad8..30aa2b9a4 100644 --- a/HACKING +++ b/HACKING @@ -72,10 +72,11 @@ Debian/Ubuntu * Download source code:: - $ git clone git://navalplan.git.sourceforge.net/gitroot/navalplan/navalplan + $ git clone git://libreplan.git.sourceforge.net/gitroot/libreplan/libreplan * Compile project:: + $ cd libreplan/ $ mvn clean install * Launch application:: @@ -121,10 +122,11 @@ Fedora * Download source code:: - $ git clone git://navalplan.git.sourceforge.net/gitroot/navalplan/navalplan + $ git clone git://libreplan.git.sourceforge.net/gitroot/libreplan/libreplan * Compile project:: + $ cd libreplan/ $ mvn clean install * Launch application:: @@ -181,10 +183,11 @@ openSUSE * Download source code:: - $ git clone git://navalplan.git.sourceforge.net/gitroot/navalplan/navalplan + $ git clone git://libreplan.git.sourceforge.net/gitroot/libreplan/libreplan * Compile project:: + $ cd libreplan/ $ mvn clean install * Launch application:: @@ -325,6 +328,13 @@ profiles defined in ``pom.xml`` of business and webapp modules). This is used to generate upgrade files in releases. +* *i18n* - Internationalization (default) + + It uses gettext to process language files in order to be used in *LibrePlan*. + + Like for *reports* and *userguide*, it is useful deactivate this profile + during development to save compilation time. + How to use profiles ~~~~~~~~~~~~~~~~~~~ @@ -332,9 +342,9 @@ Profiles active by default are used always if not deactivated. In order to activate or deactivate a profile you should use parameter ``-P`` for Maven command. For example: -* Deactivate *reports* and *userguide* to save compilation time:: +* Deactivate *reports*, *userguide* and *i18n* to save compilation time:: - mvn -P-reports,-userguide clean install + mvn -P-reports,-userguide,-i18n clean install * Use production environment:: diff --git a/INSTALL b/INSTALL index be7b0574a..aa0b86ef2 100644 --- a/INSTALL +++ b/INSTALL @@ -24,18 +24,29 @@ Instructions:: $ sudo apt-get update $ sudo apt-get install libreplan +.. TIP:: + + If you do not have ``add-apt-repository`` command, you will need to install + ``python-software-properties`` package before running the previous commands. + You can do it with the following line:: + + sudo apt-get install python-software-properties + +.. WARNING:: + + If you have memory problems review the section `Fix memory errors`_. Debian packages ~~~~~~~~~~~~~~~ There are Debian packages for Squeeze (i386 and amd64), you can download them -from: http://sourceforge.net/projects/navalplan/files/LibrePlan/ +from: http://sourceforge.net/projects/libreplan/files/LibrePlan/ Instructions: * Download the package:: - $ wget http://downloads.sourceforge.net/project/navalplan/files/LibrePlan/libreplan_1.2.0-1_amd64.deb + $ wget http://downloads.sourceforge.net/project/libreplan/files/LibrePlan/libreplan_1.2.0-1_amd64.deb * Install package:: @@ -45,6 +56,60 @@ Instructions: # apt-get install -f +.. WARNING:: + + If you have problems with printing support review the section `Fix + printing in Debian Squeeze`_. + +.. WARNING:: + + If you have memory problems review the section `Fix memory errors`_. + +Fedora and openSUSE OBS (openSUSE Build Service) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Instructions depending on the distribution: + +* Fedora 16:: + + # cd /etc/yum.repos.d + # wget download.opensuse.org/repositories/home:/jsuarezr:/LibrePlan/Fedora_16/home:jsuarezr:LibrePlan.repo + # yum install libreplan + +* Fedora 15:: + + # cd /etc/yum.repos.d + # wget download.opensuse.org/repositories/home:/jsuarezr:/LibrePlan/Fedora_15/home:jsuarezr:LibrePlan.repo + # yum install libreplan + +* openSUSE 12.1:: + + # cd /etc/zypp/repos.d + # wget download.opensuse.org/repositories/home:/jsuarezr:/LibrePlan/openSUSE_12.1/home:jsuarezr:LibrePlan.repo + # zypper ref + # zypper install libreplan + +* openSUSE 11.4:: + + # cd /etc/zypp/repos.d + # wget download.opensuse.org/repositories/home:/jsuarezr:/LibrePlan/openSUSE_11.4/home:jsuarezr:LibrePlan.repo + # zypper ref + # zypper install libreplan + +.. WARNING:: + + If you have memory problems review the section `Fix memory errors`_. + +RPM Packages +~~~~~~~~~~~~ + +There are several LibrePlan RPM packages available in the following URL: +http://download.opensuse.org/repositories/home:/jsuarezr:/LibrePlan/ + +.. WARNING:: + + If you have memory problems review the section `Fix memory errors`_. + LibrePlan manual installation ----------------------------- @@ -68,15 +133,24 @@ Debian/Ubuntu * Download database installation script:: - $ wget -O install.sql http://downloads.sourceforge.net/project/navalplan/LibrePlan/install_1.2.0.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/navalplan/LibrePlan/libreplan_1.2.0.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 +202,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 +249,24 @@ openSUSE * Download database installation script:: - $ wget -O install.sql http://downloads.sourceforge.net/project/navalplan/LibrePlan/install_1.2.0.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/navalplan/LibrePlan/libreplan_1.2.0.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 @@ -219,3 +307,73 @@ folder under ``/var/log/tomcat6/`` with ``.war`` name. For example: 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 + + +Fix memory errors +----------------- + +With the default parameters of Tomcat in the different distributions you could +have problems with Java memory. + +After a while using LibrePlan you could see that some windows do not work and +the log shows a ``java.lang.OutOfMemoryError`` exception. + +This exception could be caused because of two different issues: + +* Heap space:: + + java.lang.OutOfMemoryError: Java heap space + +* PermGemp space (Permanent Generation, reflective data for the JVM):: + + java.lang.OutOfMemoryError: PermGen space + +In order to avoid this problem you need to configure properly ``JAVA_OPTS`` +variable in your server. This is configured in different files depending on the +distribution: + +* Debian or Ubuntu: ``/etc/default/tomcat6`` +* Fedora or openSUSE: ``/etc/tomcat6/tomcat6.conf`` + +The next lines show a possible configuration to fix the memory errors (the exact +values depends on the server features):: + + JAVA_OPTS="-Xms512m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m" + JAVA_OPTS="${JAVA_OPTS} -server -Djava.awt.headless=true" + +Where the different parameters have the following meaning: + +* ``-Xms``: Initial size of the Java heap +* ``-Xmx``: Maximum size of the Java heap +* ``-XX:PermSize``: Initial size of PermGen +* ``-XX:MaxPermSize``: Maximum size of PermGen + +.. NOTE:: + + Take into account that size of PermGen is additional to heap size. diff --git a/NEWS b/NEWS index eb1b3c2d5..d17ce1e90 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,391 @@ NEWS ==== +Version 1.2.2 (15 Mar 2012) +--------------------------- + +Summary +~~~~~~~ + +Minor release of LibrePlan including all the maintanance work and small +enhancements done since 1.2.1. + +The major developments which come with this new version are the next ones: + +* We are going to provide for the first time RPM packages for the main + GNU/Linux distributions based on this package format. This has been a + contribution of Juan A. Suárez Romero. + +* LibrePlan interface is available in two new languages thanks to our growing + translators community: + + * French. Thanks to Stephane Ayache, Guillaume Postaire and + Philippe Poumaroux. + * Dutch. Thanks to Jeroen Baten. + +* Two new planning features have been added: + + * The Gantt chart has been improved to include a graphic representation of the + start date of a project through a dashed black vertical line. This is very + useful to have always visible when a project starts. + * If there are violated dependencies in the Gantt charts because of the higher + precendence of the task constraints, the dependencies are painted in red. + +* Some small user experience enhancements: + + * The project status is displayed in the Gantt chart next to the breadcrumb. + * States that represent a closed project (finished, canceled, stored) are + represented in the projects planning view (home page of the application) + with a grey color. So, from now on the code color is the next one: + + * Light blue. For projects without any allocated task and not closed. + * Dark blue. For project with any allocated task and not closed. + * Grey. For closed projects. + + * To measure progress is now a bit faster. The focus is automatically set in + the textbox of the row just created for the new progress value. + +* LDAP authentication system has been improved: + + * LDAP users cannot change the password in the LibrePlan interface. + * Managers cannot manage LDAP user roles if they are being imported from the + configured directory. + +Apart from this, the new versions come with fixes of many issues detected by +our users and that can be read in the Changes section. + +Notes +~~~~~ + +If you are upgrading from any 1.1.x version without using the Debian package, +you will need to manually execute on your database the SQL sentences from files: +``scripts/database/upgrade_1.2.0.sql``, ``scripts/database/upgrade_1.2.1.sql`` +and ``scripts/database/upgrade_1.2.2.sql``. + +If you are upgrading from 1.2.0 version without using the Debian package, +you will need to manually execute on your database the SQL sentences from files: +``scripts/database/upgrade_1.2.1.sql`` and +``scripts/database/upgrade_1.2.2.sql``. + +If you are upgrading from 1.2.1 version without using the Debian package, +you will need to manually execute on your database the SQL sentences from file: +``scripts/database/upgrade_1.2.2.sql``. + +Contributors +~~~~~~~~~~~~ + +Thanks to all the contributors to this new version: + +* Jacobo Aragunde Pérez +* Nacho Barrientos +* Ignacio Díaz Teijido +* Lucía García Fernández +* Óscar González Fernández +* Manuel Rego Casasnovas +* Juan A. Suárez Romero +* Lorenzo Tilve Álvaro + +Translators +~~~~~~~~~~~ + +Thanks to all the translators in this new version: + +* [es] Manuel Rego Casasnovas +* [fr] Stephane Ayache, Guillaume Postaire, Philippe Poumaroux +* [gl] Manuel Rego Casasnovas +* [it] Giuseppe Zizza +* [nl] Jeroen Baten +* [pt] Joaquim Rocha + +Changes +~~~~~~~ + +* Update RPM package for LibrePlan 1.2.2 +* Update Debian package for LibrePlan 1.2.2 +* Update database scripts for LibrePlan 1.2.2 +* Remove some unneeded lines in libreplan.spec +* www: Add new README files for Fedora and openSUSE in libreplan.org +* Rename database scripts to create database and user +* Prepare libreplan spec file for the release 1.2.2. +* Add LibrePlan RPM spec file +* Add instructions to configure LibrePlan in openSUSE +* Add instructions to configure LibrePlan in Fedora +* Add Tomcat6 configuration file +* Add scripts to create database and user libreplan +* Add CutyCapt RPM spec file +* Updated documentation about the new i18n profile +* Wrap gettext plugin inside a new profile i18n to save time while developing +* Bug #1362: Specify type of property in Templates.hbm.xml to avoid problems with MySQL +* doc: Removed legacy project logos from documentation screenshots +* Make bigger the description field in templates edition +* Bug #1398: Fix problem with long descriptions in templates +* Bug #1397: Revert a previous commit to avoid the problem +* Bug #1393: Fix NPE moving milestone +* Bug #1394: Fix problem because of deletedWorkReportLinesSet set was not reseted +* Change URL to demo in REST services example scripts +* Bug #1387: Reset the TaskSource when an OrderGroup changes to scheduling point. +* Bug #1390: correct method TaskComponent.setClass to overwrite the classes instead of adding them. +* doc: Update AUTHORS file info about new Dutch translator +* i18n: Add Dutch language to enum and modify pom.xml to use English userguide +* i18n: Add Dutch translation +* Bug #1382: Fix the bug in all cases. +* Bug #1382: Synchronize deadline dates between the WBS and the Gantt views. +* Bug 1383: Fixed corner case of deadline and current day right position +* Displayed project start vertical line with independency of project deadline +* Added vertical line in scheduling perspective to display project start date +* Bug #1344: Fix bug moving the addition of ConstraintViolationListeners to doAfterCompose instead of constructor. +* Remove redundant call to scheduling algorithm from TaskPropertiesController. +* Some API docs for the entering/reentering part +* Remove uneeded parameters to prevent redundant invocations to scheduling algorithm. +* Use more accurate name +* Bug #1354: Fix bug +* i18n: Update Portuguese translation +* i18n: Update Italian translation +* Update French translation +* Bug #1355: transform AS SOON AS POSSIBLE and AS LATE AS POSSIBLE constraints to the correct constraint based on the scheduling mode. +* Bug #1355: transform NOT EARLIER THAN and NOT LATER THAN constraints to the correct constraint based on the scheduling mode. +* Bug #1380: Don't allow ASAP constraint for tasks in projects where init date is not set. +* i18n: Update Spanish and Galician translations +* i18n: Update keys.pot files +* Bug #1374: Move capacity field to calendar tab in order to be edited together +* i18n: Avoid to translate language names and use the original ones +* Bug #1355: START IN FIXED DATE constraints don't change to NOT EARLIER THAN after drag & drop. +* Bug #1281: Remove unneeded checkVersion when editing progresses +* Bug #1375: Added a constraint for 24 hours and 0 minutes +* Disables the button save in change password window and remove role and profile button on edit user +* Added condition to method isLdapUser to check configuration +* Disallow to change roles and profiles in admin panel for LDAP users when roles are imported from LDAP +* Disallow managing passwords in admin users panel for LDAP users when LDAP is being used for authentication +* Disallow to change passwords to LDAP users +* Mark "Group by weeks" by default in MonteCarlo as it returns better results +* Bug #1379: Disable "Go" button in MonteCarlo if there is no tasks in a project +* Bug #1348: Added effort to predefined calendar exception types +* Bug #1282, #1376: Prevent exception when deleting a milestone inside a container. +* Correct a typo in an English string. +* Bug #1362: Specify type of property in hbm.xml to avoid problems with MySQL +* Bug #1343: Only closed projects in company view perspective are displayed in grey +* Bug #1343: Made graphically less relevant component showing project state +* Bug #1345: Added project state to name string in breadcrumbs line +* Bug #1343: Styled in grey all closed/finished/cancelled projects in company view +* Bug #1370: Fixed progress bars not being properly placed inside containers +* Bug #1373: When creating new projects from template the explicitly filled start date and deadline values are used +* Bug #1369: Moved the template combobox over autogenerated code checkbox in new project popup +* Bug #1369: Improved behaviour of project creation popup when using templates +* Bug #1343: Added method isRoot() to gantt tasks. +* doc: Update translators info in documentation +* Update AUTHORS file info about translators +* i18n: Add French language to enum and modify pom.xml to use English userguide +* i18n: Add French translation +* Bug #1343: Prevent NullPointerException when creating a new milestone. +* Remove redraw listeners for dependencies once these dependencies are removed. +* Prevent unnecessary redraws of dependencies when opening a container. +* Bug #1363: Remove visibility listeners corresponding to deleted tasks. +* Bug #1343: Prevent NullPointerException when showing default filtering dates on company view. +* Bug #1368: Allows to create users with null password when LDAP is used. +* Removed two warnings in the build process, which can cause problems with newer versions of maven. +* Bug #1343: Ensure that getDefaultPredicate is run in a transactional context. +* Bug #1343: Mark closed projects with a special class in the gantt. +* Bug #1343: Use getRawValue instead of getValue in date constraint checkers. +* Bug #1343: Allow showing closed projects in the company view, if they are inside the filter dates. +* Bug #1343: Show default filtering dates on company view. +* Bug #1343: Rewrite part of the code for company view initialization. +* Bug #1353: Create Tabpanels object for load/earned value Tabbox when the screen is loaded, not in the open event. +* Bug #1359: Initialize the resources when the page is loaded, independently from the hidden/shown property of the load chart. +* Bug #1357: Use end date minus one day as default date for earned value chart. +* Bug #1351: Replaced by a label the disabled listbox to display material unit type +* Bug #1351: fixed space for elements +* Bug #1330: Setted focus on new progress measurement after pressing on *Add measure* +* Bug #1357: Check if the date is out of the visualization area, and in that case set a new date before updating the legend. +* Bug #1357: Small code rewrite to simplify the fix of the bug +* Update TODO file with roadmap to LibrePlan 1.3 +* Bug #1366: Fix issue subtracting the value when you are removing work report lines +* Bug #1360: Refresh work report line from database before subtracting it from order elements +* Bug #1364: Milestones are filtered now like any other task +* Bug #1362: Fix problem with long descriptions in projects +* Bug #1352: Fix issue not saving tasks without order element +* Bug #1320: When asking a container for start constraints, return the leftmost of children's start-in-fixed-date constraints. +* Revert "[Bug #1273] Reimplement coerceToString as a workaround for the bug in Decimalbox." +* Upgrade ZK version to 5.0.10 +* doc: Update information in UPDATE file + + +Version 1.2.1 (19 Jan 2012) +--------------------------- + +Summary +~~~~~~~ + +This is a minor release including all the fixes done since LibrePlan 1.2.0 was +published at the beginning of past December. + +Apart from all the bugs fixed, we would like to highlight the following changes: + +* LibrePlan is now fully translated into Italian thanks to the work done by + Giuseppe Zizza. +* When a new release of LibrePlan is published, administrators will be notified + with a small warning inside LibrePlan. +* Timeplot graph values are displayed when hovering the chart. + +Notes +~~~~~ + +If you are upgrading from any 1.1.x version without using the Debian package, +you will need to manually execute on your database the SQL sentences from files: +``scripts/database/upgrade_1.2.0.sql`` and +``scripts/database/upgrade_1.2.1.sql`` + +If you are upgrading from 1.2.0 version without using the Debian package, +you will need to manually execute on your database the SQL sentences from file: +``scripts/database/upgrade_1.2.1.sql`` + +Contributors +~~~~~~~~~~~~ + +Thanks to all the contributors to this new version: + +* Jacobo Aragunde Pérez +* Nacho Barrientos +* Ignacio Díaz Teijido +* Lucía García Fernández +* Manuel Rego Casasnovas +* Lorenzo Tilve Álvaro + +Translators +~~~~~~~~~~~ + +Thanks to all the translators in this new version: + +* [es] Manuel Rego Casasnovas +* [gl] Manuel Rego Casasnovas +* [it] Giuseppe Zizza +* [pt] Joaquim Rocha + +Changes +~~~~~~~ + +* i18n: Update Portuguese translation +* Bug #1335: Don't force the check of the earned value legend date box every time the gantt is reloaded. +* Improve logging of possible exceptions checking version information +* Bug #1342: Move initial order state to PlanningState and use it from Gantt view too +* Bug #1346: Fix the cause of the bug removing TaskElement from parent if it is removed +* Bug #1342: Show save button in Gantt view when it is disabled +* Bug #1342: Now it's possible to mark a project like STORED +* Bug #1335: Update the earned value chart legend every time the chart is reloaded. +* doc: Update LDAP configuration translations +* Remove unused code in LibrePlanReportController +* i18: Remove unneeded code to manage languages in reports +* i18n: Add support to Italian language in reports +* i18n: Update Italian translation and add missing files for reports +* i18n: Update Spanish and Galician translations +* Bug #1340: Add a listener to refresh the earned value chart in AdvanceAssignmentPlanningController. +* Bug #1334: Prevent the accumulation of the values when building the BCWP chart. +* Fix typo precision is just with 1 s +* i18n: Update keys.pot files +* Fix typo in open reports string +* Fix typo in new version string +* Add information about current version in GET requests +* Add VERSION file just with version number in a text file +* Add configuration option to allow LibrePlan developers collect usage stats +* Add configuration option to disable warning about new LibrePlan versions +* Show a warning if there is a new project version published. +* Bug #1336: Checked permissions to enable project creation button +* Fixed chart tooltips scroll problem on resources load window +* Bug #1338: Fix some wrong strings in timeLineRequiredMaterial report +* Bug 1295: Remove TaskElements (except milestones) with TaskSource null when saving +* Fixed wrong criteria string format +* Bug #1337: Removed unnecesary response when redrawing earned value +* Bug #1324: Modified behaviour of west end arrow on violated dependencies +* Display timeplot graph values when pointing over the chart +* doc: Update LDAP configuration doc +* Bug #1333: Allow specify * in role matching +* i18n: Add Italian language language to enum and modify pom.xml to use English userguide +* i18n: Add Giuseppe Zizza as Italian translator in AUTHORS file +* i18n: Add Italian translation +* Bug #1333: Fix issue as property and search query are needed for group strategy too +* Bug #1332: Fix problem allowing to set empty values for userDn and password +* Bug #1329: Fix problem in StretchesFunctionTest due to changes in previous test +* Bug #1329: Fix issue calculating properly end date of stretches +* Bug #1329: Now tasks are not enlarged and nothing breaks just after selecting a stretches function +* Bug #1329: Update advanced allocation row after applying default stretches function +* Bug #1328: Fix issue calling onClose method on controller +* Bug #1261: Extract method createTab with common functionality for each tab +* Bug #1261: Allows tabs to be memorized when changing perspective +* Bug #1327: Fix issue changing method to do reassignments in consolidation process +* www: Folder and script for libreplan.org documentation +* [Bug #1326] Fix issue calculating properly hours to allocate +* [Bug #1325] Fix issue remove criteria from configuration unit +* Allow reported hours bar in gantt diagram to be wider than the task. +* [Bug #1242] Don't allow progress end dates superior to the corresponding task end date. +* [Bug #1311] Replace Date objects with IntraDayDate objects in SaveCommandBuilder. +* [Bug #1321] Reseting highlighted days in calendar to prevent issue +* [Bug #1323] Fix lazy loading properly derived allocations +* [Bug #1242] Return end date directly when calculating advance and percentage is 100%. +* [Bug #1242] Use IntraDayDate to draw the progress bar in leaf Tasks. +* [Bug #1319] Change division method of EffortDuration +* [Bug #1304] Make sumOfAssignedEffort return the cached value only for orders. +* [Bug #1304] Reorder the code to improve the performance with TaskGroups. +* Replace attribute TaskElement.sumOfHoursAllocated with an equivalent attribute measured in EffortDuration. +* [Bug #1304] Don't use the cached value sumOfHoursAllocated when drawing the progress bars of tasks. +* Revert "[Bug #1319] Change division method of EffortDuration" +* [Bug #1309] Fix problem with reported hours bar when progress type is changed +* [Bug #1319] Change division method of EffortDuration +* [Bug #1309] Invalidate each TaskComponent instead of the whole TaskList when progress type is changed +* Hide warning messages on bottom when user is not admin +* [Bug #1288] Return null instead of zero in a just created AdvanceMeasurement +* [Bug #1288] Fix message regarding progress type precision +* [Bug #1288] Set Decimalbox scale according to progress type precision +* [Bug #1307] Prevent changing spread progress in children when parents are consolidated +* [Bug #1307] Prevent add progress measurement before consolidated day in any parent +* Refactor method getSpreadIndirectAdvanceAssignmentWithSameType to be used in more places +* Prevent NPE editing progress measurements +* [doc] Add warning on INSTALL file about how to create database structure +* [Bug #1308] Remove unneeded preventing create default progress in containers +* [Bug #1305] Prevent adding progress measurement before last consolidated date +* Fix messages related with progress management and consolidations +* Disable some options in progress management if there is a consolidated progress +* [doc] Update SourceForge.net URLs due to rename to LibrePlan +* [Bug #1316] Use correct JS selectors to work both with leaf tasks and task groups. +* Fix NPE removed advance measurement +* Remove unused method +* [Bug #1301] Fix issue creating a container in a task with dependencies +* Remove duplicated method in QualityForm +* [Bug #1314] Fix problem in materials report +* Skipping some tests in ScenarioModelTest because they were causing problems in Debian Wheezy +* Remove uneeded test as it was causing problems in Debian Wheezy +* Fix problems in MaterialDAOTest and MaterialServiceTest +* Fix problem with consolidation and specific assignments +* [Bug #1300] Updated intended resources per day after consolidation is added or removed +* [Bug #1312] Fix issue with printing in HTTPs is enabled +* [Bug #1303] Fix issue removing consolidation using IntraDayDate for task end +* [Bug #1303] Fix issue adding consolidation using IntraDayDate for task end +* [Bug #1310] Reorder the code to fix the two exceptions happening here. +* [Bug #1299] Enable scrollbars in the tasks input buffer grid. +* [Bug #1297] Add listeners to 'See schedule allocation' buttons every time the panel is redrawn. +* [Bug #1297] Replaced the misleading word "Filter" with "Show". +* [Bug #1297] Reset the list listenersToAdd when changing perspectives. +* [Bug #1073] Fix issue introduced by me while reviewing the previous patch +* [Bug #1294] Revert "Update i18n files with the new translations for the replaced string." +* [Bug #1073] Add dependencies with its parent when a milestone is added. +* [Bug #1294] Update i18n files with the new translations for the replaced string. +* [Bug #1294] Replace the sentence 'Click on direct link to go to output directly' with a better alternative. +* [doc] Add warning about printing issues in Debian Squeeze +* [doc] Add instructions to install Cutycapt from testing +* [Bug #1296] Rename Spanish and Galician .properties files as country was not needed +* [Bug #1296] Remove duplicated \*_en_US.properties files after updating \*.properties when required +* [Bug #1292] Replace Toolbarbutton object for the link to the PDF with an A object. +* Remove an unnecessary check. +* [Bug #1287] Fix NPE opening a project from Gantt view +* [Bug #1290] Fix NPE issue launching LibrePlan +* [Bug #1291] Fix NPE when a task with a dependency is removed +* [Bug #1285] Avoided NPE when dropping a treerow in the same component +* Add vertical borders in watermarks to improve differentiation between days +* Added transparency effect to hover treerow +* [Bug #1256] Removed inner padding on help tooltip +* Made more explicit links styles in headers +* Changed treerow input style for over elements +* [i18n] Update Portuguese translation + + Version 1.2.0 (01 Dec 2011) --------------------------- @@ -2579,8 +2964,8 @@ Changes * [Bug #] Fix division by zero in Gantt -Version 1.0.5 (8 Apr 2011) --------------------------- +Version 1.0.5 (08 Apr 2011) +--------------------------- Last bugfixing version of NavalPlan for 1.0.x cycle, like in previous releases it includes all the fixes done in the stable branch since 1.0.4. Among them we diff --git a/README b/README index 215034dae..58192027f 100644 --- a/README +++ b/README @@ -126,10 +126,10 @@ Availability ------------ The cutting-edge version of this project is always available from the Git -repository at http://navalplan.git.sourceforge.net/. +repository at http://libreplan.git.sourceforge.net/. Released versions are available at -http://sourceforge.net/projects/navalplan/files. +http://sourceforge.net/projects/libreplan/files/. Webpage diff --git a/README.Fedora b/README.Fedora new file mode 100644 index 000000000..7d6089137 --- /dev/null +++ b/README.Fedora @@ -0,0 +1,124 @@ +Configuring LibrePlan in Fedora for first time +============================================== + +This section explains how to set up LibrePlan in Fedora after installing the +package. + +It assumes that PostgreSQL is already running and configured to use ``md5`` as +the authentication method. + +If this is not the case, go to section "Configuring PostgreSQL to use ``md5`` +authentication method", at the end of this document. + + +1) Create libreplan database +---------------------------- + +# psql -h localhost -U postgres < /usr/share/libreplan/pgsql/create_db.sql + + +2) Create libreplan user +------------------------ + +# psql -h localhost -U postgres < /usr/share/libreplan/pgsql/create_user_postgresql.sql + + +3) Install LibrePlan database +----------------------------- + +# psql -h localhost -U libreplan -W libreplan < /usr/share/libreplan/pgsql/install.sql + + +4) Link LibrePlan configuration file in Tomcat6 configuration directory +----------------------------------------------------------------------- + +# ln -s /usr/share/libreplan/conf/libreplan.xml /etc/tomcat6/Catalina/localhost/ + + +5) Link Java JDBC driver for PostgreSQL in Tomcat6 libraries directory +---------------------------------------------------------------------- + +# ln -s /usr/share/java/postgresql-jdbc3.jar /usr/share/tomcat6/lib/ + + +6) Link LibrePlan WAR file in Tomcat6 we applications directory +--------------------------------------------------------------- + +# ln -s /usr/share/libreplan/webapps/libreplan.war /var/lib/tomcat6/webapps/ + + +7) Restart Tomcat6 +------------------ + +# service tomcat6 restart + + +LibrePlan should be running at http://localhost:8080/libreplan + + +Review INSTALL file for more information. + + +Upgrading LibrePlan a.b.c to LibrePlan x.y.z +============================================ + +This section explains how to upgrade LibrePlan from version a.b.c to version x.y.z. + + +1) Run upgrade scripts +---------------------- + +# psql -h localhost -U libreplan -W libreplan < /usr/share/libreplan/pgsql/upgrade_x.y.z.sql + +*VERY IMPORTANT*: If there are other versions between a.b.c and x.y.z, we need to execute those scripts in order, so the upgrade is done correctly. + + +2) Stop Tomcat6 +--------------- + +# service tomcat6 stop + + +3) Remove current deployed aplication +------------------------------------- + +# rm -rf /var/lib/tomcat6/webapps/libreplan/ + + +4) Start Tomcat6 +---------------- + +# service tomcat6 start + + +LibrePlan should be running at http://localhost:8080/libreplan + + + +Configuring PostgreSQL to use ``md5`` authentication method +=========================================================== + +We assume that PostgreSQL is using ``md5`` as the authentication method, instead of default ``ident``. + +These are the steps to change it. + + +1) Add a password to 'postgres' user (for instance, let's use 'postgres' as password') +-------------------------------------------------------------------------------------- + +# su postgres -c psql + +postgres=# ALTER USER postgres WITH PASSWORD 'postgres'; +postgres=# \q + + +2) Edit '/var/lib/pgsql/data/pg_hba.conf' and replace ``ident`` by ``md5`` +-------------------------------------------------------------------------- + +# sed -i "/^host/s/ident/md5/g" /var/lib/pgsql/data/pg_hba.conf + + +3) Restart PostgreSQL +--------------------- + +# service postgresql restart diff --git a/README.openSUSE b/README.openSUSE new file mode 100644 index 000000000..0fe59b4b1 --- /dev/null +++ b/README.openSUSE @@ -0,0 +1,129 @@ +Configuring LibrePlan in openSUSE for first time +================================================ + +This section explains how to set up LibrePlan in openSUSE after installing the +package. + +It assumes that PostgreSQL is already running and configured to use ``md5`` as +the authentication method. + +If this is not the case, go to section "Configuring PostgreSQL to use ``md5`` +authentication method", at the end of this document. + + +1) Create libreplan database +---------------------------- + +# psql -h localhost -U postgres < /usr/share/libreplan/pgsql/create_db.sql + + +2) Create libreplan user +------------------------ + +# psql -h localhost -U postgres < /usr/share/libreplan/pgsql/create_user_postgresql.sql + + +3) Install LibrePlan database +----------------------------- + +# psql -h localhost -U libreplan -W libreplan < /usr/share/libreplan/pgsql/install.sql + + +4) Link LibrePlan configuration file in Tomcat6 configuration directory +----------------------------------------------------------------------- + +# ln -s /usr/share/libreplan/conf/libreplan.xml /etc/tomcat6/Catalina/localhost/ + + +5) Download Java JDBC driver for PostgreSQL +------------------------------------------- + +# wget http://jdbc.postgresql.org/download/postgresql-9.0-801.jdbc3.jar -O /usr/share/java/postgresql-jdbc3.jar + + +6) Link Java JDBC driver for PostgreSQL in Tomcat6 libraries directory +---------------------------------------------------------------------- + +# ln -s /usr/share/java/postgresql-jdbc3.jar /usr/share/tomcat6/lib/ + + +7) Link LibrePlan WAR file in Tomcat6 we applications directory +--------------------------------------------------------------- + +# ln -s /usr/share/libreplan/webapps/libreplan.war /usr/share/tomcat6/webapps/ + + +8) Restart Tomcat6 +------------------ + +# service tomcat6 restart + + +LibrePlan should be running at http://localhost:8080/libreplan + +Review INSTALL file for more information. + + +Upgrading LibrePlan a.b.c to LibrePlan x.y.z +============================================ + +This section explains how to upgrade LibrePlan from version a.b.c to version x.y.z. + + +1) Run upgrade scripts +---------------------- + +# psql -h localhost -U libreplan -W libreplan < /usr/share/libreplan/pgsql/upgrade_x.y.z.sql + +*VERY IMPORTANT*: If there are other versions between a.b.c and x.y.z, we need to execute those scripts in order, so the upgrade is done correctly. + + +2) Stop Tomcat6 +--------------- + +# service tomcat6 stop + + +3) Remove current deployed aplication +------------------------------------- + +# rm -rf /usr/share/tomcat6/webapps/ + + +4) Start Tomcat6 +---------------- + +# service tomcat6 start + + +LibrePlan should be running at http://localhost:8080/libreplan + + + +Configuring PostgreSQL to use ``md5`` authentication method +=========================================================== + +We assume that PostgreSQL is using ``md5`` as the authentication method, instead of default ``ident``. + +These are the steps to change it. + + +1) Add a password to 'postgres' user (for instance, let's use 'postgres' as password') +-------------------------------------------------------------------------------------- + +# su postgres -c psql + +postgres=# ALTER USER postgres WITH PASSWORD 'postgres'; +postgres=# \q + + +2) Edit '/var/lib/pgsql/data/pg_hba.conf' and replace ``ident`` by ``md5`` +-------------------------------------------------------------------------- + +# sed -i "/^host/s/ident/md5/g" /var/lib/pgsql/data/pg_hba.conf + + +3) Restart PostgreSQL +--------------------- + +# service postgresql restart diff --git a/TODO b/TODO index ef633eeb9..6f346d83b 100644 --- a/TODO +++ b/TODO @@ -1,96 +1,278 @@ TODO ==== -Version 1.2 - 2011w36 +Version 1.3 - 2012w14 --------------------- Dates ~~~~~ -* *IRC coordination meeting*: 2011w26 -* *Feature freeze*: 2011w31 -* *Release date*: 2011w36 +* *IRC coordination meeting*: 2012w2 +* *Feature freeze*: 2012w11 +* *Release date*: 2012w14 Features ~~~~~~~~ -* *Very high priority* +* **Top priority** - * Start to use new name LibrePlan with a new logo - * Merge and finish migration for ZK5 version - * Fix allocation model + * *Disable scenarios*: Scenarios feature is not tested properly and it's in an experimental state right now. We should directly remove the option from the UI to enable it and don't give the users the chance to enable scenarios as they can cause wrong behaviors in the tool. -* *High priority* + * *WBS setting up behavior*: The current behavior of setting up the WBS is very strange related to containers. This feature is the one mentioned that was going to be implemented in the `user forum `_. - * Help improvement (documentation) - * Fix last issues on printing - * Prevent perspective change without saving + * *Include the management and support of a currency to apply to the project*: Now all the reports are in euros. Internationalization must include to allow to configure the currency used and the symbols to use. -* *Normal priority* + * *Warning about new versions*: Add a warning in the bottom to administrators when a new version of LibrePlan is released. - * Fix issues in templates when using related entities like criteria, - progresses, ... - * Translation issues (common problems and specific issues with Galician) - * LDAP integration + This features consists of implementing a mechanism to display warnings to the users about the possibility to upgrade to a new version. -* *Low priority* + This system could be used to gather statistics about number of users with LibrePlan deployed in their machine (after notification and acceptance by the user of allowing to gather his data). - * New feature for simple users. Users would be related to application - resources, and would be able to specify hours, progresses, ... on their - assigned tasks - * Improve subcontractor system + * *Permissions enhancement*: It was part of release 1.2 but was not done yet. Improve the permissions system adding new roles to report hours and other stuff. Pending to analyze deeply to define the implementation. -* *Minor tasks* + * *Bind users to resources*: This was part of the release 1.2 roadmap but was not started. New feature for simple users. Users would be related to application resources, and would be able to specify hours, progresses, ... on their assigned tasks. - * Default login auto-completion configuration - * Permissions enhancements - * Show information about current entity being edited - * Improvements on work reports: allow specify minutes, add button to copy - work report line - * Add an operation to reassign a single task - * Web services: Add method to export only one entity by code - * Report: Add a new report which allows to check progress by task in a - project (tasks could be filtered by criteria, labels, ...) - * Save language per user in user configuration + * *Improve help and documentation*: Also part of 1.2 and not done yet. LibrePlan is quite big and it needs a better documentation to let users learn how to use it. + +* **Medium priority** + + * *Allow to introduce minutes in WBS screen*: This is the last planning information which is not possible to insert in minutes. So, this task consists of allowing it. + + Very close to this feature and maybe included in it would be to allow to specify quantities in a text format like: 8d7h + + * *Vertical line to show with the start of the project*: Show a line at the start of the project, something similar to what we do with the deadline. + + * *Improve allocation strategy calculate number of hours and calculate resources per day*: Currently is a bit complex to use this allocation strategies on using the workable days. This happens because you do not have control over the end date but over the workable days. This task will consists of translating from start/end date to workable days taking into account the task calendar. + + * *KPIs per project*: There are being developed several KPI (Key Performance Indicators) per project. More info at wiki in story `AnA14S01PerProjectDashboard `_. + + * *User experience improvements*: Improve user experience and aspect of some pages like the report ones (capturing input data ones). The idea is making the interaction with LibrePlan smoother, putting the focus on the newly created cells, easing the work just with the keyboard (the "name: input : Add button" system, that allows creating several elements without needing to point-n-click on things is an example). + + * *Icons*: Improve icons and ask for them (possible integration with icons of the web). + + * *Subcontracting module*: They are being implemented a set of tasks to implement improvements in subcontracting module. More info at wiki in story `AnA15SubcontractorModule `_. + + * *Upper menu revamp*: We have received the feedback that the upper menu is not understood many times correctly because it has the style of tabs. + + * *Refactor entity model for templates*: This was part of release 1.2 but was not started yet. There are some internal issues in the implementation of templates. + + * *Show the load of the resources to be assigned in allocation pop-up*: This feature was in the roadmap for release 1.2 but there was not enough time to to it, so it is pending. + + It consists of being able to query and to represent graphically the load of the resource allocation. This will consiste of a load chart in the period which affects the task duration. + + It would be interesting to be able to view the load of each resource allocation before being done and after it: + + * *Before being done*: In the advanced search pop-up you could see a small chart for each resource or for the set of criteria being selected to the allocation. + + * *After being done*: In the allocation table a link to open a pop-up with a chart which shows the load of the resource would be included. + + * *Right mouse menu register in the left menu of the project planning perspective*: It would be very useful and we have received the feedback of some users that it would be great to have this feature. Also the double-click over the project or task name. + + * *Flaw when changing start/end date of project, or when changing the START_NOT_SOONER_THAN constraint from WBS*: If you change the start date of a project already planned this start date affects the start date of the tasks planned with constraint AS_SOON_AS_POSSIBLE. The same happens with the end date of a project and the constraint AS_LATER_AS_POSSIBLE. + + This fact provokes that if you change the start date of a project and you visit the gantt window, the Gantt window replans the project to enforce the constraints. This provokes that the user sees data that is not the state of things stored in the database. However, the user is not informed of this circumstance. + + The same happens with the end date if there are tasks with AS_LATER_AS_POSSIBLE. + + There is another weird behavior with START_NOT_SOONER_THAN constraint of a task if it is introduced in the WBS. If the task is still not planned then the associated task in the Gantt is configured with a START_NOT_SOONER_THAN constraint. If it has allocations then the constraint is not added. Reflect about this. + + There is another problem when you manipulate the WBS and there are already tasks planned with dependencies or allocations. Currently when certain movements are done you lose the dependencies and the allocations but the user is not even informed or asked. It should be provided a way to avoid this undesirable situation. + + * *Android application*: Develop an Android application to allow work report adding as a first approach to make LibrePlan work from smartphones. + + It would use the LibrePlan webservices to add the work reports. Of course this should be improved and it would make many more things in the future, but as a first approach seems to be ok. + + * *Protect the upper menu from abandoning the planning of a project without saving*: This feature was not completed in release 1.2 but had been decided to do so in `analysis mail `_. + + It's also important review the behavior of advanced allocation window, we should prevent people change perspective without clicking "Apply" or even ask if they want to "Apply" if the click directly on "Save". -Future ------- +Future & wish list +------------------ -* Monte Carlo simulation improvements. -* Increase support of intraday operations in allocations regarding planning - dates. -* New features in Gantt window. -* Complex features disabled by default. -* Quick start wizard. -* Integration services scripts directly with Java. -* ZK 5 migration. -* Permission enhancements. -* *Exit without saving* detection. -* Historic information management. -* Templates with planning information. -* Cash-flow analysis. -* New outsourcing capabilities. -* Scenario system enhancements. -* Resource load charts improvements. -* Visualization of task states in Gantt. -* More reports. -* Calendars with intraday timetable. -* Machine system fixes. +* **Scheduling module** + * *Establishing dependencies from pop-up (form based interface)*: Now the only way to set up dependencies between activities is by dragging the arrow from the origin task and by releasing it in the destination task. -Wish List ---------- + This feature would consist of implementing a text based interface to managing dependencies. Two major advantages: -* Customization (e.g. recently opened projects in menu). -* Application theming. Possibility to customize the styles. -* Database snapshot with example data. -* Unit tests for integration services using truly HTTP requests and XML files. -* Auto-deployable executable. Application is downloaded and installed with JNLP - (Java Web Start) and on starting launches an embedded servlet container in - which it is executed. It will include a pure Java database like HSQLDB too. -* Notification system. -* Explorer and Opera support. -* Experimental rendering with canvas for Gantt and resource load. -* Interruptible tasks. -* Configurable reports. + * When tasks are very distant to establish them is difficult and time consuming. + * This is a step to allow to split up big Gantt charts in several pages. + + * *Dependencies with lag*: This is a feature asked by the users (community). Instead affecting immediately the start date or the end date of the origin task of the dependency, this behavior would let configure an amount of time to add. + + * *Templates with planning information* + + * *Labels with colors*: Labels with colors in order to distinguish them easily in the Gantt chart. + + * *Fixing and improving Monte Carlo simulation*: A mail was sent time ago about `how to fix and do a better Monte Carlo simulation `_. + + * *Fix consolidation model*: An analysis mail was sent explaining `how to fix and improve the consolidation model `_. + + * *Complete the configuration unit mechanism for machines*: Several analysis stories not started have been written for this: + + * `AnA17S01ConfigurationUnitInterfaceCorrections `_ + * `AnA17S02TakingIntoAccountDerivedDayAssigments `_ + * `AnA17S03EnforceDerivedDayAssignmentsWithAllocations `_ + + * *Allow to reassign just one task* + + * *Allow to modify task start and end dates in advanced allocation*: Now in advanced allocation you cannot change the start or the end date of a task by filling hours before the beginning or after the end respectively. This is not allowed because the Gantt graph and then reallocation engine has not been plugged into that screen. + + * *Limiting resources enforced*: Several things are pending to have a complete solution of limiting resources: + + * Avoid dependencies going from regular tasks to limiting tasks. + + * Avoid dependencies going from limiting tasks to regular tasks. + + * Change interface of limiting resource to allow several things: + + * Filter by time. It is needed. + * Allow to set tasks as finished (progresses). View it and mark it. + * By default filter: Filter the tasks that have not been finished. Establish a vertical line catching only tasks in the middle or not started one. + + * *Printing*: It is needed to keep on improving printing. Results are not enough satisfactory: + + * Specify layout to make it faster and aspect more accurate for printed version o a schedule. + + * Review if we could avoid fake xserver stuff + + * *New load chart scheme to view and analyze the load*: Now the resource load screen is in two dimensions en a color: + + * Dimensions: Resource, Time + + * Color: Load + + A better system would be to represent the load with a new axis. A row per resource. Inside each row two dimensions: vertical axis for load and horizontal axis for time. In this way, you get more accuracy in the representation of the load of each resource through time. + + Current system is besides inaccurate because it is based on the average load a task. Therefore a better scheme based on the load per day. + + * *Visualization of task states in Gantt*: Show the state of the tasks in the planning. We can know if a task has begun, it is waiting, ready, finished. Have an option to show this. + + * *Improve allocation model*: + + * Allow to specify a different strategy per allocation row. + + * Allow to specify an allocation function per allocation row: + + * Flat (by default). + + * S-curve. + + * Stretched flat function. + + * Allow to change the start date, end date of each allocation row (task start-end calculated dynamically taking this into account). + +* **Usability module** + + * *Menu breadcrumbs*: Proposed to be removed or at least being made consistent. + + * *Improve error detection at perspective changes*: Improve the detection of errors and prevent to do a perspective change on planning a project. + + * *Default viewing information for Gantt projects*: This task would consist of including configuration parameters per project or globally to configure the viewing options in the Gantt set on by default. So, instead of having to activate them on entering the project each time, it will be enabled as wished by default by the user. + +* **Architectural tasks** + + * *Save and back button created just in one place*: Currently save and back buttons that appear while you're editing a project are created from 2 perspectives: Gantt and WBS. This makes us to remove the options to go from general Gantt directly to resources load or advanced allocation perspectives. This should be modified and these buttons should be created just in one place allowing us to enable again that features. + + * *Performance enhancements*: + + * Performance enhancements in Gantt window. + * Performance enhancements in resource load window. + * Task to think how to manage data with time. + + * *Allow workers to ask for holidays*: Allow workers -if the profile is created- to ask for holidays. Each worker has a calendar assigned, and he/she could ask for the vacation days. Then, a reviewer -project manager- could confirm or deny that vacation days. + +* **Other** + + * Add export/import operations for different format files from other projects like OpenProj, MicrosoftProject, ... + + * Base line in projects. + + * Resource leveling. Intraproject approach. + + * Hierarchical projects. + + * Resource load view performance improvement. + + * Dependency type START-TO-FINISH. + + * Periodic allocation schemes. + + * Earned value improvements. + + * Critical chain project management critical chain paradigm in project planning. + + * Interface to resolve allocation conflicts. + + * Increase support of intraday operations in allocations regarding planning dates. + + * Calendars with intraday timetable. + + * Quick start wizard. + + * Integration services scripts directly with Java. + + * Review dependencies with libraries and upgrade to newer versions. + + * Historic information management. + + * Cash-flow analysis. + + * New outsourcing capabilities. + + * Scenario system enhancements. + + * More reports. Improve them with charts. + + * Improve advanced allocation with decomposition of load of generic allocations + + * Inclusion of portfolio management operations + + * Paginate the Gantt diagram configuring the number of task per page. + + * Import/export data from CSV format. + + * New KPIs and implementation of global (multi-project) KPI. + + * Customization (e.g. recently opened projects in menu). + + * Application theming. Possibility to customize the styles. + + * Database snapshot with example data. + + * Unit tests for integration services using truly HTTP requests and XML files. + + * Auto-deployable executable. Application is downloaded and installed with JNLP (Java Web Start) and on starting launches an embedded servlet container in which it is executed. It will include a pure Java database like HSQLDB too. + + * Notification system. + + * Explorer and Opera support. + + * Experimental rendering with canvas for Gantt and resource load. + + * Interruptible tasks. + + * Configurable reports. + + * Implement risk management + + * Document management in projects. + + * LibrePlan Control Center product. New application to manage several LibrePlan deployments in a large + + * Segmentation of projects per portfolio. + + * Automatic allocation of set of projects of a unit by several criteria. Tabu search algorithm. + + * Workflow processes implementation or BPM. For instance, needed to review tracked hours to be incorporated to the projects. + + * Mobile applications to introduce some data like work report (track time). + + * New UI whole redisign. New app theme. + + * Budgeting module. Benefit analysis. + + * Operations management support. There are tasks or departments inside a company which are not projects. They are regular tasks which are done periodically (vacations, incidences,...). + + * Integration or development of ticket systems associated to tasks. diff --git a/UPDATE b/UPDATE index 4364280f6..13f3c25fe 100644 --- a/UPDATE +++ b/UPDATE @@ -26,11 +26,11 @@ Instructions: * Download the new package:: - $ wget http://downloads.sourceforge.net/project/navalplan/NavalPlan/navalplan_1.1.1-1_amd64.deb + $ wget http://downloads.sourceforge.net/project/libreplan/LibrePlan/libreplan_1.2.1-1_amd64.deb * Install package:: - # dpkg -i navalplan_1.1.1-1_amd64.deb + # dpkg -i libreplan_1.2.1-1_amd64.deb * Install new dependencies if needed:: @@ -48,18 +48,18 @@ Debian/Ubuntu # /etc/init.d/tomcat6 stop * Download database upgrade scripts from previous version. For example, if you - are upgrading from *LibrePlan 1.0.4* to *LibrePlan 1.1.1* you should download - ``upgrade_1.1.0.sql``:: + are upgrading from *LibrePlan 1.2.0* to *LibrePlan 1.2.1* you should download + ``upgrade_1.2.1.sql``:: - $ wget http://downloads.sourceforge.net/project/navalplan/NavalPlan/upgrade_1.1.0.sql + $ wget http://downloads.sourceforge.net/project/libreplan/LibrePlan/upgrade_1.2.1.sql * Upgrade database:: - $ psql -h localhost -U libreplan -W libreplan < upgrade_1.1.0.sql + $ psql -h localhost -U libreplan -W libreplan < upgrade_1.2.1.sql * Download ``.war`` file of new version from SourceForge.net:: - $ wget -O libreplan.war http://downloads.sourceforge.net/project/navalplan/NavalPlan/navalplan_1.1.1.war + $ wget -O libreplan.war http://downloads.sourceforge.net/project/libreplan/LibrePlan/libreplan_1.2.1.war * Backup current deployed application:: @@ -84,18 +84,18 @@ openSUSE # /etc/init.d/tomcat6 stop * Download database upgrade scripts from previous version. For example, if you - are upgrading from *LibrePlan 1.0.4* to *LibrePlan 1.1.1* you should download - ``upgrade_1.1.0.sql``:: + are upgrading from *LibrePlan 1.2.0* to *LibrePlan 1.2.1* you should download + ``upgrade_1.2.1.sql``:: - $ wget http://downloads.sourceforge.net/project/navalplan/NavalPlan/upgrade_1.1.0.sql + $ wget http://downloads.sourceforge.net/project/libreplan/LibrePlan/upgrade_1.2.1.sql * Upgrade database:: - $ psql -h localhost -U libreplan -W libreplan < upgrade_1.1.0.sql + $ psql -h localhost -U libreplan -W libreplan < upgrade_1.2.1.sql * Download ``.war`` file of new version from SourceForge.net:: - $ wget -O libreplan.war http://downloads.sourceforge.net/project/navalplan/NavalPlan/navalplan_1.1.1.war + $ wget -O libreplan.war http://downloads.sourceforge.net/project/libreplan/LibrePlan/libreplan_1.2.1.war * Backup current deployed application:: diff --git a/VERSION b/VERSION new file mode 100644 index 000000000..23aa83906 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +1.2.2 diff --git a/conf/libreplan.xml b/conf/libreplan.xml new file mode 100644 index 000000000..2eb4921c0 --- /dev/null +++ b/conf/libreplan.xml @@ -0,0 +1,10 @@ + + + + + diff --git a/contrib/cutycapt/cutycapt.spec b/contrib/cutycapt/cutycapt.spec new file mode 100644 index 000000000..8ddcc19c4 --- /dev/null +++ b/contrib/cutycapt/cutycapt.spec @@ -0,0 +1,56 @@ +Name: cutycapt +Version: 20110107 +Release: 2 +Summary: Captures web pages to files in different formats +License: GPLv2+ +URL: http://cutycapt.sourceforge.net/ +Source0: http://cutycapt.svn.sourceforge.net/viewvc/cutycapt/CutyCapt.tar.gz +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root + +BuildRequires: qt-devel +%if 0%{?suse_version} +BuildRequires: libQtWebKit-devel +%else +%if 0%{?fedora} == 15 +BuildRequires: qt-webkit-devel +%else +BuildRequires: qtwebkit-devel +%endif +%endif +BuildRequires: gcc-c++ + +%description +CutyCapt is a small cross-platform command-line utility to capture +WebKit's rendering of a web page into a variety of vector and bitmap +formats, including SVG, PDF, PS, PNG, JPEG, TIFF, GIF, and BMP. See +IECapt for a similar tool based on Internet Explorer. + +%prep +%setup -q -n CutyCapt + +%build +%if 0%{?suse_version} +qmake +%else +qmake-qt4 +%endif +make + +%install +rm -rf $RPM_BUILD_ROOT +mkdir -p $RPM_BUILD_ROOT +install -m 755 -d $RPM_BUILD_ROOT/usr/bin +install -m 755 CutyCapt $RPM_BUILD_ROOT/usr/bin/cutycapt + +%clean +rm -rf $RPM_BUILD_ROOT + + +%files +%defattr(-,root,root,-) +%{_bindir}/cutycapt + + +%changelog +* Fri Feb 17 2012 Juan A. Suarez Romero - 20110107-1 +- Initial build. diff --git a/debian/changelog b/debian/changelog index f2c9f891e..57166d5b4 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,15 @@ +libreplan (1.2.2-1) squeeze; urgency=low + + * Released LibrePlan 1.2.2 + + -- Manuel Rego Casasnovas Thu, 15 Mar 2012 10:23:00 +0100 + +libreplan (1.2.1-1) squeeze; urgency=low + + * Released LibrePlan 1.2.1 + + -- Manuel Rego Casasnovas Thu, 19 Jan 2012 11:47:00 +0100 + libreplan (1.2.0-1) maverick; urgency=low * Released LibrePlan 1.2.0 diff --git a/debian/libreplan.install b/debian/libreplan.install index 96d84a98c..759c6e7ab 100644 --- a/debian/libreplan.install +++ b/debian/libreplan.install @@ -4,3 +4,5 @@ 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/dbconfig-common/data/libreplan/upgrade/pgsql/1.2.0 +debian/tmp/usr/share/dbconfig-common/data/libreplan/upgrade/pgsql/1.2.1 +debian/tmp/usr/share/dbconfig-common/data/libreplan/upgrade/pgsql/1.2.2 diff --git a/debian/rules b/debian/rules index f08cc3c9a..fe8000eac 100755 --- a/debian/rules +++ b/debian/rules @@ -84,6 +84,12 @@ install: # 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) + # Copy SQL upgrade script for version 1.2.1 + $(call CMD,cp $(CURDIR)/scripts/database/upgrade_1.2.1.sql \ + $(CURDIR)/debian/tmp/usr/share/dbconfig-common/data/libreplan/upgrade/pgsql/1.2.1) + # Copy SQL upgrade script for version 1.2.2 + $(call CMD,cp $(CURDIR)/scripts/database/upgrade_1.2.2.sql \ + $(CURDIR)/debian/tmp/usr/share/dbconfig-common/data/libreplan/upgrade/pgsql/1.2.2) # Install Policy file $(call CMD,mkdir -p $(CURDIR)/debian/tmp/etc/tomcat6/policy.d) $(call CMD,cp $(CURDIR)/debian/51libreplan.policy \ diff --git a/doc/src/technical/howto-create-a-new-report-in-libreplan.rst b/doc/src/technical/howto-create-a-new-report-in-libreplan.rst index 076dd7163..f13bae881 100644 --- a/doc/src/technical/howto-create-a-new-report-in-libreplan.rst +++ b/doc/src/technical/howto-create-a-new-report-in-libreplan.rst @@ -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% diff --git a/doc/src/technical/howto-start-development-with-eclipse.rst b/doc/src/technical/howto-start-development-with-eclipse.rst new file mode 100644 index 000000000..7d676d590 --- /dev/null +++ b/doc/src/technical/howto-start-development-with-eclipse.rst @@ -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,-i18n`` (to disable userguide, + reports and i18n 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 diff --git a/doc/src/technical/ireport-resources-list-report.png b/doc/src/technical/img/ireport-resources-list-report.png similarity index 100% rename from doc/src/technical/ireport-resources-list-report.png rename to doc/src/technical/img/ireport-resources-list-report.png diff --git a/doc/src/technical/img/libreplan-download-eclipse.png b/doc/src/technical/img/libreplan-download-eclipse.png new file mode 100644 index 000000000..f11bc4667 Binary files /dev/null and b/doc/src/technical/img/libreplan-download-eclipse.png differ diff --git a/doc/src/technical/img/libreplan-eclipse-profile.png b/doc/src/technical/img/libreplan-eclipse-profile.png new file mode 100644 index 000000000..07502e2bb Binary files /dev/null and b/doc/src/technical/img/libreplan-eclipse-profile.png differ diff --git a/doc/src/technical/img/libreplan-import-maven.png b/doc/src/technical/img/libreplan-import-maven.png new file mode 100644 index 000000000..eb76d08a2 Binary files /dev/null and b/doc/src/technical/img/libreplan-import-maven.png differ diff --git a/doc/src/technical/img/libreplan-m2e.png b/doc/src/technical/img/libreplan-m2e.png new file mode 100644 index 000000000..db4b81992 Binary files /dev/null and b/doc/src/technical/img/libreplan-m2e.png differ diff --git a/doc/src/technical/img/libreplan-poms.png b/doc/src/technical/img/libreplan-poms.png new file mode 100644 index 000000000..aa43699d3 Binary files /dev/null and b/doc/src/technical/img/libreplan-poms.png differ diff --git a/doc/src/technical/img/libreplan-preferences-save-actions.png b/doc/src/technical/img/libreplan-preferences-save-actions.png new file mode 100644 index 000000000..bd0358d9d Binary files /dev/null and b/doc/src/technical/img/libreplan-preferences-save-actions.png differ diff --git a/doc/src/technical/img/libreplan-preferences-tab.png b/doc/src/technical/img/libreplan-preferences-tab.png new file mode 100644 index 000000000..dbe2452e0 Binary files /dev/null and b/doc/src/technical/img/libreplan-preferences-tab.png differ diff --git a/doc/src/technical/img/libreplan-run-configurations.png b/doc/src/technical/img/libreplan-run-configurations.png new file mode 100644 index 000000000..ae1345490 Binary files /dev/null and b/doc/src/technical/img/libreplan-run-configurations.png differ diff --git a/doc/src/technical/resources-list-report-example-data-pdf.png b/doc/src/technical/img/resources-list-report-example-data-pdf.png similarity index 100% rename from doc/src/technical/resources-list-report-example-data-pdf.png rename to doc/src/technical/img/resources-list-report-example-data-pdf.png diff --git a/doc/src/user/en/01-introducion.rst b/doc/src/user/en/01-introducion.rst index f675b06b7..18e91a273 100644 --- a/doc/src/user/en/01-introducion.rst +++ b/doc/src/user/en/01-introducion.rst @@ -36,7 +36,7 @@ As can be seen in the program's main screen (shot given previously) and the comp .. figure:: images/order_list.png :scale: 50 - Order list + Work Breakdown Structure The view management commented on previously for the company overview is very similar to the management planned for a single project. A project can be accessed in several ways: diff --git a/doc/src/user/en/16-ldap-authentication.rst b/doc/src/user/en/16-ldap-authentication.rst index 54ea7a26c..604951906 100644 --- a/doc/src/user/en/16-ldap-authentication.rst +++ b/doc/src/user/en/16-ldap-authentication.rst @@ -24,13 +24,18 @@ 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 +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. +.. NOTE:: + + If your LDAP is configured to work with anonymous authentication you can + leave empty *UserDN* and *Password* attributes. + Authentication ============== @@ -55,29 +60,171 @@ 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. +represents the group. + +The next example represents a valid LDAP structure to use group strategy. + +* LDAP structure:: + + dc=example,dc=org + |- ou=groups + |- cn=admins + |- cn=itpeople + |- cn=workers + |- ou=people + |- uid=admin1 + |- uid=it1 + |- uid=it2 + |- uid=worker1 + |- uid=worker2 + |- uid=worker3 + +In this case, each group will have an attribute, for example called ``member``, +with the list of users belonging to the group: + +* ``cn=admins``: + + * ``member: uid=admin1,ou=people,dc=example,dc=org`` + * ``member: uid=it1,ou=people,dc=example,dc=org`` + +* ``cn=itpeople``: + + * ``member: uid=it1,ou=people,dc=example,dc=org`` + * ``member: uid=it2,ou=people,dc=example,dc=org`` + +* ``cn=workers``: + + * ``member: uid=worker1,ou=people,dc=example,dc=org`` + * ``member: uid=worker2,ou=people,dc=example,dc=org`` + * ``member: uid=worker3,ou=people,dc=example,dc=org`` + +The configuration for this case is the following: + +* Role search strategy: ``Group strategy`` +* Group path: ``ou=groups`` +* Role property: ``member`` +* Role search query: ``uid=[USER_ID],ou=people,dc=example,dc=org`` + +And for example if you want to match some roles: + +* Administration: ``cn=admins;cn=itpeople`` +* Web service reader: ``cn=itpeople`` +* Web service writer: ``cn=itpeople`` +* All projects read allowed: ``cn=admins`` +* All projects edition allowed: ``cn=admins`` +* Project creation allowed: ``cn=workers`` 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: +the user. In this case, the configuration does not need the parameter *Group +path*: -* *Role property*. It represents the property in user's node in LDAP which - contains all the roles for that user. +The next example represents a valid LDAP structure to use property strategy. -* *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. +* LDAP structure:: + + dc=example,dc=org + |- ou=people + |- uid=admin1 + |- uid=it1 + |- uid=it2 + |- uid=worker1 + |- uid=worker2 + |- uid=worker3 + +With attribute +.............. + +In this case, each user will have attribute, for example called ``group`` with +the name of the group to which it belongs: + +* ``uid=admin1``: + + * ``group: admins`` + +* ``uid=it1``: + + * ``group: itpeople`` + +* ``uid=it2``: + + * ``group: itpeople`` + +* ``uid=worker1``: + + * ``group: workers`` + +* ``uid=worker2``: + + * ``group: workers`` + +* ``uid=worker3``: + + * ``group: workers`` + + +.. WARNING:: + + This strategy has a restriction, each user can belong only to one group. + +The configuration for this case is the following: + +* Role search strategy: ``Property strategy`` +* Group path: +* Role property: ``group`` +* Role search query: ``[USER_ID]`` + +And for example if you want to match some roles: + +* Administration: ``admins;itpeople`` +* Web service reader: ``itpeople`` +* Web service writer: ``itpeople`` +* All projects read allowed: ``admins`` +* All projects edition allowed: ``admins`` +* Project creation allowed: ``workers`` + +By user identifier +.................. + +You can even have a workaround to specify LibrePlan roles directly to users, +without having an attribute in each LDAP user. + +In this case, you will specify which users have the different LibrePlan roles +by ``uid``. + +The configuration for this case is the following: + +* Role search strategy: ``Property strategy`` +* Group path: +* Role property: ``uid`` +* Role search query: ``[USER_ID]`` + +And for example if you want to match some roles: + +* Administration: ``admin1;it1`` +* Web service reader: ``it1;it2`` +* Web service writer: ``it1;it2`` +* All projects read allowed: ``admin1`` +* All projects edition allowed: ``admin1`` +* Project creation allowed: ``worker1;worker2;worker3`` + +Role matching +------------- 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 ";". +"``admin;administrators``". The character for splitting roles is "``;``". + +.. NOTE:: + + If you want to specify that all users or all groups have one permission you + can use an asterisk (``*``) as wildcard to refer to them. For example, if you + want that everybody has the role *Project creation allowed* you will + configure the role matching as follows: + + * Project creation allowed: ``*`` diff --git a/doc/src/user/en/20-acerca-de.rst b/doc/src/user/en/20-acerca-de.rst index 31b1ef821..699cce057 100644 --- a/doc/src/user/en/20-acerca-de.rst +++ b/doc/src/user/en/20-acerca-de.rst @@ -5,12 +5,24 @@ About .. contents:: -Licence -======== +Copyright +========= Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e Desenvolvemento Tecnolóxico de Galicia +Copyright (C) 2010 Igalia, S.L.; Wireless Galicia, S.L. + +Copyright (C) 2011 Igalia, S.L.; Wireless Galicia, S.L.; ComtecSF, S.L.; +CafédeRed Solutions, S.L. + +Copyright (C) 2012 Igalia, S.L.; Wireless Galicia, S.L.; CafédeRed Solutions, +S.L. + + +Licence +======== + 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 @@ -54,9 +66,19 @@ Previous Team Members Translators ----------- -* [es] Manuel Rego Casasnovas -* [gl] Manuel Rego Casasnovas -* [pt] Helena Grosso +* [es] Jacobo Aragunde Pérez , + Manuel Rego Casasnovas , + Diego Pino García +* [fr] Stephane Ayache , + Guillaume Postaire , + Philippe Poumaroux +* [gl] Jacobo Aragunde Pérez , + Manuel Rego Casasnovas , + Diego Pino García +* [it] Giuseppe Zizza +* [nl] Jeroen Baten +* [pt] Helena Grosso , + Joaquim Rocha * [ru] Pavel Rudensky Contributors diff --git a/doc/src/user/en/images/advance-assignment.png b/doc/src/user/en/images/advance-assignment.png index 5bedd1c1b..aeb55b2b6 100644 Binary files a/doc/src/user/en/images/advance-assignment.png and b/doc/src/user/en/images/advance-assignment.png differ diff --git a/doc/src/user/en/images/category-cost-edit.png b/doc/src/user/en/images/category-cost-edit.png index d633f8c81..1755ee79e 100644 Binary files a/doc/src/user/en/images/category-cost-edit.png and b/doc/src/user/en/images/category-cost-edit.png differ diff --git a/doc/src/user/en/images/category-cost-list.png b/doc/src/user/en/images/category-cost-list.png index 24e6469d8..1d7ff838c 100644 Binary files a/doc/src/user/en/images/category-cost-list.png and b/doc/src/user/en/images/category-cost-list.png differ diff --git a/doc/src/user/en/images/company_view.png b/doc/src/user/en/images/company_view.png index 0feb4b575..c3a7631e6 100644 Binary files a/doc/src/user/en/images/company_view.png and b/doc/src/user/en/images/company_view.png differ diff --git a/doc/src/user/en/images/edicion-criterio.png b/doc/src/user/en/images/edicion-criterio.png index a4f7cfcae..2b879ced5 100644 Binary files a/doc/src/user/en/images/edicion-criterio.png and b/doc/src/user/en/images/edicion-criterio.png differ diff --git a/doc/src/user/en/images/hour-type-edit.png b/doc/src/user/en/images/hour-type-edit.png index 9ae5c3eff..4917b08a8 100644 Binary files a/doc/src/user/en/images/hour-type-edit.png and b/doc/src/user/en/images/hour-type-edit.png differ diff --git a/doc/src/user/en/images/hour-type-list.png b/doc/src/user/en/images/hour-type-list.png index 2649f26f1..1872eb4f7 100644 Binary files a/doc/src/user/en/images/hour-type-list.png and b/doc/src/user/en/images/hour-type-list.png differ diff --git a/doc/src/user/en/images/manage-user-profile.png b/doc/src/user/en/images/manage-user-profile.png index 8c644e570..6a86064e2 100644 Binary files a/doc/src/user/en/images/manage-user-profile.png and b/doc/src/user/en/images/manage-user-profile.png differ diff --git a/doc/src/user/en/images/manage-user.png b/doc/src/user/en/images/manage-user.png index 9c5c078cc..df59f1b7c 100644 Binary files a/doc/src/user/en/images/manage-user.png and b/doc/src/user/en/images/manage-user.png differ diff --git a/doc/src/user/en/images/material.png b/doc/src/user/en/images/material.png index c70da6bd8..a77b5aa41 100644 Binary files a/doc/src/user/en/images/material.png and b/doc/src/user/en/images/material.png differ diff --git a/doc/src/user/en/images/order-criterions.png b/doc/src/user/en/images/order-criterions.png index f1b281fcf..e59bd833f 100644 Binary files a/doc/src/user/en/images/order-criterions.png and b/doc/src/user/en/images/order-criterions.png differ diff --git a/doc/src/user/en/images/order-edition.png b/doc/src/user/en/images/order-edition.png index 5d5e40f85..ff67134db 100644 Binary files a/doc/src/user/en/images/order-edition.png and b/doc/src/user/en/images/order-edition.png differ diff --git a/doc/src/user/en/images/order-labels.png b/doc/src/user/en/images/order-labels.png index 9a0cc5fb3..076e0a745 100644 Binary files a/doc/src/user/en/images/order-labels.png and b/doc/src/user/en/images/order-labels.png differ diff --git a/doc/src/user/en/images/order-material.png b/doc/src/user/en/images/order-material.png index 0d4e33ed6..9197679e7 100644 Binary files a/doc/src/user/en/images/order-material.png and b/doc/src/user/en/images/order-material.png differ diff --git a/doc/src/user/en/images/order-quality.png b/doc/src/user/en/images/order-quality.png index 2e9be6fc2..ee9e9027e 100644 Binary files a/doc/src/user/en/images/order-quality.png and b/doc/src/user/en/images/order-quality.png differ diff --git a/doc/src/user/en/images/order_list.png b/doc/src/user/en/images/order_list.png index 9e1047563..72e70f3b6 100644 Binary files a/doc/src/user/en/images/order_list.png and b/doc/src/user/en/images/order_list.png differ diff --git a/doc/src/user/en/images/planning-view.png b/doc/src/user/en/images/planning-view.png index 10629a67d..de74811eb 100644 Binary files a/doc/src/user/en/images/planning-view.png and b/doc/src/user/en/images/planning-view.png differ diff --git a/doc/src/user/en/images/quality.png b/doc/src/user/en/images/quality.png index 94334ecbd..1850f51b9 100644 Binary files a/doc/src/user/en/images/quality.png and b/doc/src/user/en/images/quality.png differ diff --git a/doc/src/user/en/images/resource-calendar.png b/doc/src/user/en/images/resource-calendar.png index 731260960..749c7b829 100644 Binary files a/doc/src/user/en/images/resource-calendar.png and b/doc/src/user/en/images/resource-calendar.png differ diff --git a/doc/src/user/en/images/resource-load.png b/doc/src/user/en/images/resource-load.png index e7a646ea1..e2b15ceb4 100644 Binary files a/doc/src/user/en/images/resource-load.png and b/doc/src/user/en/images/resource-load.png differ diff --git a/doc/src/user/en/images/resources_global.png b/doc/src/user/en/images/resources_global.png index f96998452..e2b15ceb4 100644 Binary files a/doc/src/user/en/images/resources_global.png and b/doc/src/user/en/images/resources_global.png differ diff --git a/doc/src/user/en/images/virtual-resources.png b/doc/src/user/en/images/virtual-resources.png index 05e342210..3a54f95d3 100644 Binary files a/doc/src/user/en/images/virtual-resources.png and b/doc/src/user/en/images/virtual-resources.png differ diff --git a/doc/src/user/en/images/work-report-types.png b/doc/src/user/en/images/work-report-types.png index 732767749..986f705aa 100644 Binary files a/doc/src/user/en/images/work-report-types.png and b/doc/src/user/en/images/work-report-types.png differ diff --git a/doc/src/user/es/01-introducion.rst b/doc/src/user/es/01-introducion.rst index 68ef02e99..f43d276a4 100644 --- a/doc/src/user/es/01-introducion.rst +++ b/doc/src/user/es/01-introducion.rst @@ -42,7 +42,7 @@ Como se muestra en la anterior la captura de la pantalla principal de la aplicac .. figure:: images/order_list.png :scale: 50 - Listado de pedidos + Estructura de Descomposición de Trabajo La gestión de perspectivas que se comentó para la vista global de empresa es muy similar a la planteada para un solo proyecto. El acceso a un proyecto se puede realizar de varias formas: diff --git a/doc/src/user/es/16-ldap-authentication.rst b/doc/src/user/es/16-ldap-authentication.rst index 9419d055a..72630dace 100644 --- a/doc/src/user/es/16-ldap-authentication.rst +++ b/doc/src/user/es/16-ldap-authentication.rst @@ -1,34 +1,40 @@ -Configuracion LDAP +Configuración LDAP ################## .. contents:: -Esta pantalla permite establecer una conexión LDAP para delegar autenticación y/o autorización. +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. +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. +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. +*Base*, *UserDN* y *Contraseña* 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. + +.. NOTE:: + + Si su LDAP está configurado para trabajar con autenticación anónima puede + dejar vacíos los atributos *UserDN* y *Contraseña*. Autenticación ============= @@ -45,7 +51,6 @@ 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 ============ @@ -57,34 +62,173 @@ 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. +directamente de una rama que representa el grupo. -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. +El siguiente ejemplo representa una estructura de LDAP válida para usar la +estrategia de grupo. + +* Estructura del LDAP:: + + dc=example,dc=org + |- ou=groups + |- cn=admins + |- cn=itpeople + |- cn=workers + |- ou=people + |- uid=admin1 + |- uid=it1 + |- uid=it2 + |- uid=worker1 + |- uid=worker2 + |- uid=worker3 + +En este caso, cada grupo tendrá un atributo, por ejemplo llamado ``member``, +con la lista de usuarios que pertenencen al grupo: + +* ``cn=admins``: + + * ``member: uid=admin1,ou=people,dc=example,dc=org`` + * ``member: uid=it1,ou=people,dc=example,dc=org`` + +* ``cn=itpeople``: + + * ``member: uid=it1,ou=people,dc=example,dc=org`` + * ``member: uid=it2,ou=people,dc=example,dc=org`` + +* ``cn=workers``: + + * ``member: uid=worker1,ou=people,dc=example,dc=org`` + * ``member: uid=worker2,ou=people,dc=example,dc=org`` + * ``member: uid=worker3,ou=people,dc=example,dc=org`` + +La configuración para este caso es la siguiente: + +* Estrategia para la búsqueda de roles: ``Estrategia de grupo`` +* Path del grupo: ``ou=groups`` +* Propiedad del rol: ``member`` +* Consulta para la búsqueda de roles: ``uid=[USER_ID],ou=people,dc=example,dc=org`` + +Y por ejemplo si quiere hacer alguna correspondencia de roles: + +* Administration: ``cn=admins;cn=itpeople`` +* Web service reader: ``cn=itpeople`` +* Web service writer: ``cn=itpeople`` +* All projects read allowed: ``cn=admins`` +* All projects edition allowed: ``cn=admins`` +* Project creation allowed: ``cn=workers`` 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: +Cuando el 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 no necesita +el parámetro *Path del grupo*: -* *Propiedad del rol*. Representa la propiedad en el nodo del usuario que - contiene todos los roles para el mismo. +El siguiente ejemplo representa una estructura de LDAP válida para usar la +estrategia de propiedad. -* *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. +* Estructura del LDAP:: + + dc=example,dc=org + |- ou=people + |- uid=admin1 + |- uid=it1 + |- uid=it2 + |- uid=worker1 + |- uid=worker2 + |- uid=worker3 + +Con atributo +............ + +En este caso, cada usuario tendrá un atributo, por ejemplo llamado ``group``` +con el nombre del grupo al que pertenece: + +* ``uid=admin1``: + + * ``group: admins`` + +* ``uid=it1``: + + * ``group: itpeople`` + +* ``uid=it2``: + + * ``group: itpeople`` + +* ``uid=worker1``: + + * ``group: workers`` + +* ``uid=worker2``: + + * ``group: workers`` + +* ``uid=worker3``: + + * ``group: workers`` + +.. WARNING:: + + Esta estrategia tienen una restricción, cada usuario puede pertenecer sólo a un + grupo. + +La configuración para este caso es la siguiente: + +* Estrategia para la búsqueda de roles: ``Estrategia de propiedad`` +* Path del grupo: +* Propiedad del rol: ``group`` +* Consulta para la búsqueda de roles: ``[USER_ID]`` + +Y por ejemplo si quiere hacer alguna correspondencia de roles: + +* Administration: ``admins;itpeople`` +* Web service reader: ``itpeople`` +* Web service writer: ``itpeople`` +* All projects read allowed: ``admins`` +* All projects edition allowed: ``admins`` +* Project creation allowed: ``workers`` + +Por identificador de usuario +............................ + +Incluso puede tener una solución para especificar los roles de LibrePlan +directamente a los usuarios, sin tener un atributo en cada usuario de LDAP. + +En este caso, especificará que usuarios tienen los diferentes roles por ``uid``. + +La configuración para este caso es la siguiente: + +* Estrategia para la búsqueda de roles: ``Estrategia de propiedad`` +* Path del grupo: +* Propiedad del rol: ``uid`` +* Consulta para la búsqueda de roles: ``[USER_ID]`` + +Y por ejemplo si quiere hacer alguna correspondencia de roles: + +* Administration: ``admin1;it1`` +* Web service reader: ``it1;it2`` +* Web service writer: ``it1;it2`` +* All projects read allowed: ``admin1`` +* All projects edition allowed: ``admin1`` +* Project creation allowed: ``worker1;worker2;worker3`` + +Correspondencia de roles +------------------------ 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 ";". +"``admin;administrators``". El carácter de separación de roles es "``;``". + +.. NOTE:: + + Si quiere especificar que todos los usuarios o todos los roles tengan un + permiso puede usar un asterisco (``*``) como comodín para referirse a ellos. + Por ejemplo, si quiere que todo el mundo tenga el rol *Project creation + allowed* configurará la correspondica de roles como sigue: + + * Project creation allowed: ``*`` diff --git a/doc/src/user/es/20-acerca-de.rst b/doc/src/user/es/20-acerca-de.rst index a9c69fcbe..6c58945ea 100644 --- a/doc/src/user/es/20-acerca-de.rst +++ b/doc/src/user/es/20-acerca-de.rst @@ -5,6 +5,21 @@ Acerca de .. contents:: +Copyright +========= + +Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e +Desenvolvemento Tecnolóxico de Galicia + +Copyright (C) 2010 Igalia, S.L.; Wireless Galicia, S.L. + +Copyright (C) 2011 Igalia, S.L.; Wireless Galicia, S.L.; ComtecSF, S.L.; +CafédeRed Solutions, S.L. + +Copyright (C) 2012 Igalia, S.L.; Wireless Galicia, S.L.; CafédeRed Solutions, +S.L. + + Licencia ================ @@ -51,9 +66,19 @@ Anteriores miembros del equipo Traductores ----------- -* [es] Manuel Rego Casasnovas -* [gl] Manuel Rego Casasnovas -* [pt] Helena Grosso +* [es] Jacobo Aragunde Pérez , + Manuel Rego Casasnovas , + Diego Pino García +* [fr] Stephane Ayache , + Guillaume Postaire , + Philippe Poumaroux +* [gl] Jacobo Aragunde Pérez , + Manuel Rego Casasnovas , + Diego Pino García +* [it] Giuseppe Zizza +* [nl] Jeroen Baten +* [pt] Helena Grosso , + Joaquim Rocha * [ru] Pavel Rudensky Contribuidores diff --git a/doc/src/user/es/images/advance-assignment.png b/doc/src/user/es/images/advance-assignment.png index 5bedd1c1b..aeb55b2b6 100644 Binary files a/doc/src/user/es/images/advance-assignment.png and b/doc/src/user/es/images/advance-assignment.png differ diff --git a/doc/src/user/es/images/category-cost-edit.png b/doc/src/user/es/images/category-cost-edit.png index d633f8c81..1755ee79e 100644 Binary files a/doc/src/user/es/images/category-cost-edit.png and b/doc/src/user/es/images/category-cost-edit.png differ diff --git a/doc/src/user/es/images/category-cost-list.png b/doc/src/user/es/images/category-cost-list.png index 24e6469d8..1d7ff838c 100644 Binary files a/doc/src/user/es/images/category-cost-list.png and b/doc/src/user/es/images/category-cost-list.png differ diff --git a/doc/src/user/es/images/company_view.png b/doc/src/user/es/images/company_view.png index 0feb4b575..c3a7631e6 100644 Binary files a/doc/src/user/es/images/company_view.png and b/doc/src/user/es/images/company_view.png differ diff --git a/doc/src/user/es/images/edicion-criterio.png b/doc/src/user/es/images/edicion-criterio.png index a4f7cfcae..2b879ced5 100644 Binary files a/doc/src/user/es/images/edicion-criterio.png and b/doc/src/user/es/images/edicion-criterio.png differ diff --git a/doc/src/user/es/images/hour-type-edit.png b/doc/src/user/es/images/hour-type-edit.png index 9ae5c3eff..4917b08a8 100644 Binary files a/doc/src/user/es/images/hour-type-edit.png and b/doc/src/user/es/images/hour-type-edit.png differ diff --git a/doc/src/user/es/images/hour-type-list.png b/doc/src/user/es/images/hour-type-list.png index 2649f26f1..1872eb4f7 100644 Binary files a/doc/src/user/es/images/hour-type-list.png and b/doc/src/user/es/images/hour-type-list.png differ diff --git a/doc/src/user/es/images/manage-user-profile.png b/doc/src/user/es/images/manage-user-profile.png index 8c644e570..6a86064e2 100644 Binary files a/doc/src/user/es/images/manage-user-profile.png and b/doc/src/user/es/images/manage-user-profile.png differ diff --git a/doc/src/user/es/images/manage-user.png b/doc/src/user/es/images/manage-user.png index 9c5c078cc..df59f1b7c 100644 Binary files a/doc/src/user/es/images/manage-user.png and b/doc/src/user/es/images/manage-user.png differ diff --git a/doc/src/user/es/images/material.png b/doc/src/user/es/images/material.png index c70da6bd8..a77b5aa41 100644 Binary files a/doc/src/user/es/images/material.png and b/doc/src/user/es/images/material.png differ diff --git a/doc/src/user/es/images/order-criterions.png b/doc/src/user/es/images/order-criterions.png index f1b281fcf..e59bd833f 100644 Binary files a/doc/src/user/es/images/order-criterions.png and b/doc/src/user/es/images/order-criterions.png differ diff --git a/doc/src/user/es/images/order-edition.png b/doc/src/user/es/images/order-edition.png index 5d5e40f85..ff67134db 100644 Binary files a/doc/src/user/es/images/order-edition.png and b/doc/src/user/es/images/order-edition.png differ diff --git a/doc/src/user/es/images/order-labels.png b/doc/src/user/es/images/order-labels.png index 9a0cc5fb3..076e0a745 100644 Binary files a/doc/src/user/es/images/order-labels.png and b/doc/src/user/es/images/order-labels.png differ diff --git a/doc/src/user/es/images/order-material.png b/doc/src/user/es/images/order-material.png index 0d4e33ed6..9197679e7 100644 Binary files a/doc/src/user/es/images/order-material.png and b/doc/src/user/es/images/order-material.png differ diff --git a/doc/src/user/es/images/order-quality.png b/doc/src/user/es/images/order-quality.png index 2e9be6fc2..ee9e9027e 100644 Binary files a/doc/src/user/es/images/order-quality.png and b/doc/src/user/es/images/order-quality.png differ diff --git a/doc/src/user/es/images/order_list.png b/doc/src/user/es/images/order_list.png index 9e1047563..72e70f3b6 100644 Binary files a/doc/src/user/es/images/order_list.png and b/doc/src/user/es/images/order_list.png differ diff --git a/doc/src/user/es/images/planning-view.png b/doc/src/user/es/images/planning-view.png index 10629a67d..de74811eb 100644 Binary files a/doc/src/user/es/images/planning-view.png and b/doc/src/user/es/images/planning-view.png differ diff --git a/doc/src/user/es/images/quality.png b/doc/src/user/es/images/quality.png index 94334ecbd..1850f51b9 100644 Binary files a/doc/src/user/es/images/quality.png and b/doc/src/user/es/images/quality.png differ diff --git a/doc/src/user/es/images/resource-calendar.png b/doc/src/user/es/images/resource-calendar.png index 731260960..749c7b829 100644 Binary files a/doc/src/user/es/images/resource-calendar.png and b/doc/src/user/es/images/resource-calendar.png differ diff --git a/doc/src/user/es/images/resource-load.png b/doc/src/user/es/images/resource-load.png index e7a646ea1..e2b15ceb4 100644 Binary files a/doc/src/user/es/images/resource-load.png and b/doc/src/user/es/images/resource-load.png differ diff --git a/doc/src/user/es/images/resources_global.png b/doc/src/user/es/images/resources_global.png index f96998452..e2b15ceb4 100644 Binary files a/doc/src/user/es/images/resources_global.png and b/doc/src/user/es/images/resources_global.png differ diff --git a/doc/src/user/es/images/virtual-resources.png b/doc/src/user/es/images/virtual-resources.png index 05e342210..3a54f95d3 100644 Binary files a/doc/src/user/es/images/virtual-resources.png and b/doc/src/user/es/images/virtual-resources.png differ diff --git a/doc/src/user/es/images/work-report-types.png b/doc/src/user/es/images/work-report-types.png index 732767749..986f705aa 100644 Binary files a/doc/src/user/es/images/work-report-types.png and b/doc/src/user/es/images/work-report-types.png differ diff --git a/doc/src/user/gl/01-introducion.rst b/doc/src/user/gl/01-introducion.rst index b50195f2a..c77d36c4a 100644 --- a/doc/src/user/gl/01-introducion.rst +++ b/doc/src/user/gl/01-introducion.rst @@ -41,7 +41,7 @@ Tal e como se visualiza na anterior captura, a principal pantalla da aplicación .. figure:: images/order_list.png :scale: 50 - Listado de pedidos + Estructura de Descomposición de Traballo A xestión de perspectivas que se comentou para a vista global de empresa é moi similar á prantexada para un só proxecto. O acceso a un proxecto pódese realizar de varias formas: diff --git a/doc/src/user/gl/16-ldap-authentication.rst b/doc/src/user/gl/16-ldap-authentication.rst index d3a636a11..d69af0b6b 100644 --- a/doc/src/user/gl/16-ldap-authentication.rst +++ b/doc/src/user/gl/16-ldap-authentication.rst @@ -3,32 +3,38 @@ Configuracion LDAP .. contents:: -Esta pantalla permite establecer unha conexión LDAP para delegar autenticación e/ou autorización. +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. +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. +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. +*Base*, *UserDN* e *Contrasinal* 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. + +.. NOTE:: + + Se o seu LDAP está configurado para traballar con autenticación anónima pode + deixar baleiros oos atributos *UserDN* e *Contrasinal*. Autenticación ============= @@ -45,7 +51,6 @@ 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 ============ @@ -55,36 +60,175 @@ 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. +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. -O único parámetro neste caso é o *Path de grupo* que representa a ruta en LDAP -para atopar as ramas que representan os grupos. +O seguiente exemplo representa unha estrutura de LDAP válida para usar a +estratexia de grupo. + +* Estrutura do LDAP:: + + dc=example,dc=org + |- ou=groups + |- cn=admins + |- cn=itpeople + |- cn=workers + |- ou=people + |- uid=admin1 + |- uid=it1 + |- uid=it2 + |- uid=worker1 + |- uid=worker2 + |- uid=worker3 + +Neste caso, cada grupo tenrá un atributo, por exemplo chamado ``member``, +coa lista de usuarios que pertencen ao grupo: + +* ``cn=admins``: + + * ``member: uid=admin1,ou=people,dc=example,dc=org`` + * ``member: uid=it1,ou=people,dc=example,dc=org`` + +* ``cn=itpeople``: + + * ``member: uid=it1,ou=people,dc=example,dc=org`` + * ``member: uid=it2,ou=people,dc=example,dc=org`` + +* ``cn=workers``: + + * ``member: uid=worker1,ou=people,dc=example,dc=org`` + * ``member: uid=worker2,ou=people,dc=example,dc=org`` + * ``member: uid=worker3,ou=people,dc=example,dc=org`` + +A configuración para este caso é a seguinte: + +* Estratexia para a búsqueda de roles: ``Estratexia de grupo`` +* Path do grupo: ``ou=groups`` +* Propiedade do rol: ``member`` +* Consulta para a búsqueda de roles: ``uid=[USER_ID],ou=people,dc=example,dc=org`` + +E por exemplo se quere facer algunha correspondencia de roles: + +* Administration: ``cn=admins;cn=itpeople`` +* Web service reader: ``cn=itpeople`` +* Web service writer: ``cn=itpeople`` +* All projects read allowed: ``cn=admins`` +* All projects edition allowed: ``cn=admins`` +* Project creation allowed: ``cn=workers`` 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: +Cando o 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 non necesita +o parámetro *Path do grupo*: -* *Propiedade do rol*. Representa a propiedade no nodo do usuario que - contén todos os roles para o mesmo. +O seguiente exemplo representa unha estrutura de LDAP válida para usar a +estratexia de propiedade. -* *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. +* Estrutura do 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 + dc=example,dc=org + |- ou=people + |- uid=admin1 + |- uid=it1 + |- uid=it2 + |- uid=worker1 + |- uid=worker2 + |- uid=worker3 + +Con atributo +............ + +Neste caso, cada usuario tenrá un atributo, por exemplo chamado ``group``` +co nome do grupo ao que pertence: + +* ``uid=admin1``: + + * ``group: admins`` + +* ``uid=it1``: + + * ``group: itpeople`` + +* ``uid=it2``: + + * ``group: itpeople`` + +* ``uid=worker1``: + + * ``group: workers`` + +* ``uid=worker2``: + + * ``group: workers`` + +* ``uid=worker3``: + + * ``group: workers`` + +.. WARNING:: + + Esta estratexia ten unha restricción, cada usuario pode pertencer só a un + grupo. + +A configuración para este caso é a seguinte: + +* Estratexia para a búsqueda de roles: ``Estratexia de propiedade`` +* Path do grupo: +* Propiedade do rol: ``group`` +* Consulta para a búsqueda de roles: ``[USER_ID]`` + +E por exemplo se quere facer algunha correspondencia de roles: + +* Administration: ``admins;itpeople`` +* Web service reader: ``itpeople`` +* Web service writer: ``itpeople`` +* All projects read allowed: ``admins`` +* All projects edition allowed: ``admins`` +* Project creation allowed: ``workers`` + +Por identificador de usuario +............................ + +Incluso pode ter unha solución para especificar os roles de LibrePlan +directamente aos usuarios, sen ter un atributo en cada usuario de LDAP. + +Neste caso, especificará que usuarios teñen os diferentes roles por ``uid``. + +A configuración para este caso é a seguinte: + +* Estratexia para a búsqueda de roles: ``Estratexia de propiedade`` +* Path do grupo: +* Propiedade do rol: ``uid`` +* Consulta para a búsqueda de roles: ``[USER_ID]`` + +E por exemplo se quere facer algunha correspondencia de roles: + +* Administration: ``admin1;it1`` +* Web service reader: ``it1;it2`` +* Web service writer: ``it1;it2`` +* All projects read allowed: ``admin1`` +* All projects edition allowed: ``admin1`` +* Project creation allowed: ``worker1;worker2;worker3`` + +Correspondencia de roles +------------------------ + +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 é ";". +"``admin;administrators``". O carácter de separación de roles é "``;``". + +.. NOTE:: + + Se quere especificar que todos os usuarios ou todos os roles teñan un + permiso pode usar un asterisco (``*``) coma comodín para referirse a eles. + Por exemplo, se quere que todo o mundo teña o rol *Project creation + allowed* configurará a correspondica de roles coma segue: + + * Project creation allowed: ``*`` diff --git a/doc/src/user/gl/20-acerca-de.rst b/doc/src/user/gl/20-acerca-de.rst index d9d3c273a..41951a38c 100644 --- a/doc/src/user/gl/20-acerca-de.rst +++ b/doc/src/user/gl/20-acerca-de.rst @@ -5,6 +5,21 @@ Acerca de .. contents:: +Copyright +========= + +Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e +Desenvolvemento Tecnolóxico de Galicia + +Copyright (C) 2010 Igalia, S.L.; Wireless Galicia, S.L. + +Copyright (C) 2011 Igalia, S.L.; Wireless Galicia, S.L.; ComtecSF, S.L.; +CafédeRed Solutions, S.L. + +Copyright (C) 2012 Igalia, S.L.; Wireless Galicia, S.L.; CafédeRed Solutions, +S.L. + + Licenza ================ @@ -51,9 +66,19 @@ Anteriores membros do equipo Traductores ----------- -* [es] Manuel Rego Casasnovas -* [gl] Manuel Rego Casasnovas -* [pt] Helena Grosso +* [es] Jacobo Aragunde Pérez , + Manuel Rego Casasnovas , + Diego Pino García +* [fr] Stephane Ayache , + Guillaume Postaire , + Philippe Poumaroux +* [gl] Jacobo Aragunde Pérez , + Manuel Rego Casasnovas , + Diego Pino García +* [it] Giuseppe Zizza +* [nl] Jeroen Baten +* [pt] Helena Grosso , + Joaquim Rocha * [ru] Pavel Rudensky Contribuidores diff --git a/doc/src/user/gl/images/advance-assignment.png b/doc/src/user/gl/images/advance-assignment.png index 5bedd1c1b..aeb55b2b6 100644 Binary files a/doc/src/user/gl/images/advance-assignment.png and b/doc/src/user/gl/images/advance-assignment.png differ diff --git a/doc/src/user/gl/images/category-cost-edit.png b/doc/src/user/gl/images/category-cost-edit.png index d633f8c81..1755ee79e 100644 Binary files a/doc/src/user/gl/images/category-cost-edit.png and b/doc/src/user/gl/images/category-cost-edit.png differ diff --git a/doc/src/user/gl/images/category-cost-list.png b/doc/src/user/gl/images/category-cost-list.png index 24e6469d8..1d7ff838c 100644 Binary files a/doc/src/user/gl/images/category-cost-list.png and b/doc/src/user/gl/images/category-cost-list.png differ diff --git a/doc/src/user/gl/images/company_view.png b/doc/src/user/gl/images/company_view.png index 0feb4b575..c3a7631e6 100644 Binary files a/doc/src/user/gl/images/company_view.png and b/doc/src/user/gl/images/company_view.png differ diff --git a/doc/src/user/gl/images/edicion-criterio.png b/doc/src/user/gl/images/edicion-criterio.png index a4f7cfcae..2b879ced5 100644 Binary files a/doc/src/user/gl/images/edicion-criterio.png and b/doc/src/user/gl/images/edicion-criterio.png differ diff --git a/doc/src/user/gl/images/hour-type-edit.png b/doc/src/user/gl/images/hour-type-edit.png index 9ae5c3eff..4917b08a8 100644 Binary files a/doc/src/user/gl/images/hour-type-edit.png and b/doc/src/user/gl/images/hour-type-edit.png differ diff --git a/doc/src/user/gl/images/hour-type-list.png b/doc/src/user/gl/images/hour-type-list.png index 2649f26f1..1872eb4f7 100644 Binary files a/doc/src/user/gl/images/hour-type-list.png and b/doc/src/user/gl/images/hour-type-list.png differ diff --git a/doc/src/user/gl/images/manage-user-profile.png b/doc/src/user/gl/images/manage-user-profile.png index 8c644e570..6a86064e2 100644 Binary files a/doc/src/user/gl/images/manage-user-profile.png and b/doc/src/user/gl/images/manage-user-profile.png differ diff --git a/doc/src/user/gl/images/manage-user.png b/doc/src/user/gl/images/manage-user.png index 9c5c078cc..df59f1b7c 100644 Binary files a/doc/src/user/gl/images/manage-user.png and b/doc/src/user/gl/images/manage-user.png differ diff --git a/doc/src/user/gl/images/material.png b/doc/src/user/gl/images/material.png index c70da6bd8..a77b5aa41 100644 Binary files a/doc/src/user/gl/images/material.png and b/doc/src/user/gl/images/material.png differ diff --git a/doc/src/user/gl/images/order-criterions.png b/doc/src/user/gl/images/order-criterions.png index f1b281fcf..e59bd833f 100644 Binary files a/doc/src/user/gl/images/order-criterions.png and b/doc/src/user/gl/images/order-criterions.png differ diff --git a/doc/src/user/gl/images/order-edition.png b/doc/src/user/gl/images/order-edition.png index 5d5e40f85..ff67134db 100644 Binary files a/doc/src/user/gl/images/order-edition.png and b/doc/src/user/gl/images/order-edition.png differ diff --git a/doc/src/user/gl/images/order-labels.png b/doc/src/user/gl/images/order-labels.png index 9a0cc5fb3..076e0a745 100644 Binary files a/doc/src/user/gl/images/order-labels.png and b/doc/src/user/gl/images/order-labels.png differ diff --git a/doc/src/user/gl/images/order-material.png b/doc/src/user/gl/images/order-material.png index 0d4e33ed6..9197679e7 100644 Binary files a/doc/src/user/gl/images/order-material.png and b/doc/src/user/gl/images/order-material.png differ diff --git a/doc/src/user/gl/images/order-quality.png b/doc/src/user/gl/images/order-quality.png index 2e9be6fc2..ee9e9027e 100644 Binary files a/doc/src/user/gl/images/order-quality.png and b/doc/src/user/gl/images/order-quality.png differ diff --git a/doc/src/user/gl/images/order_list.png b/doc/src/user/gl/images/order_list.png index 9e1047563..72e70f3b6 100644 Binary files a/doc/src/user/gl/images/order_list.png and b/doc/src/user/gl/images/order_list.png differ diff --git a/doc/src/user/gl/images/planning-view.png b/doc/src/user/gl/images/planning-view.png index 10629a67d..de74811eb 100644 Binary files a/doc/src/user/gl/images/planning-view.png and b/doc/src/user/gl/images/planning-view.png differ diff --git a/doc/src/user/gl/images/quality.png b/doc/src/user/gl/images/quality.png index 94334ecbd..1850f51b9 100644 Binary files a/doc/src/user/gl/images/quality.png and b/doc/src/user/gl/images/quality.png differ diff --git a/doc/src/user/gl/images/resource-calendar.png b/doc/src/user/gl/images/resource-calendar.png index 731260960..749c7b829 100644 Binary files a/doc/src/user/gl/images/resource-calendar.png and b/doc/src/user/gl/images/resource-calendar.png differ diff --git a/doc/src/user/gl/images/resource-load.png b/doc/src/user/gl/images/resource-load.png index e7a646ea1..e2b15ceb4 100644 Binary files a/doc/src/user/gl/images/resource-load.png and b/doc/src/user/gl/images/resource-load.png differ diff --git a/doc/src/user/gl/images/resources_global.png b/doc/src/user/gl/images/resources_global.png index f96998452..e2b15ceb4 100644 Binary files a/doc/src/user/gl/images/resources_global.png and b/doc/src/user/gl/images/resources_global.png differ diff --git a/doc/src/user/gl/images/virtual-resources.png b/doc/src/user/gl/images/virtual-resources.png index 05e342210..3a54f95d3 100644 Binary files a/doc/src/user/gl/images/virtual-resources.png and b/doc/src/user/gl/images/virtual-resources.png differ diff --git a/doc/src/user/gl/images/work-report-types.png b/doc/src/user/gl/images/work-report-types.png index 732767749..986f705aa 100644 Binary files a/doc/src/user/gl/images/work-report-types.png and b/doc/src/user/gl/images/work-report-types.png differ diff --git a/ganttzk/pom.xml b/ganttzk/pom.xml index ce42da520..36f4e0184 100644 --- a/ganttzk/pom.xml +++ b/ganttzk/pom.xml @@ -6,47 +6,58 @@ org.libreplan libreplan - 1.2.0 + 1.2.2 ganttzk jar LibrePlan ZK Components Module - - - - org.xnap.commons - maven-gettext-plugin - - app.i18n.Messages - ${project.build.sourceDirectory}/../resources/i18n - -k_ - - - - compile - - dist - - - - - - org.apache.maven.plugins - maven-source-plugin - 2.1.2 - - - default - package - - jar-no-fork - - - + + + i18n + + true + + + + + org.xnap.commons + maven-gettext-plugin + + app.i18n.Messages + ${project.build.sourceDirectory}/../resources/i18n + -k_ + + + + compile + + dist + + + + + + org.apache.maven.plugins + maven-source-plugin + 2.1.2 + + + default + package + + jar-no-fork + + + - - + + + + + + + diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/CommandContextualized.java b/ganttzk/src/main/java/org/zkoss/ganttz/CommandContextualized.java index ee235995a..07f5f1721 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/CommandContextualized.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/CommandContextualized.java @@ -3,7 +3,7 @@ * * 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. + * Copyright (C) 2010-2012 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 @@ -62,13 +62,17 @@ class CommandContextualized { result.setImage(command.getImage()); result.setTooltiptext(command.getName()); } - result.addEventListener(Events.ON_CLICK, new EventListener() { + if (command.isDisabled()) { + result.setDisabled(true); + } else { + result.addEventListener(Events.ON_CLICK, new EventListener() { - @Override - public void onEvent(Event event) { - doAction(); - } - }); + @Override + public void onEvent(Event event) { + doAction(); + } + }); + } button = result; return result; } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/DependencyComponent.java b/ganttzk/src/main/java/org/zkoss/ganttz/DependencyComponent.java index 7641298af..45d6315db 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/DependencyComponent.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/DependencyComponent.java @@ -56,6 +56,10 @@ public class DependencyComponent extends XulElement implements AfterCompose { private IConstraintViolationListener violationListener; + private PropertyChangeListener visibilityChangeListener; + + private PropertyChangeListener listener; + private boolean violated = false; public DependencyComponent(TaskComponent source, TaskComponent destination, @@ -69,23 +73,6 @@ public class DependencyComponent extends XulElement implements AfterCompose { this.source = source; this.destination = destination; this.dependency = dependency; - violationListener = Constraint - .onlyOnZKExecution(new IConstraintViolationListener() { - - @Override - public void constraintViolated(Constraint constraint, GanttDate value) { - violated = true; - sendCSSUpdate(); - } - - @Override - public void constraintSatisfied(Constraint constraint, GanttDate value) { - violated = false; - sendCSSUpdate(); - } - }); - this.dependency.addConstraintViolationListener(violationListener, - Mode.RECEIVE_PENDING); } private void sendCSSUpdate() { @@ -104,7 +91,7 @@ public class DependencyComponent extends XulElement implements AfterCompose { if (listenerAdded) { return; } - PropertyChangeListener listener = new PropertyChangeListener() { + listener = new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { @@ -113,9 +100,37 @@ public class DependencyComponent extends XulElement implements AfterCompose { }; this.source.getTask().addFundamentalPropertiesChangeListener(listener); this.destination.getTask().addFundamentalPropertiesChangeListener(listener); + + violationListener = Constraint + .onlyOnZKExecution(new IConstraintViolationListener() { + + @Override + public void constraintViolated(Constraint constraint, GanttDate value) { + violated = true; + sendCSSUpdate(); + } + + @Override + public void constraintSatisfied(Constraint constraint, GanttDate value) { + violated = false; + sendCSSUpdate(); + } + }); + this.dependency.addConstraintViolationListener(violationListener, + Mode.RECEIVE_PENDING); + listenerAdded = true; } + public void removeChangeListeners() { + if (!listenerAdded) { + return; + } + this.source.getTask().removePropertyChangeListener(listener); + this.destination.getTask().removePropertyChangeListener(listener); + listenerAdded = false; + } + /** * @return the idTaskOrig */ @@ -192,4 +207,12 @@ public class DependencyComponent extends XulElement implements AfterCompose { return (source.isLimiting() || destination.isLimiting()); } + public PropertyChangeListener getVisibilityChangeListener() { + return visibilityChangeListener; + } + + public void setVisibilityChangeListener(PropertyChangeListener visibilityChangeListener) { + this.visibilityChangeListener = visibilityChangeListener; + } + } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java b/ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java index 7b38a5f9a..04ca965e3 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java @@ -149,6 +149,7 @@ public class DependencyList extends XulElement implements AfterCompose { visibilityToggler); destination.getTask().addVisibilityPropertiesChangeListener( visibilityToggler); + dependencyComponent.setVisibilityChangeListener(visibilityToggler); boolean dependencyMustBeVisible = visibilityToggler .dependencyMustBeVisible(); visibilityToggler.toggleDependencyExistence(dependencyMustBeVisible); @@ -280,7 +281,7 @@ public class DependencyList extends XulElement implements AfterCompose { for (DependencyComponent dependencyComponent : DependencyList.this .getDependencyComponents()) { if (dependencyComponent.contains(task)) { - this.removeChild(dependencyComponent); + removeDependencyComponent(dependencyComponent); } } } @@ -289,8 +290,24 @@ public class DependencyList extends XulElement implements AfterCompose { for (DependencyComponent dependencyComponent : DependencyList.this .getDependencyComponents()) { if (dependencyComponent.hasSameSourceAndDestination(dependency)) { - this.removeChild(dependencyComponent); + removeDependencyComponent(dependencyComponent); } } } + + private void removeDependencyComponent(DependencyComponent dependencyComponent) { + //remove the visibility listener attached to the tasks + TaskComponent source = dependencyComponent.getSource(); + TaskComponent destination = dependencyComponent.getDestination(); + PropertyChangeListener listener = + dependencyComponent.getVisibilityChangeListener(); + source.getTask().removeVisibilityPropertiesChangeListener(listener); + destination.getTask().removeVisibilityPropertiesChangeListener(listener); + + //remove other change listeners + dependencyComponent.removeChangeListeners(); + + //remove the dependency itself + this.removeChild(dependencyComponent); + } } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/FunctionalityExposedForExtensions.java b/ganttzk/src/main/java/org/zkoss/ganttz/FunctionalityExposedForExtensions.java index a8979f9de..92c70ae7e 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/FunctionalityExposedForExtensions.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/FunctionalityExposedForExtensions.java @@ -3,7 +3,7 @@ * * 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. + * Copyright (C) 2010-2012 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 @@ -221,9 +221,13 @@ public class FunctionalityExposedForExtensions implements IContext { accumulatedDependencies, child)); i++; } + } else if (navigator.isMilestone(data)) { + Milestone milestone = (Milestone) result; + milestone.setOwner(position.getParent()); } result.setShowingReportedHours(planner.showReportedHoursRightNow()); + result.setShowingMoneyCostBar(planner.showMoneyCostBarRightNow()); result.setShowingAdvances(planner.showAdvancesRightNow()); mapper.register(position, result, data); @@ -303,11 +307,11 @@ public class FunctionalityExposedForExtensions implements IContext { public Position remove(T domainObject) { Task task = mapper.findAssociatedBean(domainObject); Position position = mapper.findPositionFor(task); + adapter.doRemovalOf(mapper.findAssociatedDomainObject(task)); + mapper.remove(domainObject); diagramGraph.remove(task); task.removed(); planner.removeTask(task); - adapter.doRemovalOf(mapper.findAssociatedDomainObject(task)); - mapper.remove(domainObject); return position; } @@ -462,6 +466,20 @@ public class FunctionalityExposedForExtensions implements IContext { } } + @Override + public void showMoneyCostBar() { + for (Task task : diagramGraph.getTasks()) { + task.setShowingMoneyCostBar(true); + } + } + + @Override + public void hideMoneyCostBar() { + for (Task task : diagramGraph.getTasks()) { + task.setShowingMoneyCostBar(false); + } + } + @Override public void reloadCharts() { configuration.reloadCharts(); @@ -480,6 +498,8 @@ public class FunctionalityExposedForExtensions implements IContext { Checkbox advances = (Checkbox) parent.getFellow("print_advances"); Checkbox reportedHours = (Checkbox) parent .getFellow("print_reported_hours"); + Checkbox moneyCostBar = (Checkbox) parent + .getFellow("print_money_cost_bar"); parameters.put("extension", ".png"); if (expanded.isChecked() == true) { @@ -494,6 +514,9 @@ public class FunctionalityExposedForExtensions implements IContext { if (reportedHours.isChecked() == true) { parameters.put("reportedHours", "all"); } + if (moneyCostBar.isChecked() == true) { + parameters.put("moneyCostBar", "all"); + } if (resources.isChecked() == true) { parameters.put("resources", "all"); } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/LeftTasksTreeRow.java b/ganttzk/src/main/java/org/zkoss/ganttz/LeftTasksTreeRow.java index b4d5ad708..aafe0c38d 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/LeftTasksTreeRow.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/LeftTasksTreeRow.java @@ -25,7 +25,6 @@ import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.text.DateFormat; import java.text.ParseException; -import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; import java.util.List; @@ -36,6 +35,8 @@ 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; @@ -377,8 +378,15 @@ public class LeftTasksTreeRow extends GenericForwardComposer { } } else if (updatedComponent == getStartDateTextBox()) { try { - Date begin = dateFormat.parse(getStartDateTextBox().getValue()); - task.moveTo(GanttDate.createFrom(begin)); + 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() diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/Planner.java b/ganttzk/src/main/java/org/zkoss/ganttz/Planner.java index a63a4c12b..f30a2e0a7 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/Planner.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/Planner.java @@ -3,7 +3,7 @@ * * 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. + * Copyright (C) 2010-2012 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 @@ -120,6 +120,15 @@ public class Planner extends HtmlMacroComponent { return toLowercaseSet(values).contains("all"); } + public static boolean guessShowMoneyCostBarByDefault( + Map queryURLParameters) { + String[] values = queryURLParameters.get("moneyCostBar"); + if (values == null) { + return false; + } + return toLowercaseSet(values).contains("all"); + } + private static Set toLowercaseSet(String[] values) { Set result = new HashSet(); for (String each : values) { @@ -156,6 +165,8 @@ public class Planner extends HtmlMacroComponent { private boolean isShowingReportedHours = false; + private boolean isShowingMoneyCostBar = false; + private boolean isShowingResources = false; private boolean isExpandAll = false; @@ -372,6 +383,11 @@ public class Planner extends HtmlMacroComponent { Button showAllResources = (Button) getFellow("showAllResources"); showAllResources.setVisible(false); } + if (!configuration.isMoneyCostBarEnabled()) { + Button showMoneyCostBarButton = (Button) getFellow("showMoneyCostBar"); + showMoneyCostBarButton.setVisible(false); + } + listZoomLevels.setSelectedIndex(getZoomLevel().ordinal()); this.visibleChart = configuration.isExpandPlanningViewCharts(); @@ -571,12 +587,22 @@ public class Planner extends HtmlMacroComponent { } }; + private IGraphChangeListener showMoneyCostBarOnChange = new IGraphChangeListener() { + + @Override + public void execute() { + context.showMoneyCostBar(); + } + }; + private boolean containersExpandedByDefault = false; private boolean shownAdvanceByDefault = false; private boolean shownReportedHoursByDefault = false; + private boolean shownMoneyCostBarByDefault = false; + private FilterAndParentExpandedPredicates predicate; private boolean visibleChart; @@ -645,6 +671,26 @@ public class Planner extends HtmlMacroComponent { } } + public void showMoneyCostBar() { + Button showMoneyCostBarButton = (Button) getFellow("showMoneyCostBar"); + if (disabilityConfiguration.isMoneyCostBarEnabled()) { + if (isShowingMoneyCostBar) { + context.hideMoneyCostBar(); + diagramGraph + .removePostGraphChangeListener(showMoneyCostBarOnChange); + showMoneyCostBarButton.setSclass("planner-command"); + showMoneyCostBarButton.setTooltiptext(_("Show money cost bar")); + } else { + context.showMoneyCostBar(); + diagramGraph + .addPostGraphChangeListener(showMoneyCostBarOnChange); + showMoneyCostBarButton.setSclass("planner-command clicked"); + showMoneyCostBarButton.setTooltiptext(_("Hide money cost bar")); + } + isShowingMoneyCostBar = !isShowingMoneyCostBar; + } + } + public void showAllLabels() { Button showAllLabelsButton = (Button) getFellow("showAllLabels"); if (isShowingLabels) { @@ -732,6 +778,19 @@ public class Planner extends HtmlMacroComponent { return (areShownReportedHoursByDefault() || isShowingReportedHours); } + public void setAreShownMoneyCostBarByDefault( + boolean shownMoneyCostBarByDefault) { + this.shownMoneyCostBarByDefault = shownMoneyCostBarByDefault; + } + + public boolean areShownMoneyCostBarByDefault() { + return shownMoneyCostBarByDefault; + } + + public boolean showMoneyCostBarRightNow() { + return (areShownMoneyCostBarByDefault() || isShowingMoneyCostBar); + } + public void expandAll() { Button expandAllButton = (Button) getFellow("expandAll"); if (disabilityConfiguration.isExpandAllEnabled()) { @@ -877,7 +936,9 @@ public class Planner extends HtmlMacroComponent { if (taskList != null) { taskList.updateCompletion(progressType); // FIXME Bug #1270 - taskList.invalidate(); + for (TaskComponent each : taskList.getTaskComponents()) { + each.invalidate(); + } } } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/TaskComponent.java b/ganttzk/src/main/java/org/zkoss/ganttz/TaskComponent.java index ce6fcc9e7..88aa427fe 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/TaskComponent.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/TaskComponent.java @@ -3,7 +3,7 @@ * * 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. + * Copyright (C) 2010-2012 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 @@ -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; @@ -58,6 +60,7 @@ import org.zkoss.zul.Div; * Graphical component which represents a {@link Task}. * * @author Javier Morán Rúa + * @author Manuel Rego Casasnovas */ public class TaskComponent extends Div implements AfterCompose { @@ -76,6 +79,8 @@ public class TaskComponent extends Div implements AfterCompose { private PropertyChangeListener showingReportedHoursPropertyListener; + private PropertyChangeListener showingMoneyCostBarPropertyListener; + public static TaskComponent asTaskComponent(Task task, IDisabilityConfiguration disabilityConfiguration, boolean isTopLevel) { @@ -220,6 +225,9 @@ public class TaskComponent extends Div implements AfterCompose { cssClass += task.isLimitingAndHasDayAssignments() ? " limiting-assigned " : " limiting-unassigned "; } + if (task.isRoot() && task.belongsClosedProject()) { + cssClass += " project-closed "; + } return cssClass; } @@ -238,9 +246,7 @@ public class TaskComponent extends Div implements AfterCompose { @Override public void propertyChange(PropertyChangeEvent evt) { - if (isInPage()) { - updateProperties(); - } + updateProperties(); } }; } @@ -275,6 +281,20 @@ public class TaskComponent extends Div implements AfterCompose { this.task .addReportedHoursPropertyChangeListener(showingReportedHoursPropertyListener); + if (showingMoneyCostBarPropertyListener == null) { + showingMoneyCostBarPropertyListener = new PropertyChangeListener() { + + @Override + public void propertyChange(PropertyChangeEvent evt) { + if (isInPage() && !(task instanceof Milestone)) { + updateCompletionMoneyCostBar(); + } + } + }; + } + this.task + .addMoneyCostBarPropertyChangeListener(showingMoneyCostBarPropertyListener); + if (criticalPathPropertyListener == null) { criticalPathPropertyListener = new PropertyChangeListener() { @@ -345,8 +365,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,10 +508,11 @@ public class TaskComponent extends Div implements AfterCompose { return; } updateCompletionReportedHours(); + updateCompletionMoneyCostBar(); updateCompletionAdvance(); } - private void updateCompletionReportedHours() { + public void updateCompletionReportedHours() { if (task.isShowingReportedHours()) { int startPixels = this.task.getBeginDate().toPixels(getMapper()); String widthHoursAdvancePercentage = pixelsFromStartUntil( @@ -498,6 +525,19 @@ public class TaskComponent extends Div implements AfterCompose { } } + public void updateCompletionMoneyCostBar() { + if (task.isShowingMoneyCostBar()) { + int startPixels = this.task.getBeginDate().toPixels(getMapper()); + String widthMoneyCostBar = pixelsFromStartUntil(startPixels, + this.task.getMoneyCostBarEndDate()) + "px"; + response(null, new AuInvoke(this, "resizeCompletionMoneyCostBar", + widthMoneyCostBar)); + } else { + response(null, new AuInvoke(this, "resizeCompletionMoneyCostBar", + "0px")); + } + } + private void updateCompletionAdvance() { if (task.isShowingAdvances()) { int startPixels = this.task.getBeginDate().toPixels(getMapper()); @@ -541,10 +581,6 @@ public class TaskComponent extends Div implements AfterCompose { this.progressType = progressType; } - private DependencyList getDependencyList() { - return getGanntPanel().getDependencyList(); - } - private GanttPanel getGanntPanel() { return getTaskList().getGanttPanel(); } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/TaskEditFormComposer.java b/ganttzk/src/main/java/org/zkoss/ganttz/TaskEditFormComposer.java index 7209db8dd..85679aee6 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/TaskEditFormComposer.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/TaskEditFormComposer.java @@ -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); diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/TaskList.java b/ganttzk/src/main/java/org/zkoss/ganttz/TaskList.java index 451bbda6b..ce23f7823 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/TaskList.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/TaskList.java @@ -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); } } @@ -141,7 +142,6 @@ public class TaskList extends XulElement implements AfterCompose { taskComponent.afterCompose(); if (relocate) { getGanttPanel().adjustZoomColumnsHeight(); - getGanttPanel().getDependencyList().redrawDependencies(); } } @@ -198,7 +198,7 @@ public class TaskList extends XulElement implements AfterCompose { return getTimeTrackerComponent().getTimeTracker(); } - private List getTaskComponents() { + protected List getTaskComponents() { ArrayList result = new ArrayList(); for (Object child : getChildren()) { if (child instanceof TaskRow) { diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/adapters/IDisabilityConfiguration.java b/ganttzk/src/main/java/org/zkoss/ganttz/adapters/IDisabilityConfiguration.java index 3fa8307be..6f5b50b38 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/adapters/IDisabilityConfiguration.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/adapters/IDisabilityConfiguration.java @@ -3,7 +3,7 @@ * * 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. + * Copyright (C) 2010-2012 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 @@ -22,7 +22,7 @@ package org.zkoss.ganttz.adapters; /** * @author Óscar González Fernández - * + * @author Manuel Rego Casasnovas */ public interface IDisabilityConfiguration { @@ -40,6 +40,8 @@ public interface IDisabilityConfiguration { public boolean isReportedHoursEnabled(); + public boolean isMoneyCostBarEnabled(); + public boolean isExpandAllEnabled(); public boolean isFlattenTreeEnabled(); diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/adapters/PlannerConfiguration.java b/ganttzk/src/main/java/org/zkoss/ganttz/adapters/PlannerConfiguration.java index 951595be5..0931feeac 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/adapters/PlannerConfiguration.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/adapters/PlannerConfiguration.java @@ -3,7 +3,7 @@ * * 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. + * Copyright (C) 2010-2012 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 @@ -46,7 +46,9 @@ import org.zkoss.zk.ui.Component; /** * A object that defines several extension points for gantt planner + * * @author Óscar González Fernández + * @author Manuel Rego Casasnovas */ public class PlannerConfiguration implements IDisabilityConfiguration { @@ -79,6 +81,11 @@ public class PlannerConfiguration implements IDisabilityConfiguration { return ""; } + @Override + public boolean isDisabled() { + return false; + } + } private static class NullCommandOnTask implements ICommandOnTask { @@ -141,6 +148,8 @@ public class PlannerConfiguration implements IDisabilityConfiguration { private boolean reportedHoursEnabled = true; + private boolean moneyCostBarEnabled = true; + private boolean expandAllEnabled = true; private boolean flattenTreeEnabled = true; @@ -338,6 +347,15 @@ public class PlannerConfiguration implements IDisabilityConfiguration { return reportedHoursEnabled; } + public void setMoneyCostBarEnabled(boolean moneyCostBarEnabled) { + this.moneyCostBarEnabled = moneyCostBarEnabled; + } + + @Override + public boolean isMoneyCostBarEnabled() { + return moneyCostBarEnabled; + } + public void setExpandAllEnabled(boolean expandAllEnabled) { this.expandAllEnabled = expandAllEnabled; } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/data/DefaultFundamentalProperties.java b/ganttzk/src/main/java/org/zkoss/ganttz/data/DefaultFundamentalProperties.java index b55ed9ec8..5788dcfc9 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/data/DefaultFundamentalProperties.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/DefaultFundamentalProperties.java @@ -3,7 +3,7 @@ * * 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. + * Copyright (C) 2010-2012 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 @@ -34,6 +34,7 @@ import org.zkoss.ganttz.data.constraint.Constraint; /** * @author Óscar González Fernández + * @author Manuel Rego Casasnovas */ public class DefaultFundamentalProperties implements ITaskFundamentalProperties { @@ -47,10 +48,14 @@ public class DefaultFundamentalProperties implements ITaskFundamentalProperties private long hoursAdvanceEndDate; + private long moneyCostBarEndDate; + private Date advanceEndDate; private BigDecimal hoursAdvancePercentage; + private BigDecimal moneyCostBarPercentage; + private BigDecimal advancePercentage; private String tooltipText; @@ -59,27 +64,63 @@ 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() { } public DefaultFundamentalProperties(String name, Date beginDate, long lengthMilliseconds, String notes, Date hoursAdvanceEndDate, + Date moneyCostBarEndDate, Date advanceEndDate, - BigDecimal hoursAdvancePercentage, BigDecimal advancePercentage) { + BigDecimal hoursAdvancePercentage, + BigDecimal moneyCostBarPercentage, BigDecimal advancePercentage) { this.name = name; this.beginDate = beginDate.getTime(); this.lengthMilliseconds = lengthMilliseconds; this.notes = notes; this.hoursAdvanceEndDate = hoursAdvanceEndDate.getTime(); + this.moneyCostBarEndDate = moneyCostBarEndDate.getTime(); this.advanceEndDate = advanceEndDate; this.hoursAdvancePercentage = hoursAdvancePercentage; + this.moneyCostBarPercentage = moneyCostBarPercentage; this.advancePercentage = advancePercentage; this.tooltipText = "Default tooltip"; this.labelsText = ""; this.resourcesText = ""; } + @Override + public void doPositionModifications(IModifications modifications) { + modifications.doIt(position); + } + public String getName() { return name; } @@ -115,11 +156,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 +165,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; } @@ -152,6 +178,11 @@ public class DefaultFundamentalProperties implements ITaskFundamentalProperties return GanttDate.createFrom(new Date(hoursAdvanceEndDate)); } + @Override + public GanttDate getMoneyCostBarEndDate() { + return GanttDate.createFrom(new Date(moneyCostBarEndDate)); + } + @Override public GanttDate getAdvanceEndDate() { return advanceEndDate != null ? GanttDate.createFrom(new Date( @@ -193,11 +224,6 @@ public class DefaultFundamentalProperties implements ITaskFundamentalProperties return Collections.emptyList(); } - @Override - public void moveTo(GanttDate date) { - setBeginDate(date); - } - @Override public Date getDeadline() { return null; @@ -267,4 +293,14 @@ public class DefaultFundamentalProperties implements ITaskFundamentalProperties return false; } + @Override + public boolean belongsClosedProject() { + return false; + } + + @Override + public boolean isRoot() { + return false; + } + } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/data/GanttDiagramGraph.java b/ganttzk/src/main/java/org/zkoss/ganttz/data/GanttDiagramGraph.java index 4a0b3255f..e05e6ec07 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/data/GanttDiagramGraph.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/GanttDiagramGraph.java @@ -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 @@ -75,6 +79,10 @@ public class GanttDiagramGraph> implements public void setStartDate(GanttDate previousStart, GanttDate previousEnd, GanttDate newStart) { } + + @Override + public void positionPotentiallyModified() { + } }; } @@ -87,6 +95,8 @@ public class GanttDiagramGraph> implements public interface IAdapter> { List getChildren(V task); + V getOwner(V task); + boolean isContainer(V task); void registerDependenciesEnforcerHookOn(V task, @@ -131,6 +141,15 @@ public class GanttDiagramGraph> 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 +199,14 @@ public class GanttDiagramGraph> 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 +215,14 @@ public class GanttDiagramGraph> 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 +544,14 @@ public class GanttDiagramGraph> 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) { @@ -520,16 +559,51 @@ public class GanttDiagramGraph> implements } } - public interface IDependenciesEnforcerHook { + private interface IDependenciesEnforcer { public void setStartDate(GanttDate previousStart, GanttDate previousEnd, GanttDate newStart); public void setNewEnd(GanttDate previousEnd, GanttDate newEnd); } + /** + *

+ * When a {@link Task}'s dates are modified methods of this interface must + * be called. This can potentially trigger the dependencies enforcement + * algorithm. + *

+ *

+ * If the date modification happens outside the dependencies enforcement + * algorithm, it's always executed. Through the algorithm execution other + * tasks' dates are modified. When this happens we don't want to trigger the + * algorithm, instead we want to record that the change has happened and + * when the algorithm ends all the tasks are notified at once. + *

+ *

+ * For example imagine a Gantt with three tasks: T1 -> T2 -> T3. Imagine + * that T1 position is modified due to being moved by the user. In that case + * the scheduling algorithm triggers and the {@link Recalculation + * recalculations} needed are done. T2 position would be recalculated and T3 + * position too. When the recalculation happens their dates are modified, + * but in that case we don't want to trigger the dependencies enforcement + * algorithm again. What we want is to record the changes that have happened + * due to the algorithm. When the algorithm ends all notifications are fired + * at once. These notifications are notified to the registered + * {@link INotificationAfterDependenciesEnforcement}. + *

+ */ + public interface IDependenciesEnforcerHook extends IDependenciesEnforcer { + public void positionPotentiallyModified(); + } + public interface IDependenciesEnforcerHookFactory { + /** + * Creates a {@link IDependenciesEnforcerHook} that uses the provided + * {@link INotificationAfterDependenciesEnforcement notifier} to notify + * the changes that have happened due to the algorithm. + */ public IDependenciesEnforcerHook create(T task, - INotificationAfterDependenciesEnforcement notification); + INotificationAfterDependenciesEnforcement notifier); public IDependenciesEnforcerHook create(T task); } @@ -553,6 +627,11 @@ public class GanttDiagramGraph> implements } }; + /** + * Tracks all modifications to dates that have happened inside the + * dependencies enforcement algorithm. At the end of the algorithm they're + * executed via {@link DeferedNotifier#doNotifications()}. + */ public class DeferedNotifier { private Map notificationsPending = new LinkedHashMap(); @@ -670,11 +749,18 @@ public class GanttDiagramGraph> implements private ThreadLocal deferedNotifier = new ThreadLocal(); + /** + * It creates a {@link IDependenciesEnforcerHook} that starts the + * algorithm onEntrance and in subsequent tasks position + * modifications records the changes onNotification. + */ @Override public IDependenciesEnforcerHook create(V task, INotificationAfterDependenciesEnforcement notificator) { - return onlyEnforceDependenciesOnEntrance(onEntrance(task), - onNotification(task, notificator)); + return withPositionPotentiallyModified( + task, + onlyEnforceDependenciesOnEntrance(onEntrance(task), + onNotification(task, notificator))); } @Override @@ -682,8 +768,12 @@ public class GanttDiagramGraph> implements return create(task, EMPTY_NOTIFICATOR); } - private IDependenciesEnforcerHook onEntrance(final V task) { - return new IDependenciesEnforcerHook() { + /** + * What to do when a task's position is modified not inside the + * dependencies enforcement algorithm. + */ + private IDependenciesEnforcer onEntrance(final V task) { + return new IDependenciesEnforcer() { public void setStartDate(GanttDate previousStart, GanttDate previousEnd, GanttDate newStart) { @@ -698,9 +788,13 @@ public class GanttDiagramGraph> implements }; } - private IDependenciesEnforcerHook onNotification(final V task, + /** + * What to do when a task's position is modified from inside the + * dependencies enforcement algorithm. + */ + private IDependenciesEnforcer onNotification(final V task, final INotificationAfterDependenciesEnforcement notification) { - return new IDependenciesEnforcerHook() { + return new IDependenciesEnforcer() { @Override public void setStartDate(GanttDate previousStart, @@ -722,11 +816,46 @@ public class GanttDiagramGraph> implements } - private IDependenciesEnforcerHook onlyEnforceDependenciesOnEntrance( - final IDependenciesEnforcerHook onEntrance, - final IDependenciesEnforcerHook notification) { + /** + * Enrich {@link IDependenciesEnforcer} with + * {@link IDependenciesEnforcerHook#positionPotentiallyModified()}. + */ + private IDependenciesEnforcerHook withPositionPotentiallyModified( + final V task, final IDependenciesEnforcer enforcer) { return new IDependenciesEnforcerHook() { + @Override + public void setStartDate(GanttDate previousStart, + GanttDate previousEnd, GanttDate newStart) { + enforcer.setStartDate(previousStart, previousEnd, newStart); + } + + @Override + public void setNewEnd(GanttDate previousEnd, GanttDate newEnd) { + enforcer.setNewEnd(previousEnd, newEnd); + } + + @Override + public void positionPotentiallyModified() { + taskPositionModified(task); + } + }; + } + + /** + * Creates a {@link IDependenciesEnforcer} that detects if a position + * change comes from the dependencies algorithm or comes from outside. + * For that a {@link ReentranceGuard} is used. If the dependencies + * enforcement algorithm isn't being executed the + * {@link IDependenciesEnforcer} created delegates to + * onEntrance. Otherwise it delegates to + * notifier. + */ + private IDependenciesEnforcer onlyEnforceDependenciesOnEntrance( + final IDependenciesEnforcer onEntrance, + final IDependenciesEnforcer notifier) { + return new IDependenciesEnforcer() { + @Override public void setStartDate(final GanttDate previousStart, final GanttDate previousEnd, final GanttDate newStart) { @@ -739,7 +868,7 @@ public class GanttDiagramGraph> implements @Override public void doAction() { - notification.setStartDate( + notifier.setStartDate( previousStart, previousEnd, newStart); onEntrance.setStartDate( @@ -751,7 +880,7 @@ public class GanttDiagramGraph> implements @Override public void ifAlreadyInside() { - notification.setStartDate(previousStart, + notifier.setStartDate(previousStart, previousEnd, newStart); } @@ -770,7 +899,7 @@ public class GanttDiagramGraph> implements @Override public void doAction() { - notification.setNewEnd(previousEnd, + notifier.setNewEnd(previousEnd, newEnd); onEntrance.setNewEnd(previousEnd, newEnd); @@ -780,7 +909,7 @@ public class GanttDiagramGraph> implements @Override public void ifAlreadyInside() { - notification.setNewEnd(previousEnd, newEnd); + notifier.setNewEnd(previousEnd, newEnd); } }); } @@ -827,10 +956,20 @@ public class GanttDiagramGraph> implements }); } + /** + * When entering and exiting the dependencies enforcement algorithm some + * listeners must be notified. + */ private void onNewEntrance(final IAction action) { preAndPostActions.doAction(decorateWithNotifications(action)); } + /** + * Attach the {@link DeferedNotifier} for the current execution. + * {@link DeferedNotifier#doNotifications()} is called once the + * execution has finished, telling all listeners the task positions + * modifications that have happened. + */ private IAction decorateWithNotifications(final IAction action) { return new IAction() { @@ -1142,14 +1281,15 @@ public class GanttDiagramGraph> implements } private boolean haveToDoCalculation() { - return (recalculationsCouldAffectThis.isEmpty() || parentsHaveBeenModified()); + return recalculationsCouldAffectThis.isEmpty() + || predecessorsHaveBeenModified(); } - private boolean parentsHaveBeenModified() { + private boolean predecessorsHaveBeenModified() { for (Recalculation each : recalculationsCouldAffectThis) { if (!each.recalculationCalled) { throw new RuntimeException( - "the parent must be called first"); + "the predecessor must be called first"); } if (each.dataPointModified || each.couldHaveBeenModifiedBeforehand) { @@ -1711,15 +1851,17 @@ public class GanttDiagramGraph> implements .withConstraints(restrictions.getStartConstraints()) .withConstraints(getStartConstraints()) .applyWithoutFinalCheck(); - if (result != null && !result.equals(getStartDate(task))) { - return enforceRestrictions(result); + if (result != null) { + enforceRestrictions(result); + return biggerThan(result, adapter.getEndDateFor(task)); } return restrictions; } - private PositionRestrictions enforceRestrictions(GanttDate result) { - adapter.setStartDateFor(task, result); - return biggerThan(result, adapter.getEndDateFor(task)); + private void enforceRestrictions(GanttDate result) { + if (!result.equals(getStartDate(task))) { + adapter.setStartDateFor(task, result); + } } } @@ -1733,8 +1875,9 @@ public class GanttDiagramGraph> implements .withConstraints(restrictions.getEndConstraints()) .withConstraints(getEndConstraints()) .applyWithoutFinalCheck(); - if (result != null && !result.equals(getEndDateFor(task))) { - return enforceRestrictions(result); + if (result != null) { + enforceRestrictions(result); + return lessThan(adapter.getStartDate(task), result); } return restrictions; } @@ -1749,11 +1892,11 @@ public class GanttDiagramGraph> implements return adapter.getEndConstraintsFor(task); } - private PositionRestrictions enforceRestrictions(GanttDate newEnd) { - adapter.setEndDateFor(task, newEnd); - return lessThan(adapter.getStartDate(task), newEnd); + private void enforceRestrictions(GanttDate newEnd) { + if (!newEnd.equals(getEndDateFor(task))) { + adapter.setEndDateFor(task, newEnd); + } } - } @Override @@ -2285,30 +2428,3 @@ public class GanttDiagramGraph> implements } } - -interface IReentranceCases { - public void ifNewEntrance(); - - public void ifAlreadyInside(); -} - -class ReentranceGuard { - private final ThreadLocal inside = new ThreadLocal() { - 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); - } - } -} \ No newline at end of file diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/data/ITaskFundamentalProperties.java b/ganttzk/src/main/java/org/zkoss/ganttz/data/ITaskFundamentalProperties.java index a2e8fae6e..a09035f36 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/data/ITaskFundamentalProperties.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/ITaskFundamentalProperties.java @@ -3,7 +3,7 @@ * * 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. + * Copyright (C) 2010-2012 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 @@ -29,18 +29,34 @@ import org.zkoss.ganttz.data.constraint.Constraint; /** * @author Óscar González Fernández + * @author Manuel Rego Casasnovas */ 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,16 +71,14 @@ public interface ITaskFundamentalProperties { public GanttDate getEndDate(); - public void setEndDate(GanttDate endDate); - - public void resizeTo(GanttDate endDate); - public String getNotes(); public void setNotes(String notes); public GanttDate getHoursAdvanceEndDate(); + public GanttDate getMoneyCostBarEndDate(); + public GanttDate getAdvanceEndDate(); public BigDecimal getHoursAdvancePercentage(); @@ -81,8 +95,6 @@ public interface ITaskFundamentalProperties { public List> getEndConstraints(); - public void moveTo(GanttDate newStart); - public boolean isSubcontracted(); public boolean isLimiting(); @@ -107,4 +119,8 @@ public interface ITaskFundamentalProperties { boolean isManualAnyAllocation(); + public boolean belongsClosedProject(); + + public boolean isRoot(); + } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/data/Milestone.java b/ganttzk/src/main/java/org/zkoss/ganttz/data/Milestone.java index c3b0483a6..3d2ef1c63 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/data/Milestone.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/Milestone.java @@ -35,6 +35,8 @@ public class Milestone extends Task { private List tasks = new ArrayList(); + 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; + } + } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/data/Task.java b/ganttzk/src/main/java/org/zkoss/ganttz/data/Task.java index 6d8e60ac2..57e7b17a1 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/data/Task.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/Task.java @@ -3,7 +3,7 @@ * * 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. + * Copyright (C) 2010-2012 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 @@ -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; @@ -48,7 +47,9 @@ import org.zkoss.ganttz.util.WeakReferencedListeners.Mode; /** * This class contains the information of a task. It can be modified and * notifies of the changes to the interested parties.
+ * * @author Óscar González Fernández + * @author Manuel Rego Casasnovas */ public abstract class Task implements ITaskFundamentalProperties { @@ -73,6 +74,9 @@ public abstract class Task implements ITaskFundamentalProperties { private PropertyChangeSupport reportedHoursProperty = new PropertyChangeSupport( this); + private PropertyChangeSupport moneyCostBarProperty = new PropertyChangeSupport( + this); + private final ITaskFundamentalProperties fundamentalProperties; private boolean visible = true; @@ -83,10 +87,13 @@ public abstract class Task implements ITaskFundamentalProperties { private boolean showingReportedHours = false; + private boolean showingMoneyCostBar = false; + private ConstraintViolationNotificator violationNotificator = ConstraintViolationNotificator .create(); - private IDependenciesEnforcerHook dependenciesEnforcerHook = GanttDiagramGraph.doNothingHook(); + private IDependenciesEnforcerHook dependenciesEnforcerHook = GanttDiagramGraph + .doNothingHook(); private final INotificationAfterDependenciesEnforcement notifyDates = new INotificationAfterDependenciesEnforcement() { @@ -124,6 +131,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(); @@ -177,6 +248,17 @@ public abstract class Task implements ITaskFundamentalProperties { return showingReportedHours; } + public void setShowingMoneyCostBar(boolean showingMoneyCostBar) { + boolean previousValue = this.showingMoneyCostBar; + this.showingMoneyCostBar = showingMoneyCostBar; + moneyCostBarProperty.firePropertyChange("showingMoneyCostBar", + previousValue, this.showingMoneyCostBar); + } + + public boolean isShowingMoneyCostBar() { + return showingMoneyCostBar; + } + public String getName() { return fundamentalProperties.getName(); } @@ -195,19 +277,8 @@ 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); - } - - public void fireChangesForPreviousValues(GanttDate previousStart, - GanttDate previousEnd) { - dependenciesEnforcerHook.setStartDate(previousStart, previousStart, - fundamentalProperties.getBeginDate()); - dependenciesEnforcerHook.setNewEnd(previousEnd, getEndDate()); + public void enforceDependenciesDueToPositionPotentiallyModified() { + dependenciesEnforcerHook.positionPotentiallyModified(); } public GanttDate getBeginDate() { @@ -244,6 +315,11 @@ public abstract class Task implements ITaskFundamentalProperties { this.reportedHoursProperty.addPropertyChangeListener(listener); } + public void addMoneyCostBarPropertyChangeListener( + PropertyChangeListener listener) { + this.moneyCostBarProperty.addPropertyChangeListener(listener); + } + public void addFundamentalPropertiesChangeListener( PropertyChangeListener listener) { this.fundamentalPropertiesListeners.addPropertyChangeListener(listener); @@ -254,6 +330,11 @@ public abstract class Task implements ITaskFundamentalProperties { .removePropertyChangeListener(listener); } + public void removeVisibilityPropertiesChangeListener( + PropertyChangeListener listener) { + this.visibilityProperties.removePropertyChangeListener(listener); + } + @Override public GanttDate getEndDate() { return fundamentalProperties.getEndDate(); @@ -284,28 +365,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() { @@ -327,6 +397,11 @@ public abstract class Task implements ITaskFundamentalProperties { return fundamentalProperties.getHoursAdvanceEndDate(); } + @Override + public GanttDate getMoneyCostBarEndDate() { + return fundamentalProperties.getMoneyCostBarEndDate(); + } + @Override public GanttDate getAdvanceEndDate() { return fundamentalProperties.getAdvanceEndDate(); @@ -356,13 +431,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(); @@ -451,4 +519,12 @@ public abstract class Task implements ITaskFundamentalProperties { return fundamentalProperties.isManualAnyAllocation(); } + public boolean belongsClosedProject() { + return fundamentalProperties.belongsClosedProject(); + } + + public boolean isRoot() { + return fundamentalProperties.isRoot(); + } + } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/extensions/ContextRelativeToOtherComponent.java b/ganttzk/src/main/java/org/zkoss/ganttz/extensions/ContextRelativeToOtherComponent.java index 14a3be66e..a0fd03996 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/extensions/ContextRelativeToOtherComponent.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/extensions/ContextRelativeToOtherComponent.java @@ -3,7 +3,7 @@ * * 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. + * Copyright (C) 2010-2012 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 @@ -35,7 +35,9 @@ import org.zkoss.zk.ui.Component; /** * An implementation of {@link IContext} that delegates to another context and * redefines its {@link IContext#getRelativeTo()} + * * @author Óscar González Fernández + * @author Manuel Rego Casasnovas */ public class ContextRelativeToOtherComponent implements IContext { @@ -147,4 +149,15 @@ public class ContextRelativeToOtherComponent implements IContext { public void showReportedHours() { context.showReportedHours(); } + + @Override + public void hideMoneyCostBar() { + context.hideMoneyCostBar(); + } + + @Override + public void showMoneyCostBar() { + context.showMoneyCostBar(); + } + } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/extensions/ContextWithPlannerTask.java b/ganttzk/src/main/java/org/zkoss/ganttz/extensions/ContextWithPlannerTask.java index a1ddd3c0d..59b09e8c2 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/extensions/ContextWithPlannerTask.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/extensions/ContextWithPlannerTask.java @@ -3,7 +3,7 @@ * * 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. + * Copyright (C) 2010-2012 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 @@ -36,7 +36,9 @@ import org.zkoss.zk.ui.Component; * An implementation of {@link IContextWithPlannerTask} that wraps another * context and specifies the task to be returned by * {@link IContextWithPlannerTask#getTask()} + * * @author Óscar González Fernández + * @author Manuel Rego Casasnovas */ public class ContextWithPlannerTask implements IContextWithPlannerTask { @@ -149,4 +151,15 @@ public class ContextWithPlannerTask implements IContextWithPlannerTask { public void showReportedHours() { context.showReportedHours(); } + + @Override + public void hideMoneyCostBar() { + context.hideMoneyCostBar(); + } + + @Override + public void showMoneyCostBar() { + context.showMoneyCostBar(); + } + } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/extensions/ICommand.java b/ganttzk/src/main/java/org/zkoss/ganttz/extensions/ICommand.java index 95145a35d..d883748b3 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/extensions/ICommand.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/extensions/ICommand.java @@ -3,7 +3,7 @@ * * 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. + * Copyright (C) 2010-2012 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 @@ -25,7 +25,9 @@ package org.zkoss.ganttz.extensions; /** * An action that can be applied to the planner and it's wanted to be available * to the user
+ * * @author Óscar González Fernández + * @author Manuel Rego Casasnovas */ public interface ICommand { @@ -35,4 +37,6 @@ public interface ICommand { public String getImage(); + boolean isDisabled(); + } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/extensions/IContext.java b/ganttzk/src/main/java/org/zkoss/ganttz/extensions/IContext.java index c5b02d2a6..4465b3a72 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/extensions/IContext.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/extensions/IContext.java @@ -3,7 +3,7 @@ * * 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. + * Copyright (C) 2010-2012 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 @@ -38,7 +38,9 @@ import org.zkoss.zk.ui.Component; /** * A facade for operations allowed to extensions
+ * * @author Óscar González Fernández + * @author Manuel Rego Casasnovas */ public interface IContext { @@ -143,4 +145,9 @@ public interface IContext { void showReportedHours(); void hideReportedHours(); + + void showMoneyCostBar(); + + void hideMoneyCostBar(); + } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/DetailItem.java b/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/DetailItem.java index edae81347..99504b9d4 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/DetailItem.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/DetailItem.java @@ -3,7 +3,7 @@ * * 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. + * Copyright (C) 2010-2012 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 @@ -50,6 +50,9 @@ public final class DetailItem { private boolean currentPeriod; private int currentDayOffset; + private boolean projectStart = false; + private int projectStartOffset = 0; + private boolean deadlinePeriod; private int deadlineOffset; @@ -99,7 +102,19 @@ public final class DetailItem { new DateTime()).getDays()) + (float) 0.5) / ((float) Days .daysBetween(this.startDate, this.endDate).getDays())) * this.size); - this.markCurrentDay(offsetInPx); + // 1px per column side, 1px for right border and 1px own bg-width + this.markCurrentDay(Math.min(this.size - 4, offsetInPx)); + } + } + + public void markProjectStart(DateTime projectStart) { + if (!this.startDate.isAfter(projectStart) + && projectStart.isBefore(endDate)) { + int offsetInPx = Math.round((((float) Days.daysBetween( + this.startDate, projectStart).getDays()) / ((float) Days + .daysBetween(this.startDate, this.endDate).getDays())) + * this.size); + this.markprojectStart(offsetInPx); } } @@ -109,8 +124,8 @@ public final class DetailItem { this.startDate, deadline).getDays()) / ((float) Days .daysBetween(this.startDate, this.endDate).getDays())) * this.size); - // Management of left border case for current line format - this.markDeadlineDay(Math.min(this.size - 1, offsetInPx)); + // 1px per column side, 1px for right border and 1px own bg-width + this.markDeadlineDay(Math.min(this.size - 4, offsetInPx)); } } @@ -144,6 +159,11 @@ public final class DetailItem { this.deadlineOffset = offset; } + public void markprojectStart(int offset) { + this.projectStart = true; + this.projectStartOffset = offset; + } + public boolean isEven() { return even; } @@ -164,6 +184,14 @@ public final class DetailItem { return currentDayOffset; } + public boolean isProjectStart() { + return projectStart; + } + + public int getProjectStartOffset() { + return projectStartOffset; + } + public boolean isDeadlinePeriod() { return deadlinePeriod; } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/util/ReentranceGuard.java b/ganttzk/src/main/java/org/zkoss/ganttz/util/ReentranceGuard.java new file mode 100644 index 000000000..70d1e221c --- /dev/null +++ b/ganttzk/src/main/java/org/zkoss/ganttz/util/ReentranceGuard.java @@ -0,0 +1,65 @@ +/* + * 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 . + */ +package org.zkoss.ganttz.util; + +/** + *

+ * It marks the start and the end part of a potentially reentering execution + * using a {@link ThreadLocal} variable. For example, some method execution can + * eventually be called again. When that methods is called we want to know if + * it's called within the execution of itself or from the outside. I.e., it's + * useful to do different things depending if the execution is already being + * done or entering in it. + *

+ * + *

+ * It can detect if it's already executing or not. If it is, + * {@link IReentranceCases#ifAlreadyInside()} is called, otherwise + * {@link IReentranceCases#ifNewEntrance()} is called. + *

+ * + * @author Óscar González Fernández + */ +public class ReentranceGuard { + + public interface IReentranceCases { + public void ifNewEntrance(); + + public void ifAlreadyInside(); + } + + private final ThreadLocal inside = new ThreadLocal() { + 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); + } + } +} \ No newline at end of file diff --git a/ganttzk/src/main/resources/i18n/es.po b/ganttzk/src/main/resources/i18n/es.po index afffe548f..3573626b7 100644 --- a/ganttzk/src/main/resources/i18n/es.po +++ b/ganttzk/src/main/resources/i18n/es.po @@ -1,33 +1,33 @@ -# Spanish translations for LibrePlan - GanttZK module -# Traducciones al español para LibrePlan - módulo GanttZK +# LibrePlan - GanttZK module. # 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. +# Copyright (C) 2010-2012 Igalia, S.L. # This file is distributed under the same license as the LibrePlan package. -# Diego Pino García , 2009. -# Jacobo Aragunde Pérez , 2009, 2010. -# Manuel Rego Casasnovas , 2010, 2011. # +# Translators: +# Diego Pino García , 2009. +# Jacobo Aragunde Pérez , 2009, 2010. +# Manuel Rego Casasnovas , 2010, 2011, 2012. msgid "" msgstr "" -"Project-Id-Version: 1.2.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-11-10 20:11+0100\n" -"PO-Revision-Date: 2011-11-10 20:18+0100\n" +"Project-Id-Version: 1.2.1\n" +"Report-Msgid-Bugs-To: http://bugs.libreplan.org/\n" +"POT-Creation-Date: 2012-01-13 16:49+0100\n" +"PO-Revision-Date: 2012-01-13 16:00+0000\n" "Last-Translator: Manuel Rego Casasnovas \n" -"Language-Team: Spanish <>\n" -"Language: es\n" +"Language-Team: Español\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" +"Language: es\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 "Borrar" -#: ganttzk/src/main/java/org/zkoss/ganttz/TaskList.java:299 +#: ganttzk/src/main/java/org/zkoss/ganttz/TaskList.java:300 msgid "Add Dependency" msgstr "Añadir dependencia" @@ -39,7 +39,7 @@ msgstr "Trabajador" msgid "Start" msgstr "Inicio" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:629 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:635 msgid "Show reported hours" msgstr "Mostrar horas reportadas" @@ -72,17 +72,17 @@ msgstr "Definir Fin-Fin" msgid "Show/Hide progress" msgstr "Mostrar/Ocultar progreso" -#: 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/data/resourceload/TimeLineRole.java:58 +msgid "Task" +msgstr "Tarea" #: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:89 msgid "by resources" msgstr "por recursos" -#: ganttzk/src/main/java/org/zkoss/ganttz/data/resourceload/TimeLineRole.java:58 -msgid "Task" -msgstr "Tarea" +#: 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/data/resourceload/TimeLineRole.java:64 msgid "Criterion" @@ -104,6 +104,10 @@ msgstr "filtrando por nombre" msgid "See scheduling" msgstr "Ver planificación" +#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:43 +msgid "Show" +msgstr "Mostrar" + #: ganttzk/src/main/resources/web/ganttz/zul/leftTasksTree.zul:30 msgid "End" msgstr "Fin" @@ -124,10 +128,6 @@ msgstr "Ninguno" msgid "Flatten/Unflatten tree" msgstr "Aplanar/Expandir árbol" -#: 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 "Proyecto" @@ -141,7 +141,7 @@ msgstr "Nombre" msgid "Name filter" msgstr "Filtro por nombres" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:609 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:615 msgid "Show progress" msgstr "Mostrar progreso" @@ -173,11 +173,11 @@ msgstr "Mostrar/Ocultar recursos" msgid "Set End-Start" msgstr "Definir Fin-Inicio" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:298 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:297 msgid "decreasing zoom" msgstr "reduciendo zoom" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:590 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:596 msgid "Hide critical path" msgstr "Ocultar camino crítico" @@ -185,7 +185,7 @@ msgstr "Ocultar camino crítico" msgid "Day" msgstr "Día" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:636 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:642 msgid "Hide reported hours" msgstr "Ocultar horas reportadas" @@ -218,7 +218,7 @@ msgstr "Definir Inicio-Inicio" msgid "See resource allocation" msgstr "Ver asignación de recursos" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:281 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:280 msgid "increasing zoom" msgstr "aumentando zoom" @@ -234,10 +234,10 @@ msgstr "Todos" msgid "Refresh" msgstr "Actualizar" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:585 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:591 msgid "Show critical path" msgstr "Mostrar camino crítico" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:614 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:620 msgid "Hide progress" msgstr "Ocultar progreso" diff --git a/ganttzk/src/main/resources/i18n/fr.po b/ganttzk/src/main/resources/i18n/fr.po new file mode 100644 index 000000000..acc323409 --- /dev/null +++ b/ganttzk/src/main/resources/i18n/fr.po @@ -0,0 +1,241 @@ +# LibrePlan - GanttZK module. +# Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e +# Desenvolvemento Tecnolóxico de Galicia +# Copyright (C) 2010-2012 Igalia, S.L. +# This file is distributed under the same license as the LibrePlan package. +# +# Translators: +# Philippe Poumaroux , 2012. +msgid "" +msgstr "" +"Project-Id-Version: 1.2.1\n" +"Report-Msgid-Bugs-To: http://bugs.libreplan.org/\n" +"POT-Creation-Date: 2012-01-13 16:49+0100\n" +"PO-Revision-Date: 2012-01-23 12:36+0000\n" +"Last-Translator: Philippe Poumaroux \n" +"Language-Team: Français\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr\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 "Supprimer" + +#: ganttzk/src/main/java/org/zkoss/ganttz/TaskList.java:300 +msgid "Add Dependency" +msgstr "Ajouter une dépendance" + +#: ganttzk/src/main/java/org/zkoss/ganttz/data/resourceload/TimeLineRole.java:58 +msgid "Worker" +msgstr "Travailleur" + +#: ganttzk/src/main/resources/web/ganttz/zul/leftTasksTree.zul:29 +msgid "Start" +msgstr "Début" + +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:635 +msgid "Show reported hours" +msgstr "Afficher les heures comptabilisées" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:90 +msgid "by criteria" +msgstr "par critère" + +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:85 +msgid "Show/Hide reported hours" +msgstr "Montrer/Cacher les heures comptabilisées" + +#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:35 +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:49 +msgid "Zoom" +msgstr "Zoom" + +#: ganttzk/src/main/java/org/zkoss/ganttz/TabsRegistry.java:121 +msgid "Limiting resources" +msgstr "Ressources bloquantes" + +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:67 +msgid "The specified dependency is not allowed" +msgstr "La dépendance indiquée n'est pas disponible" + +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:254 +msgid "Set End-End" +msgstr "Faire correspondre les achèvements" + +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:78 +msgid "Show/Hide progress" +msgstr "Monter/Cacher l'avancement" + +#: ganttzk/src/main/java/org/zkoss/ganttz/data/resourceload/TimeLineRole.java:58 +msgid "Task" +msgstr "Tâche" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:89 +msgid "by resources" +msgstr "par ressource" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadComponent.java:199 +msgid "available effort: {0}, assigned effort: {1}" +msgstr "investissement disponible: {0}, investissement affecté: {1}" + +#: ganttzk/src/main/java/org/zkoss/ganttz/data/resourceload/TimeLineRole.java:64 +msgid "Criterion" +msgstr "Critère" + +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:44 +msgid "Print" +msgstr "Imprimer" + +#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:71 +msgid "Week" +msgstr "Semaine" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:501 +msgid "filtering by name" +msgstr "Filter par nom" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadLeftPane.java:111 +msgid "See scheduling" +msgstr "Voir la programmation" + +#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:43 +msgid "Show" +msgstr "Montrer" + +#: ganttzk/src/main/resources/web/ganttz/zul/leftTasksTree.zul:30 +msgid "End" +msgstr "Fin" + +#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/TimeTracker.java:243 +msgid "changing zoom" +msgstr "Changer le 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 "Aucun" + +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:71 +msgid "Flatten/Unflatten tree" +msgstr "Déployer/Réduire l'arbre" + +#: ganttzk/src/main/java/org/zkoss/ganttz/data/resourceload/TimeLineRole.java:58 +msgid "Project" +msgstr "Projet" + +#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:67 +#: ganttzk/src/main/resources/web/ganttz/zul/leftTasksTree.zul:28 +msgid "Name" +msgstr "Nom" + +#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:50 +msgid "Name filter" +msgstr "Filtre par nom" + +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:615 +msgid "Show progress" +msgstr "Monter l'avancement" + +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:67 +msgid "Expand/Collapse all" +msgstr "Déplier/Replier tout" + +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:58 +msgid "Show/Hide critical path" +msgstr "Montrer/Cacher le chemin critique" + +#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:32 +msgid "Year" +msgstr "Année" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:150 +msgid "showing criteria" +msgstr "Montrer les critères" + +#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:58 +msgid "Month" +msgstr "Mois" + +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:64 +msgid "Show/Hide resources" +msgstr "Montrer/Cacher les ressources" + +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:246 +msgid "Set End-Start" +msgstr "Ajuster le début sur la fin" + +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:297 +msgid "decreasing zoom" +msgstr "réduire le zoom" + +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:596 +msgid "Hide critical path" +msgstr "Cacher le chemin critique" + +#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:84 +msgid "Day" +msgstr "Jour" + +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:642 +msgid "Hide reported hours" +msgstr "Cacher les heures comptabilisées" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadComponent.java:193 +msgid "Load: {0}%" +msgstr "Charge: {0}%" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:147 +msgid "showing resources" +msgstr "montrer les ressources" + +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:61 +msgid "Show/Hide labels" +msgstr "Montrer/Cacher les libellés" + +#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:97 +msgid "Hour" +msgstr "Heure" + +#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:90 +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:114 +msgid "Graphics" +msgstr "Graphiques" + +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:250 +msgid "Set Start-Start" +msgstr "Ajuster sur le début" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadComponent.java:152 +msgid "See resource allocation" +msgstr "Voir l'allocation des ressources" + +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:280 +msgid "increasing zoom" +msgstr "augmenter le zoom" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:467 +msgid "Show all elements" +msgstr "Montrer tous les éléments" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:466 +msgid "All" +msgstr "Tout" + +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:38 +msgid "Refresh" +msgstr "Rafraîchir" + +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:591 +msgid "Show critical path" +msgstr "Montrer le chemin critique" + +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:620 +msgid "Hide progress" +msgstr "Cacher l'avancement" diff --git a/ganttzk/src/main/resources/i18n/gl.po b/ganttzk/src/main/resources/i18n/gl.po index b284d0d42..1f90df997 100644 --- a/ganttzk/src/main/resources/i18n/gl.po +++ b/ganttzk/src/main/resources/i18n/gl.po @@ -1,33 +1,33 @@ -# Galician translations for LibrePlan - GanttZK module -# Traducciones al español para LibrePlan - módulo GanttZK +# LibrePlan - GanttZK module. # 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. +# Copyright (C) 2010-2012 Igalia, S.L. # This file is distributed under the same license as the LibrePlan package. -# Igalia , 2009. -# Jacobo Aragunde Pérez , 2010. -# Manuel Rego Casasnovas , 2010, 2011. # +# Translators: +# Diego Pino García , 2009. +# Jacobo Aragunde Pérez , 2010. +# Manuel Rego Casasnovas , 2010, 2011, 2012. msgid "" msgstr "" -"Project-Id-Version: 1.2.0\n" -"Report-Msgid-Bugs-To: \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 \n" -"Language-Team: Galician <>\n" -"Language: gl\n" +"Project-Id-Version: 1.2.1\n" +"Report-Msgid-Bugs-To: http://bugs.libreplan.org/\n" +"POT-Creation-Date: 2012-01-13 16:49+0100\n" +"PO-Revision-Date: 2012-01-13 16:01+0000\n" +"Last-Translator: Manuel Rego Casasnovas\n" +"Language-Team: Galego\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" +"Language: gl\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 "Borrar" -#: ganttzk/src/main/java/org/zkoss/ganttz/TaskList.java:299 +#: ganttzk/src/main/java/org/zkoss/ganttz/TaskList.java:300 msgid "Add Dependency" msgstr "Engadir dependencia" @@ -39,7 +39,7 @@ msgstr "Traballador" msgid "Start" msgstr "Inicio" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:629 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:635 msgid "Show reported hours" msgstr "Mostrar horas reportadas" @@ -72,17 +72,17 @@ msgstr "Definir Fin-Fin" msgid "Show/Hide progress" msgstr "Mostrar/Ocultar progreso" -#: 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/data/resourceload/TimeLineRole.java:58 +msgid "Task" +msgstr "Tarefa" #: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:89 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/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/data/resourceload/TimeLineRole.java:64 msgid "Criterion" @@ -104,6 +104,10 @@ msgstr "filtrando por nome" msgid "See scheduling" msgstr "Ver planificación" +#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:43 +msgid "Show" +msgstr "Amosar" + #: ganttzk/src/main/resources/web/ganttz/zul/leftTasksTree.zul:30 msgid "End" msgstr "Fin" @@ -124,10 +128,6 @@ msgstr "Ningún" msgid "Flatten/Unflatten tree" msgstr "Aplanar/Expandir árbore" -#: 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 "Proxecto" @@ -141,7 +141,7 @@ msgstr "Nome" msgid "Name filter" msgstr "Filtro por nomes" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:609 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:615 msgid "Show progress" msgstr "Mostrar progreso" @@ -173,11 +173,11 @@ msgstr "Mostrar/Ocultar recursos" msgid "Set End-Start" msgstr "Definir Fin-Inicio" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:298 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:297 msgid "decreasing zoom" msgstr "reducindo zoom" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:590 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:596 msgid "Hide critical path" msgstr "Ocultar camiño crítico" @@ -185,7 +185,7 @@ msgstr "Ocultar camiño crítico" msgid "Day" msgstr "Día" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:636 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:642 msgid "Hide reported hours" msgstr "Ocultar horas reportadas" @@ -218,7 +218,7 @@ msgstr "Definir Inicio-Inicio" msgid "See resource allocation" msgstr "Ver asignación de recursoss" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:281 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:280 msgid "increasing zoom" msgstr "aumentando zoom" @@ -234,10 +234,10 @@ msgstr "Todos" msgid "Refresh" msgstr "Actualizar" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:585 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:591 msgid "Show critical path" msgstr "Mostrar camiño crítico" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:614 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:620 msgid "Hide progress" msgstr "Ocultar progreso" diff --git a/ganttzk/src/main/resources/i18n/it.po b/ganttzk/src/main/resources/i18n/it.po new file mode 100644 index 000000000..ef0c84cde --- /dev/null +++ b/ganttzk/src/main/resources/i18n/it.po @@ -0,0 +1,241 @@ +# LibrePlan - GanttZK module. +# Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e +# Desenvolvemento Tecnolóxico de Galicia +# Copyright (C) 2010-2012 Igalia, S.L. +# This file is distributed under the same license as the LibrePlan package. +# +# Translators: +# Giuseppe Zizza , 2012. +msgid "" +msgstr "" +"Project-Id-Version: 1.2.1\n" +"Report-Msgid-Bugs-To: http://bugs.libreplan.org/\n" +"POT-Creation-Date: 2012-01-13 16:49+0100\n" +"PO-Revision-Date: 2012-01-13 16:09+0000\n" +"Last-Translator: Giuseppe Zizza \n" +"Language-Team: Italiano\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: it\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 "Cancella" + +#: ganttzk/src/main/java/org/zkoss/ganttz/TaskList.java:300 +msgid "Add Dependency" +msgstr "Aggiungi dipendenza" + +#: ganttzk/src/main/java/org/zkoss/ganttz/data/resourceload/TimeLineRole.java:58 +msgid "Worker" +msgstr "Lavoratore" + +#: ganttzk/src/main/resources/web/ganttz/zul/leftTasksTree.zul:29 +msgid "Start" +msgstr "Inizio" + +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:635 +msgid "Show reported hours" +msgstr "Mostra le ore riportate" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:90 +msgid "by criteria" +msgstr "per criterio" + +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:85 +msgid "Show/Hide reported hours" +msgstr "Mostra/Nascondi le ore riportate" + +#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:35 +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:49 +msgid "Zoom" +msgstr "Visualizza" + +#: ganttzk/src/main/java/org/zkoss/ganttz/TabsRegistry.java:121 +msgid "Limiting resources" +msgstr "Risorse limitanti" + +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:67 +msgid "The specified dependency is not allowed" +msgstr "La dipendenza specifica non è permessa" + +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:254 +msgid "Set End-End" +msgstr "Imposta Fine-Fine" + +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:78 +msgid "Show/Hide progress" +msgstr "Mostra/Nascondi progresso" + +#: ganttzk/src/main/java/org/zkoss/ganttz/data/resourceload/TimeLineRole.java:58 +msgid "Task" +msgstr "Compito" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:89 +msgid "by resources" +msgstr "per risorsa" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadComponent.java:199 +msgid "available effort: {0}, assigned effort: {1}" +msgstr "Forza disponbile: {0}, forza assegnata: {1}" + +#: ganttzk/src/main/java/org/zkoss/ganttz/data/resourceload/TimeLineRole.java:64 +msgid "Criterion" +msgstr "Criterio" + +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:44 +msgid "Print" +msgstr "Stampa" + +#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:71 +msgid "Week" +msgstr "Settimana" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:501 +msgid "filtering by name" +msgstr "filtra per nome" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadLeftPane.java:111 +msgid "See scheduling" +msgstr "Mostra pianificazione" + +#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:43 +msgid "Show" +msgstr "Mostra" + +#: ganttzk/src/main/resources/web/ganttz/zul/leftTasksTree.zul:30 +msgid "End" +msgstr "Fine" + +#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/TimeTracker.java:243 +msgid "changing zoom" +msgstr "Cambio vista" + +#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:45 +msgid "Quarter" +msgstr "Quarto" + +#: ganttzk/src/main/java/org/zkoss/ganttz/data/resourceload/TimeLineRole.java:58 +msgid "None" +msgstr "Nessuno" + +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:71 +msgid "Flatten/Unflatten tree" +msgstr "Appiattisci/Ripristina albero" + +#: ganttzk/src/main/java/org/zkoss/ganttz/data/resourceload/TimeLineRole.java:58 +msgid "Project" +msgstr "Progetto" + +#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:67 +#: 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 "Nome filtro" + +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:615 +msgid "Show progress" +msgstr "Mostra progresso" + +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:67 +msgid "Expand/Collapse all" +msgstr "Espandi/Riduci tutti" + +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:58 +msgid "Show/Hide critical path" +msgstr "Mostra/Nascondi percorso critico" + +#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:32 +msgid "Year" +msgstr "Anno" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:150 +msgid "showing criteria" +msgstr "Mostro i criteri" + +#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:58 +msgid "Month" +msgstr "Mese" + +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:64 +msgid "Show/Hide resources" +msgstr "Mostra/Nascondi risorse" + +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:246 +msgid "Set End-Start" +msgstr "Imposta Fine-Inizio" + +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:297 +msgid "decreasing zoom" +msgstr "Riduco ingrandimento" + +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:596 +msgid "Hide critical path" +msgstr "Nascondi percorso critico" + +#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:84 +msgid "Day" +msgstr "Giorno" + +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:642 +msgid "Hide reported hours" +msgstr "Nascondi ore riportate" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadComponent.java:193 +msgid "Load: {0}%" +msgstr "Carico: {0}%" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:147 +msgid "showing resources" +msgstr "Mostro le risorse" + +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:61 +msgid "Show/Hide labels" +msgstr "Mostra/Nascondi etichette" + +#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:97 +msgid "Hour" +msgstr "Ora" + +#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:90 +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:114 +msgid "Graphics" +msgstr "Grafici" + +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:250 +msgid "Set Start-Start" +msgstr "Imposta Inizio-Inizio" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadComponent.java:152 +msgid "See resource allocation" +msgstr "Mostra allocazione risorse" + +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:280 +msgid "increasing zoom" +msgstr "Aumento l'ingrandimento" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:467 +msgid "Show all elements" +msgstr "Mostra tutti gli elementi" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:466 +msgid "All" +msgstr "Tutti" + +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:38 +msgid "Refresh" +msgstr "Aggiorna" + +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:591 +msgid "Show critical path" +msgstr "Mostra percorso critico" + +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:620 +msgid "Hide progress" +msgstr "Nascondi progresso" diff --git a/ganttzk/src/main/resources/i18n/keys.pot b/ganttzk/src/main/resources/i18n/keys.pot index 9485c0326..f0bff0848 100644 --- a/ganttzk/src/main/resources/i18n/keys.pot +++ b/ganttzk/src/main/resources/i18n/keys.pot @@ -1,18 +1,15 @@ # LibrePlan - GanttZK module. # 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. +# Copyright (C) 2010-2012 Igalia, S.L. # This file is distributed under the same license as the LibrePlan package. -# Diego Pino García , 2009. -# Jacobo Aragunde Pérez , 2009, 2010. -# Manuel Rego Casasnovas , 2010, 2011. # #, fuzzy msgid "" msgstr "" -"Project-Id-Version: 1.2.0\n" +"Project-Id-Version: 1.2.2\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-11-10 20:11+0100\n" +"POT-Creation-Date: 2012-02-24 09:08+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -21,8 +18,8 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:215 -#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:234 +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:216 +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:235 msgid "Erase" msgstr "" @@ -38,7 +35,7 @@ msgstr "" msgid "Start" msgstr "" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:629 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:635 msgid "Show reported hours" msgstr "" @@ -63,7 +60,7 @@ msgstr "" msgid "The specified dependency is not allowed" msgstr "" -#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:254 +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:255 msgid "Set End-End" msgstr "" @@ -71,16 +68,16 @@ msgstr "" msgid "Show/Hide progress" msgstr "" -#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadComponent.java:199 -msgid "available effort: {0}, assigned effort: {1}" +#: ganttzk/src/main/java/org/zkoss/ganttz/data/resourceload/TimeLineRole.java:58 +msgid "Task" msgstr "" #: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:89 msgid "by resources" msgstr "" -#: ganttzk/src/main/java/org/zkoss/ganttz/data/resourceload/TimeLineRole.java:58 -msgid "Task" +#: 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/data/resourceload/TimeLineRole.java:64 @@ -103,6 +100,10 @@ msgstr "" msgid "See scheduling" msgstr "" +#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:43 +msgid "Show" +msgstr "" + #: ganttzk/src/main/resources/web/ganttz/zul/leftTasksTree.zul:30 msgid "End" msgstr "" @@ -123,10 +124,6 @@ msgstr "" msgid "Flatten/Unflatten tree" msgstr "" -#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:43 -msgid "Filter" -msgstr "" - #: ganttzk/src/main/java/org/zkoss/ganttz/data/resourceload/TimeLineRole.java:58 msgid "Project" msgstr "" @@ -140,7 +137,7 @@ msgstr "" msgid "Name filter" msgstr "" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:609 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:615 msgid "Show progress" msgstr "" @@ -168,15 +165,15 @@ msgstr "" msgid "Show/Hide resources" msgstr "" -#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:246 +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:247 msgid "Set End-Start" msgstr "" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:298 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:297 msgid "decreasing zoom" msgstr "" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:590 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:596 msgid "Hide critical path" msgstr "" @@ -184,7 +181,7 @@ msgstr "" msgid "Day" msgstr "" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:636 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:642 msgid "Hide reported hours" msgstr "" @@ -209,7 +206,7 @@ msgstr "" msgid "Graphics" msgstr "" -#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:250 +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:251 msgid "Set Start-Start" msgstr "" @@ -217,7 +214,7 @@ msgstr "" msgid "See resource allocation" msgstr "" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:281 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:280 msgid "increasing zoom" msgstr "" @@ -233,10 +230,10 @@ msgstr "" msgid "Refresh" msgstr "" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:585 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:591 msgid "Show critical path" msgstr "" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:614 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:620 msgid "Hide progress" msgstr "" diff --git a/ganttzk/src/main/resources/i18n/nl.po b/ganttzk/src/main/resources/i18n/nl.po new file mode 100644 index 000000000..339ca61b0 --- /dev/null +++ b/ganttzk/src/main/resources/i18n/nl.po @@ -0,0 +1,241 @@ +# LibrePlan - GanttZK module. +# Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e +# Desenvolvemento Tecnolóxico de Galicia +# Copyright (C) 2010-2012 Igalia, S.L. +# This file is distributed under the same license as the LibrePlan package. +# +# Translators: +# Jeroen Baten , 2012. +msgid "" +msgstr "" +"Project-Id-Version: LibrePlan\n" +"Report-Msgid-Bugs-To: http://bugs.libreplan.org/\n" +"POT-Creation-Date: 2012-02-24 09:08+0100\n" +"PO-Revision-Date: 2012-02-29 19:53+0000\n" +"Last-Translator: Jeroen Baten \n" +"Language-Team: Nederlands\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nl\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:216 +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:235 +msgid "Erase" +msgstr "Verwijder" + +#: ganttzk/src/main/java/org/zkoss/ganttz/TaskList.java:299 +msgid "Add Dependency" +msgstr "Voeg afhankelijkheid toe" + +#: ganttzk/src/main/java/org/zkoss/ganttz/data/resourceload/TimeLineRole.java:58 +msgid "Worker" +msgstr "Werker" + +#: ganttzk/src/main/resources/web/ganttz/zul/leftTasksTree.zul:29 +msgid "Start" +msgstr "Start" + +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:635 +msgid "Show reported hours" +msgstr "Toon gerapporteerde uren" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:90 +msgid "by criteria" +msgstr "op criterium" + +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:85 +msgid "Show/Hide reported hours" +msgstr "Toon/Verberg gerapporteerde uren" + +#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:35 +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:49 +msgid "Zoom" +msgstr "Zoom" + +#: ganttzk/src/main/java/org/zkoss/ganttz/TabsRegistry.java:121 +msgid "Limiting resources" +msgstr "Begrensde resources" + +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:67 +msgid "The specified dependency is not allowed" +msgstr "Die specifieke afhankelijkheid is niet toegestaan" + +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:255 +msgid "Set End-End" +msgstr "Set End-End" + +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:78 +msgid "Show/Hide progress" +msgstr "Toon/Verberg voortgang" + +#: ganttzk/src/main/java/org/zkoss/ganttz/data/resourceload/TimeLineRole.java:58 +msgid "Task" +msgstr "Taak" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:89 +msgid "by resources" +msgstr "per resources" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadComponent.java:199 +msgid "available effort: {0}, assigned effort: {1}" +msgstr "Beschikbare inspanning: {0}, toegewezen inspanning: {1}" + +#: ganttzk/src/main/java/org/zkoss/ganttz/data/resourceload/TimeLineRole.java:64 +msgid "Criterion" +msgstr "Criterium" + +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:44 +msgid "Print" +msgstr "Afdrukken" + +#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:71 +msgid "Week" +msgstr "Week" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:501 +msgid "filtering by name" +msgstr "filteren op naam" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadLeftPane.java:111 +msgid "See scheduling" +msgstr "Zie planning" + +#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:43 +msgid "Show" +msgstr "Toon" + +#: ganttzk/src/main/resources/web/ganttz/zul/leftTasksTree.zul:30 +msgid "End" +msgstr "Einde" + +#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/TimeTracker.java:243 +msgid "changing zoom" +msgstr "wijzig zoom" + +#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:45 +msgid "Quarter" +msgstr "Kwartaal" + +#: ganttzk/src/main/java/org/zkoss/ganttz/data/resourceload/TimeLineRole.java:58 +msgid "None" +msgstr "Geen" + +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:71 +msgid "Flatten/Unflatten tree" +msgstr "Inklappen/Uitklappen boom" + +#: ganttzk/src/main/java/org/zkoss/ganttz/data/resourceload/TimeLineRole.java:58 +msgid "Project" +msgstr "Project" + +#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:67 +#: ganttzk/src/main/resources/web/ganttz/zul/leftTasksTree.zul:28 +msgid "Name" +msgstr "Naam" + +#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:50 +msgid "Name filter" +msgstr "Naam filter " + +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:615 +msgid "Show progress" +msgstr "Toon voortgang" + +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:67 +msgid "Expand/Collapse all" +msgstr "Inklappen/Uitklappen alles" + +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:58 +msgid "Show/Hide critical path" +msgstr "Toon/Verberg kritieke pad" + +#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:32 +msgid "Year" +msgstr "Jaar" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:150 +msgid "showing criteria" +msgstr "tonen criteria" + +#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:58 +msgid "Month" +msgstr "Maand" + +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:64 +msgid "Show/Hide resources" +msgstr "Toon/Verberg resources" + +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:247 +msgid "Set End-Start" +msgstr "Set End-Start" + +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:297 +msgid "decreasing zoom" +msgstr "uitzoomen" + +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:596 +msgid "Hide critical path" +msgstr "Verberg kritieke pad" + +#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:84 +msgid "Day" +msgstr "Dag" + +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:642 +msgid "Hide reported hours" +msgstr "Verberg gerapporteerde uren" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadComponent.java:193 +msgid "Load: {0}%" +msgstr "Belasting: {0}%" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:147 +msgid "showing resources" +msgstr "tonen resources" + +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:61 +msgid "Show/Hide labels" +msgstr "Toon/Verberg labels" + +#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:97 +msgid "Hour" +msgstr "Uur" + +#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:90 +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:114 +msgid "Graphics" +msgstr "Graphics" + +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:251 +msgid "Set Start-Start" +msgstr "Set Start-Start" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadComponent.java:152 +msgid "See resource allocation" +msgstr "Zie resource allocation" + +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:280 +msgid "increasing zoom" +msgstr "Inzoomen" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:467 +msgid "Show all elements" +msgstr "Toon alle elementen" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:466 +msgid "All" +msgstr "Alle" + +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:38 +msgid "Refresh" +msgstr "Ververs" + +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:591 +msgid "Show critical path" +msgstr "Toon kritieke pad" + +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:620 +msgid "Hide progress" +msgstr "Verberg voortgang" diff --git a/ganttzk/src/main/resources/i18n/pt.po b/ganttzk/src/main/resources/i18n/pt.po index 8830b207b..b222b9761 100644 --- a/ganttzk/src/main/resources/i18n/pt.po +++ b/ganttzk/src/main/resources/i18n/pt.po @@ -1,28 +1,32 @@ -# Portuguese translations for LibrePlan - GanttZK module -# Copyright (C) 2011 Helena Grosso -# This file is distributed under the same license as the NavalPlan package. -# Helena Grosso , 2011. +# LibrePlan - GanttZK module. +# Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e +# Desenvolvemento Tecnolóxico de Galicia +# Copyright (C) 2010-2012 Igalia, S.L. +# This file is distributed under the same license as the LibrePlan package. # +# Translators: +# Helena Grosso , 2011. +# Joaquim Rocha , 2012. 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 \n" -"Language-Team: Português <>\n" -"Language: pt\n" +"Project-Id-Version: 1.2.1\n" +"Report-Msgid-Bugs-To: http://bugs.libreplan.org/\n" +"POT-Creation-Date: 2012-01-13 16:49+0100\n" +"PO-Revision-Date: 2012-01-17 18:45+0000\n" +"Last-Translator: Joaquim Rocha \n" +"Language-Team: Português\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" +"Language: pt\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 +#: ganttzk/src/main/java/org/zkoss/ganttz/TaskList.java:300 msgid "Add Dependency" msgstr "Adicionar Dependência" @@ -34,20 +38,20 @@ msgstr "Trabalhador" msgid "Start" msgstr "Início" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:592 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:635 msgid "Show reported hours" msgstr "Mostrar horas registadas" -#: 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 critérios" -#: 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 registadas" #: 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" @@ -55,7 +59,7 @@ msgstr "Zoom" msgid "Limiting resources" msgstr "Recursos restringentes" -#: 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 dependência especificada não está permitida" @@ -63,27 +67,27 @@ msgstr "A dependência especificada não está permitida" msgid "Set End-End" msgstr "Definir Fim-Fim" -#: 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 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/resourceload/ResourcesLoadPanel.java:89 +msgid "by resources" +msgstr "por recursos" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadComponent.java:199 +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/data/resourceload/TimeLineRole.java:64 msgid "Criterion" msgstr "Critério" -#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:41 +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:44 msgid "Print" msgstr "Imprimir" @@ -91,7 +95,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 "a filtrar por nome" @@ -99,14 +103,14 @@ msgstr "a filtrar por nome" msgid "See scheduling" msgstr "Ver planificação" +#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:43 +msgid "Show" +msgstr "Mostrar" + #: 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" @@ -119,19 +123,15 @@ msgstr "Trimestre" msgid "None" msgstr "Nenhum" -#: 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 "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/resourcesLoadLayout.zul:67 #: ganttzk/src/main/resources/web/ganttz/zul/leftTasksTree.zul:28 msgid "Name" msgstr "Nome" @@ -140,27 +140,23 @@ msgstr "Nome" msgid "Name filter" msgstr "Filtro de nomes" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:572 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:615 msgid "Show progress" msgstr "Mostrar progresso" -#: 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/Colapsar tudo" -#: 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 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 +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:150 msgid "showing criteria" msgstr "a mostrar critérios" @@ -168,7 +164,7 @@ msgstr "a mostrar critérios" msgid "Month" msgstr "Mês" -#: 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" @@ -176,11 +172,11 @@ msgstr "Mostrar/Ocultar recursos" msgid "Set End-Start" msgstr "Definir Fim-Início" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:302 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:297 msgid "decreasing zoom" msgstr "a reduzir o zoom" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:559 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:596 msgid "Hide critical path" msgstr "Ocultar caminho crítico" @@ -188,19 +184,19 @@ msgstr "Ocultar caminho crítico" msgid "Day" msgstr "Dia" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:599 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:642 msgid "Hide reported hours" msgstr "Ocultar horas registadas" -#: 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 "Carregamento: {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 "a mostrar 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" @@ -208,8 +204,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áficos" @@ -217,30 +213,30 @@ msgstr "Gráficos" msgid "Set Start-Start" msgstr "Definir Início-Início" -#: 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 atribuição de recursoss" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:285 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:280 msgid "increasing zoom" msgstr "a aumentar o 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 os 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 "Atualizar" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:554 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:591 msgid "Show critical path" msgstr "Mostrar caminho crítico" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:577 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:620 msgid "Hide progress" msgstr "Ocultar progresso" diff --git a/ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul b/ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul index c86c7a858..f3947a669 100644 --- a/ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul +++ b/ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul @@ -3,7 +3,7 @@ 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. + Copyright (C) 2010-2012 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 @@ -86,6 +86,12 @@ planner = self; sclass="planner-command"/> +