1 package SL::Presenter::CustomerVendor;
 
   5 use SL::Presenter::EscapedText qw(escape is_escaped);
 
   6 use SL::Presenter::Tag qw(input_tag html_tag name_to_id select_tag);
 
   8 use Exporter qw(import);
 
   9 our @EXPORT_OK = qw(customer_vendor customer vendor customer_vendor_picker customer_picker vendor_picker);
 
  14   my ($customer_vendor, %params) = @_;
 
  15   return _customer_vendor($customer_vendor, ref($customer_vendor) eq 'SL::DB::Customer' ? 'customer' : 'vendor', %params);
 
  19   my ($customer, %params) = @_;
 
  20   return _customer_vendor($customer, 'customer', %params);
 
  24   my ($vendor, %params) = @_;
 
  25   return _customer_vendor($vendor, 'vendor', %params);
 
  28 sub _customer_vendor {
 
  29   my ($cv, $type, %params) = @_;
 
  31   $params{display} ||= 'inline';
 
  33   croak "Unknown display type '$params{display}'" unless $params{display} =~ m/^(?:inline|table-cell)$/;
 
  35   my $callback = $params{callback} ? '&callback=' . $::form->escape($params{callback}) : '';
 
  38     $params{no_link} ? '' : '<a href="controller.pl?action=CustomerVendor/edit&db=' . $type . '&id=' . escape($cv->id) . '">',
 
  40     $params{no_link} ? '' : '</a>',
 
  46 sub customer_vendor_picker {
 
  47   my ($name, $value, %params) = @_;
 
  49   $params{type} //= 'customer' if 'SL::DB::Customer' eq ref $value;
 
  50   $params{type} //= 'vendor'   if 'SL::DB::Vendor'   eq ref $value;
 
  52   croak 'Unknown "type" parameter' unless $params{type} =~ m{^(?:customer|vendor)$};
 
  53   croak 'Unknown value class'      if     $value && ref($value) && (ref($value) !~ m{^SL::DB::(?:Customer|Vendor)$});
 
  55   if ($value && !ref $value) {
 
  56     my $class = $params{type} eq 'customer' ? 'SL::DB::Manager::Customer' : 'SL::DB::Manager::Vendor';
 
  57     $value    = $class->find_by(id => $value);
 
  60   my $id = delete($params{id}) || name_to_id($name);
 
  62   my @classes = $params{class} ? ($params{class}) : ();
 
  63   push @classes, 'customer_vendor_autocomplete';
 
  66     input_tag($name, (ref $value && $value->can('id') ? $value->id : ''), class => "@classes", type => 'hidden', id => $id,
 
  67       'data-customer-vendor-picker-data' => JSON::to_json(\%params),
 
  69     input_tag("", ref $value  ? $value->displayable_name : '', id => "${id}_name", %params);
 
  71   $::request->layout->add_javascripts('kivi.CustomerVendor.js');
 
  72   $::request->presenter->need_reinit_widgets($id);
 
  74   html_tag('span', $ret, class => 'customer_vendor_picker');
 
  77 sub customer_picker { my ($name, $value, @slurp) = @_; customer_vendor_picker($name, $value, @slurp, type => 'customer') }
 
  78 sub vendor_picker   { my ($name, $value, @slurp) = @_; customer_vendor_picker($name, $value, @slurp, type => 'vendor') }
 
  79 sub picker          { goto &customer_vendor_picker }
 
  91 SL::Presenter::CustomerVendor - Presenter module for customer and
 
  92 vendor Rose::DB objects
 
  97   my $customer = SL::DB::Manager::Customer->get_first;
 
  98   my $html     = SL::Presenter::CustomerVendor::customer($customer, display => 'inline');
 
 101   my $vendor = SL::DB::Manager::Vendor->get_first;
 
 102   my $html   = SL::Presenter::Customer::Vendor::vendor($customer, display => 'inline');
 
 108 =item C<customer $object, %params>
 
 110 Returns a rendered version (actually an instance of
 
 111 L<SL::Presenter::EscapedText>) of the customer object C<$object>.
 
 113 C<%params> can include:
 
 119 Either C<inline> (the default) or C<table-cell>. At the moment both
 
 120 representations are identical and produce the customer's name linked
 
 121 to the corresponding 'edit' action.
 
 125 If falsish (the default) then the customer's name will be linked to
 
 126 the "edit customer" dialog from the master data menu.
 
 130 =item C<vendor $object, %params>
 
 132 Returns a rendered version (actually an instance of
 
 133 L<SL::Presenter::EscapedText>) of the vendor object C<$object>.
 
 135 C<%params> can include:
 
 141 Either C<inline> (the default) or C<table-cell>. At the moment both
 
 142 representations are identical and produce the vendor's name linked
 
 143 to the corresponding 'edit' action.
 
 147 If falsish (the default) then the vendor's name will be linked to
 
 148 the "edit vendor" dialog from the master data menu.
 
 152 =item C<customer_vendor $object, %params>
 
 154 Returns a rendered version (actually an instance of
 
 155 L<SL::Presenter::EscapedText>) of the customer or vendor object
 
 156 C<$object> by calling either L</customer> or L</vendor> depending on
 
 157 C<$object>'s type. See the respective functions for available
 
 168 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>