PluginProbe
UpStream: a Project Management Plugin for WordPress / trunk
UpStream: a Project Management Plugin for WordPress vtrunk
trunk 1.39.0 1.39.1 1.39.2 1.39.3 2.0.7 2.1.0
upstream / templates / single-project / tasks.php

tasks.php in UpStream: a Project Management Plugin for WordPress trunk, at templates/single-project/tasks.php

334 lines 12.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Single project: tasks
4 *
5 * @package UpStream
6 */
7
8 // Prevent direct access.
9 if ( ! defined( 'ABSPATH' ) ) {
10 exit;
11 }
12
13 if ( ! upstream_are_tasks_disabled() && ! upstream_disable_tasks() ) :
14
15 $collapse_box = isset( $plugin_options['collapse_project_tasks'] )
16 && true === (bool) $plugin_options['collapse_project_tasks'];
17
18 $collapse_box_state = \UpStream\Frontend\upstream_get_section_collapse_state( 'tasks' );
19
20 if ( false !== $collapse_box_state ) {
21 $collapse_box = 'closed' === $collapse_box_state;
22 }
23
24 $archive_closed_items = upstream_archive_closed_items();
25 $tasks_statuses = get_option( 'upstream_tasks' );
26 $statuses = array();
27 $open_statuses = array();
28
29 foreach ( $tasks_statuses['statuses'] as $up_status ) {
30 // If closed items will be archived, we do not need to display closed statuses.
31 if ( $archive_closed_items && 'open' !== $up_status['type'] ) {
32 continue;
33 }
34
35 $statuses[ $up_status['id'] ] = $up_status;
36
37 if ( isset( $up_status['type'] ) && 'open' === $up_status['type'] ) {
38 $open_statuses[] = $up_status['id'];
39 }
40 }
41
42 $item_type = 'task';
43 $current_user_id = get_current_user_id();
44 $users = upstream_admin_get_all_project_users();
45 $project_id = upstream_post_id();
46 $are_comments_enabled = upstream_are_comments_enabled_on_tasks();
47 $are_milestones_enabled = ! upstream_are_milestones_disabled() && ! upstream_disable_milestones();
48 $milestones = array();
49
50 if ( $are_milestones_enabled ) {
51 $milestones = \UpStream\Milestones::getInstance()->get_milestones_from_project( $project_id );
52 }
53
54 $rowset = UpStream_View::get_tasks( $project_id );
55
56 foreach ( array_keys( $rowset ) as $key ) {
57 if ( ! empty( $rowset[ $key ]['milestone'] ) ) {
58 try {
59 $milestone = \UpStream\Factory::get_milestone( $rowset[ $key ]['milestone'] );
60 $rowset[ $key ]['milestone_order'] = $milestone->getName();
61 } catch ( \Exception $e ) {
62 $rowset[ $key ]['milestone'] = '';
63 }
64 }
65 }
66
67 // If should archive closed items, we filter the rowset.
68 if ( $archive_closed_items ) {
69 foreach ( $rowset as $up_id => $task ) {
70 if ( ! isset( $task['status'] ) ) {
71 continue;
72 }
73 if ( ! in_array( $task['status'], $open_statuses ) && ! empty( $task['status'] ) ) {
74 unset( $rowset[ $up_id ] );
75 }
76 }
77 }
78
79 $l = array(
80 'LB_MILESTONE' => upstream_milestone_label(),
81 'LB_TITLE' => __( 'Title', 'upstream' ),
82 'LB_NONE' => __( 'none', 'upstream' ),
83 'LB_NOTES' => __( 'Notes', 'upstream' ),
84 'LB_COMMENTS' => __( 'Comments', 'upstream' ),
85 'MSG_INVALID_USER' => sprintf(
86 // translators: %s: column name. Error message when data reference is not found.
87 _x( 'invalid %s', '%s: column name. Error message when data reference is not found', 'upstream' ),
88 strtolower( __( 'User' ) )
89 ),
90 'MSG_INVALID_MILESTONE' => __( 'invalid milestone', 'upstream' ),
91 'LB_START_DATE' => __( 'Starting after', 'upstream' ),
92 'LB_END_DATE' => __( 'Ending before', 'upstream' ),
93 );
94
95 $l['MSG_INVALID_MILESTONE'] = sprintf(
96 // translators: %s: column name. Error message when data reference is not found.
97 _x( 'invalid %s', '%s: column name. Error message when data reference is not found', 'upstream' ),
98 strtolower( $l['LB_MILESTONE'] )
99 );
100
101 $table_settings = array(
102 'id' => 'tasks',
103 'type' => 'task',
104 'data-ordered-by' => 'start_date',
105 'data-order-dir' => 'DESC',
106 );
107
108 $columns_schema = \UpStream\Frontend\upstream_get_tasks_fields(
109 $statuses,
110 $milestones,
111 $are_milestones_enabled,
112 $are_comments_enabled
113 );
114
115 $filter_closed_items = upstream_filter_closed_items();
116 ?>
117 <div class="col-md-12 col-sm-12 col-xs-12">
118 <div class="x_panel" data-section="tasks">
119 <div class="x_title">
120 <h2>
121 <i class="fa fa-bars sortable_handler"></i>
122 <i class="fa fa-wrench"></i> <?php echo esc_html( upstream_task_label_plural() ); ?>
123 </h2>
124 <ul class="nav navbar-right panel_toolbox">
125 <li>
126 <a class="collapse-link">
127 <i class="fa fa-chevron-<?php echo $collapse_box ? 'down' : 'up'; ?>"></i>
128 </a>
129 </li>
130 <?php do_action( 'upstream_project_tasks_top_right', $project_id ); ?>
131 </ul>
132 <div class="clearfix"></div>
133 </div>
134 <div class="x_content" style="display: <?php echo $collapse_box ? 'none' : 'block'; ?>;">
135 <div class="c-data-table table-responsive">
136 <form class="form-inline c-data-table__filters" data-target="#tasks">
137 <div class="d-none d-sm-flex justify-content-between">
138 <div class="form-group">
139 <div class="input-group">
140 <div class="input-group-text">
141 <i class="fa fa-search"></i>
142 </div>
143 <input type="search" class="form-control"
144 placeholder="<?php echo esc_attr( $l['LB_TITLE'] ); ?>" data-column="title"
145 data-compare-operator="contains">
146 </div>
147 </div>
148 <div class="form-group">
149 <div class="btn-group">
150 <a href="#tasks-filters" role="button" class="btn border btn-light btn-sm"
151 data-bs-toggle="collapse" aria-expanded="false" aria-controls="tasks-filters">
152 <i class="fa fa-filter"></i> <?php esc_html_e( 'Toggle Filters', 'upstream' ); ?>
153 </a>
154 </div>
155 <div class="btn-group">
156 <button class="btn btn-light border btn-sm dropdown-toggle upstream-export-button"
157 type="button" id="dropdownMenuButton1" data-bs-toggle="dropdown" aria-expanded="false">
158 <i class="fa fa-download"></i> <?php esc_html_e( 'Export', 'upstream' ); ?>
159 </button>
160 <ul class="dropdown-menu" aria-labelledby="dropdownMenuButton1">
161 <li><a class="dropdown-item" href="#" data-action="export" data-type="txt">
162 <i class="fa fa-file-text-o"></i>&nbsp;&nbsp;<?php esc_html_e( 'Plain Text', 'upstream' ); ?>
163 </a></li>
164 <li><a class="dropdown-item" href="#" data-action="export" data-type="csv">
165 <i class="fa fa-file-code-o"></i>&nbsp;&nbsp;<?php esc_html_e( 'CSV', 'upstream' ); ?>
166 </a></li>
167 </ul>
168 </div>
169 </div>
170 </div>
171 <div class="d-flex justify-content-between d-sm-none">
172 <div class="btn-group">
173 <a href="#tasks-filters" role="button" class="btn border btn-light btn-sm"
174 data-bs-toggle="collapse" aria-expanded="false" aria-controls="tasks-filters">
175 <i class="fa fa-filter"></i> <?php esc_html_e( 'Toggle Filters', 'upstream' ); ?>
176 </a>
177 </div>
178 <div class="btn-group">
179 <button class="btn btn-light border btn-sm dropdown-toggle upstream-export-button"
180 type="button" id="dropdownMenuButton1" data-bs-toggle="dropdown" aria-expanded="false">
181 <i class="fa fa-download"></i> <?php esc_html_e( 'Export', 'upstream' ); ?>
182 </button>
183 <ul class="dropdown-menu" aria-labelledby="dropdownMenuButton1">
184 <li><a class="dropdown-item" href="#" data-action="export" data-type="txt">
185 <i class="fa fa-file-text-o"></i>&nbsp;&nbsp;<?php esc_html_e( 'Plain Text', 'upstream' ); ?>
186 </a></li>
187 <li><a class="dropdown-item" href="#" data-action="export" data-type="csv">
188 <i class="fa fa-file-code-o"></i>&nbsp;&nbsp;<?php esc_html_e( 'CSV', 'upstream' ); ?>
189 </a></li>
190 </ul>
191 </div>
192 </div>
193 <div id="tasks-filters" class="collapse">
194 <div class="form-group d-block d-sm-none">
195 <div class="input-group">
196 <div class="input-group-text">
197 <i class="fa fa-search"></i>
198 </div>
199 <input type="search" class="form-control"
200 placeholder="<?php echo esc_attr( $l['LB_TITLE'] ); ?>" data-column="title"
201 data-compare-operator="contains">
202 </div>
203 </div>
204 <div class="form-group d-sm-inline-block">
205 <div class="input-group flex-nowrap">
206 <div class="input-group-text">
207 <i class="fa fa-user"></i>
208 </div>
209 <select class="form-control o-select2" data-column="assigned_to" multiple
210 data-placeholder="<?php esc_attr_e( 'Assignee', 'upstream' ); ?>">
211 <option value></option>
212 <option value="__none__"><?php esc_attr_e( 'Nobody', 'upstream' ); ?></option>
213 <option value="<?php echo esc_attr( $current_user_id ); ?>">
214 <?php
215 esc_attr_e(
216 'Me',
217 'upstream'
218 );
219 ?>
220 </option>
221 <optgroup label="<?php esc_attr_e( 'Users' ); ?>">
222 <?php foreach ( $users as $user_id => $user_name ) : ?>
223 <?php
224 if ( $user_id === $current_user_id ) {
225 continue;
226 }
227 ?>
228 <option value="<?php echo esc_attr( $user_id ); ?>"><?php echo esc_html( $user_name ); ?></option>
229 <?php endforeach; ?>
230 </optgroup>
231 </select>
232 </div>
233 </div>
234 <div class="form-group d-sm-inline-block">
235 <div class="input-group flex-nowrap">
236 <div class="input-group-text">
237 <i class="fa fa-bookmark"></i>
238 </div>
239 <select class="form-control o-select2" data-column="status"
240 data-placeholder="<?php esc_attr_e( 'Status', 'upstream' ); ?>" multiple>
241 <option value="__none__" <?php echo $filter_closed_items ? 'selected' : ''; ?>>
242 <?php
243 esc_attr_e(
244 'None',
245 'upstream'
246 );
247 ?>
248 </option>
249 <optgroup label="<?php esc_attr_e( 'Status', 'upstream' ); ?>">
250 <?php foreach ( $statuses as $up_status ) : ?>
251 <?php
252 $attr = ' ';
253 if ( $filter_closed_items && 'open' === $up_status['type'] ) :
254 $attr .= ' selected';
255 endif;
256 ?>
257 <option
258 value="<?php echo esc_attr( $up_status['id'] ); ?>"<?php echo esc_attr( $attr ); ?>><?php echo esc_html( $up_status['name'] ); ?></option>
259 <?php endforeach; ?>
260 </optgroup>
261 </select>
262 </div>
263 </div>
264 <?php
265 if ( $are_milestones_enabled ) :
266 ?>
267 <div class="form-group d-sm-inline-block">
268 <div class="input-group flex-nowrap">
269 <div class="input-group-text">
270 <i class="fa fa-flag"></i>
271 </div>
272 <select class="form-control o-select2" data-column="milestone"
273 data-placeholder="<?php echo esc_attr( $l['LB_MILESTONE'] ); ?>" multiple>
274 <option value></option>
275 <option value="__none__"><?php esc_html_e( 'None', 'upstream' ); ?></option>
276 <optgroup label="<?php echo esc_attr( upstream_milestone_label_plural() ); ?>">
277 <?php foreach ( $milestones as $milestone ) : ?>
278 <?php $milestone = \UpStream\Factory::get_milestone( $milestone ); ?>
279 <option value="<?php echo esc_attr( $milestone->getId() ); ?>"><?php echo esc_html( $milestone->getName() ); ?></option>
280 <?php endforeach; ?>
281 </optgroup>
282 </select>
283 </div>
284 </div>
285 <?php endif; ?>
286 <div class="form-group d-sm-inline-block">
287 <div class="input-group">
288 <div class="input-group-text">
289 <i class="fa fa-calendar"></i>
290 </div>
291 <input type="text" class="form-control o-datepicker"
292 placeholder="<?php echo esc_attr( $l['LB_START_DATE'] ); ?>"
293 id="tasks-filter-start_date">
294 </div>
295 <input type="hidden" id="tasks-filter-start_date_timestamp" data-column="start_date"
296 data-compare-operator=">=">
297 </div>
298 <div class="form-group d-sm-inline-block">
299 <div class="input-group">
300 <div class="input-group-text">
301 <i class="fa fa-calendar"></i>
302 </div>
303 <input type="text" class="form-control o-datepicker"
304 placeholder="<?php echo esc_attr( $l['LB_END_DATE'] ); ?>" id="tasks-filter-end_date">
305 </div>
306 <input type="hidden" id="tasks-filter-end_date_timestamp" data-column="end_date"
307 data-compare-operator="<=">
308 </div>
309
310 <?php
311 do_action(
312 'upstream:project.tasks.filters',
313 $table_settings,
314 $columns_schema,
315 $project_id
316 );
317 ?>
318 </div>
319 </form>
320 <?php
321 \UpStream\Frontend\upstream_render_table(
322 $table_settings,
323 $columns_schema,
324 $rowset,
325 'task',
326 $project_id
327 );
328 ?>
329 </div>
330 </div>
331 </div>
332 </div>
333 <?php endif; ?>
334