Sortieren von Einheiten auf Drag-n-Drop & AJAX mittels jQuery UI Sortable umgestellt
authorMoritz Bunkus <m.bunkus@linet-services.de>
Wed, 11 May 2011 08:06:06 +0000 (10:06 +0200)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Wed, 11 May 2011 08:21:23 +0000 (10:21 +0200)
SL/AM.pm
SL/Controller/Unit.pm [new file with mode: 0644]
bin/mozilla/am.pl
image/updown.png [new file with mode: 0644]
locale/de/all
templates/webpages/am/edit_units.html

index a4db439..445abd2 100644 (file)
--- a/SL/AM.pm
+++ b/SL/AM.pm
@@ -2007,43 +2007,6 @@ sub save_units {
   $main::lxdebug->leave_sub();
 }
 
-sub swap_units {
-  $main::lxdebug->enter_sub();
-
-  my ($self, $myconfig, $form, $dir, $name_1) = @_;
-
-  my $dbh = $form->dbconnect_noauto($myconfig);
-
-  my $query;
-
-  $query = qq|SELECT sortkey FROM units WHERE name = ?|;
-  my ($sortkey_1) = selectrow_query($form, $dbh, $query, $name_1);
-
-  $query =
-    qq|SELECT sortkey FROM units | .
-    qq|WHERE sortkey | . ($dir eq "down" ? ">" : "<") . qq| ? | .
-    qq|ORDER BY sortkey | . ($dir eq "down" ? "ASC" : "DESC") . qq| LIMIT 1|;
-  my ($sortkey_2) = selectrow_query($form, $dbh, $query, $sortkey_1);
-
-  if (defined($sortkey_1)) {
-    $query = qq|SELECT name FROM units WHERE sortkey = ${sortkey_2}|;
-    my ($name_2) = selectrow_query($form, $dbh, $query);
-
-    if (defined($name_2)) {
-      $query = qq|UPDATE units SET sortkey = ? WHERE name = ?|;
-      my $sth = $dbh->prepare($query);
-
-      do_statement($form, $sth, $query, $sortkey_1, $name_2);
-      do_statement($form, $sth, $query, $sortkey_2, $name_1);
-    }
-  }
-
-  $dbh->commit();
-  $dbh->disconnect();
-
-  $main::lxdebug->leave_sub();
-}
-
 sub taxes {
   $main::lxdebug->enter_sub();
 
diff --git a/SL/Controller/Unit.pm b/SL/Controller/Unit.pm
new file mode 100644 (file)
index 0000000..018a7b3
--- /dev/null
@@ -0,0 +1,36 @@
+package SL::Controller::Unit;
+
+use strict;
+
+use parent qw(SL::Controller::Base);
+
+use SL::DB::Unit;
+
+__PACKAGE__->run_before('check_auth');
+
+#
+# actions
+#
+
+sub action_reorder {
+  my ($self) = @_;
+
+  my @ids = @{ $::form->{unit_id} || [] };
+  my $result = SL::DB::Unit->new->db->do_transaction(sub {
+    foreach my $idx (0 .. scalar(@ids) - 1) {
+      SL::DB::Unit->new(id => $ids[$idx])->load->update_attributes(sortkey => $idx + 1);
+    }
+  });
+
+  $self->render(type => 'js', inline => '1;');
+}
+
+#
+# filters
+#
+
+sub check_auth {
+  $::auth->assert('config');
+}
+
+1;
index 7fd49d0..eacf5df 100644 (file)
@@ -2687,15 +2687,13 @@ sub edit_units {
   $units = AM->retrieve_units(\%myconfig, $form);
   my $ddbox = AM->unit_select_data($units, undef, 1);
 
-  my $updownlink = build_std_url("action=swap_units");
-
   $form->{"title"} = $locale->text("Add and edit units");
   $form->header();
   print($form->parse_html_template("am/edit_units",
                                    { "UNITS"               => \@unit_list,
                                      "NEW_BASE_UNIT_DDBOX" => $ddbox,
                                      "LANGUAGES"           => \@languages,
-                                     "updownlink"          => $updownlink }));
+                                   }));
 
   $main::lxdebug->leave_sub();
 }
@@ -2933,22 +2931,6 @@ sub show_am_history {
   $main::lxdebug->leave_sub();
 }
 
-sub swap_units {
-  $main::lxdebug->enter_sub();
-
-  my $form     = $main::form;
-  my %myconfig = %main::myconfig;
-
-  $main::auth->assert('config');
-
-  my $dir = $form->{"dir"} eq "down" ? "down" : "up";
-  AM->swap_units(\%myconfig, $form, $dir, $form->{"name"});
-
-  edit_units();
-
-  $main::lxdebug->leave_sub();
-}
-
 sub add_tax {
   $main::lxdebug->enter_sub();
 
diff --git a/image/updown.png b/image/updown.png
new file mode 100644 (file)
index 0000000..3eb6a9c
Binary files /dev/null and b/image/updown.png differ
index 249d78d..ded1a32 100644 (file)
@@ -2087,6 +2087,7 @@ $self->{texts} = {
   'quarterly'                   => 'quartalsweise',
   'quotation_list'              => 'angebotsliste',
   'release_material'            => 'Materialausgabebe',
+  'reorder item'                => 'Eintrag umsortieren',
   'report_generator_dispatch_to is not defined.' => 'report_generator_dispatch_to ist nicht definiert.',
   'report_generator_nextsub is not defined.' => 'report_generator_nextsub ist nicht definiert.',
   'request_quotation'           => 'Angebotsanforderung',
index ddc9539..4d3b3e3 100644 (file)
@@ -1,5 +1,9 @@
-[%- USE T8 %][%- USE LxERP %]
-[% USE HTML %]<body>
+[%- USE T8 %][%- USE LxERP %][% USE L %]
+[% USE HTML %]
+
+<script type="text/javascript" src="js/jquery-ui.js"></script>
+
+<body>
 
  [% IF saved_message %]
   <p>[% saved_message %]</p>
   [% 'You can declare different translations for singular and plural for each unit (e.g. &quot;day&quot; and &quot;days).' | $T8 %]
  </p>
 
- <table>
+ <table id="unit_list">
+  <thead>
   <tr class="listheading">
-   <th width="32" align="center" valign="center"><img alt="[% 'up' | $T8 %]" src="image/up.png"><img alt="[% 'down' | $T8 %]" src="image/down.png"></th>
+   <th align="center"><img src="image/updown.png" alt="[ LxERP.t8('reorder item') %]"></th>
    <th>[% 'Delete' | $T8 %]</th>
    <th>[% 'Unit' | $T8 %]</th>
    <th>[% 'Base unit' | $T8 %]</th>
     <th>[% language.description %]</th>
    [% END %]
   </tr>
+  </thead>
 
+  <tbody>
   [% FOREACH row = UNITS %]
-   <tr class="listrow[% loop.count % 2 %]">
-    <td width="32" align="center" valign="center">[% IF loop.first %]<img src="image/transparent16x16.gif">[% ELSE %]<a href="[% updownlink %]&dir=up&name=[% HTML.url(row.name) %]"><img alt="[% 'up' | $T8 %]" src="image/up.png" border="0"></a>[% END %][% IF loop.last %]<img src="image/transparent16x16.gif">[% ELSE %]<a href="[% updownlink %]&dir=down&name=[% HTML.url(row.name) %]"><img alt="[% 'down' | $T8 %]" src="image/down.png" border="0"></a>[% END %]</td>
+   <tr class="listrow[% loop.count % 2 %]" id="unit_id_[% row.id %]">
+    <td align="center"><img src="image/updown.png" alt="[ LxERP.t8('reorder item') %]"></td>
     [% IF row.in_use %]
      <td>
       <input type="hidden" name="unchangeable_[% loop.count %]" value="1">
      </td>
     [% END %]
    </tr>
-
-   [% IF loop.last %]<input type="hidden" name="rowcount" value="[% loop.count %]">[% END %]
   [% END %]
+  </tbody>
  </table>
 
+ <input type="hidden" name="rowcount" value="[% UNITS.size %]">
+
  <input type="submit" class="submit" name="action" value="[% 'Save' | $T8 %]">
 
  </form>
 
+ [% L.sortable_element('#unit_list tbody', 'url' => 'controller.pl?action=Unit/reorder', 'with' => 'unit_id') %]
+
 </body>
 </html>