taskjuggler 3.6.0 → 3.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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'
|