diff --git a/.coveralls.yml b/.coveralls.yml
new file mode 100644
index 0000000000..c00a1ca932
--- /dev/null
+++ b/.coveralls.yml
@@ -0,0 +1,3 @@
+src_dir: .
+coverage_clover: ./tmp/clover.xml
+json_path: ./tmp/coveralls-upload.json
diff --git a/.gitignore b/.gitignore
index a81b369032..578d185577 100644
--- a/.gitignore
+++ b/.gitignore
@@ -57,6 +57,10 @@ languages/gravityview-pt.po
## Plugin-specific files:
+# Unit tests
+/tmp
+/tests/bin/tmp
+
# mpeltonen/sbt-idea plugin
.idea_modules/
@@ -64,4 +68,5 @@ languages/gravityview-pt.po
atlassian-ide-plugin.xml
languages/gravityview-de.mo
+
languages/gravityview-de.po
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000000..9a7f2395c8
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,31 @@
+language: php
+
+sudo: false
+
+php:
+ - 5.3
+ - 5.4
+ - 5.5
+ - 5.6
+
+env:
+ - WP_VERSION=latest WP_MULTISITE=0
+ - WP_VERSION=4.2 WP_MULTISITE=0
+ - WP_VERSION=4.1 WP_MULTISITE=0
+ - WP_VERSION=4.0 WP_MULTISITE=0
+
+matrix:
+ include:
+ - php: 5.3
+ env: WP_VERSION=latest WP_MULTISITE=1
+
+before_script:
+ - bash tests/bin/install.sh gravityview_test root '' localhost $WP_VERSION
+ - bash tests/bin/travis.sh before
+
+script: phpunit -c phpunit.xml.dist
+
+after_script:
+ - bash tests/bin/travis.sh after
+ - wget https://scrutinizer-ci.com/ocular.phar
+ - php ocular.phar code-coverage:upload --format=php-clover ./tmp/clover.xml
diff --git a/Gruntfile.js b/Gruntfile.js
index 7236999de2..5eb2f0da90 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -46,7 +46,8 @@ module.exports = function(grunt) {
"assets/js/admin-post-edit.js",
"assets/js/admin-widgets.js",
"assets/js/admin-entries-list.js",
- "assets/js/fe-views.js"
+ "assets/js/fe-views.js",
+ "includes/widgets/search-widget/assets/js/source/admin-widgets.js"
],
imagemin: {
@@ -79,12 +80,12 @@ module.exports = function(grunt) {
searchExt: {
files: [{
expand: true,
- cwd: 'includes/extensions/search-widget/assets/js/source/',
+ cwd: 'includes/widgets/search-widget/assets/js/source/',
src: ['*.js','!*.min.js'],
- dest: 'includes/extensions/search-widget/assets/js/',
+ dest: 'includes/widgets/search-widget/assets/js/',
ext: '.min.js'
}]
- },
+ }
},
watch: {
@@ -93,8 +94,8 @@ module.exports = function(grunt) {
tasks: ['uglify:main','newer:jshint']
},
extension_js: {
- files: ['includes/extensions/**/*.js','!includes/extensions/**/*.min.js'],
- tasks: ['uglify:searchExt']
+ files: ['includes/widgets/**/*.js','!includes/widgets/**/*.min.js'],
+ tasks: ['uglify:searchExt','newer:jshint']
},
templates: {
files: ['templates/css/**/*.scss','!templates/css/**/*.css'],
diff --git a/assets/css/admin-views.css b/assets/css/admin-views.css
index 4a94ad0c7b..4b23210e25 100644
--- a/assets/css/admin-views.css
+++ b/assets/css/admin-views.css
@@ -1 +1 @@
-.widgets-php .gv-overlay{display:none;}#gv-widget-search-settings-link{display:none;text-align:center;font-size:110%;}#gv-widget-search-settings-link .dashicons{margin-right:5px;line-height:20px !important;height:20px !important;font-size:20px !important;}#gv-widget-search-settings-link a{text-decoration:none;text-align:center;}.merge-tag-support{max-width:95%;}.all-merge-tags{position:relative;display:-moz-inline-stack;display:inline-block;zoom:1;}.all-merge-tags.textarea{position:absolute;margin-top:1px;}.all-merge-tags a.open-list{text-indent:-999em;width:16px;height:16px;background:url(images/icon-drop-list.png);background-repeat:no-repeat;cursor:pointer;margin-left:5px;display:-moz-inline-stack;display:inline-block;zoom:1;}.all-merge-tags a.open-list:focus{outline:0 !important;}ul#gf_merge_tag_list{padding:0;max-height:200px;min-width:200px;overflow:auto;position:absolute;background-color:#F8F8F8;border:1px solid #CCC;z-index:999;text-indent:0;-moz-box-shadow:0 8px 6px -6px rgba(68, 68, 68, 0.4);-webkit-box-shadow:0 8px 6px -6px rgba(68, 68, 68, 0.4);box-shadow:0 8px 6px -6px rgba(68, 68, 68, 0.4);}ul#gf_merge_tag_list li:nth-child(even){background-color:#EEE;}.right ul#gf_merge_tag_list{right:0;}ul#gf_merge_tag_list li{margin:0;line-height:1.4em;padding:0 !important;border-bottom:1px dotted #ccc;}ul#gf_merge_tag_list li:last-child{border-bottom:none;}ul#gf_merge_tag_list li.group-header{font-weight:bold;padding:5px !important;}ul#gf_merge_tag_list li.group-header:hover{background-color:transparent;}ul#gf_merge_tag_list a{display:block;padding:5px;cursor:pointer;}ul#gf_merge_tag_list a:hover{background-color:#EEE;}.mt-gform_notification_message{float:right;position:relative;right:10px;top:90px;}#wp-gform_notification_message-wrap{margin-right:12px;}body .ui-tooltip{padding:8px;position:absolute;width:400px;max-width:100%;z-index:999999 !important;background:#eee;border:4px solid #999;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-o-box-shadow:0 0 5px #aaa;-moz-box-shadow:0 0 5px #aaa;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa;}body .ui-tooltip br{display:none;}* html .ui-tooltip{background-image:none;}.ui-tooltip-content{padding:0 10px;max-height:325px;overflow-y:auto;}.ui-tooltip-content:after{content:"";display:table;clear:both;}.ui-tooltip-content .close{position:absolute;padding:5px;top:-25px;left:-25px;cursor:pointer;}.ui-tooltip-content .close i{font-size:25px;color:#555;}.ui-tooltip-content .close i:hover,.ui-tooltip-content .close i:active{color:#000;}.ui-tooltip-content .gv-field-controls{display:none;}.ui-tooltip-content .gv-fields{cursor:pointer;padding:0.5em 0.75em;}.ui-tooltip-content .gv-fields.gv-child-field{width:95%;margin-left:5%;}.ui-tooltip-content .gv-fields h5{float:none;width:100%;}.top .ui-tooltip-content::after{bottom:-14px;left:48%;border-color:#999 transparent;border-width:10px 10px 0;}#gravityview_settings{padding:0;}#gravityview_settings #gravityview-metabox-content-container{max-height:442px;overflow-y:auto;background:white;float:left;width:80%;border-left:1px solid #eee;box-sizing:border-box;}#gravityview_settings #gravityview-metabox-content-container.ui-tabs-panel{max-height:none;overflow-y:visible;}#side-sortables #gravityview_settings #gravityview-metabox-content-container{width:100%;}#side-sortables #gravityview_settings #gravityview-metabox-content-container th,#side-sortables #gravityview_settings #gravityview-metabox-content-container td{*zoom:1;display:block;padding:10px 10px 3px;}#side-sortables #gravityview_settings #gravityview-metabox-content-container th:before,#side-sortables #gravityview_settings #gravityview-metabox-content-container th:after,#side-sortables #gravityview_settings #gravityview-metabox-content-container td:before,#side-sortables #gravityview_settings #gravityview-metabox-content-container td:after{content:" ";display:table;}#side-sortables #gravityview_settings #gravityview-metabox-content-container th:after,#side-sortables #gravityview_settings #gravityview-metabox-content-container td:after{clear:both;}#gravityview_settings #gravityview-metabox-content-container .form-table{margin-top:0;padding-top:0;}#gravityview_settings #gravityview-metabox-content-container .form-table caption{text-align:left;font-size:14px;padding:8px 10px;margin:0;line-height:1.4;font-weight:600;}.rtl #gravityview_settings #gravityview-metabox-content-container .form-table caption{text-align:right;}#gravityview_settings #gravityview-metabox-content-container .form-table label .howto{margin-top:5px;}#gravityview_settings #gravityview-metabox-content-container .ui-tabs-panel{*zoom:1;box-sizing:border-box;padding:0;border:none;}#gravityview_settings #gravityview-metabox-content-container .ui-tabs-panel:before,#gravityview_settings #gravityview-metabox-content-container .ui-tabs-panel:after{content:" ";display:table;}#gravityview_settings #gravityview-metabox-content-container .ui-tabs-panel:after{clear:both;}#side-sortables #gravityview_settings #gravityview-metabox-content-container .ui-tabs-panel{margin-top:1px;border-top:2px solid #ccc;}#gravityview_settings #gravityview-metabox-content-container .ui-tabs-panel p{margin:9px 0 9px;}#gravityview_settings #gravityview-metabox-content-container .ui-tabs-panel p.form-field,#gravityview_settings #gravityview-metabox-content-container .ui-tabs-panel fieldset.form-field{padding:5px 20px 5px 162px !important;}#gravityview_settings #gravityview-metabox-content-container .ui-tabs-panel .description{padding:0;margin:0 0 0 7px;clear:none;display:inline;}#gravityview_settings #gravityview-metabox-content-container .ui-tabs-panel div+input{margin-top:5px;}#gravityview_settings #gravityview-metabox-content-container .ui-tabs-panel textarea,#gravityview_settings #gravityview-metabox-content-container .ui-tabs-panel input,#gravityview_settings #gravityview-metabox-content-container .ui-tabs-panel select{margin:0;}#gravityview_settings #gravityview-metabox-content-container .ui-tabs-panel textarea[type="checkbox"],#gravityview_settings #gravityview-metabox-content-container .ui-tabs-panel input[type="checkbox"],#gravityview_settings #gravityview-metabox-content-container .ui-tabs-panel select[type="checkbox"]{margin-top:-4px;}#gravityview_settings #gravityview-metabox-content-container .ui-tabs-panel textarea{vertical-align:top;height:3.5em;line-height:1.5em;}#gravityview_settings #gravityview-metabox-content-container .ui-tabs-panel input.button{width:auto;margin-left:8px;}#gravityview_settings .gform-field-filter{clear:both;padding:0.5em 0 0;}#gravityview_settings .inside{padding:0;margin:0;background:#fafafa;*zoom:1;}#gravityview_settings .inside:before,#gravityview_settings .inside:after{content:" ";display:table;}#gravityview_settings .inside:after{clear:both;}#gravityview_settings ul.ui-tabs-nav{line-height:1em;float:left;width:20%;margin:0;position:relative;padding:0 0 30px;background-color:#fafafa;box-sizing:border-box;}#side-sortables #gravityview_settings ul.ui-tabs-nav{width:100%;padding-bottom:0;border:none;}#gravityview_settings ul.ui-tabs-nav li{display:block;padding:0;margin:0;width:100%;}#gravityview_settings ul.ui-tabs-nav li.ui-state-disabled{display:none;}#gravityview_settings ul.ui-tabs-nav li a{box-sizing:border-box;padding:10px;line-height:20px !important;margin:0;display:block;width:100%;text-decoration:none;border:none;outline:none;box-shadow:none;border-bottom:1px solid #eee;background:none;transition-duration:0;text-overflow:ellipsis;overflow-x:hidden;}#gravityview_settings ul.ui-tabs-nav li:first-child a{border-top:0 !important;}#gravityview_settings ul.ui-tabs-nav li.ui-state-active a{position:relative;background-color:#eee;color:#555;}.ui-tooltip .gv-fields .gv-field-info span.gv-sublabel:after,.ui-tooltip .gv-fields .gv-field-info span:last-child:after,.gv-dialog-options:after,.gv-dialog-options .gv-setting-container:after{content:"";display:table;clear:both;}.gv-grid{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin-bottom:2em;}.gv-grid:before,.gv-grid:after{content:" ";display:table;}.gv-grid:after{clear:both;}.gv-grid-pad{padding:1em 0 0 1em;}.gv-grid-pad>[class*='gv-grid-col-']{padding-right:1em;}.gv-grid-border{border:1px solid #999;}[class*='gv-grid-col-']{float:left;padding-right:1em;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}.gv-grid-col-1-3{width:33.33%;}.gv-grid-col-1-4{width:25%;}.gv-grid-col-1-2{width:50%;}.gv-grid-col-1-8{width:12.5%;}.gv-grid-col-2-3{width:66.66%;}.gv-grid-col-1-1{width:100%;}.gv-grid-col-1-1+.gv-grid-col-1-3+.gv-grid-col-2-3+.gv-grid-col-1-2,.gv-grid-col-1-1+.gv-grid-col-2-3+.gv-grid-col-1-3+.gv-grid-col-1-2{clear:left;}.gv-section:before,.gv-section:after{content:" ";display:table;}.gv-section:after{clear:both;}.gv-section h4{font-size:14px;font-weight:bold;}.gv-section h4 span{font-size:14px;float:right;color:#999;font-weight:normal;}.gv-view-types-module{padding:1em;margin-bottom:1em;background:#eee;position:relative;border:2px solid transparent;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}.gv-view-types-module:hover .gv-view-types-hover{display:block;}.gv-view-types-module img{display:block;width:100%;height:auto;margin:0;padding:0;}.gv-view-types-module h5{white-space:nowrap;margin:0.5em 0;padding:0;font-size:18px;}.gv-view-types-module .description{margin:0;padding:0;height:3em;overflow:hidden;}.gv-view-types-module.gv-selected{border:2px solid #1e8cbe;}.gv-view-types-hover{display:none;background:rgba(0, 0, 0, 0.6);position:absolute;top:0;left:0;right:0;height:100%;}.gv-view-types-hover .gv-site-preview{color:#fff;text-decoration:none;}.gv-view-types-hover .dashicons{font-size:24px;width:24px;height:24px;position:absolute;top:5px;right:5px;opacity:0.5;}.gv-view-types-hover .dashicons:hover{opacity:1;}.gv-view-types-hover>div{padding-top:31%;margin-top:-15px;}.gv-view-types-hover>div p{margin:0.5em 0 1.5em;padding:0;text-align:center;}.gv-view-types-hover>div p a{display:inline-block;width:60%;}.button-primary.button-buy-now{background:#2ecc37;border-color:#00a213;-webkit-box-shadow:inset 0 1px 0 rgba(120, 230, 129, 0.5),0 1px 0 rgba(0, 0, 0, 0.15);box-shadow:inset 0 1px 0 rgba(120, 230, 129, 0.5),0 1px 0 rgba(0, 0, 0, 0.15);}.button-primary.button-buy-now.focus,.button-primary.button-buy-now:focus,.button-primary.button-buy-now.hover,.button-primary.button-buy-now:hover{border-color:#00a213;background:#1ebe41;-webkit-box-shadow:inset 0 1px 0 rgba(120, 230, 129, 0.6);box-shadow:inset 0 1px 0 rgba(120, 230, 129, 0.6);}.button-primary.button-buy-now.focus,.button-primary.button-buy-now:focus{border-color:#0e5025;-webkit-box-shadow:inset 0 1px 0 rgba(120, 230, 129, 0.6),1px 1px 2px rgba(0, 0, 0, 0.4);box-shadow:inset 0 1px 0 rgba(120, 230, 129, 0.6),1px 1px 2px rgba(0, 0, 0, 0.4);}.button-primary.button-buy-now.active,.button-primary.button-buy-now.active:hover,.button-primary.button-buy-now.active:focus,.button-primary.button-buy-now:active{border-color:#00842d;background:#1ebe41;}#gravityview_select_form .handlediv{display:none;}.gv-form-links{color:#ddd;font-weight:normal;padding:0 0 0 10px;}.metabox-prefs .gv-form-links{display:none;}.gv-form-links .row-actions{visibility:visible;padding:0;}.gv-form-links .gv-form-title{display:none;}#gv_switch_view_button{display:inline-block;}#gravityview_select_template{display:none;}#gravityview_select_template .inside{max-height:450px;overflow-x:auto;}#gravityview_select_template .gv-grid-col-1-3{max-width:250px;min-width:200px;}.gv-template-preview{display:none;width:90%;}#gravityview_settings th{white-space:nowrap;font-weight:normal;max-width:200px;width:auto;margin-bottom:9px;padding:15px 10px;line-height:1.3;vertical-align:middle;}#gravityview_sort_filter,#gravityview_view_config{display:none;}.gv-wait{cursor:wait;}.ui-front{z-index:10001;}.ui-tabs{position:relative;padding:0.1em;zoom:1;margin-top:1em;}.ui-tabs .ui-tabs-nav{margin:0;padding:0.1em 0.1em 0;-webkit-margin-before:0;-webkit-margin-after:0;-webkit-margin-start:0;-webkit-margin-end:0;-webkit-padding-start:0;}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:1px;margin:0 0.2em 1px 0;border-bottom:0;padding:0;white-space:nowrap;outline:none;}.ui-tabs .ui-tabs-nav li .nav-tab{float:left;padding:0.5em 1em;text-decoration:none;font-size:14px;}.ui-tabs .ui-tabs-nav li .nav-tab:link,.ui-tabs .ui-tabs-nav li .nav-tab:visited,.ui-tabs .ui-tabs-nav li .nav-tab:hover,.ui-tabs .ui-tabs-nav li .nav-tab:active,.ui-tabs .ui-tabs-nav li .nav-tab:focus{outline:none;-webkit-box-shadow:none;}.ui-tabs .ui-tabs-nav li .dashicons{color:#aaa;}.ui-tabs .ui-tabs-nav li.ui-state-active a,.ui-tabs .ui-tabs-nav li.ui-state-active.ui-state-hover a{background-color:#fff;border-bottom:1px solid #fff;}.ui-tabs .ui-tabs-nav li.ui-state-active .dashicons,.ui-tabs .ui-tabs-nav li.ui-state-active.ui-state-hover .dashicons{color:#666;}.ui-tabs .ui-tabs-nav li.ui-state-hover .dashicons{color:#999;}.ui-tabs .ui-tabs-panel{display:block;padding:1em;background:#fff;border:1px solid #ddd;}.ui-tabs .ui-tabs-hide{display:none !important;}.gv-dialog{z-index:10001;}.gv-overlay{cursor:pointer;position:fixed;z-index:10000;background:transparent;background:rgba(225, 225, 225, 0.4);width:100%;height:100%;overflow:hidden;}hr{border:0;height:0;border-bottom:1px solid #ddd;margin:2em 0 2em 0;}.gv-droppable-area{border:1px solid #ccc;margin-bottom:1em;}.gv-droppable-area .gv-droppable-area-action{background:#eee;padding:0.5em;}.gv-droppable-area .gv-droppable-area-action:before,.gv-droppable-area .gv-droppable-area-action:after{content:" ";display:table;}.gv-droppable-area .gv-droppable-area-action:after{clear:both;}.gv-droppable-area .gv-droppable-area-title{margin:0;padding:0;}.gv-droppable-area .gv-droppable-area-subtitle{margin:0.25em 0 0 0;padding:0;font-size:12px;color:#999;}.gv-droppable-area .button-secondary{float:right;}.active-drop{padding:3px 7px;min-height:44px;position:relative;}.active-drop .drop-message{color:#bbb;margin:0;display:block;text-align:center;width:90%;padding:0 5%;z-index:1;min-height:40px;font-size:13px;position:absolute;top:50%;margin-top:-8px;line-height:16px;}.gv-grid-col-1-2 .drop-message{padding-top:0;padding-bottom:0;}.fields-placeholder{margin:5px 2px;height:32px;border:1px dashed #ccc;}.gv-fields{cursor:move;border:1px solid #ddd;background:#f7f7f7;overflow:hidden;padding:0.5em 0.75em;margin:5px 0;width:100%;z-index:100;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}.gv-fields h5{float:left;width:100%;font-weight:600;font-size:14px;margin:0;padding:0 0 0 0.25em;-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}.gv-fields h5 small{color:#777;font-weight:600;}.gv-fields span.gv-field-controls{padding-left:0.33em;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}.gv-fields:hover{background:#fefefe;}.gv-fields:hover .gv-field-controls .dashicons{color:#136cb9;}.gv-fields:hover h5 small,.gv-fields:hover .gv-field-info{color:#666;}.gv-fields .gv-field-controls .dashicons{width:24px;font-size:18px;line-height:20px;}.gv-fields .gv-field-controls .dashicons:hover,.gv-fields .gv-field-controls .dashicons:active{color:#2ea2cc;}.gv-fields .gv-field-controls .dashicons.dashicons-dismiss{float:right;color:#999;}.gv-fields .gv-field-controls .dashicons.dashicons-dismiss:hover,.gv-fields .gv-field-controls .dashicons.dashicons-dismiss:active{color:#d03a3a;}.gv-fields .gv-field-controls .dashicons.dashicons-admin-links{color:#aaa;width:20px;font-size:16px;line-height:20px;cursor:default;}.gv-fields .gv-field-info{display:none;}.ui-tooltip .gv-fields .gv-field-info{display:block;font-weight:normal;color:#999;text-shadow:none;}.ui-tooltip .gv-fields .gv-field-info span:after{content:", ";}.ui-dialog-content,.ui-dialog{cursor:default;}.post-type-gravityview .ui-dialog-content{overflow:inherit;padding:0;}.ui-draggable-dragging{max-width:400px !important;}#directory-available-fields .gv-fields h5,#directory-available-widgets .gv-fields h5,#single-available-fields .gv-fields h5{padding:0 !important;}#directory-available-fields .gv-fields span.gv-field-controls,#directory-available-widgets .gv-fields span.gv-field-controls,#single-available-fields .gv-fields span.gv-field-controls{display:none !important;}.gv-sublabel{font-size:0.9em;display:block;}.ui-dialog-titlebar{min-height:1.25em;line-height:1.25;padding:10px;height:auto;}.gv-dialog-options{display:none;width:90%;padding:10px 0 !important;}.gv-dialog-options .subtitle{margin:0 15px 0.8em;padding:0.5em 0 0.8em;border-bottom:1px solid #eee;}.gv-dialog-options.gv-dialog-warning p{font-size:1.1em;margin:0 !important;padding:1.5em !important;}.gv-dialog-options.gv-dialog-warning .dashicons{font-size:70px;width:70px;height:70px;line-height:0.8;float:right;text-align:right;color:#ddd;}.gv-dialog-options .gv-setting-container{margin:0;padding:0.4em 15px 0.8em;display:block;font-size:1.1em;clear:left;}.gv-dialog-options .gv-setting-container:last-child{padding-bottom:0.5em;}.gv-dialog-options .gv-setting-container label{margin:0;font-weight:normal;display:inline-block;padding-right:0.75em;max-width:100%;}.gv-dialog-options .gv-setting-container .howto{margin:0 0 0.25em;}.gv-dialog-options .gv-setting-container code{font-style:normal !important;}.gv-dialog-options input[type="text"]{display:block;display:inline-block;clear:left;}.gv-dialog-options table,.gv-dialog-options table select{width:95%;margin:0 auto;}.gv-widget-search-fields table,.gv-dialog-options table{padding-bottom:15px;}.gv-widget-search-fields table td,.gv-widget-search-fields table th,.gv-dialog-options table td,.gv-dialog-options table th{text-align:left;padding:10px 5px;}.gv-widget-search-fields table .no-search-fields td,.gv-dialog-options table .no-search-fields td{text-align:center;font-size:15px;padding:15px 0;}.gv-widget-search-fields table .cell-sort,.gv-dialog-options table .cell-sort{cursor:ns-resize;}.gv-widget-search-fields table .cell-sort.no-sort,.gv-dialog-options table .cell-sort.no-sort{cursor:default;}.gv-widget-search-fields table .gv-search-fields,.gv-widget-search-fields table .gv-search-inputs,.gv-dialog-options table .gv-search-fields,.gv-dialog-options table .gv-search-inputs{width:100%;}.gv-widget-search-fields table .cell-sort a,.gv-widget-search-fields table .cell-add-remove a,.gv-dialog-options table .cell-sort a,.gv-dialog-options table .cell-add-remove a{font-size:18px;}.gv-widget-search-fields table .cell-sort a.dashicons,.gv-widget-search-fields table .cell-add-remove a.dashicons,.gv-dialog-options table .cell-sort a.dashicons,.gv-dialog-options table .cell-add-remove a.dashicons{opacity:0.8;}.gv-widget-search-fields table .cell-sort a.dashicons:hover,.gv-widget-search-fields table .cell-add-remove a.dashicons:hover,.gv-dialog-options table .cell-sort a.dashicons:hover,.gv-dialog-options table .cell-add-remove a.dashicons:hover{opacity:1;}.gv-widget-search-fields table .cell-sort a.dashicons-plus-alt,.gv-widget-search-fields table .cell-add-remove a.dashicons-plus-alt,.gv-dialog-options table .cell-sort a.dashicons-plus-alt,.gv-dialog-options table .cell-add-remove a.dashicons-plus-alt{color:green;}.gv-widget-search-fields table .cell-sort a.dashicons-dismiss,.gv-widget-search-fields table .cell-add-remove a.dashicons-dismiss,.gv-dialog-options table .cell-sort a.dashicons-dismiss,.gv-dialog-options table .cell-add-remove a.dashicons-dismiss{color:#d03a3a;}.gv-widget-search-fields table .cell-sort,.gv-dialog-options table .cell-sort{width:24px;}.gv-widget-search-fields table .cell-add-remove,.gv-dialog-options table .cell-add-remove{width:50px;}.post-type-gravityview input.merge-tag-support,.widgets-php input.merge-tag-support{width:90%;}.post-type-gravityview #gravityview_sort_field,.widgets-php #gravityview_sort_field{max-width:300px;}.post-type-gravityview #gv-loading,.widgets-php #gv-loading{text-align:center;font-size:16px;line-height:20px;display:block;}.post-type-gravityview #gv-loading .spinner,.widgets-php #gv-loading .spinner{display:inline-block;margin-top:-3px;float:none;}.gv-label{display:inline-block;clear:right;margin-bottom:0.1em;}.gv-label-checkbox{padding-right:1em;display:block;width:100%;}.gv-label-textarea,.gv-label-text{float:left;clear:both;width:100%;display:block;margin-bottom:0.5em;}.gv-shortcode .dashicons-editor-code{color:#888;left:-1px;font-size:20px;line-height:1;}
\ No newline at end of file
+.widgets-php .gv-overlay{display:none;}#gv-widget-search-settings-link{display:none;text-align:center;font-size:110%;}#gv-widget-search-settings-link .dashicons{margin-right:5px;line-height:20px !important;height:20px !important;font-size:20px !important;}#gv-widget-search-settings-link a{text-decoration:none;text-align:center;}.merge-tag-support{max-width:95%;}.all-merge-tags{position:relative;display:-moz-inline-stack;display:inline-block;zoom:1;}.all-merge-tags.textarea{position:absolute;margin-top:1px;}.all-merge-tags a.open-list{text-indent:-999em;width:16px;height:16px;background:url(images/icon-drop-list.png);background-repeat:no-repeat;cursor:pointer;margin-left:5px;display:-moz-inline-stack;display:inline-block;zoom:1;}.all-merge-tags a.open-list:focus{outline:0 !important;}ul#gf_merge_tag_list{padding:0;max-height:200px;min-width:200px;overflow:auto;position:absolute;background-color:#F8F8F8;border:1px solid #CCC;z-index:999;text-indent:0;-moz-box-shadow:0 8px 6px -6px rgba(68, 68, 68, 0.4);-webkit-box-shadow:0 8px 6px -6px rgba(68, 68, 68, 0.4);box-shadow:0 8px 6px -6px rgba(68, 68, 68, 0.4);}ul#gf_merge_tag_list li:nth-child(even){background-color:#EEE;}.right ul#gf_merge_tag_list{right:0;}ul#gf_merge_tag_list li{margin:0;line-height:1.4em;padding:0 !important;border-bottom:1px dotted #ccc;}ul#gf_merge_tag_list li:last-child{border-bottom:none;}ul#gf_merge_tag_list li.group-header{font-weight:bold;padding:5px !important;}ul#gf_merge_tag_list li.group-header:hover{background-color:transparent;}ul#gf_merge_tag_list a{display:block;padding:5px;cursor:pointer;}ul#gf_merge_tag_list a:hover{background-color:#EEE;}.mt-gform_notification_message{float:right;position:relative;right:10px;top:90px;}#wp-gform_notification_message-wrap{margin-right:12px;}body .ui-tooltip{padding:8px;position:absolute;width:400px;max-width:100%;z-index:999999 !important;background:#eee;border:4px solid #999;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-o-box-shadow:0 0 5px #aaa;-moz-box-shadow:0 0 5px #aaa;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa;}body .ui-tooltip br{display:none;}* html .ui-tooltip{background-image:none;}.ui-tooltip-content{padding:0 10px;max-height:325px;overflow-y:auto;}.ui-tooltip-content:after{content:"";display:table;clear:both;}.ui-tooltip-content .close{position:absolute;padding:5px;top:-25px;left:-25px;cursor:pointer;}.ui-tooltip-content .close i{font-size:25px;color:#555;}.ui-tooltip-content .close i:hover,.ui-tooltip-content .close i:active{color:#000;}.ui-tooltip-content .gv-field-controls{display:none;}.ui-tooltip-content .gv-fields{cursor:pointer;padding:0.5em 0.75em;}.ui-tooltip-content .gv-fields.gv-child-field{width:95%;margin-left:5%;}.ui-tooltip-content .gv-fields h5{float:none;width:100%;}.top .ui-tooltip-content::after{bottom:-14px;left:48%;border-color:#999 transparent;border-width:10px 10px 0;}.gv-dialog .ui-dialog-titlebar-close:before{content:'';}#gravityview_settings{padding:0;display:none;}#gravityview_settings #gravityview-metabox-content-container{max-height:442px;overflow-y:auto;background:white;float:left;width:80%;border-left:1px solid #eee;box-sizing:border-box;}#gravityview_settings #gravityview-metabox-content-container.ui-tabs-panel{max-height:none;overflow-y:visible;}#side-sortables #gravityview_settings #gravityview-metabox-content-container{width:100%;}#side-sortables #gravityview_settings #gravityview-metabox-content-container th,#side-sortables #gravityview_settings #gravityview-metabox-content-container td{*zoom:1;display:block;padding:10px 10px 3px;}#side-sortables #gravityview_settings #gravityview-metabox-content-container th:before,#side-sortables #gravityview_settings #gravityview-metabox-content-container th:after,#side-sortables #gravityview_settings #gravityview-metabox-content-container td:before,#side-sortables #gravityview_settings #gravityview-metabox-content-container td:after{content:" ";display:table;}#side-sortables #gravityview_settings #gravityview-metabox-content-container th:after,#side-sortables #gravityview_settings #gravityview-metabox-content-container td:after{clear:both;}#gravityview_settings #gravityview-metabox-content-container .form-table{margin-top:0;padding-top:0;}#gravityview_settings #gravityview-metabox-content-container .form-table caption{text-align:left;font-size:14px;padding:8px 10px;margin:0;line-height:1.4;font-weight:600;}.rtl #gravityview_settings #gravityview-metabox-content-container .form-table caption{text-align:right;}#gravityview_settings #gravityview-metabox-content-container .form-table label .howto{margin-top:5px;}#gravityview_settings #gravityview-metabox-content-container .ui-tabs-panel{*zoom:1;box-sizing:border-box;padding:0;border:none;}#gravityview_settings #gravityview-metabox-content-container .ui-tabs-panel:before,#gravityview_settings #gravityview-metabox-content-container .ui-tabs-panel:after{content:" ";display:table;}#gravityview_settings #gravityview-metabox-content-container .ui-tabs-panel:after{clear:both;}#side-sortables #gravityview_settings #gravityview-metabox-content-container .ui-tabs-panel{margin-top:1px;border-top:2px solid #ccc;}#gravityview_settings #gravityview-metabox-content-container .ui-tabs-panel p{margin:9px 0 9px;}#gravityview_settings #gravityview-metabox-content-container .ui-tabs-panel p.form-field,#gravityview_settings #gravityview-metabox-content-container .ui-tabs-panel fieldset.form-field{padding:5px 20px 5px 162px !important;}#gravityview_settings #gravityview-metabox-content-container .ui-tabs-panel .description{padding:0;margin:0 0 0 7px;clear:none;display:inline;}#gravityview_settings #gravityview-metabox-content-container .ui-tabs-panel div+input{margin-top:5px;}#gravityview_settings #gravityview-metabox-content-container .ui-tabs-panel textarea,#gravityview_settings #gravityview-metabox-content-container .ui-tabs-panel input,#gravityview_settings #gravityview-metabox-content-container .ui-tabs-panel select{margin:0;}#gravityview_settings #gravityview-metabox-content-container .ui-tabs-panel textarea[type="checkbox"],#gravityview_settings #gravityview-metabox-content-container .ui-tabs-panel input[type="checkbox"],#gravityview_settings #gravityview-metabox-content-container .ui-tabs-panel select[type="checkbox"]{margin-top:-4px;}#gravityview_settings #gravityview-metabox-content-container .ui-tabs-panel textarea{vertical-align:top;height:3.5em;line-height:1.5em;}#gravityview_settings #gravityview-metabox-content-container .ui-tabs-panel input.button{width:auto;margin-left:8px;}#gravityview_settings .gform-field-filter{clear:both;padding:0.5em 0 0;}#gravityview_settings .inside{padding:0;margin:0;background:#fafafa;*zoom:1;}#gravityview_settings .inside:before,#gravityview_settings .inside:after{content:" ";display:table;}#gravityview_settings .inside:after{clear:both;}#gravityview_settings ul.ui-tabs-nav{line-height:1em;float:left;width:20%;margin:0;position:relative;padding:0 0 30px;background-color:#fafafa;box-sizing:border-box;}#side-sortables #gravityview_settings ul.ui-tabs-nav{width:100%;padding-bottom:0;border:none;}#gravityview_settings ul.ui-tabs-nav li{display:block;padding:0;margin:0;width:100%;}#gravityview_settings ul.ui-tabs-nav li.ui-state-disabled{display:none;}#gravityview_settings ul.ui-tabs-nav li a{box-sizing:border-box;padding:10px;line-height:20px !important;margin:0;display:block;width:100%;text-decoration:none;border:none;outline:none;box-shadow:none;border-bottom:1px solid #eee;background:none;transition-duration:0;text-overflow:ellipsis;overflow-x:hidden;}#gravityview_settings ul.ui-tabs-nav li:first-child a{border-top:0 !important;}#gravityview_settings ul.ui-tabs-nav li.ui-state-active a{position:relative;background-color:#eee;color:#555;}.ui-tooltip .gv-fields .gv-field-info span.gv-sublabel:after,.ui-tooltip .gv-fields .gv-field-info span:last-child:after,.gv-dialog-options:after,.gv-dialog-options .gv-setting-container:after{content:"";display:table;clear:both;}.gv-grid{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin-bottom:2em;}.gv-grid:before,.gv-grid:after{content:" ";display:table;}.gv-grid:after{clear:both;}.gv-grid-pad{padding:1em 0 0 1em;}.gv-grid-pad>[class*='gv-grid-col-']{padding-right:1em;}.gv-grid-border{border:1px solid #999;}[class*='gv-grid-col-']{float:left;padding-right:1em;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}.gv-grid-col-1-3{width:33.33%;}.gv-grid-col-1-4{width:25%;}.gv-grid-col-1-2{width:50%;}.gv-grid-col-1-8{width:12.5%;}.gv-grid-col-2-3{width:66.66%;}.gv-grid-col-1-1{width:100%;}.gv-grid-col-1-1+.gv-grid-col-1-3+.gv-grid-col-2-3+.gv-grid-col-1-2,.gv-grid-col-1-1+.gv-grid-col-2-3+.gv-grid-col-1-3+.gv-grid-col-1-2{clear:left;}.gv-section:before,.gv-section:after{content:" ";display:table;}.gv-section:after{clear:both;}.gv-section h4{font-size:14px;font-weight:bold;}.gv-section h4 span{font-size:14px;float:right;color:#999;font-weight:normal;}.gv-view-types-module{padding:1em;margin-bottom:1em;background:#eee;position:relative;border:2px solid transparent;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}.gv-view-types-module:hover .gv-view-types-hover{display:block;}.gv-view-types-module img{display:block;width:100%;height:auto;margin:0;padding:0;}.gv-view-types-module h5{white-space:nowrap;margin:0.5em 0;padding:0;font-size:18px;}.gv-view-types-module .description{margin:0;padding:0;height:3em;overflow:hidden;}.gv-view-types-module.gv-selected{border:2px solid #1e8cbe;}.gv-view-types-hover{display:none;background:rgba(0, 0, 0, 0.6);position:absolute;top:0;left:0;right:0;height:100%;}.gv-view-types-hover .gv-site-preview{color:#fff;text-decoration:none;}.gv-view-types-hover .dashicons{font-size:24px;width:24px;height:24px;position:absolute;top:5px;right:5px;opacity:0.5;}.gv-view-types-hover .dashicons:hover{opacity:1;}.gv-view-types-hover>div{padding-top:31%;margin-top:-15px;}.gv-view-types-hover>div p{margin:0.5em 0 1.5em;padding:0;text-align:center;}.gv-view-types-hover>div p a{display:inline-block;width:60%;}.button-primary.button-buy-now{background:#2ecc37;border-color:#00a213;-webkit-box-shadow:inset 0 1px 0 rgba(120, 230, 129, 0.5),0 1px 0 rgba(0, 0, 0, 0.15);box-shadow:inset 0 1px 0 rgba(120, 230, 129, 0.5),0 1px 0 rgba(0, 0, 0, 0.15);}.button-primary.button-buy-now.focus,.button-primary.button-buy-now:focus,.button-primary.button-buy-now.hover,.button-primary.button-buy-now:hover{border-color:#00a213;background:#1ebe41;-webkit-box-shadow:inset 0 1px 0 rgba(120, 230, 129, 0.6);box-shadow:inset 0 1px 0 rgba(120, 230, 129, 0.6);}.button-primary.button-buy-now.focus,.button-primary.button-buy-now:focus{border-color:#0e5025;-webkit-box-shadow:inset 0 1px 0 rgba(120, 230, 129, 0.6),1px 1px 2px rgba(0, 0, 0, 0.4);box-shadow:inset 0 1px 0 rgba(120, 230, 129, 0.6),1px 1px 2px rgba(0, 0, 0, 0.4);}.button-primary.button-buy-now.active,.button-primary.button-buy-now.active:hover,.button-primary.button-buy-now.active:focus,.button-primary.button-buy-now:active{border-color:#00842d;background:#1ebe41;}#gravityview_select_form .handlediv{display:none;}.gv-form-links{color:#ddd;font-weight:normal;padding:0 0 0 10px;}.metabox-prefs .gv-form-links{display:none;}.gv-form-links .row-actions{visibility:visible;padding:0;}.gv-form-links .gv-form-title{display:none;}#gv_switch_view_button{display:inline-block;}#gravityview_select_template{display:none;}#gravityview_select_template .inside{max-height:450px;overflow-x:auto;}#gravityview_select_template .gv-grid-col-1-3{max-width:250px;min-width:200px;}.gv-template-preview{display:none;width:90%;}#gravityview_settings th{white-space:nowrap;font-weight:normal;max-width:200px;width:auto;margin-bottom:9px;padding:15px 10px;line-height:1.3;vertical-align:middle;}#gravityview_sort_filter,#gravityview_view_config{display:none;}.gv-wait{cursor:wait;}.ui-front{z-index:10001;}.ui-tabs{position:relative;padding:0.1em;zoom:1;margin-top:1em;}.ui-tabs .ui-tabs-nav{margin:0;padding:0.1em 0.1em 0;-webkit-margin-before:0;-webkit-margin-after:0;-webkit-margin-start:0;-webkit-margin-end:0;-webkit-padding-start:0;}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:1px;margin:0 0.2em 1px 0;border-bottom:0;padding:0;white-space:nowrap;outline:none;}.ui-tabs .ui-tabs-nav li .nav-tab{float:left;padding:0.5em 1em;text-decoration:none;font-size:14px;}.ui-tabs .ui-tabs-nav li .nav-tab:link,.ui-tabs .ui-tabs-nav li .nav-tab:visited,.ui-tabs .ui-tabs-nav li .nav-tab:hover,.ui-tabs .ui-tabs-nav li .nav-tab:active,.ui-tabs .ui-tabs-nav li .nav-tab:focus{outline:none;-webkit-box-shadow:none;}.ui-tabs .ui-tabs-nav li .dashicons{color:#aaa;}.ui-tabs .ui-tabs-nav li.ui-state-active a,.ui-tabs .ui-tabs-nav li.ui-state-active.ui-state-hover a{background-color:#fff;border-bottom:1px solid #fff;}.ui-tabs .ui-tabs-nav li.ui-state-active .dashicons,.ui-tabs .ui-tabs-nav li.ui-state-active.ui-state-hover .dashicons{color:#666;}.ui-tabs .ui-tabs-nav li.ui-state-hover .dashicons{color:#999;}.ui-tabs .ui-tabs-panel{display:block;padding:1em;background:#fff;border:1px solid #ddd;}.ui-tabs .ui-tabs-hide{display:none !important;}.gv-dialog{z-index:10001;}.gv-overlay{cursor:pointer;position:fixed;z-index:10000;background:transparent;background:rgba(225, 225, 225, 0.4);width:100%;height:100%;overflow:hidden;}hr{border:0;height:0;border-bottom:1px solid #ddd;margin:2em 0 2em 0;}.gv-droppable-area{border:1px solid #ccc;margin-bottom:1em;}.gv-droppable-area .gv-droppable-area-action{background:#eee;padding:0.5em;}.gv-droppable-area .gv-droppable-area-action:before,.gv-droppable-area .gv-droppable-area-action:after{content:" ";display:table;}.gv-droppable-area .gv-droppable-area-action:after{clear:both;}.gv-droppable-area .gv-droppable-area-title{margin:0;padding:0;}.gv-droppable-area .gv-droppable-area-subtitle{margin:0.25em 0 0 0;padding:0;font-size:12px;color:#999;}.gv-droppable-area .button-secondary{float:right;}.active-drop{padding:3px 7px;min-height:44px;position:relative;}.active-drop .drop-message{color:#bbb;margin:0;display:block;text-align:center;width:90%;padding:0 5%;z-index:1;min-height:40px;font-size:13px;position:absolute;top:50%;margin-top:-8px;line-height:16px;}.gv-grid-col-1-2 .drop-message{padding-top:0;padding-bottom:0;}.fields-placeholder{margin:5px 2px;height:32px;border:1px dashed #ccc;}.gv-fields{cursor:move;border:1px solid #ddd;background:#f7f7f7;overflow:hidden;padding:0.5em 0.75em;margin:5px 0;width:100%;z-index:100;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}.gv-fields h5{float:left;width:100%;font-weight:600;font-size:14px;margin:0;padding:0 0 0 0.25em;-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}.gv-fields h5 small{color:#777;font-weight:600;}.gv-fields span.gv-field-controls{padding-left:0.33em;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}.gv-fields:hover{background:#fefefe;}.gv-fields:hover .gv-field-controls .dashicons{color:#136cb9;}.gv-fields:hover h5 small,.gv-fields:hover .gv-field-info{color:#666;}.gv-fields .gv-field-controls .dashicons{width:24px;font-size:18px;line-height:20px;}.gv-fields .gv-field-controls .dashicons:hover,.gv-fields .gv-field-controls .dashicons:active{color:#2ea2cc;}.gv-fields .gv-field-controls .dashicons.dashicons-dismiss{float:right;color:#999;}.gv-fields .gv-field-controls .dashicons.dashicons-dismiss:hover,.gv-fields .gv-field-controls .dashicons.dashicons-dismiss:active{color:#d03a3a;}.gv-fields .gv-field-controls .dashicons.dashicons-admin-links{color:#aaa;width:20px;font-size:16px;line-height:20px;cursor:default;}.gv-fields .gv-field-info{display:none;}.ui-tooltip .gv-fields .gv-field-info{display:block;font-weight:normal;color:#999;text-shadow:none;}.ui-tooltip .gv-fields .gv-field-info span:after{content:", ";}.ui-dialog-content,.ui-dialog{cursor:default;}.post-type-gravityview .ui-dialog-content{overflow:inherit;padding:0;}.ui-draggable-dragging{max-width:400px !important;}#directory-available-fields .gv-fields h5,#directory-available-widgets .gv-fields h5,#single-available-fields .gv-fields h5{padding:0 !important;}#directory-available-fields .gv-fields span.gv-field-controls,#directory-available-widgets .gv-fields span.gv-field-controls,#single-available-fields .gv-fields span.gv-field-controls{display:none !important;}.gv-sublabel{font-size:0.9em;display:block;}.ui-dialog-titlebar{min-height:1.25em;line-height:1.25;padding:10px;height:auto;}.gv-dialog-options{display:none;width:90%;padding:10px 0 !important;}.gv-dialog-options .subtitle{margin:0 15px 0.8em;padding:0.5em 0 0.8em;border-bottom:1px solid #eee;}.gv-dialog-options.gv-dialog-warning p{font-size:1.1em;margin:0 !important;padding:1.5em !important;}.gv-dialog-options.gv-dialog-warning .dashicons{font-size:70px;width:70px;height:70px;line-height:0.8;float:right;text-align:right;color:#ddd;}.gv-dialog-options .gv-setting-container{margin:0;padding:0.4em 15px 0.8em;display:block;font-size:1.1em;clear:left;}.gv-dialog-options .gv-setting-container.gv-setting-container-search_mode{display:none;}.gv-dialog-options .gv-setting-container:last-child{padding-bottom:0.5em;}.gv-dialog-options .gv-setting-container label{margin:0;font-weight:normal;display:inline-block;padding-right:0.75em;max-width:100%;}.gv-dialog-options .gv-setting-container .howto{margin:0 0 0.25em;}.gv-dialog-options .gv-setting-container code{font-style:normal !important;}.gv-dialog-options input[type="text"]{display:block;display:inline-block;clear:left;}.gv-dialog-options table,.gv-dialog-options table select{width:95%;margin:0 auto;}.gv-widget-search-fields table,.postbox .gv-dialog-options table{padding-bottom:15px;margin:0.5em auto;}.gv-widget-search-fields table td,.gv-widget-search-fields table th,.postbox .gv-dialog-options table td,.postbox .gv-dialog-options table th{text-align:left;padding:10px 5px;}.gv-widget-search-fields table .no-search-fields td,.postbox .gv-dialog-options table .no-search-fields td{text-align:center;font-size:15px;padding:15px 0;}.gv-widget-search-fields table .cell-sort,.postbox .gv-dialog-options table .cell-sort{cursor:ns-resize;}.gv-widget-search-fields table .cell-sort.no-sort,.postbox .gv-dialog-options table .cell-sort.no-sort{cursor:default;}.gv-widget-search-fields table .gv-search-fields,.gv-widget-search-fields table .gv-search-inputs,.postbox .gv-dialog-options table .gv-search-fields,.postbox .gv-dialog-options table .gv-search-inputs{width:100%;}.gv-widget-search-fields table .cell-sort a,.gv-widget-search-fields table .cell-add-remove a,.postbox .gv-dialog-options table .cell-sort a,.postbox .gv-dialog-options table .cell-add-remove a{font-size:18px;}.gv-widget-search-fields table .cell-sort a.dashicons,.gv-widget-search-fields table .cell-add-remove a.dashicons,.postbox .gv-dialog-options table .cell-sort a.dashicons,.postbox .gv-dialog-options table .cell-add-remove a.dashicons{opacity:0.8;}.gv-widget-search-fields table .cell-sort a.dashicons:hover,.gv-widget-search-fields table .cell-add-remove a.dashicons:hover,.postbox .gv-dialog-options table .cell-sort a.dashicons:hover,.postbox .gv-dialog-options table .cell-add-remove a.dashicons:hover{opacity:1;}.gv-widget-search-fields table .cell-sort a.dashicons-plus-alt,.gv-widget-search-fields table .cell-add-remove a.dashicons-plus-alt,.postbox .gv-dialog-options table .cell-sort a.dashicons-plus-alt,.postbox .gv-dialog-options table .cell-add-remove a.dashicons-plus-alt{color:green;}.gv-widget-search-fields table .cell-sort a.dashicons-dismiss,.gv-widget-search-fields table .cell-add-remove a.dashicons-dismiss,.postbox .gv-dialog-options table .cell-sort a.dashicons-dismiss,.postbox .gv-dialog-options table .cell-add-remove a.dashicons-dismiss{color:#d03a3a;}.gv-widget-search-fields table .cell-sort,.postbox .gv-dialog-options table .cell-sort{width:24px;}.gv-widget-search-fields table .cell-add-remove,.postbox .gv-dialog-options table .cell-add-remove{width:50px;}.post-type-gravityview input.merge-tag-support,.widgets-php input.merge-tag-support{width:90%;}.post-type-gravityview #gravityview_sort_field,.widgets-php #gravityview_sort_field{max-width:300px;}.post-type-gravityview #gv-loading,.widgets-php #gv-loading{text-align:center;font-size:16px;line-height:20px;display:block;}.post-type-gravityview #gv-loading .spinner,.widgets-php #gv-loading .spinner{display:inline-block;margin-top:-3px;float:none;}.gv-label{display:inline-block;clear:right;margin-bottom:0.1em;}.gv-label-checkbox{padding-right:1em;display:block;width:100%;}.gv-label-textarea,.gv-label-text{float:left;clear:both;width:100%;display:block;margin-bottom:0.5em;}.gv-shortcode .dashicons-editor-code{color:#888;left:-1px;font-size:20px;line-height:1;}
\ No newline at end of file
diff --git a/assets/css/scss/admin-metabox.scss b/assets/css/scss/admin-metabox.scss
index db48503af7..6552482879 100644
--- a/assets/css/scss/admin-metabox.scss
+++ b/assets/css/scss/admin-metabox.scss
@@ -11,6 +11,9 @@
padding: 0;
+ // Hide until shown using JS
+ display: none;
+
// For the Advanced Filter plugin, and any other field filters
.gform-field-filter {
clear: both;
diff --git a/assets/css/scss/admin-tooltips.scss b/assets/css/scss/admin-tooltips.scss
index c587355620..277d823ffd 100644
--- a/assets/css/scss/admin-tooltips.scss
+++ b/assets/css/scss/admin-tooltips.scss
@@ -86,3 +86,11 @@ body .ui-tooltip {
border-color: #999 transparent;
border-width: 10px 10px 0;
}
+
+/**
+ * Fix double close icons in jQuery UI dialog boxes
+ * @see https://github.com/katzwebservices/GravityView/issues/438
+ */
+.gv-dialog .ui-dialog-titlebar-close:before {
+ content: '';
+}
diff --git a/assets/css/scss/admin-views.scss b/assets/css/scss/admin-views.scss
index 8feb3b634e..67cd2322c9 100644
--- a/assets/css/scss/admin-views.scss
+++ b/assets/css/scss/admin-views.scss
@@ -724,6 +724,11 @@ hr {
font-size: 1.1em;
clear: left;
+ // Hide search mode by default
+ &.gv-setting-container-search_mode {
+ display: none;
+ }
+
&:last-child {
// border-bottom: none;
padding-bottom: .5em;
@@ -763,10 +768,11 @@ hr {
}
-.gv-widget-search-fields, .gv-dialog-options {
+.gv-widget-search-fields, .postbox .gv-dialog-options {
table {
padding-bottom: 15px;
+ margin: .5em auto; // Give rows some breathing room around other settings
td, th {
text-align: left;
diff --git a/assets/js/admin-views.js b/assets/js/admin-views.js
index 348e9a3b0b..35cae1c3af 100644
--- a/assets/js/admin-views.js
+++ b/assets/js/admin-views.js
@@ -22,6 +22,12 @@
// Checks if the execution is on a Start Fresh context
startFreshStatus: false,
+ /**
+ * @since 1.14
+ * @var int The width of the modal dialogs to use for field and widget settings
+ */
+ dialogWidth: 650,
+
init: function () {
// short tag
@@ -246,6 +252,7 @@
vcfg.currentFormId = '';
vcfg.togglePreviewButton();
$( "#gravityview_view_config, #gravityview_select_template, #gravityview_sort_filter, .gv-form-links" ).hide();
+ viewGeneralSettings.metaboxObj.hide();
},
@@ -421,9 +428,9 @@
resizable: false,
width: function () {
- // If the window is wider than 550px, use 550
- if ( $( window ).width() > 550 ) {
- return 550;
+ // If the window is wider than {vcfg.dialogWidth}px, use vcfg.dialogWidth
+ if ( $( window ).width() > vcfg.dialogWidth ) {
+ return vcfg.dialogWidth;
}
// Otherwise, return the window width, less 10px
@@ -520,6 +527,7 @@
$( '#gravityview_view_config' ).slideDown( 150 );
+ viewGeneralSettings.metaboxObj.show();
viewConfiguration.toggleDropMessage();
viewConfiguration.init_droppables();
viewConfiguration.init_tooltips();
@@ -643,13 +651,13 @@
parent.find( ".gv-template-preview" ).dialog( {
dialogClass: 'wp-dialog gv-dialog',
appendTo: $( "#gravityview_select_template" ),
- width: 550,
+ width: viewConfiguration.dialogWidth,
open: function () {
$( '
' ).prependTo( '#wpwrap' );
},
close: function () {
$( this ).dialog( "option", "appendTo", parent );
- $( '#wpwrap > .gv-overlay' ).fadeOut( 'fast', function () {
+ $( '#wpwrap' ).find('> .gv-overlay' ).fadeOut( 'fast', function () {
$( this ).remove();
} );
},
@@ -896,6 +904,7 @@
field_label: newField.find( '.gv-field-label' ).attr( 'data-original-title' ),
field_type: addButton.attr( 'data-objecttype' ),
input_type: newField.attr( 'data-inputtype' ),
+ form_id: vcfg.currentFormId,
nonce: gvGlobals.nonce,
};
@@ -972,6 +981,13 @@
* @return {void}
*/
enable_publish: function () {
+
+ /**
+ * Added in ~ WP 3.8
+ * @see https://github.com/WordPress/WordPress/blob/master/wp-admin/js/post.js#L365-L367
+ */
+ $( document ).trigger( 'autosave-enable-buttons.edit-post' );
+
// Restore saving after settings are generated
$( '#publishing-action #publish' ).prop( 'disabled', null ).removeClass( 'button-primary-disabled' );
},
@@ -981,6 +997,13 @@
* @return {void}
*/
disable_publish: function () {
+
+ /**
+ * Added in ~ WP 3.8
+ * @see https://github.com/WordPress/WordPress/blob/master/wp-admin/js/post.js#L363-L364
+ */
+ $( document ).trigger( 'autosave-disable-buttons.edit-post' );
+
$( '#publishing-action #publish' ).prop( 'disabled', 'disabled' ).addClass( 'button-primary-disabled' );
},
diff --git a/assets/js/admin-views.min.js b/assets/js/admin-views.min.js
index 60b1c1c515..fc62f29c41 100644
--- a/assets/js/admin-views.min.js
+++ b/assets/js/admin-views.min.js
@@ -1 +1 @@
-!function($){var viewConfiguration,viewGeneralSettings;viewConfiguration={startFreshStatus:!1,init:function(){var vcfg=viewConfiguration;vcfg.gvSelectForm=$("#gravityview_form_id"),vcfg.currentFormId=vcfg.gvSelectForm.val(),vcfg.toggleInitialVisibility(vcfg),$("body").on("change","#gravityview_form_id",vcfg.formChange).on("click",'a[href="#gv_start_fresh"]',vcfg.startFresh).on("click","#publish, #save-post",vcfg.processFormSubmit).on("click",".gv-view-types-hover",vcfg.selectTemplateHover).on("click","a[rel*=external]",vcfg.openExternalLinks).on("click mouseup keyup",vcfg.closeTooltips).on("click",'a[href="#gv_switch_view"]',vcfg.switchView).on("click",'a[href="#gv_select_template"]',vcfg.selectTemplate).on("click",".ui-tooltip-content .gv-fields",vcfg.startAddField).on("click",".gv-shortcode input",vcfg.selectText).on("gravityview_form_change",vcfg.updateFormLinks).on("change",".gv-dialog-options input[name*=show_as_link]",vcfg.toggleShowAsEntry).on("click",".gv-field-controls a[href='#remove']",vcfg.removeField).on("click",".gv-field-controls a[href='#settings']",vcfg.openFieldSettings).on("dblclick",".gv-fields",vcfg.openFieldSettings)},closeTooltips:function(e){var activeTooltips=$("[data-tooltip='active']"),close=!1,return_false=!1;switch(e.type){case"keyup":27===e.keyCode&&(close=!0);break;case"mouseup":$(e.target).parents(".ui-dialog,.ui-tooltip").length||$(e.target).is(".ui-dialog,.ui-tooltip")?close=!1:activeTooltips.length>0&&(close=!0),$(e.target).parents(".close").length&&(close=!0);break;case"click":$(e.target).is(".gv-overlay")&&(close=!0,return_false=!0,$(e.target).remove())}return close&&(activeTooltips.tooltip("close"),$(".ui-dialog:visible").find(".ui-dialog-content").dialog("close"),return_false)?!1:void 0},toggleShowAsEntry:function(e){var parent=$(e.target).parents(".gv-fields"),icon=parent.find(".gv-field-controls .dashicons-admin-links");icon.toggleClass("hide-if-js",$(e.target).not(":checked"))},selectText:function(e){return e.preventDefault(),$(this).focus().select(),!1},toggleInitialVisibility:function(vcfg){0!==vcfg.gvSelectForm.length&&(""===vcfg.currentFormId?vcfg.hideView():$("#gravityview_directory_template").val().length>0?($("#gravityview_select_template").slideUp(150),vcfg.showViewConfig()):(vcfg.templateFilter("custom"),vcfg.showViewTypeMetabox()),vcfg.togglePreviewButton())},togglePreviewButton:function(){var preview_button=$("#preview-action .button");""===viewConfiguration.gvSelectForm.val()?preview_button.hide():preview_button.show()},hideView:function(){var vcfg=viewConfiguration;vcfg.currentFormId="",vcfg.togglePreviewButton(),$("#gravityview_view_config, #gravityview_select_template, #gravityview_sort_filter, .gv-form-links").hide()},updateFormLinks:function(){var vcfg=viewConfiguration;$(".gv-form-links a").each(function(){var new_url=$(this).attr("href").replace(/id=([0-9]+)/gm,"id="+vcfg.gvSelectForm.val());$(this).attr("href",new_url)})},toggleViewTypeMetabox:function(){var $templates=$("#gravityview_select_template");$templates.is(":visible")?($("a[href=#gv_switch_view]").text(function(){return $(this).attr("data-text-backup")}),$templates.slideUp(150)):($("a[href=#gv_switch_view]").attr("data-text-backup",function(){return $(this).text()}).text(gvGlobals.label_cancel),$templates.slideDown(150))},showViewTypeMetabox:function(){$("#gravityview_select_template").slideDown(150)},startFresh:function(e){e.preventDefault();var vcfg=viewConfiguration;vcfg.startFreshStatus=!0,""!==vcfg.currentFormId&&vcfg.gvSelectForm.length>0?vcfg.showDialog("#gravityview_form_id_dialog"):vcfg.startFreshContinue()},startFreshContinue:function(){var vcfg=viewConfiguration;$("#gravityview_form_id_start_fresh").val("1"),$("#gravityview_form_id").val(""),$("a[href=#gv_switch_view]").hide(),vcfg.templateFilter("preset"),vcfg.showViewTypeMetabox(),vcfg.hideViewConfig(),vcfg.togglePreviewButton()},formChange:function(e){e.preventDefault();var vcfg=viewConfiguration;vcfg.startFreshStatus=!1,""!==vcfg.currentFormId&&vcfg.currentFormId!==$(this).val()?vcfg.showDialog("#gravityview_form_id_dialog"):vcfg.formChangeContinue(),vcfg.togglePreviewButton()},formChangeContinue:function(){var vcfg=viewConfiguration;""===vcfg.gvSelectForm.val()?vcfg.hideView():($("body").trigger("gravityview_form_change").addClass("gv-form-changed"),vcfg.templateFilter("custom"),vcfg.showViewTypeMetabox(),vcfg.getAvailableFields(),vcfg.getSortableFields(),$("a[href=#gv_switch_view]").fadeOut(150))},showDialog:function(dialogSelector,buttons){var vcfg=viewConfiguration,thisDialog=$(dialogSelector),cancel_button={text:gvGlobals.label_cancel,click:function(){thisDialog.is("#gravityview_form_id_dialog")?(vcfg.startFreshStatus=!1,vcfg.gvSelectForm.val(vcfg.currentFormId)):thisDialog.is("#gravityview_switch_template_dialog")&&(vcfg.toggleViewTypeMetabox(),vcfg.showViewConfig()),thisDialog.dialog("close")}},continue_button={text:gvGlobals.label_continue,click:function(){thisDialog.is("#gravityview_form_id_dialog")?vcfg.startFreshStatus?vcfg.startFreshContinue():vcfg.formChangeContinue():thisDialog.is("#gravityview_switch_template_dialog")&&(vcfg.selectTemplateContinue(),vcfg.toggleViewTypeMetabox()),thisDialog.dialog("close")}},default_buttons=[cancel_button,continue_button];buttons=buttons||default_buttons,thisDialog.dialog({dialogClass:"wp-dialog gv-dialog",appendTo:thisDialog.parent(),draggable:!1,resizable:!1,width:function(){return $(window).width()>550?550:$(window).width()-10},open:function(){return $('
').prependTo("#wpwrap"),!0},close:function(e){e.preventDefault(),vcfg.setCustomLabel(thisDialog),$("#wpwrap > .gv-overlay").fadeOut("fast",function(){$(this).remove()})},closeOnEscape:!0,buttons:buttons})},setCustomLabel:function(dialog){var $custom_label=$("[name*=custom_label]",dialog),show_label=$("[name*=show_label]",dialog).is(":checked"),$label=dialog.parents(".gv-fields").find(".gv-field-label");$custom_label.length&&$custom_label.val().trim().length&&show_label&&($label.text($custom_label.val().trim()),$label.html($label.attr("data-original-title")))},getSortableFields:function(context,id){var vcfg=viewConfiguration;$("#gravityview_sort_field").prop("disabled","disabled").empty().append(""+gvGlobals.loading_text+" ");var data={action:"gv_sortable_fields_form",nonce:gvGlobals.nonce};void 0!==context&&"preset"===context?data.template_id=id:data.form_id=vcfg.gvSelectForm.val(),$.post(ajaxurl,data,function(response){"false"!==response&&"0"!==response&&$("#gravityview_sort_field").empty().append(response).prop("disabled",null)})},hideViewConfig:function(){$("#gravityview_view_config").slideUp(150),$(document).trigger("gv_admin_views_hideViewConfig")},showViewConfig:function(){$("#gravityview_view_config").slideDown(150),viewConfiguration.toggleDropMessage(),viewConfiguration.init_droppables(),viewConfiguration.init_tooltips(),$(document).trigger("gv_admin_views_showViewConfig")},switchView:function(e){e.preventDefault(),e.stopImmediatePropagation();var vcfg=viewConfiguration;vcfg.templateFilter("custom"),vcfg.toggleViewTypeMetabox()},templateFilter:function(templateType){$(".gv-view-types-module").each(function(){$(this).attr("data-filter")===templateType?$(this).parent().show():$(this).parent().hide()})},selectTemplate:function(e){var vcfg=viewConfiguration;e.preventDefault(),e.stopImmediatePropagation(),vcfg.wantedTemplate=$(this);var currTemplateId=$("#gravityview_directory_template").val(),selectedTemplateId=vcfg.wantedTemplate.attr("data-templateid");""===currTemplateId?($("#gravityview_select_template").slideUp(150),vcfg.selectTemplateContinue()):currTemplateId!==selectedTemplateId?vcfg.showDialog("#gravityview_switch_template_dialog"):(vcfg.toggleViewTypeMetabox(),vcfg.showViewConfig())},selectTemplateContinue:function(){var vcfg=viewConfiguration,selectedTemplateId=vcfg.wantedTemplate.attr("data-templateid");$("#gravityview_directory_template").val(selectedTemplateId).change();var $parent=vcfg.wantedTemplate.parents(".gv-view-types-module");$parent.parents(".gv-grid").find(".gv-view-types-module").removeClass("gv-selected"),$parent.addClass("gv-selected"),$("#wpcontent,.gv-fields").addClass("gv-wait"),vcfg.startFreshStatus?(vcfg.getAvailableFields("preset",selectedTemplateId),vcfg.getPresetFields(selectedTemplateId),vcfg.getSortableFields("preset",selectedTemplateId)):(vcfg.updateActiveAreas(selectedTemplateId),$("a[href=#gv_switch_view]").fadeIn(150),vcfg.toggleViewTypeMetabox())},selectTemplateHover:function(e){e.preventDefault(),e.stopImmediatePropagation(),$(this).find('a[href="#gv_select_template"]').trigger("click")},openExternalLinks:function(){return window.open(this.href),!1},previewTemplate:function(e){e.preventDefault(),e.stopImmediatePropagation();var parent=$(event.currentTarget).parents(".gv-view-types-module");parent.find(".gv-template-preview").dialog({dialogClass:"wp-dialog gv-dialog",appendTo:$("#gravityview_select_template"),width:550,open:function(){$('
').prependTo("#wpwrap")},close:function(){$(this).dialog("option","appendTo",parent),$("#wpwrap > .gv-overlay").fadeOut("fast",function(){$(this).remove()})},closeOnEscape:!0,buttons:[{text:gvGlobals.label_close,click:function(){$(this).dialog("close")}}]})},updateActiveAreas:function(template){var vcfg=viewConfiguration;$("#directory-active-fields, #single-active-fields").children().remove();var data={action:"gv_get_active_areas",template_id:template,nonce:gvGlobals.nonce};$.post(ajaxurl,data,function(response){if(response){var content=$.parseJSON(response);$("#directory-header-widgets").html(content.header),$("#directory-footer-widgets").html(content.footer),$("#directory-active-fields").append(content.directory),$("#single-active-fields").append(content.single),$("#wpcontent,.gv-fields").removeClass("gv-wait"),vcfg.showViewConfig()}})},getPresetFields:function(template){var vcfg=viewConfiguration;$("#directory-active-fields, #single-active-fields").children().remove();var data={action:"gv_get_preset_fields",template_id:template,nonce:gvGlobals.nonce};$.post(ajaxurl,data,function(response){if(response){var content=$.parseJSON(response);$("#directory-header-widgets").html(content.header),$("#directory-footer-widgets").html(content.footer),$("#directory-active-fields").append(content.directory),$("#single-active-fields").append(content.single),$("#wpcontent,.gv-fields").removeClass("gv-wait"),vcfg.showViewConfig()}})},init_tooltips:function(){$(".gv-add-field").tooltip({content:function(){var context=$(this).attr("data-context");switch($(this).attr("data-objecttype")){case"field":return $("#"+context+"-available-fields").html();case"widget":return $("#directory-available-widgets").html()}},close:function(){$(this).attr("data-tooltip",null)},open:function(){$(this).attr("data-tooltip","active").attr("data-tooltip-id",$(this).attr("aria-describedby"))},closeOnEscape:!0,disabled:!0,position:{my:"center bottom",at:"center top-12"},tooltipClass:"top"}).attr("title","").on("mouseout focusout",function(e){e.stopImmediatePropagation()}).click(function(e){$(this).attr("title",""),e.preventDefault(),$(this).tooltip("open")})},refreshGFtooltips:function(){$(".gf_tooltip").tooltip({show:500,hide:1e3,content:function(){return $(this).prop("title")}})},getAvailableFields:function(preset,templateid){var vcfg=viewConfiguration;$("#directory-available-fields, #single-available-fields, #edit-available-fields").find(".gv-fields").remove(),$("#directory-active-fields, #single-active-fields, #edit-active-fields").find(".gv-fields").remove(),vcfg.toggleDropMessage();var data={action:"gv_available_fields",nonce:gvGlobals.nonce,context:"directory"};void 0!==preset&&"preset"===preset?data.template_id=templateid:data.form_id=vcfg.gvSelectForm.val(),$.post(ajaxurl,data,function(response){response&&$("#directory-available-fields").append(response)}),data.context="single",$.post(ajaxurl,data,function(response){response&&$("#single-available-fields").append(response)}),data.context="edit",$.post(ajaxurl,data,function(response){response&&$("#edit-available-fields").append(response)})},startAddField:function(e){$(this).has(".field-id-all-fields").length?viewConfiguration.addAllFields($(this)):viewConfiguration.addField($(this),e)},addAllFields:function(clicked){clicked.siblings(".gv-fields").each(function(){$(this).trigger("click")}),$("a.gv-add-field[data-tooltip='active']").tooltip("close")},addField:function(clicked,e){e.preventDefault();var vcfg=viewConfiguration,newField=clicked.clone().hide(),areaId=clicked.parents(".ui-tooltip").attr("id"),templateId=$("#gravityview_directory_template").val(),tooltipId=clicked.parents(".ui-tooltip").attr("id"),addButton=$('a.gv-add-field[data-tooltip-id="'+tooltipId+'"]'),data={action:"gv_field_options",template:templateId,area:addButton.attr("data-areaid"),context:addButton.attr("data-context"),field_id:newField.attr("data-fieldid"),field_label:newField.find(".gv-field-label").attr("data-original-title"),field_type:addButton.attr("data-objecttype"),input_type:newField.attr("data-inputtype"),nonce:gvGlobals.nonce};$.ajax({type:"POST",url:ajaxurl,data:data,async:!0,beforeSend:function(){vcfg.disable_publish()},complete:function(){vcfg.enable_publish()}}).done(function(response){newField.append(response),$(".gv-dialog-options",newField).length>0&&$(".dashicons-admin-generic",newField).removeClass("hide-if-js"),$('a[data-tooltip-id="'+areaId+'"]').parents(".gv-droppable-area").find(".active-drop").append(newField).end().attr("data-tooltip-id",""),newField.fadeIn(100,function(){$(".all-merge-tags").remove(),"undefined"!=typeof form&&$("body").not(".gv-form-changed")&&(window.gfMergeTags=new gfMergeTagsObj(form))}),vcfg.refreshGFtooltips()}).fail(function(jqXHR){vcfg.enable_publish(),alert(gvGlobals.field_loaderror),console.log(jqXHR)}).always(function(){vcfg.toggleDropMessage()})},enable_publish:function(){$("#publishing-action #publish").prop("disabled",null).removeClass("button-primary-disabled")},disable_publish:function(){$("#publishing-action #publish").prop("disabled","disabled").addClass("button-primary-disabled")},init_droppables:function(){var vcfg=viewConfiguration;$("#directory-fields, #single-fields").find(".active-drop-widget").sortable({placeholder:"fields-placeholder",items:"> .gv-fields",distance:2,revert:75,connectWith:".active-drop-widget",receive:function(event,ui){var sender_area=ui.sender.attr("data-areaid"),receiver_area=$(this).attr("data-areaid");ui.item.find('[name^="widgets['+sender_area+']"]').each(function(){var name=$(this).attr("name");$(this).attr("name",name.replace(sender_area,receiver_area))}),vcfg.toggleDropMessage()}}),$("#directory-fields, #single-fields, #edit-fields").find(".active-drop-field").sortable({placeholder:"fields-placeholder",items:"> .gv-fields",distance:2,revert:75,connectWith:".active-drop-field",receive:function(event,ui){if(ui.item.find(".gv-dialog-options").length>0){var sender_area=ui.sender.attr("data-areaid"),receiver_area=$(this).attr("data-areaid");ui.item.find('[name^="fields['+sender_area+']"]').each(function(){var name=$(this).attr("name");$(this).attr("name",name.replace(sender_area,receiver_area))})}vcfg.toggleDropMessage()}})},toggleDropMessage:function(){$(".active-drop").each(function(){$(this).find(".gv-fields").length>0?$(this).find(".drop-message").hide():$(this).find(".drop-message").fadeIn(100)})},removeField:function(e){e.preventDefault();var vcfg=viewConfiguration,area=$(e.currentTarget).parents(".active-drop");if(e.altKey&&$(area).find(".gv-fields").length>1){var remove_all=window.confirm(gvGlobals.remove_all_fields);return void(remove_all&&($(area).find(".gv-fields").remove(),vcfg.toggleDropMessage()))}$(e.currentTarget).parents(".gv-fields").fadeOut("normal",function(){$(this).remove(),vcfg.toggleDropMessage()})},openFieldSettings:function(e){e.preventDefault();var parent,vcfg=viewConfiguration;parent=$(e.currentTarget).is(".gv-fields")?$(e.currentTarget):$(e.currentTarget).parents(".gv-fields"),vcfg.updateVisibilitySettings(e,!0),$("body").on("change",".gv-fields input:checkbox",vcfg.updateVisibilitySettings);var buttons=[{text:gvGlobals.label_close,click:function(){$(this).dialog("close")}}];vcfg.showDialog(parent.find(".gv-dialog-options"),buttons)},updateVisibilitySettings:function(e,first_run){var vcfg=viewConfiguration;first_run=first_run||!1;var $parent=$(e.currentTarget).is(".gv-fields")?$(e.currentTarget):$(e.currentTarget).parents(".gv-fields");vcfg.toggleVisibility($("input:checkbox[name*=show_label]",$parent),$("[name*=custom_label]",$parent),first_run),vcfg.toggleVisibility($("input:checkbox[name*=emailmailto]",$parent),$("[name*=emailsubject],[name*=emailbody]",$parent),first_run),vcfg.toggleVisibility($("input:checkbox[name*=link_to_source]",$parent),$("[name*=source_link_text]",$parent),first_run),$("input:checkbox",$parent).attr("disabled",null),$("input:checkbox[name*=show_as_link]",$parent).is(":checked")&&$("input:checkbox[name*=link_to_]",$parent).attr("disabled",!0),$("input:checkbox[name*=link_to_]:checked",$parent).length>0&&$("input:checkbox[name*=show_as_link]",$parent).attr("disabled",!0),vcfg.toggleVisibility($("input:checkbox[name*=only_loggedin]",$parent),$("[name*=only_loggedin_cap]",$parent),first_run)},toggleVisibility:function($checkbox,$toggled,first_run){var speed=first_run?0:"fast";$checkbox.is(":checked")?$toggled.parents(".gv-setting-container").fadeIn(speed):$toggled.parents(".gv-setting-container").fadeOut(speed)},processFormSubmit:function(e){var vcfg=viewConfiguration,templateId=$("#gravityview_directory_template").val();return vcfg.startFreshStatus?(vcfg.createPresetForm(e,templateId),!1):vcfg.startFreshStatus&&""!==templateId?!1:vcfg.serializeForm(e)},serializeForm:function(e){if($(e.target).data("gv-valid"))return!0;e.stopImmediatePropagation(),$(e.target).data("gv-valid",!1),$("#post").find("input[name*=date_display]").val(function(){return $(this).val().replace(/[\\"']/g,"\\$&").replace(/\u0000/g,"\\0")});var $fields=$("#post").find(":input[name^=fields]"),serialized_data=$fields.serialize();return $fields.remove(),$("#post").append($(" ",{name:"fields",value:serialized_data,type:"hidden"})),setTimeout(function(){$(e.target).data("gv-valid",!0).click()},101),!1},createPresetForm:function(e,templateId){var vcfg=viewConfiguration;e.stopPropagation();var data={action:"gv_set_preset_form",template_id:templateId,nonce:gvGlobals.nonce};return $.ajax({type:"POST",url:ajaxurl,data:data,async:!1,success:function(response){"false"!==response&&"0"!==response?(vcfg.startFreshStatus=!1,vcfg.gvSelectForm.find("option:selected").removeAttr("selected").end().append(response),$(e.target).click()):$("#post").before(''+gvGlobals.label_publisherror+"
")}}),!1}},viewGeneralSettings={templateId:null,metaboxObj:null,init:function(){viewGeneralSettings.metaboxObj=$("#gravityview_settings"),viewGeneralSettings.initTabs(),$("#gravityview_directory_template").change(viewGeneralSettings.updateSettingsDisplay).trigger("change"),$("body").on("gravityview/settings/tab/enable",viewGeneralSettings.enableSettingTab).on("gravityview/settings/tab/disable",viewGeneralSettings.disableSettingTab)},updateSettingsDisplay:function(){viewGeneralSettings.templateId=$(this).val(),$("tr[data-show-if]").each(viewGeneralSettings.toggleSetting)},toggleSetting:function(){var row=$(this),templates=row.attr("data-show-if");templates.length<1||(viewGeneralSettings.templateId.length>0&&templates.indexOf(viewGeneralSettings.templateId)>-1?row.show():(row.find("select, input").val("").prop("checked",!1),row.hide()))},initTabs:function(){viewGeneralSettings.metaboxObj.on("tabscreate",viewGeneralSettings.tabsCreate).insertAfter($("#gravityview_view_config")).tabs().addClass("ui-tabs-vertical ui-helper-clearfix").find("li").removeClass("ui-corner-top")},tabsCreate:function(event,ui){var $container=$(this),$panels=($container.children(".inside"),$container.find(".ui-tabs-panel")),max=(ui.panel,[]);$panels.each(function(){max.push($(this).outerHeight(!0))}).css({"min-height":_.max(max)})},enableSettingTab:function(e,tab){viewGeneralSettings.metaboxObj.tabs("enable",$(tab).attr("id"))},disableSettingTab:function(e,tab){viewGeneralSettings.metaboxObj.tabs("disable",$(tab).attr("id"))}},jQuery(document).ready(function($){$("#title-prompt-text").text(gvGlobals.label_viewname),viewGeneralSettings.init(),viewConfiguration.init(),$(".gv-datepicker").datepicker({dateFormat:"yy-mm-dd",constrainInput:!1});var cookie_key="gv-active-tab-"+$("#post_ID").val(),activate_tab=$.cookie(cookie_key);"undefined"===activate_tab&&(activate_tab=0),$("#gv-view-configuration-tabs").tabs({active:activate_tab,activate:function(event,ui){$.cookie(cookie_key,ui.newTab.index(),{path:gvGlobals.cookiepath})}})})}(jQuery);
\ No newline at end of file
+!function($){var viewConfiguration,viewGeneralSettings;viewConfiguration={startFreshStatus:!1,dialogWidth:650,init:function(){var vcfg=viewConfiguration;vcfg.gvSelectForm=$("#gravityview_form_id"),vcfg.currentFormId=vcfg.gvSelectForm.val(),vcfg.toggleInitialVisibility(vcfg),$("body").on("change","#gravityview_form_id",vcfg.formChange).on("click",'a[href="#gv_start_fresh"]',vcfg.startFresh).on("click","#publish, #save-post",vcfg.processFormSubmit).on("click",".gv-view-types-hover",vcfg.selectTemplateHover).on("click","a[rel*=external]",vcfg.openExternalLinks).on("click mouseup keyup",vcfg.closeTooltips).on("click",'a[href="#gv_switch_view"]',vcfg.switchView).on("click",'a[href="#gv_select_template"]',vcfg.selectTemplate).on("click",".ui-tooltip-content .gv-fields",vcfg.startAddField).on("click",".gv-shortcode input",vcfg.selectText).on("gravityview_form_change",vcfg.updateFormLinks).on("change",".gv-dialog-options input[name*=show_as_link]",vcfg.toggleShowAsEntry).on("click",".gv-field-controls a[href='#remove']",vcfg.removeField).on("click",".gv-field-controls a[href='#settings']",vcfg.openFieldSettings).on("dblclick",".gv-fields",vcfg.openFieldSettings)},closeTooltips:function(e){var activeTooltips=$("[data-tooltip='active']"),close=!1,return_false=!1;switch(e.type){case"keyup":27===e.keyCode&&(close=!0);break;case"mouseup":$(e.target).parents(".ui-dialog,.ui-tooltip").length||$(e.target).is(".ui-dialog,.ui-tooltip")?close=!1:activeTooltips.length>0&&(close=!0),$(e.target).parents(".close").length&&(close=!0);break;case"click":$(e.target).is(".gv-overlay")&&(close=!0,return_false=!0,$(e.target).remove())}return close&&(activeTooltips.tooltip("close"),$(".ui-dialog:visible").find(".ui-dialog-content").dialog("close"),return_false)?!1:void 0},toggleShowAsEntry:function(e){var parent=$(e.target).parents(".gv-fields"),icon=parent.find(".gv-field-controls .dashicons-admin-links");icon.toggleClass("hide-if-js",$(e.target).not(":checked"))},selectText:function(e){return e.preventDefault(),$(this).focus().select(),!1},toggleInitialVisibility:function(vcfg){0!==vcfg.gvSelectForm.length&&(""===vcfg.currentFormId?vcfg.hideView():$("#gravityview_directory_template").val().length>0?($("#gravityview_select_template").slideUp(150),vcfg.showViewConfig()):(vcfg.templateFilter("custom"),vcfg.showViewTypeMetabox()),vcfg.togglePreviewButton())},togglePreviewButton:function(){var preview_button=$("#preview-action .button");""===viewConfiguration.gvSelectForm.val()?preview_button.hide():preview_button.show()},hideView:function(){var vcfg=viewConfiguration;vcfg.currentFormId="",vcfg.togglePreviewButton(),$("#gravityview_view_config, #gravityview_select_template, #gravityview_sort_filter, .gv-form-links").hide(),viewGeneralSettings.metaboxObj.hide()},updateFormLinks:function(){var vcfg=viewConfiguration;$(".gv-form-links a").each(function(){var new_url=$(this).attr("href").replace(/id=([0-9]+)/gm,"id="+vcfg.gvSelectForm.val());$(this).attr("href",new_url)})},toggleViewTypeMetabox:function(){var $templates=$("#gravityview_select_template");$templates.is(":visible")?($("a[href=#gv_switch_view]").text(function(){return $(this).attr("data-text-backup")}),$templates.slideUp(150)):($("a[href=#gv_switch_view]").attr("data-text-backup",function(){return $(this).text()}).text(gvGlobals.label_cancel),$templates.slideDown(150))},showViewTypeMetabox:function(){$("#gravityview_select_template").slideDown(150)},startFresh:function(e){e.preventDefault();var vcfg=viewConfiguration;vcfg.startFreshStatus=!0,""!==vcfg.currentFormId&&vcfg.gvSelectForm.length>0?vcfg.showDialog("#gravityview_form_id_dialog"):vcfg.startFreshContinue()},startFreshContinue:function(){var vcfg=viewConfiguration;$("#gravityview_form_id_start_fresh").val("1"),$("#gravityview_form_id").val(""),$("a[href=#gv_switch_view]").hide(),vcfg.templateFilter("preset"),vcfg.showViewTypeMetabox(),vcfg.hideViewConfig(),vcfg.togglePreviewButton()},formChange:function(e){e.preventDefault();var vcfg=viewConfiguration;vcfg.startFreshStatus=!1,""!==vcfg.currentFormId&&vcfg.currentFormId!==$(this).val()?vcfg.showDialog("#gravityview_form_id_dialog"):vcfg.formChangeContinue(),vcfg.togglePreviewButton()},formChangeContinue:function(){var vcfg=viewConfiguration;""===vcfg.gvSelectForm.val()?vcfg.hideView():($("body").trigger("gravityview_form_change").addClass("gv-form-changed"),vcfg.templateFilter("custom"),vcfg.showViewTypeMetabox(),vcfg.getAvailableFields(),vcfg.getSortableFields(),$("a[href=#gv_switch_view]").fadeOut(150))},showDialog:function(dialogSelector,buttons){var vcfg=viewConfiguration,thisDialog=$(dialogSelector),cancel_button={text:gvGlobals.label_cancel,click:function(){thisDialog.is("#gravityview_form_id_dialog")?(vcfg.startFreshStatus=!1,vcfg.gvSelectForm.val(vcfg.currentFormId)):thisDialog.is("#gravityview_switch_template_dialog")&&(vcfg.toggleViewTypeMetabox(),vcfg.showViewConfig()),thisDialog.dialog("close")}},continue_button={text:gvGlobals.label_continue,click:function(){thisDialog.is("#gravityview_form_id_dialog")?vcfg.startFreshStatus?vcfg.startFreshContinue():vcfg.formChangeContinue():thisDialog.is("#gravityview_switch_template_dialog")&&(vcfg.selectTemplateContinue(),vcfg.toggleViewTypeMetabox()),thisDialog.dialog("close")}},default_buttons=[cancel_button,continue_button];buttons=buttons||default_buttons,thisDialog.dialog({dialogClass:"wp-dialog gv-dialog",appendTo:thisDialog.parent(),draggable:!1,resizable:!1,width:function(){return $(window).width()>vcfg.dialogWidth?vcfg.dialogWidth:$(window).width()-10},open:function(){return $('
').prependTo("#wpwrap"),!0},close:function(e){e.preventDefault(),vcfg.setCustomLabel(thisDialog),$("#wpwrap > .gv-overlay").fadeOut("fast",function(){$(this).remove()})},closeOnEscape:!0,buttons:buttons})},setCustomLabel:function(dialog){var $custom_label=$("[name*=custom_label]",dialog),show_label=$("[name*=show_label]",dialog).is(":checked"),$label=dialog.parents(".gv-fields").find(".gv-field-label");$custom_label.length&&$custom_label.val().trim().length&&show_label&&($label.text($custom_label.val().trim()),$label.html($label.attr("data-original-title")))},getSortableFields:function(context,id){var vcfg=viewConfiguration;$("#gravityview_sort_field").prop("disabled","disabled").empty().append(""+gvGlobals.loading_text+" ");var data={action:"gv_sortable_fields_form",nonce:gvGlobals.nonce};void 0!==context&&"preset"===context?data.template_id=id:data.form_id=vcfg.gvSelectForm.val(),$.post(ajaxurl,data,function(response){"false"!==response&&"0"!==response&&$("#gravityview_sort_field").empty().append(response).prop("disabled",null)})},hideViewConfig:function(){$("#gravityview_view_config").slideUp(150),$(document).trigger("gv_admin_views_hideViewConfig")},showViewConfig:function(){$("#gravityview_view_config").slideDown(150),viewGeneralSettings.metaboxObj.show(),viewConfiguration.toggleDropMessage(),viewConfiguration.init_droppables(),viewConfiguration.init_tooltips(),$(document).trigger("gv_admin_views_showViewConfig")},switchView:function(e){e.preventDefault(),e.stopImmediatePropagation();var vcfg=viewConfiguration;vcfg.templateFilter("custom"),vcfg.toggleViewTypeMetabox()},templateFilter:function(templateType){$(".gv-view-types-module").each(function(){$(this).attr("data-filter")===templateType?$(this).parent().show():$(this).parent().hide()})},selectTemplate:function(e){var vcfg=viewConfiguration;e.preventDefault(),e.stopImmediatePropagation(),vcfg.wantedTemplate=$(this);var currTemplateId=$("#gravityview_directory_template").val(),selectedTemplateId=vcfg.wantedTemplate.attr("data-templateid");""===currTemplateId?($("#gravityview_select_template").slideUp(150),vcfg.selectTemplateContinue()):currTemplateId!==selectedTemplateId?vcfg.showDialog("#gravityview_switch_template_dialog"):(vcfg.toggleViewTypeMetabox(),vcfg.showViewConfig())},selectTemplateContinue:function(){var vcfg=viewConfiguration,selectedTemplateId=vcfg.wantedTemplate.attr("data-templateid");$("#gravityview_directory_template").val(selectedTemplateId).change();var $parent=vcfg.wantedTemplate.parents(".gv-view-types-module");$parent.parents(".gv-grid").find(".gv-view-types-module").removeClass("gv-selected"),$parent.addClass("gv-selected"),$("#wpcontent,.gv-fields").addClass("gv-wait"),vcfg.startFreshStatus?(vcfg.getAvailableFields("preset",selectedTemplateId),vcfg.getPresetFields(selectedTemplateId),vcfg.getSortableFields("preset",selectedTemplateId)):(vcfg.updateActiveAreas(selectedTemplateId),$("a[href=#gv_switch_view]").fadeIn(150),vcfg.toggleViewTypeMetabox())},selectTemplateHover:function(e){e.preventDefault(),e.stopImmediatePropagation(),$(this).find('a[href="#gv_select_template"]').trigger("click")},openExternalLinks:function(){return window.open(this.href),!1},previewTemplate:function(e){e.preventDefault(),e.stopImmediatePropagation();var parent=$(event.currentTarget).parents(".gv-view-types-module");parent.find(".gv-template-preview").dialog({dialogClass:"wp-dialog gv-dialog",appendTo:$("#gravityview_select_template"),width:viewConfiguration.dialogWidth,open:function(){$('
').prependTo("#wpwrap")},close:function(){$(this).dialog("option","appendTo",parent),$("#wpwrap").find("> .gv-overlay").fadeOut("fast",function(){$(this).remove()})},closeOnEscape:!0,buttons:[{text:gvGlobals.label_close,click:function(){$(this).dialog("close")}}]})},updateActiveAreas:function(template){var vcfg=viewConfiguration;$("#directory-active-fields, #single-active-fields").children().remove();var data={action:"gv_get_active_areas",template_id:template,nonce:gvGlobals.nonce};$.post(ajaxurl,data,function(response){if(response){var content=$.parseJSON(response);$("#directory-header-widgets").html(content.header),$("#directory-footer-widgets").html(content.footer),$("#directory-active-fields").append(content.directory),$("#single-active-fields").append(content.single),$("#wpcontent,.gv-fields").removeClass("gv-wait"),vcfg.showViewConfig()}})},getPresetFields:function(template){var vcfg=viewConfiguration;$("#directory-active-fields, #single-active-fields").children().remove();var data={action:"gv_get_preset_fields",template_id:template,nonce:gvGlobals.nonce};$.post(ajaxurl,data,function(response){if(response){var content=$.parseJSON(response);$("#directory-header-widgets").html(content.header),$("#directory-footer-widgets").html(content.footer),$("#directory-active-fields").append(content.directory),$("#single-active-fields").append(content.single),$("#wpcontent,.gv-fields").removeClass("gv-wait"),vcfg.showViewConfig()}})},init_tooltips:function(){$(".gv-add-field").tooltip({content:function(){var context=$(this).attr("data-context");switch($(this).attr("data-objecttype")){case"field":return $("#"+context+"-available-fields").html();case"widget":return $("#directory-available-widgets").html()}},close:function(){$(this).attr("data-tooltip",null)},open:function(){$(this).attr("data-tooltip","active").attr("data-tooltip-id",$(this).attr("aria-describedby"))},closeOnEscape:!0,disabled:!0,position:{my:"center bottom",at:"center top-12"},tooltipClass:"top"}).attr("title","").on("mouseout focusout",function(e){e.stopImmediatePropagation()}).click(function(e){$(this).attr("title",""),e.preventDefault(),$(this).tooltip("open")})},refreshGFtooltips:function(){$(".gf_tooltip").tooltip({show:500,hide:1e3,content:function(){return $(this).prop("title")}})},getAvailableFields:function(preset,templateid){var vcfg=viewConfiguration;$("#directory-available-fields, #single-available-fields, #edit-available-fields").find(".gv-fields").remove(),$("#directory-active-fields, #single-active-fields, #edit-active-fields").find(".gv-fields").remove(),vcfg.toggleDropMessage();var data={action:"gv_available_fields",nonce:gvGlobals.nonce,context:"directory"};void 0!==preset&&"preset"===preset?data.template_id=templateid:data.form_id=vcfg.gvSelectForm.val(),$.post(ajaxurl,data,function(response){response&&$("#directory-available-fields").append(response)}),data.context="single",$.post(ajaxurl,data,function(response){response&&$("#single-available-fields").append(response)}),data.context="edit",$.post(ajaxurl,data,function(response){response&&$("#edit-available-fields").append(response)})},startAddField:function(e){$(this).has(".field-id-all-fields").length?viewConfiguration.addAllFields($(this)):viewConfiguration.addField($(this),e)},addAllFields:function(clicked){clicked.siblings(".gv-fields").each(function(){$(this).trigger("click")}),$("a.gv-add-field[data-tooltip='active']").tooltip("close")},addField:function(clicked,e){e.preventDefault();var vcfg=viewConfiguration,newField=clicked.clone().hide(),areaId=clicked.parents(".ui-tooltip").attr("id"),templateId=$("#gravityview_directory_template").val(),tooltipId=clicked.parents(".ui-tooltip").attr("id"),addButton=$('a.gv-add-field[data-tooltip-id="'+tooltipId+'"]'),data={action:"gv_field_options",template:templateId,area:addButton.attr("data-areaid"),context:addButton.attr("data-context"),field_id:newField.attr("data-fieldid"),field_label:newField.find(".gv-field-label").attr("data-original-title"),field_type:addButton.attr("data-objecttype"),input_type:newField.attr("data-inputtype"),form_id:vcfg.currentFormId,nonce:gvGlobals.nonce};$.ajax({type:"POST",url:ajaxurl,data:data,async:!0,beforeSend:function(){vcfg.disable_publish()},complete:function(){vcfg.enable_publish()}}).done(function(response){newField.append(response),$(".gv-dialog-options",newField).length>0&&$(".dashicons-admin-generic",newField).removeClass("hide-if-js"),$('a[data-tooltip-id="'+areaId+'"]').parents(".gv-droppable-area").find(".active-drop").append(newField).end().attr("data-tooltip-id",""),newField.fadeIn(100,function(){$(".all-merge-tags").remove(),"undefined"!=typeof form&&$("body").not(".gv-form-changed")&&(window.gfMergeTags=new gfMergeTagsObj(form))}),vcfg.refreshGFtooltips()}).fail(function(jqXHR){vcfg.enable_publish(),alert(gvGlobals.field_loaderror),console.log(jqXHR)}).always(function(){vcfg.toggleDropMessage()})},enable_publish:function(){$(document).trigger("autosave-enable-buttons.edit-post"),$("#publishing-action #publish").prop("disabled",null).removeClass("button-primary-disabled")},disable_publish:function(){$(document).trigger("autosave-disable-buttons.edit-post"),$("#publishing-action #publish").prop("disabled","disabled").addClass("button-primary-disabled")},init_droppables:function(){var vcfg=viewConfiguration;$("#directory-fields, #single-fields").find(".active-drop-widget").sortable({placeholder:"fields-placeholder",items:"> .gv-fields",distance:2,revert:75,connectWith:".active-drop-widget",receive:function(event,ui){var sender_area=ui.sender.attr("data-areaid"),receiver_area=$(this).attr("data-areaid");ui.item.find('[name^="widgets['+sender_area+']"]').each(function(){var name=$(this).attr("name");$(this).attr("name",name.replace(sender_area,receiver_area))}),vcfg.toggleDropMessage()}}),$("#directory-fields, #single-fields, #edit-fields").find(".active-drop-field").sortable({placeholder:"fields-placeholder",items:"> .gv-fields",distance:2,revert:75,connectWith:".active-drop-field",receive:function(event,ui){if(ui.item.find(".gv-dialog-options").length>0){var sender_area=ui.sender.attr("data-areaid"),receiver_area=$(this).attr("data-areaid");ui.item.find('[name^="fields['+sender_area+']"]').each(function(){var name=$(this).attr("name");$(this).attr("name",name.replace(sender_area,receiver_area))})}vcfg.toggleDropMessage()}})},toggleDropMessage:function(){$(".active-drop").each(function(){$(this).find(".gv-fields").length>0?$(this).find(".drop-message").hide():$(this).find(".drop-message").fadeIn(100)})},removeField:function(e){e.preventDefault();var vcfg=viewConfiguration,area=$(e.currentTarget).parents(".active-drop");if(e.altKey&&$(area).find(".gv-fields").length>1){var remove_all=window.confirm(gvGlobals.remove_all_fields);return void(remove_all&&($(area).find(".gv-fields").remove(),vcfg.toggleDropMessage()))}$(e.currentTarget).parents(".gv-fields").fadeOut("normal",function(){$(this).remove(),vcfg.toggleDropMessage()})},openFieldSettings:function(e){e.preventDefault();var parent,vcfg=viewConfiguration;parent=$(e.currentTarget).is(".gv-fields")?$(e.currentTarget):$(e.currentTarget).parents(".gv-fields"),vcfg.updateVisibilitySettings(e,!0),$("body").on("change",".gv-fields input:checkbox",vcfg.updateVisibilitySettings);var buttons=[{text:gvGlobals.label_close,click:function(){$(this).dialog("close")}}];vcfg.showDialog(parent.find(".gv-dialog-options"),buttons)},updateVisibilitySettings:function(e,first_run){var vcfg=viewConfiguration;first_run=first_run||!1;var $parent=$(e.currentTarget).is(".gv-fields")?$(e.currentTarget):$(e.currentTarget).parents(".gv-fields");vcfg.toggleVisibility($("input:checkbox[name*=show_label]",$parent),$("[name*=custom_label]",$parent),first_run),vcfg.toggleVisibility($("input:checkbox[name*=emailmailto]",$parent),$("[name*=emailsubject],[name*=emailbody]",$parent),first_run),vcfg.toggleVisibility($("input:checkbox[name*=link_to_source]",$parent),$("[name*=source_link_text]",$parent),first_run),$("input:checkbox",$parent).attr("disabled",null),$("input:checkbox[name*=show_as_link]",$parent).is(":checked")&&$("input:checkbox[name*=link_to_]",$parent).attr("disabled",!0),$("input:checkbox[name*=link_to_]:checked",$parent).length>0&&$("input:checkbox[name*=show_as_link]",$parent).attr("disabled",!0),vcfg.toggleVisibility($("input:checkbox[name*=only_loggedin]",$parent),$("[name*=only_loggedin_cap]",$parent),first_run)},toggleVisibility:function($checkbox,$toggled,first_run){var speed=first_run?0:"fast";$checkbox.is(":checked")?$toggled.parents(".gv-setting-container").fadeIn(speed):$toggled.parents(".gv-setting-container").fadeOut(speed)},processFormSubmit:function(e){var vcfg=viewConfiguration,templateId=$("#gravityview_directory_template").val();return vcfg.startFreshStatus?(vcfg.createPresetForm(e,templateId),!1):vcfg.startFreshStatus&&""!==templateId?!1:vcfg.serializeForm(e)},serializeForm:function(e){if($(e.target).data("gv-valid"))return!0;e.stopImmediatePropagation(),$(e.target).data("gv-valid",!1),$("#post").find("input[name*=date_display]").val(function(){return $(this).val().replace(/[\\"']/g,"\\$&").replace(/\u0000/g,"\\0")});var $fields=$("#post").find(":input[name^=fields]"),serialized_data=$fields.serialize();return $fields.remove(),$("#post").append($(" ",{name:"fields",value:serialized_data,type:"hidden"})),setTimeout(function(){$(e.target).data("gv-valid",!0).click()},101),!1},createPresetForm:function(e,templateId){var vcfg=viewConfiguration;e.stopPropagation();var data={action:"gv_set_preset_form",template_id:templateId,nonce:gvGlobals.nonce};return $.ajax({type:"POST",url:ajaxurl,data:data,async:!1,success:function(response){"false"!==response&&"0"!==response?(vcfg.startFreshStatus=!1,vcfg.gvSelectForm.find("option:selected").removeAttr("selected").end().append(response),$(e.target).click()):$("#post").before(''+gvGlobals.label_publisherror+"
")}}),!1}},viewGeneralSettings={templateId:null,metaboxObj:null,init:function(){viewGeneralSettings.metaboxObj=$("#gravityview_settings"),viewGeneralSettings.initTabs(),$("#gravityview_directory_template").change(viewGeneralSettings.updateSettingsDisplay).trigger("change"),$("body").on("gravityview/settings/tab/enable",viewGeneralSettings.enableSettingTab).on("gravityview/settings/tab/disable",viewGeneralSettings.disableSettingTab)},updateSettingsDisplay:function(){viewGeneralSettings.templateId=$(this).val(),$("tr[data-show-if]").each(viewGeneralSettings.toggleSetting)},toggleSetting:function(){var row=$(this),templates=row.attr("data-show-if");templates.length<1||(viewGeneralSettings.templateId.length>0&&templates.indexOf(viewGeneralSettings.templateId)>-1?row.show():(row.find("select, input").val("").prop("checked",!1),row.hide()))},initTabs:function(){viewGeneralSettings.metaboxObj.on("tabscreate",viewGeneralSettings.tabsCreate).insertAfter($("#gravityview_view_config")).tabs().addClass("ui-tabs-vertical ui-helper-clearfix").find("li").removeClass("ui-corner-top")},tabsCreate:function(event,ui){var $container=$(this),$panels=($container.children(".inside"),$container.find(".ui-tabs-panel")),max=(ui.panel,[]);$panels.each(function(){max.push($(this).outerHeight(!0))}).css({"min-height":_.max(max)})},enableSettingTab:function(e,tab){viewGeneralSettings.metaboxObj.tabs("enable",$(tab).attr("id"))},disableSettingTab:function(e,tab){viewGeneralSettings.metaboxObj.tabs("disable",$(tab).attr("id"))}},jQuery(document).ready(function($){$("#title-prompt-text").text(gvGlobals.label_viewname),viewGeneralSettings.init(),viewConfiguration.init(),$(".gv-datepicker").datepicker({dateFormat:"yy-mm-dd",constrainInput:!1});var cookie_key="gv-active-tab-"+$("#post_ID").val(),activate_tab=$.cookie(cookie_key);"undefined"===activate_tab&&(activate_tab=0),$("#gv-view-configuration-tabs").tabs({active:activate_tab,activate:function(event,ui){$.cookie(cookie_key,ui.newTab.index(),{path:gvGlobals.cookiepath})}})})}(jQuery);
\ No newline at end of file
diff --git a/gravityview.php b/gravityview.php
index 1949d43493..6203b4b260 100644
--- a/gravityview.php
+++ b/gravityview.php
@@ -16,7 +16,7 @@
* Plugin Name: GravityView
* Plugin URI: http://gravityview.co
* Description: Create directories based on a Gravity Forms form, insert them using a shortcode, and modify how they output.
- * Version: 1.13.1
+ * Version: 1.14-beta
* Author: Katz Web Services, Inc.
* Author URI: http://www.katzwebservices.com
* Text Domain: gravityview
@@ -89,7 +89,7 @@
*/
final class GravityView_Plugin {
- const version = '1.13.1';
+ const version = '1.14-beta';
private static $instance;
diff --git a/includes/admin/class.render.settings.php b/includes/admin/class.render.settings.php
index f66f7fc887..206c4821b6 100644
--- a/includes/admin/class.render.settings.php
+++ b/includes/admin/class.render.settings.php
@@ -65,7 +65,7 @@ public static function get_default_field_options( $field_type, $template_id, $fi
);
// Match Table as well as DataTables
- if( preg_match( '/table/ism', $template_id ) ) {
+ if( preg_match( '/table/ism', $template_id ) && 'single' !== $context ) {
$field_options['width'] = array(
'type' => 'number',
'label' => __('Percent Width', 'gravityview'),
@@ -211,10 +211,10 @@ public static function render_field_options( $field_type, $template_id, $field_i
switch( $option['type'] ) {
// Hide hidden fields
case 'hidden':
- $output .= ''. $field_output . '
';
+ $output .= ''. $field_output . '
';
break;
default:
- $output .= ''. $field_output .'
';
+ $output .= ''. $field_output .'
';
}
}
diff --git a/includes/admin/metaboxes/views/select-template.php b/includes/admin/metaboxes/views/select-template.php
index 60ecc04b04..d4a481e349 100644
--- a/includes/admin/metaboxes/views/select-template.php
+++ b/includes/admin/metaboxes/views/select-template.php
@@ -14,11 +14,7 @@
//current value
$current_template = gravityview_get_template_id( $post->ID );
-/**
- * @filter `gravityview_register_directory_template` Fetch available View templates
- * @param array $templates Templates to show
- */
-$templates = apply_filters( 'gravityview_register_directory_template', array() );
+$templates = gravityview_get_registered_templates();
// current input
?>
diff --git a/includes/class-admin-approve-entries.php b/includes/class-admin-approve-entries.php
index cab50940b8..2996e435a4 100644
--- a/includes/class-admin-approve-entries.php
+++ b/includes/class-admin-approve-entries.php
@@ -311,7 +311,7 @@ public static function update_approved( $entry_id = 0, $approved = 0, $form_id =
if( class_exists( 'RGFormsModel' ) ){
global $current_user;
get_currentuserinfo();
- RGFormsModel::add_note( $entry_id, $current_user->ID, $current_user->display_name, $note );
+ RGFormsModel::add_note( $entry_id, $current_user->ID, $current_user->display_name, $note, 'gravityview' );
}
/**
diff --git a/includes/class-admin-views.php b/includes/class-admin-views.php
index 5f513f8347..bbc98aceb7 100644
--- a/includes/class-admin-views.php
+++ b/includes/class-admin-views.php
@@ -51,7 +51,7 @@ function __construct() {
add_filter( 'gform_toolbar_menu', array( 'GravityView_Admin_Views', 'gform_toolbar_menu' ), 10, 2 );
- add_action( 'manage_gravityview_posts_custom_column', array( __CLASS__, 'add_connected_form_column_content'), 10, 2 );
+ add_action( 'manage_gravityview_posts_custom_column', array( $this, 'add_custom_column_content'), 10, 2 );
}
@@ -214,31 +214,60 @@ public function tooltips( $tooltips = array() ) {
*
* @return void
*/
- static public function add_connected_form_column_content( $column_name = NULL, $post_id ) {
+ public function add_custom_column_content( $column_name = NULL, $post_id ) {
- if( !empty( $column_name ) && $column_name !== 'gv_connected_form' ) { return; }
+ $output = '';
- $form_id = gravityview_get_form_id( $post_id );
+ switch ( $column_name ) {
+ case 'gv_template':
- // All Views should have a connected form. If it doesn't, that's not right.
- if( empty($form_id) ) {
- do_action( 'gravityview_log_error', sprintf( '[add_connected_form_column_content] View ID %s does not have a connected GF form.', $post_id ) );
- echo __( 'Not connected.', 'gravityview' );
- return;
- }
+ $template_id = gravityview_get_template_id( $post_id );
- $form = gravityview_get_form( $form_id );
+ // All Views should have a connected form. If it doesn't, that's not right.
+ if ( empty( $template_id ) ) {
+ do_action( 'gravityview_log_error', sprintf( __METHOD__ . ' View ID %s does not have a connected template.', $post_id ) );
+ break;
+ }
- if( !$form ) {
- do_action( 'gravityview_log_error', sprintf( '[add_connected_form_column_content] Connected form not found: Form #%d', $form_id ) );
+ $templates = gravityview_get_registered_templates();
- echo __( 'The connected form can not be found; it may no longer exist.', 'gravityview' );
- }
+ $template = isset( $templates[ $template_id ] ) ? $templates[ $template_id ] : false;
+
+ // Generate backup if label doesn't exist: `example_name` => `Example Name`
+ $template_id_pretty = ucwords( implode( ' ', explode( '_', $template_id ) ) );
- echo self::get_connected_form_links( $form );
+ $output = $template ? $template['label'] : $template_id_pretty;
+
+ break;
+
+ case 'gv_connected_form':
+
+ $form_id = gravityview_get_form_id( $post_id );
+
+ // All Views should have a connected form. If it doesn't, that's not right.
+ if ( empty( $form_id ) ) {
+ do_action( 'gravityview_log_error', sprintf( '[add_data_source_column_content] View ID %s does not have a connected GF form.', $post_id ) );
+ $output = __( 'Not connected.', 'gravityview' );
+ break;
+ }
+ $form = gravityview_get_form( $form_id );
+
+ if ( ! $form ) {
+ do_action( 'gravityview_log_error', sprintf( '[add_data_source_column_content] Connected form not found: Form #%d', $form_id ) );
+
+ $output = __( 'The connected form can not be found; it may no longer exist.', 'gravityview' );
+ }
+
+ $output = self::get_connected_form_links( $form );
+
+ break;
+ }
+
+ echo $output;
}
+
/**
* Get HTML links relating to a connected form, like Edit, Entries, Settings, Preview
* @param array|int $form_id Gravity Forms forms array, or the form ID
@@ -315,6 +344,8 @@ public function add_post_type_columns( $columns ) {
$columns['gv_connected_form'] = __('Data Source', 'gravityview');
+ $columns['gv_template'] = __('Template', 'gravityview');
+
// Add the date back in.
$columns['date'] = $date;
diff --git a/includes/class-ajax.php b/includes/class-ajax.php
index 25a78266b0..f5b0e9b3d7 100644
--- a/includes/class-ajax.php
+++ b/includes/class-ajax.php
@@ -85,6 +85,8 @@ function get_active_areas() {
do_action( 'gravityview_render_directory_active_areas', $_POST['template_id'], 'single', '', true );
$response['single'] = ob_get_clean();
+ $response = array_map( 'gravityview_strip_whitespace', $response );
+
exit( json_encode( $response ) );
}
@@ -134,6 +136,8 @@ function get_preset_fields_config() {
do_action('gravityview_render_active_areas', $template_id, 'field', 'single', $template_areas_single, $presets['fields'] );
$response['single'] = ob_get_clean();
+ $response = array_map( 'gravityview_strip_whitespace', $response );
+
do_action( 'gravityview_log_debug', '[get_preset_fields_config] AJAX Response', $response );
exit( json_encode( $response ) );
@@ -229,6 +233,8 @@ function get_field_options() {
$response = GravityView_Render_Settings::render_field_options( $post['field_type'], $post['template'], $post['field_id'], $post['field_label'], $post['area'], $input_type, '', '', $context );
+ $response = gravityview_strip_whitespace( $response );
+
exit( $response );
}
@@ -258,6 +264,8 @@ function get_sortable_fields() {
$response = gravityview_get_sortable_fields( $form );
+ $response = gravityview_strip_whitespace( $response );
+
exit( $response );
}
diff --git a/includes/class-api.php b/includes/class-api.php
index 29c1c3462d..ea26d09abe 100644
--- a/includes/class-api.php
+++ b/includes/class-api.php
@@ -45,7 +45,7 @@ public static function field_label( $field, $entry = array(), $force_show_label
$input = GFFormsModel::get_input( $field_object, $field['id'] );
- // This is a complex field, with lables on a per-input basis
+ // This is a complex field, with labels on a per-input basis
if( $input ) {
// Does the input have a custom label on a per-input basis? Otherwise, default label.
@@ -1226,7 +1226,15 @@ function gravityview_field_output( $passed_args ) {
* Create the Context for replacing.
* @since 1.11
*/
- $context = array();
+ $context = array(
+ 'value' => '',
+ 'width' => '',
+ 'width:style' => '',
+ 'label' => '',
+ 'label_value' => '',
+ 'class' => '',
+ 'field_id' => '',
+ );
$context['value'] = gv_value( $entry, $args['field'] );
@@ -1254,13 +1262,13 @@ function gravityview_field_output( $passed_args ) {
$context['label'] = str_replace( array( '{{label}}', '{{ label }}' ), '{{ label_value }} ', $args['label_markup'] );
}
- if ( empty( $context['label'] ) ){
- $context['label'] = '{{ label_value }} ';
- }
-
// Default Label value
$context['label_value'] = gv_label( $args['field'], $entry );
+ if ( empty( $context['label'] ) && ! empty( $context['label_value'] ) ){
+ $context['label'] = '{{ label_value }} ';
+ }
+
/**
* @filter `gravityview/field_output/pre_html` Allow Pre filtering of the HTML
* @since 1.11
diff --git a/includes/class-cache.php b/includes/class-cache.php
index 76f1e75212..141323deab 100644
--- a/includes/class-cache.php
+++ b/includes/class-cache.php
@@ -67,6 +67,11 @@ function add_hooks() {
// Trigger this when you need to prevent any results from being cached with forms that have been modified
add_action( 'gravityview_clear_form_cache', array( $this, 'blacklist_add' ) );
+ /**
+ * @since 1.14
+ */
+ add_action( 'gravityview_clear_entry_cache', array( $this, 'entry_status_changed' ) );
+
add_action( 'gform_after_update_entry', array( $this, 'entry_updated' ), 10, 2 );
add_action( 'gform_entry_created', array( $this, 'entry_created' ), 10, 2 );
diff --git a/includes/class-change-entry-creator.php b/includes/class-change-entry-creator.php
index 8fc94a07cb..caaf246beb 100644
--- a/includes/class-change-entry-creator.php
+++ b/includes/class-change-entry-creator.php
@@ -68,7 +68,7 @@ function assign_new_user_to_lead( $user_id, $config, $entry = array(), $password
do_action( 'gravityview_log_debug', 'GravityView_Change_Entry_Creator[assign_new_user_to_lead] - '.$note );
- RGFormsModel::add_note( $entry['id'], -1, 'GravityView', $note );
+ RGFormsModel::add_note( $entry['id'], -1, 'GravityView', $note, 'gravityview' );
}
@@ -182,7 +182,7 @@ function update_entry_creator($form, $entry_id) {
$created_by_name = sprintf( $user_format, $created_by_user_data->display_name, $created_by_user_data->ID );
}
- RGFormsModel::add_note( $entry_id, $current_user->ID, $user_data->display_name, sprintf( __('Changed entry creator from %s to %s', 'gravityview'), $original_name, $created_by_name ) );
+ RGFormsModel::add_note( $entry_id, $current_user->ID, $user_data->display_name, sprintf( __('Changed entry creator from %s to %s', 'gravityview'), $original_name, $created_by_name ), 'gravityview' );
}
}
diff --git a/includes/class-common.php b/includes/class-common.php
index 57ce65cd4b..f39eb10bce 100644
--- a/includes/class-common.php
+++ b/includes/class-common.php
@@ -214,6 +214,24 @@ public static function get_form_fields( $form = '', $add_default_properties = fa
}
}
+ /** @since 1.14 */
+ if( 'list' === $field['type'] && !empty( $field['enableColumns'] ) ) {
+
+ foreach ( (array)$field['choices'] as $key => $input ) {
+
+ $input_id = sprintf( '%d.%d', $field['id'], $key ); // {field_id}.{column_key}
+
+ $fields[ $input_id ] = array(
+ 'label' => rgar( $input, 'text' ),
+ 'customLabel' => '',
+ 'parent' => $field,
+ 'type' => rgar( $field, 'type' ),
+ 'adminLabel' => rgar( $field, 'adminLabel' ),
+ 'adminOnly' => rgar( $field, 'adminOnly' ),
+ );
+ }
+ }
+
/**
* @since 1.8
*/
@@ -486,11 +504,26 @@ public static function get_entries( $form_ids = null, $passed_criteria = null, &
if ( is_null( $return ) && class_exists( 'GFAPI' ) && ( is_numeric( $form_ids ) || is_array( $form_ids ) ) ) {
- $entries = GFAPI::get_entries( $form_ids, $criteria['search_criteria'], $criteria['sorting'], $criteria['paging'], $total );
+ /**
+ * @filter `gravityview_pre_get_entries` Define entries to be used before GFAPI::get_entries() is called
+ * @since 1.14
+ * @param null $return If you want to override GFAPI::get_entries() and define entries yourself, tap in here.
+ * @param array $criteria The final search criteria used to generate the request to `GFAPI::get_entries()`
+ * @param array $passed_criteria The original search criteria passed to `GVCommon::get_entries()`
+ * @param int|null $total Optional. An output parameter containing the total number of entries. Pass a non-null value to generate
+ */
+ $entries = apply_filters( 'gravityview_before_get_entries', null, $criteria, $passed_criteria, $total );
- if ( is_wp_error( $entries ) ) {
- do_action( 'gravityview_log_error', $entries->get_error_message(), $entries );
- return false;
+ // No entries returned from gravityview_before_get_entries
+ if( is_null( $entries ) ) {
+
+ $entries = GFAPI::get_entries( $form_ids, $criteria['search_criteria'], $criteria['sorting'], $criteria['paging'], $total );
+
+ if ( is_wp_error( $entries ) ) {
+ do_action( 'gravityview_log_error', $entries->get_error_message(), $entries );
+
+ return false;
+ }
}
if ( ! empty( $criteria['cache'] ) && isset( $Cache ) ) {
@@ -524,9 +557,10 @@ public static function get_entries( $form_ids = null, $passed_criteria = null, &
* @access public
* @param mixed $entry_id
* @param boolean $force_allow_ids Force the get_entry() method to allow passed entry IDs, even if the `gravityview_custom_entry_slug_allow_id` filter returns false.
- * @return object or false
+ * @param boolean $check_entry_display Check whether the entry is visible for the current View configuration. Default: true. {@since 1.14}
+ * @return array|boolean
*/
- public static function get_entry( $entry_slug, $force_allow_ids = false ) {
+ public static function get_entry( $entry_slug, $force_allow_ids = false, $check_entry_display = true ) {
if ( class_exists( 'GFAPI' ) && ! empty( $entry_slug ) ) {
@@ -568,10 +602,12 @@ public static function get_entry( $entry_slug, $force_allow_ids = false ) {
// fetch the entry
$entry = GFAPI::get_entry( $entry_id );
- // Is the entry allowed
- $entry = self::check_entry_display( $entry );
+ if( $check_entry_display ) {
+ // Is the entry allowed
+ $entry = self::check_entry_display( $entry );
+ }
- return $entry;
+ return is_wp_error( $entry ) ? false : $entry;
}
@@ -709,8 +745,8 @@ public static function check_entry_display( $entry ) {
$k = $filter['key'];
- if ( 'created_by' === $k ) {
- $field_value = $entry['created_by'];
+ if ( in_array( $k, array( 'created_by', 'payment_status' ) ) ) {
+ $field_value = $entry[ $k ];
$field = null;
} else {
$field = self::get_field( $form, $k );
@@ -1049,9 +1085,9 @@ public static function is_field_numeric( $form = null, $field = '' ) {
/**
* @filter `gravityview/common/numeric_types` What types of fields are numeric?
- * @param array $numeric_types Fields that are numeric. Default: `[ number ]`
+ * @param array $numeric_types Fields that are numeric. Default: `[ number, time ]`
*/
- $numeric_types = apply_filters( 'gravityview/common/numeric_types', array( 'number' ) );
+ $numeric_types = apply_filters( 'gravityview/common/numeric_types', array( 'number', 'time' ) );
if ( ! is_array( $form ) && ! is_array( $field ) ) {
$form = self::get_form( $form );
@@ -1248,19 +1284,30 @@ public static function array_merge_recursive_distinct( array &$array1, array &$a
}
/**
- * Get WordPress users, by default limited to 750 users for performance reasons
+ * Get WordPress users with reasonable limits set
*
* @param string $context Where are we using this information (e.g. change_entry_creator, search_widget ..)
+ * @param array $args Arguments to modify the user query. See get_users() {@since 1.14}
* @return array Array of WP_User objects.
*/
- public static function get_users( $context = 'change_entry_creator' ) {
+ public static function get_users( $context = 'change_entry_creator', $args = array() ) {
+
+ $default_args = array(
+ 'number' => 2000,
+ 'orderby' => 'display_name',
+ 'order' => 'ASC',
+ 'fields' => array( 'ID', 'display_name', 'user_login', 'user_nicename' )
+ );
+
+ // Merge in the passed arg
+ $get_users_settings = wp_parse_args( $args, $default_args );
/**
* @filter `gravityview/get_users/{$context}` There are issues with too many users using [get_users()](http://codex.wordpress.org/Function_Reference/get_users) where it breaks the select. We try to keep it at a reasonable number. \n
* `$context` is where are we using this information (e.g. change_entry_creator, search_widget ..)
* @param array $settings Settings array, with `number` key defining the # of users to display
*/
- $get_users_settings = apply_filters( 'gravityview/get_users/'. $context, apply_filters( 'gravityview_change_entry_creator_user_parameters', array( 'number' => 750 ) ) );
+ $get_users_settings = apply_filters( 'gravityview/get_users/'. $context, apply_filters( 'gravityview_change_entry_creator_user_parameters', $get_users_settings ) );
return get_users( $get_users_settings );
}
diff --git a/includes/class-frontend-views.php b/includes/class-frontend-views.php
index a077c45e29..c0f8a7e39e 100644
--- a/includes/class-frontend-views.php
+++ b/includes/class-frontend-views.php
@@ -852,7 +852,10 @@ public static function get_search_criteria( $args, $form_id ) {
// remove not approved entries
$search_criteria = self::process_search_only_approved( $args, $search_criteria );
- // Only show active listings
+ /**
+ * @filter `gravityview_status` Modify entry status requirements to be included in search results.
+ * @param string $status Default: `active`. Accepts all Gravity Forms entry statuses, including `spam` and `trash`
+ */
$search_criteria['status'] = apply_filters( 'gravityview_status', 'active', $args );
return $search_criteria;
@@ -1055,13 +1058,11 @@ private static function _override_sorting_id_by_field_type( $sort_field_id, $for
// Sorting by full name, not first, last, etc.
if ( floatval( $sort_field_id ) === floor( $sort_field_id ) ) {
/**
- * Override how to sort when sorting full name.
- *
+ * @filter `gravityview/sorting/full-name` Override how to sort when sorting full name.
* @since 1.7.4
- *
- * @param string $name_part `first` or `last` (default: `first`)
- * @param string $sort_field_id Field used for sorting
- * @param int $form_id GF Form ID
+ * @param[in,out] string $name_part Sort by `first` or `last` (default: `first`)
+ * @param[in] string $sort_field_id Field used for sorting
+ * @param[in] int $form_id GF Form ID
*/
$name_part = apply_filters( 'gravityview/sorting/full-name', 'first', $sort_field_id, $form_id );
@@ -1072,6 +1073,17 @@ private static function _override_sorting_id_by_field_type( $sort_field_id, $for
}
}
break;
+ case 'time':
+
+ /**
+ * @filter `gravityview/sorting/time` Override how to sort when sorting time
+ * @see GravityView_Field_Time
+ * @since 1.14
+ * @param[in,out] string $name_part Field used for sorting
+ * @param[in] int $form_id GF Form ID
+ */
+ $sort_field_id = apply_filters( 'gravityview/sorting/time', $sort_field_id, $form_id );
+ break;
}
return $sort_field_id;
diff --git a/includes/class-gravityview-extension.php b/includes/class-gravityview-extension.php
index 2f07140baf..3f7874523a 100644
--- a/includes/class-gravityview-extension.php
+++ b/includes/class-gravityview-extension.php
@@ -17,15 +17,27 @@
abstract class GravityView_Extension {
/**
- * @var string Name of the plugin in GravityView.co
+ * @var string Name of the plugin in gravityview.co
*/
protected $_title = NULL;
+ /**
+ * @since 1.1
+ * @var string Path to the base plugin file, normally `__FILE__`
+ */
+ protected $_path = NULL;
+
/**
* @var string Version number of the plugin
*/
protected $_version = NULL;
+ /**
+ * @var int The ID of the download on gravityview.co
+ * @since 1.1
+ */
+ protected $_item_id = NULL;
+
/**
* @var string Translation textdomain
*/
@@ -91,14 +103,7 @@ function __construct() {
*
* @see https://gist.github.com/zackkatz/6cc381bcf54849f2ed41 For example of adding a metabox
*
- * @return array {
- * @type string $id Metabox HTML ID, without `gravityview_` prefix
- * @type string $title Name of the metabox. Shown in the tab.
- * @type string $file The file name of a file stored in the /gravityview/includes/admin/metaboxes/views/ directory to render the metabox output, or the full path to a file. If defined, `callback` is not used.
- * @type string $icon_class_name Icon class used in vertical tabs. Supports non-dashicon. If dashicons, no need for `dashicons ` prefix
- * @type string $callback Function to render the metabox, if $file is not defined.
- * @type null $callback_args Arguments passed to the callback
- * }
+ * @return array Array of metabox
*/
protected function tab_settings() {
// When overriding, return array with expected keys
@@ -220,7 +225,7 @@ protected function get_license() {
public function settings() {
// If doing ajax, get outta here
- if( false === GravityView_Plugin::is_admin() ) {
+ if( ! is_admin() || ( defined( 'DOING_AJAX' ) && DOING_AJAX ) ) {
return;
}
@@ -239,6 +244,7 @@ public function settings() {
array(
'version' => $this->_version, // current version number
'license' => $license['license'],
+ 'item_id' => $this->_item_id, // The ID of the download on _remote_update_url
'item_name' => $this->_title, // name of this plugin
'author' => strip_tags( $this->_author ) // author of this plugin
)
diff --git a/includes/class-gravityview-merge-tags.php b/includes/class-gravityview-merge-tags.php
index d55d7e514d..077de6c9ba 100644
--- a/includes/class-gravityview-merge-tags.php
+++ b/includes/class-gravityview-merge-tags.php
@@ -62,7 +62,7 @@ public static function replace_variables( $text, $form, $entry ) {
if( empty( $matches ) ) {
// Check for form variables
- if( !preg_match( '/\{(all_fields(:(.*?))?|pricing_fields|form_title|entry_url|ip|post_id|admin_email|post_edit_url|form_id|entry_id|embed_url|date_mdy|date_dmy|embed_post:(.*?)|custom_field:(.*?)|user_agent|referer|gv:(.*?)|user:(.*?)|created_by:(.*?))\}/ism', $text ) ) {
+ if( !preg_match( '/\{(all_fields(:(.*?))?|all_fields_display_empty|pricing_fields|form_title|entry_url|ip|post_id|admin_email|post_edit_url|form_id|entry_id|embed_url|date_mdy|date_dmy|embed_post:(.*?)|custom_field:(.*?)|user_agent|referer|gv:(.*?)|user:(.*?)|created_by:(.*?))\}/ism', $text ) ) {
return $text;
}
}
@@ -171,7 +171,14 @@ private function replace_user_variables_created_by( $text, $form = array(), $ent
$full_tag = $match[0];
$property = $match[1];
- $value = $entry_creator->get( $property );
+ switch( $property ) {
+ /** @since 1.13.2 */
+ case 'roles':
+ $value = implode( ', ', $entry_creator->roles );
+ break;
+ default:
+ $value = $entry_creator->get( $property );
+ }
$value = $url_encode ? urlencode( $value ) : $value;
diff --git a/includes/class-template.php b/includes/class-template.php
index c22fe8991e..7b939be9d2 100644
--- a/includes/class-template.php
+++ b/includes/class-template.php
@@ -362,7 +362,7 @@ public function setField( $key, $value ) {
* @return int
*/
public function getViewId() {
- return $this->view_id;
+ return absint( $this->view_id );
}
/**
@@ -765,6 +765,7 @@ public function render( $slug, $name, $require_once = true ) {
public function render_widget_hooks( $view_id ) {
if( empty( $view_id ) || 'single' == gravityview_get_context() ) {
+ do_action( 'gravityview_log_debug', __METHOD__ . ' - Not rendering widgets; single entry' );
return;
}
@@ -788,7 +789,10 @@ public function render_widget_hooks( $view_id ) {
}
// Prevent being called twice
- if( did_action( $zone.'_'.$view_id.'_widgets' ) ) { return; }
+ if( did_action( $zone.'_'.$view_id.'_widgets' ) ) {
+ do_action( 'gravityview_log_debug', sprintf( '%s - Not rendering %s; already rendered', __METHOD__ , $zone.'_'.$view_id.'_widgets' ) );
+ return;
+ }
// TODO Convert to partials
?>
@@ -815,8 +819,14 @@ public function render_widget_hooks( $view_id ) {
_field_options = $field_options;
+ $this->_field_id = $field_id;
+
return $field_options;
}
diff --git a/includes/fields/list.php b/includes/fields/list.php
new file mode 100644
index 0000000000..cc1eeef7b3
--- /dev/null
+++ b/includes/fields/list.php
@@ -0,0 +1,131 @@
+ $column_value ) {
+
+ // If the label of the column matches $column_id, or the numeric key value matches, add the value
+ if( (string)$column_key === (string)$column_id || ( is_numeric( $column_id ) && (int)$column_id === $current_column ) ) {
+ $column_values[] = $column_value;
+ }
+ $current_column++;
+ }
+ }
+
+ // Return the array of values
+ if( 'raw' === $format ) {
+ return $column_values;
+ }
+ // Return the Gravity Forms Field output
+ else {
+ return $field->get_value_entry_detail( serialize( $column_values ), '', false, $format );
+ }
+ }
+
+ /**
+ * When showing a single column values, display the label of the column instead of the field
+ *
+ * @since 1.14
+ *
+ * @param string $label Existing label string
+ * @param array $field GV field settings array, with `id`, `show_label`, `label`, `custom_label`, etc. keys
+ * @param array $form Gravity Forms form array
+ * @param array $entry Gravity Forms entry array
+ *
+ * @return string Existing label if the field isn't
+ */
+ public function _filter_field_label( $label, $field, $form, $entry ) {
+
+ $field_object = RGFormsModel::get_field( $form, $field['id'] );
+
+ // Not a list field
+ if( ( ! $field_object || 'list' !== $field_object->get_input_type() ) ) {
+ return $label;
+ }
+
+ // Custom label is defined, so use it
+ if( ! empty( $field['custom_label'] ) ) {
+ return $label;
+ }
+
+ $field_id_array = explode( '.', $field['id'] );
+
+ // Parent field, not column field
+ if( ! isset( $field_id_array[1] ) ) {
+ return $label;
+ }
+
+ $column_id = intval( $field_id_array[1] );
+
+ return self::get_column_label( $field_object, $column_id, $label );
+ }
+
+ /**
+ * Get the column label for the list
+ *
+ * @since 1.14
+ *
+ * @param GF_Field_List $field Gravity Forms List field
+ * @param int $column_id The key of the column (0-index)
+ * @param string $backup_label Backup label to use. Optional.
+ *
+ * @return string
+ */
+ public static function get_column_label( GF_Field_List $field, $column_id, $backup_label = '' ) {
+
+ // Doesn't have columns enabled
+ if( ! isset( $field->choices ) || ! $field->enableColumns ) {
+ return $backup_label;
+ }
+
+ // Get the list of columns, with numeric index keys
+ $columns = wp_list_pluck( $field->choices, 'text' );
+
+ return isset( $columns[ $column_id ] ) ? $columns[ $column_id ] : $backup_label;
+ }
+
+}
+
+new GravityView_Field_List;
\ No newline at end of file
diff --git a/includes/fields/time.php b/includes/fields/time.php
index 714d73e151..95daefaf58 100644
--- a/includes/fields/time.php
+++ b/includes/fields/time.php
@@ -7,21 +7,289 @@ class GravityView_Field_Time extends GravityView_Field {
var $name = 'time';
+ /**
+ * @var string The part of the Gravity Forms query that's modified to enable sorting by time. `value` gets replaced.
+ * @since 1.14
+ */
+ const GF_SORTING_SQL = 'SELECT 0 as query, lead_id as id, value';
+
+ /**
+ * @var string Used to implode and explode the custom sort key for query modification.
+ * @since 1.14
+ */
+ private $_sort_divider = '|:time:|';
+
+ /**
+ * @var string Used to store the time format for the field ("12" or "24") so it can be used in the query filter
+ * @since 1.14
+ */
+ private $_time_format = null;
+
+ /**
+ * @var string Used to store the date format for the field, based on the input being displayed, so it can be used in the query filter
+ * @since 1.14
+ */
+ private $_date_format = null;
+
+
+ /**
+ * GravityView_Field_Time constructor.
+ */
+ public function __construct() {
+ parent::__construct();
+
+ add_filter( 'gravityview/sorting/time', array( $this, 'modify_sort_id' ), 10, 2 );
+
+ add_filter('gravityview_search_criteria', array( $this, '_maybe_filter_gravity_forms_query' ), 10, 4 );
+ }
+
+ /**
+ * Modify the sort key for the time field so it can be parsed by the query filter
+ *
+ * @see _modify_query_sort_by_time_hack
+ *
+ * @since 1.14
+ * @param string $sort_field_id Existing sort field ID (like "5")
+ * @param int $form_id Gravity Forms Form ID being sorted
+ *
+ * @return string Modified sort key imploded with $_sort_divider, like `5|:time:|12|:time:|h:i A`
+ */
+ public function modify_sort_id( $sort_field_id, $form_id ) {
+
+ $time_format = self::_get_time_format_for_field( $sort_field_id, $form_id );
+
+ $date_format = self::date_format( $time_format, $sort_field_id );
+
+ // Should look something like `5|:time:|12|:time:|h:i A`
+ $new_sort_field_id = implode( $this->_sort_divider, array( $sort_field_id, $time_format, $date_format ) );
+
+ return $new_sort_field_id;
+ }
+
+ /**
+ * If the sorting key matches the key set in modify_sort_id(), then modify the Gravity Forms query SQL
+ *
+ * @since 1.14
+ * @see modify_sort_id()
+ *
+ * @param array $criteria Search criteria used by GravityView
+ * @param array $form_ids Forms to search
+ * @param int $view_id ID of the view being used to search
+ *
+ * @return $criteria If a match, the sorting will be updated to set `is_numeric` to true and make sure the field ID is an int
+ */
+ public function _maybe_filter_gravity_forms_query( $criteria, $form_ids, $view_id ) {
+
+ // If the search is being sorted
+ if( ! empty( $criteria['sorting']['key'] ) ) {
+
+ $pieces = explode( $this->_sort_divider, $criteria['sorting']['key'] );
+
+ /**
+ * And the sort key matches the key set in modify_sort_id(), then modify the Gravity Forms query SQL
+ * @see modify_sort_id()
+ */
+ if( ! empty( $pieces[1] ) ) {
+
+ // Pass these to the _modify_query_sort_by_time_hack() method
+ $this->_time_format = $pieces[1];
+ $this->_date_format = $pieces[2];
+
+ // Remove fake input IDs (5.1 doesn't exist. Use 5)
+ $criteria['sorting']['key'] = floor( $pieces[0] );
+
+ /**
+ * Make sure sorting is numeric (# of seconds). IMPORTANT.
+ * @see GVCommon::is_field_numeric() is_numeric should also be set here
+ */
+ $criteria['sorting']['is_numeric'] = true;
+
+ // Modify the Gravity Forms WP Query
+ add_filter('query', array( $this, '_modify_query_sort_by_time_hack' ) );
+ }
+ }
+
+ return $criteria;
+ }
+
+ /**
+ * Modify Gravity Forms query SQL to convert times to numbers
+ * Gravity Forms couldn't sort by time...until NOW
+ *
+ * @since 1.14
+ * @param string $query MySQL query
+ *
+ * @return string Modified query, if the query matches the expected Gravity Forms SQL string used for sorting time fields. Otherwise, original query.
+ */
+ function _modify_query_sort_by_time_hack( $query ) {
+
+ /**
+ * If this is a Gravity Forms entry selection sorting query, generated by sort_by_field_query(),
+ * then we want to modify the query.
+ * @see GFFormsModel::sort_by_field_query()
+ */
+ if( strpos( $query, self::GF_SORTING_SQL ) > 0 ) {
+
+ if( $this->_time_format === '24' ) {
+ $sql_str_to_date = "STR_TO_DATE( `value`, '%H:%i' )";
+ } else {
+ $sql_str_to_date = "STR_TO_DATE( `value`, '%h:%i %p' )";
+ }
+
+ switch ( $this->_date_format ) {
+ case 'h':
+ case 'H':
+ $modification = "TIME_FORMAT( {$sql_str_to_date}, '%H' )";
+ break;
+ case 'i':
+ $modification = "TIME_FORMAT( {$sql_str_to_date}, '%i' )";
+ break;
+ case 'H:i':
+ case 'h:i A':
+ default:
+ $modification = "TIME_TO_SEC( {$sql_str_to_date} )";
+ }
+
+ /**
+ * Convert the time (12:30 pm) to the MySQL `TIME_TO_SEC()` value for that time (45000)
+ * This way, Gravity Forms is able to sort numerically.
+ */
+ $replacement_query = str_replace( 'value', "{$modification} as value", self::GF_SORTING_SQL );
+
+ /**
+ * Replace it in the main query
+ */
+ $query = str_replace( self::GF_SORTING_SQL, $replacement_query, $query );
+
+ /**
+ * REMOVE the Gravity Forms WP Query modifications!
+ */
+ remove_filter( 'query', array( $this, '_modify_query_sort_by_time_hack' ) );
+ }
+
+ return $query;
+ }
+
+
function field_options( $field_options, $template_id = '', $field_id = '', $context = '', $input_type = '' ) {
+ // Set variables
+ parent::field_options( $field_options, $template_id, $field_id, $context, $input_type );
+
if( 'edit' === $context ) {
return $field_options;
}
- add_filter('gravityview_date_format', array( $this, 'date_format' ) );
+ /**
+ * Set default date format based on field ID and Form ID
+ */
+ add_filter('gravityview_date_format', array( $this, '_filter_date_display_date_format' ) );
+
$this->add_field_support('date_display', $field_options );
- remove_filter('gravityview_date_format', array( $this, 'date_format' ) );
+
+ remove_filter('gravityview_date_format', array( $this, '_filter_date_display_date_format' ) );
return $field_options;
}
- function date_format() {
- return 'h:iA';
+ /**
+ * Return the field's time format by fetching the form ID and checking the field settings
+ *
+ * @since 1.14
+ *
+ * @return string Either "12" or "24". "12" is default.
+ */
+ private function _get_time_format() {
+ global $post;
+
+ $current_form = isset( $_POST['form_id'] ) ? intval( $_POST['form_id'] ) : gravityview_get_form_id( $post->ID );
+
+ return self::_get_time_format_for_field( $this->_field_id, $current_form );
+ }
+
+ /**
+ * Return the field's time format by fetching the form ID and checking the field settings
+ *
+ * @since 1.14
+ *
+ * @param string $field_id ID for Gravity Forms time field
+ * @param int $form_id ID for Gravity Forms form
+ * @return string Either "12" or "24". "12" is default.
+ */
+ static public function _get_time_format_for_field( $field_id, $form_id = 0 ) {
+
+ // GF defaults to 12, so should we.
+ $time_format = '12';
+
+ if( $form_id ) {
+ $form = GFAPI::get_form( $form_id );
+
+ if ( $form ) {
+ $field = GFFormsModel::get_field( $form, floor( $field_id ) );
+ if ( $field && $field instanceof GF_Field_Time ) {
+ $field->sanitize_settings(); // Make sure time is set
+ $time_format = $field->timeFormat;
+ }
+ }
+ }
+
+ return $time_format;
+ }
+
+ /**
+ * Modify the default PHP date formats used by the time field based on the field IDs and the field settings
+ *
+ * @since 1.14
+ *
+ * @return string PHP date() format text to to display the correctly formatted time value for the newly created field
+ */
+ public function _filter_date_display_date_format() {
+
+ $time_format = $this->_get_time_format();
+ $field_id = $this->_field_id;
+
+ return self::date_format( $time_format, $field_id );
+ }
+
+ /**
+ * Get the default date format for a field based on the field ID and the time format setting
+ *
+ * @since 1.14
+
+ * @param string $time_format The time format ("12" or "24"). Default: "12" {@since 1.14}
+ * @param int $field_id The ID of the field. Used to figure out full time/hours/minutes/am/pm {@since 1.14}
+ *
+ * @return string PHP date format for the time
+ */
+ static public function date_format( $time_format = '12', $field_id = 0 ) {
+
+ $field_id_array = explode( '.', $field_id );
+
+ $field_input_id = isset( $field_id_array[1] ) ? intval( $field_id_array[1] ) : 0;
+
+ $default = 'h:i A';
+
+ // This doesn't take into account 24-hour
+ switch( $field_input_id ) {
+ // Hours
+ case 1:
+ return ( $time_format === '12' ) ? 'h' : 'H';
+ break;
+ // Minutes
+ case 2:
+ return 'i';
+ break;
+ // AM/PM
+ case 3:
+ return 'A';
+ break;
+ // Full time field
+ case 0:
+ return ( $time_format === '12' ) ? $default : 'H:i';
+ break;
+ }
+
+ return $default;
}
}
diff --git a/includes/lib/EDD_SL_Plugin_Updater.php b/includes/lib/EDD_SL_Plugin_Updater.php
index db4135178a..679b7c2df8 100755
--- a/includes/lib/EDD_SL_Plugin_Updater.php
+++ b/includes/lib/EDD_SL_Plugin_Updater.php
@@ -3,17 +3,21 @@
// uncomment this line for testing
//set_site_transient( 'update_plugins', null );
+// Exit if accessed directly
+if ( ! defined( 'ABSPATH' ) ) exit;
+
/**
* Allows plugins to use their own update API.
*
* @author Pippin Williamson
- * @version 1.6
+ * @version 1.7
*/
class EDD_SL_Plugin_Updater {
private $api_url = '';
private $api_data = array();
private $name = '';
private $slug = '';
+ private $version = '';
/**
* Class constructor.
@@ -24,7 +28,6 @@ class EDD_SL_Plugin_Updater {
* @param string $_api_url The URL pointing to the custom API endpoint.
* @param string $_plugin_file Path to the plugin file.
* @param array $_api_data Optional data to send with API calls.
- * @return void
*/
function __construct( $_api_url, $_plugin_file, $_api_data = null ) {
$this->api_url = trailingslashit( $_api_url );
@@ -36,6 +39,7 @@ function __construct( $_api_url, $_plugin_file, $_api_data = null ) {
// Set up hooks.
$this->init();
add_action( 'admin_init', array( $this, 'show_changelog' ) );
+
}
/**
@@ -46,10 +50,10 @@ function __construct( $_api_url, $_plugin_file, $_api_data = null ) {
* @return void
*/
public function init() {
-
add_filter( 'pre_set_site_transient_update_plugins', array( $this, 'check_update' ) );
add_filter( 'plugins_api', array( $this, 'plugins_api_filter' ), 10, 3 );
+ remove_action( 'after_plugin_row_' . $this->name, 'wp_plugin_update_row', 10, 2 );
add_action( 'after_plugin_row_' . $this->name, array( $this, 'show_update_notification' ), 10, 2 );
}
@@ -84,8 +88,6 @@ function check_update( $_transient_data ) {
if ( false !== $version_info && is_object( $version_info ) && isset( $version_info->new_version ) ) {
- $this->did_check = true;
-
if( version_compare( $this->version, $version_info->new_version, '<' ) ) {
$_transient_data->response[ $this->name ] = $version_info;
@@ -127,9 +129,7 @@ public function show_update_notification( $file, $plugin ) {
$update_cache = get_site_transient( 'update_plugins' );
- $update_cache = is_object( $update_cache ) ? $update_cache : new stdClass();
-
- if ( empty( $update_cache->response ) || empty( $update_cache->response[ $this->name ] ) ) {
+ if ( ! is_object( $update_cache ) || empty( $update_cache->response ) || empty( $update_cache->response[ $this->name ] ) ) {
$cache_key = md5( 'edd_plugin_' .sanitize_key( $this->name ) . '_version_info' );
$version_info = get_transient( $cache_key );
@@ -146,7 +146,6 @@ public function show_update_notification( $file, $plugin ) {
return;
}
-
if( version_compare( $this->version, $version_info->new_version, '<' ) ) {
$update_cache->response[ $this->name ] = $version_info;
@@ -226,7 +225,7 @@ function plugins_api_filter( $_data, $_action = '', $_args = null ) {
'slug' => $this->slug,
'is_ssl' => is_ssl(),
'fields' => array(
- 'banners' => false, // These will be supported soon hopefully
+ 'banners' => true,
'reviews' => false
)
);
@@ -265,7 +264,7 @@ function http_request_args( $args, $url ) {
*
* @param string $_action The requested action.
* @param array $_data Parameters for the API action.
- * @return false||object
+ * @return false|object
*/
private function api_request( $_action, $_data ) {
@@ -273,11 +272,13 @@ private function api_request( $_action, $_data ) {
$data = array_merge( $this->api_data, $_data );
- if ( $data['slug'] != $this->slug )
+ if ( $data['slug'] != $this->slug ) {
return;
+ }
- if ( empty( $data['license'] ) )
+ if ( empty( $data['license'] ) ) {
return;
+ }
if( $this->api_url == home_url() ) {
return false; // Don't allow a plugin to ping itself
@@ -299,8 +300,14 @@ private function api_request( $_action, $_data ) {
$request = json_decode( wp_remote_retrieve_body( $request ) );
}
- if ( $request && isset( $request->sections ) ) {
- $request->sections = maybe_unserialize( $request->sections );
+ if ( $request ) {
+ if( isset( $request->sections ) ) {
+ $request->sections = maybe_unserialize( $request->sections );
+ }
+
+ if( isset( $request->banners ) ) {
+ $request->banners = (array)maybe_unserialize( $request->banners );
+ }
} else {
$request = false;
}
diff --git a/includes/widgets/search-widget/assets/js/admin-search-widget.min.js b/includes/widgets/search-widget/assets/js/admin-search-widget.min.js
index b95a7f6163..3eb39fcfb2 100644
--- a/includes/widgets/search-widget/assets/js/admin-search-widget.min.js
+++ b/includes/widgets/search-widget/assets/js/admin-search-widget.min.js
@@ -1 +1 @@
-!function($){var gvSearchWidget={wrapClass:null,widgetTarget:null,selectFields:null,wp_widget_id:"gravityview_search",init:function(wrapClass){gvSearchWidget.wrapClass=wrapClass;var wp_widget_id=gvSearchWidget.wp_widget_id;$("body").on("dialogopen",'[data-fieldid="search_bar"] .'+wrapClass,gvSearchWidget.openDialog).bind("click.widgets-toggle",gvSearchWidget.openWidget).on("click","."+wrapClass+" a[href='#addSearchField']",gvSearchWidget.addField).on("click","."+wrapClass+" a[href='#removeSearchField']",gvSearchWidget.removeField).on("change","."+wrapClass+" select.gv-search-fields",gvSearchWidget.updateRow).on("sortcreate sortupdate sort","."+wrapClass+" table",gvSearchWidget.zebraStripe).on("dialogbeforeclose",'[data-fieldid="search_bar"] .'+wrapClass,gvSearchWidget.updateOnClose).on("click",".widget[id*='"+wp_widget_id+"'] input.widget-control-save",gvSearchWidget.saveWidget).on("change","#gravityview_form_id, #gravityview_directory_template",gvSearchWidget.clearViewSearchData).on("change","#gravityview_view_id",gvSearchWidget.clearWidgetSearchData),$(document).on("widget-added widget-updated",gvSearchWidget.refreshWidget)},resetWidgetTarget:function(obj){gvSearchWidget.widgetTarget=obj.closest("div.widget").find("div."+gvSearchWidget.wrapClass),gvSearchWidget.selectFields=null},resetWidgetData:function(obj){gvSearchWidget.resetWidgetTarget(obj),$("table",gvSearchWidget.widgetTarget).remove()},openWidget:function(e){var widget,widgetId,target=$(e.target);target.parents(".widget-top").length&&!target.parents("#available-widgets").length&&(e.preventDefault(),widget=$(e.target).closest("div.widget"),widgetId=widget.attr("id"),!widget.hasClass("open")&&widgetId.indexOf(gvSearchWidget.wp_widget_id)>0&&(gvSearchWidget.resetWidgetData(target),gvSearchWidget.renderUI(widget)))},refreshWidget:function(e,widget){$(widget).hasClass("open")&&(gvSearchWidget.widgetTarget=$(widget).find("div."+gvSearchWidget.wrapClass),gvSearchWidget.renderUI(widget))},openDialog:function(e){e.preventDefault(),gvSearchWidget.widgetTarget=$(this),gvSearchWidget.renderUI($(this).parents(".gv-fields"))},addField:function(e){e.preventDefault(),"gv-widget-search-fields"===gvSearchWidget.wrapClass&&gvSearchWidget.resetWidgetTarget($(this));var table=$(this).parents("table"),row=$(this).parents("tr");return row.hasClass("no-search-fields")&&(row.remove(),row=null),gvSearchWidget.addRow(table,row,null),!1},removeField:function(e){e.preventDefault();var table=$(this).parents("table");return $(this).parents("tr").fadeTo("normal",.4,function(){$(this).remove(),$("tr.gv-search-field-row",table).length<1&&$("tr.no-search-fields",table).length<1&&gvSearchWidget.addEmptyMsg(table),gvSearchWidget.updateAvailableFields(),gvSearchWidget.styleRow(table)}),!1},renderUI:function(parent){var fields=$(".gv-search-fields-value",parent).val(),viewId=$("#gravityview_view_id",parent).val();if(""!==viewId)return null===gvSearchWidget.selectFields?(gvSearchWidget.widgetTarget.append(' '+gvGlobals.loading_text+"
"),void gvSearchWidget.getSelectFields(parent)):void($("table",gvSearchWidget.widgetTarget).length&&$("#gv-loading").length<1||(table=gvSearchWidget.addTable(),fields&&0===fields.length?gvSearchWidget.addRow(table,null,null):gvSearchWidget.populateRows(table,fields),gvSearchWidget.widgetTarget.append(table),gvSearchWidget.widgetTarget.find("table tbody").sortable({start:function(event,ui){$(ui.item).removeClass("alt")}}),gvSearchWidget.updateAvailableFields(),$("#gv-loading").remove()))},zebraStripe:function(){$(gvSearchWidget.widgetTarget).find("tr.gv-search-field-row").removeClass("alt").filter(":even").addClass("alt")},populateRows:function(table,fields){var rows=$.parseJSON(fields),pos=null;return rows&&0!==rows.length?void $.each(rows,function(i,values){gvSearchWidget.addRow(table,pos,values),pos=table.find("tbody tr:last")}):void gvSearchWidget.addEmptyMsg(table)},addTable:function(){return $('')},addEmptyMsg:function(table){$(table).append(''+gvSearchVar.label_nofields+' '+gvSearchVar.label_addfield+" ")},addRow:function(table,row,curr){var rowString=$(' ').append(' ').append(''+gvSearchWidget.getSelectFields()+" ").append(' ').append(' ');null!==row&&row.length?$(row,table).after(rowString):$("tbody",table).append(rowString),table.find("tr.new-row").each(function(){$(this).removeClass("new-row"),null!==curr&&$(this).find("select.gv-search-fields").val(curr.field),gvSearchWidget.updateSelectInput($(this)),null!==curr&&$(this).find("select.gv-search-inputs").val(curr.input),$(this).fadeIn(function(){$(this).removeClass("hide-if-js")})}),gvSearchWidget.styleRow(table)},styleRow:function(){var sort_icon=$(".cell-sort .icon",gvSearchWidget.widgetTarget);1===$("tbody tr",gvSearchWidget.widgetTarget).length?sort_icon.fadeOut("fast",function(){$(this).parents("td").addClass("no-sort")}):sort_icon.fadeIn("fast",function(){$(this).parents("td").removeClass("no-sort")}),gvSearchWidget.zebraStripe()},updateRow:function(){var row=$(this).parents("tr");gvSearchWidget.updateSelectInput(row),gvSearchWidget.updateAvailableFields()},updateAvailableFields:function(){$("option",gvSearchWidget.selectFields).attr("disabled",null),$("tr.gv-search-field-row .gv-search-fields",gvSearchWidget.widgetTarget).each(function(){gvSearchWidget.selectFields.find('option[value="'+$(this).val()+'"]').attr("disabled",!0)}).each(function(){var select=gvSearchWidget.selectFields.clone();select.val($(this).val()),select.find("option:selected").attr("disabled",null),$(this).replaceWith(select)})},updateSelectInput:function(tr){var type=tr.find("select.gv-search-fields option:selected").attr("data-inputtypes"),select=tr.find("select.gv-search-inputs"),options=gvSearchWidget.getSelectInput(type);select.html(options),select.prop("disabled",function(){return 1===$("option",$(this)).length})},getSelectFields:function(parent){if(null!==gvSearchWidget.selectFields)return gvSearchWidget.updateAvailableFields(),gvSearchWidget.selectFields.prop("outerHTML");var fields=gvSearchWidget.widgetTarget.data("gvSelectFields");if(void 0!==fields)return gvSearchWidget.selectFields=$(fields),gvSearchWidget.updateAvailableFields(),$("table",gvSearchWidget.widgetTarget).length?gvSearchWidget.selectFields.prop("outerHTML"):void gvSearchWidget.renderUI(parent);var ajaxdata={action:"gv_searchable_fields",nonce:gvSearchVar.nonce,formid:$("#gravityview_form_id").val(),view_id:$("#gravityview_view_id",parent).val(),template_id:$("#gravityview_directory_template").val()};$.ajax({url:ajaxurl,type:"POST",async:!0,dataType:"html",data:ajaxdata,success:function(response){"0"!==response&&(gvSearchWidget.selectFields=$(response),gvSearchWidget.widgetTarget.data("gvSelectFields",response),gvSearchWidget.renderUI(parent))}})},getSelectInput:function(type){var labels=$.parseJSON(gvSearchVar.input_labels),types=$.parseJSON(gvSearchVar.input_types),options=[],inputs=gvSearchWidget.getValue(types,type);return null===inputs?"":($.each(inputs,function(k,input){var label=gvSearchWidget.getValue(labels,input);options.push(''+label+" ")}),options.join())},getValue:function(obj,key){var value=null;return $.each(obj,function(k,val){return key===k?(value=val,!1):void 0}),value},saveWidget:function(){gvSearchWidget.resetWidgetTarget($(this)),gvSearchWidget.updateOnClose()},updateOnClose:function(){var configs=[];gvSearchWidget.widgetTarget.find("table tr.gv-search-field-row").each(function(){var row={};row.field=$(this).find("select.gv-search-fields").val(),row.input=$(this).find("select.gv-search-inputs").val(),configs.push(row)}),$(".gv-search-fields-value",gvSearchWidget.widgetTarget).val(JSON.stringify(configs))},clearViewSearchData:function(){gvSearchWidget.selectFields=null,$(".gv-search-fields-value").each(function(){$(this).parents("."+gvSearchWidget.wrapClass).find("table").remove(),$(this).val("")})},clearWidgetSearchData:function(){gvSearchWidget.resetWidgetData($(this)),gvSearchWidget.widgetTarget.removeData("gvSelectFields"),$(".gv-search-fields-value",gvSearchWidget.widgetTarget).val("");var widget=gvSearchWidget.widgetTarget.closest("div.widget");$(".hide-on-view-change:visible",widget).slideUp("fast"),""!==$(this).val()&&gvSearchWidget.renderUI(widget)}};$(document).ready(function(){var contextClass=$("body").hasClass("widgets-php")?"gv-widget-search-fields":"gv-dialog-options";gvSearchWidget.init(contextClass)})}(jQuery);
\ No newline at end of file
+!function($){var gvSearchWidget={wrapClass:null,widgetTarget:$(".gv-dialog-options"),selectFields:null,wp_widget_id:"gravityview_search",init:function(wrapClass){gvSearchWidget.wrapClass=wrapClass;var wp_widget_id=gvSearchWidget.wp_widget_id;$("body").on("dialogopen",'[data-fieldid="search_bar"] .'+wrapClass,gvSearchWidget.openDialog).bind("click.widgets-toggle",gvSearchWidget.openWidget).on("click","."+wrapClass+" a[href='#addSearchField']",gvSearchWidget.addField).on("click","."+wrapClass+" a[href='#removeSearchField']",gvSearchWidget.removeField).on("change","."+wrapClass+" select.gv-search-fields",gvSearchWidget.updateRow).on("change","."+wrapClass+" select.gv-search-inputs",gvSearchWidget.toggleSearchMode).on("sortcreate sortupdate sort","."+wrapClass+" table",gvSearchWidget.zebraStripe).on("dialogbeforeclose",'[data-fieldid="search_bar"] .'+wrapClass,gvSearchWidget.updateOnClose).on("click",".widget[id*='"+wp_widget_id+"'] input.widget-control-save",gvSearchWidget.saveWidget).on("change","#gravityview_form_id, #gravityview_directory_template",gvSearchWidget.clearViewSearchData).on("change","#gravityview_view_id",gvSearchWidget.clearWidgetSearchData),$(document).on("widget-added widget-updated",gvSearchWidget.refreshWidget).on("submit","form#post",gvSearchWidget.updateOnClose)},resetWidgetTarget:function(obj){gvSearchWidget.widgetTarget=obj.closest("div.widget").find("div."+gvSearchWidget.wrapClass),gvSearchWidget.selectFields=null},resetWidgetData:function(obj){gvSearchWidget.resetWidgetTarget(obj),$("table",gvSearchWidget.widgetTarget).remove()},openWidget:function(e){var widget,widgetId,target=$(e.target);target.parents(".widget-top").length&&!target.parents("#available-widgets").length&&(e.preventDefault(),widget=$(e.target).closest("div.widget"),widgetId=widget.attr("id"),!widget.hasClass("open")&&widgetId.indexOf(gvSearchWidget.wp_widget_id)>0&&(gvSearchWidget.resetWidgetData(target),gvSearchWidget.renderUI(widget)))},refreshWidget:function(e,widget){$(widget).hasClass("open")&&(gvSearchWidget.widgetTarget=$(widget).find("div."+gvSearchWidget.wrapClass),gvSearchWidget.renderUI(widget))},openDialog:function(e){e.preventDefault(),gvSearchWidget.widgetTarget=$(this),gvSearchWidget.renderUI($(this).parents(".gv-fields"))},addField:function(e){e.preventDefault(),"gv-widget-search-fields"===gvSearchWidget.wrapClass&&gvSearchWidget.resetWidgetTarget($(this));var table=$(this).parents("table"),row=$(this).parents("tr");return row.hasClass("no-search-fields")&&(row.remove(),row=null),gvSearchWidget.addRow(table,row,null),!1},removeField:function(e){e.preventDefault();var table=$(this).parents("table");return $(this).parents("tr").fadeTo("normal",.4,function(){$(this).remove();var table_row_count=$("tr.gv-search-field-row",table).length;1>table_row_count&&$("tr.no-search-fields",table).length<1&&gvSearchWidget.addEmptyMsg(table),gvSearchWidget.updateAvailableFields(),gvSearchWidget.styleRow(table)}),!1},renderUI:function(parent){var fields=$(".gv-search-fields-value",parent).val(),viewId=$("#gravityview_view_id",parent).val();if(""!==viewId){if(null===gvSearchWidget.selectFields)return gvSearchWidget.widgetTarget.append(' '+gvGlobals.loading_text+"
"),void gvSearchWidget.getSelectFields(parent);$gvloading=$("#gv-loading"),$("table",gvSearchWidget.widgetTarget).length&&$gvloading.length<1||(table=gvSearchWidget.addTable(),fields&&0===fields.length?gvSearchWidget.addRow(table,null,null):gvSearchWidget.populateRows(table,fields),gvSearchWidget.widgetTarget.is(".gv-widget-search-fields")?gvSearchWidget.widgetTarget.append(table):gvSearchWidget.widgetTarget.find(".gv-setting-container-search_fields").after(table),gvSearchWidget.toggleSearchMode(),gvSearchWidget.widgetTarget.find("table tbody").sortable({start:function(event,ui){$(ui.item).removeClass("alt")}}),gvSearchWidget.updateAvailableFields(),$gvloading.remove())}},zebraStripe:function(){$(gvSearchWidget.widgetTarget).find("tr.gv-search-field-row").removeClass("alt").filter(":even").addClass("alt")},populateRows:function(table,fields){var rows=$.parseJSON(fields),pos=null;return rows&&0!==rows.length?void $.each(rows,function(i,values){gvSearchWidget.addRow(table,pos,values),pos=table.find("tbody tr:last")}):void gvSearchWidget.addEmptyMsg(table)},addTable:function(){return $('')},addEmptyMsg:function(table){$(table).append(''+gvSearchVar.label_nofields+' '+gvSearchVar.label_addfield+" ")},addRow:function(table,row,curr){var rowString=$(' ').append(' ').append(''+gvSearchWidget.getSelectFields()+" ").append(' ').append(' ').append(' ');null!==row&&row.length?$(row,table).after(rowString):$("tbody",table).append(rowString),table.find("tr.new-row").each(function(){$(this).removeClass("new-row"),null!==curr&&$(this).find("select.gv-search-fields").val(curr.field),null!==curr&&$(this).find(".cell-input-label input").val(curr.label),gvSearchWidget.updateSelectInput($(this)),gvSearchWidget.updatePlaceholder($(this)),null!==curr&&$(this).find("select.gv-search-inputs").val(curr.input),$(this).fadeIn(function(){$(this).removeClass("hide-if-js")})}),gvSearchWidget.styleRow(table)},updatePlaceholder:function($row){var $label_input=$row.find(".cell-input-label input"),$placeholder_option=$row.find("select.gv-search-fields option").filter(":selected"),placeholder_text=$placeholder_option.attr("data-placeholder")?$placeholder_option.attr("data-placeholder"):$placeholder_option.text();$label_input.attr("placeholder",placeholder_text)},toggleSearchMode:function(){var table_row_count=$("tbody tr",gvSearchWidget.widgetTarget).length,$search_mode=$('input[name*="search_mode"]',gvSearchWidget.widgetTarget),$search_mode_container=$search_mode.parents(".gv-setting-container"),has_date_range=$('option:selected[value="date_range"]',gvSearchWidget.widgetTarget).length>0;has_date_range?($search_mode.filter(":checked").not(":disabled").attr("data-original-value",function(){return $(this).attr("value")}),$search_mode.val(["all"]),$search_mode_container.find(":input").attr("disabled","disabled")):($search_mode_container.find(":input").attr("disabled",null),$search_mode.filter("[data-original-value]").val(function(){return $(this).attr("checked","checked"),[$(this).attr("value")]})),table_row_count>1?$search_mode_container.show():$search_mode_container.fadeOut("fast")},styleRow:function(table){table_row_count=$("tbody tr",table).length;var sort_icon=$(".cell-sort .icon",table);gvSearchWidget.toggleSearchMode(),table_row_count<=1?sort_icon.fadeOut("fast",function(){$(this).parents("td").addClass("no-sort")}):sort_icon.fadeIn("fast",function(){$(this).parents("td").removeClass("no-sort")}),gvSearchWidget.zebraStripe()},updateRow:function(e){var $row=$(this).parents("tr");gvSearchWidget.updateSelectInput($row),gvSearchWidget.updateAvailableFields(),gvSearchWidget.updatePlaceholder($row)},updateAvailableFields:function(){$("option",gvSearchWidget.selectFields).attr("disabled",null),$("tr.gv-search-field-row .gv-search-fields",gvSearchWidget.widgetTarget).each(function(){gvSearchWidget.selectFields.find('option[value="'+$(this).val()+'"]').attr("disabled",!0)}).each(function(){var select=gvSearchWidget.selectFields.clone();select.val($(this).val()),select.find("option:selected").attr("disabled",null),$(this).replaceWith(select)})},updateSelectInput:function(tr){var type=tr.find("select.gv-search-fields option:selected").attr("data-inputtypes"),select=tr.find("select.gv-search-inputs"),options=gvSearchWidget.getSelectInput(type);select.html(options),select.prop("disabled",function(){return 1===$("option",$(this)).length})},getSelectFields:function(parent){if(null!==gvSearchWidget.selectFields)return gvSearchWidget.updateAvailableFields(),gvSearchWidget.selectFields.prop("outerHTML");var fields=gvSearchWidget.widgetTarget.data("gvSelectFields");if(void 0!==fields)return gvSearchWidget.selectFields=$(fields),gvSearchWidget.updateAvailableFields(),$("table",gvSearchWidget.widgetTarget).length?gvSearchWidget.selectFields.prop("outerHTML"):void gvSearchWidget.renderUI(parent);var ajaxdata={action:"gv_searchable_fields",nonce:gvSearchVar.nonce,formid:$("#gravityview_form_id").val(),view_id:$("#gravityview_view_id",parent).val(),template_id:$("#gravityview_directory_template").val()};$.ajax({url:ajaxurl,type:"POST",async:!0,dataType:"html",data:ajaxdata,success:function(response){"0"!==response&&(gvSearchWidget.selectFields=$(response),gvSearchWidget.widgetTarget.data("gvSelectFields",response),gvSearchWidget.renderUI(parent))}})},getSelectInput:function(type){var labels=$.parseJSON(gvSearchVar.input_labels),types=$.parseJSON(gvSearchVar.input_types),options=[],inputs=gvSearchWidget.getValue(types,type);return null===inputs?"":($.each(inputs,function(k,input){var label=gvSearchWidget.getValue(labels,input);options.push(''+label+" ")}),options.join())},getValue:function(obj,key){var value=null;return $.each(obj,function(k,val){return key===k?(value=val,!1):void 0}),value},saveWidget:function(){gvSearchWidget.resetWidgetTarget($(this)),gvSearchWidget.updateOnClose()},updateOnClose:function(e){var configs=[];$('input[name*="search_mode"]',gvSearchWidget.widgetTarget).attr("disabled",null),gvSearchWidget.widgetTarget.find("table tr.gv-search-field-row").each(function(){var row={field:$(this).find("select.gv-search-fields").val(),input:$(this).find("select.gv-search-inputs").val(),label:$(this).find("input.gv-search-labels").val()};configs.push(row)}),$(".gv-search-fields-value",gvSearchWidget.widgetTarget).val(JSON.stringify(configs))},clearViewSearchData:function(){gvSearchWidget.selectFields=null,$(".gv-search-fields-value").each(function(){$(this).parents("."+gvSearchWidget.wrapClass).find("table").remove(),$(this).val("")})},clearWidgetSearchData:function(){gvSearchWidget.resetWidgetData($(this)),gvSearchWidget.widgetTarget.removeData("gvSelectFields"),$(".gv-search-fields-value",gvSearchWidget.widgetTarget).val("");var widget=gvSearchWidget.widgetTarget.closest("div.widget");$(".hide-on-view-change:visible",widget).slideUp("fast"),""!==$(this).val()&&gvSearchWidget.renderUI(widget)}};$(document).ready(function(){var contextClass=$("body").hasClass("widgets-php")?"gv-widget-search-fields":"gv-dialog-options";gvSearchWidget.init(contextClass)})}(jQuery);
\ No newline at end of file
diff --git a/includes/widgets/search-widget/assets/js/source/admin-search-widget.js b/includes/widgets/search-widget/assets/js/source/admin-search-widget.js
index a7f3b0a4de..c04f183cf8 100644
--- a/includes/widgets/search-widget/assets/js/source/admin-search-widget.js
+++ b/includes/widgets/search-widget/assets/js/source/admin-search-widget.js
@@ -19,7 +19,7 @@
wrapClass: null,
// holds the current widget settings DOM object
- widgetTarget: null,
+ widgetTarget: $('.gv-dialog-options'),
selectFields : null,
@@ -32,6 +32,7 @@
var wp_widget_id = gvSearchWidget.wp_widget_id;
$('body')
+
// [View] hook on all the open settings buttons for search_bar widget
.on( 'dialogopen', '[data-fieldid="search_bar"] .' + wrapClass, gvSearchWidget.openDialog )
@@ -46,6 +47,9 @@
// [View, WP widget] hook to update row input types
.on( 'change', "." + wrapClass +" select.gv-search-fields", gvSearchWidget.updateRow )
+ // Change Search Mode when date_range is selected
+ .on( 'change', "." + wrapClass +" select.gv-search-inputs", gvSearchWidget.toggleSearchMode )
+
// [View, WP widget] add alt class to table when sorting
.on('sortcreate sortupdate sort', '.'+ wrapClass +' table', gvSearchWidget.zebraStripe )
@@ -63,13 +67,16 @@
// Refresh widget searchable settings after saving or adding the widget
// Bind to document because WP triggers document, not body
- $(document).on( 'widget-added widget-updated', gvSearchWidget.refreshWidget );
+ $(document)
+ .on( 'widget-added widget-updated', gvSearchWidget.refreshWidget )
+ // [View] If submitting a View by hitting enter inside a Widget, make sure it saves
+ .on( 'submit', 'form#post', gvSearchWidget.updateOnClose );
},
/**
* [Specific for Search WP Widget]
* Calculate the widget target and reset the view fields and the DOM target to insert the settings table
- * @param object e event
+ * @param {jQuery} obj event
*/
resetWidgetTarget: function( obj ) {
gvSearchWidget.widgetTarget = obj.closest('div.widget').find( 'div.'+ gvSearchWidget.wrapClass );
@@ -81,7 +88,7 @@
/**
* [Specific for Search WP Widget]
* Reset Widget target and removes the settings table
- * @param object e event
+ * @param {jQuery} obj event
*/
resetWidgetData: function( obj ) {
gvSearchWidget.resetWidgetTarget( obj );
@@ -91,7 +98,7 @@
/**
* [Specific for Search WP Widget]
* Capture the widget slidedown and call to render the widget settings content
- * @param object e event
+ * @param {jQuery} e event
*/
openWidget: function( e ) {
var target = $(e.target),
@@ -112,7 +119,8 @@
/**
* [Specific for Search WP Widget]
* Refreshes the Widget table settings after saving
- * @param object e event
+ * @param {jQuery} e event
+ * @param {jQuery} widget jQuery widget DOM
*/
refreshWidget: function( e, widget ) {
@@ -127,7 +135,7 @@
/**
* [Specific for View Search Widget]
* Capture the widget dialog and call to render the widget settings content
- * @param object e event
+ * @param {jQuery} e event
*/
openDialog: function( e ) {
e.preventDefault();
@@ -140,7 +148,7 @@
/**
* Add a search field to the table
- * @param object e event
+ * @param {jQuery} e event
*/
addField: function(e) {
e.preventDefault();
@@ -166,7 +174,7 @@
/**
* Remove a search field to the table
- * @param object e event
+ * @param {jQuery} e event
*/
removeField: function(e) {
e.preventDefault();
@@ -177,8 +185,10 @@
$(this).remove();
+ var table_row_count = $('tr.gv-search-field-row', table ).length;
+
//check if is there any
- if( $('tr.gv-search-field-row', table ).length < 1 && $('tr.no-search-fields', table ).length < 1 ) {
+ if( table_row_count < 1 && $('tr.no-search-fields', table ).length < 1 ) {
gvSearchWidget.addEmptyMsg( table );
@@ -195,7 +205,7 @@
/**
* Render search fields table (includes a pre-loader animation)
- * @param {jQuery DOM object} parent The dialog div object
+ * @param {jQuery} parent The dialog div object
*/
renderUI: function( parent ) {
@@ -213,8 +223,10 @@
return;
}
+ $gvloading = $('#gv-loading');
+
// Is this dialog already rendered before & not loading fields again
- if( $('table', gvSearchWidget.widgetTarget ).length && $('#gv-loading').length < 1 ) {
+ if( $('table', gvSearchWidget.widgetTarget ).length && $gvloading.length < 1 ) {
return;
}
@@ -227,9 +239,16 @@
gvSearchWidget.populateRows( table, fields );
}
- gvSearchWidget.widgetTarget.append( table );
+ if( gvSearchWidget.widgetTarget.is('.gv-widget-search-fields') ) {
+ // WP Widget
+ gvSearchWidget.widgetTarget.append( table );
+ } else {
+ // GV widget
+ gvSearchWidget.widgetTarget.find('.gv-setting-container-search_fields').after( table );
+ }
+
+ gvSearchWidget.toggleSearchMode();
- //
gvSearchWidget.widgetTarget.find('table tbody').sortable({
start: function( event, ui ) {
$( ui.item ).removeClass( 'alt' );
@@ -238,12 +257,13 @@
gvSearchWidget.updateAvailableFields();
- $('#gv-loading').remove();
+ $gvloading.remove();
},
+
/**
* Add alt classes on table sort
- * @param {jQuery event|DOM object} e_or_object
+ * @param {jQuery} e_or_object
* @return {void}
*/
zebraStripe: function() {
@@ -274,7 +294,6 @@
gvSearchWidget.addRow( table, pos, values );
pos = table.find('tbody tr:last');
});
-
},
/**
@@ -286,6 +305,7 @@
'' +
' ' +
'' + gvSearchVar.label_searchfield +' ' +
+ '' + gvSearchVar.label_label +' ' +
'' + gvSearchVar.label_inputtype +' ' +
' ' +
' ' +
@@ -304,15 +324,16 @@
/**
* Add row to the table object
- * @param {jQuery DOM object} table The table DOM object
- * @param {jQuery DOM object} row Table row object after which the new row will be added
+ * @param {jQuery} table The table DOM object
+ * @param {jQuery} row Table row object after which the new row will be added
* @param {object} curr Configured values for the row ( field and input )
*/
addRow: function( table, row, curr ) {
var rowString = $(' ')
- .append(' ')
+ .append(' ')
.append(''+ gvSearchWidget.getSelectFields() +' ')
+ .append(' ')
.append(' ')
.append(' ');
@@ -331,9 +352,16 @@
$(this).find('select.gv-search-fields').val( curr.field );
}
+ // Set search label
+ if( curr !== null ) {
+ $(this).find('.cell-input-label input' ).val( curr.label );
+ }
+
// update the available input types
gvSearchWidget.updateSelectInput( $(this) );
+ gvSearchWidget.updatePlaceholder( $(this) );
+
// Set saved input type value
// !! Do not try to optimize this line. This needs to come after 'gvSearchWidget.updateSelectInput()'
if( curr !== null ) {
@@ -350,6 +378,54 @@
gvSearchWidget.styleRow( table );
},
+ /**
+ * Update the label text input placeholder value, so users know what the default label is
+ * @since 1.14
+ * @param $row
+ */
+ updatePlaceholder: function( $row ) {
+
+ var $label_input = $row.find('.cell-input-label input');
+ var $placeholder_option = $row.find('select.gv-search-fields option').filter(':selected' );
+ var placeholder_text = $placeholder_option.attr('data-placeholder') ? $placeholder_option.attr('data-placeholder') : $placeholder_option.text();
+
+ $label_input.attr( 'placeholder', placeholder_text );
+ },
+
+ /**
+ * Show or hide the Search Mode settings based on whether there's a single search field. If there's only one, then "all" and "any" are the same.
+ * @since 1.14
+ * @return {void}
+ */
+ toggleSearchMode: function() {
+
+ var table_row_count = $( 'tbody tr', gvSearchWidget.widgetTarget ).length,
+ $search_mode = $( 'input[name*="search_mode"]', gvSearchWidget.widgetTarget ),
+ $search_mode_container = $search_mode.parents('.gv-setting-container'),
+ has_date_range = ( $( 'option:selected[value="date_range"]', gvSearchWidget.widgetTarget ).length > 0 );
+
+ if( has_date_range ) {
+ $search_mode.filter(':checked').not(':disabled').attr( 'data-original-value', function() {
+ return $( this ).attr( 'value' );
+ });
+ $search_mode.val( ['all'] );
+ $search_mode_container.find(':input' ).attr('disabled', 'disabled');
+ } else {
+ $search_mode_container.find(':input' ).attr('disabled', null );
+ $search_mode.filter('[data-original-value]' ).val( function() {
+ $( this ).attr( 'checked', 'checked' );
+ return [ $( this ).attr('value') ];
+ });
+ }
+
+ if( table_row_count > 1 ) {
+ $search_mode_container.show();
+ } else {
+ $search_mode_container.fadeOut('fast');
+ }
+
+ },
+
/**
* Style the table rows - remove/add sorting icon, zebra stripe
* @param {object} table Table
@@ -357,9 +433,13 @@
*/
styleRow: function( table ) {
- var sort_icon = $( '.cell-sort .icon', gvSearchWidget.widgetTarget );
+ table_row_count = $( 'tbody tr', table ).length;
+
+ var sort_icon = $( '.cell-sort .icon', table );
- if( $( 'tbody tr', gvSearchWidget.widgetTarget ).length === 1 ) {
+ gvSearchWidget.toggleSearchMode();
+
+ if( table_row_count <= 1 ) {
sort_icon.fadeOut('fast', function() {
$(this).parents('td').addClass('no-sort');
});
@@ -378,9 +458,10 @@
* @return {[type]} [description]
*/
updateRow: function(e) {
- var row = $(this).parents('tr');
- gvSearchWidget.updateSelectInput( row );
+ var $row = $(this).parents('tr');
+ gvSearchWidget.updateSelectInput( $row );
gvSearchWidget.updateAvailableFields();
+ gvSearchWidget.updatePlaceholder( $row );
},
/**
@@ -547,18 +628,22 @@
/**
* Update widget config on dialog close
- * @param {object} event
- * @param {[type]} ui [description]
+ * @param {jQuery} e Event
*/
- updateOnClose: function() {
+ updateOnClose: function( e ) {
var configs = [];
+ // Reset
+ $( 'input[name*="search_mode"]', gvSearchWidget.widgetTarget ).attr( 'disabled', null );
+
//loop throught table rows
gvSearchWidget.widgetTarget.find('table tr.gv-search-field-row').each( function() {
- var row = {};
- row.field = $(this).find('select.gv-search-fields').val();
- row.input = $(this).find('select.gv-search-inputs').val();
+ var row = {
+ 'field': $( this ).find( 'select.gv-search-fields' ).val(),
+ 'input': $( this ).find( 'select.gv-search-inputs' ).val(),
+ 'label': $( this ).find( 'input.gv-search-labels' ).val()
+ };
configs.push( row );
});
diff --git a/includes/widgets/search-widget/class-search-widget.php b/includes/widgets/search-widget/class-search-widget.php
index 9d32c8f379..45d58e3e64 100644
--- a/includes/widgets/search-widget/class-search-widget.php
+++ b/includes/widgets/search-widget/class-search-widget.php
@@ -31,11 +31,6 @@ public function __construct() {
$default_values = array( 'header' => 0, 'footer' => 0 );
$settings = array(
- 'search_fields' => array(
- 'type' => 'hidden',
- 'label' => '',
- 'class' => 'gv-search-fields-value',
- ),
'search_layout' => array(
'type' => 'radio',
'full_width' => true,
@@ -51,6 +46,24 @@ public function __construct() {
'label' => __( 'Show Clear button', 'gravityview' ),
'value' => false,
),
+ 'search_fields' => array(
+ 'type' => 'hidden',
+ 'label' => '',
+ 'class' => 'gv-search-fields-value',
+ 'value' => '[{"field":"search_all","input":"input_text"}]', // Default: Search Everything text box
+ ),
+ 'search_mode' => array(
+ 'type' => 'radio',
+ 'full_width' => true,
+ 'label' => esc_html__( 'Search Mode', 'gravityview' ),
+ 'desc' => __('Should search results match all search fields, or any?'),
+ 'value' => 'any',
+ 'class' => 'hide-if-js',
+ 'options' => array(
+ 'any' => esc_html__( 'Match Any Fields', 'gravityview' ),
+ 'all' => esc_html__( 'Match All Fields', 'gravityview' ),
+ ),
+ ),
);
parent::__construct( esc_html__( 'Search Bar', 'gravityview' ), 'search_bar', $default_values, $settings );
@@ -136,6 +149,7 @@ public function add_scripts_and_styles( $hook ) {
'nonce' => wp_create_nonce( 'gravityview_ajaxsearchwidget' ),
'label_nofields' => esc_html__( 'No search fields configured yet.', 'gravityview' ),
'label_addfield' => esc_html__( 'Add Search Field', 'gravityview' ),
+ 'label_label' => esc_html__( 'Label', 'gravityview' ),
'label_searchfield' => esc_html__( 'Search Field', 'gravityview' ),
'label_inputtype' => esc_html__( 'Input Type', 'gravityview' ),
'input_labels' => json_encode( $input_labels ),
@@ -206,11 +220,28 @@ public static function render_searchable_fields( $form_id = null, $current = ''
$output = '';
- $output .= '' . esc_html__( 'Search Everything', 'gravityview' ) . ' ';
- $output .= '' . esc_html__( 'Entry Date', 'gravityview' ) . ' ';
- $output .= '' . esc_html__( 'Entry ID', 'gravityview' ) . ' ';
- $output .= '' . esc_html__( 'Entry Creator', 'gravityview' ) . ' ';
+ $custom_fields = array(
+ 'search_all' => array(
+ 'text' => esc_html__( 'Search Everything', 'gravityview' ),
+ 'type' => 'text',
+ ),
+ 'entry_date' => array(
+ 'text' => esc_html__( 'Entry Date', 'gravityview' ),
+ 'type' => 'date',
+ ),
+ 'entry_id' => array(
+ 'text' => esc_html__( 'Entry ID', 'gravityview' ),
+ 'type' => 'text',
+ ),
+ 'created_by' => array(
+ 'text' => esc_html__( 'Entry Creator', 'gravityview' ),
+ 'type' => 'select',
+ )
+ );
+ foreach( $custom_fields as $custom_field_key => $custom_field ) {
+ $output .= sprintf( '%s ', $custom_field_key, selected( $custom_field_key, $current, false ), $custom_field['type'], self::get_field_label( array('field' => $custom_field_key ) ), $custom_field['text'] );
+ }
if ( ! empty( $fields ) ) {
@@ -384,8 +415,8 @@ public function filter_entries( $search_criteria ) {
}
- // search mode is 'ANY' by default
- $mode = 'any';
+ // Get search mode passed in URL
+ $mode = in_array( rgget( 'mode' ), array( 'any', 'all' ) ) ? esc_attr( rgget( 'mode' ) ) : 'any';
// get the other search filters
foreach ( $_GET as $key => $value ) {
@@ -619,6 +650,7 @@ public function add_template_path( $file_paths ) {
* @return type
*/
public function render_frontend( $widget_args, $content = '', $context = '' ) {
+ /** @var GravityView_View $gravityview_view */
$gravityview_view = GravityView_View::getInstance();
if ( empty( $gravityview_view ) ) {
@@ -639,20 +671,26 @@ public function render_frontend( $widget_args, $content = '', $context = '' ) {
// prepare fields
foreach ( $search_fields as $k => $field ) {
+ $updated_field = $field;
+
+ if ( in_array( $field['input'], array( 'date', 'date_range' ) ) ) {
+ $has_date = true;
+ }
+
+ $updated_field = $this->get_search_filter_details( $updated_field );
+
switch ( $field['field'] ) {
case 'search_all':
- $search_fields[ $k ]['label'] = __( 'Search Entries:', 'gravityview' );
- $search_fields[ $k ]['key'] = 'search_all';
- $search_fields[ $k ]['input'] = 'search_all';
- $search_fields[ $k ]['value'] = esc_attr( stripslashes_deep( rgget( 'gv_search' ) ) );
+ $updated_field['key'] = 'search_all';
+ $updated_field['input'] = 'search_all';
+ $updated_field['value'] = esc_attr( stripslashes_deep( rgget( 'gv_search' ) ) );
break;
case 'entry_date':
- $search_fields[ $k ]['label'] = __( 'Filter by date:', 'gravityview' );
- $search_fields[ $k ]['key'] = 'entry_date';
- $search_fields[ $k ]['input'] = 'entry_date';
- $search_fields[ $k ]['value'] = array(
+ $updated_field['key'] = 'entry_date';
+ $updated_field['input'] = 'entry_date';
+ $updated_field['value'] = array(
'start' => esc_attr( stripslashes_deep( rgget( 'gv_start' ) ) ),
'end' => esc_attr( stripslashes_deep( rgget( 'gv_end' ) ) ),
);
@@ -660,38 +698,28 @@ public function render_frontend( $widget_args, $content = '', $context = '' ) {
break;
case 'entry_id':
- $search_fields[ $k ]['label'] = __( 'Entry ID:', 'gravityview' );
- $search_fields[ $k ]['key'] = 'entry_id';
- $search_fields[ $k ]['input'] = 'entry_id';
- $search_fields[ $k ]['value'] = esc_attr( stripslashes_deep( rgget( 'gv_id' ) ) );
+ $updated_field['key'] = 'entry_id';
+ $updated_field['input'] = 'entry_id';
+ $updated_field['value'] = esc_attr( stripslashes_deep( rgget( 'gv_id' ) ) );
break;
case 'created_by':
- $search_fields[ $k ]['label'] = __( 'Submitted by:', 'gravityview' );
- $search_fields[ $k ]['key'] = 'created_by';
- $search_fields[ $k ]['name'] = 'gv_by';
- $search_fields[ $k ]['input'] = $field['input'];
- $search_fields[ $k ]['value'] = esc_attr( stripslashes_deep( rgget( 'gv_by' ) ) );
- $search_fields[ $k ]['choices'] = self::get_created_by_choices();
+ $updated_field['key'] = 'created_by';
+ $updated_field['name'] = 'gv_by';
+ $updated_field['value'] = esc_attr( stripslashes_deep( rgget( 'gv_by' ) ) );
+ $updated_field['choices'] = self::get_created_by_choices();
break;
-
-
- default:
- if ( in_array( $field['input'], array( 'date', 'date_range' ) ) ) {
- $has_date = true;
- }
- $search_fields[ $k ] = $this->get_search_filter_details( $field );
- break;
-
}
+
+ $search_fields[ $k ] = $updated_field;
}
do_action( 'gravityview_log_debug', sprintf( '%s[render_frontend] Calculated Search Fields: ', get_class( $this ) ), $search_fields );
/**
- * Modify what fields are shown. The order of the fields in the $search_filters array controls the order as displayed in the search bar widget.
+ * @filter `gravityview_widget_search_filters` Modify what fields are shown. The order of the fields in the $search_filters array controls the order as displayed in the search bar widget.
* @param array $search_fields Array of search filters with `key`, `label`, `value`, `type` keys
- * @param $this Current widget object
+ * @param GravityView_Widget_Search $this Current widget object
* @param array $widget_args Args passed to this method. {@since 1.8}
* @var array
*/
@@ -699,6 +727,9 @@ public function render_frontend( $widget_args, $content = '', $context = '' ) {
$gravityview_view->search_layout = ! empty( $widget_args['search_layout'] ) ? $widget_args['search_layout'] : 'horizontal';
+ /** @since 1.14 */
+ $gravityview_view->search_mode = ! empty( $widget_args['search_mode'] ) ? $widget_args['search_mode'] : 'any';
+
$custom_class = ! empty( $widget_args['custom_class'] ) ? $widget_args['custom_class'] : '';
$gravityview_view->search_class = self::get_search_class( $custom_class );
@@ -761,47 +792,68 @@ public static function get_search_form_action() {
/**
* Get the label for a search form field
- * @param array $field Field setting as sent by the GV configuration - has `field` and `input` (input type) keys
+ * @param array $field Field setting as sent by the GV configuration - has `field`, `input` (input type), and `label` keys
* @param array $form_field Form field data, as fetched by `gravityview_get_field()`
* @return string Label for the search form
*/
- private function get_field_label( $field, $form_field ) {
+ private static function get_field_label( $field, $form_field = array() ) {
- $label = isset( $form_field['label'] ) ? $form_field['label'] : '';
+ $label = rgget( 'label', $field );
- // If this is a field input, not a field
- if ( strpos( $field['field'], '.' ) > 0 && ! empty( $form_field['inputs'] ) ) {
+ if( '' === $label ) {
- // Get the label for the field in question, which returns an array
- $items = wp_list_filter( $form_field['inputs'], array( 'id' => $field['field'] ) );
+ $label = isset( $form_field['label'] ) ? $form_field['label'] : '';
- // Get the item with the `label` key
- $values = wp_list_pluck( $items, 'label' );
+ switch( $field['field'] ) {
+ case 'search_all':
+ $label = __( 'Search Entries:', 'gravityview' );
+ break;
+ case 'entry_date':
+ $label = __( 'Filter by date:', 'gravityview' );
+ break;
+ case 'entry_id':
+ $label = __( 'Entry ID:', 'gravityview' );
+ break;
+ case 'created_by':
+ $label = __( 'Submitted by:', 'gravityview' );
+ break;
+ case 'is_fulfilled':
+ $label = __( 'Is Fulfilled', 'gravityview' );
+ break;
+ default:
+ // If this is a field input, not a field
+ if ( strpos( $field['field'], '.' ) > 0 && ! empty( $form_field['inputs'] ) ) {
- // There will only one item in the array, but this is easier
- foreach ( $values as $value ) {
- $label = $value;
- break;
+ // Get the label for the field in question, which returns an array
+ $items = wp_list_filter( $form_field['inputs'], array( 'id' => $field['field'] ) );
+
+ // Get the item with the `label` key
+ $values = wp_list_pluck( $items, 'label' );
+
+ // There will only one item in the array, but this is easier
+ foreach ( $values as $value ) {
+ $label = $value;
+ break;
+ }
+ }
}
- } elseif ( 'is_fulfilled' === $field['field'] ) {
- $label = __( 'Is Fulfilled', 'gravityview' );
}
/**
- * Modify the label for a search field
- * @param string $label Existing label text
- * @param array $form_field Gravity Forms field array, as returned by `GFFormsModel::get_field()`
+ * @filter `gravityview_search_field_label` Modify the label for a search field. Supports returning HTML
+ * @param[in,out] string $label Existing label text, sanitized.
+ * @param[in] array $form_field Gravity Forms field array, as returned by `GFFormsModel::get_field()`
*/
- $label = apply_filters( 'gravityview_search_field_label', $label, $form_field );
+ $label = apply_filters( 'gravityview_search_field_label', esc_attr( $label ), $form_field );
- return esc_attr( $label );
+ return $label;
}
/**
* Prepare search fields to frontend render with other details (label, field type, searched values)
*
- * @param type $field
- * @return type
+ * @param array $field
+ * @return array
*/
private function get_search_filter_details( $field ) {
@@ -821,22 +873,12 @@ private function get_search_filter_details( $field ) {
$filter = array(
'key' => $field['field'],
'name' => $name,
- 'label' => $this->get_field_label( $field, $form_field ),
+ 'label' => self::get_field_label( $field, $form_field ),
'input' => $field['input'],
'value' => $value,
'type' => $form_field['type'],
);
- // assign the correct label in case it is a boolean field
- if ( 'checkbox' === $form_field['type'] && false !== strpos( $filter['key'], '.' ) && ! empty( $form_field['inputs'] ) ) {
- foreach ( $form_field['inputs'] as $input ) {
- if ( $input['id'] == $filter['key'] ) {
- $filter['label'] = $input['label'];
- break;
- }
- }
- }
-
// collect choices
if ( 'post_category' === $form_field['type'] && ! empty( $form_field['displayAllCategories'] ) && empty( $form_field['choices'] ) ) {
$filter['choices'] = self::get_post_categories_choices();
@@ -865,7 +907,7 @@ private static function get_created_by_choices() {
* filter gravityview/get_users/search_widget
* @see \GVCommon::get_users
*/
- $users = GVCommon::get_users( 'search_widget' );
+ $users = GVCommon::get_users( 'search_widget', array( 'fields' => array( 'ID', 'display_name' ) ) );
$choices = array();
foreach ( $users as $user ) {
diff --git a/includes/widgets/search-widget/templates/search-field-link.php b/includes/widgets/search-widget/templates/search-field-link.php
index cf9d840cd4..98a05b721c 100644
--- a/includes/widgets/search-widget/templates/search-field-link.php
+++ b/includes/widgets/search-widget/templates/search-field-link.php
@@ -18,8 +18,18 @@
return;
}
+/**
+ * @filter `gravityview/extension/search/links_sep` Change the label for the "Link" search bar input type
+ * @param string $links_label Default: `Show only:`
+ */
$links_label = apply_filters( 'gravityview/extension/search/links_label', __( 'Show only:', 'gravityview' ) );
+
+/**
+ * @filter `gravityview/extension/search/links_sep` Change what separates search bar "Link" input type links
+ * @param string $links_sep Default: ` | ` Used to connect multiple links
+ */
$links_sep = apply_filters( 'gravityview/extension/search/links_sep', ' | ' );
+
?>
@@ -28,13 +38,16 @@
$choice ) :
+
+ $search_value = rgget( $search_field['name'] );
+
+ foreach ( $search_field['choices'] as $k => $choice ) {
if ( 0 != $k ) {
echo esc_html( $links_sep );
}
- $active = ( ! empty( $_GET[ $search_field['name'] ] ) && $_GET[ $search_field['name'] ] === $choice['text'] ) ? ' class="active"' : false;
+ $active = ( '' !== $search_value && in_array( $search_value, array( $choice['text'], $choice['value'] ) ) ) ? ' class="active"' : false;
if ( $active ) {
$link = remove_query_arg( array( 'pagenum', $search_field['name'] ), $base_url );
@@ -45,6 +58,6 @@
>
-
+
diff --git a/includes/widgets/search-widget/templates/widget-search.php b/includes/widgets/search-widget/templates/widget-search.php
index ff8575c024..fa3267728e 100644
--- a/includes/widgets/search-widget/templates/widget-search.php
+++ b/includes/widgets/search-widget/templates/widget-search.php
@@ -47,6 +47,7 @@
GravityView_Widget_Search::the_clear_search_button();
?>
+
diff --git a/includes/wordpress-widgets/class-gravityview-search-wp-widget.php b/includes/wordpress-widgets/class-gravityview-search-wp-widget.php
index 531e375ea4..ba146a260d 100644
--- a/includes/wordpress-widgets/class-gravityview-search-wp-widget.php
+++ b/includes/wordpress-widgets/class-gravityview-search-wp-widget.php
@@ -15,7 +15,7 @@ public function __construct() {
);
$widget_display = array(
- 'width' => 400
+ 'width' => 650
);
parent::__construct( 'gravityview_search', __( 'GravityView Search', 'gravityview' ), $widget_ops, $widget_display );
diff --git a/languages/gravityview.pot b/languages/gravityview.pot
index 2f7e0422e1..47dfa2eed3 100644
--- a/languages/gravityview.pot
+++ b/languages/gravityview.pot
@@ -793,7 +793,7 @@ msgid "Map It"
msgstr ""
#: includes/class-change-entry-creator.php:62
-#: includes/lib/EDD_SL_Plugin_Updater.php:327
+#: includes/lib/EDD_SL_Plugin_Updater.php:334
msgid "Error"
msgstr ""
@@ -1958,20 +1958,20 @@ msgstr ""
msgid "Open link in the same window?"
msgstr ""
-#: includes/lib/EDD_SL_Plugin_Updater.php:180
+#: includes/lib/EDD_SL_Plugin_Updater.php:179
msgid ""
"There is a new version of %1$s available. View version %3$s details ."
msgstr ""
-#: includes/lib/EDD_SL_Plugin_Updater.php:187
+#: includes/lib/EDD_SL_Plugin_Updater.php:186
msgid ""
"There is a new version of %1$s available. View version %3$s details or update now ."
msgstr ""
-#: includes/lib/EDD_SL_Plugin_Updater.php:327
+#: includes/lib/EDD_SL_Plugin_Updater.php:334
msgid "You do not have permission to install plugin updates"
msgstr ""
diff --git a/phpunit.xml b/phpunit.xml
index fefe1b6814..fb717743ca 100644
--- a/phpunit.xml
+++ b/phpunit.xml
@@ -1,19 +1,25 @@
-
-
-
- ./tests/
-
-
+
+
+
+ ./tests/unit-tests
+
+
+
+
+ ./bin/
+ ./language/
+ ./templates/
+ ./tests/
+ ./tmp/
+
+
diff --git a/phpunit.xml.dist b/phpunit.xml.dist
new file mode 100644
index 0000000000..52eb318157
--- /dev/null
+++ b/phpunit.xml.dist
@@ -0,0 +1,28 @@
+
+
+
+
+ ./tests/unit-tests
+
+
+
+
+ ./bin/
+ ./language/
+ ./templates/
+ ./tests/
+ ./tmp/
+
+
+
+
+
+
diff --git a/readme.md b/readme.md
index 77d9eaee80..5c50f4e83d 100644
--- a/readme.md
+++ b/readme.md
@@ -1,6 +1,8 @@
-[GravityView](https://gravityview.co/?utm_source=github&utm_medium=readme&utm_campaign=readme) is a commercial plugin available from [https://gravityview.co](http://gravityview.co?utm_source=github&utm_medium=readme&utm_campaign=readme). The plugin is hosted here on a public Github repository in order to better faciliate community contributions from developers and users. If you have a suggestion, a bug report, or a patch for an issue, feel free to submit it here.
+[![Build Status](https://travis-ci.org/katzwebservices/GravityView.svg?branch=develop)](https://travis-ci.org/katzwebservices/GravityView) [![Coverage Status](https://coveralls.io/repos/katzwebservices/GravityView/badge.svg?branch=develop&service=github)](https://coveralls.io/github/katzwebservices/GravityView?branch=develop)
+
+[GravityView](https://gravityview.co/?utm_source=github&utm_medium=readme&utm_campaign=readme) is a commercial plugin available from [https://gravityview.co](http://gravityview.co?utm_source=github&utm_medium=readme&utm_campaign=readme). The plugin is hosted here on a public Github repository in order to better faciliate community contributions from developers and users. If you have a suggestion, a bug report, or a patch for an issue, feel free to submit it here.
If you are using the plugin on a live site, please purchase a valid license from the [website](https://gravityview.co/?utm_source=github&utm_medium=readme&utm_campaign=readme). We cannot provide support to anyone that does not hold a valid license key.
@@ -19,4 +21,16 @@ cd /path/to/gravityview/
python /usr/bin/git-archive-all ../gravityview.zip
```
-This will create a `gravityview.zip` file in the directory above the cloned GravityView plugin on your computer, which includes the submodules.
\ No newline at end of file
+This will create a `gravityview.zip` file in the directory above the cloned GravityView plugin on your computer, which includes the submodules.
+
+
+#### Run Unit Tests
+
+The plugin uses PHPUnit as part of development process. Installing the testing environment is best done using a flavor of Vagrant (try [Varying Vagrant Vagrants](https://github.com/Varying-Vagrant-Vagrants/VVV)).
+
+1. From your terminal SSH into your Vagrant box using the `vagrant ssh` command
+2. `cd` into the root of your GravityView directory (VVV users can use `cd /srv/www/wordpress-default/wp-content/plugins/gravityview/`)
+3. Run `bash tests/bin/install.sh gravityview_test root root localhost` where `root root` is substituted for your mysql username and password (VVV users can run the command as is).
+4. Upon success you can run `phpunit`
+
+__If you want to generate a code coverage report__ you can run the following `phpunit --coverage-html "./tmp/coverage"` and then a report will be generated in the `/tmp/coverage/` subdirectory of the GravityView plugin.
diff --git a/readme.txt b/readme.txt
index d0ced68009..ae71927cd3 100644
--- a/readme.txt
+++ b/readme.txt
@@ -20,6 +20,28 @@ Beautifully display your Gravity Forms entries. Learn more on [GravityView.co](h
== Changelog ==
+= 1.14 (PRE RELEASE) =
+* Added: Show the value of a single column of a "Multiple Columns" List field
+* Added: Search Bar now supports custom label text
+* Added: Sorting by time now works. Why is this "Added" and not "Fixed"? Because Gravity Forms doesn't natively support sorting by time!
+* Fixed: Field containers were being rendered even when empty
+* Fixed: Widgets were not being displayed when using page builders and themes that pre-process shortcodes
+* Fixed: Don't show "Width %" setting when in Single Entry configuration
+* Fixed: Error in extension class that assumes GravityView is active
+* Fixed: Add check for `{all_fields_display_empty}` Gravity Forms merge tag
+* Fixed: Hide metabox until View Data Source is configured
+* Fixed: Search Bar "Link" input type wasn't highlighting properly based on the value of the filter
+* Fixed: Improved speed of getting users for Search Bar and GravityView Search Widgets with "Submitted by" fields, and in the Edit Entry screen (the Change Entry Creator dropdown)
+* Added: Support for plugin banner images in the plugin changelog screen
+* Added: Display the roles of the entry creator by using `{created_by:roles}` Merge Tag
+* Tweak: Updated default Search Bar configuration to be a single input with "Search Everything"
+* Tweak: Sort user dropdown by display name instead of username
+* Tweak: Reduce size of AJAX responses
+* Tweak: Add "Template" column to the All Views list table - now you can better see what template is being used
+* Tweak: Remove redundant close icon for field and widget settings
+* Tweak: When adding notes via GravityView, set the note type to `gravityview` to allow for better searchability
+* Added: Automated code testing
+
= 1.13.1 on August 26 =
* Fixed: Potential XSS security issue. **Please update.**
* Fixed: The cache was not being reset properly for entry changes, including:
diff --git a/templates/css/gv-default-styles.css b/templates/css/gv-default-styles.css
index d7e2749285..f41a78e931 100644
--- a/templates/css/gv-default-styles.css
+++ b/templates/css/gv-default-styles.css
@@ -1 +1 @@
-.gv-search-horizontal{display:table;width:100%;}.gv-search-horizontal .gv-search-box{padding-right:0.5em;display:table-cell;height:100%;vertical-align:top;}.gv-search-horizontal .gv-search-box p{display:block;}.gv-search-horizontal .gv-search-box input,.gv-search-horizontal .gv-search-box select{display:block;}.gv-search-horizontal .gv-search-box select{width:100%;max-width:15em;}.gv-search-horizontal .gv-search-box.gv-search-date{max-width:10em;}.gv-search-horizontal .gv-search-box.gv-search-date input{width:48%;float:left;margin-right:2%;}.gv-search-horizontal .gv-search-box.gv-search-date input{display:inline-block;}.gv-search-horizontal .gv-search-box.gv-search-box-submit{vertical-align:middle;}.gv-search-horizontal .gv-search-box.gv-search-box-submit .gv-search-clear{float:left;margin-right:5px;}.gv-widget-search label.gv-check-radio{display:inline-block;margin-right:1em;}.gv-widget-search label.gv-check-radio input{display:inline;}.gv-widget-search.gv-search-vertical label.gv-check-radio{display:block;margin-bottom:1em;}.gv-widget-search .gv-search-box-links .active{font-weight:bold;}.gv-search-clear{display:none;}.gv-is-search .gv-search-clear{display:block;}.gv-list-container .gv-section,.gv-list-single-container .gv-section{margin:1em 0 1.5em;}.gv-list-container .gv-section .gv-field-label,.gv-list-single-container .gv-section .gv-field-label{border-bottom:1px solid #ccc;display:block;}.gv-image-caption{font-style:italic;}.gv-notice{padding:0.5em 0.75em;margin:1em 0;background-color:#ffffcc;border:1px solid #ddd;}.gv-notice.gv-error{padding:0.75em;border-color:#fd9ca1;background-color:#ffdfe0;}.gv-notice p{margin:0;padding:0;}.gv-edit-entry-wrapper .dashicons{font-size:0.925em;padding:0 0.2em;width:1em;height:1em;line-height:1em;margin-left:0.5em;}.gv-edit-entry-wrapper .dashicons-dismiss{color:#a10013;}.gv-edit-entry-wrapper .dashicons-dismiss:hover{color:#e20012;}.gv-edit-entry-wrapper .dashicons-download{color:#406e20;}.gv-edit-entry-wrapper .dashicons-download:hover{color:#469416;}.gv-notice{padding:0.5em 0.75em;margin:1em 0;background-color:#ffffcc;border:1px solid #ddd;}.gv-notice.gv-error{padding:0.75em;border-color:#fd9ca1;background-color:#ffdfe0;}.gv-notice p{margin:0;padding:0;}.gravityview-oembed .gv-back-link{display:none;}.gv-grid{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}.gv-grid:before,.gv-grid:after{content:" ";display:table;}.gv-grid:after{clear:both;}[class*='gv-grid-col-']{float:left;padding-right:1em;min-height:1px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}@media screen and (max-width: 320px){[class*='gv-grid-col-']{width:100% !important;float:none;}}@media screen and (max-width: 480px){[class*='gv-grid-col-']{width:100% !important;float:none;}}.gv-grid-col-1-1{width:100%;}.gv-grid-col-1-3{width:33.3333333333%;}.gv-grid-col-2-3{width:66.6666666667%;}.gv-grid-col-1-2{width:50%;}.gv-grid-col-1-4{width:25%;}.gv-grid-col-1-6{width:16.6666666667%;}.gv-grid-col-1-8{width:12.5%;}.gv-right{text-align:right;display:block;}.gv-right .gv-right>div{float:right;}.gv-left{text-align:left;display:block;}.gv-left .gv-right>div{float:left;}@media screen and (max-width: 480px){[class*='gv-grid-col-']{width:100%;}.gv-right,.gv-left,.gv-right>div,.gv-left>div{float:none;text-align:left;}}body .gv-widget-page-links ul,body .gv-widget-page-links li{list-style:none;margin:0;padding:0;}body .gv-widget-page-links li{display:inline;display:inline-block;}body .gv-widget-page-links li .page-numbers{display:inline-block;padding:0.4em 0.5em;}.gv-container img{display:block;margin:0;padding:0;max-width:100%;max-height:100%;}.gv-no-results{text-align:center;vertical-align:center;padding:0.5em;}#TB_window img{max-height:100%;max-width:100%;}.gv-field-label{padding-right:0.25em;}a.gv-sort{text-decoration:none;border-bottom:none;}.gv-gallery .gv-field-file-uploads{margin:0;padding:0;}.gv-gallery .gv-field-file-uploads li{list-style:none;display:inline-block;max-width:200px;margin-right:1em;margin-bottom:0.5em;}.gv-gallery .gv-field-file-uploads li img{max-width:auto;}.hidden{display:none;}
\ No newline at end of file
+.gv-search-horizontal{display:table;width:100%;}.gv-search-horizontal .gv-search-box{padding-right:0.5em;display:table-cell;height:100%;vertical-align:top;}.gv-search-horizontal .gv-search-box p{display:block;}.gv-search-horizontal .gv-search-box input,.gv-search-horizontal .gv-search-box select{display:block;}.gv-search-horizontal .gv-search-box select{width:100%;max-width:15em;}.gv-search-horizontal .gv-search-box.gv-search-date{max-width:10em;}.gv-search-horizontal .gv-search-box.gv-search-date input{width:48%;float:left;margin-right:2%;}.gv-search-horizontal .gv-search-box.gv-search-date input{display:inline-block;}.gv-search-horizontal .gv-search-box.gv-search-box-submit{vertical-align:middle;}.gv-search-horizontal .gv-search-box.gv-search-box-submit .gv-search-clear{float:left;margin-right:5px;}.gv-widget-search label.gv-check-radio{display:inline-block;margin-right:1em;}.gv-widget-search label.gv-check-radio input{display:inline;}.gv-widget-search.gv-search-vertical label.gv-check-radio{display:block;margin-bottom:1em;}.gv-widget-search .gv-search-box-links .active{font-weight:bold;}.gv-search-clear{display:none;}.gv-is-search .gv-search-clear{display:block;}.gv-list-container .gv-section,.gv-list-single-container .gv-section{margin:1em 0 1.5em;}.gv-list-container .gv-section .gv-field-label,.gv-list-single-container .gv-section .gv-field-label{border-bottom:1px solid #ccc;display:block;}.gv-image-caption{font-style:italic;}.gv-notice{padding:0.5em 0.75em;margin:1em 0;background-color:#ffffcc;border:1px solid #ddd;}.gv-notice.gv-error{padding:0.75em;border-color:#fd9ca1;background-color:#ffdfe0;}.gv-notice p{margin:0;padding:0;}.gv-edit-entry-wrapper .dashicons{font-size:0.925em;padding:0 0.2em;width:1em;height:1em;line-height:1em;margin-left:0.5em;}.gv-edit-entry-wrapper .dashicons-dismiss{color:#a10013;}.gv-edit-entry-wrapper .dashicons-dismiss:hover{color:#e20012;}.gv-edit-entry-wrapper .dashicons-download{color:#406e20;}.gv-edit-entry-wrapper .dashicons-download:hover{color:#469416;}.gv-notice{padding:0.5em 0.75em;margin:1em 0;background-color:#ffffcc;border:1px solid #ddd;}.gv-notice.gv-error{padding:0.75em;border-color:#fd9ca1;background-color:#ffdfe0;}.gv-notice p{margin:0;padding:0;}.gravityview-oembed .gv-back-link{display:none;}.gv-grid{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}.gv-grid:before,.gv-grid:after{content:" ";display:table;}.gv-grid:after{clear:both;}[class*='gv-grid-col-']{float:left;padding-right:1em;min-height:1px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}@media screen and (max-width: 320px){[class*='gv-grid-col-']{width:100% !important;float:none;}}@media screen and (max-width: 480px){[class*='gv-grid-col-']{width:100% !important;float:none;}}.gv-grid-col-1-1{width:100%;}.gv-grid-col-1-3{width:33.3333333333%;}.gv-grid-col-2-3{width:66.6666666667%;}.gv-grid-col-1-2{width:50%;}.gv-grid-col-1-4{width:25%;}.gv-grid-col-1-6{width:16.6666666667%;}.gv-grid-col-1-8{width:12.5%;}.gv-right{text-align:right;display:block;}.gv-right .gv-right>div{float:right;}.gv-left{text-align:left;display:block;}.gv-left .gv-right>div{float:left;}@media screen and (max-width: 480px){[class*='gv-grid-col-']{width:100%;}.gv-right,.gv-left,.gv-right>div,.gv-left>div{float:none;text-align:left;}}body .gv-widget-page-links ul,body .gv-widget-page-links li{list-style:none;margin:0;padding:0;}body .gv-widget-page-links li{display:inline;display:inline-block;}body .gv-widget-page-links li .page-numbers{display:inline-block;padding:0.4em 0.5em;}.gv-container img{display:block;margin:0;padding:0;max-width:100%;max-height:100%;}.gv-no-results{text-align:center;vertical-align:middle;padding:0.5em;}#TB_window img{max-height:100%;max-width:100%;}.gv-field-label{padding-right:0.25em;}a.gv-sort{text-decoration:none;border-bottom:none;}.gv-gallery .gv-field-file-uploads{margin:0;padding:0;}.gv-gallery .gv-field-file-uploads li{list-style:none;display:inline-block;max-width:200px;margin-right:1em;margin-bottom:0.5em;}.gv-gallery .gv-field-file-uploads li img{max-width:none;}.hidden{display:none;}
\ No newline at end of file
diff --git a/templates/css/source/gv-default-styles.scss b/templates/css/source/gv-default-styles.scss
index 1535dded75..38676b4d90 100644
--- a/templates/css/source/gv-default-styles.scss
+++ b/templates/css/source/gv-default-styles.scss
@@ -154,7 +154,7 @@ body .gv-widget-page-links {
.gv-no-results {
text-align: center;
- vertical-align: center;
+ vertical-align: middle;
padding: .5em;
}
@@ -187,7 +187,7 @@ a.gv-sort {
margin-bottom: .5em;
img {
- max-width: auto;
+ max-width: none;
}
}
}
diff --git a/templates/fields/list.php b/templates/fields/list.php
index f56099b5aa..f680130044 100644
--- a/templates/fields/list.php
+++ b/templates/fields/list.php
@@ -2,12 +2,32 @@
/**
* Display the list field type
*
+ * @todo Confirm it works with http://gravitywiz.com/use-list-field-choices-gravity-forms/
* @package GravityView
* @subpackage GravityView/templates/fields
+ * @global GF_Field_List $field
+ * @global string $field_id ID of the field
+ * @global string $value Gravity Forms serializes the list field values
+ * @global string $display_value Field output HTML. For list fields with columns, it's a table. Otherwise, an unordered list
*/
$gravityview_view = GravityView_View::getInstance();
extract( $gravityview_view->getCurrentField() );
-echo $display_value;
+$field_id_array = explode( '.', $field_id );
+
+if( $field->enableColumns && isset( $field_id_array[1] ) ) {
+
+ /**
+ * @filter `gravityview/fields/list/column-format` Format of single list column output of a List field with Multiple Columns enabled
+ * @since 1.14
+ * @param string $format `html` (for list), `text` (for CSV output)
+ */
+ $format = apply_filters( 'gravityview/fields/list/column-format', 'html' );
+
+ echo GravityView_Field_List::column_value( $field, $value, intval( $field_id_array[1] ), $format );
+
+} else {
+ echo $display_value;
+}
\ No newline at end of file
diff --git a/templates/fields/time.php b/templates/fields/time.php
index 5efa6a88db..2d37751c04 100644
--- a/templates/fields/time.php
+++ b/templates/fields/time.php
@@ -8,22 +8,32 @@
$gravityview_view = GravityView_View::getInstance();
-extract( $gravityview_view->getCurrentField() );
+$gv_field = $gravityview_view->getCurrentField();
-if( !empty( $field_settings ) && !empty( $field_settings['date_display'] ) && !empty( $value ) ) {
+/** @var string $value Raw time value */
+$value = rgget( 'value', $gv_field );
- // If there is a custom PHP date format passed via the date_display setting,
- // use PHP's date format
- $format = $field_settings['date_display'];
- $output = date_i18n( $format, strtotime( $value ) );
+/** @var string $field_id ID of the field being displayed */
+$field_id = rgget( 'field_id', $gv_field );
+
+$output = '';
+
+if( '' !== $value ) {
+
+ /** @var GF_Field_Time $field Gravity Forms Time field */
+ $field = rgget( 'field', $gv_field );
-} else {
+ $format = $gravityview_view->getCurrentFieldSetting( 'date_display' );
- // Otherwise, use Gravity Forms, where you can only choose from
- // yyyy-mm-dd, mm-dd-yyyy, and dd-mm-yyyy
- $format = apply_filters( 'gravityview_date_format', rgar($field, "dateFormat") );
- $output = GFCommon::date_display( $value, $format );
+ if ( empty( $format ) ) {
+ $field->sanitize_settings();
+
+ $format = GravityView_Field_Time::date_format( $field->timeFormat, $field_id );
+ }
+
+ // If there is a custom PHP date format passed via the date_display setting, use PHP's date format
+ $output = date_i18n( $format, strtotime( $value ) );
}
echo $output;
diff --git a/tests/bin/index.php b/tests/bin/index.php
new file mode 100755
index 0000000000..62200328fd
--- /dev/null
+++ b/tests/bin/index.php
@@ -0,0 +1,2 @@
+ [db-host] [wp-version]"
+ exit 1
+fi
+
+DB_NAME=$1
+DB_USER=$2
+DB_PASS=$3
+DB_HOST=${4-localhost}
+WP_VERSION=${5-latest}
+
+WP_TESTS_DIR="${PWD}/tmp/wordpress-tests-lib"
+WP_CORE_DIR="${PWD}/tmp/wordpress/"
+
+set -ex
+
+install_wp() {
+ mkdir -p $WP_CORE_DIR
+
+ if [ $WP_VERSION == 'latest' ]; then
+ local ARCHIVE_NAME='latest'
+ else
+ local ARCHIVE_NAME="wordpress-$WP_VERSION"
+ fi
+
+ wget -nv -O /tmp/wordpress.tar.gz https://wordpress.org/${ARCHIVE_NAME}.tar.gz
+ tar --strip-components=1 -zxmf /tmp/wordpress.tar.gz -C $WP_CORE_DIR
+
+ wget -nv -O $WP_CORE_DIR/wp-content/db.php https://raw.github.com/markoheijnen/wp-mysqli/master/db.php
+}
+
+install_depencency(){
+ curl -L https://github.com/gravityforms/gravityforms/archive/develop.tar.gz --output /tmp/gravityforms.tar.gz --silent
+
+ mkdir -p $PWD/tmp/gravityforms
+ tar --strip-components=1 -zxf /tmp/gravityforms.tar.gz -C $PWD/tmp/gravityforms
+}
+
+install_test_suite() {
+ # portable in-place argument for both GNU sed and Mac OSX sed
+ if [[ $(uname -s) == 'Darwin' ]]; then
+ local ioption='-i .bak'
+ else
+ local ioption='-i'
+ fi
+
+ # set up testing suite
+ mkdir -p $WP_TESTS_DIR
+ cd $WP_TESTS_DIR
+ svn co --quiet https://develop.svn.wordpress.org/trunk/tests/phpunit/includes/
+
+ wget -nv -O wp-tests-config.php https://develop.svn.wordpress.org/trunk/wp-tests-config-sample.php
+ sed $ioption "s:dirname( __FILE__ ) . '/src/':'$WP_CORE_DIR':" wp-tests-config.php
+ sed $ioption "s/youremptytestdbnamehere/$DB_NAME/" wp-tests-config.php
+ sed $ioption "s/yourusernamehere/$DB_USER/" wp-tests-config.php
+ sed $ioption "s/yourpasswordhere/$DB_PASS/" wp-tests-config.php
+ sed $ioption "s|localhost|${DB_HOST}|" wp-tests-config.php
+}
+
+
+install_db() {
+ # parse DB_HOST for port or socket references
+ local PARTS=(${DB_HOST//\:/ })
+ local DB_HOSTNAME=${PARTS[0]};
+ local DB_SOCK_OR_PORT=${PARTS[1]};
+ local EXTRA=""
+
+ if ! [ -z $DB_HOSTNAME ] ; then
+ if [ $(echo $DB_SOCK_OR_PORT | grep -e '^[0-9]\{1,\}$') ]; then
+ EXTRA=" --host=$DB_HOSTNAME --port=$DB_SOCK_OR_PORT --protocol=tcp"
+ elif ! [ -z $DB_SOCK_OR_PORT ] ; then
+ EXTRA=" --socket=$DB_SOCK_OR_PORT"
+ elif ! [ -z $DB_HOSTNAME ] ; then
+ EXTRA=" --host=$DB_HOSTNAME --protocol=tcp"
+ fi
+ fi
+
+ # create database
+ mysqladmin create $DB_NAME --user="$DB_USER" --password="$DB_PASS"$EXTRA
+}
+
+install_wp
+install_depencency
+install_test_suite
+install_db
diff --git a/tests/bin/travis.sh b/tests/bin/travis.sh
new file mode 100755
index 0000000000..e9960a45f9
--- /dev/null
+++ b/tests/bin/travis.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# usage: travis.sh before|after
+
+if [ $1 == 'before' ]; then
+
+ # composer install fails in PHP 5.2
+ [ $TRAVIS_PHP_VERSION == '5.2' ] && exit;
+
+ # install php-coveralls to send coverage info
+ composer init --require=satooshi/php-coveralls:0.7.x-dev -n
+ composer install --no-interaction
+
+elif [ $1 == 'after' ]; then
+
+ # no Xdebug and therefore no coverage in PHP 5.2
+ [ $TRAVIS_PHP_VERSION == '5.2' ] && exit;
+
+ # send coverage data to coveralls
+ php vendor/bin/coveralls --verbose --exclude-no-stmt
+fi
diff --git a/tests/bootstrap.php b/tests/bootstrap.php
index b8fc42a195..2d016b5a2c 100644
--- a/tests/bootstrap.php
+++ b/tests/bootstrap.php
@@ -1,22 +1,199 @@
array(
- 'gravityforms/gravityforms.php',
- 'gravityview/gravityview.php'
- )
- );
+ /** @var string testing directory */
+ public $tests_dir;
+
+ /** @var string plugin directory */
+ public $plugin_dir;
+
+ /**
+ * @var int
+ */
+ private $form_id = 0;
+
+ /**
+ * @var array GF Form array
+ */
+ private $form = array();
+
+ /**
+ * @var int
+ */
+ private $entry_id = 0;
+
+ /**
+ * @var array GF Entry array
+ */
+ private $entry = array();
+
+ /**
+ * Setup the unit testing environment
+ *
+ * @since 1.9
+ */
+ public function __construct() {
+ ini_set( 'display_errors', 'on' );
+ error_reporting( E_ALL );
+
+ $this->tests_dir = dirname( __FILE__ );
+ $this->plugin_dir = dirname( $this->tests_dir );
+ $this->wp_tests_dir = getenv( 'WP_TESTS_DIR' ) ? getenv( 'WP_TESTS_DIR' ) : $this->plugin_dir . '/tmp/wordpress-tests-lib';
+
+ // load test function so tests_add_filter() is available
+ require_once $this->wp_tests_dir . '/includes/functions.php';
+
+ // load GV
+ tests_add_filter( 'muplugins_loaded', array( $this, 'load' ) );
+
+ // load the WP testing environment
+ require_once( $this->wp_tests_dir . '/includes/bootstrap.php' );
+
+ // set up Gravity View
+ $this->install();
+ }
+
+ /**
+ * Load GravityView
+ *
+ * @since 1.9
+ */
+ public function load() {
+ require_once $this->plugin_dir . '/tmp/gravityforms/gravityforms.php';
+ require_once $this->plugin_dir . '/gravityview.php';
+
+ // set up Gravity Forms database
+ @GFForms::setup( true );
+
+ $this->create_stubs();
+ }
+
+ /**
+ * @return array
+ */
+ public function get_form() {
+ return $this->form;
+ }
+
+ /**
+ * @return array
+ */
+ public function get_entry() {
+ return $this->entry;
+ }
+
+ /**
+ * @return int
+ */
+ public function get_entry_id() {
+ return $this->entry_id;
+ }
+
+ /**
+ * @return int
+ */
+ public function get_form_id() {
+ return $this->form_id;
+ }
+
+ /**
+ * Generate some placeholder values to test against
+ */
+ private function create_stubs() {
+
+ $this->form_id = GFAPI::add_form( array(
+ 'title' => 'This is the form title',
+ 'fields' => array(
+ new GF_Field_Text(array(
+ 'id' => 1,
+ 'label' => 'Label for field one (text)',
+ 'choices' => array(),
+ 'inputs' => '',
+ )),
+ new GF_Field_Hidden(array(
+ 'id' => 2,
+ 'label' => 'Label for field two (hidden)',
+ 'choices' => array(),
+ 'inputs' => '',
+ )),
+ new GF_Field_Number(array(
+ 'id' => 3,
+ 'label' => 'Label for field three (number)',
+ 'choices' => array(),
+ 'inputs' => '',
+ ))
+ ),
+ ));
+
+ $this->form = GFAPI::get_form( $this->form_id );
+
+ $entry_array = array(
+ 'form_id' => $this->form_id,
+ '1' => 'Value for field one',
+ '2' => 'Value for field two',
+ '3' => '3.33333',
+ 'ip' => '127.0.0.1',
+ 'source_url' => 'http://example.com/wordpress/?gf_page=preview&id=16',
+ 'user_agent' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.78.2 (KHTML, like Gecko) Version/7.0.6 Safari/537.78.2',
+ 'payment_status' => 'Processing',
+ 'payment_date' => '2014-08-29 20:55:06',
+ 'payment_amount' => '0.01',
+ 'transaction_id' => 'asdfpaoj442gpoagfadf',
+ 'created_by' => 1,
+ 'status' => 'active',
+ 'date_created' => '2014-08-29 18:25:39',
+ );
+
+ $this->entry_id = GFAPI::add_entry( $entry_array );
+
+ $this->entry = GFAPI::get_entry( $this->entry_id );
+
+ }
+
+ /**
+ * Setup all Gravity View's files
+ *
+ * @since 1.9
+ */
+ public function install() {
+ $GV = GravityView_Plugin::getInstance();
+ $GV->frontend_actions();
+ }
+
+ /**
+ * Get the single class instance
+ *
+ * @since 1.9
+ * @return GV_Unit_Tests_Bootstrap
+ */
+ public static function instance() {
+ if ( is_null( self::$instance ) ) {
+ self::$instance = new self();
+ }
+
+ return self::$instance;
+ }
- require_once $path;
-} else {
- exit("Couldn't find wordpress-tests/bootstrap.php\n");
}
-require_once dirname( __FILE__ ) . '/../gravityview.php';
-require_once dirname( __FILE__ ) . '/../../gravityforms/gravityforms.php';
+GV_Unit_Tests_Bootstrap::instance();
+
+
+/* Clean up the GF Database when we're done */
+register_shutdown_function( 'gravityview_shutdown' );
+
+/* Shutdown function wasn't working when referenced via array( $this, 'shutdown' ) from the object */
+function gravityview_shutdown() {
+ RGFormsModel::drop_tables();
+}
diff --git a/tests/index.php b/tests/index.php
index 7e91415898..62200328fd 100755
--- a/tests/index.php
+++ b/tests/index.php
@@ -1,2 +1,2 @@
form = GV_Unit_Tests_Bootstrap::instance()->get_form();
+ $this->form_id = GV_Unit_Tests_Bootstrap::instance()->get_form_id();
- $GV = GravityView_Plugin::getInstance();
- $GV->frontend_actions();
+ $this->entry = GV_Unit_Tests_Bootstrap::instance()->get_entry();
+ $this->entry_id = GV_Unit_Tests_Bootstrap::instance()->get_entry_id();
}
/**
* @covers GravityView_API::replace_variables()
+ * @covers GravityView_Merge_Tags::replace_variables()
*/
- function test_replace_variables() {
-
- $entry = array(
- 'id' => 5384,
- 'form_id' => 123,
- 'ip' => '127.0.0.1',
- 'source_url' => 'http://example.com/wordpress/?gf_page=preview&id=16',
- 'user_agent' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.78.2 (KHTML, like Gecko) Version/7.0.6 Safari/537.78.2',
- 'payment_status' => 'Processing',
- 'payment_date' => '2014-08-29 20:55:06',
- 'payment_amount' => '0.01',
- 'transaction_id' => 'asdfpaoj442gpoagfadf',
- 'created_by' => 1,
- 'post_id' => 18,
- 'status' => 'active',
- 'date_created' => '2014-08-29 18:25:39',
- );
+ public function test_replace_variables() {
- $form = array(
- 'id' => 123,
- 'title' => 'This is the form title',
- );
+ $entry = GV_Unit_Tests_Bootstrap::instance()->get_entry();
+
+ $form = GV_Unit_Tests_Bootstrap::instance()->get_form();
// No match
$this->assertEquals( 'no bracket', GravityView_API::replace_variables( 'no bracket', $form, $entry ) );
// Include bracket with nomatch
- $this->assertEquals( '5384 {nomatch}', GravityView_API::replace_variables( '{entry_id} {nomatch}', $form, $entry ) );
+ $this->assertEquals( $entry['id'] . ' {nomatch}', GravityView_API::replace_variables( '{entry_id} {nomatch}', $form, $entry ) );
// Match tag, empty value
$this->assertEquals( '', GravityView_API::replace_variables( '{user:example}', $form, $entry ) );
@@ -58,12 +70,22 @@ function test_replace_variables() {
$this->assertEquals( $entry['post_id'], GravityView_API::replace_variables( '{post_id}', $form, $entry ) );
- $this->assertEquals( date('m/d/Y'), GravityView_API::replace_variables( '{date_mdy}', $form, $entry ) );
+ $this->assertEquals( date( 'm/d/Y' ), GravityView_API::replace_variables( '{date_mdy}', $form, $entry ) );
- $this->assertEquals( get_option('admin_email'), GravityView_API::replace_variables( '{admin_email}', $form, $entry ) );
+ $this->assertEquals( get_option( 'admin_email' ), GravityView_API::replace_variables( '{admin_email}', $form, $entry ) );
+
+ $user = wp_set_current_user( $entry['created_by'] );
+
+ // Test new Roles merge tag
+ $this->assertEquals( implode( ', ', $user->roles ), GravityView_API::replace_variables( '{created_by:roles}', $form, $entry ) );
+
+ $user->add_role( 'editor' );
+
+ // Test new Roles merge tag again, with another role.
+ $this->assertEquals( implode( ', ', $user->roles ), GravityView_API::replace_variables( '{created_by:roles}', $form, $entry ) );
$var_content = 'I expect Entry #{entry_id} will be in Form #{form_id}
';
- $expected_content = 'I expect Entry #5384 will be in Form #123
';
+ $expected_content = 'I expect Entry #'.$entry['id'].' will be in Form #'.$form['id'].'
';
$this->assertEquals( $expected_content, GravityView_API::replace_variables( $var_content, $form, $entry ) );
}
@@ -71,60 +93,39 @@ function test_replace_variables() {
/**
* @covers GravityView_API::field_class()
*/
- function test_field_class() {
-
- $entry = array(
- 'id' => 5384,
- 'form_id' => 123,
- 'ip' => '127.0.0.1',
- 'source_url' => 'http://example.com/wordpress/?gf_page=preview&id=16',
- 'user_agent' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.78.2 (KHTML, like Gecko) Version/7.0.6 Safari/537.78.2',
- 'payment_status' => 'Processing',
- 'payment_date' => '2014-08-29 20:55:06',
- 'payment_amount' => '0.01',
- 'transaction_id' => 'asdfpaoj442gpoagfadf',
- 'created_by' => 1,
- 'post_id' => 18,
- 'status' => 'active',
- 'date_created' => '2014-08-29 18:25:39',
- );
+ public function test_field_class() {
- $form = array(
- 'id' => 123,
- 'title' => 'This is the form title',
- );
+ $entry = $this->entry;
- $field = array(
- 'id' => '8'
- );
+ $form = $this->form;
- $this->assertEquals( 'gv-field-123-8', GravityView_API::field_class( $field, $form, $entry ) );
+ $field_id = 2;
+ $field = GFFormsModel::get_field( $form, $field_id);
- $field = array(
- 'id' => '8',
- 'custom_class' => 'custom-class-{entry_id}'
- );
+ $this->assertEquals( 'gv-field-'.$form['id'].'-'.$field_id, GravityView_API::field_class( $field, $form, $entry ) );
+
+ $field['custom_class'] = 'custom-class-{entry_id}';
// Test the replace_variables functionality
- $this->assertEquals( 'custom-class-5384 gv-field-123-8', GravityView_API::field_class( $field, $form, $entry ) );
+ $this->assertEquals( 'custom-class-'.$entry['id'].' gv-field-'.$form['id'].'-'.$field_id, GravityView_API::field_class( $field, $form, $entry ) );
$field['custom_class'] = 'testing,!@@($)*$ 12383';
// Test the replace_variables functionality
- $this->assertEquals( 'testing 12383 gv-field-123-8', GravityView_API::field_class( $field, $form, $entry ) );
+ $this->assertEquals( 'testing 12383 gv-field-'.$form['id'].'-'.$field_id, GravityView_API::field_class( $field, $form, $entry ) );
}
/**
- * @uses $this->_override_no_entries_text_output()
+ * @uses GravityView_API_Test::_override_no_entries_text_output()
* @covers GravityView_API::no_results()
*/
- function test_no_results() {
+ public function test_no_results() {
global $gravityview_view;
- $gravityview_view = new StdClass();
+ $gravityview_view = GravityView_View::getInstance();
$gravityview_view->curr_start = false;
$gravityview_view->curr_end = false;
@@ -133,7 +134,6 @@ function test_no_results() {
// Not in search by default
$this->assertEquals( 'No entries match your request.', GravityView_API::no_results( false ) );
$this->assertEquals( 'No entries match your request.
'."\n", GravityView_API::no_results( true ) );
-
// Pretend we're in search
$gravityview_view->curr_search = true;
@@ -142,7 +142,7 @@ function test_no_results() {
// Add the filter that modifies output
- add_filter('gravitview_no_entries_text', array( $this, '_override_no_entries_text_output' ), 10, 2);
+ add_filter( 'gravitview_no_entries_text', array( $this, '_override_no_entries_text_output' ), 10, 2 );
// Test to make sure the $is_search parameter is passed correctly
$this->assertEquals( 'SEARCH override the no entries text output', GravityView_API::no_results( false ) );
@@ -153,13 +153,13 @@ function test_no_results() {
$this->assertEquals( 'NO SEARCH override the no entries text output', GravityView_API::no_results( false ) );
// Remove the filter for later
- remove_filter('gravitview_no_entries_text', array( $this, '_override_no_entries_text_output' ));
+ remove_filter( 'gravitview_no_entries_text', array( $this, '_override_no_entries_text_output' ) );
}
- function _override_no_entries_text_output( $previous, $is_search = false ) {
+ public function _override_no_entries_text_output( $previous, $is_search = false ) {
- if( $is_search ) {
+ if ( $is_search ) {
return 'SEARCH override the no entries text output';
} else {
return 'NO SEARCH override the no entries text output';
@@ -167,7 +167,7 @@ function _override_no_entries_text_output( $previous, $is_search = false ) {
}
- function _get_new_view_id() {
+ public function _get_new_view_id() {
$view_array = array(
'post_content' => '',
@@ -179,17 +179,62 @@ function _get_new_view_id() {
$view_post_type_id = wp_insert_post( $view_array );
// Set the form ID
- update_post_meta( $view_post_type_id, '_gravityview_form_id', 123 );
+ update_post_meta( $view_post_type_id, '_gravityview_form_id', $this->form_id );
// Set the View settigns
update_post_meta( $view_post_type_id, '_gravityview_template_settings', GravityView_View_Data::get_default_args() );
+ // Set the template to be table
+ update_post_meta( $view_post_type_id, '_gravityview_directory_template', 'default_table' );
+
return $view_post_type_id;
}
- function test_directory_link( ) {
+ /**
+ * @internal Make sure this test is above the test_directory_link() test so that one doesn't pollute $post
+ */
+ public function test_gravityview_get_current_views() {
+
+ $fe = GravityView_frontend::getInstance();
+
+ // Clear the data so that gravityview_get_current_views() runs parse_content()
+ $fe->gv_output_data = null;
+
+ $view_post_type_id = $this->_get_new_view_id();
+
+ global $post;
+
+ $post = get_post( $view_post_type_id );
+
+ $this->assertEquals( $view_post_type_id, $post->ID );
+
+ $current_views = gravityview_get_current_views();
+
+ // Check if the view post is set
+ $this->assertTrue( isset( $current_views[ $view_post_type_id ] ) );
+
+ // When the view is added, the key is set to the View ID and the `id` is also set to that
+ $this->assertEquals( $view_post_type_id, $current_views[ $view_post_type_id ]['id'] );
+ // Just one View
+ $this->assertEquals( 1, count( $current_views ) );
+
+ $second_view_post_type_id = $this->_get_new_view_id();
+
+ $fe->gv_output_data->add_view( $second_view_post_type_id );
+
+ $second_current_views = gravityview_get_current_views();
+
+ // Check to make sure add_view worked properly
+ $this->assertEquals( $second_view_post_type_id, $second_current_views[ $second_view_post_type_id ]['id'] );
+
+ // Now two Views
+ $this->assertEquals( 2, count( $second_current_views ) );
+
+ }
+
+ public function test_directory_link( ) {
$post_array = array(
'post_content' => 'asdasdsd',
'post_type' => 'post',
@@ -200,21 +245,20 @@ function test_directory_link( ) {
$view_post_type_id = $this->_get_new_view_id();
-
$_GET['pagenum'] = 2;
$add_pagination = false;
- $this->assertEquals( site_url('?p='.$post_id), GravityView_API::directory_link( $post_id, $add_pagination ) );
+ $this->assertEquals( site_url( '?p=' . $post_id ), GravityView_API::directory_link( $post_id, $add_pagination ) );
$add_pagination = true;
- $this->assertEquals( site_url('?p='.$post_id.'&pagenum=2'), GravityView_API::directory_link( $post_id, $add_pagination ) );
+ $this->assertEquals( site_url( '?p=' . $post_id . '&pagenum=2' ), GravityView_API::directory_link( $post_id, $add_pagination ) );
// Make sure the cache is working properly
- $this->assertEquals( site_url('?p='.$post_id), wp_cache_get( 'gv_directory_link_'.$post_id ) );
+ $this->assertEquals( site_url( '?p=' . $post_id ), wp_cache_get( 'gv_directory_link_' . $post_id ) );
- //
- // Use $gravityview_view data
- //
+ //
+ // Use $gravityview_view data
+ //
global $gravityview_view;
global $post;
@@ -222,20 +266,19 @@ function test_directory_link( ) {
GravityView_frontend::getInstance()->parse_content();
-
- $gravityview_view->view_id = $view_post_type_id;
-
+ $gravityview_view->setViewId( $view_post_type_id );
// Test post_id has been set
- $gravityview_view->post_id = $post_id;
+ $gravityview_view->setPostId( $post_id );
- $this->assertEquals( site_url('?p='.$post_id.'&pagenum=2'), GravityView_API::directory_link() );
+ /* TODO - fix this assertion */
+ $this->assertEquals( site_url( '?p=' . $post_id . '&pagenum=2' ), GravityView_API::directory_link() );
- $gravityview_view->post_id = $post_id;
+ $gravityview_view->setPostId( $post_id );
- //
- // TESTING AJAX
- //
+ //
+ // TESTING AJAX
+ //
define( 'DOING_AJAX', true );
// No passed post_id; use $_POST when DOING_AJAX is set
@@ -243,47 +286,14 @@ function test_directory_link( ) {
$_POST['post_id'] = $post_id;
// No passed post_id; use $_POST when DOING_AJAX is set
- $this->assertEquals( site_url('?p='.$post_id.'&pagenum=2'), GravityView_API::directory_link() );
-
- }
-
- function test_gravityview_get_current_views() {
- global $post;
-
- $fe = GravityView_frontend::getInstance();
-
- // Clear the data so that gravityview_get_current_views() runs parse_content()
- $fe->gv_output_data = NULL;
-
- $view_post_type_id = $this->_get_new_view_id();
- $post = get_post( $view_post_type_id );
-
- $current_views = gravityview_get_current_views();
-
- // When the view is added, the key is set to the View ID and the `id` is also set to that
- $this->assertEquals( $view_post_type_id, $current_views[ $view_post_type_id ]['id'] );
-
- // Just one View
- $this->assertEquals( 1, sizeof( $current_views ) );
-
- $second_view_post_type_id = $this->_get_new_view_id();
-
- $fe->gv_output_data->add_view( $second_view_post_type_id );
-
- $second_current_views = gravityview_get_current_views();
-
- // Check to make sure add_view worked properly
- $this->assertEquals( $second_view_post_type_id, $second_current_views[ $second_view_post_type_id ]['id'] );
-
- // Now two Views
- $this->assertEquals( 2, sizeof( $second_current_views ) );
+ $this->assertEquals( site_url( '?p=' . $post_id . '&pagenum=2' ), GravityView_API::directory_link() );
}
/**
- * @covers gravityview_sanitize_html_class()
+ *
*/
- function test_gravityview_sanitize_html_class() {
+ public function test_gravityview_sanitize_html_class() {
$classes = array(
@@ -297,13 +307,13 @@ function test_gravityview_sanitize_html_class() {
'example dash' => gravityview_sanitize_html_class( 'example dash' ),
// Implode with spaces
- 'example dash bar' => gravityview_sanitize_html_class( array('example', 'dash', 'bar' ) ),
+ 'example dash bar' => gravityview_sanitize_html_class( array( 'example', 'dash', 'bar' ) ),
// Again, don't strip spaces and implode
- 'example-dash bar' => gravityview_sanitize_html_class( array('example-dash', 'bar' ) ),
+ 'example-dash bar' => gravityview_sanitize_html_class( array( 'example-dash', 'bar' ) ),
// Don't strip numbers or caps
- 'Foo Bar0' => gravityview_sanitize_html_class( array('Foo', 'Bar0' ) ),
+ 'Foo Bar0' => gravityview_sanitize_html_class( array( 'Foo', 'Bar0' ) ),
// Strip not A-Z a-z 0-9 _ -
'Foo Bar2_-' => gravityview_sanitize_html_class( 'Foo Bar2!_-' ),
@@ -318,7 +328,7 @@ function test_gravityview_sanitize_html_class() {
/**
* @group api
*/
- function test_gravityview_format_link_DEFAULT() {
+ public function test_gravityview_format_link_DEFAULT() {
$urls = array(
@@ -354,49 +364,49 @@ function test_gravityview_format_link_DEFAULT() {
// Don't strip actual domain when using 2nd tier TLD
'http://example.ac.za' => 'example.ac.za',
- 'http://example.gov.za'=> 'example.gov.za',
- 'http://example.law.za'=> 'example.law.za',
- 'http://example.school.za'=> 'example.school.za',
- 'http://example.me.uk'=> 'example.me.uk',
- 'http://example.tm.fr'=> 'example.tm.fr',
- 'http://example.asso.fr'=> 'example.asso.fr',
- 'http://example.com.fr'=> 'example.com.fr',
- 'http://example.telememo.au'=> 'example.telememo.au',
- 'http://example.cg.yu'=> 'example.cg.yu',
- 'http://example.msk.ru'=> 'example.msk.ru',
- 'http://example.irkutsks.ru'=> 'example.irkutsks.ru',
- 'http://example.com.ru'=> 'example.com.ru',
- 'http://example.sa.au'=> 'example.sa.au',
- 'http://example.act.au'=> 'example.act.au',
- 'http://example.net.uk'=> 'example.net.uk',
- 'http://example.police.uk'=> 'example.police.uk',
- 'http://example.plc.uk'=> 'example.plc.uk',
- 'http://example.co.uk'=> 'example.co.uk',
- 'http://example.gov.uk'=> 'example.gov.uk',
- 'http://example.mod.uk'=> 'example.mod.uk',
+ 'http://example.gov.za' => 'example.gov.za',
+ 'http://example.law.za' => 'example.law.za',
+ 'http://example.school.za' => 'example.school.za',
+ 'http://example.me.uk' => 'example.me.uk',
+ 'http://example.tm.fr' => 'example.tm.fr',
+ 'http://example.asso.fr' => 'example.asso.fr',
+ 'http://example.com.fr' => 'example.com.fr',
+ 'http://example.telememo.au' => 'example.telememo.au',
+ 'http://example.cg.yu' => 'example.cg.yu',
+ 'http://example.msk.ru' => 'example.msk.ru',
+ 'http://example.irkutsks.ru' => 'example.irkutsks.ru',
+ 'http://example.com.ru' => 'example.com.ru',
+ 'http://example.sa.au' => 'example.sa.au',
+ 'http://example.act.au' => 'example.act.au',
+ 'http://example.net.uk' => 'example.net.uk',
+ 'http://example.police.uk' => 'example.police.uk',
+ 'http://example.plc.uk' => 'example.plc.uk',
+ 'http://example.co.uk' => 'example.co.uk',
+ 'http://example.gov.uk' => 'example.gov.uk',
+ 'http://example.mod.uk' => 'example.mod.uk',
// Strip subdomains in 2nd tier TLD
'http://demo.example.ac.za' => 'example.ac.za',
- 'http://demo.example.gov.za'=> 'example.gov.za',
- 'http://demo.example.law.za'=> 'example.law.za',
- 'http://demo.example.school.za'=> 'example.school.za',
- 'http://demo.example.me.uk'=> 'example.me.uk',
- 'http://demo.example.tm.fr'=> 'example.tm.fr',
- 'http://demo.example.asso.fr'=> 'example.asso.fr',
- 'http://demo.example.com.fr'=> 'example.com.fr',
- 'http://demo.example.telememo.au'=> 'example.telememo.au',
- 'http://demo.example.cg.yu'=> 'example.cg.yu',
- 'http://demo.example.msk.ru'=> 'example.msk.ru',
- 'http://demo.example.irkutsks.ru'=> 'example.irkutsks.ru',
- 'http://demo.example.com.ru'=> 'example.com.ru',
- 'http://demo.example.sa.au'=> 'example.sa.au',
- 'http://demo.example.act.au'=> 'example.act.au',
- 'http://demo.example.net.uk'=> 'example.net.uk',
- 'http://demo.example.police.uk'=> 'example.police.uk',
- 'http://demo.example.plc.uk'=> 'example.plc.uk',
- 'http://demo.example.co.uk'=> 'example.co.uk',
- 'http://demo.example.gov.uk'=> 'example.gov.uk',
- 'http://demo.example.mod.uk'=> 'example.mod.uk',
+ 'http://demo.example.gov.za' => 'example.gov.za',
+ 'http://demo.example.law.za' => 'example.law.za',
+ 'http://demo.example.school.za' => 'example.school.za',
+ 'http://demo.example.me.uk' => 'example.me.uk',
+ 'http://demo.example.tm.fr' => 'example.tm.fr',
+ 'http://demo.example.asso.fr' => 'example.asso.fr',
+ 'http://demo.example.com.fr' => 'example.com.fr',
+ 'http://demo.example.telememo.au' => 'example.telememo.au',
+ 'http://demo.example.cg.yu' => 'example.cg.yu',
+ 'http://demo.example.msk.ru' => 'example.msk.ru',
+ 'http://demo.example.irkutsks.ru' => 'example.irkutsks.ru',
+ 'http://demo.example.com.ru' => 'example.com.ru',
+ 'http://demo.example.sa.au' => 'example.sa.au',
+ 'http://demo.example.act.au' => 'example.act.au',
+ 'http://demo.example.net.uk' => 'example.net.uk',
+ 'http://demo.example.police.uk' => 'example.police.uk',
+ 'http://demo.example.plc.uk' => 'example.plc.uk',
+ 'http://demo.example.co.uk' => 'example.co.uk',
+ 'http://demo.example.gov.uk' => 'example.gov.uk',
+ 'http://demo.example.mod.uk' => 'example.mod.uk',
);
foreach ( $urls as $original => $expected ) {
@@ -412,7 +422,7 @@ function test_gravityview_format_link_DEFAULT() {
/**
* @group api
*/
- function test_gravityview_format_link_WHEN_FILTER_ROOTONLY_FALSE() {
+ public function test_gravityview_format_link_WHEN_FILTER_ROOTONLY_FALSE() {
// SET FILTER TO FALSE
add_filter( 'gravityview_anchor_text_rootonly', '__return_false' );
@@ -441,9 +451,8 @@ function test_gravityview_format_link_WHEN_FILTER_ROOTONLY_FALSE() {
/**
* @group api
- * @covers gravityview_format_link()
*/
- function test_gravityview_format_link_WHEN_FILTER_NOSUBDOMAIN_FALSE() {
+ public function test_gravityview_format_link_WHEN_FILTER_NOSUBDOMAIN_FALSE() {
// SET FILTER TO FALSE
add_filter( 'gravityview_anchor_text_nosubdomain', '__return_false' );
@@ -490,7 +499,7 @@ function test_gravityview_format_link_WHEN_FILTER_NOSUBDOMAIN_FALSE() {
/**
* @group api
*/
- function test_gravityview_format_link_WHEN_FILTER_NOQUERYSTRING_FALSE() {
+ public function test_gravityview_format_link_WHEN_FILTER_NOQUERYSTRING_FALSE() {
// SET FILTER TO FALSE
add_filter( 'gravityview_anchor_text_noquerystring', '__return_false' );
diff --git a/tests/connector-functions_Test.php b/tests/unit-tests/connector-functions_Test.php
similarity index 89%
rename from tests/connector-functions_Test.php
rename to tests/unit-tests/connector-functions_Test.php
index 5a47cfba5f..2d7b2f3d40 100644
--- a/tests/connector-functions_Test.php
+++ b/tests/unit-tests/connector-functions_Test.php
@@ -2,15 +2,8 @@
class GravityView_Connector_Functions_Test extends PHPUnit_Framework_TestCase {
- function setUp() {
- parent::setUp();
-
- GravityView_Plugin::getInstance();
- }
-
/**
* @group shortcode
- * @covers gravityview_has_shortcode_r()
*/
function test_gravityview_has_shortcode_r() {
diff --git a/tests/unit-tests/index.php b/tests/unit-tests/index.php
new file mode 100755
index 0000000000..62200328fd
--- /dev/null
+++ b/tests/unit-tests/index.php
@@ -0,0 +1,2 @@
+