summaryrefslogtreecommitdiff
path: root/LedgerSMB/Template/Elements.pm
blob: 53dfe37342b091b0722eb28704515bba8ea4e7df (plain)
  1. =head1 NAME
  2. LedgerSMB::Template::Elements: Template Utility Functions
  3. =head1 SYNOPSIS
  4. Provides utility functions for generating elements for the user interface
  5. templates
  6. =head1 METHODS
  7. =over
  8. =item LedgerSMB::Template::Elements->new()
  9. Returns a blessed hashref from this namespace.
  10. =back
  11. =cut
  12. package LedgerSMB::Template::Elements;
  13. use strict;
  14. sub new {
  15. my ($class) = @_;
  16. my $self = {};
  17. bless $self, $class;
  18. return $self;
  19. }
  20. =over
  21. =item $object->generate_hidden_elements([...]);
  22. Builds data structure for hidden form fields. Values from the
  23. $form object are run through $form->quote.
  24. Sample data structure added to $form->hidden_elements():
  25. $self->{form_elements}{hidden_elements} = [{ type => 'hidden', name => 'foo', value => 'bar'... } ...]
  26. A reference to this structure is returned as well.
  27. =back
  28. =cut
  29. sub generate_hidden_elements {
  30. my $self = shift;
  31. if (! $self->{form_elements}{hidden_elements} ) {
  32. $self->{form_elements}{hidden_elements} = [];
  33. }
  34. for (@_) {
  35. my $value = defined($self->{$_}) ? $self->quote( $self->{$_} ) : '';
  36. push @{$self->{form_elements}{hidden_elements}}, { type => 'hidden', name => $_, value => $value };
  37. }
  38. return $self->{form_elements}{hidden_elements};
  39. }
  40. =over
  41. =item $form->generate_radio_elements($radios);
  42. Roll out a single radios hash to an array of radio elements,
  43. using the values array as index.
  44. Sample data structure added to $form->generate_radio_elements($radios):
  45. my $radios = {
  46. name => 'radio_name',
  47. class => 'radio',
  48. attributes => { foo => 'bar' },
  49. values => [ '1', '2', '3'],
  50. labels => [ 'Label one', '', 'Label three'],
  51. };
  52. =back
  53. =cut
  54. sub generate_radio_elements {
  55. my $self = shift;
  56. my $radios = shift;
  57. my $elements = [];
  58. my $i = 0;
  59. # One new radio element for each listed value.
  60. foreach my $radio_value ( @{$radios->{values}} ) {
  61. my $element = {};
  62. # copy all additional attributes
  63. while ( my ($key, $value) = each(%$radios) ) {
  64. if ( $key !~ /^(values|labels|id|value)$/ ) {
  65. $element->{$key} = $value;
  66. }
  67. }
  68. $element->{id} = $radios->{name} .'-'. $radio_value;
  69. # id tags with only numbers, letters, and dashes -- nicer CSS.
  70. $element->{id} =~ s/[^\p{IsAlnum}]/-/g;
  71. $element->{value} = $radio_value;
  72. $element->{type} = 'radio';
  73. # Add label key if present for this element.
  74. if ( $radios->{labels}[$i] ) {
  75. $element->{label} = $radios->{labels}[$i];
  76. }
  77. push @$elements, $element;
  78. $i++;
  79. }
  80. return $elements;
  81. }
  82. =over
  83. =item $form->generate_checkbox_elements($checkboxes);
  84. Roll out a single checkboxes hash to an array of checkbox elements,
  85. using the names array as index. Note that if no 'values' array
  86. is passed, value for all checkboxes default to 1.
  87. Sample data structure added to $form->generate_checkbox_elements($checkboxes):
  88. my $checkboxes = {
  89. names => [
  90. 'checkbox_name1',
  91. 'checkbox_name2',
  92. 'checkbox_name3',
  93. ],
  94. class => 'checkbox',
  95. attributes => { foo => 'bar' },
  96. values => [ '4', '', '3'],
  97. labels => [ 'Label one', '', 'Label three'],
  98. };
  99. =back
  100. =cut
  101. sub generate_checkbox_elements {
  102. my $self = shift;
  103. my $checkboxes = shift;
  104. my $elements = [];
  105. my $i = 0;
  106. # One new checkbox element for each listed name.
  107. foreach my $checkbox_name ( @{$checkboxes->{names}} ) {
  108. my $element = {};
  109. # Additional attributes
  110. while ( my ($key, $value) = each(%$checkboxes) ) {
  111. if ( $key !~ /^(names|values|labels|id|value|name)$/ ) {
  112. $element->{$key} = $value;
  113. }
  114. }
  115. # Value defaults to 1 if not passed for this element.
  116. $element->{value} = defined($checkboxes->{values}[$i])
  117. ? $checkboxes->{values}[$i]
  118. : '1';
  119. $element->{name} = $checkbox_name;
  120. $element->{id} = $element->{name};
  121. # id tags with only numbers, letters, and dashes -- nicer CSS.
  122. $element->{id} =~ s/[^\p{IsAlnum}]/-/g;
  123. $element->{type} = 'checkbox';
  124. # Add label key if present for this element.
  125. if ( $checkboxes->{labels}[$i] ) {
  126. $element->{label} = $checkboxes->{labels}[$i];
  127. }
  128. push @$elements, $element;
  129. $i++;
  130. }
  131. return $elements;
  132. }
  133. 1;