taskjuggler 3.6.0 → 3.7.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG +51 -0
- data/data/css/tjreport.css +4 -0
- data/data/tjp.vim +21 -15
- data/examples/ProjectTemplate/template.tjp +7 -7
- data/examples/Tutorial/tutorial.tjp +1 -1
- data/lib/taskjuggler/Allocation.rb +1 -1
- data/lib/taskjuggler/AttributeBase.rb +10 -4
- data/lib/taskjuggler/Attributes.rb +2 -2
- data/lib/taskjuggler/BatchProcessor.rb +1 -1
- data/lib/taskjuggler/Interval.rb +10 -12
- data/lib/taskjuggler/Journal.rb +2 -2
- data/lib/taskjuggler/LogicalFunction.rb +1 -1
- data/lib/taskjuggler/LogicalOperation.rb +7 -4
- data/lib/taskjuggler/MessageHandler.rb +1 -1
- data/lib/taskjuggler/PTNProxy.rb +1 -1
- data/lib/taskjuggler/Project.rb +27 -22
- data/lib/taskjuggler/PropertyList.rb +7 -1
- data/lib/taskjuggler/PropertySet.rb +1 -1
- data/lib/taskjuggler/PropertyTreeNode.rb +5 -3
- data/lib/taskjuggler/Query.rb +3 -3
- data/lib/taskjuggler/RealFormat.rb +1 -1
- data/lib/taskjuggler/Resource.rb +2 -2
- data/lib/taskjuggler/ResourceScenario.rb +37 -5
- data/lib/taskjuggler/RichText/Snip.rb +1 -1
- data/lib/taskjuggler/RuntimeConfig.rb +1 -1
- data/lib/taskjuggler/Scoreboard.rb +5 -2
- data/lib/taskjuggler/Shift.rb +2 -2
- data/lib/taskjuggler/ShiftAssignments.rb +1 -1
- data/lib/taskjuggler/TaskJuggler.rb +4 -4
- data/lib/taskjuggler/TextParser.rb +1 -1
- data/lib/taskjuggler/TextParser/Scanner.rb +3 -3
- data/lib/taskjuggler/TimeSheets.rb +2 -2
- data/lib/taskjuggler/Tj3AppBase.rb +23 -9
- data/lib/taskjuggler/Tj3Config.rb +5 -3
- data/lib/taskjuggler/TjpExample.rb +3 -1
- data/lib/taskjuggler/TjpSyntaxRules.rb +157 -130
- data/lib/taskjuggler/UTF8String.rb +3 -3
- data/lib/taskjuggler/WorkingHours.rb +3 -3
- data/lib/taskjuggler/XMLElement.rb +12 -1
- data/lib/taskjuggler/apps/Tj3.rb +3 -1
- data/lib/taskjuggler/apps/Tj3Client.rb +3 -2
- data/lib/taskjuggler/apps/Tj3Daemon.rb +3 -1
- data/lib/taskjuggler/apps/Tj3Man.rb +4 -2
- data/lib/taskjuggler/apps/Tj3SsReceiver.rb +3 -1
- data/lib/taskjuggler/apps/Tj3SsSender.rb +3 -1
- data/lib/taskjuggler/apps/Tj3TsReceiver.rb +3 -1
- data/lib/taskjuggler/apps/Tj3TsSender.rb +3 -1
- data/lib/taskjuggler/apps/Tj3TsSummary.rb +3 -1
- data/lib/taskjuggler/apps/Tj3WebD.rb +3 -1
- data/lib/taskjuggler/deep_copy.rb +1 -1
- data/lib/taskjuggler/reports/CSVFile.rb +3 -3
- data/lib/taskjuggler/reports/ChartPlotter.rb +1 -1
- data/lib/taskjuggler/reports/GanttChart.rb +8 -2
- data/lib/taskjuggler/reports/GanttHeader.rb +11 -1
- data/lib/taskjuggler/reports/GanttLine.rb +6 -0
- data/lib/taskjuggler/reports/ICalReport.rb +1 -1
- data/lib/taskjuggler/reports/Report.rb +1 -1
- data/lib/taskjuggler/reports/ReportTableCell.rb +1 -1
- data/lib/taskjuggler/reports/TableReport.rb +7 -12
- data/lib/taskjuggler/reports/TjpExportRE.rb +1 -5
- data/lib/taskjuggler/version.rb +1 -0
- data/man/tj3.1 +130 -0
- data/man/tj3client.1 +145 -0
- data/man/tj3d.1 +93 -0
- data/man/tj3man.1 +76 -0
- data/man/tj3ss_receiver.1 +86 -0
- data/man/tj3ss_sender.1 +100 -0
- data/man/tj3ts_receiver.1 +86 -0
- data/man/tj3ts_sender.1 +92 -0
- data/man/tj3ts_summary.1 +104 -0
- data/man/tj3webd.1 +86 -0
- data/manual/Day_To_Day_Juggling +8 -8
- data/manual/Installation +6 -6
- data/manual/List_Attributes +1 -1
- data/manual/Rich_Text_Attributes +6 -5
- data/manual/Software +6 -6
- data/manual/TaskJuggler_Internals +4 -4
- data/manual/The_TaskJuggler_Syntax +5 -5
- data/manual/Tutorial +13 -11
- data/manual/html/Day_To_Day_Juggling.html +9 -9
- data/manual/html/Getting_Started.html +2 -2
- data/manual/html/How_To_Contribute.html +2 -2
- data/manual/html/Installation.html +8 -8
- data/manual/html/Intro.html +2 -2
- data/manual/html/List_Attributes.html +3 -3
- data/manual/html/Reporting_Bugs.html +2 -2
- data/manual/html/Rich_Text_Attributes.html +5 -5
- data/manual/html/Software.html +7 -7
- data/manual/html/TaskJuggler_2x_Migration.html +2 -2
- data/manual/html/TaskJuggler_Internals.html +6 -6
- data/manual/html/The_TaskJuggler_Syntax.html +6 -6
- data/manual/html/Tutorial.html +17 -14
- data/manual/html/account.html +4 -4
- data/manual/html/account.task.html +2 -2
- data/manual/html/accountprefix.html +2 -2
- data/manual/html/accountreport.html +4 -4
- data/manual/html/accountroot.html +3 -3
- data/manual/html/active.html +3 -3
- data/manual/html/adopt.task.html +2 -2
- data/manual/html/aggregate.html +2 -2
- data/manual/html/alert.html +3 -3
- data/manual/html/alertlevels.html +2 -2
- data/manual/html/allocate.html +3 -3
- data/manual/html/alphabet.html +1 -1
- data/manual/html/alternative.html +2 -2
- data/manual/html/author.html +2 -2
- data/manual/html/auxdir.html +2 -2
- data/manual/html/auxdir.report.html +3 -3
- data/manual/html/balance.html +3 -3
- data/manual/html/booking.resource.html +4 -4
- data/manual/html/booking.task.html +4 -4
- data/manual/html/caption.html +3 -3
- data/manual/html/cellcolor.column.html +3 -3
- data/manual/html/celltext.column.html +3 -3
- data/manual/html/center.html +3 -3
- data/manual/html/charge.html +2 -2
- data/manual/html/chargeset.html +2 -2
- data/manual/html/columnid.html +17 -13
- data/manual/html/columns.html +3 -3
- data/manual/html/complete.html +2 -2
- data/manual/html/copyright.html +2 -2
- data/manual/html/credits.html +2 -2
- data/manual/html/css/tjreport.css +4 -0
- data/manual/html/currency.html +2 -2
- data/manual/html/currencyformat.html +4 -4
- data/manual/html/dailymax.html +2 -2
- data/manual/html/dailymin.html +3 -3
- data/manual/html/dailyworkinghours.html +2 -2
- data/manual/html/date.extend.html +2 -2
- data/manual/html/date.html +5 -5
- data/manual/html/definitions.html +4 -4
- data/manual/html/depends.html +4 -4
- data/manual/html/details.html +2 -2
- data/manual/html/disabled.html +2 -2
- data/manual/html/duration.html +2 -2
- data/manual/html/efficiency.html +3 -3
- data/manual/html/effort.html +2 -2
- data/manual/html/effortdone.html +2 -2
- data/manual/html/effortleft.html +2 -2
- data/manual/html/email.html +2 -2
- data/manual/html/enabled.html +2 -2
- data/manual/html/end.column.html +3 -3
- data/manual/html/end.html +4 -4
- data/manual/html/end.limit.html +2 -2
- data/manual/html/end.report.html +3 -3
- data/manual/html/end.timesheet.html +3 -3
- data/manual/html/endcredit.html +3 -3
- data/manual/html/epilog.html +3 -3
- data/manual/html/export.html +4 -4
- data/manual/html/extend.html +3 -3
- data/manual/html/fail.html +3 -3
- data/manual/html/fdl.html +2 -2
- data/manual/html/flags.account.html +2 -2
- data/manual/html/flags.html +2 -2
- data/manual/html/flags.journalentry.html +2 -2
- data/manual/html/flags.report.html +3 -3
- data/manual/html/flags.resource.html +2 -2
- data/manual/html/flags.statussheet.html +2 -2
- data/manual/html/flags.task.html +2 -2
- data/manual/html/flags.timesheet.html +2 -2
- data/manual/html/fontcolor.column.html +3 -3
- data/manual/html/footer.html +3 -3
- data/manual/html/formats.export.html +3 -3
- data/manual/html/formats.html +4 -4
- data/manual/html/functions.html +5 -5
- data/manual/html/gapduration.html +2 -2
- data/manual/html/gaplength.html +2 -2
- data/manual/html/halign.center.html +2 -2
- data/manual/html/halign.column.html +3 -3
- data/manual/html/halign.left.html +2 -2
- data/manual/html/halign.right.html +2 -2
- data/manual/html/hasalert.html +2 -2
- data/manual/html/header.html +3 -3
- data/manual/html/headline.html +3 -3
- data/manual/html/height.html +4 -4
- data/manual/html/hideaccount.html +4 -4
- data/manual/html/hidejournalentry.html +3 -3
- data/manual/html/hidereport.html +3 -3
- data/manual/html/hideresource.html +4 -4
- data/manual/html/hidetask.html +4 -4
- data/manual/html/icalreport.html +9 -3
- data/manual/html/include.macro.html +3 -3
- data/manual/html/include.project.html +3 -3
- data/manual/html/include.properties.html +3 -3
- data/manual/html/index.html +1 -1
- data/manual/html/inherit.extend.html +3 -3
- data/manual/html/interval1.html +3 -3
- data/manual/html/interval2.html +3 -3
- data/manual/html/interval3.html +2 -2
- data/manual/html/interval4.html +2 -2
- data/manual/html/isactive.html +2 -2
- data/manual/html/ischildof.html +2 -2
- data/manual/html/isdependencyof.html +2 -2
- data/manual/html/isdutyof.html +2 -2
- data/manual/html/isfeatureof.html +2 -2
- data/manual/html/isleaf.html +2 -2
- data/manual/html/ismilestone.html +2 -2
- data/manual/html/isongoing.html +3 -3
- data/manual/html/isresource.html +2 -2
- data/manual/html/isresponsibilityof.html +2 -2
- data/manual/html/istask.html +2 -2
- data/manual/html/isvalid.html +2 -2
- data/manual/html/journalattributes.html +3 -3
- data/manual/html/journalentry.html +3 -3
- data/manual/html/journalmode.html +4 -4
- data/manual/html/leaveallowance.html +3 -3
- data/manual/html/leaves.html +3 -3
- data/manual/html/left.html +3 -3
- data/manual/html/length.html +3 -3
- data/manual/html/limits.allocate.html +2 -2
- data/manual/html/limits.html +2 -2
- data/manual/html/limits.resource.html +2 -2
- data/manual/html/limits.task.html +2 -2
- data/manual/html/listitem.column.html +3 -3
- data/manual/html/listtype.column.html +2 -2
- data/manual/html/loadunit.html +3 -3
- data/manual/html/logicalexpression.html +4 -4
- data/manual/html/logicalflagexpression.html +4 -4
- data/manual/html/macro.html +4 -4
- data/manual/html/managers.html +2 -2
- data/manual/html/mandatory.html +4 -4
- data/manual/html/markdate.html +69 -0
- data/manual/html/maxend.html +4 -4
- data/manual/html/maximum.html +2 -2
- data/manual/html/maxstart.html +2 -2
- data/manual/html/milestone.html +3 -3
- data/manual/html/minend.html +2 -2
- data/manual/html/minimum.html +2 -2
- data/manual/html/minstart.html +2 -2
- data/manual/html/monthlymax.html +2 -2
- data/manual/html/monthlymin.html +3 -3
- data/manual/html/navbar.html +5 -1
- data/manual/html/navigator.html +2 -2
- data/manual/html/newtask.html +3 -3
- data/manual/html/nikureport.html +2 -2
- data/manual/html/note.task.html +4 -4
- data/manual/html/novevents.html +68 -0
- data/manual/html/now.html +4 -4
- data/manual/html/number.extend.html +2 -2
- data/manual/html/numberformat.html +3 -3
- data/manual/html/onend.html +2 -2
- data/manual/html/onstart.html +2 -2
- data/manual/html/opennodes.html +3 -3
- data/manual/html/outputdir.html +3 -3
- data/manual/html/overtime.booking.html +2 -2
- data/manual/html/period.column.html +2 -2
- data/manual/html/period.limit.html +2 -2
- data/manual/html/period.report.html +3 -3
- data/manual/html/period.task.html +2 -2
- data/manual/html/persistent.html +3 -3
- data/manual/html/precedes.html +5 -5
- data/manual/html/priority.html +4 -4
- data/manual/html/priority.timesheet.html +3 -3
- data/manual/html/project.html +4 -4
- data/manual/html/projectid.html +2 -2
- data/manual/html/projectid.task.html +3 -3
- data/manual/html/projectids.html +2 -2
- data/manual/html/projection.html +2 -2
- data/manual/html/prolog.html +3 -3
- data/manual/html/properties.html +3 -3
- data/manual/html/purge.html +3 -3
- data/manual/html/rate.html +2 -2
- data/manual/html/rate.resource.html +2 -2
- data/manual/html/rawhtmlhead.html +4 -4
- data/manual/html/reference.extend.html +2 -2
- data/manual/html/remaining.html +3 -3
- data/manual/html/replace.html +2 -2
- data/manual/html/reportprefix.html +2 -2
- data/manual/html/resource.html +3 -3
- data/manual/html/resourceattributes.html +2 -2
- data/manual/html/resourceprefix.html +2 -2
- data/manual/html/resourcereport.html +5 -5
- data/manual/html/resourceroot.html +4 -4
- data/manual/html/resources.limit.html +2 -2
- data/manual/html/responsible.html +2 -2
- data/manual/html/richtext.extend.html +2 -2
- data/manual/html/right.html +3 -3
- data/manual/html/rollupaccount.html +4 -4
- data/manual/html/rollupresource.html +4 -4
- data/manual/html/rolluptask.html +4 -4
- data/manual/html/scale.column.html +2 -2
- data/manual/html/scenario.html +3 -3
- data/manual/html/scenario.ical.html +3 -3
- data/manual/html/scenarios.export.html +2 -2
- data/manual/html/scenarios.html +3 -3
- data/manual/html/scenariospecific.extend.html +2 -2
- data/manual/html/scheduled.html +2 -2
- data/manual/html/scheduling.html +6 -6
- data/manual/html/schedulingmode.html +2 -2
- data/manual/html/select.html +4 -4
- data/manual/html/selfcontained.html +3 -3
- data/manual/html/shift.allocate.html +2 -2
- data/manual/html/shift.html +3 -3
- data/manual/html/shift.resource.html +4 -4
- data/manual/html/shift.task.html +2 -2
- data/manual/html/shift.timesheet.html +2 -2
- data/manual/html/shifts.allocate.html +2 -2
- data/manual/html/shifts.resource.html +2 -2
- data/manual/html/shifts.task.html +3 -3
- data/manual/html/shorttimeformat.html +3 -3
- data/manual/html/sloppy.booking.html +2 -2
- data/manual/html/sloppy.projection.html +2 -2
- data/manual/html/sortaccounts.html +3 -3
- data/manual/html/sortjournalentries.html +3 -3
- data/manual/html/sortresources.html +3 -3
- data/manual/html/sorttasks.html +3 -3
- data/manual/html/start.column.html +3 -3
- data/manual/html/start.html +4 -4
- data/manual/html/start.limit.html +2 -2
- data/manual/html/start.report.html +3 -3
- data/manual/html/startcredit.html +3 -3
- data/manual/html/status.statussheet.html +2 -2
- data/manual/html/status.timesheet.html +2 -2
- data/manual/html/statussheet.html +2 -2
- data/manual/html/statussheetreport.html +3 -3
- data/manual/html/strict.projection.html +2 -2
- data/manual/html/summary.html +2 -2
- data/manual/html/supplement.html +2 -2
- data/manual/html/supplement.resource.html +2 -2
- data/manual/html/supplement.task.html +2 -2
- data/manual/html/tagfile.html +3 -3
- data/manual/html/task.html +3 -3
- data/manual/html/task.statussheet.html +3 -3
- data/manual/html/task.timesheet.html +2 -2
- data/manual/html/taskattributes.html +2 -2
- data/manual/html/taskprefix.html +2 -2
- data/manual/html/taskreport.html +5 -5
- data/manual/html/taskroot.export.html +2 -2
- data/manual/html/taskroot.html +3 -3
- data/manual/html/text.extend.html +2 -2
- data/manual/html/textreport.html +5 -5
- data/manual/html/timeformat.html +4 -4
- data/manual/html/timeformat1.html +2 -2
- data/manual/html/timeformat2.html +2 -2
- data/manual/html/timeoff.nikureport.html +2 -2
- data/manual/html/timesheet.html +3 -3
- data/manual/html/timesheetreport.html +3 -3
- data/manual/html/timezone.export.html +2 -2
- data/manual/html/timezone.html +2 -2
- data/manual/html/timezone.report.html +3 -3
- data/manual/html/timezone.shift.html +2 -2
- data/manual/html/timingresolution.html +2 -2
- data/manual/html/title.column.html +2 -2
- data/manual/html/title.html +3 -3
- data/manual/html/toc.html +157 -143
- data/manual/html/tooltip.column.html +3 -3
- data/manual/html/tracereport.html +8 -8
- data/manual/html/trackingscenario.html +3 -3
- data/manual/html/treelevel.html +2 -2
- data/manual/html/vacation.html +2 -2
- data/manual/html/vacation.resource.html +2 -2
- data/manual/html/vacation.shift.html +2 -2
- data/manual/html/warn.html +4 -4
- data/manual/html/weeklymax.html +2 -2
- data/manual/html/weeklymin.html +3 -3
- data/manual/html/weekstartsmonday.html +2 -2
- data/manual/html/weekstartssunday.html +2 -2
- data/manual/html/width.column.html +2 -2
- data/manual/html/width.html +4 -4
- data/manual/html/work.html +3 -3
- data/manual/html/workinghours.project.html +3 -3
- data/manual/html/workinghours.resource.html +2 -2
- data/manual/html/workinghours.shift.html +2 -2
- data/manual/html/yearlyworkingdays.html +2 -2
- data/spec/ProjectBroker_spec.rb +6 -6
- data/spec/StatusSheets_spec.rb +1 -1
- data/spec/TimeSheets_spec.rb +1 -1
- data/taskjuggler.gemspec +7 -7
- data/tasks/changelog.rake +2 -0
- data/tasks/gem.rake +3 -0
- data/tasks/help2man.rake +18 -0
- data/tasks/kate.rake +2 -0
- data/tasks/manual.rake +2 -0
- data/tasks/test.rake +5 -0
- data/tasks/vim.rake +2 -0
- data/test/TestSuite/Export-Reports/refs/AccountReport.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/AdoptedTasks.tjp +0 -2
- data/test/TestSuite/Export-Reports/refs/AlertLevels.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/Allocate-1.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/AutoID.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/AutoMacros.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/Currencyformat.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/CustomAttributes.tjp +0 -2
- data/test/TestSuite/Export-Reports/refs/Depends1.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/Durations.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/Efficiency.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/Gap.tjp +0 -3
- data/test/TestSuite/Export-Reports/refs/Include.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/Journal.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/Macro-1.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/Macro-2.tjp +0 -2
- data/test/TestSuite/Export-Reports/refs/Macro-3.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/Manager.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/Milestone.tjp +0 -2
- data/test/TestSuite/Export-Reports/refs/Numberformat.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/Precedes1.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/Project.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/ProjectIDs.tjp +0 -3
- data/test/TestSuite/Export-Reports/refs/Reports.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/Resource.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/ResourceRoot.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/RollupResource.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/Scenario.tjp +0 -2
- data/test/TestSuite/Export-Reports/refs/Timezone.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/Vacation.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/navigator.tjp +0 -4
- data/test/TestSuite/Export-Reports/refs/template.tjp +0 -6
- data/test/TestSuite/Export-Reports/refs/textreport.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/tutorial.tjp +0 -8
- data/test/TestSuite/Syntax/Correct/Booking.tjp +1 -1
- data/test/TestSuite/Syntax/Correct/Currencyformat.tjp +1 -1
- data/test/TestSuite/Syntax/Correct/tutorial.tjp +5 -0
- data/test/test_ProjectFileScanner.rb +8 -8
- metadata +43 -10
@@ -18,7 +18,7 @@ require 'base64'
|
|
18
18
|
# This is an extension and modification of the standard String class. We do a
|
19
19
|
# lot of UTF-8 character processing in the parser. Ruby 1.8 does not have good
|
20
20
|
# enough UTF-8 support and Ruby 1.9 only handles UTF-8 characters as Strings.
|
21
|
-
# This is very inefficient compared to representing them as
|
21
|
+
# This is very inefficient compared to representing them as Integer objects.
|
22
22
|
# Some of these hacks can be removed once we have switched to 1.9 support
|
23
23
|
# only.
|
24
24
|
class String
|
@@ -58,8 +58,8 @@ class String
|
|
58
58
|
alias old_double_left_angle <<
|
59
59
|
|
60
60
|
# Replacement for the existing << operator that also works for characters
|
61
|
-
# above
|
62
|
-
def <<
|
61
|
+
# above Integer 255 (UTF-8 characters).
|
62
|
+
def <<(obj)
|
63
63
|
if obj.is_a?(String) || (obj < 256)
|
64
64
|
# In this case we can use the built-in concat.
|
65
65
|
concat(obj)
|
@@ -17,7 +17,7 @@ require 'taskjuggler/Scoreboard'
|
|
17
17
|
class TaskJuggler
|
18
18
|
|
19
19
|
# Class to store the working hours for each day of the week. The working hours
|
20
|
-
# are stored as Arrays of
|
20
|
+
# are stored as Arrays of Integer intervals for each day of the week. A day off
|
21
21
|
# is modelled as empty Array for that week day. The start end end times of
|
22
22
|
# each working period are stored as seconds after midnight.
|
23
23
|
class WorkingHours
|
@@ -100,7 +100,7 @@ class TaskJuggler
|
|
100
100
|
|
101
101
|
# Set the working hours for a given week day. +dayOfWeek+ must be 0 for
|
102
102
|
# Sunday, 1 for Monday and so on. +intervals+ must be an Array that
|
103
|
-
# contains an Array with 2
|
103
|
+
# contains an Array with 2 Integers for each working period. Each value
|
104
104
|
# specifies the time of day as minutes after midnight. The first value is
|
105
105
|
# the start time of the interval, the second the end time.
|
106
106
|
def setWorkingHours(dayOfWeek, intervals)
|
@@ -133,7 +133,7 @@ class TaskJuggler
|
|
133
133
|
|
134
134
|
# Return the working hour intervals for a given day of the week.
|
135
135
|
# +dayOfWeek+ must 0 for Sunday, 1 for Monday and so on. The result is an
|
136
|
-
# Array that contains Arrays of 2
|
136
|
+
# Array that contains Arrays of 2 Integers.
|
137
137
|
def getWorkingHours(dayOfWeek)
|
138
138
|
@days[dayOfWeek]
|
139
139
|
end
|
@@ -204,7 +204,18 @@ class TaskJuggler
|
|
204
204
|
end
|
205
205
|
|
206
206
|
def to_s(indent)
|
207
|
-
'<!-- ' + @text + " -->\n#{' ' * indent}"
|
207
|
+
'<!-- ' + canonicalize_comment(@text) + " -->\n#{' ' * indent}"
|
208
|
+
end
|
209
|
+
|
210
|
+
private
|
211
|
+
|
212
|
+
# It is crucial to canonicalize xml comment text because xml
|
213
|
+
# comment syntax forbids having a -- in the comment body. I
|
214
|
+
# picked emacs's "M-x comment-region" approach of putting a
|
215
|
+
# backslash between the two.
|
216
|
+
def canonicalize_comment(text)
|
217
|
+
new_text = text.gsub("--", "-\\-")
|
218
|
+
new_text
|
208
219
|
end
|
209
220
|
|
210
221
|
end
|
data/lib/taskjuggler/apps/Tj3.rb
CHANGED
@@ -68,10 +68,12 @@ class TaskJuggler
|
|
68
68
|
|
69
69
|
def processArguments(argv)
|
70
70
|
super do
|
71
|
-
@opts.banner
|
71
|
+
@opts.banner.prepend(<<'EOT'
|
72
72
|
This is the main application. It reads in your project files, schedules the
|
73
73
|
project and generates the reports.
|
74
|
+
|
74
75
|
EOT
|
76
|
+
)
|
75
77
|
@opts.on('--debuglevel N', Integer,
|
76
78
|
format("Verbosity of debug output")) do |arg|
|
77
79
|
TaskJuggler::Log.level = arg
|
@@ -100,7 +100,7 @@ class TaskJuggler
|
|
100
100
|
|
101
101
|
def processArguments(argv)
|
102
102
|
super do
|
103
|
-
|
103
|
+
prebanner = <<'EOT'
|
104
104
|
The TaskJuggler client is used to send commands and data to the TaskJuggler
|
105
105
|
daemon. The communication is done via TCP/IP.
|
106
106
|
|
@@ -125,9 +125,10 @@ EOT
|
|
125
125
|
end
|
126
126
|
end
|
127
127
|
args = args.join(' ')
|
128
|
-
|
128
|
+
prebanner += " #{cmd[:label] + ' ' + args + tail}" +
|
129
129
|
"\n\n#{' ' * 10 + format(cmd[:descr], 10)}\n"
|
130
130
|
end
|
131
|
+
@opts.banner.prepend(prebanner)
|
131
132
|
@opts.on('-p', '--port <NUMBER>', Integer,
|
132
133
|
format('Use the specified TCP/IP port')) do |arg|
|
133
134
|
@port = arg
|
@@ -42,11 +42,13 @@ class TaskJuggler
|
|
42
42
|
|
43
43
|
def processArguments(argv)
|
44
44
|
super do
|
45
|
-
@opts.banner
|
45
|
+
@opts.banner.prepend(<<'EOT'
|
46
46
|
The TaskJuggler daemon can be used to quickly generate reports for a number
|
47
47
|
of scheduled projects that are resident in memory. Once the daemon has been
|
48
48
|
started tj3client can be used to control it.
|
49
|
+
|
49
50
|
EOT
|
51
|
+
)
|
50
52
|
@opts.on('-d', '--dont-daemonize',
|
51
53
|
format("Don't put program into daemon mode. Keep it " +
|
52
54
|
'connected to the terminal and show debug output.')) do
|
@@ -36,17 +36,19 @@ class TaskJuggler
|
|
36
36
|
|
37
37
|
def processArguments(argv)
|
38
38
|
super do
|
39
|
-
@opts.banner
|
39
|
+
@opts.banner.prepend(<<'EOT'
|
40
40
|
This program can be used to generate the user manual in HTML format or to get
|
41
41
|
a textual help for individual keywords.
|
42
|
+
|
42
43
|
EOT
|
44
|
+
)
|
43
45
|
@opts.on('-d', '--dir <directory>', String,
|
44
46
|
format('directory to put the manual')) do |dir|
|
45
47
|
@directory = dir
|
46
48
|
end
|
47
49
|
@opts.on('--html',
|
48
50
|
format('Show the user manual in your local web browser. ' +
|
49
|
-
'By default, Firefox is used or the
|
51
|
+
'By default, Firefox is used or the browser specified ' +
|
50
52
|
'with the $BROWSER environment variable.')) do
|
51
53
|
@showHtml = true
|
52
54
|
end
|
@@ -27,13 +27,15 @@ class TaskJuggler
|
|
27
27
|
|
28
28
|
def processArguments(argv)
|
29
29
|
super do
|
30
|
-
@opts.banner
|
30
|
+
@opts.banner.prepend(<<'EOT'
|
31
31
|
This program can be used to receive filled-out status sheets via email.
|
32
32
|
It reads the emails from STDIN and extracts the status sheet from the
|
33
33
|
attached files. The status sheet is checked for correctness. Good status
|
34
34
|
sheets are filed away. The sender be informed by email that the status
|
35
35
|
sheets was accepted or rejected.
|
36
|
+
|
36
37
|
EOT
|
38
|
+
)
|
37
39
|
end
|
38
40
|
end
|
39
41
|
|
@@ -38,11 +38,13 @@ class TaskJuggler
|
|
38
38
|
|
39
39
|
def processArguments(argv)
|
40
40
|
super do
|
41
|
-
@opts.banner
|
41
|
+
@opts.banner.prepend(<<'EOT'
|
42
42
|
This program can be used to out status sheets templates via email. It will
|
43
43
|
generate status sheet templates for managers of the project. The project data
|
44
44
|
will be accesses via tj3client from a running TaskJuggler server process.
|
45
|
+
|
45
46
|
EOT
|
47
|
+
)
|
46
48
|
@opts.on('-r', '--resource <ID>', String,
|
47
49
|
format('Only generate template for given resource')) do |arg|
|
48
50
|
@resourceList << arg
|
@@ -30,13 +30,15 @@ class TaskJuggler
|
|
30
30
|
|
31
31
|
def processArguments(argv)
|
32
32
|
super do
|
33
|
-
@opts.banner
|
33
|
+
@opts.banner.prepend(<<'EOT'
|
34
34
|
This program can be used to receive filled-out time sheets via email. It
|
35
35
|
reads the emails from STDIN and extracts the time sheet from the attached
|
36
36
|
files. The time sheet is checked for correctness. Good time sheets are filed
|
37
37
|
away. The sender will be informed by email that the time sheets was accepted
|
38
38
|
or rejected.
|
39
|
+
|
39
40
|
EOT
|
41
|
+
)
|
40
42
|
end
|
41
43
|
end
|
42
44
|
|
@@ -37,11 +37,13 @@ class TaskJuggler
|
|
37
37
|
|
38
38
|
def processArguments(argv)
|
39
39
|
super do
|
40
|
-
@opts.banner
|
40
|
+
@opts.banner.prepend(<<'EOT'
|
41
41
|
This program can be used to send out time sheets templates via email. It will
|
42
42
|
generate time sheet templates for all resources of the project. The project
|
43
43
|
data will be accesses via tj3client from a running TaskJuggler server process.
|
44
|
+
|
44
45
|
EOT
|
46
|
+
)
|
45
47
|
@opts.on('-r', '--resource <ID>', String,
|
46
48
|
format('Only generate template for given resource')) do |arg|
|
47
49
|
@resourceList << arg
|
@@ -36,12 +36,14 @@ class TaskJuggler
|
|
36
36
|
|
37
37
|
def processArguments(argv)
|
38
38
|
super do
|
39
|
-
@opts.banner
|
39
|
+
@opts.banner.prepend(<<'EOT'
|
40
40
|
This program can be used to send out individual copies and a summary of all
|
41
41
|
accepted time sheets a list of email addresses. The directory structures for
|
42
42
|
templates and submitted time sheets must be present. The project data will be
|
43
43
|
accesses via tj3client from a running TaskJuggler server process.
|
44
|
+
|
44
45
|
EOT
|
46
|
+
)
|
45
47
|
@opts.on('-r', '--resource <ID>', String,
|
46
48
|
format('Only generate summary for given resource')) do |arg|
|
47
49
|
@resourceList << arg
|
@@ -40,11 +40,13 @@ class TaskJuggler
|
|
40
40
|
|
41
41
|
def processArguments(argv)
|
42
42
|
super do
|
43
|
-
@opts.banner
|
43
|
+
@opts.banner.prepend(<<'EOT'
|
44
44
|
The TaskJuggler web server can be used to serve the HTTP reports of
|
45
45
|
TaskJuggler projects to be viewed by any HTML5 compliant web browser. It uses
|
46
46
|
the TaskJuggler daemon (tj3d) for data hosting and report generation.
|
47
|
+
|
47
48
|
EOT
|
49
|
+
)
|
48
50
|
@opts.on('-d', '--dont-daemonize',
|
49
51
|
format("Don't put program into daemon mode. Keep it " +
|
50
52
|
'connected to the terminal and show debug output.')) do
|
@@ -37,7 +37,7 @@ class Object
|
|
37
37
|
# We can't clone frozen objects. So just return a reference to them.
|
38
38
|
# Built-in classed can't be cloned either. The check below is probably
|
39
39
|
# cheaper than the frequent (hiddent) exceptions from those objects.
|
40
|
-
return self if frozen? || nil? || is_a?(
|
40
|
+
return self if frozen? || nil? || is_a?(Integer) || is_a?(Float) ||
|
41
41
|
is_a?(TrueClass) || is_a?(FalseClass) || is_a?(Symbol)
|
42
42
|
|
43
43
|
# In case we have loops in our graph, we return references, not
|
@@ -157,7 +157,7 @@ class TaskJuggler
|
|
157
157
|
end
|
158
158
|
when :fieldEnd
|
159
159
|
# We've completed processing a field. Add the field to the list of
|
160
|
-
# fields. Convert
|
160
|
+
# fields. Convert Integers and Floats in native types.
|
161
161
|
fields << unMarshal(field, quoted)
|
162
162
|
|
163
163
|
if c == "\n"
|
@@ -198,7 +198,7 @@ class TaskJuggler
|
|
198
198
|
if str.nil?
|
199
199
|
nil
|
200
200
|
elsif /^[-+]?\d+$/ =~ str
|
201
|
-
# field is
|
201
|
+
# field is an Integer
|
202
202
|
str.to_i
|
203
203
|
elsif /^[-+]?\d*\.?\d+([eE][-+]?\d+)?$/ =~ str
|
204
204
|
# field is a Float
|
@@ -216,7 +216,7 @@ class TaskJuggler
|
|
216
216
|
def marshal(field)
|
217
217
|
if field.nil?
|
218
218
|
''
|
219
|
-
elsif field.is_a?(
|
219
|
+
elsif field.is_a?(Integer) || field.is_a?(Float)
|
220
220
|
# Numbers don't have to be quoted.
|
221
221
|
field.to_s
|
222
222
|
else
|
@@ -163,7 +163,7 @@ class TaskJuggler
|
|
163
163
|
|
164
164
|
@yMinDate = cell if @yMinDate.nil? || cell < @yMinDate
|
165
165
|
@yMaxDate = cell if @yMaxDate.nil? || cell > @yMaxDate
|
166
|
-
elsif cell.is_a?(
|
166
|
+
elsif cell.is_a?(Integer) || cell.is_a?(Float)
|
167
167
|
if @dataType && @dataType != :number
|
168
168
|
error("Column #{colIdx} contains non-number (#{cell}). " +
|
169
169
|
"The columns will be ignored.")
|
@@ -35,7 +35,7 @@ class TaskJuggler
|
|
35
35
|
include HTMLGraphics
|
36
36
|
|
37
37
|
attr_reader :start, :end, :now, :weekStartsMonday, :header, :width,
|
38
|
-
:scale, :scales, :table
|
38
|
+
:scale, :scales, :table, :markdate
|
39
39
|
attr_writer :viewWidth
|
40
40
|
|
41
41
|
# Create the GanttChart object, but don't do much right now. We still need
|
@@ -43,13 +43,14 @@ class TaskJuggler
|
|
43
43
|
# is the date that should be used as current date. _weekStartsMonday_ is
|
44
44
|
# true if the weeks should start on Mondays instead of Sundays. _table_ is a
|
45
45
|
# reference to the TableReport that the chart is part of.
|
46
|
-
def initialize(now, weekStartsMonday, columnDef, table = nil)
|
46
|
+
def initialize(now, weekStartsMonday, columnDef, table = nil, markdate = nil)
|
47
47
|
# The start and end dates of the reported interval.
|
48
48
|
@start = nil
|
49
49
|
@end = nil
|
50
50
|
@now = now
|
51
51
|
@columnDef = columnDef
|
52
52
|
@table = table
|
53
|
+
@markdate = markdate
|
53
54
|
|
54
55
|
# This defines the possible horizontal scales that the Gantt chart can
|
55
56
|
# have. The scales differ in their resolution and the amount of detail
|
@@ -256,6 +257,11 @@ class TaskJuggler
|
|
256
257
|
# Also protect the current date line from other vertical lines.
|
257
258
|
@router.addZone(@header.nowLineX - 1, 0, 3, @height - 1, false, true)
|
258
259
|
|
260
|
+
# Protect the date set in custom reference line from other vertical lines.
|
261
|
+
if @header.markdateLineX
|
262
|
+
@router.addZone(@header.markdateLineX - 1, 0, 3, @height - 1, false, true)
|
263
|
+
end
|
264
|
+
|
259
265
|
# Generate the dependency arrows for all visible tasks.
|
260
266
|
@tasks.each do |task, lines|
|
261
267
|
generateDepLines(task, lines)
|
@@ -21,7 +21,7 @@ class TaskJuggler
|
|
21
21
|
# holds the small scale (e. g. week or day).
|
22
22
|
class GanttHeader
|
23
23
|
|
24
|
-
attr_reader :gridLines, :nowLineX, :cellStartDates
|
24
|
+
attr_reader :gridLines, :nowLineX, :cellStartDates, :markdateLineX
|
25
25
|
attr_accessor :height
|
26
26
|
|
27
27
|
# Create a GanttHeader object and generate the scales for the header.
|
@@ -39,6 +39,10 @@ class TaskJuggler
|
|
39
39
|
# X coordinate of the "now" line. nil if "now" is off-chart.
|
40
40
|
@nowLineX = nil
|
41
41
|
|
42
|
+
# X coordinate of the custom "markdate" line with date specified by user.
|
43
|
+
# nil if "markdate" is off-chart.
|
44
|
+
@markdateLineX = nil
|
45
|
+
|
42
46
|
# The x coordinates and width of the cells created by the small scale. The
|
43
47
|
# values are stored as [ x, w ].
|
44
48
|
@cellStartDates = []
|
@@ -103,6 +107,12 @@ class TaskJuggler
|
|
103
107
|
|
104
108
|
nlx = @chart.dateToX(@chart.now)
|
105
109
|
@nowLineX = nlx if nlx
|
110
|
+
|
111
|
+
if @chart.markdate
|
112
|
+
flx = @chart.dateToX(@chart.markdate)
|
113
|
+
@markdateLineX = flx if flx
|
114
|
+
end
|
115
|
+
|
106
116
|
end
|
107
117
|
|
108
118
|
# Generate the actual scale cells.
|
@@ -49,6 +49,7 @@ class TaskJuggler
|
|
49
49
|
@y = y + chart.header.height + 1
|
50
50
|
# The height of the line in screen pixels.
|
51
51
|
@height = height
|
52
|
+
|
52
53
|
# The index of the line in the chart. It starts with 0 and is
|
53
54
|
# incremented for each line by one.
|
54
55
|
@lineIndex = lineIndex
|
@@ -95,6 +96,11 @@ class TaskJuggler
|
|
95
96
|
div << rectToHTML(@chart.header.nowLineX, 0, 1, @height, 'nowline')
|
96
97
|
end
|
97
98
|
|
99
|
+
# Render the 'markdate' line
|
100
|
+
if @chart.header.markdateLineX
|
101
|
+
div << rectToHTML(@chart.header.markdateLineX, 0, 1, @height, 'markdateline')
|
102
|
+
end
|
103
|
+
|
98
104
|
div
|
99
105
|
end
|
100
106
|
|
@@ -96,7 +96,7 @@ class TaskJuggler
|
|
96
96
|
|
97
97
|
# Generate an additional VEVENT entry for all leaf tasks that aren't
|
98
98
|
# milestones.
|
99
|
-
if task.leaf? && !task['milestone', scenarioIdx]
|
99
|
+
if task.leaf? && !task['milestone', scenarioIdx] && @report.get('novevents') == [false]
|
100
100
|
event = ICalendar::Event.new(
|
101
101
|
@ical, "#{task['projectid', scenarioIdx]}-#{task.fullId}",
|
102
102
|
task.name, task['start', scenarioIdx], task['end', scenarioIdx])
|
@@ -297,7 +297,7 @@ EOT
|
|
297
297
|
if @name == '.'
|
298
298
|
$stdout.write(@content.to_tjp)
|
299
299
|
else
|
300
|
-
fileName =
|
300
|
+
fileName = @name
|
301
301
|
fileName += a('definitions').include?('project') ? '.tjp' : '.tji'
|
302
302
|
File.open(fileName, 'w') { |f| f.write(@content.to_tjp) }
|
303
303
|
end
|
@@ -60,7 +60,7 @@ class TaskJuggler
|
|
60
60
|
@alignment = :center
|
61
61
|
# Horizontal padding between frame and cell content
|
62
62
|
@padding = 3
|
63
|
-
# Whether or not to indent the cell. If not nil, it is
|
63
|
+
# Whether or not to indent the cell. If not nil, it is an Integer
|
64
64
|
# indicating the indentation level.
|
65
65
|
@indent = nil
|
66
66
|
# The basename of the icon file
|
@@ -32,6 +32,7 @@ class TaskJuggler
|
|
32
32
|
'activetasks' => [ 'Active Tasks', true, :right, true ],
|
33
33
|
'annualleave' => [ 'Annual Leave', true, :right, true ],
|
34
34
|
'annualleavebalance'=> [ 'Annual Leave Balance', false, :right, true ],
|
35
|
+
'annualleavelist' => [ 'Annual Leave List', false, :left, true ],
|
35
36
|
'alert' => [ 'Alert', true, :left, false ],
|
36
37
|
'alertmessages' => [ 'Alert Messages', false, :left, false ],
|
37
38
|
'alertsummaries' => [ 'Alert Summaries', false, :left, false ],
|
@@ -79,7 +80,7 @@ class TaskJuggler
|
|
79
80
|
@@propertiesByType = {
|
80
81
|
# Type Indent Align
|
81
82
|
DateAttribute => [ false, :left ],
|
82
|
-
|
83
|
+
IntegerAttribute => [ false, :right ],
|
83
84
|
FloatAttribute => [ false, :right ],
|
84
85
|
ResourceListAttribute => [ false, :left ],
|
85
86
|
RichTextAttribute => [ false, :left ],
|
@@ -338,9 +339,9 @@ class TaskJuggler
|
|
338
339
|
when 'chart'
|
339
340
|
# For the 'chart' column we generate a GanttChart object. The sizes are
|
340
341
|
# set so that the lines of the Gantt chart line up with the lines of the
|
341
|
-
# table
|
342
|
+
# table
|
342
343
|
gantt = GanttChart.new(a('now'),
|
343
|
-
a('weekStartsMonday'), columnDef, self)
|
344
|
+
a('weekStartsMonday'), columnDef, self, a('markdate'))
|
344
345
|
|
345
346
|
gantt.generateByScale(rStart, rEnd, columnDef.scale)
|
346
347
|
# The header consists of 2 lines separated by a 1 pixel boundary.
|
@@ -867,12 +868,6 @@ class TaskJuggler
|
|
867
868
|
# the next cell.
|
868
869
|
def genCalChartTaskCell(query, line, columnDef, t, sameTimeNextFunc)
|
869
870
|
task = line.property
|
870
|
-
# Find out if we have an enclosing resource scope.
|
871
|
-
if line.scopeLine && line.scopeLine.property.is_a?(Resource)
|
872
|
-
resource = line.scopeLine.property
|
873
|
-
else
|
874
|
-
resource = nil
|
875
|
-
end
|
876
871
|
|
877
872
|
# Get the interval of the task. In case a date is invalid due to a
|
878
873
|
# scheduling problem, we use the full project interval.
|
@@ -1048,11 +1043,11 @@ class TaskJuggler
|
|
1048
1043
|
'busy'
|
1049
1044
|
elsif workLoad > 0.0 && freeLoad > 0.0
|
1050
1045
|
'loaded'
|
1051
|
-
elsif workLoad == 0.0 && freeLoad
|
1052
|
-
'free'
|
1053
|
-
else
|
1046
|
+
elsif workLoad == 0.0 && freeLoad == 0.0
|
1054
1047
|
cell.tooltip = nil
|
1055
1048
|
'offduty'
|
1049
|
+
else
|
1050
|
+
'free'
|
1056
1051
|
end
|
1057
1052
|
end
|
1058
1053
|
cell.category += line.subLineNo % 2 == 1 ? '1' : '2'
|