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("");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("");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 $('
 '+gvSearchVar.label_searchfield+''+gvSearchVar.label_inputtype+' 
')},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(''; - $output .= ''; - $output .= ''; - $output .= ''; - $output .= ''; + $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( '', $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', ' | ' ); + ?> 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 (Floaty loves you!) -[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 @@ +