diff --git a/docs/examples/demo-header-and-footer.html b/docs/examples/demo-header-and-footer.html new file mode 100644 index 000000000..3fd4f615a --- /dev/null +++ b/docs/examples/demo-header-and-footer.html @@ -0,0 +1,17 @@ +

Basic Header and Footer

+

Selected: {{ctrl.address.selected.formatted_address}}

+ + {{$select.selected.formatted_address}} +

Simple Header

+ +
+
+ Simple Footer +
diff --git a/src/uiSelectDirective.js b/src/uiSelectDirective.js index cded3d463..e51eb8aea 100644 --- a/src/uiSelectDirective.js +++ b/src/uiSelectDirective.js @@ -227,6 +227,33 @@ uis.directive('uiSelect', if (transcludedNoChoice.length == 1) { element.querySelectorAll('.ui-select-no-choice').replaceWith(transcludedNoChoice); } + + var transcludedHeader = transcluded.querySelectorAll('.ui-select-header'); + var transcludedFooter = transcluded.querySelectorAll('.ui-select-footer'); + if((transcludedHeader && transcludedHeader.length) || (transcludedFooter && transcludedFooter.length)){ + $timeout(function(){ + var selectChoices = element.querySelectorAll('.ui-select-choices'); + + if(transcludedHeader && transcludedHeader.length){ + transcludedHeader.removeAttr('ui-select-header'); // To avoid loop in case directive as attr + transcludedHeader.removeAttr('ng-transclude'); // Content has already been transcluded + transcludedHeader.removeAttr('data-ui-select-header'); // Properly handle HTML5 data-attributes + transcludedHeader.removeAttr('data-ng-transclude'); + selectChoices.prepend(transcludedHeader); + } + + if(transcludedFooter && transcludedFooter.length){ + transcludedFooter.removeAttr('ui-select-footer'); // To avoid loop in case directive as attr + transcludedFooter.removeAttr('ng-transclude'); // Content has already been transcluded + transcludedFooter.removeAttr('data-ui-select-footer'); // Properly handle HTML5 data-attributes + transcludedFooter.removeAttr('data-ng-transclude'); + selectChoices.append(transcludedFooter); + } + + // re-compile selectChoices in case header or footer requires one of ui-select-choice's directives + $compile(selectChoices)(scope); + }); + } }); // Support for appending the select field to the body when its open diff --git a/src/uiSelectFooterDirective.js b/src/uiSelectFooterDirective.js new file mode 100644 index 000000000..796629bef --- /dev/null +++ b/src/uiSelectFooterDirective.js @@ -0,0 +1,8 @@ +uis.directive('uiSelectFooter', function(){ + return { + template: '', + restrict: 'EA', + transclude: true, + replace: true + }; +}); \ No newline at end of file diff --git a/src/uiSelectHeaderDirective.js b/src/uiSelectHeaderDirective.js new file mode 100644 index 000000000..370b00af0 --- /dev/null +++ b/src/uiSelectHeaderDirective.js @@ -0,0 +1,8 @@ +uis.directive('uiSelectHeader', function(){ + return { + template: '
  • ', + restrict: 'EA', + transclude: true, + replace: true + }; +}); \ No newline at end of file