Verknüpfte Belege: Implementation "Verknüpfungen löschen"
authorMoritz Bunkus <m.bunkus@linet-services.de>
Thu, 28 Feb 2013 11:40:28 +0000 (12:40 +0100)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Fri, 1 Mar 2013 09:41:28 +0000 (10:41 +0100)
SL/Controller/RecordLinks.pm
SL/Presenter/Record.pm
locale/de/all
templates/webpages/presenter/record/grouped_record_list.html [new file with mode: 0644]
templates/webpages/presenter/record/record_list.html

index 8edd787..a761443 100644 (file)
@@ -10,6 +10,8 @@ use SL::DB::Invoice;
 use SL::DB::PurchaseInvoice;
 use SL::Locale::String;
 
+__PACKAGE__->run_before('check_object_params', only => [ qw(ajax_list ajax_delete) ]);
+
 #
 # actions
 #
@@ -18,12 +20,16 @@ sub action_ajax_list {
   my ($self) = @_;
 
   eval {
-    die $::locale->text("Invalid parameters") if (!$::form->{object_id} || ($::form->{object_model} !~ m/^(?:Order|DeliveryOrder|Invoice|PurchaseInvoice)$/));
-
     my $model          = 'SL::DB::' . $::form->{object_model};
     my $object         = $model->new(id => $::form->{object_id})->load || die $::locale->text("Record not found");
     my $linked_records = $object->linked_records(direction => 'both');
-    my $output         = SL::Presenter->get->grouped_record_list($linked_records, with_columns => [ qw(record_link_direction) ]);
+    my $output         = SL::Presenter->get->grouped_record_list(
+      $linked_records,
+      with_columns      => [ qw(record_link_direction) ],
+      edit_record_links => 1,
+      object_model      => $::form->{object_model},
+      object_id         => $::form->{object_id},
+    );
     $self->render(\$output, { layout => 0, process => 0 });
 
     1;
@@ -32,4 +38,38 @@ sub action_ajax_list {
   };
 }
 
+sub action_ajax_delete {
+  my ($self) = @_;
+
+  my $prefix = $::form->{form_prefix} || 'record_links';
+  foreach my $str (@{ $::form->{"${prefix}_delete"} || [] }) {
+    my ($from_table, $from_id, $to_table, $to_id) = split m/__/, $str, 4;
+    $from_id *= 1;
+    $to_id   *= 1;
+
+    next if !$from_table || !$from_id || !$to_table || !$to_id;
+
+    # $::lxdebug->message(0, "INSERT INTO record_links (from_table, from_id, to_table, to_id) VALUES ('${from_table}', ${from_id}, '${to_table}', ${to_id});");
+
+    SL::DB::Manager::RecordLink->delete_all(where => [
+      from_table => $from_table,
+      from_id    => $from_id,
+      to_table   => $to_table,
+      to_id      => $to_id,
+    ]);
+  }
+
+  $self->action_ajax_list;
+}
+
+#
+# filters
+#
+
+sub check_object_params {
+  my ($self) = @_;
+
+  return $::form->{object_id} && ($::form->{object_model} =~ m/^(?:Order|DeliveryOrder|Invoice|PurchaseInvoice)$/);
+}
+
 1;
index 64cb21b..db0caa5 100644 (file)
@@ -20,7 +20,8 @@ sub _arrayify {
 sub grouped_record_list {
   my ($self, $list, %params) = @_;
 
-  %params    = map { exists $params{$_} ? ($_ => $params{$_}) : () } qw(selectable with_columns);
+  %params                = map { exists $params{$_} ? ($_ => $params{$_}) : () } qw(edit_record_links form_prefix with_columns object_id object_model);
+  $params{form_prefix} ||= 'record_links';
 
   my %groups = _group_records($list);
   my $output = '';
@@ -37,6 +38,8 @@ sub grouped_record_list {
   $output .= _purchase_invoice_list(       $self, $groups{purchase_invoices},        %params) if $groups{purchase_invoices};
   $output .= _ar_transaction_list(         $self, $groups{ar_transactions},          %params) if $groups{ar_transactions};
 
+  $output  = $self->render('presenter/record/grouped_record_list', %params, output => $output, nownow => DateTime->now) if $output;
+
   return $output || $self->empty_record_list;
 }
 
@@ -110,14 +113,16 @@ sub record_list {
       push @row, \%cell;
     }
 
-    push @data, \@row;
+    push @data, { columns => \@row, record_link => $obj->{_record_link} };
   }
 
   my @header =
     map +{ value     => $columns[$_]->{title},
-           alignment => $data[0]->[$_]->{alignment},
+           alignment => $data[0]->{columns}->[$_]->{alignment},
          }, (0..scalar(@columns) - 1);
 
+  $params{form_prefix} ||= 'record_links';
+
   return $self->render(
     'presenter/record/record_list',
     %params,
@@ -425,6 +430,9 @@ The order in which the records are grouped is:
 
 Objects of unknown types are skipped.
 
+Parameters are passed to C<record_list> include C<with_objects> and
+C<edit_record_links>.
+
 =item C<record_list $list, %params>
 
 Returns a rendered version (actually an instance of
@@ -465,6 +473,26 @@ If the column spec is a hash reference then the same arguments are
 expected. The corresponding hash keys are C<title>, C<data> and
 C<link>.
 
+=item C<with_columns>
+
+Can be set by the caller to indicate additional columns to
+list. Currently supported:
+
+=over 2
+
+=item C<record_link_destination>
+
+The record link destination. Requires that the records to list have
+been retrieved via the L<SL::DB::Helper::LinkedRecords> helper.
+
+=back
+
+=item C<edit_record_links>
+
+If trueish additional controls will be rendered that allow the user to
+remove and add record links. Requires that the records to list have
+been retrieved via the L<SL::DB::Helper::LinkedRecords> helper.
+
 =back
 
 =back
index 80f80e9..a7e2ef1 100644 (file)
@@ -612,6 +612,7 @@ $self->{texts} = {
   'Delete delivery order'       => 'Lieferschein l&ouml;schen',
   'Delete drafts'               => 'Entwürfe löschen',
   'Delete group'                => 'Gruppe l&ouml;schen',
+  'Delete links'                => 'Verknüpfungen löschen',
   'Delete profile'              => 'Profil löschen',
   'Delete transaction'          => 'Buchung löschen',
   'Deleted'                     => 'Gelöscht',
@@ -661,6 +662,7 @@ $self->{texts} = {
   'Do you really want to delete AP transaction #1?' => 'Wollen Sie wirklich die Kreditorenbuchung #1 löschen?',
   'Do you really want to delete AR transaction #1?' => 'Wollen Sie wirklich die Debitorenbuchung #1 löschen?',
   'Do you really want to delete GL transaction #1?' => 'Wollen Sie wirklich die Dialogbuchung #1 löschen?',
+  'Do you really want to delete the selected links?' => 'Wollen Sie wirklich die ausgewählten Verknüpfungen löschen?',
   'Do you really want to delete this group?' => 'Gruppe wirklich l&ouml;schen?',
   'Do you really want to delete this object?' => 'Wollen Sie dieses Objekt wirklich löschen?',
   'Do you really want to delete this warehouse?' => 'Wollen Sie dieses Lager wirklich l&ouml;schen?',
@@ -1029,7 +1031,6 @@ $self->{texts} = {
   'Inv. Duedate'                => 'Rg. Fälligkeit',
   'Invalid'                     => 'Ungültig',
   'Invalid follow-up ID.'       => 'Ung&uuml;ltige Wiedervorlage-ID.',
-  'Invalid parameters'          => 'Ungültige Parameter',
   'Invalid quantity.'           => 'Die Mengenangabe ist ung&uuml;ltig.',
   'Invalid request type \'#1\'' => 'Ungültiger Request-Typ \'#1\'',
   'Invdate'                     => 'Rechnungsdatum',
diff --git a/templates/webpages/presenter/record/grouped_record_list.html b/templates/webpages/presenter/record/grouped_record_list.html
new file mode 100644 (file)
index 0000000..0016612
--- /dev/null
@@ -0,0 +1,39 @@
+[%- USE LxERP -%][%- USE L -%][%- USE HTML -%][%- USE JavaScript -%]
+
+<div id="[% form_prefix %]_list">
+ <p>[% nownow %]</p>
+
+ [% output %]
+
+[%- IF edit_record_links %]
+ <div>
+  [% L.button_tag(form_prefix _ '_delete()', LxERP.t8('Delete links')) %]
+ </div>
+
+ <script type="text/javascript">
+  <!--
+function [% form_prefix %]_delete() {
+  var checkboxes = $('.record_links_delete').filter(function () { return $(this).attr('checked'); });
+
+  if ((checkboxes.size() == 0) || !confirm('[% LxERP.t8('Do you really want to delete the selected links?') %]'))
+    return false;
+
+  var data = {
+   action:       'RecordLinks/ajax_delete',
+   object_model: '[% JavaScript.escape(object_model) %]',
+   object_id:    '[% JavaScript.escape(object_id) %]'
+  };
+
+  $.ajax({
+    url:     "controller.pl?" + checkboxes.serialize(),
+    data:    data,
+    success: function(new_data) { $('#[% form_prefix %]_list').replaceWith(new_data); }
+  });
+
+  return false;
+}
+
+ -->
+ </script>
+[%- END %]
+</div>
index d701d6f..e1395a2 100644 (file)
@@ -5,6 +5,7 @@
  <table style="width: 100%">
   <thead>
    <tr>
+    [%- IF edit_record_links %]<th class="listheading"></th>[%- END %]
     [%- FOREACH column = TABLE_HEADER %]
     <th class="listheading"[% IF column.alignment %] align="[% column.alignment %]"[% END %]>[%- P.escape(column.value) %]</th>
     [%- END %]
   <tbody>
    [%- FOREACH row = TABLE_ROWS %]
    <tr class="listrow[% loop.count % 2 %]">
-    [%- FOREACH column = row %]
+    [%- IF edit_record_links %]
+     <td>[%- L.checkbox_tag(form_prefix _ '_delete[]', 'value'=row.record_link.from_table _ '__' _ row.record_link.from_id _ '__' _ row.record_link.to_table _ '__' _ row.record_link.to_id, 'class'='record_links_delete') %]</td>
+    [%- END %]
+    [%- FOREACH column = row.columns %]
     <td[% IF column.alignment %] align="[% column.alignment %]"[% END %]>
      [%- IF column.link %]<a href="[% column.link %]">[%- END %]
       [%- P.escape(column.value) %]