Components can now be re-ordered, closes #165

This commit is contained in:
James Brooks
2015-01-01 13:37:47 +00:00
parent 925818320c
commit 6ab16f98ab
17 changed files with 35878 additions and 44 deletions

View File

@@ -69,6 +69,32 @@ $(function() {
$(this).parents('div.alert').addClass('hide');
});
// Sortable components.
var componentList = document.getElementById("component-list");
new Sortable(componentList, {
group: "omega",
handle: ".drag-handle",
onUpdate: function() {
// Loop each component, setting the order input to the new order.
var $components = $('#component-list .striped-list-item');
$.each($components, function(id) {
// Order should start from 1 now.
$(this).find('input[rel=order]').val(id + 1);
});
// Now POST the form to the internal API.
$.ajax({
async: true,
url: '/dashboard/api/components/order',
type: 'POST',
data: $('form[name=componentList]').serializeObject(),
success: function() {
(new CachetHQ.Notifier).notify('Components updated.', 'success');
}
});
}
});
// Toggle inline component statuses.
$('form.component-inline').on('click', 'input[type=radio]', function() {
var $form = $(this).parents('form');

View File

@@ -19,4 +19,19 @@ class DashAPIController extends Controller
App::abort(500);
}
}
public function postUpdateComponentOrder()
{
$componentData = Input::all();
unset($componentData['component'][0]); // Remove random 0 index.
foreach ($componentData['component'] as $componentId => $order) {
$component = Component::find($componentId);
$component->update([
'order' => $order
]);
}
return $componentData;
}
}

View File

@@ -9,7 +9,7 @@ class DashComponentController extends Controller
*/
public function showComponents()
{
$components = Component::all();
$components = Component::orderBy('order')->orderBy('created_at')->get();
return View::make('dashboard.components.index')->with([
'pageTitle' => 'Components - Dashboard',

View File

@@ -28,8 +28,10 @@ class HomeController extends Controller
*/
public function showIndex()
{
$components = Component::orderBy('order')->orderBy('created_at')->get();
return View::make('index', [
'components' => $this->component->all(),
'components' => $components,
'pageTitle' => Setting::get('app_name')
]);
}

View File

@@ -0,0 +1,34 @@
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class AlterTableComponentsAddOrderColumn extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('components', function(Blueprint $table)
{
$table->tinyInteger('order')->default(0)->after('status');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('components', function(Blueprint $table)
{
$table->dropColumn('order');
});
}
}

View File

@@ -21,6 +21,7 @@ class Component extends Eloquent implements \Dingo\Api\Transformer\Transformable
'user_id',
'tags',
'link',
'order'
];
/**

View File

@@ -40,6 +40,7 @@ Route::group(['before' => 'auth', 'prefix' => 'dashboard'], function () {
// Internal API.
// This should only be used for making requests within the dashboard.
Route::group(['prefix' => 'api'], function () {
Route::post('components/order', 'DashAPIController@postUpdateComponentOrder');
Route::post('components/{component}', 'DashAPIController@postUpdateComponent');
});
});

View File

@@ -12,24 +12,27 @@
</div>
<div class="content-wrapper">
<div class="row">
<div class="col-sm-12 striped-list">
@forelse($components as $component)
<div class='row striped-list-item'>
<div class='col-md-8'>
<strong>{{ $component->name }}</strong> <small>{{ $component->humanStatus }}</small>
@if($component->description)
<p><small>{{ $component->description }}</small></p>
@endif
</div>
<div class='col-md-4 text-right'>
<a href='/dashboard/components/{{ $component->id }}/edit' class='btn btn-default'>Edit</a>
<a href='/dashboard/components/{{ $component->id }}/delete' class='btn btn-danger'>Delete</a>
<form name='componentList'>
<div class="col-sm-12 striped-list" id='component-list'>
@forelse($components as $component)
<div class='row striped-list-item'>
<div class='col-md-8'>
<h4><span class='drag-handle'><i class='ion-drag'></i></span> {{ $component->name }} <small>{{ $component->humanStatus }}</small></h4>
@if($component->description)
<p><small>{{ $component->description }}</small></p>
@endif
</div>
<div class='col-md-4 text-right'>
<a href='/dashboard/components/{{ $component->id }}/edit' class='btn btn-default'>Edit</a>
<a href='/dashboard/components/{{ $component->id }}/delete' class='btn btn-danger'>Delete</a>
</div>
<input type='hidden' rel='order' name='component[{{ $component->id }}]' value='{{ $component->order }}' />
</div>
@empty
<div class='list-group-item text-danger'>You should add a component.</div>
@endforelse
</div>
@empty
<div class='list-group-item text-danger'>You should add a component.</div>
@endforelse
</div>
</form>
</div>
</div>
@stop

View File

@@ -1,6 +1,7 @@
{
"name": "Cachet",
"dependencies": {
"Sortable": "1.0.0",
"bootstrap-sass-official": "3.3.*",
"jquery": "~2.1.1",
"chartjs": "0.2.*",

View File

@@ -39,6 +39,7 @@ elixir(function (mix) {
'bower_components/lodash/dist/lodash.js',
'bower_components/messenger/build/js/messenger.js',
// 'bower_components/chartjs/Chart.min.js',
'bower_components/Sortable/Sortable.js',
'bower_components/jquery-minicolors/jquery.minicolors.js',
'bower_components/jquery-serialize-object/jquery.serialize-object.js',
'js/app.js',

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,4 +1,4 @@
{
"css/all.css": "css/all-84f50550.css",
"js/all.js": "js/all-b4f68abf.js"
"css/all.css": "css/all-c5b65085.css",
"js/all.js": "js/all-337c2216.js"
}