taskjuggler 3.1.0 → 3.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +44 -0
- data/bin/tj3webd +4 -0
- data/data/css/tjreport.css +14 -5
- data/data/tjp.vim +22 -7
- data/examples/Fedora-20/reports.tji +2 -4
- data/examples/Scrum/Product Burndown.csv +26 -0
- data/examples/Scrum/Sprint 1 Burndown.csv +26 -0
- data/examples/Scrum/Sprint 2 Burndown.csv +26 -0
- data/examples/Scrum/Sprint 3 Burndown.csv +26 -0
- data/examples/Scrum/scrum.tjp +141 -0
- data/examples/Tutorial/tutorial.tjp +13 -7
- data/lib/taskjuggler/Attributes.rb +2 -3
- data/lib/taskjuggler/HTMLDocument.rb +25 -18
- data/lib/taskjuggler/Journal.rb +85 -65
- data/lib/taskjuggler/KeywordDocumentation.rb +25 -13
- data/lib/taskjuggler/LeaveList.rb +1 -1
- data/lib/taskjuggler/Limits.rb +3 -5
- data/lib/taskjuggler/MessageHandler.rb +173 -19
- data/lib/taskjuggler/Painter.rb +75 -0
- data/lib/taskjuggler/Painter/BasicShapes.rb +76 -0
- data/lib/taskjuggler/Painter/Color.rb +273 -0
- data/lib/taskjuggler/Painter/Element.rb +56 -0
- data/lib/taskjuggler/Painter/FontData.rb +221 -0
- data/lib/taskjuggler/Painter/FontMetrics.rb +125 -0
- data/lib/taskjuggler/Painter/FontMetricsData.rb +151 -0
- data/lib/taskjuggler/Painter/Group.rb +77 -0
- data/lib/taskjuggler/Painter/Points.rb +47 -0
- data/lib/taskjuggler/Painter/Primitives.rb +100 -0
- data/lib/taskjuggler/Painter/SVGSupport.rb +36 -0
- data/lib/taskjuggler/Painter/Text.rb +36 -0
- data/lib/taskjuggler/Project.rb +46 -29
- data/lib/taskjuggler/ProjectFileParser.rb +24 -22
- data/lib/taskjuggler/ProjectFileScanner.rb +2 -2
- data/lib/taskjuggler/PropertyTreeNode.rb +26 -34
- data/lib/taskjuggler/Query.rb +8 -5
- data/lib/taskjuggler/RealFormat.rb +3 -0
- data/lib/taskjuggler/Resource.rb +3 -5
- data/lib/taskjuggler/ResourceScenario.rb +19 -7
- data/lib/taskjuggler/RichText.rb +4 -6
- data/lib/taskjuggler/RichText/FunctionExample.rb +1 -1
- data/lib/taskjuggler/RichText/FunctionHandler.rb +5 -6
- data/lib/taskjuggler/RichText/Parser.rb +4 -6
- data/lib/taskjuggler/RichText/RTFNavigator.rb +1 -1
- data/lib/taskjuggler/RichText/RTFQuery.rb +2 -3
- data/lib/taskjuggler/RichText/RTFReport.rb +1 -1
- data/lib/taskjuggler/RichText/RTFReportLink.rb +1 -2
- data/lib/taskjuggler/RichText/RTFWithQuerySupport.rb +1 -1
- data/lib/taskjuggler/RichText/Scanner.rb +6 -6
- data/lib/taskjuggler/RichText/Snip.rb +1 -2
- data/lib/taskjuggler/RuntimeConfig.rb +9 -6
- data/lib/taskjuggler/ScenarioData.rb +4 -3
- data/lib/taskjuggler/Scoreboard.rb +6 -0
- data/lib/taskjuggler/SheetHandlerBase.rb +25 -8
- data/lib/taskjuggler/SimpleQueryExpander.rb +14 -5
- data/lib/taskjuggler/SyntaxReference.rb +1 -2
- data/lib/taskjuggler/TableColumnSorter.rb +84 -0
- data/lib/taskjuggler/Task.rb +3 -5
- data/lib/taskjuggler/TaskJuggler.rb +36 -29
- data/lib/taskjuggler/TaskScenario.rb +154 -66
- data/lib/taskjuggler/TextParser.rb +24 -17
- data/lib/taskjuggler/TextParser/Scanner.rb +16 -11
- data/lib/taskjuggler/TextParser/SourceFileInfo.rb +20 -15
- data/lib/taskjuggler/TimeSheets.rb +6 -12
- data/lib/taskjuggler/Tj3AppBase.rb +35 -16
- data/lib/taskjuggler/Tj3Config.rb +1 -1
- data/lib/taskjuggler/TjpSyntaxRules.rb +239 -49
- data/lib/taskjuggler/XMLElement.rb +9 -2
- data/lib/taskjuggler/apps/Tj3.rb +43 -37
- data/lib/taskjuggler/apps/Tj3Client.rb +62 -112
- data/lib/taskjuggler/apps/Tj3Daemon.rb +66 -29
- data/lib/taskjuggler/apps/Tj3Man.rb +5 -5
- data/lib/taskjuggler/apps/Tj3SsReceiver.rb +10 -13
- data/lib/taskjuggler/apps/Tj3SsSender.rb +13 -16
- data/lib/taskjuggler/apps/Tj3TsReceiver.rb +10 -13
- data/lib/taskjuggler/apps/Tj3TsSender.rb +12 -15
- data/lib/taskjuggler/apps/Tj3TsSummary.rb +12 -15
- data/lib/taskjuggler/apps/Tj3WebD.rb +99 -0
- data/lib/taskjuggler/daemon/Daemon.rb +50 -10
- data/lib/taskjuggler/daemon/DaemonConnector.rb +127 -0
- data/lib/taskjuggler/daemon/ProcessIntercom.rb +36 -21
- data/lib/taskjuggler/daemon/ProjectBroker.rb +122 -112
- data/lib/taskjuggler/daemon/ProjectServer.rb +78 -46
- data/lib/taskjuggler/daemon/ReportServer.rb +52 -28
- data/lib/taskjuggler/daemon/ReportServlet.rb +92 -21
- data/lib/taskjuggler/daemon/WebServer.rb +75 -22
- data/lib/taskjuggler/daemon/WelcomePage.rb +1 -0
- data/lib/taskjuggler/reports/AccountListRE.rb +3 -3
- data/lib/taskjuggler/reports/CSVFile.rb +9 -2
- data/lib/taskjuggler/reports/ChartPlotter.rb +453 -0
- data/lib/taskjuggler/reports/Navigator.rb +1 -0
- data/lib/taskjuggler/reports/NikuReport.rb +4 -4
- data/lib/taskjuggler/reports/Report.rb +6 -18
- data/lib/taskjuggler/reports/ReportBase.rb +9 -9
- data/lib/taskjuggler/reports/ReportContext.rb +2 -2
- data/lib/taskjuggler/reports/StatusSheetReport.rb +6 -6
- data/lib/taskjuggler/reports/TableReport.rb +24 -15
- data/lib/taskjuggler/reports/TimeSheetReport.rb +5 -5
- data/lib/taskjuggler/reports/TraceReport.rb +251 -0
- data/lib/tj3webd.rb +17 -0
- data/manual/Day_To_Day_Juggling +10 -3
- data/manual/Installation +38 -19
- data/manual/Software +25 -19
- data/manual/Tutorial +119 -110
- data/manual/html/Day_To_Day_Juggling.html +7 -5
- data/manual/html/Getting_Started.html +4 -4
- data/manual/html/How_To_Contribute.html +4 -4
- data/manual/html/Installation.html +19 -11
- data/manual/html/Intro.html +4 -4
- data/manual/html/Reporting_Bugs.html +4 -4
- data/manual/html/Rich_Text_Attributes.html +4 -4
- data/manual/html/Software.html +15 -11
- data/manual/html/TaskJuggler_2x_Migration.html +4 -4
- data/manual/html/TaskJuggler_Internals.html +4 -4
- data/manual/html/The_TaskJuggler_Syntax.html +4 -4
- data/manual/html/Tutorial.html +41 -32
- data/manual/html/account.html +4 -4
- data/manual/html/account.task.html +4 -4
- data/manual/html/accountprefix.html +4 -4
- data/manual/html/accountreport.html +27 -9
- data/manual/html/accountroot.html +5 -5
- data/manual/html/active.html +4 -4
- data/manual/html/adopt.task.html +4 -4
- data/manual/html/aggregate.html +4 -4
- data/manual/html/alert.html +4 -4
- data/manual/html/alertlevels.html +4 -4
- data/manual/html/allocate.html +5 -5
- data/manual/html/alphabet.html +4 -4
- data/manual/html/alternative.html +4 -4
- data/manual/html/author.html +4 -4
- data/manual/html/balance.html +5 -5
- data/manual/html/booking.resource.html +4 -4
- data/manual/html/booking.task.html +4 -4
- data/manual/html/caption.html +5 -5
- data/manual/html/cellcolor.column.html +43 -8
- data/manual/html/celltext.column.html +4 -4
- data/manual/html/center.html +5 -5
- data/manual/html/charge.html +4 -4
- data/manual/html/chargeset.html +4 -4
- data/manual/html/columnid.html +27 -15
- data/manual/html/columns.html +5 -5
- data/manual/html/complete.html +4 -4
- data/manual/html/copyright.html +4 -4
- data/manual/html/credits.html +4 -4
- data/manual/html/css/tjreport.css +14 -5
- data/manual/html/currency.html +4 -4
- data/manual/html/currencyformat.html +5 -5
- data/manual/html/dailymax.html +5 -5
- data/manual/html/dailymin.html +5 -5
- data/manual/html/dailyworkinghours.html +4 -4
- data/manual/html/date.extend.html +4 -4
- 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 +4 -4
- data/manual/html/disabled.html +4 -4
- data/manual/html/duration.html +4 -4
- data/manual/html/efficiency.html +4 -4
- data/manual/html/effort.html +4 -4
- data/manual/html/email.html +4 -4
- data/manual/html/enabled.html +4 -4
- data/manual/html/end.column.html +4 -4
- data/manual/html/end.html +4 -4
- data/manual/html/end.limit.html +4 -4
- data/manual/html/end.report.html +5 -5
- data/manual/html/end.timesheet.html +4 -4
- data/manual/html/endcredit.html +4 -4
- data/manual/html/epilog.html +5 -5
- data/manual/html/export.html +4 -4
- data/manual/html/extend.html +4 -4
- data/manual/html/fail.html +43 -8
- data/manual/html/fdl.html +4 -4
- data/manual/html/flags.account.html +4 -4
- data/manual/html/flags.html +4 -4
- data/manual/html/flags.journalentry.html +4 -4
- data/manual/html/flags.report.html +5 -5
- data/manual/html/flags.resource.html +4 -4
- data/manual/html/flags.statussheet.html +4 -4
- data/manual/html/flags.task.html +4 -4
- data/manual/html/flags.timesheet.html +4 -4
- data/manual/html/fontcolor.column.html +43 -8
- data/manual/html/footer.html +5 -5
- data/manual/html/formats.html +5 -5
- data/manual/html/functions.html +4 -4
- data/manual/html/gapduration.html +4 -4
- data/manual/html/gaplength.html +4 -4
- data/manual/html/halign.center.html +4 -4
- data/manual/html/halign.column.html +43 -8
- data/manual/html/halign.left.html +4 -4
- data/manual/html/halign.right.html +4 -4
- data/manual/html/hasalert.html +4 -4
- data/manual/html/header.html +5 -5
- data/manual/html/headline.html +7 -7
- data/manual/html/height.html +72 -0
- data/manual/html/hideaccount.html +46 -11
- data/manual/html/hidejournalentry.html +5 -5
- data/manual/html/hidereport.html +43 -8
- data/manual/html/hideresource.html +44 -9
- data/manual/html/hidetask.html +44 -9
- data/manual/html/icalreport.html +4 -4
- data/manual/html/include.macro.html +4 -4
- data/manual/html/include.project.html +4 -4
- data/manual/html/include.properties.html +4 -4
- data/manual/html/index.html +2 -1
- data/manual/html/inherit.extend.html +4 -4
- data/manual/html/interval1.html +4 -4
- data/manual/html/interval2.html +4 -4
- data/manual/html/interval3.html +4 -4
- data/manual/html/interval4.html +4 -4
- data/manual/html/isactive.html +4 -4
- data/manual/html/ischildof.html +4 -4
- data/manual/html/isdependencyof.html +4 -4
- data/manual/html/isdutyof.html +4 -4
- data/manual/html/isfeatureof.html +4 -4
- data/manual/html/isleaf.html +4 -4
- data/manual/html/ismilestone.html +4 -4
- data/manual/html/isongoing.html +4 -4
- data/manual/html/isresource.html +4 -4
- data/manual/html/isresponsibilityof.html +4 -4
- data/manual/html/istask.html +4 -4
- data/manual/html/journalattributes.html +11 -7
- data/manual/html/journalentry.html +4 -4
- data/manual/html/journalmode.html +5 -5
- data/manual/html/leaveallowance.html +5 -5
- data/manual/html/leaves.html +5 -6
- data/manual/html/left.html +5 -5
- data/manual/html/length.html +4 -4
- data/manual/html/limits.allocate.html +4 -4
- data/manual/html/limits.html +4 -4
- data/manual/html/limits.resource.html +4 -4
- data/manual/html/limits.task.html +4 -4
- data/manual/html/listitem.column.html +4 -4
- data/manual/html/listtype.column.html +4 -4
- data/manual/html/loadunit.html +5 -5
- data/manual/html/logicalexpression.html +8 -44
- data/manual/html/logicalflagexpression.html +4 -4
- data/manual/html/macro.html +4 -4
- data/manual/html/managers.html +4 -4
- data/manual/html/mandatory.html +4 -4
- data/manual/html/maxend.html +4 -4
- data/manual/html/maximum.html +5 -5
- data/manual/html/maxstart.html +4 -4
- data/manual/html/milestone.html +4 -4
- data/manual/html/minend.html +4 -4
- data/manual/html/minimum.html +5 -5
- data/manual/html/minstart.html +4 -4
- data/manual/html/monthlymax.html +5 -5
- data/manual/html/monthlymin.html +5 -5
- data/manual/html/navbar.html +10 -4
- data/manual/html/navigator.html +4 -4
- data/manual/html/newtask.html +4 -4
- data/manual/html/nikureport.html +4 -4
- data/manual/html/note.task.html +4 -4
- data/manual/html/now.html +4 -4
- data/manual/html/numberformat.html +5 -5
- data/manual/html/onend.html +4 -4
- data/manual/html/onstart.html +4 -4
- data/manual/html/opennodes.html +5 -5
- data/manual/html/overtime.booking.html +4 -4
- data/manual/html/period.column.html +4 -4
- data/manual/html/period.limit.html +4 -4
- data/manual/html/period.report.html +5 -5
- data/manual/html/period.task.html +4 -4
- data/manual/html/persistent.html +4 -4
- data/manual/html/precedes.html +4 -4
- data/manual/html/priority.html +4 -4
- data/manual/html/priority.timesheet.html +4 -4
- data/manual/html/project.html +4 -4
- data/manual/html/projectid.html +4 -4
- data/manual/html/projectid.task.html +4 -4
- data/manual/html/projectids.html +4 -4
- data/manual/html/projection.html +5 -7
- data/manual/html/prolog.html +5 -5
- data/manual/html/properties.html +11 -5
- data/manual/html/purge.html +5 -5
- data/manual/html/rate.html +4 -4
- data/manual/html/rate.resource.html +4 -4
- data/manual/html/reference.extend.html +4 -4
- data/manual/html/remaining.html +4 -4
- data/manual/html/replace.html +4 -4
- data/manual/html/reportprefix.html +4 -4
- data/manual/html/resource.html +4 -10
- data/manual/html/resourceattributes.html +4 -4
- data/manual/html/resourceprefix.html +4 -4
- data/manual/html/resourcereport.html +28 -10
- data/manual/html/resourceroot.html +5 -5
- data/manual/html/resources.limit.html +4 -4
- data/manual/html/responsible.html +4 -4
- data/manual/html/richtext.extend.html +4 -4
- data/manual/html/right.html +5 -5
- data/manual/html/rollupaccount.html +44 -9
- data/manual/html/rollupresource.html +44 -9
- data/manual/html/rolluptask.html +44 -9
- data/manual/html/scale.column.html +4 -4
- data/manual/html/scenario.html +4 -22
- data/manual/html/scenario.ical.html +4 -4
- data/manual/html/scenarios.export.html +4 -4
- data/manual/html/scenarios.html +5 -5
- data/manual/html/scenariospecific.extend.html +4 -4
- data/manual/html/scheduled.html +4 -4
- data/manual/html/scheduling.html +4 -4
- data/manual/html/select.html +4 -4
- data/manual/html/selfcontained.html +5 -5
- data/manual/html/shift.allocate.html +4 -4
- data/manual/html/shift.html +4 -4
- data/manual/html/shift.resource.html +5 -5
- data/manual/html/shift.task.html +4 -4
- data/manual/html/shift.timesheet.html +4 -4
- data/manual/html/shifts.allocate.html +4 -4
- data/manual/html/shifts.resource.html +4 -4
- data/manual/html/shifts.task.html +4 -4
- data/manual/html/shorttimeformat.html +4 -4
- data/manual/html/sloppy.booking.html +4 -4
- data/manual/html/sloppy.projection.html +5 -5
- data/manual/html/sortaccounts.html +5 -5
- data/manual/html/sortjournalentries.html +5 -5
- data/manual/html/sortresources.html +5 -5
- data/manual/html/sorttasks.html +5 -5
- data/manual/html/start.column.html +4 -4
- data/manual/html/start.html +4 -4
- data/manual/html/start.limit.html +4 -4
- data/manual/html/start.report.html +5 -5
- data/manual/html/startcredit.html +4 -4
- data/manual/html/status.statussheet.html +4 -4
- data/manual/html/status.timesheet.html +4 -4
- data/manual/html/statussheet.html +4 -4
- data/manual/html/statussheetreport.html +4 -4
- data/manual/html/strict.projection.html +5 -5
- data/manual/html/summary.html +4 -4
- data/manual/html/supplement.html +4 -4
- data/manual/html/supplement.resource.html +4 -10
- data/manual/html/supplement.task.html +4 -28
- data/manual/html/tagfile.html +4 -4
- data/manual/html/task.html +4 -28
- data/manual/html/task.statussheet.html +4 -4
- data/manual/html/task.timesheet.html +4 -4
- data/manual/html/taskattributes.html +4 -4
- data/manual/html/taskprefix.html +4 -4
- data/manual/html/taskreport.html +28 -10
- data/manual/html/taskroot.html +5 -5
- data/manual/html/text.extend.html +4 -4
- data/manual/html/textreport.html +27 -9
- data/manual/html/timeformat.html +5 -5
- data/manual/html/timeoff.nikureport.html +4 -4
- data/manual/html/timesheet.html +4 -4
- data/manual/html/timesheetreport.html +23 -5
- data/manual/html/timezone.export.html +4 -4
- data/manual/html/timezone.html +4 -4
- data/manual/html/timezone.report.html +5 -5
- data/manual/html/timezone.shift.html +4 -4
- data/manual/html/timingresolution.html +4 -4
- data/manual/html/title.column.html +4 -4
- data/manual/html/title.html +5 -5
- data/manual/html/toc.html +207 -179
- data/manual/html/tooltip.column.html +45 -10
- data/manual/html/tracereport.html +405 -0
- data/manual/html/trackingscenario.html +6 -6
- data/manual/html/treelevel.html +4 -4
- data/manual/html/vacation.html +4 -4
- data/manual/html/vacation.resource.html +4 -4
- data/manual/html/vacation.shift.html +4 -4
- data/manual/html/warn.html +43 -8
- data/manual/html/weeklymax.html +5 -5
- data/manual/html/weeklymin.html +5 -5
- data/manual/html/weekstartsmonday.html +4 -4
- data/manual/html/weekstartssunday.html +6 -6
- data/manual/html/width.column.html +6 -6
- data/manual/html/width.html +72 -0
- data/manual/html/work.html +4 -4
- data/manual/html/workinghours.project.html +4 -4
- data/manual/html/workinghours.resource.html +4 -4
- data/manual/html/workinghours.shift.html +4 -4
- data/manual/html/yearlyworkingdays.html +4 -4
- data/spec/Color_spec.rb +60 -0
- data/spec/ProjectBroker_spec.rb +3 -2
- data/spec/StatusSheets_spec.rb +5 -4
- data/spec/TableColumnSorter_spec.rb +78 -0
- data/spec/TimeSheets_spec.rb +6 -2
- data/spec/Tj3Daemon_spec.rb +2 -2
- data/spec/TraceReport_spec.rb +117 -0
- data/taskjuggler.gemspec +1 -1
- data/test/MessageChecker.rb +3 -1
- data/test/ReferenceGenerator.rb +1 -1
- data/test/TestSuite/CSV-Reports/Leave.tjp +1 -1
- data/test/TestSuite/CSV-Reports/refs/resourcereport_with_tasks.csv +3 -0
- data/test/TestSuite/CSV-Reports/refs/taskcounter.csv +9 -0
- data/test/TestSuite/CSV-Reports/refs/taskreport_with_resources.csv +19 -16
- data/test/TestSuite/CSV-Reports/refs/weekly.csv +1 -0
- data/test/TestSuite/Export-Reports/refs/LogicalExpression.tjp +14 -2
- data/test/TestSuite/Export-Reports/refs/tutorial.tjp +98 -86
- data/test/TestSuite/Scheduler/Correct/Leaves.tjp +25 -0
- data/test/TestSuite/Syntax/Correct/Leave.tjp +1 -1
- data/test/TestSuite/Syntax/Correct/LogicalExpression.tjp +9 -1
- data/test/TestSuite/Syntax/Correct/TraceReport.tjp +10 -0
- data/test/TestSuite/Syntax/Correct/tutorial.tjp +10 -4
- data/test/test_CSV-Reports.rb +3 -3
- data/test/test_Export-Reports.rb +91 -86
- data/test/test_Journal.rb +15 -12
- data/test/test_Limits.rb +3 -3
- data/test/test_Project.rb +1 -2
- data/test/test_ProjectFileScanner.rb +1 -1
- data/test/test_PropertySet.rb +1 -1
- data/test/test_Query.rb +5 -6
- data/test/test_ReportGenerator.rb +15 -7
- data/test/test_RichText.rb +4 -3
- data/test/test_Scheduler.rb +19 -7
- data/test/test_ShiftAssignments.rb +2 -2
- data/test/test_SimpleQueryExpander.rb +29 -2
- data/test/test_Syntax.rb +14 -5
- metadata +49 -10
- data/lib/taskjuggler/LogFile.rb +0 -73
@@ -42,7 +42,7 @@ copyright "© 2002 Crappy Software, Inc."
|
|
42
42
|
rate 390.0
|
43
43
|
|
44
44
|
# Register Good Friday as a global holiday for all resources.
|
45
|
-
|
45
|
+
leaves holiday "Good Friday" 2002-03-29
|
46
46
|
flags team
|
47
47
|
|
48
48
|
# This is one way to form teams
|
@@ -83,7 +83,7 @@ resource dev "Developers" {
|
|
83
83
|
resource dev3 "Klaus Müller" {
|
84
84
|
email "Klaus.Mueller@crappysoftware.com"
|
85
85
|
Phone "x490"
|
86
|
-
|
86
|
+
leaves annual 2002-02-01 - 2002-02-05
|
87
87
|
}
|
88
88
|
flags team
|
89
89
|
}
|
@@ -99,7 +99,7 @@ resource misc "The Others" {
|
|
99
99
|
email "sung@crappysoftware.com"
|
100
100
|
Phone "x482"
|
101
101
|
rate 300.0
|
102
|
-
|
102
|
+
leaves annual 2002-03-11 - 2002-03-16
|
103
103
|
}
|
104
104
|
|
105
105
|
flags team
|
@@ -174,6 +174,12 @@ task AcSo "Accounting Software" {
|
|
174
174
|
delayed:effort 40d
|
175
175
|
depends !database, !backend
|
176
176
|
allocate dev2, dev3
|
177
|
+
# Resource dev2 should only work 6 hours per day on this task.
|
178
|
+
limits {
|
179
|
+
dailymax 6h {
|
180
|
+
resources dev2
|
181
|
+
}
|
182
|
+
}
|
177
183
|
}
|
178
184
|
|
179
185
|
task backend "Back-End Functions" {
|
@@ -290,7 +296,7 @@ task AcSo "Accounting Software" {
|
|
290
296
|
# results.
|
291
297
|
|
292
298
|
navigator navbar {
|
293
|
-
hidereport
|
299
|
+
hidereport @none
|
294
300
|
}
|
295
301
|
|
296
302
|
macro TaskTip [
|
@@ -378,7 +384,7 @@ taskreport overview "" {
|
|
378
384
|
# of the date. %a is the tag for this.
|
379
385
|
timeformat "%a %Y-%m-%d"
|
380
386
|
loadunit days
|
381
|
-
hideresource
|
387
|
+
hideresource @all
|
382
388
|
balance cost rev
|
383
389
|
caption 'All effort values are in man days.'
|
384
390
|
|
@@ -459,7 +465,7 @@ taskreport deliveries "" {
|
|
459
465
|
columns bsi { title 'WBS' }, name, start, end, note { width 150 }, complete,
|
460
466
|
chart { ${TaskTip} }
|
461
467
|
taskroot AcSo.deliveries
|
462
|
-
hideresource
|
468
|
+
hideresource @all
|
463
469
|
scenarios plan, delayed
|
464
470
|
}
|
465
471
|
# A list of all employees with their contact details.
|
@@ -473,7 +479,7 @@ resourcereport contactList "" {
|
|
473
479
|
chart { scale day }
|
474
480
|
hideresource ~isleaf()
|
475
481
|
sortresources name.up
|
476
|
-
hidetask
|
482
|
+
hidetask @all
|
477
483
|
}
|
478
484
|
|
479
485
|
# A graph showing resource allocation. It identifies whether each
|
@@ -499,9 +499,8 @@ class TaskJuggler
|
|
499
499
|
if query
|
500
500
|
get.each do |r|
|
501
501
|
if query.listItem
|
502
|
-
rti = RichText.new(query.listItem, RTFHandlers.create(r.project)
|
503
|
-
|
504
|
-
generateIntermediateFormat
|
502
|
+
rti = RichText.new(query.listItem, RTFHandlers.create(r.project)).
|
503
|
+
generateIntermediateFormat
|
505
504
|
q = query.dup
|
506
505
|
q.property = r
|
507
506
|
rti.setQuery(q)
|
@@ -28,30 +28,35 @@ class TaskJuggler
|
|
28
28
|
# When creating a HTMLDocument the caller can specify the type of HTML that
|
29
29
|
# will be used. The constructor then generates the proper XML declaration
|
30
30
|
# for it. :strict, :transitional and :frameset are supported for _docType_.
|
31
|
-
def initialize(docType = :
|
31
|
+
def initialize(docType = :html5, &block)
|
32
32
|
super(&block)
|
33
33
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
34
|
+
unless docType == :html5
|
35
|
+
@elements << XMLBlob.new('<?xml version="1.0" encoding="UTF-8"?>')
|
36
|
+
case docType
|
37
|
+
when :strict
|
38
|
+
dtdRef = 'Strict'
|
39
|
+
url = 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'
|
40
|
+
when :transitional
|
41
|
+
dtdRef = 'Transitional'
|
42
|
+
url = 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'
|
43
|
+
when :frameset
|
44
|
+
dtdRef = 'Frameset'
|
45
|
+
url = 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd'
|
46
|
+
else
|
47
|
+
raise "Unsupported docType"
|
48
|
+
end
|
49
|
+
@elements << XMLBlob.new(
|
50
|
+
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 ' +
|
51
|
+
"#{dtdRef}//EN\" \"#{url}\">")
|
45
52
|
else
|
46
|
-
|
53
|
+
@elements << XMLBlob.new('<!DOCTYPE>')
|
47
54
|
end
|
48
|
-
@elements << XMLBlob.new('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 ' +
|
49
|
-
"#{dtdRef}//EN\" \"#{url}\">")
|
50
55
|
@elements << XMLComment.new('This file has been generated by ' +
|
51
56
|
"#{AppConfig.appName} v#{AppConfig.version}")
|
52
|
-
|
53
|
-
|
54
|
-
|
57
|
+
attrs = { 'xml:lang' => 'en', 'lang' => 'en' }
|
58
|
+
attrs['xmlns'] ='http://www.w3.org/1999/xhtml' unless docType == :html5
|
59
|
+
@elements << (@html = HTML.new(attrs))
|
55
60
|
end
|
56
61
|
|
57
62
|
# Generate the 'head' section of an HTML page.
|
@@ -61,6 +66,8 @@ class TaskJuggler
|
|
61
66
|
TITLE.new { title },
|
62
67
|
META.new({ 'http-equiv' => 'Content-Type',
|
63
68
|
'content' => 'text/html; charset=utf-8' }),
|
69
|
+
# Ugly hack to force IE into IE-9 mode.
|
70
|
+
META.new({ 'http-equiv' => 'X-UA-Compatible', 'content' => 'IE=9' })
|
64
71
|
]
|
65
72
|
# Include optional meta tags.
|
66
73
|
metaTags.each do |name, content|
|
data/lib/taskjuggler/Journal.rb
CHANGED
@@ -11,6 +11,8 @@
|
|
11
11
|
# published by the Free Software Foundation.
|
12
12
|
#
|
13
13
|
|
14
|
+
require 'taskjuggler/MessageHandler'
|
15
|
+
|
14
16
|
class TaskJuggler
|
15
17
|
|
16
18
|
# A JournalEntry stores some RichText strings to describe a status or a
|
@@ -342,6 +344,8 @@ class TaskJuggler
|
|
342
344
|
# information.
|
343
345
|
class Journal
|
344
346
|
|
347
|
+
include MessageHandler
|
348
|
+
|
345
349
|
# Create a new Journal object.
|
346
350
|
def initialize
|
347
351
|
# This list holds all entries.
|
@@ -435,15 +439,14 @@ class TaskJuggler
|
|
435
439
|
if query.property
|
436
440
|
if query.property.is_a?(Task)
|
437
441
|
entries += currentEntriesR(query.end, query.property, 0,
|
438
|
-
query.start, query
|
442
|
+
query.start, query)
|
439
443
|
end
|
440
444
|
else
|
441
445
|
query.project.tasks.each do |task|
|
442
446
|
# We only care about top-level tasks.
|
443
447
|
next if task.parent
|
444
448
|
|
445
|
-
entries += currentEntriesR(query.end, task, 0, query.start,
|
446
|
-
query.hideJournalEntry)
|
449
|
+
entries += currentEntriesR(query.end, task, 0, query.start, query)
|
447
450
|
# Eliminate duplicates due to entries from adopted tasks
|
448
451
|
entries.uniq!
|
449
452
|
end
|
@@ -455,15 +458,14 @@ class TaskJuggler
|
|
455
458
|
if query.property
|
456
459
|
if query.property.is_a?(Task)
|
457
460
|
entries += alertEntries(query.end, query.property, 1, query.start,
|
458
|
-
query
|
461
|
+
query)
|
459
462
|
end
|
460
463
|
else
|
461
464
|
query.project.tasks.each do |task|
|
462
465
|
# We only care about top-level tasks.
|
463
466
|
next if task.parent
|
464
467
|
|
465
|
-
entries += alertEntries(query.end, task, 1, query.start,
|
466
|
-
query.hideJournalEntry)
|
468
|
+
entries += alertEntries(query.end, task, 1, query.start, query)
|
467
469
|
# Eliminate duplicates due to entries from adopted tasks
|
468
470
|
entries.uniq!
|
469
471
|
end
|
@@ -485,11 +487,9 @@ class TaskJuggler
|
|
485
487
|
|
486
488
|
# Now convert the RichText markup String into RichTextIntermediate
|
487
489
|
# format.
|
488
|
-
unless (rti = RichText.new(rText, RTFHandlers.create(query.project)
|
489
|
-
query.project.messageHandler).
|
490
|
+
unless (rti = RichText.new(rText, RTFHandlers.create(query.project)).
|
490
491
|
generateIntermediateFormat)
|
491
|
-
|
492
|
-
"Syntax error in journal: #{rText}")
|
492
|
+
warning('ptn_journal', "Syntax error in journal: #{rText}")
|
493
493
|
return nil
|
494
494
|
end
|
495
495
|
# No section numbers, please!
|
@@ -579,12 +579,12 @@ class TaskJuggler
|
|
579
579
|
# If the property does not have any JournalEntry objects or they are out
|
580
580
|
# of date compared to the child properties, the level is computed based on
|
581
581
|
# the highest level of the children. Only take the entries that are not
|
582
|
-
# filtered by
|
583
|
-
def alertLevel(date, property,
|
582
|
+
# filtered by _query_.hideJournalEntry into account.
|
583
|
+
def alertLevel(date, property, query)
|
584
584
|
maxLevel = 0
|
585
585
|
# Gather all the current (as of the specified _date_) JournalEntry
|
586
586
|
# objects for the property and than find the highest level.
|
587
|
-
currentEntriesR(date, property, 0, nil,
|
587
|
+
currentEntriesR(date, property, 0, nil, query).each do |e|
|
588
588
|
maxLevel = e.alertLevel if maxLevel < e.alertLevel
|
589
589
|
end
|
590
590
|
maxLevel
|
@@ -594,12 +594,12 @@ class TaskJuggler
|
|
594
594
|
# _date_, are for _property_ or any of its childs, have at least _level_
|
595
595
|
# alert and are after _minDate_. We only return those entries with the
|
596
596
|
# highest overall alert level.
|
597
|
-
def alertEntries(date, property, minLevel, minDate,
|
597
|
+
def alertEntries(date, property, minLevel, minDate, query)
|
598
598
|
maxLevel = 0
|
599
599
|
entries = []
|
600
600
|
# Gather all the current (as of the specified _date_) JournalEntry
|
601
601
|
# objects for the property and than find the highest level.
|
602
|
-
currentEntriesR(date, property, minLevel, minDate,
|
602
|
+
currentEntriesR(date, property, minLevel, minDate, query).each do |e|
|
603
603
|
if maxLevel < e.alertLevel
|
604
604
|
maxLevel = e.alertLevel
|
605
605
|
entries = [ e ]
|
@@ -653,62 +653,82 @@ class TaskJuggler
|
|
653
653
|
# property unless there is a property in the sub-tree specified by the
|
654
654
|
# root _property_ with more up-to-date entries. The result is a
|
655
655
|
# JournalEntryList.
|
656
|
-
def currentEntriesR(date, property, minLevel
|
657
|
-
|
658
|
-
|
659
|
-
|
660
|
-
|
661
|
-
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
|
666
|
-
|
656
|
+
def currentEntriesR(date, property, minLevel, minDate, query)
|
657
|
+
DataCache.instance.cached(self, :currentEntriesR, date, property,
|
658
|
+
minLevel, minDate, query) do
|
659
|
+
# See if this property has any current JournalEntry objects.
|
660
|
+
pEntries = getEntries(property) ? getEntries(property).last(date) :
|
661
|
+
JournalEntryList.new
|
662
|
+
# Remove entries below the minium alert level or before the timeout
|
663
|
+
# date.
|
664
|
+
pEntries.delete_if do |e|
|
665
|
+
e.headline.empty? || e.alertLevel < minLevel ||
|
666
|
+
(e.alertLevel == minLevel && minDate && e.date < minDate)
|
667
|
+
end
|
667
668
|
|
668
|
-
|
669
|
-
|
670
|
-
|
671
|
-
|
672
|
-
|
669
|
+
# Determine the highest alert level of the pEntries.
|
670
|
+
maxPAlertLevel = 0
|
671
|
+
pEntries.each do |e|
|
672
|
+
maxPAlertLevel = e.alertLevel if e.alertLevel > maxPAlertLevel
|
673
|
+
end
|
673
674
|
|
674
|
-
|
675
|
-
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
|
680
|
-
|
681
|
-
|
682
|
-
|
683
|
-
|
684
|
-
|
685
|
-
|
686
|
-
|
687
|
-
|
688
|
-
|
689
|
-
|
675
|
+
cEntries = JournalEntryList.new
|
676
|
+
latestDate = nil
|
677
|
+
maxAlertLevel = 0
|
678
|
+
# If we have an entry from this property, we only care about child
|
679
|
+
# entries that are from a later date.
|
680
|
+
minDate = pEntries.first.date + 1 unless pEntries.empty?
|
681
|
+
|
682
|
+
# Now gather all current entries of the child properties and find the
|
683
|
+
# date that is closest to and right before the given _date_.
|
684
|
+
property.kids.each do |p|
|
685
|
+
currentEntriesR(date, p, minLevel, minDate, query).each do |e|
|
686
|
+
# Find the date of the most recent entry.
|
687
|
+
latestDate = e.date if latestDate.nil? || e.date > latestDate
|
688
|
+
# Find the highest alert level.
|
689
|
+
maxAlertLevel = e.alertLevel if e.alertLevel > maxAlertLevel
|
690
|
+
cEntries << e
|
691
|
+
end
|
690
692
|
end
|
691
|
-
end
|
692
693
|
|
693
|
-
|
694
|
-
|
695
|
-
|
696
|
-
#
|
697
|
-
#
|
698
|
-
#
|
699
|
-
|
700
|
-
|
701
|
-
#
|
702
|
-
|
703
|
-
|
694
|
+
# Only Task properties have dependencies.
|
695
|
+
#if property.is_a?(Task)
|
696
|
+
# # Now gather all current entries of the dependency properties and find
|
697
|
+
# # the date that is closest to and right before the given _date_.
|
698
|
+
# property['startpreds', query.scenarioIdx].each do |p, onEnd|
|
699
|
+
# # We only follow end->start dependencies.
|
700
|
+
# next unless onEnd
|
701
|
+
|
702
|
+
# currentEntriesR(date, p, minLevel, minDate, query).each do |e|
|
703
|
+
# # Find the date of the most recent entry.
|
704
|
+
# latestDate = e.date if latestDate.nil? || e.date > latestDate
|
705
|
+
# # Find the highest alert level.
|
706
|
+
# maxAlertLevel = e.alertLevel if e.alertLevel > maxAlertLevel
|
707
|
+
# cEntries << e
|
708
|
+
# end
|
709
|
+
# end
|
710
|
+
#end
|
711
|
+
|
712
|
+
if !pEntries.empty? && (maxPAlertLevel > maxAlertLevel ||
|
713
|
+
latestDate.nil? ||
|
714
|
+
pEntries.first.date >= latestDate)
|
715
|
+
# If no child property has a more current JournalEntry or one with a
|
716
|
+
# higher alert level than this property and this property has
|
717
|
+
# JournalEntry objects, than those are taken.
|
718
|
+
entries = pEntries
|
719
|
+
else
|
720
|
+
# Otherwise we take the entries from the kids.
|
721
|
+
entries = cEntries
|
722
|
+
end
|
704
723
|
|
705
|
-
|
706
|
-
|
707
|
-
|
708
|
-
|
724
|
+
# Remove all entries that are filtered by query.hideJournalEntry.
|
725
|
+
if query.hideJournalEntry
|
726
|
+
entries.delete_if { |e| hidden(e, query.hideJournalEntry) }
|
727
|
+
end
|
709
728
|
|
710
|
-
|
711
|
-
|
729
|
+
# Otherwise return the list provided by the childen.
|
730
|
+
entries
|
731
|
+
end
|
712
732
|
end
|
713
733
|
|
714
734
|
private
|
@@ -12,6 +12,7 @@
|
|
12
12
|
#
|
13
13
|
|
14
14
|
require 'term/ansicolor'
|
15
|
+
require 'taskjuggler/MessageHandler'
|
15
16
|
require 'taskjuggler/HTMLDocument'
|
16
17
|
require 'taskjuggler/RichText'
|
17
18
|
require 'taskjuggler/TjpExample'
|
@@ -34,6 +35,7 @@ class TaskJuggler
|
|
34
35
|
|
35
36
|
include HTMLElements
|
36
37
|
include Term::ANSIColor
|
38
|
+
include MessageHandler
|
37
39
|
|
38
40
|
attr_reader :keyword, :names, :pattern, :references, :optionalAttributes
|
39
41
|
attr_accessor :contexts, :scenarioSpecific, :inheritedFromProject,
|
@@ -46,7 +48,6 @@ class TaskJuggler
|
|
46
48
|
# _pattern_. _optAttrPatterns_ is an Array with references to
|
47
49
|
# TextParser::Patterns that are optional attributes to this keyword.
|
48
50
|
def initialize(rule, pattern, syntax, args, optAttrPatterns, manual)
|
49
|
-
@messageHandler = MessageHandler.new(true)
|
50
51
|
@rule = rule
|
51
52
|
@pattern = pattern
|
52
53
|
# The unique identifier. Usually the attribute or property name. To
|
@@ -160,7 +161,7 @@ class TaskJuggler
|
|
160
161
|
end
|
161
162
|
end
|
162
163
|
if property
|
163
|
-
project = Project.new('id', 'dummy', '1.0'
|
164
|
+
project = Project.new('id', 'dummy', '1.0')
|
164
165
|
propertySet = case property
|
165
166
|
when 'task'
|
166
167
|
project.tasks
|
@@ -339,7 +340,7 @@ class TaskJuggler
|
|
339
340
|
# Return a String that represents the keyword documentation in an XML
|
340
341
|
# formatted form.
|
341
342
|
def generateHTML(directory)
|
342
|
-
html = HTMLDocument.new
|
343
|
+
html = HTMLDocument.new
|
343
344
|
head = html.generateHead(keyword,
|
344
345
|
{ 'description' => 'The TaskJuggler Manual',
|
345
346
|
'keywords' =>
|
@@ -406,10 +407,9 @@ class TaskJuggler
|
|
406
407
|
# catches all RichTextScanner processing problems and converts the exception
|
407
408
|
# data into an error message.
|
408
409
|
def newRichText(text)
|
409
|
-
rText = RichText.new(text, []
|
410
|
+
rText = RichText.new(text, [])
|
410
411
|
unless (rti = rText.generateIntermediateFormat)
|
411
|
-
|
412
|
-
"Error in RichText of rule #{@keyword}")
|
412
|
+
error('rich_text', "Error in RichText of rule #{@keyword}")
|
413
413
|
end
|
414
414
|
@references += rti.internalReferences
|
415
415
|
rti
|
@@ -545,17 +545,18 @@ class TaskJuggler
|
|
545
545
|
end
|
546
546
|
|
547
547
|
def generateHTMLContextLine
|
548
|
-
|
548
|
+
descr = []
|
549
|
+
@contexts.each do |c|
|
550
|
+
next if [ :deprecated, :removed ].include?(c.pattern.supportLevel)
|
551
|
+
|
552
|
+
descr << ', ' unless descr.empty?
|
553
|
+
descr << A.new('href' => "#{c.keyword}.html") { c.title }
|
554
|
+
end
|
555
|
+
if descr.empty?
|
549
556
|
descr = A.new('href' =>
|
550
557
|
'Getting_Started.html#Structure_of_a_TJP_File') do
|
551
558
|
'Global scope'
|
552
559
|
end
|
553
|
-
else
|
554
|
-
descr = []
|
555
|
-
@contexts.each do |c|
|
556
|
-
descr << ', ' unless descr.empty?
|
557
|
-
descr << A.new('href' => "#{c.keyword}.html") { c.title }
|
558
|
-
end
|
559
560
|
end
|
560
561
|
generateHTMLTableLine('Context', descr)
|
561
562
|
end
|
@@ -564,6 +565,8 @@ class TaskJuggler
|
|
564
565
|
unless @seeAlso.empty?
|
565
566
|
descr = []
|
566
567
|
@seeAlso.each do |a|
|
568
|
+
next if [ :deprecated, :removed ].include?(a.pattern.supportLevel)
|
569
|
+
|
567
570
|
descr << ', ' unless descr.empty?
|
568
571
|
descr << A.new('href' => "#{a.keyword}.html") { a.title }
|
569
572
|
end
|
@@ -629,6 +632,10 @@ class TaskJuggler
|
|
629
632
|
end
|
630
633
|
|
631
634
|
@optionalAttributes.each do |attr|
|
635
|
+
if [ :deprecated, :removed ].include?(attr.pattern.supportLevel)
|
636
|
+
next
|
637
|
+
end
|
638
|
+
|
632
639
|
rows << TR.new('align' => 'left') do
|
633
640
|
[
|
634
641
|
TD.new('align' => 'left', 'class' => 'descr') do
|
@@ -657,6 +664,11 @@ class TaskJuggler
|
|
657
664
|
TD.new('class' => 'descr', 'style' => 'width:84%') do
|
658
665
|
list = []
|
659
666
|
@optionalAttributes.each do |attr|
|
667
|
+
if [ :deprecated, :removed ].
|
668
|
+
include?(attr.pattern.supportLevel)
|
669
|
+
next
|
670
|
+
end
|
671
|
+
|
660
672
|
list << ', ' unless list.empty?
|
661
673
|
list << A.new('href' => "#{attr.keyword}.html") do
|
662
674
|
attr.title
|