39
|
1 <?cs include:"header.cs"?>
|
|
2 <?cs include:"macros.cs"?>
|
|
3
|
|
4 <div id="ctxtnav" class="nav"></div>
|
|
5
|
|
6 <div id="content" class="milestone">
|
|
7 <?cs if:milestone.mode == "new" ?>
|
|
8 <h1>New Milestone</h1>
|
|
9 <?cs elif:milestone.mode == "edit" ?>
|
|
10 <h1>Edit Milestone <?cs var:milestone.name ?></h1>
|
|
11 <?cs elif:milestone.mode == "delete" ?>
|
|
12 <h1>Delete Milestone <?cs var:milestone.name ?></h1>
|
|
13 <?cs else ?>
|
|
14 <h1>Milestone <?cs var:milestone.name ?></h1>
|
|
15 <?cs /if ?>
|
|
16
|
|
17 <?cs if:milestone.mode == "edit" || milestone.mode == "new" ?>
|
|
18 <script type="text/javascript">
|
|
19 addEvent(window, 'load', function() {
|
|
20 document.getElementById('name').focus();
|
|
21 });
|
|
22 </script>
|
|
23 <form id="edit" action="<?cs var:milestone.href ?>" method="post">
|
|
24 <input type="hidden" name="id" value="<?cs var:milestone.name ?>" />
|
|
25 <input type="hidden" name="action" value="edit" />
|
|
26 <div class="field">
|
|
27 <label>Name of the milestone:<br />
|
|
28 <input type="text" id="name" name="name" size="32" value="<?cs
|
|
29 var:milestone.name ?>" /></label>
|
|
30 </div>
|
|
31 <fieldset>
|
|
32 <legend>Schedule</legend>
|
|
33 <label>Due:<br />
|
|
34 <input type="text" id="duedate" name="duedate" size="<?cs
|
|
35 var:len(milestone.date_hint) ?>" value="<?cs
|
|
36 var:milestone.due_date ?>" title="Format: <?cs var:milestone.date_hint ?>" />
|
|
37 <em>Format: <?cs var:milestone.date_hint ?></em>
|
|
38 </label>
|
|
39 <div class="field">
|
|
40 <label>
|
|
41 <input type="checkbox" id="completed" name="completed"<?cs
|
|
42 if:milestone.completed ?> checked="checked"<?cs /if ?> />
|
|
43 Completed:<br />
|
|
44 </label>
|
|
45 <label>
|
|
46 <input type="text" id="completeddate" name="completeddate" size="<?cs
|
|
47 var:len(milestone.date_hint) ?>" value="<?cs
|
|
48 alt:milestone.completed_date ?><?cs
|
|
49 var:milestone.datetime_now ?><?cs
|
|
50 /alt ?>" title="Format: <?cs
|
|
51 var:milestone.datetime_hint ?>" />
|
|
52 <em>Format: <?cs var:milestone.datetime_hint ?></em>
|
|
53 </label><?cs
|
|
54 if:len(milestones) ?>
|
|
55 <br/>
|
|
56 <input type="checkbox" id="retarget" name="retarget" checked="checked"
|
|
57 onclick="enableControl('target', this.checked)"/>
|
|
58 <label>
|
|
59 Retarget associated open tickets to milestone
|
|
60 <select id="target" name="target">
|
|
61 <option value="">None</option><?cs
|
|
62 each:name = milestones ?>
|
|
63 <option><?cs var:name ?></option><?cs
|
|
64 /each ?>
|
|
65 </select>
|
|
66 </label><?cs
|
|
67 /if ?>
|
|
68 <script type="text/javascript">
|
|
69 var completed = document.getElementById("completed");
|
|
70 var retarget = document.getElementById("retarget");
|
|
71 var enableCompletedDate = function() {
|
|
72 enableControl("completeddate", completed.checked);
|
|
73 enableControl("retarget", completed.checked);
|
|
74 enableControl("target", completed.checked && retarget.checked);
|
|
75 };
|
|
76 addEvent(window, "load", enableCompletedDate);
|
|
77 addEvent(completed, "click", enableCompletedDate);
|
|
78 </script>
|
|
79 </div>
|
|
80 </fieldset>
|
|
81 <div class="field">
|
|
82 <fieldset class="iefix">
|
|
83 <label for="description">Description (you may use <a tabindex="42" href="<?cs
|
|
84 var:trac.href.wiki ?>/WikiFormatting">WikiFormatting</a> here):</label>
|
|
85 <p><textarea id="description" name="description" class="wikitext" rows="10" cols="78">
|
|
86 <?cs var:milestone.description_source ?></textarea></p>
|
|
87 </fieldset>
|
|
88 </div>
|
|
89 <div class="buttons">
|
|
90 <?cs if:milestone.mode == "new"
|
|
91 ?><input type="submit" value="Add milestone" /><?cs
|
|
92 else
|
|
93 ?><input type="submit" value="Submit changes" /><?cs
|
|
94 /if ?>
|
|
95 <input type="submit" name="cancel" value="Cancel" />
|
|
96 </div>
|
|
97 <script type="text/javascript" src="<?cs
|
|
98 var:htdocs_location ?>js/wikitoolbar.js"></script>
|
|
99 </form>
|
|
100 <?cs elif:milestone.mode == "delete" ?>
|
|
101 <form action="<?cs var:milestone.href ?>" method="post">
|
|
102 <input type="hidden" name="id" value="<?cs var:milestone.name ?>" />
|
|
103 <input type="hidden" name="action" value="delete" />
|
|
104 <p><strong>Are you sure you want to delete this milestone?</strong></p>
|
|
105 <input type="checkbox" id="retarget" name="retarget" checked="checked"
|
|
106 onclick="enableControl('target', this.checked)"/>
|
|
107 <label for="target">Retarget associated tickets to milestone</label>
|
|
108 <select name="target" id="target">
|
|
109 <option value="">None</option><?cs
|
|
110 each:other = milestones ?><?cs if:other != milestone.name ?>
|
|
111 <option><?cs var:other ?></option><?cs
|
|
112 /if ?><?cs /each ?>
|
|
113 </select>
|
|
114 <div class="buttons">
|
|
115 <input type="submit" name="cancel" value="Cancel" />
|
|
116 <input type="submit" value="Delete milestone" />
|
|
117 </div>
|
|
118 </form>
|
|
119 <?cs else ?>
|
|
120 <?cs if:milestone.mode == "view" ?>
|
|
121 <div class="info">
|
|
122 <p class="date"><?cs
|
|
123 if:milestone.completed_date ?>
|
|
124 Completed <?cs var:milestone.completed_delta ?> ago (<?cs var:milestone.completed_date ?>)<?cs
|
|
125 elif:milestone.due_date ?><?cs
|
|
126 if:milestone.late ?>
|
|
127 <strong><?cs var:milestone.due_delta ?> late</strong><?cs
|
|
128 else ?>
|
|
129 Due in <?cs var:milestone.due_delta ?><?cs
|
|
130 /if ?> (<?cs var:milestone.due_date ?>)<?cs
|
|
131 else ?>
|
|
132 No date set<?cs
|
|
133 /if ?>
|
|
134 </p><?cs
|
|
135 with:stats = milestone.stats ?><?cs
|
|
136 if:#stats.total_tickets > #0 ?>
|
|
137 <table class="progress">
|
|
138 <tr>
|
|
139 <td class="closed" style="width: <?cs
|
|
140 var:#stats.percent_closed ?>%">
|
|
141 <a href="<?cs
|
|
142 var:milestone.queries.closed_tickets ?>" title="<?cs
|
|
143 var:#stats.closed_tickets ?> of <?cs
|
|
144 var:#stats.total_tickets ?> ticket<?cs
|
|
145 if:#stats.total_tickets != #1 ?>s<?cs /if ?> closed"></a></td>
|
|
146 <td class="open" style="width: <?cs
|
|
147 var:#stats.percent_active ?>%">
|
|
148 <a href="<?cs
|
|
149 var:milestone.queries.active_tickets ?>" title="<?cs
|
|
150 var:#stats.active_tickets ?> of <?cs
|
|
151 var:#stats.total_tickets ?> ticket<?cs
|
|
152 if:#stats.total_tickets != #1 ?>s<?cs /if ?> active"></a>
|
|
153 </tr>
|
|
154 </table>
|
|
155 <p class="percent"><?cs var:#stats.percent_closed ?>%</p>
|
|
156 <dl>
|
|
157 <dt>Closed tickets:</dt>
|
|
158 <dd><a href="<?cs var:milestone.queries.closed_tickets ?>"><?cs
|
|
159 var:stats.closed_tickets ?></a></dd>
|
|
160 <dt>Active tickets:</dt>
|
|
161 <dd><a href="<?cs var:milestone.queries.active_tickets ?>"><?cs
|
|
162 var:stats.active_tickets ?></a></dd>
|
|
163 </dl><?cs
|
|
164 /if ?><?cs
|
|
165 /with ?>
|
|
166 </div>
|
|
167 <form id="stats" action="" method="get">
|
|
168 <fieldset>
|
|
169 <legend>
|
|
170 <label for="by">Ticket status by</label>
|
|
171 <select id="by" name="by" onchange="this.form.submit()"><?cs
|
|
172 each:group = milestone.stats.available_groups ?>
|
|
173 <option value="<?cs var:group.name ?>" <?cs
|
|
174 if:milestone.stats.grouped_by == group.name ?> selected="selected"<?cs
|
|
175 /if ?>><?cs var:group.label ?></option><?cs
|
|
176 /each ?></select>
|
|
177 <noscript><input type="submit" value="Update" /></noscript>
|
|
178 </legend>
|
|
179 <table summary="Shows the milestone completion status grouped by <?cs
|
|
180 var:milestone.stats.grouped_by ?>"><?cs
|
|
181 each:group = milestone.stats.groups ?>
|
|
182 <tr>
|
|
183 <th scope="row"><a href="<?cs
|
|
184 var:group.queries.all_tickets ?>"><?cs var:group.name ?></a></th>
|
|
185 <td style="white-space: nowrap"><?cs if:#group.total_tickets ?>
|
|
186 <table class="progress" style="width: <?cs
|
|
187 var:#group.percent_total * #80 / #milestone.stats.max_percent_total ?>%">
|
|
188 <tr>
|
|
189 <td class="closed" style="width: <?cs
|
|
190 var:#group.percent_closed ?>%"><a href="<?cs
|
|
191 var:group.queries.closed_tickets ?>" title="<?cs
|
|
192 var:group.closed_tickets ?> of <?cs
|
|
193 var:group.total_tickets ?> ticket<?cs
|
|
194 if:group.total_tickets != #1 ?>s<?cs /if ?> closed"></a>
|
|
195 </td>
|
|
196 <td class="open" style="width: <?cs
|
|
197 var:#group.percent_active ?>%"><a href="<?cs
|
|
198 var:group.queries.active_tickets ?>" title="<?cs
|
|
199 var:group.active_tickets ?> of <?cs
|
|
200 var:group.total_tickets ?> ticket<?cs
|
|
201 if:group.total_tickets != 1 ?>s<?cs /if ?> active"></a>
|
|
202 </td>
|
|
203 </tr>
|
|
204 </table>
|
|
205 <p class="percent"><?cs var:group.closed_tickets ?>/<?cs
|
|
206 var:group.total_tickets ?></p>
|
|
207 <?cs /if ?></td>
|
|
208 </tr><?cs
|
|
209 /each ?>
|
|
210 </table><?cs /if ?>
|
|
211 </fieldset>
|
|
212 </form>
|
|
213 <div class="description"><?cs var:milestone.description ?></div><?cs
|
|
214 if:trac.acl.MILESTONE_MODIFY || trac.acl.MILESTONE_DELETE ?>
|
|
215 <div class="buttons"><?cs
|
|
216 if:trac.acl.MILESTONE_MODIFY ?>
|
|
217 <form method="get" action=""><div>
|
|
218 <input type="hidden" name="action" value="edit" /><?cs
|
|
219 if:milestone.id_param ?>
|
|
220 <input type="hidden" name="id" value="<?cs var:milestone.name ?>" /><?cs
|
|
221 /if ?>
|
|
222 <input type="submit" value="Edit milestone info" accesskey="e" />
|
|
223 </div></form><?cs
|
|
224 /if ?><?cs
|
|
225 if:trac.acl.MILESTONE_DELETE ?>
|
|
226 <form method="get" action=""><div>
|
|
227 <input type="hidden" name="action" value="delete" /><?cs
|
|
228 if:milestone.id_param ?>
|
|
229 <input type="hidden" name="id" value="<?cs var:milestone.name ?>" /><?cs
|
|
230 /if ?>
|
|
231 <input type="submit" value="Delete milestone" />
|
|
232 </div></form><?cs
|
|
233 /if ?>
|
|
234 </div><?cs
|
|
235 /if ?><?cs
|
|
236 /if ?>
|
|
237
|
|
238 <div id="help">
|
|
239 <strong>Note:</strong> See <a href="<?cs
|
|
240 var:trac.href.wiki ?>/TracRoadmap">TracRoadmap</a> for help on using the roadmap.
|
|
241 </div>
|
|
242
|
|
243 </div>
|
|
244 <?cs include:"footer.cs"?>
|