mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-07-08 08:14:44 -04:00
Working on kanban
This commit is contained in:
parent
13cf166eeb
commit
4b27192ed8
@ -5,6 +5,7 @@ namespace App\Http\Controllers;
|
|||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use App\Http\Requests;
|
use App\Http\Requests;
|
||||||
use App\Models\Task;
|
use App\Models\Task;
|
||||||
|
use App\Models\TaskStatus;
|
||||||
use App\Models\Client;
|
use App\Models\Client;
|
||||||
use App\Models\Project;
|
use App\Models\Project;
|
||||||
|
|
||||||
@ -21,9 +22,10 @@ class TimeTrackerController extends Controller
|
|||||||
|
|
||||||
$data = [
|
$data = [
|
||||||
'title' => trans('texts.time_tracker'),
|
'title' => trans('texts.time_tracker'),
|
||||||
'tasks' => Task::scope()->with('project', 'client.contacts')->whereNull('invoice_id')->get(),
|
'tasks' => Task::scope()->with('project', 'client.contacts', 'task_status')->whereNull('invoice_id')->get(),
|
||||||
'clients' => Client::scope()->with('contacts')->orderBy('name')->get(),
|
'clients' => Client::scope()->with('contacts')->orderBy('name')->get(),
|
||||||
'projects' => Project::scope()->with('client.contacts')->orderBy('name')->get(),
|
'projects' => Project::scope()->with('client.contacts')->orderBy('name')->get(),
|
||||||
|
'statuses' => TaskStatus::scope()->orderBy('sort_order')->get(),
|
||||||
'account' => $account,
|
'account' => $account,
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@ -165,7 +165,7 @@
|
|||||||
|
|
||||||
<!-- Navbar Filter -->
|
<!-- Navbar Filter -->
|
||||||
<div class="input-group input-group-lg">
|
<div class="input-group input-group-lg">
|
||||||
<span class="input-group-addon" style="width:1%;" data-bind="click: onFilterClick, style: { 'background-color': filterState() != 'all' ? '#ffffaa' : '' }" title="{{ trans('texts.filter_sort') }}"><span class="glyphicon glyphicon-filter"></span></span>
|
<span class="input-group-addon" style="width:1%;" data-bind="click: onFilterClick, style: { 'background-color': (filterState() != 'all' || filterStatusId() != '') ? '#ffffaa' : '' }" title="{{ trans('texts.filter_sort') }}"><span class="glyphicon glyphicon-filter"></span></span>
|
||||||
<input id="search" type="search" class="form-control search" autocomplete="off" autofocus="autofocus"
|
<input id="search" type="search" class="form-control search" autocomplete="off" autofocus="autofocus"
|
||||||
data-bind="event: { focus: onFilterFocus, input: onFilterChanged, keypress: onFilterKeyPress }, value: filter, valueUpdate: 'afterkeydown', attr: {placeholder: placeholder, style: filterStyle, disabled: selectedTask().isChanged }">
|
data-bind="event: { focus: onFilterFocus, input: onFilterChanged, keypress: onFilterKeyPress }, value: filter, valueUpdate: 'afterkeydown', attr: {placeholder: placeholder, style: filterStyle, disabled: selectedTask().isChanged }">
|
||||||
<span class="input-group-addon" style="width:1%;" data-bind="click: onClearClick, visible: filter()" title="{{ trans('texts.clear') }}">
|
<span class="input-group-addon" style="width:1%;" data-bind="click: onClearClick, visible: filter()" title="{{ trans('texts.clear') }}">
|
||||||
@ -307,7 +307,16 @@
|
|||||||
<div class="panel panel-default">
|
<div class="panel panel-default">
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
<div class="row" xstyle="padding-bottom:22px;">
|
<div class="row" xstyle="padding-bottom:22px;">
|
||||||
<div class="col-md-12">
|
@if ($statuses->count())
|
||||||
|
<div class="col-md-6">
|
||||||
|
{!! Former::select('filter_status')
|
||||||
|
->label('status')
|
||||||
|
->addOption(trans('texts.all'), '')
|
||||||
|
->fromQuery($statuses, 'name', 'public_id')
|
||||||
|
->data_bind('value: filterStatusId') !!}
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
<div class="col-md-{{ $statuses->count() ? '6' : '12' }}">
|
||||||
{!! Former::select('filter_state')
|
{!! Former::select('filter_state')
|
||||||
->label('filter')
|
->label('filter')
|
||||||
->addOption(trans('texts.all'), 'all')
|
->addOption(trans('texts.all'), 'all')
|
||||||
|
@ -187,6 +187,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
self.filterState = ko.observable('all');
|
self.filterState = ko.observable('all');
|
||||||
|
self.filterStatusId = ko.observable(false);
|
||||||
self.sortField = ko.observable(defaultSortField);
|
self.sortField = ko.observable(defaultSortField);
|
||||||
self.sortDirection = ko.observable(defaultSortDirection);
|
self.sortDirection = ko.observable(defaultSortDirection);
|
||||||
|
|
||||||
@ -519,7 +520,7 @@
|
|||||||
var tasks = self.tasks();
|
var tasks = self.tasks();
|
||||||
|
|
||||||
var filtered = ko.utils.arrayFilter(tasks, function(task) {
|
var filtered = ko.utils.arrayFilter(tasks, function(task) {
|
||||||
return task.matchesFilter(self.filter(), self.filterState());
|
return task.matchesFilter(self.filter(), self.filterState(), self.filterStatusId());
|
||||||
});
|
});
|
||||||
|
|
||||||
if (! self.filter() || filtered.length > 0) {
|
if (! self.filter() || filtered.length > 0) {
|
||||||
@ -602,6 +603,7 @@
|
|||||||
self.project = ko.observable();
|
self.project = ko.observable();
|
||||||
self.isHovered = ko.observable(false);
|
self.isHovered = ko.observable(false);
|
||||||
self.created_at = ko.observable(moment.utc().format('YYYY-MM-DD HH:mm:ss'));
|
self.created_at = ko.observable(moment.utc().format('YYYY-MM-DD HH:mm:ss'));
|
||||||
|
self.task_status_id = ko.observable();
|
||||||
|
|
||||||
self.mapping = {
|
self.mapping = {
|
||||||
'client': {
|
'client': {
|
||||||
@ -768,6 +770,9 @@
|
|||||||
if (! self.isRunning()) {
|
if (! self.isRunning()) {
|
||||||
self.addTime();
|
self.addTime();
|
||||||
}
|
}
|
||||||
|
if (data.task_status) {
|
||||||
|
self.task_status_id(data.task_status.public_id);
|
||||||
|
}
|
||||||
|
|
||||||
// Trigger isChanged to update
|
// Trigger isChanged to update
|
||||||
self.client_id.valueHasMutated();
|
self.client_id.valueHasMutated();
|
||||||
@ -928,7 +933,7 @@
|
|||||||
return times;
|
return times;
|
||||||
}
|
}
|
||||||
|
|
||||||
self.matchesFilter = function(filter, filterState) {
|
self.matchesFilter = function(filter, filterState, filterStatusId) {
|
||||||
if (filter) {
|
if (filter) {
|
||||||
filter = model.filter().toLowerCase();
|
filter = model.filter().toLowerCase();
|
||||||
var parts = filter.split(' ');
|
var parts = filter.split(' ');
|
||||||
@ -964,6 +969,12 @@
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (filterStatusId) {
|
||||||
|
if (self.task_status_id() != filterStatusId) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user