diff --git a/lib/Alchemy/Phrasea/Controller/Prod/Story.php b/lib/Alchemy/Phrasea/Controller/Prod/Story.php index 6bee59b3d4..40f2363161 100644 --- a/lib/Alchemy/Phrasea/Controller/Prod/Story.php +++ b/lib/Alchemy/Phrasea/Controller/Prod/Story.php @@ -219,91 +219,6 @@ class Story implements ControllerProviderInterface return new RedirectResponse('/'); } }); - - $controllers->post( - '/{sbas_id}/{record_id}/attach/' - , function(Application $app, Request $request, $sbas_id, $record_id) - { - $Story = new \record_adapter($sbas_id, $record_id); - - if (!$Story->is_grouping()) - throw new \Exception('You can only attach stories'); - - $user = $app['Core']->getAuthenticatedUser(); - - if (!$user->ACL()->has_access_to_base($Story->get_base_id())) - throw new \Exception_Forbidden('You do not have access to this Story'); - - $em = $app['Core']->getEntityManager(); - /* @var $em \Doctrine\ORM\EntityManager */ - $StoryWZ = new \Entities\StoryWZ(); - $StoryWZ->setUser($user); - $StoryWZ->setRecord($Story); - - $em->persist($StoryWZ); - - $em->flush(); - - $data = array( - 'success' => true - , 'message' => _('Story attached to the WorkZone') - , 'StoryWZ' => array( - 'id' => $StoryWZ->getId() - ) - ); - - if ($request->getRequestFormat() == 'json') - { - - $datas = $app['Core']['Serializer']->serialize($data, 'json'); - - return new Response($datas, 200, array('Content-type' => 'application/json')); - } - else - { - return new RedirectResponse('/{sbas_id}/{record_id}/'); - } - }); - $controllers->post( - '/{sbas_id}/{record_id}/detach/' - , function(Application $app, Request $request, $sbas_id, $record_id) - { - $Story = new \record_adapter($sbas_id, $record_id); - - $user = $app['Core']->getAuthenticatedUser(); - - $em = $app['Core']->getEntityManager(); - - $repository = $em->getRepository('\Entities\StoryWZ'); - - /* @var $repository \Repositories\StoryWZRepository */ - $StoryWZ = $repository->findUserStory($user, $Story); - - if (!$StoryWZ) - { - throw new \Exception_NotFound('Story not found'); - } - $em->remove($StoryWZ); - - $em->flush(); - - $data = array( - 'success' => true - , 'message' => _('Story detached from the WorkZone') - ); - - if ($request->getRequestFormat() == 'json') - { - $datas = $app['Core']['Serializer']->serialize($data, 'json'); - - return new Response($datas, 200, array('Content-type' => 'application/json')); - } - else - { - return new RedirectResponse('/'); - } - }); - // $controllers->post('/{basket_id}/delete/', function(Application $app, Request $request, $basket_id) // { // $em = $app['Core']->getEntityManager(); diff --git a/lib/Alchemy/Phrasea/Controller/Prod/WorkZone.php b/lib/Alchemy/Phrasea/Controller/Prod/WorkZone.php index 0dc38afd19..4edf8ddbd5 100644 --- a/lib/Alchemy/Phrasea/Controller/Prod/WorkZone.php +++ b/lib/Alchemy/Phrasea/Controller/Prod/WorkZone.php @@ -50,6 +50,147 @@ class WorkZone implements ControllerProviderInterface return new Response($twig->render('prod/WorkZone/WorkZone.html.twig', $params)); }); + + $controllers->post( + '/attachStories/' + , function(Application $app, Request $request) + { + + + $user = $app['Core']->getAuthenticatedUser(); + + $em = $app['Core']->getEntityManager(); + /* @var $em \Doctrine\ORM\EntityManager */ + + $StoryWZRepo = $em->getRepository('\Entities\StoryWZ'); + + $alreadyFixed = $done = 0; + + foreach ($request->get('stories') as $element) + { + $element = explode('_', $element); + $Story = new \record_adapter($element[0], $element[1]); + + if (!$Story->is_grouping()) + throw new \Exception('You can only attach stories'); + + if (!$user->ACL()->has_access_to_base($Story->get_base_id())) + throw new \Exception_Forbidden('You do not have access to this Story'); + + + if ($StoryWZRepo->findUserStory($user, $Story)) + { + $alreadyFixed++; + continue; + } + + $StoryWZ = new \Entities\StoryWZ(); + $StoryWZ->setUser($user); + $StoryWZ->setRecord($Story); + + $em->persist($StoryWZ); + $done++; + } + + $em->flush(); + + if ($alreadyFixed === 0) + { + if ($done <= 1) + { + $message = sprintf( + _('%d Story attached to the WorkZone') + , $done + ); + } + else + { + $message = sprintf( + _('%d Stories attached to the WorkZone') + , $done + ); + } + } + else + { + if ($done <= 1) + { + $message = sprintf( + _('%1$d Story attached to the WorkZone, %2$d already attached') + , $done + , $alreadyFixed + ); + } + else + { + $message = sprintf( + _('%1$d Story attached to the WorkZone, %2$d already attached') + , $done + , $alreadyFixed + ); + } + } + + $data = array( + 'success' => true + , 'message' => $message + ); + + if ($request->getRequestFormat() == 'json') + { + + $datas = $app['Core']['Serializer']->serialize($data, 'json'); + + return new Response($datas, 200, array('Content-type' => 'application/json')); + } + else + { + return new RedirectResponse('/{sbas_id}/{record_id}/'); + } + }); + + + $controllers->post( + '/detachStory/{sbas_id}/{record_id}/' + , function(Application $app, Request $request, $sbas_id, $record_id) + { + $Story = new \record_adapter($sbas_id, $record_id); + + $user = $app['Core']->getAuthenticatedUser(); + + $em = $app['Core']->getEntityManager(); + + $repository = $em->getRepository('\Entities\StoryWZ'); + + /* @var $repository \Repositories\StoryWZRepository */ + $StoryWZ = $repository->findUserStory($user, $Story); + + if (!$StoryWZ) + { + throw new \Exception_NotFound('Story not found'); + } + $em->remove($StoryWZ); + + $em->flush(); + + $data = array( + 'success' => true + , 'message' => _('Story detached from the WorkZone') + ); + + if ($request->getRequestFormat() == 'json') + { + $datas = $app['Core']['Serializer']->serialize($data, 'json'); + + return new Response($datas, 200, array('Content-type' => 'application/json')); + } + else + { + return new RedirectResponse('/'); + } + }); + + return $controllers; } diff --git a/templates/web/prod/WorkZone/Macros.twig b/templates/web/prod/WorkZone/Macros.twig index 4fea15f450..f04f6dcd38 100644 --- a/templates/web/prod/WorkZone/Macros.twig +++ b/templates/web/prod/WorkZone/Macros.twig @@ -77,8 +77,10 @@
-
- {% trans 'Re-ordonner' %} +
@@ -130,14 +132,18 @@
-
-
- {% trans 'action::detacher' %} + -
-
- {% trans 'Re-ordonner' %} + diff --git a/www/prod/jquery.Prod.js b/www/prod/jquery.Prod.js index 0447771527..e196b56526 100644 --- a/www/prod/jquery.Prod.js +++ b/www/prod/jquery.Prod.js @@ -5,6 +5,18 @@ $('a.dialog').live('click', function(event){ var $this = $(this); + + + $('#DIALOG').attr('title', $this.attr('title')) + .empty().addClass('loading') + .dialog({ + resizable:false, + closeOnEscape:true, + modal:true, + width:'800', + height:'500' + }) + .dialog('open'); $.ajax({ type: "GET", @@ -14,11 +26,8 @@ }, success: function(data){ - $('#DIALOG').attr('title', $this.attr('title')) - .empty() - .append(data) - .dialog() - .dialog('open'); + $('#DIALOG').removeClass('loading').empty() + .append(data); return; } }); @@ -26,8 +35,6 @@ return false; }); - - }); }()) \ No newline at end of file diff --git a/www/prod/jquery.WorkZone.js b/www/prod/jquery.WorkZone.js index 78e1dd9f1e..501efb09d4 100644 --- a/www/prod/jquery.WorkZone.js +++ b/www/prod/jquery.WorkZone.js @@ -536,38 +536,29 @@ var p4 = p4 || {}; var baskets = {}; - - - - function unFix(el) - { - var id = $(el).attr('id').split('_').slice(1,2).pop(); - $.ajax({ - type: "POST", - url: "/prod/prodFeedBack.php", - data: { - action: "UNFIX", - lst:id - }, - success: function(data){ - $('#SSTT_'+id).next().droppable('destroy').remove(); - $('#SSTT_'+id).droppable('destroy').remove(); - } - }); - } function fix() { $.ajax({ type: "POST", - url: "/prod/prodFeedBack.php", + url: "/prod/WorkZone/attachStories/", + data:{stories:p4.Results.Selection.get()}, dataType: "json", - data: { - action: "FIX", - lst:p4.Result.Selection.serialize() - }, success: function(data){ - if(data.length>0) - refreshBaskets(data.pop()); + humane.info(data.message); + p4.WorkZone.refresh(); + } + }); + } + + function unfix(link) + { + $.ajax({ + type: "POST", + url: link, + dataType: "json", + success: function(data){ + humane.info(data.message); + p4.WorkZone.refresh(); } }); } @@ -575,6 +566,12 @@ var p4 = p4 || {}; $(document).ready(function(){ activeBaskets(); + $('#baskets a.story_unfix').live('click', function(){ + unfix($(this).attr('href')); + + return false; + }); + p4.WorkZone = { 'Selection':new Selectable({selector : '.CHIM', container:$('#baskets')}), 'refresh':refreshBaskets, diff --git a/www/prod/page0.js b/www/prod/page0.js index a575caf211..875a0bf108 100644 --- a/www/prod/page0.js +++ b/www/prod/page0.js @@ -490,6 +490,11 @@ function afterSearch() cursorAt: { top:-10, left:-20 + }, + start:function(event, ui) + { + if(!$(this).hasClass('selected')) + return false; } }); linearize(); @@ -3152,235 +3157,6 @@ function reverse_order() }); } - -function save_order() -{ - var ssel_id = $('#reorder_box form[name=save] input[name=ssel_id]').val(); - var forms = $('#reorder_box .diapo form'); - - var n = 1; - var datas_order = {}; - - forms.each(function(i,el){ - var val = $('input[name=id]',el).val()+' '; - var base_id = $('input[name=base_id]',el).val(); - var record_id = $('input[name=record_id]',el).val(); - - if(val == '') - return; - datas_order[val] = { - order:n, - base_id : base_id, - record_id : record_id - }; - n++; - }); - - var options = { - ssel_id : ssel_id, - value : JSON.stringify(datas_order), - action : 'SAVE_ORDER_DATAS' - }; - - $.post("prodFeedBack.php" - , options - , function(data){ - return p4.WorkZone.refresh('current'); - return; - }); - - -} - -function reorder(ssel_id) -{ - var buttons = {}; - - buttons[language.valider] = function(){ - save_order(); - $("#reorder_dialog").dialog('close'); - return; - }; - - $("#reorder_dialog") - .dialog({ - autoOpen:false, - closeOnEscape:true, - resizable:false, - draggable:false, - modal:true, - buttons:buttons, - width:700, - height:500, - overlay: { - backgroundColor: '#000', - opacity: 0.7 - }, - close:function(){} - }).dialog('open'); - - $.get("/prod/baskets/"+ssel_id+"/reorder/" - , function(data){ - $('#reorder_box').removeClass('loading'); - var cont = $("#reorder_box"); - cont.empty().append(data) - .sortable({ - appendTo : $("#reorder_box"), - 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',cont); - - selected.each(function(i,n){ - $(n).attr('position',i); - }); - - var n = selected.length - 1; - - $('.selected:visible', cont).hide(); - - while(n > 0) - { - $('
').insertAfter($('.diapo.ui-sortable-placeholder', cont)); - n--; - } - }, - stop:function(event, ui){ - - $('.diapo.ui-sortable-placeholderfollow', cont).remove(); - - var main_id = $(ui.item[0]).attr('id'); - - var selected = $('.selected',cont); - 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', cont).remove(); - - var n = $('.selected',cont).length - 1 ; - while(n > 0) - { - $('
').insertAfter($('.diapo.ui-sortable-placeholder', cont)); - n--; - } - } - - }).disableSelection(); - - $('.diapo', cont).bind('mousedown',function(event){ - if(!$(this).hasClass('selected') && !is_ctrl_key(event) && !is_shift_key(event)) - { - $('.diapo.selected', cont).removeClass('selected'); - $('.diapo.last_selected', cont).removeClass('last_selected'); - $(this).addClass('last_selected selected'); - } - }); - - $('.diapo', cont).bind('click',function(event){ - if(is_ctrl_key(event)) - { - if($(this).hasClass('selected')) - { - $(this).removeClass('selected'); - } - else - { - $(this).addClass('selected'); - } - } - else - { - if(is_shift_key(event) && $('.diapo.last_selected', cont).length!=0) - { - var lst = $('.diapo', cont); - var index1 = $.inArray($('.diapo.last_selected', cont)[0],lst); - var index2 = $.inArray($(this)[0],lst); - - if(index2