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>