forked from kartik-v/yii2-grid
-
Notifications
You must be signed in to change notification settings - Fork 0
/
GridView.php
1654 lines (1559 loc) · 70.5 KB
/
GridView.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?php
/**
* @package yii2-grid
* @author Kartik Visweswaran <[email protected]>
* @copyright Copyright © Kartik Visweswaran, Krajee.com, 2014 - 2016
* @version 3.1.2
*/
namespace kartik\grid;
use Yii;
use yii\base\InvalidConfigException;
use yii\bootstrap\ButtonDropdown;
use yii\helpers\ArrayHelper;
use yii\helpers\Html;
use yii\helpers\Json;
use yii\helpers\Url;
use yii\grid\Column;
use yii\web\JsExpression;
use yii\web\View;
use yii\widgets\Pjax;
use kartik\base\Config;
use kartik\dialog\Dialog;
/**
* Enhances the Yii GridView widget with various options to include Bootstrap specific styling enhancements. Also
* allows to simply disable Bootstrap styling by setting `bootstrap` to false. Includes an extended data column for
* column specific enhancements.
*
*
* @author Kartik Visweswaran <[email protected]>
* @since 1.0
*/
class GridView extends \yii\grid\GridView
{
/**
* Trivalen Icons
*/
const ICON_TRIVALENT_ONE = '<span class="glyphicon glyphicon-remove text-danger"></span>';
const ICON_TRIVALENT_TWO = '<span class="glyphicon glyphicon-hourglass text-success"></span>';
const ICON_TRIVALENT_THREE = '<span class="glyphicon glyphicon-ok text-success"></span>';
/**
* Bootstrap Contextual Color Types
*/
const TYPE_DEFAULT = 'default'; // only applicable for panel contextual style
const TYPE_PRIMARY = 'primary';
const TYPE_INFO = 'info';
const TYPE_DANGER = 'danger';
const TYPE_WARNING = 'warning';
const TYPE_SUCCESS = 'success';
const TYPE_ACTIVE = 'active'; // only applicable for table row contextual style
/**
* Boolean Icons
*/
const ICON_ACTIVE = '<span class="glyphicon glyphicon-ok text-success"></span>';
const ICON_INACTIVE = '<span class="glyphicon glyphicon-remove text-danger"></span>';
/**
* Expand Row Icons
*/
const ICON_EXPAND = '<span class="glyphicon glyphicon-expand"></span>';
const ICON_COLLAPSE = '<span class="glyphicon glyphicon-collapse-down"></span>';
const ICON_UNCHECKED = '<span class="glyphicon glyphicon-unchecked"></span>';
/**
* Expand Row States
*/
const ROW_NONE = -1;
const ROW_EXPANDED = 0;
const ROW_COLLAPSED = 1;
/**
* Alignment
*/
// Horizontal Alignment
const ALIGN_RIGHT = 'right';
const ALIGN_CENTER = 'center';
const ALIGN_LEFT = 'left';
// Vertical Alignment
const ALIGN_TOP = 'top';
const ALIGN_MIDDLE = 'middle';
const ALIGN_BOTTOM = 'bottom';
// CSS for preventing cell wrapping
const NOWRAP = 'kv-nowrap';
/**
* Filter input types
*/
// input types
const FILTER_CHECKBOX = 'checkbox';
const FILTER_RADIO = 'radio';
// input widget classes
const FILTER_SELECT2 = '\kartik\select2\Select2';
const FILTER_TYPEAHEAD = '\kartik\typeahead\Typeahead';
const FILTER_SWITCH = '\kartik\switchinput\SwitchInput';
const FILTER_SPIN = '\kartik\touchspin\TouchSpin';
const FILTER_STAR = '\kartik\rating\StarRating';
const FILTER_DATE = '\kartik\date\DatePicker';
const FILTER_TIME = '\kartik\time\TimePicker';
const FILTER_DATETIME = '\kartik\datetime\DateTimePicker';
const FILTER_DATE_RANGE = '\kartik\daterange\DateRangePicker';
const FILTER_SORTABLE = '\kartik\sortinput\SortableInput';
const FILTER_RANGE = '\kartik\range\RangeInput';
const FILTER_COLOR = '\kartik\color\ColorInput';
const FILTER_SLIDER = '\kartik\slider\Slider';
const FILTER_MONEY = '\kartik\money\MaskMoney';
const FILTER_CHECKBOX_X = '\kartik\checkbox\CheckboxX';
/**
* Summary Functions
*/
const F_COUNT = 'f_count';
const F_SUM = 'f_sum';
const F_MAX = 'f_max';
const F_MIN = 'f_min';
const F_AVG = 'f_avg';
/**
* Grid Export Formats
*/
const HTML = 'html';
const CSV = 'csv';
const TEXT = 'txt';
const EXCEL = 'xls';
const PDF = 'pdf';
const JSON = 'json';
/**
* Grid export download targets
*/
const TARGET_POPUP = '_popup';
const TARGET_SELF = '_self';
const TARGET_BLANK = '_blank';
/**
* @var array configuration settings for the Krajee dialog widget that will be used to render alerts and
* confirmation dialog prompts
* @see http://demos.krajee.com/dialog
*/
public $krajeeDialogSettings = [];
/**
* @var string the panel prefix
*/
public $panelPrefix = 'panel panel-';
/**
* @var string the template for rendering the grid within a bootstrap styled panel.
* The following special variables are recognized and will be replaced:
* - {prefix}, string the CSS prefix name as set in panelPrefix. Defaults to `panel panel-`.
* - {type}, string the panel type that will append the bootstrap contextual CSS.
* - {panelHeading}, string, which will render the panel heading block.
* - {panelBefore}, string, which will render the panel before block.
* - {panelAfter}, string, which will render the panel after block.
* - {panelFooter}, string, which will render the panel footer block.
* - {items}, string, which will render the grid items.
* - {summary}, string, which will render the grid results summary.
* - {pager}, string, which will render the grid pagination links.
* - {toolbar}, string, which will render the [[$toolbar]] property passed
* - {export}, string, which will render the [[$export]] menu button content.
*/
public $panelTemplate = <<< HTML
<div class="{prefix}{type}">
{panelHeading}
{panelBefore}
{items}
{panelAfter}
{panelFooter}
</div>
HTML;
/**
* @var string the template for rendering the panel heading.
* The following special variables are recognized and will be replaced:
* - `{heading}`: string, which will render the panel heading content.
* - `{summary}`: string, which will render the grid results summary.
* - `{items}`: string, which will render the grid items.
* - `{pager}`: string, which will render the grid pagination links.
* - `{sort}`: string, which will render the grid sort links.
* - `{toolbar}`: string, which will render the [[$toolbar]] property passed
* - `{export}`: string, which will render the [[$export]] menu button content.
*/
public $panelHeadingTemplate = <<< HTML
<div class="pull-right">
{summary}
</div>
<h3 class="panel-title">
{heading}
</h3>
<div class="clearfix"></div>
HTML;
/**
* @var string the template for rendering the panel footer.
* The following special variables are recognized and will be replaced:
* - `{footer}`: string, which will render the panel footer content.
* - `{summary}`: string, which will render the grid results summary.
* - `{items}`: string, which will render the grid items.
* - `{sort}`: string, which will render the grid sort links.
* - `{pager}`: string, which will render the grid pagination links.
* - `{toolbar}`: string, which will render the [[$toolbar]] property passed
* - `{export}`: string, which will render the [[$export]] menu button content
*/
public $panelFooterTemplate = <<< HTML
<div class="kv-panel-pager">
{pager}
</div>
{footer}
<div class="clearfix"></div>
HTML;
/**
* @var string the template for rendering the `{before} part in the layout templates.
* The following special variables are recognized and will be replaced:
* - `{before}`: string, which will render the [[$before]] text passed in the panel settings
* - `{summary}`: string, which will render the grid results summary.
* - `{items}`: string, which will render the grid items.
* - `{sort}`: string, which will render the grid sort links.
* - `{pager}`: string, which will render the grid pagination links.
* - `{toolbar}`: string, which will render the [[$toolbar]] property passed
* - `{export}`: string, which will render the [[$export]] menu button content
*/
public $panelBeforeTemplate = <<< HTML
<div class="pull-right">
<div class="btn-toolbar kv-grid-toolbar" role="toolbar">
{toolbar}
</div>
</div>
{before}
<div class="clearfix"></div>
HTML;
/**
* @var string the template for rendering the `{after} part in the layout templates.
* The following special variables are recognized and will be replaced:
* - `{after}`: string, which will render the [[$after]] text passed in the panel settings
* - `{summary}`: string, which will render the grid results summary.
* - `{items}`: string, which will render the grid items.
* - `{sort}`: string, which will render the grid sort links.
* - `{pager}`: string, which will render the grid pagination links.
* - `{toolbar}`: string, which will render the [[$toolbar]] property passed
* - `{export}`: string, which will render the [[$export]] menu button content
*/
public $panelAfterTemplate = '{after}';
/**
* @var array|string, configuration of additional header table rows that will be rendered before the default grid
* header row. If set as a string, it will be displayed as is, without any HTML encoding. If set as an array, each
* row in this array corresponds to a HTML table row, where you can configure the columns with these properties:
* - columns: array, the header row columns configuration where you can set the following properties:
* - content: string, the table cell content for the column
* - tag: string, the tag for rendering the table cell. If not set, defaults to 'th'.
* - options: array, the HTML attributes for the table cell
* - options: array, the HTML attributes for the table row
*/
public $beforeHeader = [];
/**
* @var array|string, configuration of additional header table rows that will be rendered after default grid
* header row. If set as a string, it will be displayed as is, without any HTML encoding. If set as an array, each
* row in this array corresponds to a HTML table row, where you can configure the columns with these properties:
* - columns: array, the header row columns configuration where you can set the following properties:
* - content: string, the table cell content for the column
* - tag: string, the tag for rendering the table cell. If not set, defaults to 'th'.
* - options: array, the HTML attributes for the table cell
* - options: array, the HTML attributes for the table row
*/
public $afterHeader = [];
/**
* @var array|string, configuration of additional footer table rows that will be rendered before the default grid
* footer row. If set as a string, it will be displayed as is, without any HTML encoding. If set as an array, each
* row in this array corresponds to a HTML table row, where you can configure the columns with these properties:
* - columns: array, the footer row columns configuration where you can set the following properties:
* - content: string, the table cell content for the column
* - tag: string, the tag for rendering the table cell. If not set, defaults to 'th'.
* - options: array, the HTML attributes for the table cell
* - options: array, the HTML attributes for the table row
*/
public $beforeFooter = [];
/**
* @var array|string, configuration of additional footer table rows that will be rendered after the default grid
* footer row. If set as a string, it will be displayed as is, without any HTML encoding. If set as an array, each
* row in this array corresponds to a HTML table row, where you can configure the columns with these properties:
* - columns: array, the footer row columns configuration where you can set the following properties:
* - content: string, the table cell content for the column
* - tag: string, the tag for rendering the table cell. If not set, defaults to 'th'.
* - options: array, the HTML attributes for the table cell
* - options: array, the HTML attributes for the table row
*/
public $afterFooter = [];
/**
* @var array|string the toolbar content configuration. Can be setup as a string or an array.
* - if set as a string, it will be rendered as is.
* - if set as an array, each line item will be considered as following
* - if the line item is setup as a string, it will be rendered as is
* - if the line item is an array it will be parsed for the following keys:
* - content: the content to be rendered as a bootstrap button group. The following special
* variables are recognized and will be replaced:
* - {export}, string which will render the [[$export]] menu button content.
* - {toggleData}, string which will render the button to toggle between page data and all data.
* - options: the HTML attributes for the button group div container. By default the
* CSS class `btn-group` will be attached to this container if no class is set.
*/
public $toolbar = [
'{toggleData}',
'{export}',
];
/**
* @var array tags to replace in the rendered layout. Enter this as `$key => $value` pairs, where:
* - $key: string, defines the flag.
* - $value: string|Closure, the value that will be replaced. You can set it as a callback function to return a
* string of the signature: `function ($widget) { return 'custom'; }`. For example:
*
* `['{flag}' => '<span class="glyphicon glyphicon-asterisk"></span']`
*
*/
public $replaceTags = [];
/**
* @var string the default data column class if the class name is not explicitly specified when configuring a data
* column. Defaults to 'kartik\grid\DataColumn'.
*/
public $dataColumnClass = 'kartik\grid\DataColumn';
/**
* @var array the HTML attributes for the grid footer row
*/
public $footerRowOptions = ['class' => 'kv-table-footer'];
/**
* @var array the HTML attributes for the grid table caption
*/
public $captionOptions = ['class' => 'kv-table-caption'];
/**
* @var array the HTML attributes for the grid table element
*/
public $tableOptions = [];
/**
* @var boolean whether the grid view will be rendered within a pjax container. Defaults to `false`. If set to
* `true`, the entire GridView widget will be parsed via Pjax and auto-rendered inside a yii\widgets\Pjax
* widget container. If set to `false` pjax will be disabled and none of the pjax settings will be applied.
*/
public $pjax = false;
/**
* @var array the pjax settings for the widget. This will be considered only when [[pjax]] is set to true. The
* following settings are recognized:
* - `neverTimeout`: boolean, whether the pjax request should never timeout. Defaults to `true`. The pjax:timeout
* event will be configured to disable timing out of pjax requests for the pjax container.
* - `options`: array, the options for the [[yii\widgets\Pjax]] widget.
* - `loadingCssClass`: boolean/string, the CSS class to be applied to the grid when loading via pjax. If set to
* `false` - no css class will be applied. If it is empty, null, or set to `true`, will default to
* `kv-grid-loading`.
* - `beforeGrid`: string, any content to be embedded within pjax container before the Grid widget.
* - `afterGrid`: string, any content to be embedded within pjax container after the Grid widget.
*/
public $pjaxSettings = [];
/**
* @var boolean whether to allow resizing of columns
*/
public $resizableColumns = true;
/**
* @var boolean whether to hide resizable columns for smaller screen sizes (< 768px). Defaults to `true`.
*/
public $hideResizeMobile = true;
/**
* @var array the resizableColumns plugin options
*/
public $resizableColumnsOptions = ['resizeFromBody' => false];
/**
* @var boolean whether to store resized column state using local storage persistence
* (supported by most modern browsers). Defaults to `false`.
*/
public $persistResize = false;
/**
* @var string resizable unique storage prefix to append to the grid id. If empty or not set it will default to
* Yii::$app->user->id.
*/
public $resizeStorageKey;
/**
* @var boolean whether the grid view will have Bootstrap table styling.
*/
public $bootstrap = true;
/**
* @var boolean whether the grid table will have a `bordered` style. Applicable only if `bootstrap` is `true`.
* Defaults to `true`.
*/
public $bordered = true;
/**
* @var boolean whether the grid table will have a `striped` style. Applicable only if `bootstrap` is `true`.
* Defaults to `true`.
*/
public $striped = true;
/**
* @var boolean whether the grid table will have a `condensed` style. Applicable only if `bootstrap` is `true`.
* Defaults to `false`.
*/
public $condensed = false;
/**
* @var boolean whether the grid table will have a `responsive` style. Applicable only if `bootstrap` is `true`.
* Defaults to `true`.
*/
public $responsive = true;
/**
* @var boolean whether the grid table will automatically wrap to fit columns for smaller display sizes.
*/
public $responsiveWrap = true;
/**
* @var boolean whether the grid table will highlight row on `hover`. Applicable only if `bootstrap` is `true`.
* Defaults to `false`.
*/
public $hover = false;
/**
* @var boolean whether the grid table will have a floating table header.
* Defaults to `false`.
*/
public $floatHeader = false;
/**
* @var boolean whether the table header will float and sticks around as you scroll within a container. If
* `responsive` is true then this is auto set to `true`. Defaults to `false`.
*/
public $floatOverflowContainer = false;
/**
* @var array the plugin options for the floatThead plugin that would render the floating/sticky table header
* behavior. The default offset from the top of the window where the floating header will 'stick' when
* scrolling down is set to `50` assuming a fixed bootstrap navbar on top. You can set this to 0 or any
* javascript function/expression.
* @see http://mkoryak.github.io/floatThead#options
*/
public $floatHeaderOptions = ['top' => 50];
/**
* @var boolean whether pretty perfect scrollbars using perfect scrollbar plugin is to be used. Defaults to
* `false`. If this is set to true, the `floatOverflowContainer` property will be auto set to `true`, if
* `floatHeader` is `true`.
*
* @see https://github.com/noraesae/perfect-scrollbar
*/
public $perfectScrollbar = false;
/**
* @var array the plugin options for the perfect scrollbar plugin.
*
* @see https://github.com/noraesae/perfect-scrollbar
*/
public $perfectScrollbarOptions = [];
/**
* @var array the panel settings. If this is set, the grid widget will be embedded in a bootstrap panel. Applicable
* only if `bootstrap` is `true`. The following array keys are supported:
* - `type`: string, the panel contextual type (one of the TYPE constants, if not set will default to `default` or
* `self::TYPE_DEFAULT`),
* - `heading`: string|false, the panel heading. If set to false, will not be displayed.
* - `headingOptions`: array, HTML attributes for the panel heading container. Defaults to
* `['class'=>'panel-heading']`.
* - `footer`: string|boolean, the panel footer. If set to false will not be displayed.
* - `footerOptions`: array, HTML attributes for the panel footer container. Defaults to
* `['class'=>'panel-footer']`.
* - 'before': string|boolean, content to be placed before/above the grid table (after the header). To not display
* this section, set this to `false`.
* - `beforeOptions`: array, HTML attributes for the `before` text. If the `class` is not set, it will default to
* `kv-panel-before`.
* - 'after': string|boolean, any content to be placed after/below the grid table (before the footer). To not
* display this section, set this to `false`.
* - `afterOptions`: array, HTML attributes for the `after` text. If the `class` is not set, it will default to
* `kv-panel-after`.
*/
public $panel = [];
/**
* @var boolean whether to show the page summary row for the table. This will be displayed above the footer.
*/
public $showPageSummary = false;
/**
* @array the HTML attributes for the summary row
*/
public $pageSummaryRowOptions = ['class' => 'kv-page-summary warning'];
/**
* @var string the default pagination that will be read by toggle data. Should be one of 'page' or 'all'.
* If not set to 'all', it will always defaults to 'page'.
*/
public $defaultPagination = 'page';
/**
* @var boolean whether to enable toggling of grid data. Defaults to `true`.
*/
public $toggleData = true;
/**
* @var array the settings for the toggle data button for the toggle data type. This will be setup as an
* associative array of $key => $value pairs, where $key can be:
* - 'maxCount': int|bool, the maximum number of records uptil which the toggle button will be rendered. If the
* dataProvider records exceed this setting, the toggleButton will not be displayed. Defaults to `10000` if
* not set. If you set this to `true`, the toggle button will always be displayed. If you set this to `false the
* toggle button will not be displayed (similar to `toggleData` setting).
* - 'minCount': int|bool, the minimum number of records beyond which a confirmation message will be displayed when
* toggling all records. If the dataProvider record count exceeds this setting, a confirmation message will be
* alerted to the user. Defaults to `500` if not set. If you set this to `true`, the confirmation message will
* always be displayed. If set to `false` no confirmation message will be displayed.
* - 'confirmMsg': string, the confirmation message for the toggle data when `minCount` threshold is exceeded.
* Defaults to `'There are {totalCount} records. Are you sure you want to display them all?'`.
* - 'all': array, configuration for showing all grid data and the value is the HTML attributes for the button.
* (refer `page` for understanding the default options).
* - 'page': array, configuration for showing first page data and $options is the HTML attributes for the button.
* The following special options are recognized:
* - `icon`: string, the glyphicon suffix name. If not set or empty will not be displayed.
* - `label`: string, the label for the button.
*
* This defaults to the following setting:
* ```
* [
* 'maxCount' => 10000,
* 'minCount' => 1000
* 'confirmMsg' => Yii::t(
* 'kvgrid',
* 'There are {totalCount} records. Are you sure you want to display them all?',
* ['totalCount' => number_format($this->dataProvider->getTotalCount())]
* ),
* 'all' => [
* 'icon' => 'resize-full',
* 'label' => 'All',
* 'class' => 'btn btn-default',
* 'title' => 'Show all data'
* ],
* 'page' => [
* 'icon' => 'resize-small',
* 'label' => 'Page',
* 'class' => 'btn btn-default',
* 'title' => 'Show first page data'
* ],
* ]
* ```
*/
public $toggleDataOptions = [];
/**
* @var array the HTML attributes for the toggle data button group container. By default this will always have the
* `class = btn-group` automatically added, if no class is set.
*/
public $toggleDataContainer = [];
/**
* @var array the HTML attributes for the export button group container. By default this will always have the
* `class = btn-group` automatically added, if no class is set.
*/
public $exportContainer = [];
/**
* @var array|bool the grid export menu settings. Displays a Bootstrap dropdown menu that allows you to export the
* grid as either html, csv, or excel. If set to false, will not be displayed. The following options can be
* set:
* - icon: string,the glyphicon suffix to be displayed before the export menu label. If not set or is an empty
* string, this will not be displayed. Defaults to 'export' if `fontAwesome` is `false` and `share-square-o` if
* fontAwesome is `true`.
* - label: string,the export menu label (this is not HTML encoded). Defaults to ''.
* - showConfirmAlert: bool, whether to show a confirmation alert dialog before download. This confirmation
* dialog will notify user about the type of exported file for download and to disable popup blockers.
* Defaults to `true`.
* - target: string, the target for submitting the export form, which will trigger
* the download of the exported file. Must be one of the `TARGET_` constants.
* Defaults to `GridView::TARGET_POPUP`.
* - messages: array, the configuration of various messages that will be displayed at runtime:
* - allowPopups: string, the message to be shown to disable browser popups for download.
* Defaults to `Disable any popup blockers in your browser to ensure proper download.`.
* - confirmDownload: string, the message to be shown for confirming to proceed with the download. Defaults to
* `Ok to proceed?`.
* - downloadProgress: string, the message to be shown in a popup dialog when download request is triggered.
* Defaults to `Generating file. Please wait...`.
* - downloadComplete: string, the message to be shown in a popup dialog when download request is completed.
* Defaults to
* `All done! Click anywhere here to close this window, once you have downloaded the file.`.
* - header: string, the header for the page data export dropdown. If set to empty string will not be displayed.
* Defaults to:
* `<li role="presentation" class="dropdown-header">Export Page Data</li>`.
* - fontAwesome: bool, whether to use font awesome file type icons. Defaults to `false`. If you set it to
* `true`, then font awesome icons css class will be applied instead of glyphicons.
* - itemsBefore: array, any additional items that will be merged/prepended before with the export dropdown list.
* This should be similar to the `items` property as supported by `\yii\bootstrap\ButtonDropdown` widget. Note
* the page export items will be automatically generated based on settings in the `exportConfig` property.
* - itemsAfter: array, any additional items that will be merged/appended after with the export dropdown list. This
* should be similar to the `items` property as supported by `\yii\bootstrap\ButtonDropdown` widget. Note the
* page export items will be automatically generated based on settings in the `exportConfig` property.
* - options: array, HTML attributes for the export menu button. Defaults to `['class' => 'btn btn-default',
* 'title'=>'Export']`.
* - encoding: string, the export output file encoding. If not set, defaults to `utf-8`.
* - bom: boolean, whether a BOM is to be embedded for text or CSV files with utf-8 encoding. Defaults to `true`.
* - menuOptions: array, HTML attributes for the export dropdown menu. Defaults to `['class' => 'dropdown-menu
* dropdown-menu-right']`. This property is to be setup exactly as the `options` property required by the
* `\yii\bootstrap\Dropdown` widget.
*/
public $export = [];
/**
* @var array the configuration for each export format. The array keys must be the one of the `format` constants
* (CSV, HTML, TEXT, EXCEL, PDF, JSON) and the array value is a configuration array consisiting of these settings:
* - label: string,the label for the export format menu item displayed
* - icon: string,the glyphicon or font-awesome name suffix to be displayed before the export menu item label.
* If set to an empty string, this will not be displayed. Refer `defaultConfig` in `initExport` method for
* default settings.
* - showHeader: boolean, whether to show table header row in the output. Defaults to `true`.
* - showPageSummary: boolean, whether to show table page summary row in the output. Defaults to `true`.
* - showFooter: boolean, whether to show table footer row in the output. Defaults to `true`.
* - showCaption: boolean, whether to show table caption in the output (only for HTML). Defaults to `true`.
* - filename: the base file name for the generated file. Defaults to 'grid-export'. This will be used to generate
* a default file name for downloading (extension will be one of csv, html, or xls - based on the format
* setting).
* - alertMsg: string, the message prompt to show before saving. If this is empty or not set it will not be
* displayed.
* - options: array, HTML attributes for the export format menu item.
* - mime: string, the mime type (for the file format) to be set before downloading.
* - config: array, the special configuration settings specific to each file format/type. The following
* configuration options are read specific to each file type:
* - HTML:
* - cssFile: string, the css file that will be used in the exported HTML file. Defaults to:
* `https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css`.
* - CSV and TEXT:
* - colDelimiter: string, the column delimiter string for TEXT and CSV downloads.
* - rowDelimiter: string, the row delimiter string for TEXT and CSV downloads.
* - EXCEL:
* - worksheet: string, the name of the worksheet, when saved as EXCEL file.
* - PDF:
* Supports all configuration properties as required in \kartik\mpdf\Pdf extension. In addition, the
* following additional special options are recognized:
* - contentBefore: string, any HTML formatted content that will be embedded in the PDF output before the
* grid.
* - contentAfter: string, any HTML formatted content that will be embedded in the PDF output after the
* grid.
* - JSON:
* - colHeads: array, the column heading names to be output in the json file. If not set, it will be
* autogenerated as "col-{i}", where {i} is the column index. If `slugColHeads` is set to `true`, the
* extension will attempt to autogenerate column heads based on table column heading, whereever possible.
* - slugColHeads: boolean, whether to auto-generate column identifiers as slugs based on the table column
* heading name. If the table column heading contains characters which cannot be slugified, then the
* extension will autogenerate the column name as "col-{i}".
* - jsonReplacer`: array|JsExpression, the JSON replacer property - can be an array or a JS function created
* using JsExpression. Refer the [JSON documentation]
* (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_native_JSON#The_replacer_parameter
* for details on setting this property.
* - indentSpace: int, pretty print json output and indent by number of spaces specified. Defaults to `4`.
*/
public $exportConfig = [];
/**
* @var array, conversion of defined patterns in the grid cells as a preprocessing before the gridview is formatted
* for export. Each array row must consist of the following two keys:
* - `from`: string, is the pattern to search for in each grid column's cells
* - `to`: string, is the string to replace the pattern in the grid column cells
* This defaults to
* ```
* [
* ['from'=>GridView::ICON_ACTIVE, 'to'=>Yii::t('kvgrid', 'Active')],
* ['from'=>GridView::ICON_INACTIVE, 'to'=>Yii::t('kvgrid', 'Inactive')]
* ]
* ```
*/
public $exportConversions = [];
/**
* @var boolean, applicable for EXCEL export content only. This determines whether the exported EXCEL cell data
* will be automatically guessed and formatted based on `DataColumn::format` property. You can override this
* behavior and change the auto-derived format mask by setting `DataColumn::xlFormat`.
*/
public $autoXlFormat = false;
/**
* @var array|boolean the HTML attributes for the grid container. The grid table items will be wrapped in a `div`
* container with the configured HTML attributes. The ID for the container will be auto generated.
*/
public $containerOptions = [];
/**
* @var string the generated client script for the grid
*/
protected $_gridClientFunc = '';
/**
* @var Module the grid module.
*/
protected $_module;
/**
* @var string key to identify showing all data
*/
protected $_toggleDataKey;
/**
* @var string HTML attribute identifier for the toggle button
*/
protected $_toggleButtonId;
/**
* @var string the JS variable to store the toggle options
*/
protected $_toggleOptionsVar;
/**
* @var string generated plugin script for the toggle button
*/
protected $_toggleScript;
/**
* @var bool whether the current mode is showing all data
*/
protected $_isShowAll = false;
/**
* Parses export configuration and returns the merged defaults
*
* @param array $exportConfig
* @param array $defaultExportConfig
*
* @return array
*/
protected static function parseExportConfig($exportConfig, $defaultExportConfig)
{
if (is_array($exportConfig) && !empty($exportConfig)) {
foreach ($exportConfig as $format => $setting) {
$setup = is_array($exportConfig[$format]) ? $exportConfig[$format] : [];
$exportConfig[$format] = empty($setup) ? $defaultExportConfig[$format] :
array_replace_recursive($defaultExportConfig[$format], $setup);
}
return $exportConfig;
}
return $defaultExportConfig;
}
/**
* @inheritdoc
*/
public function init()
{
$this->_module = Config::initModule(Module::className());
if (empty($this->options['id'])) {
$this->options['id'] = $this->getId();
}
if (!$this->toggleData) {
parent::init();
return;
}
$this->_toggleDataKey = '_tog' . hash('crc32', $this->options['id']);
$this->_isShowAll = ArrayHelper::getValue($_GET, $this->_toggleDataKey, $this->defaultPagination) === 'all';
if ($this->_isShowAll) {
/** @noinspection PhpUndefinedFieldInspection */
$this->dataProvider->pagination = false;
}
$this->_toggleButtonId = $this->options['id'] . '-togdata-' . ($this->_isShowAll ? 'all' : 'page');
parent::init();
}
/**
* @inheritdoc
* @throws InvalidConfigException
*/
public function run()
{
$this->initToggleData();
$this->initExport();
if ($this->export !== false && isset($this->exportConfig[self::PDF])) {
Config::checkDependency(
'mpdf\Pdf',
'yii2-mpdf',
"for PDF export functionality. To include PDF export, follow the install steps below. If you do not " .
"need PDF export functionality, do not include 'PDF' as a format in the 'export' property. You can " .
"otherwise set 'export' to 'false' to disable all export functionality"
);
}
$this->initHeader();
$this->initBootstrapStyle();
$this->containerOptions['id'] = $this->options['id'] . '-container';
Html::addCssClass($this->containerOptions, 'kv-grid-container');
$this->registerAssets();
$this->renderPanel();
$this->initLayout();
$this->beginPjax();
parent::run();
$this->endPjax();
}
/**
* Renders the table page summary.
*
* @return string the rendering result.
*/
public function renderPageSummary()
{
if (!$this->showPageSummary) {
return null;
}
$cells = [];
/** @var DataColumn $column */
foreach ($this->columns as $column) {
$cells[] = $column->renderPageSummaryCell();
}
$content = Html::tag('tr', implode('', $cells), $this->pageSummaryRowOptions);
return "<tfoot>\n" . $content . "\n</tfoot>";
}
/**
* Renders the table body.
*
* @return string the rendering result.
*/
public function renderTableBody()
{
$content = parent::renderTableBody();
if ($this->showPageSummary) {
return $content . $this->renderPageSummary();
}
return $content;
}
/**
* Renders the toggle data button
*
* @return string
*/
public function renderToggleData()
{
if (!$this->toggleData) {
return '';
}
$maxCount = ArrayHelper::getValue($this->toggleDataOptions, 'maxCount', false);
if ($maxCount !== true && (!$maxCount || (int)$maxCount <= $this->dataProvider->getTotalCount())) {
return '';
}
$tag = $this->_isShowAll ? 'page' : 'all';
$options = $this->toggleDataOptions[$tag];
$label = ArrayHelper::remove($options, 'label', '');
$url = Url::current([$this->_toggleDataKey => $tag]);
static::initCss($this->toggleDataContainer, 'btn-group');
return Html::tag('div', Html::a($label, $url, $options), $this->toggleDataContainer);
}
/**
* Renders the export menu
*
* @return string
*/
public function renderExport()
{
if ($this->export === false || !is_array($this->export) ||
empty($this->exportConfig) || !is_array($this->exportConfig)
) {
return '';
}
$title = $this->export['label'];
$icon = $this->export['icon'];
$options = $this->export['options'];
$menuOptions = $this->export['menuOptions'];
$iconPrefix = $this->export['fontAwesome'] ? 'fa fa-' : 'glyphicon glyphicon-';
$title = ($icon == '') ? $title : "<i class='{$iconPrefix}{$icon}'></i> {$title}";
$action = $this->_module->downloadAction;
if (!is_array($action)) {
$action = [$action];
}
$encoding = ArrayHelper::getValue($this->export, 'encoding', 'utf-8');
$bom = ArrayHelper::getValue($this->export, 'bom', true);
$target = ArrayHelper::getValue($this->export, 'target', self::TARGET_POPUP);
$form = Html::beginForm($action, 'post', [
'class' => 'kv-export-form',
'style' => 'display:none',
'target' => ($target == self::TARGET_POPUP) ? 'kvDownloadDialog' : $target
]) . "\n" .
Html::hiddenInput('export_filetype') . "\n" .
Html::hiddenInput('export_filename') . "\n" .
Html::hiddenInput('export_mime') . "\n" .
Html::hiddenInput('export_config') . "\n" .
Html::hiddenInput('export_encoding', $encoding) . "\n" .
Html::hiddenInput('export_bom', $bom) . "\n" .
Html::textarea('export_content') . "\n</form>";
$items = empty($this->export['header']) ? [] : [$this->export['header']];
foreach ($this->exportConfig as $format => $setting) {
$iconOptions = ArrayHelper::getValue($setting, 'iconOptions', []);
Html::addCssClass($iconOptions, $iconPrefix . $setting['icon']);
$label = (empty($setting['icon']) || $setting['icon'] == '') ? $setting['label'] :
Html::tag('i', '', $iconOptions) . ' ' . $setting['label'];
$items[] = [
'label' => $label,
'url' => '#',
'linkOptions' => [
'class' => 'export-' . $format,
'data-format' => ArrayHelper::getValue($setting, 'mime', 'text/plain')
],
'options' => $setting['options']
];
}
$itemsBefore = ArrayHelper::getValue($this->export, 'itemsBefore', []);
$itemsAfter = ArrayHelper::getValue($this->export, 'itemsAfter', []);
$items = ArrayHelper::merge($itemsBefore, $items, $itemsAfter);
return ButtonDropdown::widget(
[
'label' => $title,
'dropdown' => ['items' => $items, 'encodeLabels' => false, 'options' => $menuOptions],
'options' => $options,
'containerOptions' => $this->exportContainer,
'encodeLabel' => false
]
) . $form;
}
/**
* Renders the table header.
*
* @return string the rendering result.
*/
public function renderTableHeader()
{
$cells = [];
foreach ($this->columns as $index => $column) {
/* @var DataColumn $column */
if ($this->resizableColumns && $this->persistResize) {
$column->headerOptions['data-resizable-column-id'] = "kv-col-{$index}";
}
$cells[] = $column->renderHeaderCell();
}
$content = Html::tag('tr', implode('', $cells), $this->headerRowOptions);
if ($this->filterPosition == self::FILTER_POS_HEADER) {
$content = $this->renderFilters() . $content;
} elseif ($this->filterPosition == self::FILTER_POS_BODY) {
$content .= $this->renderFilters();
}
return "<thead>\n" .
$this->generateRows($this->beforeHeader) . "\n" .
$content . "\n" .
$this->generateRows($this->afterHeader) . "\n" .
"</thead>";
}
/**
* Renders the table footer.
*
* @return string the rendering result.
*/
public function renderTableFooter()
{
$content = parent::renderTableFooter();
return strtr(
$content,
[
'<tfoot>' => "<tfoot>\n" . $this->generateRows($this->beforeFooter),
'</tfoot>' => $this->generateRows($this->afterFooter) . "\n</tfoot>",
]
);
}
/**
* Initialize grid export
*/
protected function initExport()
{
if ($this->export === false) {
return;
}
$this->exportConversions = array_replace_recursive(
[
['from' => self::ICON_ACTIVE, 'to' => Yii::t('kvgrid', 'Active')],
['from' => self::ICON_INACTIVE, 'to' => Yii::t('kvgrid', 'Inactive')]
],
$this->exportConversions
);
if (!isset($this->export['fontAwesome'])) {
$this->export['fontAwesome'] = false;
}
$isFa = $this->export['fontAwesome'];
$this->export = array_replace_recursive(
[
'label' => '',
'icon' => $isFa ? 'share-square-o' : 'export',
'messages' => [
'allowPopups' => Yii::t(
'kvgrid',
'Disable any popup blockers in your browser to ensure proper download.'
),