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);
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 croak 'Unknown "type" parameter' unless $params{type} =~ m{^(?:customer|vendor)$};
50 croak 'Unknown value class' if $value && ref($value) && (ref($value) !~ m{^SL::DB::(?:Customer|Vendor)$});
52 if ($value && !ref $value) {
53 my $class = $params{type} eq 'customer' ? 'SL::DB::Manager::Customer' : 'SL::DB::Manager::Vendor';
54 $value = $class->find_by(id => $value);
57 my $id = delete($params{id}) || name_to_id($name);
59 my @classes = $params{class} ? ($params{class}) : ();
60 push @classes, 'customer_vendor_autocomplete';
63 input_tag($name, (ref $value && $value->can('id') ? $value->id : ''), class => "@classes", type => 'hidden', id => $id,
64 'data-customer-vendor-picker-data' => JSON::to_json(\%params),
66 input_tag("", ref $value ? $value->displayable_name : '', id => "${id}_name", %params);
68 $::request->layout->add_javascripts('kivi.CustomerVendor.js');
69 $::request->presenter->need_reinit_widgets($id);
71 html_tag('span', $ret, class => 'customer_vendor_picker');
74 sub picker { goto &customer_vendor_picker }
86 SL::Presenter::CustomerVendor - Presenter module for customer and
87 vendor Rose::DB objects
92 my $customer = SL::DB::Manager::Customer->get_first;
93 my $html = SL::Presenter::CustomerVendor::customer($customer, display => 'inline');
96 my $vendor = SL::DB::Manager::Vendor->get_first;
97 my $html = SL::Presenter::Customer::Vendor::vendor($customer, display => 'inline');
103 =item C<customer $object, %params>
105 Returns a rendered version (actually an instance of
106 L<SL::Presenter::EscapedText>) of the customer object C<$object>.
108 C<%params> can include:
114 Either C<inline> (the default) or C<table-cell>. At the moment both
115 representations are identical and produce the customer's name linked
116 to the corresponding 'edit' action.
120 If falsish (the default) then the customer's name will be linked to
121 the "edit customer" dialog from the master data menu.
125 =item C<vendor $object, %params>
127 Returns a rendered version (actually an instance of
128 L<SL::Presenter::EscapedText>) of the vendor object C<$object>.
130 C<%params> can include:
136 Either C<inline> (the default) or C<table-cell>. At the moment both
137 representations are identical and produce the vendor's name linked
138 to the corresponding 'edit' action.
142 If falsish (the default) then the vendor's name will be linked to
143 the "edit vendor" dialog from the master data menu.
147 =item C<customer_vendor $object, %params>
149 Returns a rendered version (actually an instance of
150 L<SL::Presenter::EscapedText>) of the customer or vendor object
151 C<$object> by calling either L</customer> or L</vendor> depending on
152 C<$object>'s type. See the respective functions for available
163 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>