patternfly-sass 3.13.0 → 3.14.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. checksums.yaml +4 -4
  2. data/assets/javascripts/patternfly-functions.js +1137 -0
  3. data/assets/javascripts/patternfly-functions.min.js +1 -0
  4. data/assets/javascripts/patternfly-settings.js +506 -0
  5. data/assets/javascripts/patternfly-settings.min.js +1 -0
  6. data/assets/javascripts/patternfly.dataTables.pfEmpty.js +244 -0
  7. data/assets/javascripts/patternfly.dataTables.pfEmpty.min.js +1 -0
  8. data/assets/javascripts/patternfly.dataTables.pfFilter.js +421 -0
  9. data/assets/javascripts/patternfly.dataTables.pfFilter.min.js +1 -0
  10. data/assets/javascripts/patternfly.dataTables.pfResize.js +214 -0
  11. data/assets/javascripts/patternfly.dataTables.pfResize.min.js +1 -0
  12. data/assets/javascripts/patternfly.dataTables.pfSelect.js +281 -0
  13. data/assets/javascripts/patternfly.dataTables.pfSelect.min.js +1 -0
  14. data/assets/javascripts/patternfly.js +692 -652
  15. data/assets/javascripts/patternfly.min.js +2 -2
  16. data/assets/stylesheets/_patternfly.scss +1 -0
  17. data/assets/stylesheets/patternfly/_datatables.scss +17 -49
  18. data/assets/stylesheets/patternfly/_table-view.scss +170 -0
  19. data/bower.json +1 -1
  20. data/lib/patternfly-sass/version.rb +2 -2
  21. data/package.json +70 -0
  22. data/spec/html/about-modal.html +1 -0
  23. data/spec/html/accordions.html +1 -0
  24. data/spec/html/alerts.html +1 -0
  25. data/spec/html/area-charts.html +1 -0
  26. data/spec/html/badges.html +1 -0
  27. data/spec/html/bar-charts.html +1 -0
  28. data/spec/html/basic.html +368 -418
  29. data/spec/html/blank-slate.html +2 -1
  30. data/spec/html/bootstrap-combobox.html +1 -0
  31. data/spec/html/bootstrap-datepicker.html +1 -0
  32. data/spec/html/bootstrap-select.html +1 -0
  33. data/spec/html/bootstrap-switch.html +1 -0
  34. data/spec/html/bootstrap-touchspin.html +1 -0
  35. data/spec/html/bootstrap-treeview-2.html +1 -0
  36. data/spec/html/bootstrap-treeview.html +1 -0
  37. data/spec/html/breadcrumbs.html +1 -0
  38. data/spec/html/buttons.html +1 -0
  39. data/spec/html/card-view-card-variations.html +1 -0
  40. data/spec/html/card-view-multi-select.html +1 -0
  41. data/spec/html/card-view-single-select.html +1 -0
  42. data/spec/html/cards.html +1 -0
  43. data/spec/html/code.html +1 -0
  44. data/spec/html/dashboard.html +1 -0
  45. data/spec/html/dist/css/patternfly-additions.css +143 -52
  46. data/spec/html/dist/css/patternfly-additions.css.map +1 -1
  47. data/spec/html/dist/css/patternfly-additions.min.css +1 -1
  48. data/spec/html/dist/css/patternfly-additions.min.css.map +1 -1
  49. data/spec/html/dist/css/patternfly.min.css +2 -2
  50. data/spec/html/dist/css/patternfly.min.css.map +1 -1
  51. data/spec/html/donut-charts.html +1 -0
  52. data/spec/html/dropdowns.html +1 -0
  53. data/spec/html/form.html +1 -0
  54. data/spec/html/forms.html +1 -0
  55. data/spec/html/horizontal-navigation.html +1 -0
  56. data/spec/html/icons.html +1 -0
  57. data/spec/html/index.html +10 -6
  58. data/spec/html/infotip.html +1 -0
  59. data/spec/html/labels.html +1 -0
  60. data/spec/html/line-charts.html +1 -0
  61. data/spec/html/list-group.html +1 -0
  62. data/spec/html/list-view-compound-expansion.html +1 -0
  63. data/spec/html/list-view-rows.html +1 -0
  64. data/spec/html/list-view-simple-expansion.html +1 -0
  65. data/spec/html/list-view.html +1 -0
  66. data/spec/html/login.html +1 -0
  67. data/spec/html/modals.html +1 -0
  68. data/spec/html/navbar.html +1 -0
  69. data/spec/html/notification-drawer-horizontal-nav.html +1 -0
  70. data/spec/html/notification-drawer-vertical-nav.html +1 -0
  71. data/spec/html/pagination.html +1 -0
  72. data/spec/html/panels.html +1 -0
  73. data/spec/html/pie-charts.html +1 -0
  74. data/spec/html/popovers.html +1 -0
  75. data/spec/html/progress-bars.html +1 -0
  76. data/spec/html/search.html +1 -0
  77. data/spec/html/spinner.html +1 -0
  78. data/spec/html/tab.html +373 -420
  79. data/spec/html/{datatables-columns.html → table-view-columns.html} +9 -7
  80. data/spec/html/table-view-navbar.html +532 -0
  81. data/spec/html/table-view.html +422 -0
  82. data/spec/html/tables.html +1 -0
  83. data/spec/html/tabs.html +1 -0
  84. data/spec/html/time-picker.html +1 -0
  85. data/spec/html/toast.html +1 -0
  86. data/spec/html/toolbar.html +1 -0
  87. data/spec/html/tooltip.html +1 -0
  88. data/spec/html/typography-2.html +1 -1
  89. data/spec/html/typography.html +1 -0
  90. data/spec/html/utilization-bar-charts.html +1 -0
  91. data/spec/html/vertical-navigation-primary-only.html +1 -0
  92. data/spec/html/vertical-navigation-with-badges.html +1 -0
  93. data/spec/html/vertical-navigation-with-secondary.html +1 -0
  94. data/spec/html/vertical-navigation-with-tertiary-no-icons.html +1 -0
  95. data/spec/html/vertical-navigation-with-tertiary-pins.html +1 -0
  96. data/spec/html/wizard.html +1 -0
  97. metadata +22 -6
  98. data/spec/html/datatables.html +0 -472
@@ -0,0 +1 @@
1
+ !function(window){"use strict";var patternfly={version:"3.13.0"};patternfly.pfPaletteColors={black:"#030303",black100:"#fafafa",black200:"#ededed",black300:"#d1d1d1",black400:"#bbbbbb",black500:"#8b8d8f",black600:"#72767b",black700:"#4d5258",black800:"#393f44",black900:"#292e34",blue:"#0088ce",blue100:"#bee1f4",blue200:"#7dc3e8",blue300:"#39a5dc",blue400:"#0088ce",blue500:"#00659c",blue600:"#004368",blue700:"#002235",gold:"#f0ab00",gold100:"#fbeabc",gold200:"#f9d67a",gold300:"#f5c12e",gold400:"#f0ab00",gold500:"#b58100",gold600:"#795600",gold700:"#3d2c00",orange:"#ec7a08",orange100:"#fbdebf",orange200:"#f7bd7f",orange300:"#f39d3c",orange400:"#ec7a08",orange500:"#b35c00",orange600:"#773d00",orange700:"#3b1f00",lightBlue:"#00b9e4",lightBlue100:"#beedf9",lightBlue200:"#7cdbf3",lightBlue300:"#35caed",lightBlue400:"#00b9e4",lightBlue500:"#008bad",lightBlue600:"#005c73",lightBlue700:"#002d39",green:"#3f9c35",green100:"#cfe7cd",green200:"#9ecf99",green300:"#6ec664",green400:"#3f9c35",green500:"#2d7623",green600:"#1e4f18",green700:"#0f280d",lightGreen:"#92d400",lightGreen100:"#e4f5bc",lightGreen200:"#c8eb79",lightGreen300:"#ace12e",lightGreen400:"#92d400",lightGreen500:"#6ca100",lightGreen600:"#486b00",lightGreen700:"#253600",cyan:"#007a87",cyan100:"#bedee1",cyan200:"#7dbdc3",cyan300:"#3a9ca6",cyan400:"#007a87",cyan500:"#005c66",cyan600:"#003d44",cyan700:"#001f22",purple:"#703fec",purple100:"#c7bfff",purple200:"#a18fff",purple300:"#8461f7",purple400:"#703fec",purple500:"#582fc0",purple600:"#40199a",purple700:"#1f0066",red:"#cc0000",red100:"#cc0000",red200:"#a30000",red300:"#8b0000",red400:"#470000",red500:"#2c0000"},patternfly.pfSetDonutChartTitle=function(selector,primary,secondary){var donutChartRightTitle=window.d3.select(selector).select("text.c3-chart-arcs-title");donutChartRightTitle.text(""),donutChartRightTitle.insert("tspan").text(primary).classed("donut-title-big-pf",!0).attr("dy",0).attr("x",0),donutChartRightTitle.insert("tspan").text(secondary).classed("donut-title-small-pf",!0).attr("dy",20).attr("x",0)},patternfly.pfDonutTooltipContents=function(d,defaultTitleFormat,defaultValueFormat,color){return'<table class="c3-tooltip"> <tr> <td><span style="background-color:'+color(d[0].id)+'"></span><strong>'+d[0].value+"</strong> "+d[0].name+"</td> <td>"+Math.round(1e3*d[0].ratio)/10+"%</td> </tr></table>"},patternfly.pfGetUtilizationDonutTooltipContentsFn=function(units){return function(d){return'<span class="donut-tooltip-pf" style="white-space: nowrap;">'+Math.round(1e3*d[0].ratio)/10+"% "+units+" "+d[0].name+"</span>"}},patternfly.pfGetBarChartTooltipContentsFn=function(categories){return function(d){var name=categories?categories[d[0].index]:d[0].index;return'<table class="c3-tooltip"> <tr> <td><strong>'+name+":</td> <td>"+d[0].value+"</td> </tr></table>"}},patternfly.pfSingleLineChartTooltipContentsFn=function(categories){return function(d){var name=categories?categories[d[0].index]:d[0].index;return'<table class="c3-tooltip"> <tr> <td><strong>'+name+":</td> <td>"+d[0].value+"</td> </tr></table>"}},patternfly.pfPieTooltipContents=function(d,defaultTitleFormat,defaultValueFormat,color){return patternfly.pfDonutTooltipContents(d,defaultTitleFormat,defaultValueFormat,color)},patternfly.c3ChartDefaults=function(){var getDefaultColors=function(){return{pattern:[patternfly.pfPaletteColors.blue,patternfly.pfPaletteColors.blue300,patternfly.pfPaletteColors.green,patternfly.pfPaletteColors.orange,patternfly.pfPaletteColors.red]}},getDefaultBarGrid=function(){return{y:{show:!0}}},getDefaultBarTooltip=function(categories){return{contents:patternfly.pfGetBarChartTooltipContentsFn(categories)}},getDefaultBarLegend=function(){return{show:!1}},getDefaultBarConfig=function(categories){return{color:this.getDefaultColors(),grid:this.getDefaultBarGrid(),tooltip:this.getDefaultBarTooltip(categories),legend:this.getDefaultBarLegend()}},getDefaultGroupedBarGrid=function(){return{y:{show:!0}}},getDefaultGroupedBarLegend=function(){return{show:!0,position:"bottom"}},getDefaultGroupedBarConfig=function(){return{color:this.getDefaultColors(),grid:this.getDefaultGroupedBarGrid(),legend:this.getDefaultGroupedBarLegend()}},getDefaultDonut=function(title){return{title:title,label:{show:!1},width:11}},getDefaultDonutSize=function(){return{height:171}},getDefaultDonutColors=function(){return{pattern:[patternfly.pfPaletteColors.blue,patternfly.pfPaletteColors.black300]}},getDefaultDonutTooltip=function(){return{show:!1}},getDefaultDonutLegend=function(){return{show:!1}},getDefaultDonutConfig=function(title){return{donut:this.getDefaultDonut(title),size:this.getDefaultDonutSize(),legend:this.getDefaultDonutLegend(),color:this.getDefaultDonutColors(),tooltip:this.getDefaultDonutTooltip()}},getDefaultPie=function(){return{expand:!0,label:{show:!1}}},getDefaultPieSize=function(){return{height:171}},getDefaultPieColors=function(){return{pattern:[patternfly.pfPaletteColors.blue,patternfly.pfPaletteColors.black300]}},getDefaultPieTooltip=function(){return{contents:$().pfPieTooltipContents}},getDefaultPieLegend=function(){return{show:!1}},getDefaultPieConfig=function(){return{pie:this.getDefaultPie(),size:this.getDefaultPieSize(),legend:this.getDefaultPieLegend(),color:this.getDefaultPieColors(),tooltip:this.getDefaultPieTooltip()}},getDefaultSparklineArea=function(){return{zerobased:!0}},getDefaultSparklineSize=function(){return{height:60}},getDefaultSparklineAxis=function(){return{x:{show:!1},y:{show:!1}}},getDefaultSparklineLegend=function(){return{show:!1}},getDefaultSparklinePoint=function(){return{r:1,focus:{expand:{r:4}}}},getDefaultSparklineTooltip=function(){return{contents:function(d){return'<span class="c3-tooltip-sparkline">'+d[0].value+" "+d[0].name+"</span>"}}},getDefaultSparklineConfig=function(){return{area:getDefaultSparklineArea(),size:getDefaultSparklineSize(),axis:getDefaultSparklineAxis(),color:getDefaultColors(),legend:getDefaultSparklineLegend(),point:getDefaultSparklinePoint(),tooltip:getDefaultSparklineTooltip()}},getDefaultLineAxis=function(){return{x:{show:!0},y:{show:!0}}},getDefaultLineGrid=function(){return{x:{show:!1},y:{show:!0}}},getDefaultLineLegend=function(){return{show:!0}},getDefaultLinePoint=function(){return{r:3,focus:{expand:{r:5}}}},getDefaultLineConfig=function(){return{axis:getDefaultLineAxis(),grid:getDefaultLineGrid(),color:getDefaultColors(),legend:getDefaultLineLegend(),point:getDefaultLinePoint()}},getDefaultSingleLineTooltip=function(){return{contents:$().pfGetBarChartTooltipContentsFn()}},getDefaultSingleLineLegend=function(){return{show:!1}},getDefaultSingleLineConfig=function(){return{axis:getDefaultLineAxis(),grid:getDefaultLineGrid(),color:getDefaultColors(),legend:getDefaultSingleLineLegend(),point:getDefaultLinePoint(),tooltip:getDefaultSingleLineTooltip()}},getDefaultAreaAxis=function(){return getDefaultLineAxis()},getDefaultAreaGrid=function(){return getDefaultLineGrid()},getDefaultAreaLegend=function(){return getDefaultLineLegend()},getDefaultAreaPoint=function(){return getDefaultLinePoint()},getDefaultAreaConfig=function(){return{axis:getDefaultAreaAxis(),grid:getDefaultAreaGrid(),color:getDefaultColors(),legend:getDefaultAreaLegend(),point:getDefaultAreaPoint()}},getDefaultSingleAreaTooltip=function(){return{contents:$().pfGetBarChartTooltipContentsFn()}},getDefaultSingleAreaLegend=function(){return getDefaultSingleLineLegend()},getDefaultSingleAreaConfig=function(){return{axis:getDefaultAreaAxis(),grid:getDefaultAreaGrid(),color:getDefaultColors(),legend:getDefaultSingleAreaLegend(),point:getDefaultAreaPoint(),tooltip:getDefaultSingleAreaTooltip()}};return{getDefaultColors:getDefaultColors,getDefaultBarGrid:getDefaultBarGrid,getDefaultBarTooltip:getDefaultBarTooltip,getDefaultBarLegend:getDefaultBarLegend,getDefaultBarConfig:getDefaultBarConfig,getDefaultGroupedBarGrid:getDefaultGroupedBarGrid,getDefaultGroupedBarLegend:getDefaultGroupedBarLegend,getDefaultGroupedBarConfig:getDefaultGroupedBarConfig,getDefaultDonut:getDefaultDonut,getDefaultDonutSize:getDefaultDonutSize,getDefaultDonutColors:getDefaultDonutColors,getDefaultDonutTooltip:getDefaultDonutTooltip,getDefaultDonutLegend:getDefaultDonutLegend,getDefaultDonutConfig:getDefaultDonutConfig,getDefaultPie:getDefaultPie,getDefaultPieSize:getDefaultPieSize,getDefaultPieColors:getDefaultPieColors,getDefaultPieTooltip:getDefaultPieTooltip,getDefaultPieLegend:getDefaultPieLegend,getDefaultPieConfig:getDefaultPieConfig,getDefaultSparklineArea:getDefaultSparklineArea,getDefaultSparklineSize:getDefaultSparklineSize,getDefaultSparklineAxis:getDefaultSparklineAxis,getDefaultSparklineLegend:getDefaultSparklineLegend,getDefaultSparklinePoint:getDefaultSparklinePoint,getDefaultSparklineTooltip:getDefaultSparklineTooltip,getDefaultSparklineConfig:getDefaultSparklineConfig,getDefaultLineAxis:getDefaultLineAxis,getDefaultLineGrid:getDefaultLineGrid,getDefaultLineLegend:getDefaultLineLegend,getDefaultLinePoint:getDefaultLinePoint,getDefaultLineConfig:getDefaultLineConfig,getDefaultSingleLineTooltip:getDefaultSingleLineTooltip,getDefaultSingleLineConfig:getDefaultSingleLineConfig,getDefaultAreaAxis:getDefaultAreaAxis,getDefaultAreaGrid:getDefaultAreaGrid,getDefaultAreaLegend:getDefaultAreaLegend,getDefaultAreaPoint:getDefaultAreaPoint,getDefaultAreaConfig:getDefaultAreaConfig,getDefaultSingleAreaTooltip:getDefaultSingleAreaTooltip,getDefaultSingleAreaConfig:getDefaultSingleAreaConfig}},patternfly.pfBreakpoints={tablet:768,desktop:1200},"function"==typeof define&&define.amd?define("patternfly",function(){return patternfly}):"undefined"!=typeof exports&&"undefined"!=typeof module?module.exports=patternfly:window.patternfly=patternfly}(window);
@@ -0,0 +1,244 @@
1
+ /**
2
+ * @summary pfEmpty for DataTables
3
+ * @description A collection of API methods providing functionality to hide and show elements when DataTables is empty.
4
+ * This ensures DataTables meets the Patternfly design pattern with a toolbar and empty state.
5
+ *
6
+ * When DataTable is redrawn and data length is zero, controls under the toolbar-pf-actions and toolbar-pf-results
7
+ * classes are disabled; including the filter drop down, filter input, action buttons, kebab, find, etc. (You may
8
+ * re-enable specific controls via the DataTables "draw.dt" event.) In addition, the DataTables empty table header and
9
+ * row are hidden while the empty state (i.e., blank slate) layout is shown.
10
+ *
11
+ * The toolbar and empty state layouts are expected to contain the classes as shown in the example below.
12
+ *
13
+ * Example:
14
+ *
15
+ * <!-- NOTE: Some configuration may be omitted for clarity -->
16
+ * <div class="row toolbar-pf table-view-pf-toolbar" id="toolbar1">
17
+ * <div class="col-sm-12">
18
+ * <form class="toolbar-pf-actions">
19
+ * ...
20
+ * </form>
21
+ * <div class="row toolbar-pf-results">
22
+ * ...
23
+ * </div>
24
+ * </div>
25
+ * </div>
26
+ * <table class="table table-striped table-bordered table-hover" id="table1">
27
+ * <thead>
28
+ * <tr>
29
+ * <th><input type="checkbox" name="selectAll"></th>
30
+ * <th>Rendering Engine</th>
31
+ * <th>Browser</th>
32
+ * </tr>
33
+ * </thead>
34
+ * </table>
35
+ * <div class="blank-slate-pf table-view-pf-empty hidden" id="emptyState1">
36
+ * <div class="blank-slate-pf-icon">
37
+ * <span class="pficon pficon pficon-add-circle-o"></span>
38
+ * </div>
39
+ * <h1>Empty State Title</h1>
40
+ * ...
41
+ * </div>
42
+ * <script>
43
+ * // NOTE: Some properties may be omitted for clarity
44
+ * $(document).ready(function() {
45
+ * var dt = $("#table1").DataTable({
46
+ * columns: [
47
+ * { data: null, ... },
48
+ * { data: "engine" },
49
+ * { data: "browser" }
50
+ * ],
51
+ * data: null,
52
+ * dom: "t",
53
+ * pfConfig: {
54
+ * emptyStateSelector: "#{{include.emptyStateId}}",
55
+ * ...
56
+ * toolbarSelector: "#{{include.toolbarId}}"
57
+ * }
58
+ * });
59
+ * dt.table().pfEmpty.updateState(); // Optional API to force update
60
+ * });
61
+ * </script>
62
+ *
63
+ * Note: This functionality requires the following Javascript library files to be loaded:
64
+ *
65
+ * https://cdn.datatables.net/select/1.2.0/js/dataTables.select.min.js
66
+ */
67
+ (function (factory) {
68
+ "use strict";
69
+ if (typeof define === "function" && define.amd ) {
70
+ // AMD
71
+ define (["jquery", "datatables.net"], function ($) {
72
+ return factory ($, window, document);
73
+ });
74
+ } else if (typeof exports === "object") {
75
+ // CommonJS
76
+ module.exports = function (root, $) {
77
+ if (!root) {
78
+ root = window;
79
+ }
80
+ if (!$ || !$.fn.dataTable) {
81
+ $ = require("datatables.net")(root, $).$;
82
+ }
83
+ return factory($, root, root.document);
84
+ };
85
+ } else {
86
+ // Browser
87
+ factory(jQuery, window, document);
88
+ }
89
+ }(function ($, window, document, undefined) {
90
+ "use strict";
91
+ var DataTable = $.fn.dataTable;
92
+ var ACTIONS_SELECTOR = ".toolbar-pf-actions"; // Toolbar actions
93
+ var RESULTS_SELECTOR = ".toolbar-pf-results"; // Toolbar results row
94
+
95
+ DataTable.pfEmpty = {};
96
+
97
+ /**
98
+ * Initialize
99
+ *
100
+ * @param {DataTable.Api} dt DataTable
101
+ * @private
102
+ */
103
+ DataTable.pfEmpty.init = function (dt) {
104
+ var ctx = dt.settings()[0];
105
+ var opts = (ctx.oInit.pfConfig) ? ctx.oInit.pfConfig : {};
106
+
107
+ ctx._pfEmpty = {};
108
+ ctx._pfEmpty.emptyState = $(opts.emptyStateSelector); // Empty state (Blank slate)
109
+ ctx._pfEmpty.isEmptyState = false; // Flag indicating DatTable entered an empty state
110
+ ctx._pfEmpty.tbody = $("tbody", dt.table().container()); // Table body
111
+ ctx._pfEmpty.thead = $("thead", dt.table().container()); // Table head
112
+ ctx._pfEmpty.toolbarActions = $(ACTIONS_SELECTOR, opts.toolbarSelector); // Toolbar actions
113
+ ctx._pfEmpty.toolbarResults = $(RESULTS_SELECTOR, opts.toolbarSelector); // Toolbar results row
114
+
115
+ // Update table on DataTables draw event
116
+ dt.on("draw.dt", function () {
117
+ updateState(dt);
118
+ });
119
+
120
+ // Initialize
121
+ updateState(dt);
122
+ };
123
+
124
+ // Local functions
125
+
126
+ /**
127
+ * Disable and hide elements when DataTables has no data
128
+ *
129
+ * @param {DataTable.Api} dt DataTable
130
+ * @private
131
+ */
132
+ function updateEmptyState (dt) {
133
+ var ctx = dt.settings()[0];
134
+
135
+ // Show blank slate
136
+ if (ctx._pfEmpty.emptyState !== undefined && ctx._pfEmpty.emptyState.length !== 0) {
137
+ ctx._pfEmpty.emptyState.removeClass("hidden");
138
+ }
139
+ // Hide zero records message
140
+ if (ctx._pfEmpty.tbody !== undefined && ctx._pfEmpty.tbody.length !== 0) {
141
+ ctx._pfEmpty.tbody.addClass("hidden");
142
+ }
143
+ // Hide column headers
144
+ if (ctx._pfEmpty.thead !== undefined && ctx._pfEmpty.thead.length !== 0) {
145
+ ctx._pfEmpty.thead.addClass("hidden");
146
+ }
147
+ // Disable all buttons
148
+ if (ctx._pfEmpty.toolbarActions !== undefined && ctx._pfEmpty.toolbarActions.length !== 0) {
149
+ $("button", ctx._pfEmpty.toolbarActions).prop("disabled", true);
150
+ }
151
+ // Disable all inputs
152
+ if (ctx._pfEmpty.toolbarActions !== undefined && ctx._pfEmpty.toolbarActions.length !== 0) {
153
+ $("input", ctx._pfEmpty.toolbarActions).prop("disabled", true);
154
+ }
155
+ // Hide results container
156
+ if (ctx._pfEmpty.toolbarResults !== undefined && ctx._pfEmpty.toolbarResults.length !== 0) {
157
+ ctx._pfEmpty.toolbarResults.children().addClass("hidden");
158
+ }
159
+ // Enable on empty
160
+ if (ctx._pfEmpty.enableOnEmpty !== undefined) {
161
+ $(ctx._pfEmpty.enableOnEmpty).prop("disabled", false);
162
+ }
163
+ // Enable on empty
164
+ if (ctx._pfEmpty.enableOnEmpty !== undefined) {
165
+ $(ctx._pfEmpty.enableOnEmpty).prop("disabled", false);
166
+ }
167
+ }
168
+
169
+ /**
170
+ * Enable and show elements when DataTables has data
171
+ *
172
+ * @param {DataTable.Api} dt DataTable
173
+ * @private
174
+ */
175
+ function updateNonEmptyState (dt) {
176
+ var ctx = dt.settings()[0];
177
+
178
+ // Hide blank slate
179
+ if (ctx._pfEmpty.emptyState !== undefined && ctx._pfEmpty.emptyState.length !== 0) {
180
+ ctx._pfEmpty.emptyState.addClass("hidden");
181
+ }
182
+ // Show table body
183
+ if (ctx._pfEmpty.tbody !== undefined && ctx._pfEmpty.tbody.length !== 0) {
184
+ ctx._pfEmpty.tbody.removeClass("hidden");
185
+ }
186
+ // Show column headers
187
+ if (ctx._pfEmpty.thead !== undefined && ctx._pfEmpty.thead.length !== 0) {
188
+ ctx._pfEmpty.thead.removeClass("hidden");
189
+ }
190
+ // Enable all buttons
191
+ if (ctx._pfEmpty.toolbarActions !== undefined && ctx._pfEmpty.toolbarActions.length !== 0) {
192
+ $("button", ctx._pfEmpty.toolbarActions).prop("disabled", false);
193
+ }
194
+ // Enable all inputs
195
+ if (ctx._pfEmpty.toolbarActions !== undefined && ctx._pfEmpty.toolbarActions.length !== 0) {
196
+ $("input", ctx._pfEmpty.toolbarActions).prop("disabled", false);
197
+ }
198
+ // Show results container
199
+ if (ctx._pfEmpty.toolbarResults !== undefined && ctx._pfEmpty.toolbarResults.length !== 0) {
200
+ ctx._pfEmpty.toolbarResults.children().removeClass("hidden");
201
+ }
202
+ }
203
+
204
+ /**
205
+ * Update elements upon empty DataTable state
206
+ *
207
+ * @param {DataTable.Api} dt DataTable
208
+ * @private
209
+ */
210
+ function updateState (dt) {
211
+ var ctx = dt.settings()[0];
212
+
213
+ // Don't enable or show elements unless DataTable was empty
214
+ if (dt.data().length === 0) {
215
+ ctx._pfEmpty.isEmptyState = true;
216
+ updateEmptyState(dt);
217
+ } else if (ctx._pfEmpty.isEmptyState === true) {
218
+ ctx._pfEmpty.isEmptyState = false;
219
+ updateNonEmptyState(dt);
220
+ }
221
+ }
222
+
223
+ // DataTables API
224
+
225
+ /**
226
+ * Update state upon empty or non-empty DataTable
227
+ *
228
+ * Example: dt.table().pfEmpty.updateState();
229
+ */
230
+ DataTable.Api.register("pfEmpty.updateState()", function () {
231
+ return this.iterator("table", function (ctx) {
232
+ update(new DataTable.Api(ctx));
233
+ });
234
+ });
235
+
236
+ // DataTables creation
237
+ $(document).on("init.dt", function (e, ctx, json) {
238
+ if (e.namespace !== "dt") {
239
+ return;
240
+ }
241
+ DataTable.pfEmpty.init(new DataTable.Api(ctx));
242
+ });
243
+ return DataTable.pfEmpty;
244
+ }));
@@ -0,0 +1 @@
1
+ !function(factory){"use strict";"function"==typeof define&&define.amd?define(["jquery","datatables.net"],function($){return factory($,window,document)}):"object"==typeof exports?module.exports=function(root,$){return root||(root=window),$&&$.fn.dataTable||($=require("datatables.net")(root,$).$),factory($,root,root.document)}:factory(jQuery,window,document)}(function($,window,document,undefined){"use strict";function updateEmptyState(dt){var ctx=dt.settings()[0];ctx._pfEmpty.emptyState!==undefined&&0!==ctx._pfEmpty.emptyState.length&&ctx._pfEmpty.emptyState.removeClass("hidden"),ctx._pfEmpty.tbody!==undefined&&0!==ctx._pfEmpty.tbody.length&&ctx._pfEmpty.tbody.addClass("hidden"),ctx._pfEmpty.thead!==undefined&&0!==ctx._pfEmpty.thead.length&&ctx._pfEmpty.thead.addClass("hidden"),ctx._pfEmpty.toolbarActions!==undefined&&0!==ctx._pfEmpty.toolbarActions.length&&$("button",ctx._pfEmpty.toolbarActions).prop("disabled",!0),ctx._pfEmpty.toolbarActions!==undefined&&0!==ctx._pfEmpty.toolbarActions.length&&$("input",ctx._pfEmpty.toolbarActions).prop("disabled",!0),ctx._pfEmpty.toolbarResults!==undefined&&0!==ctx._pfEmpty.toolbarResults.length&&ctx._pfEmpty.toolbarResults.children().addClass("hidden"),ctx._pfEmpty.enableOnEmpty!==undefined&&$(ctx._pfEmpty.enableOnEmpty).prop("disabled",!1),ctx._pfEmpty.enableOnEmpty!==undefined&&$(ctx._pfEmpty.enableOnEmpty).prop("disabled",!1)}function updateNonEmptyState(dt){var ctx=dt.settings()[0];ctx._pfEmpty.emptyState!==undefined&&0!==ctx._pfEmpty.emptyState.length&&ctx._pfEmpty.emptyState.addClass("hidden"),ctx._pfEmpty.tbody!==undefined&&0!==ctx._pfEmpty.tbody.length&&ctx._pfEmpty.tbody.removeClass("hidden"),ctx._pfEmpty.thead!==undefined&&0!==ctx._pfEmpty.thead.length&&ctx._pfEmpty.thead.removeClass("hidden"),ctx._pfEmpty.toolbarActions!==undefined&&0!==ctx._pfEmpty.toolbarActions.length&&$("button",ctx._pfEmpty.toolbarActions).prop("disabled",!1),ctx._pfEmpty.toolbarActions!==undefined&&0!==ctx._pfEmpty.toolbarActions.length&&$("input",ctx._pfEmpty.toolbarActions).prop("disabled",!1),ctx._pfEmpty.toolbarResults!==undefined&&0!==ctx._pfEmpty.toolbarResults.length&&ctx._pfEmpty.toolbarResults.children().removeClass("hidden")}function updateState(dt){var ctx=dt.settings()[0];0===dt.data().length?(ctx._pfEmpty.isEmptyState=!0,updateEmptyState(dt)):ctx._pfEmpty.isEmptyState===!0&&(ctx._pfEmpty.isEmptyState=!1,updateNonEmptyState(dt))}var DataTable=$.fn.dataTable,ACTIONS_SELECTOR=".toolbar-pf-actions",RESULTS_SELECTOR=".toolbar-pf-results";return DataTable.pfEmpty={},DataTable.pfEmpty.init=function(dt){var ctx=dt.settings()[0],opts=ctx.oInit.pfConfig?ctx.oInit.pfConfig:{};ctx._pfEmpty={},ctx._pfEmpty.emptyState=$(opts.emptyStateSelector),ctx._pfEmpty.isEmptyState=!1,ctx._pfEmpty.tbody=$("tbody",dt.table().container()),ctx._pfEmpty.thead=$("thead",dt.table().container()),ctx._pfEmpty.toolbarActions=$(ACTIONS_SELECTOR,opts.toolbarSelector),ctx._pfEmpty.toolbarResults=$(RESULTS_SELECTOR,opts.toolbarSelector),dt.on("draw.dt",function(){updateState(dt)}),updateState(dt)},DataTable.Api.register("pfEmpty.updateState()",function(){return this.iterator("table",function(ctx){update(new DataTable.Api(ctx))})}),$(document).on("init.dt",function(e,ctx,json){"dt"===e.namespace&&DataTable.pfEmpty.init(new DataTable.Api(ctx))}),DataTable.pfEmpty});
@@ -0,0 +1,421 @@
1
+ /**
2
+ * @summary pfFilter for DataTables
3
+ * @description A collection of API methods providing simple filter functionality for DataTables. This ensures
4
+ * DataTables meets the Patternfly design pattern with a toolbar.
5
+ *
6
+ * To apply a filter, the user must press enter in the given filter input. The user may apply a filter to a different
7
+ * column via the given filter drop down. After a filter has been applied, the filter results text, active filter
8
+ * controls, and a clear all control are shown.
9
+ *
10
+ * The toolbar and empty state layouts are expected to contain the classes as shown in the example below.
11
+ *
12
+ * Example:
13
+ *
14
+ * <!-- NOTE: Some configuration may be omitted for clarity -->
15
+ * <div class="row toolbar-pf table-view-pf-toolbar" id="toolbar1">
16
+ * <div class="col-sm-12">
17
+ * <form class="toolbar-pf-actions">
18
+ * <div class="form-group toolbar-pf-filter">
19
+ * <label class="sr-only" for="filter">Rendering Engine</label>
20
+ * <div class="input-group">
21
+ * <div class="input-group-btn">
22
+ * <button type="button" class="btn btn-default dropdown-toggle" id="filter" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Rendering Engine <span class="caret"></span></button>
23
+ * <ul class="dropdown-menu">
24
+ * <li><a href="#" id="filter1">Rendering Engine</a></li>
25
+ * <li><a href="#" id="filter2">Browser</a></li>
26
+ * </ul>
27
+ * </div>
28
+ * <input type="text" class="form-control" placeholder="Filter By Rendering Engine..." autocomplete="off" id="filterInput">
29
+ * </div>
30
+ * </div>
31
+ * ...
32
+ * </form>
33
+ * <div class="row toolbar-pf-results">
34
+ * <div class="col-sm-9">
35
+ * <div class="hidden">
36
+ * <h5>0 Results</h5>
37
+ * <p>Active filters:</p>
38
+ * <ul class="list-inline"></ul>
39
+ * <p><a href="#">Clear All Filters</a></p>
40
+ * </div>
41
+ * </div>
42
+ * <div class="col-sm-3 table-view-pf-select-results">
43
+ * <strong>0</strong> of <strong>0</strong> selected
44
+ * </div>
45
+ * </div>
46
+ * </div>
47
+ * </div>
48
+ * <table class="table table-striped table-bordered table-hover" id="table1">
49
+ * <thead>
50
+ * <tr>
51
+ * <th><input type="checkbox" name="selectAll"></th>
52
+ * <th>Rendering Engine</th>
53
+ * <th>Browser</th>
54
+ * </tr>
55
+ * </thead>
56
+ * </table>
57
+ * ...
58
+ * <script>
59
+ * // NOTE: Some properties may be omitted for clarity
60
+ * $(document).ready(function() {
61
+ * var dt = $("#table1").DataTable({
62
+ * columns: [
63
+ * { data: null, ... },
64
+ * { data: "engine" },
65
+ * { data: "browser" }
66
+ * ],
67
+ * data: [
68
+ * { engine: "Gecko", browser: "Firefox" }
69
+ * { engine: "Trident", browser: "Mozilla" }
70
+ * ],
71
+ * dom: "t",
72
+ * pfConfig: {
73
+ * ...
74
+ * filterCols: [
75
+ * null,
76
+ * {
77
+ * default: true,
78
+ * optionSelector: "#{{include.filterId1}}",
79
+ * placeholder: "Filter By Rendering Engine..."
80
+ * }, {
81
+ * optionSelector: "#{{include.filterId2}}",
82
+ * placeholder: "Filter By Browser..."
83
+ * }
84
+ * ],
85
+ * toolbarSelector: "#{{include.toolbarId}}"
86
+ * }
87
+ * });
88
+ * // Optional API to clear filters
89
+ * dt.table().pfFilter.clearFilters();
90
+ *
91
+ * // Optional API to add filter
92
+ * dt.table().pfFilter.addFilter({
93
+ * column: 2,
94
+ * name: "Browser",
95
+ * value: "Firefox"
96
+ * });
97
+ * });
98
+ * </script>
99
+ *
100
+ * Note: This functionality requires the following Javascript library files to be loaded:
101
+ *
102
+ * https://cdn.datatables.net/select/1.2.0/js/dataTables.select.min.js
103
+ */
104
+ (function (factory) {
105
+ "use strict";
106
+ if (typeof define === "function" && define.amd ) {
107
+ // AMD
108
+ define (["jquery", "datatables.net"], function ($) {
109
+ return factory ($, window, document);
110
+ });
111
+ } else if (typeof exports === "object") {
112
+ // CommonJS
113
+ module.exports = function (root, $) {
114
+ if (!root) {
115
+ root = window;
116
+ }
117
+ if (!$ || !$.fn.dataTable) {
118
+ $ = require("datatables.net")(root, $).$;
119
+ }
120
+ return factory($, root, root.document);
121
+ };
122
+ } else {
123
+ // Browser
124
+ factory(jQuery, window, document);
125
+ }
126
+ }(function ($, window, document, undefined) {
127
+ "use strict";
128
+ var DataTable = $.fn.dataTable;
129
+ var ACTIVE_FILTER_CONTROLS_SELECTOR = ".list-inline"; // Active filter controls
130
+ var CLEAR_FILTERS_SELECTOR = ".toolbar-pf-results a"; // Clear filters control
131
+ var FILTER_SELECTOR = ".toolbar-pf-filter"; // Filter input
132
+ var FILTER_BUTTON_SELECTOR = FILTER_SELECTOR + " button"; // Filter button
133
+ var FILTER_INPUT_SELECTOR = FILTER_SELECTOR + " input"; // Filter input
134
+ var FILTER_LABEL_SELECTOR = FILTER_SELECTOR + " label"; // Filter label
135
+ var RESULTS_SELECTOR = ".toolbar-pf-results"; // Toolbar results row
136
+ var FILTER_RESULTS_SELECTOR = RESULTS_SELECTOR + " h5"; // Toolbar filter results
137
+
138
+ DataTable.pfFilter = {};
139
+
140
+ /**
141
+ * Initialize
142
+ *
143
+ * @param {DataTable.Api} dt DataTable
144
+ * @private
145
+ */
146
+ DataTable.pfFilter.init = function (dt) {
147
+ var i;
148
+ var ctx = dt.settings()[0];
149
+ var opts = (ctx.oInit.pfConfig) ? ctx.oInit.pfConfig : {};
150
+
151
+ ctx._pfFilter = {};
152
+ ctx._pfFilter.filterButton = $(FILTER_BUTTON_SELECTOR, opts.toolbarSelector); // Filter button
153
+ ctx._pfFilter.filterCols = opts.filterCols; // Filter colums config
154
+ ctx._pfFilter.filterLabel = $(FILTER_LABEL_SELECTOR, opts.toolbarSelector); // Filter label
155
+ ctx._pfFilter.filterInput = $(FILTER_INPUT_SELECTOR, opts.toolbarSelector); // Filter input
156
+ ctx._pfFilter.filters = []; // Applied filters array
157
+ ctx._pfFilter.activeFilterControls = $(ACTIVE_FILTER_CONTROLS_SELECTOR, opts.toolbarSelector); // Active filter controls
158
+ ctx._pfFilter.activeFilters = ctx._pfFilter.activeFilterControls.closest("div"); // Active filters container
159
+ ctx._pfFilter.clearFilters = $(CLEAR_FILTERS_SELECTOR, opts.toolbarSelector); // Clear filters control
160
+ ctx._pfFilter.results = $(RESULTS_SELECTOR, opts.toolbarSelector); // Toolbar results row
161
+ ctx._pfFilter.filterResults = $(FILTER_RESULTS_SELECTOR, opts.toolbarSelector); // Toolbar filter results
162
+
163
+ if (ctx._pfFilter.filterCols === undefined) {
164
+ return;
165
+ }
166
+
167
+ // Set default filter properties
168
+ for (i = 0; i < ctx._pfFilter.filterCols.length; i++) {
169
+ if (ctx._pfFilter.filterCols[i] === null) {
170
+ continue;
171
+ }
172
+ ctx._pfFilter.filterColumn = i; // Current filter column
173
+ ctx._pfFilter.filterName = $(ctx._pfFilter.filterCols[i].optionSelector).text(); // Name of current filter
174
+ if (ctx._pfFilter.filterCols[i].default === true) {
175
+ break;
176
+ }
177
+ }
178
+
179
+ // Handle click on filter menu to set current filter column and name
180
+ for (i = 0; i < ctx._pfFilter.filterCols.length; i++) {
181
+ handleFilterOption(dt, i); // Need to pass value of i as a function
182
+ }
183
+
184
+ // Handle actions when enter is pressed within filter input
185
+ handleFilterInput(dt);
186
+
187
+ // Handle actions when clear filters control is selected
188
+ handleClearFilters(dt);
189
+
190
+ // Simple filter
191
+ $.fn.dataTable.ext.search.push(function (ctx, data, dataIndex) {
192
+ var showThisRow = true;
193
+ // Must match all filters
194
+ if (ctx._pfFilter) {
195
+ $.each(ctx._pfFilter.filters, function (index, filter) {
196
+ if (data[filter.column].indexOf(filter.value) === -1) {
197
+ showThisRow = false;
198
+ }
199
+ });
200
+ }
201
+ return showThisRow;
202
+ });
203
+ };
204
+
205
+ // Local functions
206
+
207
+ /**
208
+ * Add active filter control
209
+ *
210
+ * @param {DataTable.Api} dt DataTable
211
+ * @param {object} filter Properties associated with a new filter
212
+ * @param {string} filter.column - Column associated with DataTable
213
+ * @param {string} filter.name - Name of the filter
214
+ * @param {string} filter.value - Value of the filter
215
+ * @private
216
+ */
217
+ function addActiveFilterControl (dt, filter) {
218
+ var ctx = dt.settings()[0];
219
+ var i;
220
+
221
+ // Append active filter control
222
+ ctx._pfFilter.activeFilterControls.append('<li><span class="label label-info">' + filter.name + ': ' +
223
+ filter.value + '<a href="#"><span class="pficon pficon-close"/></a></span></li>');
224
+
225
+ // Handle click to clear active filter
226
+ $("a", ctx._pfFilter.activeFilterControls).last().on("click", function (e) {
227
+ // Find existing filter and remove
228
+ for (i = 0; i < ctx._pfFilter.filters.length; i++) {
229
+ if (ctx._pfFilter.filters[i].column === filter.column && ctx._pfFilter.filters[i].value === filter.value) {
230
+ ctx._pfFilter.filters.splice(i, 1);
231
+ $(this).parents("li").remove();
232
+ break;
233
+ }
234
+ }
235
+ if (ctx._pfFilter.filters.length === 0) {
236
+ ctx._pfFilter.activeFilters.addClass("hidden"); // Hide
237
+ }
238
+ dt.draw();
239
+ updateFilterResults(dt);
240
+ });
241
+ // Show active filters
242
+ ctx._pfFilter.activeFilters.removeClass("hidden");
243
+ }
244
+
245
+ /**
246
+ * Add filter
247
+ *
248
+ * @param {DataTable.Api} dt DataTable
249
+ * @param {object} filter Properties associated with a new filter
250
+ * @param {string} filter.column - Column associated with DataTable
251
+ * @param {string} filter.name - Name of the filter
252
+ * @param {string} filter.value - Value of the filter
253
+ * @private
254
+ */
255
+ function addFilter (dt, filter) {
256
+ var ctx = dt.settings()[0];
257
+ var found = false;
258
+
259
+ // Find existing entry
260
+ $.grep(ctx._pfFilter.filters, function (f) {
261
+ if (f.column === filter.column && f.value === filter.value) {
262
+ found = true;
263
+ }
264
+ });
265
+
266
+ // Add new filter
267
+ if (!found) {
268
+ ctx._pfFilter.filters.push(filter);
269
+ dt.draw();
270
+ addActiveFilterControl(dt, filter);
271
+ updateFilterResults(dt);
272
+ }
273
+ ctx._pfFilter.filterInput.val(""); // Clear input
274
+ }
275
+
276
+ /**
277
+ * Clear filters
278
+ *
279
+ * @param {DataTable.Api} dt DataTable
280
+ * @private
281
+ */
282
+ function clearFilters (dt) {
283
+ var ctx = dt.settings()[0];
284
+ ctx._pfFilter.filters.length = 0; // Reset filters
285
+ ctx._pfFilter.activeFilterControls.html(""); // Remove active filter controls
286
+ ctx._pfFilter.activeFilters.addClass("hidden"); // Hide active filters area
287
+ dt.draw();
288
+ }
289
+
290
+ /**
291
+ * Handle actions when clear filters control is selected
292
+ *
293
+ * @param {DataTable.Api} dt DataTable
294
+ * @private
295
+ */
296
+ function handleClearFilters (dt) {
297
+ var ctx = dt.settings()[0];
298
+ if (ctx._pfFilter.clearFilters === undefined || ctx._pfFilter.clearFilters.length === 0) {
299
+ return;
300
+ }
301
+ ctx._pfFilter.clearFilters.on("click", function (e) {
302
+ clearFilters(dt);
303
+ });
304
+ }
305
+
306
+ /**
307
+ * Handle actions when enter is pressed within filter input
308
+ *
309
+ * @param {DataTable.Api} dt DataTable
310
+ * @private
311
+ */
312
+ function handleFilterInput (dt) {
313
+ var ctx = dt.settings()[0];
314
+ if (ctx._pfFilter.filterInput === undefined || ctx._pfFilter.filterInput.length === 0) {
315
+ return;
316
+ }
317
+ ctx._pfFilter.filterInput.on("keypress", function (e) {
318
+ var keycode = (e.keyCode ? e.keyCode : e.which);
319
+ if (keycode === 13) {
320
+ e.preventDefault();
321
+ if (this.value.trim().length > 0) {
322
+ addFilter(dt, {
323
+ column: ctx._pfFilter.filterColumn,
324
+ name: ctx._pfFilter.filterName,
325
+ value: this.value
326
+ });
327
+ }
328
+ return false;
329
+ }
330
+ return true;
331
+ });
332
+ }
333
+
334
+ /**
335
+ * Handle actions when filter options are selected
336
+ *
337
+ * @param {DataTable.Api} dt DataTable
338
+ * @param {number} i The column associated with this handler
339
+ * @private
340
+ */
341
+ function handleFilterOption (dt, i) {
342
+ var ctx = dt.settings()[0];
343
+ if (ctx._pfFilter.filterCols[i] === null || ctx._pfFilter.filterCols[i].optionSelector === undefined) {
344
+ return;
345
+ }
346
+ $(ctx._pfFilter.filterCols[i].optionSelector).on("click", function (e) {
347
+ // Set input placeholder
348
+ if (ctx._pfFilter.filterInput !== undefined && ctx._pfFilter.filterInput.length !== 0) {
349
+ ctx._pfFilter.filterInput.get(0).placeholder = ctx._pfFilter.filterCols[i].placeholder;
350
+ }
351
+ // Set filter label
352
+ if (ctx._pfFilter.filterLabel !== undefined && ctx._pfFilter.filterLabel.length !== 0) {
353
+ ctx._pfFilter.filterLabel.html($(this).text());
354
+ }
355
+ // Set filter button
356
+ if (ctx._pfFilter.filterButton !== undefined && ctx._pfFilter.filterButton.length !== 0) {
357
+ ctx._pfFilter.filterButton.html($(this).text() + ' <span class="caret"></span>');
358
+ }
359
+ ctx._pfFilter.filterColumn = i; // Save filter column when applying filter
360
+ ctx._pfFilter.filterName = $(this).text(); // Save filter name for active filter control
361
+ });
362
+ }
363
+
364
+ /**
365
+ * Update active filter results
366
+ *
367
+ * @param {DataTable.Api} dt DataTable
368
+ * @private
369
+ */
370
+ function updateFilterResults (dt) {
371
+ var ctx = dt.settings()[0];
372
+ var filteredRows = dt.rows({"page": "current", "search": "applied"}).flatten().length;
373
+ if (ctx._pfFilter.filterResults === undefined || ctx._pfFilter.filterResults.length === 0) {
374
+ return;
375
+ }
376
+ ctx._pfFilter.filterResults.html(filteredRows + " Results");
377
+ }
378
+
379
+ // DataTables API
380
+
381
+ /**
382
+ * Add filter
383
+ *
384
+ * Example: dt.table().pfFilter.addFilter({
385
+ * column: 2,
386
+ * name: "Browser",
387
+ * value: "Firefox"
388
+ * });
389
+ *
390
+ * @param {object} filter Properties associated with a new filter
391
+ * @param {string} filter.column - Column associated with DataTable
392
+ * @param {string} filter.name - Name of the filter
393
+ * @param {string} filter.value - Value of the filter
394
+ */
395
+ DataTable.Api.register("pfFilter.addFilter()", function (filter) {
396
+ return this.iterator("table", function (ctx) {
397
+ addFilter(new DataTable.Api(ctx), filter);
398
+ });
399
+ });
400
+
401
+ /**
402
+ * Clear filters
403
+ *
404
+ * Example: dt.table().pfFilter.clearFilters();
405
+ *
406
+ */
407
+ DataTable.Api.register("pfFilter.clearFilters()", function () {
408
+ return this.iterator("table", function (ctx) {
409
+ clearFilters(new DataTable.Api(ctx));
410
+ });
411
+ });
412
+
413
+ // DataTables creation
414
+ $(document).on("init.dt", function (e, ctx, json) {
415
+ if (e.namespace !== "dt") {
416
+ return;
417
+ }
418
+ DataTable.pfFilter.init(new DataTable.Api(ctx));
419
+ });
420
+ return DataTable.pfFilter;
421
+ }));