taskjuggler 3.1.0 → 3.2.0
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.
- 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
|