Fix Basket/Story sorting

This commit is contained in:
Romain Neutron
2012-02-23 14:47:56 +01:00
parent 1f578810f8
commit 906a26d11d
7 changed files with 1055 additions and 656 deletions

View File

@@ -278,6 +278,48 @@ class Basket implements ControllerProviderInterface
); );
})->assert('basket_id', '\d+'); })->assert('basket_id', '\d+');
$controllers->post(
'/{basket_id}/reorder/'
, function(Application $app, $basket_id)
{
$ret = array('success' => false, 'message' => _('An error occured'));
try
{
/* @var $em \Doctrine\ORM\EntityManager */
$em = $app['Core']->getEntityManager();
$basket = $em->getRepository('\Entities\Basket')
->findUserBasket($basket_id, $app['Core']->getAuthenticatedUser(), true);
$order = $app['request']->get('element');
/* @var $basket \Entities\Basket */
foreach ($basket->getElements() as $basketElement)
{
if (isset($order[$basketElement->getId()]))
{
$basketElement->setOrd($order[$basketElement->getId()]);
$em->merge($basketElement);
}
}
$em->flush();
$ret = array('success' => true, 'message' => _('Basket updated'));
}
catch (\Exception $e)
{
}
$Serializer = $app['Core']['Serializer'];
return new Response($Serializer->serialize($ret, 'json'), 200, array('Content-type' => 'application/json'));
})->assert('basket_id', '\d+');
/** /**
* Toggle the status of a Basket * Toggle the status of a Basket
* *

View File

@@ -20,7 +20,8 @@ use Symfony\Component\HttpFoundation\Request,
Symfony\Component\HttpKernel\Exception\HttpException, Symfony\Component\HttpKernel\Exception\HttpException,
Symfony\Component\HttpKernel\Exception\NotFoundHttpException; Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Alchemy\Phrasea\RouteProcessor\Basket as BasketRoute, use Alchemy\Phrasea\RouteProcessor\Basket as BasketRoute,
Alchemy\Phrasea\Helper; Alchemy\Phrasea\Helper,
Alchemy\Phrasea\Controller\Exception as ControllerException;
/** /**
* *
@@ -226,108 +227,94 @@ class Story implements ControllerProviderInterface
->assert('child_sbas_id', '\d+') ->assert('child_sbas_id', '\d+')
->assert('child_record_id', '\d+'); ->assert('child_record_id', '\d+');
// $controllers->post('/{basket_id}/delete/', function(Application $app, Request $request, $basket_id)
// { /**
// $em = $app['Core']->getEntityManager(); * Get the Basket reorder form
// */
// $basket = $em->getRepository('\Entities\Basket') $controllers->get(
// ->findUserBasket($basket_id, $app['Core']->getAuthenticatedUser()); '/{sbas_id}/{record_id}/reorder/'
// , function(Application $app, $sbas_id, $record_id)
// $em->remove($basket); {
// $em->flush(); /* @var $em \Doctrine\ORM\EntityManager */
// $em = $app['Core']->getEntityManager();
// $data = array(
// 'success' => true $story = new \record_adapter($sbas_id, $record_id);
// , 'message' => _('Basket has been deleted')
// ); if (!$story->is_grouping())
// {
// if ($request->getRequestFormat() == 'json') throw new \Exception('This is not a story');
// { }
//
// $datas = $app['Core']['Serializer']->serialize($data, 'json'); /* @var $twig \Twig_Environment */
// $twig = $app['Core']->getTwig();
// return new Response($datas, 200, array('Content-type' => 'application/json'));
// } return new Response(
// else $twig->render(
// { 'prod/Story/Reorder.html.twig'
// return new RedirectResponse('/'); , array('story' => $story)
// } )
// }); );
// })
// ->assert('sbas_id', '\d+')
// ->assert('record_id', '\d+');
//
// $controllers->post('/{basket_id}/update/', function(Application $app, Request $request, $basket_id)
// { $controllers->post(
// $em = $app['Core']->getEntityManager(); '/{sbas_id}/{record_id}/reorder/'
// , function(Application $app, $sbas_id, $record_id)
// $basket = $em->getRepository('\Entities\Basket') {
// ->findUserBasket($basket_id, $app['Core']->getAuthenticatedUser()); $ret = array('success' => false, 'message' => _('An error occured'));
// try
// $basket->setName($request->get('name')); {
// $basket->setDescription($request->get('description')); $user = $app['Core']->getAuthenticatedUser();
// /* @var $user \User_Adapter */
// $em->merge($basket);
// $em->flush(); $story = new \record_adapter($sbas_id, $record_id);
//
// $data = array( if (!$story->is_grouping())
// 'success' => true {
// , 'message' => _('Basket has been updated') throw new \Exception('This is not a story');
// , 'basket' => array('id' => $basket->getId()) }
// );
// if (!$user->ACL()->has_right_on_base($story->get_base_id(), 'canmodifrecord'))
// if ($request->getRequestFormat() == 'json') {
// { throw new ControllerException(_('You can not edit this story'));
// }
// $datas = $app['Core']['Serializer']->serialize($data, 'json');
// $sql = 'UPDATE regroup SET ord = :ord
// return new Response($datas, 200, array('Content-type' => 'application/json')); WHERE rid_parent = :parent_id AND rid_child = :children_id';
// } $stmt = $story->get_databox()->get_connection()->prepare($sql);
// else
// { foreach ($app['request']->get('element') as $record_id => $ord)
// return new RedirectResponse('/'); {
// } $params = array(
// }); ':ord' => $ord,
// ':parent_id' => $story->get_record_id(),
// ':children_id' => $record_id
// $controllers->get('/{basket_id}/update/', function(Application $app, $basket_id) );
// { $stmt->execute($params);
// /* @var $em \Doctrine\ORM\EntityManager */ }
// $em = $app['Core']->getEntityManager();
// $stmt->closeCursor();
// $basket = $em->getRepository('\Entities\Basket')
// ->findUserBasket($basket_id, $app['Core']->getAuthenticatedUser()); $ret = array('success' => true, 'message' => _('Story updated'));
// }
// $twig = new \supertwig(); catch (ControllerException $e)
// {
// return new Response( $ret = array('success' => false, 'message' => $e->getMessage());
// $twig->render( }
// 'prod/Baskets/Update.html.twig' catch (\Exception $e)
// , array('basket' => $basket) {
// )
// ); }
// });
// $Serializer = $app['Core']['Serializer'];
//
// $controllers->get( return new Response($Serializer->serialize($ret, 'json'), 200, array('Content-type' => 'application/json'));
// '/{basket_id}/reorder/' })
// , function(Application $app, $basket_id) ->assert('sbas_id', '\d+')
// { ->assert('record_id', '\d+');
// /* @var $em \Doctrine\ORM\EntityManager */
// $em = $app['Core']->getEntityManager();
//
// $basket = $em->getRepository('\Entities\Basket')
// ->findUserBasket($basket_id, $app['Core']->getAuthenticatedUser());
//
// $twig = new \supertwig();
//
// return new Response(
// $twig->render(
// 'prod/Baskets/Reorder.html.twig'
// , array('basket' => $basket)
// )
// );
// });
return $controllers; return $controllers;
} }

View File

@@ -47,11 +47,11 @@ class BasketRepository extends EntityRepository
if ($sort == 'date') if ($sort == 'date')
{ {
$dql .= ' ORDER BY b.created DESC'; $dql .= ' ORDER BY b.created DESC, e.ord ASC';
} }
elseif ($sort == 'name') elseif ($sort == 'name')
{ {
$dql .= ' ORDER BY b.name ASC'; $dql .= ' ORDER BY b.name ASC, e.ord ASC';
} }
$query = $this->_em->createQuery($dql); $query = $this->_em->createQuery($dql);
@@ -81,7 +81,8 @@ class BasketRepository extends EntityRepository
(b.usr_id = :usr_id_owner AND b.is_read = false) (b.usr_id = :usr_id_owner AND b.is_read = false)
OR (b.usr_id != :usr_id_ownertwo AND p.usr_id = :usr_id_participant OR (b.usr_id != :usr_id_ownertwo AND p.usr_id = :usr_id_participant
AND p.is_aware = false) AND p.is_aware = false)
)'; )
ORDER BY e.ord ASC';
$params = array( $params = array(
'usr_id_owner' => $user->get_id(), 'usr_id_owner' => $user->get_id(),
@@ -119,11 +120,11 @@ class BasketRepository extends EntityRepository
if ($sort == 'date') if ($sort == 'date')
{ {
$dql .= ' ORDER BY b.created DESC'; $dql .= ' ORDER BY b.created DESC, e.ord ASC';
} }
elseif ($sort == 'name') elseif ($sort == 'name')
{ {
$dql .= ' ORDER BY b.name ASC'; $dql .= ' ORDER BY b.name ASC, e.ord ASC';
} }
$query = $this->_em->createQuery($dql); $query = $this->_em->createQuery($dql);
@@ -151,7 +152,8 @@ class BasketRepository extends EntityRepository
LEFT JOIN e.validation_datas v LEFT JOIN e.validation_datas v
LEFT JOIN b.validation s LEFT JOIN b.validation s
LEFT JOIN s.participants p LEFT JOIN s.participants p
WHERE b.id = :basket_id'; WHERE b.id = :basket_id
ORDER BY e.ord ASC';
$query = $this->_em->createQuery($dql); $query = $this->_em->createQuery($dql);
$query->setParameters(array('basket_id' => $basket_id)); $query->setParameters(array('basket_id' => $basket_id));
@@ -199,7 +201,8 @@ class BasketRepository extends EntityRepository
FROM Entities\Basket b FROM Entities\Basket b
JOIN b.elements e JOIN b.elements e
WHERE e.record_id = :record_id AND e.sbas_id = e.sbas_id WHERE e.record_id = :record_id AND e.sbas_id = e.sbas_id
AND b.usr_id = :usr_id'; AND b.usr_id = :usr_id
ORDER BY e.ord ASC';
$params = array( $params = array(
'record_id' => $record->get_record_id(), 'record_id' => $record->get_record_id(),
@@ -282,6 +285,8 @@ class BasketRepository extends EntityRepository
$params['description'] = '%' . $query . '%'; $params['description'] = '%' . $query . '%';
} }
$dql .= ' ORDER BY e.ord ASC';
$query = $this->_em->createQuery($dql); $query = $this->_em->createQuery($dql);
$query->setParameters($params); $query->setParameters($params);

View File

@@ -1,5 +1,15 @@
{% import 'common/thumbnail.html' as thumbnail %} {% import 'common/thumbnail.html' as thumbnail %}
<div id="reorder_options" class="PNB" style="height:30px;bottom:auto;">
<span>{% trans 'Reordonner automatiquement' %}</span>
<select id="auto_order">
<option value="">{% trans 'Choisir' %}</option>
<option value="default">{% trans 'Re-initialiser' %}</option>
<option value="title">{% trans 'Titre' %}</option>
</select>
<button type="button" class="autoorder">{% trans 'Re-ordonner' %}</button>
<button type="button" class="reverseorder">{% trans 'Inverser' %}</button>
</div>
<div style="top:30px;overflow:auto;" id="reorder_box" class="PNB">
<div class="elements"> <div class="elements">
{% for element in basket.getElements() %} {% for element in basket.getElements() %}
<div id="ORDER_{{ element.getId() }}" class="CHIM diapo" style="height:130px;overflow:hidden;"> <div id="ORDER_{{ element.getId() }}" class="CHIM diapo" style="height:130px;overflow:hidden;">
@@ -21,13 +31,129 @@
{% endfor %} {% endfor %}
<button>{% trans 'boutton::valider' %}</button> <button>{% trans 'boutton::valider' %}</button>
</form> </form>
</div>
<script type="text/javascript"> <script type="text/javascript">
$(document).ready(function(){ $(document).ready(function(){
var container = $('#DIALOG'); var container = p4.Dialog.get(1).getDomElement();
$('button.autoorder', container).bind('click', function(){
autoorder();
return false;
});
$('button.reverseorder', container).bind('click', function(){
reverse_order();
return false;
});
function autoorder()
{
var val = $.trim($('#auto_order').val());
if(val == '')
return;
var sorter = {};
$('#reorder_box .diapo form').each(function(i,n){
var id = $('input[name=id]',n).val();
switch(val)
{
case 'title':
default:
var data = $('input[name=title]',n).val();
break;
case 'default':
var data = $('input[name=default]',n).val();
break;
}
sorter[id] = data;
});
var data_type = 'string';
switch(val)
{
case 'default':
var data_type = 'integer';
break;
}
sorter = arraySortByValue(sorter, data_type);
var last_moved = false;
for(i in sorter)
{
var elem = $('#ORDER_'+i);
if(last_moved)
{
elem.insertAfter(last_moved);
}
else
{
$('#reorder_box .elements').prepend(elem);
}
last_moved = elem;
}
}
function arraySortByValue(datas, data_type) {
var tmp = new Array();
for (i in datas) {
tmp.push({
v: i,
c: datas[i].toUpperCase(),
o: datas[i]
});
}
switch(data_type)
{
case 'string':
tmp.sort(function (x, y) {
return y.c < x.c;
});
break;
case 'integer':
tmp.sort(function (x, y) {
return parseInt(y.c) < parseInt(x.c);
});
break;
}
var out = {};
for (i in tmp) {
out[tmp[i].v] = tmp[i].o;
}
return out;
}
function reverse_order()
{
var elems = $('#reorder_box .diapo');
var last_moved = false;
elems.each(function(i,n){
var elem = $(n);
if(last_moved)
{
elem.insertBefore(last_moved);
}
else
{
$('#reorder_box .elements').append(elem);
}
last_moved = elem;
});
}
$('.elements', container).sortable({ $('.elements', container).sortable({
appendTo : container, appendTo : container,
@@ -118,17 +244,24 @@
}).disableSelection(); }).disableSelection();
var OrderSelection = new Selectable($('#DIALOG .elements'), { var OrderSelection = new Selectable($('.elements', container), {
selector : '.CHIM' selector : '.CHIM'
}); });
$('#DIALOG form[name="reorder"]').bind('submit', function(event){ $('form[name="reorder"]', container).bind('submit', function(event){
//$this.SetLoader(true); //$this.SetLoader(true);
var $form = $(this); var $form = $(this);
$('.elements form', container).each(function(i, el){
var id = $('input[name="id"]', $(el)).val();
$('input[name="element[' + id + ']"]', $form).val(i+1);
});
$.ajax({ $.ajax({
type: $form.attr('method'), type: $form.attr('method'),
url: $form.attr('action'), url: $form.attr('action'),
@@ -138,9 +271,12 @@
}, },
success: function(data){ success: function(data){
if(!data.success)
{
alert(data.message);
}
p4.WorkZone.refresh('current'); p4.WorkZone.refresh('current');
$('#DIALOG').dialog('close').empty(); p4.Dialog.get(1).Close();
return; return;
}, },

View File

@@ -0,0 +1,294 @@
{% import 'common/thumbnail.html' as thumbnail %}
<div id="reorder_options" class="PNB" style="height:30px;bottom:auto;">
<span>{% trans 'Reordonner automatiquement' %}</span>
<select id="auto_order">
<option value="">{% trans 'Choisir' %}</option>
<option value="default">{% trans 'Re-initialiser' %}</option>
<option value="title">{% trans 'Titre' %}</option>
</select>
<button type="button" class="autoorder">{% trans 'Re-ordonner' %}</button>
<button type="button" class="reverseorder">{% trans 'Inverser' %}</button>
</div>
<div style="top:30px;overflow:auto;" id="reorder_box" class="PNB">
<div class="elements">
{% for element in story.get_children() %}
<div id="ORDER_{{ element.get_record_id() }}" class="CHIM diapo" style="height:130px;overflow:hidden;">
<div class="title" title="{{ element.get_title() }}" style="position:relative;z-index:1200;height:30px;overflow:visible;text-align:center;">
<span>{{ element.get_title() }}</span>
{{ thumbnail.format(element.get_thumbnail(), 80, 80, '', session) }}
<form style="display:none;">
<input type="hidden" name="id" value="{{ element.get_record_id() }}"/>
<input type="hidden" name="title" value="{{ element.get_title() }}"/>
<input type="hidden" name="default" value="{{ element.get_number() }}"/>
</form>
</div>
</div>
{% endfor %}
</div>
<form name="reorder" method="POST" action="/prod/story/{{story.get_sbas_id() }}/{{story.get_record_id() }}/reorder/">
{% for element in story.get_children() %}
<input type="hidden" name="element[{{ element.get_record_id() }}]" value="{{ element.get_number() }}"/>
{% endfor %}
<button>{% trans 'boutton::valider' %}</button>
</form>
</div>
<script type="text/javascript">
$(document).ready(function(){
var container = p4.Dialog.get(1).getDomElement();
$('button.autoorder', container).bind('click', function(){
autoorder();
return false;
});
$('button.reverseorder', container).bind('click', function(){
reverse_order();
return false;
});
function autoorder()
{
var val = $.trim($('#auto_order').val());
if(val == '')
return;
var sorter = {};
$('#reorder_box .diapo form').each(function(i,n){
var id = $('input[name=id]',n).val();
switch(val)
{
case 'title':
default:
var data = $('input[name=title]',n).val();
break;
case 'default':
var data = $('input[name=default]',n).val();
break;
}
sorter[id] = data;
});
var data_type = 'string';
switch(val)
{
case 'default':
var data_type = 'integer';
break;
}
sorter = arraySortByValue(sorter, data_type);
var last_moved = false;
for(i in sorter)
{
var elem = $('#ORDER_'+i);
if(last_moved)
{
elem.insertAfter(last_moved);
}
else
{
$('#reorder_box .elements').prepend(elem);
}
last_moved = elem;
}
}
function arraySortByValue(datas, data_type) {
var tmp = new Array();
for (i in datas) {
tmp.push({
v: i,
c: datas[i].toUpperCase(),
o: datas[i]
});
}
switch(data_type)
{
case 'string':
tmp.sort(function (x, y) {
return y.c < x.c;
});
break;
case 'integer':
tmp.sort(function (x, y) {
return parseInt(y.c) < parseInt(x.c);
});
break;
}
var out = {};
for (i in tmp) {
out[tmp[i].v] = tmp[i].o;
}
return out;
}
function reverse_order()
{
var elems = $('#reorder_box .diapo');
var last_moved = false;
elems.each(function(i,n){
var elem = $(n);
if(last_moved)
{
elem.insertBefore(last_moved);
}
else
{
$('#reorder_box .elements').append(elem);
}
last_moved = elem;
});
}
$('.elements', container).sortable({
appendTo : container,
placeholder: 'diapo ui-sortable-placeholder',
distance:20,
cursorAt: {
top:10,
left:-20
},
items:'div.diapo',
scroll:true,
scrollSensitivity:40,
scrollSpeed:30,
start:function(event, ui){
var selected = $('.selected',container);
selected.each(function(i,n){
$(n).attr('position',i);
});
var n = selected.length - 1;
$('.selected:visible', container).hide();
while(n > 0)
{
$('<div style="height:130px;" class="diapo ui-sortable-placeholderfollow"></div>').insertAfter($('.diapo.ui-sortable-placeholder', cont));
n--;
}
},
stop:function(event, ui){
$('.diapo.ui-sortable-placeholderfollow', container).remove();
var main_id = $(ui.item[0]).attr('id');
var selected = $('.selected',container);
var sorter = new Array();
selected.each(function(i,n){
var position = parseInt($(n).attr('position'));
if(position !== '')
{
sorter[position] = $(n);
}
var id = $(n).attr('id');
if(id == main_id)
{
return;
}
});
var before = true;
var last_moved = $(ui.item[0]);
$(sorter).each(function(i,n){
$(n).show().removeAttr('position');
if($(n).attr('id') == main_id)
{
before = false;
}
else
{
if(before)
$(n).insertBefore($(ui.item[0]));
else
$(n).insertAfter($(last_moved));
}
last_moved = sorter[i];
});
},
change:function(){
$('.diapo.ui-sortable-placeholderfollow', container).remove();
var n = OrderSelection.length() - 1 ;
while(n > 0)
{
$('<div style="height:130px;" class="diapo ui-sortable-placeholderfollow"></div>').insertAfter($('.diapo.ui-sortable-placeholder', container));
n--;
}
}
}).disableSelection();
var OrderSelection = new Selectable($('.elements', container), {
selector : '.CHIM'
});
$('form[name="reorder"]', container).bind('submit', function(event){
//$this.SetLoader(true);
var $form = $(this);
$('.elements form', container).each(function(i, el){
var id = $('input[name="id"]', $(el)).val();
$('input[name="element[' + id + ']"]', $form).val(i+1);
});
$.ajax({
type: $form.attr('method'),
url: $form.attr('action'),
data: $form.serializeArray(),
dataType: 'json',
beforeSend:function(){
},
success: function(data){
if(!data.success)
{
alert(data.message);
}
p4.WorkZone.refresh('current', null, false, 'story');
p4.Dialog.get(1).Close();
return;
},
error: function(){
},
timeout: function(){
}
});
return false;
});
});
</script>

View File

@@ -1091,18 +1091,6 @@
</form> </form>
<div id="dialog_dwnl" title="{% trans 'action : exporter' %}" style="display:none;"></div> <div id="dialog_dwnl" title="{% trans 'action : exporter' %}" style="display:none;"></div>
<div title="{% trans 'Re-ordonner' %}" id="reorder_dialog" style="position:relative;overflow:hidden;">
<div id="reorder_options" class="PNB" style="height:30px;bottom:auto;">
<span>{% trans 'Reordonner automatiquement' %}</span>
<select id="auto_order">
<option value="">{% trans 'Choisir' %}</option>
<option value="default">{% trans 'Re-initialiser' %}</option>
<option value="title">{% trans 'Titre' %}</option>
</select>
<input type="button" onclick="autoorder();return false;" value="{% trans 'Re-ordonner' %}"/>
<input type="button" onclick="reverse_order();return false;" value="{% trans 'Inverser' %}" style="float:right;"/></div>
<div style="top:30px;overflow:auto;" id="reorder_box" class="PNB loading"></div>
</div>
<script type="text/javascript"> <script type="text/javascript">
{% include "prod/thesaurus.js" %} {% include "prod/thesaurus.js" %}
</script> </script>

View File

@@ -3083,59 +3083,6 @@ function autoorder()
} }
function arraySortByValue(datas, data_type) {
var tmp = new Array();
for (i in datas) {
tmp.push({
v: i,
c: datas[i].toUpperCase(),
o: datas[i]
});
}
switch(data_type)
{
case 'string':
tmp.sort(function (x, y) {
return y.c < x.c;
});
break;
case 'integer':
tmp.sort(function (x, y) {
return parseInt(y.c) < parseInt(x.c);
});
break;
}
var out = new Array();
for (i in tmp) {
out[tmp[i].v] = tmp[i].o;
}
return out;
}
function reverse_order()
{
var elems = $('#reorder_box .diapo');
var last_moved = false;
elems.each(function(i,n){
var elem = $(n);
if(last_moved)
{
elem.insertBefore(last_moved);
}
else
{
$('#reorder_box').append(elem);
}
last_moved = elem;
});
}
function set_up_feed_box(data) function set_up_feed_box(data)
{ {
var $feed_box = $('#modal_feed'); var $feed_box = $('#modal_feed');