diff --git a/.travis.yml b/.travis.yml index 5dc0c2e..dd4a26b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,7 +6,7 @@ language: php: - 5.6 - - 7.0 + - 7.1 env: - WP_VERSION=4.4 WP_MULTISITE=0 diff --git a/Gruntfile.js b/Gruntfile.js index b5dc20c..5007ce0 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,9 +29,12 @@ module.exports = function(grunt) { files: [{ expand: true, cwd: 'assets/css', - src: ['*.css', '!*.min.css'], + src: ['*.css', '!*.min.css', '!*.timepicker.css'], dest: 'assets/css', ext: '.min.css' + }, + { + 'assets/css/jquery.timepicker.min.css': ['assets/css/jquery.timepicker.css'] }] } }, @@ -45,8 +48,13 @@ module.exports = function(grunt) { cwd: 'assets/js', dest: 'assets/js', ext: '.min.js', - src: ['*.js', '!*.min.js'] - } + src: ['*.js', '!*.min.js', '!*.timepicker.js'] + }, + timepicker: { + files: { + 'assets/js/jquery.timepicker.min.js': ['assets/js/jquery.timepicker.js'] + } + }, }, watch: { @@ -59,7 +67,7 @@ module.exports = function(grunt) { tasks: ['cssmin'] }, uglify: { - files: ['*.js', '!*.js.css'], + files: ['*.js', '!*.min.js'], options: { cwd: 'assets/js', nospawn: true diff --git a/assets/css/admin.css b/assets/css/admin.css index 7584bcd..d851613 100644 --- a/assets/css/admin.css +++ b/assets/css/admin.css @@ -2,7 +2,6 @@ * Form fields */ .wpcw-widget .form { - overflow: auto; margin-bottom: 1em; } .wpcw-widget .title { @@ -93,3 +92,105 @@ .wpcw-widget-social .icons a.inactive:not(:hover) { color: #ccc; } + +/** + * Hours of Operation Widget + */ +.wpcw-widget-hours .day-row { + display: inline-block; + width: 100%; + padding: 6px 0; + border-bottom: 1px solid #e5e5e5; +} + +.wpcw-widget-hours [class~='day-row']:last-of-type { + margin-bottom: 1em; + border-bottom: none; +} + +.wpcw-widget-hours .day-row-top { + padding: 6px 0; +} + +.wpcw-widget-hours .day-row-top:hover { + cursor: pointer; +} + +.wpcw-widget-hours .day-row-top strong { + font-weight: 500; +} + +.wpcw-widget-hours .toggle-icon { + float: right; + margin-top: -3px; +} + +.wpcw-widget-hours .status-open-label, +.wpcw-widget-hours .status-closed-label { + float: right; + width: 40%; + margin-right: 5px; + font-weight: 500; + font-size: 12px; + text-transform: uppercase; +} + +.wpcw-widget-hours .status-open-label { + color: #59CE45; +} + +.wpcw-widget-hours .status-closed-label { + opacity: 0.5; +} + +.wpcw-widget-hours .day-row.status-open .status-open-label, +.wpcw-widget-hours .day-row.status-closed .status-closed-label { + display: block; +} + +.wpcw-widget-hours .day-row.status-open .status-closed-label, +.wpcw-widget-hours .day-row.status-closed .status-open-label { + display: none; +} + +.wpcw-widget-hours .day-row-container { + display: none; + float: left; + width: 100%; + margin: 10px 0 6px; +} + +.wpcw-widget-hours .time-block { + width: 100%; + float: left; + margin-bottom: 10px; +} + +.wpcw-widget-hours .day-row-container div:last-of-type { + margin-bottom: 15px; +} + +.wpcw-widget-hours .time-block .timeselect { + width: calc(40% - 5px); + margin-right: 5px; + min-height: 28px; +} + +.wpcw-widget-hours .time-block .button { + width: calc(19% - 5px); + font-size: 18px; + text-align: center; + line-height: 1.2; +} + +.wpcw-widget-hours .apply-to-all { + float: left; +} + +.wpcw-widget-hours .status-closed-checkbox { + float: right; +} + +.wpcw-widget-hours .status-closed-checkbox input { + margin: 0px 0 0 5px; +} diff --git a/assets/css/admin.min.css b/assets/css/admin.min.css index eb25d7e..96fc059 100644 --- a/assets/css/admin.min.css +++ b/assets/css/admin.min.css @@ -1 +1 @@ -.wpcw-widget .form{overflow:auto;margin-bottom:1em}.wpcw-widget .title{margin-top:1em}.wpcw-widget .form p{margin:0 0 10px}.wpcw-widget .form p.sortable-placeholder{margin:0 0 8px}.wpcw-widget .form label i{margin:0 7px 0 3px}.wpcw-widget .form>p>span{display:table;width:100%}.wpcw-widget .form>p textarea{min-height:80px;resize:none;vertical-align:top}.wpcw-widget .form.ui-sortable>p .widefat{display:table-cell;width:100%}.wpcw-widget .form.ui-sortable .wpcw-widget-sortable-handle{display:table-cell;position:relative;width:25px;background-color:#f7f7f7;border:1px solid #ddd;border-left:none;cursor:row-resize;cursor:grab;cursor:-moz-grab;cursor:-webkit-grab;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.04);-moz-box-shadow:0 1px 1px rgba(0,0,0,.04);box-shadow:0 1px 1px rgba(0,0,0,.04)}.wpcw-widget .form.ui-sortable .ui-sortable-helper *,.wpcw-widget .form.ui-sortable .wpcw-widget-sortable-handle:active{cursor:row-resize;cursor:grabbing;cursor:-moz-grabbing;cursor:-webkit-grabbing}.wpcw-widget .form.ui-sortable span.dashicons{position:absolute;margin:auto;top:0;right:0;bottom:0;left:0;overflow:auto;font-size:18px;color:#a0a5aa}.wpcw-widget .form.ui-sortable span.dashicons:before{position:relative;top:1px}.wpcw-widget .default-fields{display:none}.wpcw-widget-social .icons{margin:10px 0}.wpcw-widget-social .icons a{margin:5px;font-size:20px;display:inline-block}.wpcw-widget-social .icons a:focus{box-shadow:none}.wpcw-widget-social .icons a.inactive:not(:hover){color:#ccc} \ No newline at end of file +.wpcw-widget .form{margin-bottom:1em}.wpcw-widget .title{margin-top:1em}.wpcw-widget .form p{margin:0 0 10px}.wpcw-widget .form p.sortable-placeholder{margin:0 0 8px}.wpcw-widget .form label i{margin:0 7px 0 3px}.wpcw-widget .form>p>span{display:table;width:100%}.wpcw-widget .form>p textarea{min-height:80px;resize:none;vertical-align:top}.wpcw-widget .form.ui-sortable>p .widefat{display:table-cell;width:100%}.wpcw-widget .form.ui-sortable .wpcw-widget-sortable-handle{display:table-cell;position:relative;width:25px;background-color:#f7f7f7;border:1px solid #ddd;border-left:none;cursor:row-resize;cursor:grab;cursor:-moz-grab;cursor:-webkit-grab;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.04);-moz-box-shadow:0 1px 1px rgba(0,0,0,.04);box-shadow:0 1px 1px rgba(0,0,0,.04)}.wpcw-widget .form.ui-sortable .ui-sortable-helper *,.wpcw-widget .form.ui-sortable .wpcw-widget-sortable-handle:active{cursor:row-resize;cursor:grabbing;cursor:-moz-grabbing;cursor:-webkit-grabbing}.wpcw-widget .form.ui-sortable span.dashicons{position:absolute;margin:auto;top:0;right:0;bottom:0;left:0;overflow:auto;font-size:18px;color:#a0a5aa}.wpcw-widget .form.ui-sortable span.dashicons:before{position:relative;top:1px}.wpcw-widget .default-fields{display:none}.wpcw-widget-social .icons{margin:10px 0}.wpcw-widget-social .icons a{margin:5px;font-size:20px;display:inline-block}.wpcw-widget-social .icons a:focus{box-shadow:none}.wpcw-widget-social .icons a.inactive:not(:hover){color:#ccc}.wpcw-widget-hours .day-row{display:inline-block;width:100%;padding:6px 0;border-bottom:1px solid #e5e5e5}.wpcw-widget-hours [class~=day-row]:last-of-type{margin-bottom:1em;border-bottom:none}.wpcw-widget-hours .day-row-top{padding:6px 0}.wpcw-widget-hours .day-row-top:hover{cursor:pointer}.wpcw-widget-hours .day-row-top strong{font-weight:500}.wpcw-widget-hours .toggle-icon{float:right;margin-top:-3px}.wpcw-widget-hours .status-closed-label,.wpcw-widget-hours .status-open-label{float:right;width:40%;margin-right:5px;font-weight:500;font-size:12px;text-transform:uppercase}.wpcw-widget-hours .status-open-label{color:#59CE45}.wpcw-widget-hours .status-closed-label{opacity:.5}.wpcw-widget-hours .day-row.status-closed .status-closed-label,.wpcw-widget-hours .day-row.status-open .status-open-label{display:block}.wpcw-widget-hours .day-row.status-closed .status-open-label,.wpcw-widget-hours .day-row.status-open .status-closed-label{display:none}.wpcw-widget-hours .day-row-container{display:none;float:left;width:100%;margin:10px 0 6px}.wpcw-widget-hours .time-block{width:100%;float:left;margin-bottom:10px}.wpcw-widget-hours .day-row-container div:last-of-type{margin-bottom:15px}.wpcw-widget-hours .time-block .timeselect{width:calc(40% - 5px);margin-right:5px;min-height:28px}.wpcw-widget-hours .time-block .button{width:calc(19% - 5px);font-size:18px;text-align:center;line-height:1.2}.wpcw-widget-hours .apply-to-all{float:left}.wpcw-widget-hours .status-closed-checkbox{float:right}.wpcw-widget-hours .status-closed-checkbox input{margin:0 0 0 5px} \ No newline at end of file diff --git a/assets/css/jquery.timepicker.css b/assets/css/jquery.timepicker.css new file mode 100755 index 0000000..cd75f13 --- /dev/null +++ b/assets/css/jquery.timepicker.css @@ -0,0 +1,72 @@ +.ui-timepicker-wrapper { + overflow-y: auto; + height: 150px; + width: 6.5em; + background: #fff; + border: 1px solid #ddd; + -webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2); + -moz-box-shadow:0 5px 10px rgba(0,0,0,0.2); + box-shadow:0 5px 10px rgba(0,0,0,0.2); + outline: none; + z-index: 10001; + margin: 0; +} + +.ui-timepicker-wrapper.ui-timepicker-with-duration { + width: 13em; +} + +.ui-timepicker-wrapper.ui-timepicker-with-duration.ui-timepicker-step-30, +.ui-timepicker-wrapper.ui-timepicker-with-duration.ui-timepicker-step-60 { + width: 11em; +} + +.ui-timepicker-list { + margin: 0; + padding: 0; + list-style: none; +} + +.ui-timepicker-duration { + margin-left: 5px; color: #888; +} + +.ui-timepicker-list:hover .ui-timepicker-duration { + color: #888; +} + +.ui-timepicker-list li { + padding: 3px 0 3px 5px; + cursor: pointer; + white-space: nowrap; + color: #000; + list-style: none; + margin: 0; +} + +.ui-timepicker-list:hover .ui-timepicker-selected { + background: #fff; color: #000; +} + +li.ui-timepicker-selected, +.ui-timepicker-list li:hover, +.ui-timepicker-list .ui-timepicker-selected:hover { + background: #1980EC; color: #fff; +} + +li.ui-timepicker-selected .ui-timepicker-duration, +.ui-timepicker-list li:hover .ui-timepicker-duration { + color: #ccc; +} + +.ui-timepicker-list li.ui-timepicker-disabled, +.ui-timepicker-list li.ui-timepicker-disabled:hover, +.ui-timepicker-list li.ui-timepicker-selected.ui-timepicker-disabled { + color: #888; + cursor: default; +} + +.ui-timepicker-list li.ui-timepicker-disabled:hover, +.ui-timepicker-list li.ui-timepicker-selected.ui-timepicker-disabled { + background: #f2f2f2; +} diff --git a/assets/css/jquery.timepicker.min.css b/assets/css/jquery.timepicker.min.css new file mode 100644 index 0000000..a956b91 --- /dev/null +++ b/assets/css/jquery.timepicker.min.css @@ -0,0 +1 @@ +.ui-timepicker-wrapper{overflow-y:auto;height:150px;width:6.5em;background:#fff;border:1px solid #ddd;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);outline:0;z-index:10001;margin:0}.ui-timepicker-wrapper.ui-timepicker-with-duration{width:13em}.ui-timepicker-wrapper.ui-timepicker-with-duration.ui-timepicker-step-30,.ui-timepicker-wrapper.ui-timepicker-with-duration.ui-timepicker-step-60{width:11em}.ui-timepicker-list{margin:0;padding:0;list-style:none}.ui-timepicker-duration{margin-left:5px;color:#888}.ui-timepicker-list:hover .ui-timepicker-duration{color:#888}.ui-timepicker-list li{padding:3px 0 3px 5px;cursor:pointer;white-space:nowrap;color:#000;list-style:none;margin:0}.ui-timepicker-list:hover .ui-timepicker-selected{background:#fff;color:#000}.ui-timepicker-list .ui-timepicker-selected:hover,.ui-timepicker-list li:hover,li.ui-timepicker-selected{background:#1980EC;color:#fff}.ui-timepicker-list li:hover .ui-timepicker-duration,li.ui-timepicker-selected .ui-timepicker-duration{color:#ccc}.ui-timepicker-list li.ui-timepicker-disabled,.ui-timepicker-list li.ui-timepicker-disabled:hover,.ui-timepicker-list li.ui-timepicker-selected.ui-timepicker-disabled{color:#888;cursor:default}.ui-timepicker-list li.ui-timepicker-disabled:hover,.ui-timepicker-list li.ui-timepicker-selected.ui-timepicker-disabled{background:#f2f2f2} \ No newline at end of file diff --git a/assets/css/style.css b/assets/css/style.css index e14d2ad..5ca6b86 100644 --- a/assets/css/style.css +++ b/assets/css/style.css @@ -1,17 +1,21 @@ .wpcw-widget-contact ul, -.wpcw-widget-social ul { +.wpcw-widget-social ul, +.wpcw-widget-hours ul { margin: 0; padding: 0; list-style: none; } .wpcw-widget-contact ul li, -.wpcw-widget-social ul li.has-label { +.wpcw-widget-social ul li.has-label, +.wpcw-widget-hours ul li { padding: 10px 0; } .wpcw-widget-contact ul li:before, .wpcw-widget-contact ul li:after, .wpcw-widget-social ul li:before, -.wpcw-widget-social ul li:after { +.wpcw-widget-social ul li:after, +.wpcw-widget-hours ul li:before, +.wpcw-widget-hours ul li:after { display: none; } .wpcw-widget-contact ul li div { @@ -22,9 +26,21 @@ margin: 0 0.75em 0.75em 0; border: none; } -.wpcw-widget-social ul li.has-label a { +.wpcw-widget-social ul li.has-label a, +.wpcw-widget-hours ul li strong.day, +.wpcw-widget-hours ul li time { display: block; } .wpcw-widget-social ul li.has-label span { margin-right: 0.25em; } +.wpcw-widget-hours .wpcw-open-sign { + font-weight: bold; + text-transform: uppercase; +} +.wpcw-widget-hours .wpcw-open-sign.open { + color: #32cd32; +} +.wpcw-widget-hours .wpcw-open-sign.closed { + color: #ccc; +} diff --git a/assets/css/style.min.css b/assets/css/style.min.css index 261bb1c..ba7e166 100644 --- a/assets/css/style.min.css +++ b/assets/css/style.min.css @@ -1 +1 @@ -.wpcw-widget-contact ul,.wpcw-widget-social ul{margin:0;padding:0;list-style:none}.wpcw-widget-contact ul li,.wpcw-widget-social ul li.has-label{padding:10px 0}.wpcw-widget-contact ul li:after,.wpcw-widget-contact ul li:before,.wpcw-widget-social ul li:after,.wpcw-widget-social ul li:before{display:none}.wpcw-widget-contact ul li div{display:inline}.wpcw-widget-social ul li:not(.has-label){display:inline-block;margin:0 .75em .75em 0;border:none}.wpcw-widget-social ul li.has-label a{display:block}.wpcw-widget-social ul li.has-label span{margin-right:.25em} \ No newline at end of file +.wpcw-widget-contact ul,.wpcw-widget-hours ul,.wpcw-widget-social ul{margin:0;padding:0;list-style:none}.wpcw-widget-contact ul li,.wpcw-widget-hours ul li,.wpcw-widget-social ul li.has-label{padding:10px 0}.wpcw-widget-contact ul li:after,.wpcw-widget-contact ul li:before,.wpcw-widget-hours ul li:after,.wpcw-widget-hours ul li:before,.wpcw-widget-social ul li:after,.wpcw-widget-social ul li:before{display:none}.wpcw-widget-contact ul li div{display:inline}.wpcw-widget-social ul li:not(.has-label){display:inline-block;margin:0 .75em .75em 0;border:none}.wpcw-widget-hours ul li strong.day,.wpcw-widget-hours ul li time,.wpcw-widget-social ul li.has-label a{display:block}.wpcw-widget-social ul li.has-label span{margin-right:.25em}.wpcw-widget-hours .wpcw-open-sign{font-weight:700;text-transform:uppercase}.wpcw-widget-hours .wpcw-open-sign.open{color:#32cd32}.wpcw-widget-hours .wpcw-open-sign.closed{color:#ccc} \ No newline at end of file diff --git a/assets/js/admin.js b/assets/js/admin.js index 3146e04..c10cf86 100644 --- a/assets/js/admin.js +++ b/assets/js/admin.js @@ -37,7 +37,7 @@ function start_sortable() { - var $contact_form = $( '.wpcw-widget .form' ); + var $contact_form = $( '.wpcw-widget .form' ).not( '.wpcw-widget-hours .form' ); $contact_form.sortable( { items : '> *:not(.not-sortable)', @@ -48,6 +48,9 @@ tolerance: 'pointer', forcePlaceholderSize: true, cursorAt: { top: 40 }, + start: function( e, ui ) { + ui.placeholder.height( ui.helper.height() ); + }, stop: function ( e, ui ) { // Trigger change for customizer $contact_form.find( '.customizer_update' ).val( ui.item.index() ).trigger( 'change' ); @@ -56,6 +59,33 @@ } + function initialize_timepicker() { + + $( '.timeselect' ).timepicker( { + 'timeFormat': wpcw_admin.time_format + } ); + + var timePicker = { + + changeTime: function() { + + $( this ).attr( 'value', $(this).val() ); + + }, + + showPicker: function() { + + $( '.ui-timepicker-wrapper' ).css( 'width', $( this ).innerWidth() + 'px' ); + + } + + }; + + $( '.timeselect' ).on( 'changeTime', timePicker.changeTime ); + $( '.timeselect' ).on( 'showTimepicker', timePicker.showPicker ); + + } + var socialField = { $btn: null, @@ -161,15 +191,246 @@ }; + var dayRow = { + + toggle: function ( e ) { + + e.preventDefault(); + + var $day = $( this ).closest( '.day-row' ), + $container = $day.find( '.day-row-container' ); + + if ( $container.is( ':animated' ) ) { + + return false; + + } + + var $icon = $day.find( '.toggle-icon' ), + active = $day.hasClass( 'active' ); + + if ( ! active ) { + + $icon + .toggleClass( 'dashicons-arrow-down' ) + .toggleClass( 'dashicons-arrow-up' ); + + } + + $container.slideToggle( 'fast', function () { + + if ( active ) { + + $icon + .toggleClass( 'dashicons-arrow-down' ) + .toggleClass( 'dashicons-arrow-up' ); + + } + + $day.toggleClass( 'active' ); + + } ); + + }, + + maybeBlockSelect: function ( e ) { + + var $day = $( this ).closest( '.day-row' ); + + if ( $day.hasClass( 'status-closed' ) ) { + + e.preventDefault(); + + } + + }, + + addBlock: function ( e ) { + + e.preventDefault(); + + if ( $( this ).hasClass( 'disabled' ) ) { + + return false; + + } + + var $block = $( this ).closest( '.time-block' ), + $clone = dayRow.cloneTimeBlock( $block, $block.parent() ); + + $clone.find( 'a.button' ).attr( 'data-action', 'remove' ).text( '-' ); + + $( this ).hide(); + + initialize_timepicker(); + + }, + + removeBlock: function ( e ) { + + e.preventDefault(); + + if ( $( this ).hasClass( 'disabled' ) ) { + + return false; + + } + + var $block = $( this ).closest( '.time-block' ); + + $block.prev( '.time-block' ).find( 'a.button' ).show(); + + $block.remove(); + + }, + + applyToAll: function ( e ) { + + e.preventDefault(); + + var $day = $( this ).closest( '.day-row' ), + $widget = $day.closest( '.wpcw-widget' ), + $animating = $widget.find( '.day-row' ).filter( function() { return $( this ).is( ':animated' ); } ); + + if ( $animating.length > 0 ) { + + return false; + + } + + if ( $day.hasClass( 'status-closed' ) ) { + + $widget.find( '.status-closed-checkbox input:not(:checked)' ).not( this ).trigger( 'click' ); + + } else { + + $widget.find( '.status-closed-checkbox input:checked' ).not( this ).trigger( 'click' ); + + } + + var $blocks = $day.find( '.time-block' ); + + $widget.find( '.day-row' ).not( $day ).each( function() { + + var $target = $( this ).find( '.time-blocks' ); + + $target.empty(); + + $blocks.each( function() { + + dayRow.cloneTimeBlock( $( this ), $target, true, true ); + + } ); + + } ); + + initialize_timepicker(); + + }, + + cloneTimeBlock: function ( $block, $target, deep, flashDay ) { + + var $day = $block.closest( '.day-row' ), + day = parseInt( $day.attr( 'data-day' ), 10 ), + target_day = parseInt( $target.closest( '.day-row' ).attr( 'data-day' ), 10 ), + block = parseInt( $block.attr( 'data-time-block' ), 10 ), + target_block = $target.is( ':empty' ) ? 0 : parseInt( $target.find( '.time-block' ).last().attr( 'data-time-block' ), 10 ) + 1, + deep = deep || false, // jshint ignore:line + flashDay = flashDay || false, // jshint ignore:line + $clone = $block.clone( deep ), + html = $clone.html(), + name_search = '\\[schedule\\]\\[' + day + '\\]\\[blocks\\]\\[' + block + '\\]', + name_replace = '[schedule][' + target_day + '][blocks][' + target_block + ']', + id_search = 'schedule-' + day + '-blocks-' + block, + id_replace = 'schedule-' + target_day + '-blocks-' + target_block; + + html = html.replace( new RegExp( name_search, 'g' ), name_replace ), + html = html.replace( new RegExp( id_search, 'g' ), id_replace ), + + $clone = $clone.html( html ); + + if ( deep ) { + + $clone.find( 'select' ).each( function() { + + var classes = $( this ) + .attr( 'class' ) + .split( ' ' ) + .map( function ( v ) { + return v.trim(); + } ) + .join( '.' ); + + $( this ).val( $block.find( 'select.' + classes ).val() ); + + } ); + + } + + $target.append( $clone ); + + $clone.attr( 'data-time-block', target_block ); + + if ( flashDay ) { + + $clone.closest( '.day-row' ).fadeTo( 50, 0.1, function() { + + $( this ).fadeTo( 500, 1.0 ); + + } ); + + } + + return $clone; + + }, + + toggleClosed: function () { + + var $day = $( this ).closest( '.day-row' ), + closed = $day.hasClass( 'status-closed' ); + + $day.toggleClass( 'status-closed' ).toggleClass( 'status-open' ); + + $day.find( 'a.button' ).toggleClass( 'disabled', ! closed ); + + $day.find( '.timeselect' ).toggleClass( 'disabled', ! closed ); + + } + + }; + $( document ).ready( function ( $ ) { + initialize_timepicker(); + // Social $( document ).on( 'click', '.wpcw-widget-social .icons a', socialField.init ); + // Hours of Operation + $( document ).on( 'click', '.wpcw-widget-hours .day-row-top', dayRow.toggle ); + $( document ).on( 'mousedown', '.wpcw-widget-hours .time-block select', dayRow.maybeBlockSelect ); + $( document ).on( 'click', '.wpcw-widget-hours .time-block a.button[data-action="add"]', dayRow.addBlock ); + $( document ).on( 'click', '.wpcw-widget-hours .time-block a.button[data-action="remove"]', dayRow.removeBlock ); + $( document ).on( 'click', '.wpcw-widget-hours .apply-to-all', dayRow.applyToAll ); + $( document ).on( 'change', '.wpcw-widget-hours .status-closed-checkbox input', dayRow.toggleClosed ); + // Sortable - $( document ).on( 'wpcw.change', start_sortable ); + $( document ).on( 'wpcw.change', function() { + + start_sortable(); + + initialize_timepicker(); + + } ); $( document ).on( 'click.widgets-toggle', start_sortable ); - $( document ).on( 'widget-updated', start_sortable ); + $( document ).on( 'widget-updated', function() { + + start_sortable(); + + initialize_timepicker(); + + } ); } ); diff --git a/assets/js/admin.min.js b/assets/js/admin.min.js index cf4c018..8fb5e6c 100644 --- a/assets/js/admin.min.js +++ b/assets/js/admin.min.js @@ -1 +1 @@ -!function(a){function b(){var b=a(".wpcw-widget .form");b.sortable({items:"> *:not(.not-sortable)",handle:".wpcw-widget-sortable-handle",containment:"parent",placeholder:"sortable-placeholder",axis:"y",tolerance:"pointer",forcePlaceholderSize:!0,cursorAt:{top:40},stop:function(a,c){b.find(".customizer_update").val(c.item.index()).trigger("change")}})}a.fn.selectString=function(b){var c=a(this)[0],d=c.value.indexOf(b),e=d+b.length;if(c&&!(0>d))if(c.setSelectionRange)c.focus(),c.setSelectionRange(d,e);else if(c.createTextRange){var f=c.createTextRange();f.collapse(!0),f.moveEnd("character",e),f.moveStart("character",d),f.select()}else c.selectionStart&&(c.selectionStart=d,c.selectionEnd=e)};var c={$btn:null,$widget:null,$template:null,init:function(b){b.preventDefault();var d=c;return d.$btn=a(this),d.$widget=d.$btn.parents(".wpcw-widget"),d.$widget.find("."+d.$btn.data("key")).is(":animated")?!1:d.$btn.hasClass("inactive")?(d.$template=d.$widget.find(".default-fields"),d.$template=a(a.trim(d.$template.clone().html())),void d.add()):void d.remove()},add:function(){this.$btn.removeClass("inactive");var a=this.$btn.data();this.$template.addClass(a.key).find("label").prop("for",a.id),this.$template.find("input").prop("id",a.id).prop("name",a.name).prop("value",a.value),this.$template.find("label span.fa").prop("class",this.$btn.find("i").attr("class")),this.$template.find("label span.text").text(a.label),this.$template.hide().prependTo(this.$widget.find(".form")).stop(!0,!0).animate({height:"toggle",opacity:"toggle"},250),this.$template.find("input").selectString(a.select),this.update_customizer()},remove:function(){this.$btn.addClass("inactive"),this.$widget.find(".form ."+this.$btn.data("key")).stop(!0,!0).animate({height:"toggle",opacity:"toggle"},250,function(){a(this).remove()}),this.update_customizer()},update_customizer:function(){var a=this.$widget.find("div > div").length;this.$widget.find(".customizer_update").val(a).trigger("change")}};a(document).ready(function(a){a(document).on("click",".wpcw-widget-social .icons a",c.init),a(document).on("wpcw.change",b),a(document).on("click.widgets-toggle",b),a(document).on("widget-updated",b)})}(jQuery); \ No newline at end of file +!function(a){function b(){var b=a(".wpcw-widget .form").not(".wpcw-widget-hours .form");b.sortable({items:"> *:not(.not-sortable)",handle:".wpcw-widget-sortable-handle",containment:"parent",placeholder:"sortable-placeholder",axis:"y",tolerance:"pointer",forcePlaceholderSize:!0,cursorAt:{top:40},start:function(a,b){b.placeholder.height(b.helper.height())},stop:function(a,c){b.find(".customizer_update").val(c.item.index()).trigger("change")}})}function c(){a(".timeselect").timepicker({timeFormat:wpcw_admin.time_format});var b={changeTime:function(){a(this).attr("value",a(this).val())},showPicker:function(){a(".ui-timepicker-wrapper").css("width",a(this).innerWidth()+"px")}};a(".timeselect").on("changeTime",b.changeTime),a(".timeselect").on("showTimepicker",b.showPicker)}a.fn.selectString=function(b){var c=a(this)[0],d=c.value.indexOf(b),e=d+b.length;if(c&&!(0>d))if(c.setSelectionRange)c.focus(),c.setSelectionRange(d,e);else if(c.createTextRange){var f=c.createTextRange();f.collapse(!0),f.moveEnd("character",e),f.moveStart("character",d),f.select()}else c.selectionStart&&(c.selectionStart=d,c.selectionEnd=e)};var d={$btn:null,$widget:null,$template:null,init:function(b){b.preventDefault();var c=d;return c.$btn=a(this),c.$widget=c.$btn.parents(".wpcw-widget"),c.$widget.find("."+c.$btn.data("key")).is(":animated")?!1:c.$btn.hasClass("inactive")?(c.$template=c.$widget.find(".default-fields"),c.$template=a(a.trim(c.$template.clone().html())),void c.add()):void c.remove()},add:function(){this.$btn.removeClass("inactive");var a=this.$btn.data();this.$template.addClass(a.key).find("label").prop("for",a.id),this.$template.find("input").prop("id",a.id).prop("name",a.name).prop("value",a.value),this.$template.find("label span.fa").prop("class",this.$btn.find("i").attr("class")),this.$template.find("label span.text").text(a.label),this.$template.hide().prependTo(this.$widget.find(".form")).stop(!0,!0).animate({height:"toggle",opacity:"toggle"},250),this.$template.find("input").selectString(a.select),this.update_customizer()},remove:function(){this.$btn.addClass("inactive"),this.$widget.find(".form ."+this.$btn.data("key")).stop(!0,!0).animate({height:"toggle",opacity:"toggle"},250,function(){a(this).remove()}),this.update_customizer()},update_customizer:function(){var a=this.$widget.find("div > div").length;this.$widget.find(".customizer_update").val(a).trigger("change")}},e={toggle:function(b){b.preventDefault();var c=a(this).closest(".day-row"),d=c.find(".day-row-container");if(d.is(":animated"))return!1;var e=c.find(".toggle-icon"),f=c.hasClass("active");f||e.toggleClass("dashicons-arrow-down").toggleClass("dashicons-arrow-up"),d.slideToggle("fast",function(){f&&e.toggleClass("dashicons-arrow-down").toggleClass("dashicons-arrow-up"),c.toggleClass("active")})},maybeBlockSelect:function(b){var c=a(this).closest(".day-row");c.hasClass("status-closed")&&b.preventDefault()},addBlock:function(b){if(b.preventDefault(),a(this).hasClass("disabled"))return!1;var d=a(this).closest(".time-block"),f=e.cloneTimeBlock(d,d.parent());f.find("a.button").attr("data-action","remove").text("-"),a(this).hide(),c()},removeBlock:function(b){if(b.preventDefault(),a(this).hasClass("disabled"))return!1;var c=a(this).closest(".time-block");c.prev(".time-block").find("a.button").show(),c.remove()},applyToAll:function(b){b.preventDefault();var d=a(this).closest(".day-row"),f=d.closest(".wpcw-widget"),g=f.find(".day-row").filter(function(){return a(this).is(":animated")});if(g.length>0)return!1;d.hasClass("status-closed")?f.find(".status-closed-checkbox input:not(:checked)").not(this).trigger("click"):f.find(".status-closed-checkbox input:checked").not(this).trigger("click");var h=d.find(".time-block");f.find(".day-row").not(d).each(function(){var b=a(this).find(".time-blocks");b.empty(),h.each(function(){e.cloneTimeBlock(a(this),b,!0,!0)})}),c()},cloneTimeBlock:function(b,c,d,e){var f=b.closest(".day-row"),g=parseInt(f.attr("data-day"),10),h=parseInt(c.closest(".day-row").attr("data-day"),10),i=parseInt(b.attr("data-time-block"),10),j=c.is(":empty")?0:parseInt(c.find(".time-block").last().attr("data-time-block"),10)+1,d=d||!1,e=e||!1,k=b.clone(d),l=k.html(),m="\\[schedule\\]\\["+g+"\\]\\[blocks\\]\\["+i+"\\]",n="[schedule]["+h+"][blocks]["+j+"]",o="schedule-"+g+"-blocks-"+i,p="schedule-"+h+"-blocks-"+j;return l=l.replace(new RegExp(m,"g"),n),l=l.replace(new RegExp(o,"g"),p),k=k.html(l),d&&k.find("select").each(function(){var c=a(this).attr("class").split(" ").map(function(a){return a.trim()}).join(".");a(this).val(b.find("select."+c).val())}),c.append(k),k.attr("data-time-block",j),e&&k.closest(".day-row").fadeTo(50,.1,function(){a(this).fadeTo(500,1)}),k},toggleClosed:function(){var b=a(this).closest(".day-row"),c=b.hasClass("status-closed");b.toggleClass("status-closed").toggleClass("status-open"),b.find("a.button").toggleClass("disabled",!c),b.find(".timeselect").toggleClass("disabled",!c)}};a(document).ready(function(a){c(),a(document).on("click",".wpcw-widget-social .icons a",d.init),a(document).on("click",".wpcw-widget-hours .day-row-top",e.toggle),a(document).on("mousedown",".wpcw-widget-hours .time-block select",e.maybeBlockSelect),a(document).on("click",'.wpcw-widget-hours .time-block a.button[data-action="add"]',e.addBlock),a(document).on("click",'.wpcw-widget-hours .time-block a.button[data-action="remove"]',e.removeBlock),a(document).on("click",".wpcw-widget-hours .apply-to-all",e.applyToAll),a(document).on("change",".wpcw-widget-hours .status-closed-checkbox input",e.toggleClosed),a(document).on("wpcw.change",function(){b(),c()}),a(document).on("click.widgets-toggle",b),a(document).on("widget-updated",function(){b(),c()})})}(jQuery); \ No newline at end of file diff --git a/assets/js/hours.js b/assets/js/hours.js new file mode 100644 index 0000000..8dd756d --- /dev/null +++ b/assets/js/hours.js @@ -0,0 +1,58 @@ +/* globals wpcw_hours */ +( function ( $ ) { + + var hoursWidget = { + + init: function() { + + var date = new Date(), + gmt = date.getTime() + ( date.getTimezoneOffset() * 60000 ), // Offset in milliseconds + site = new Date( gmt + parseInt( wpcw_hours.gmt_offset, 10 ) ), + day = site.getDay(), + now = site.getHours() + ':' + site.getMinutes(); + + $( '.widget.wpcw-widget-hours' ).each( function() { + + var schedule = window[ $( this ).prop( 'id' ).replace( '-', '_' ) ], // Get global var for this instance + is_open = hoursWidget.isOpen( schedule[ day ].open, now ), + $sign = $( this ).find( '.wpcw-open-sign' ); + + hoursWidget.display( is_open, $sign ); + + } ); + + }, + + isOpen: function ( times, now ) { + + var i = 0; + + do { + + is_open = ( Object.keys( times )[ i ] <= now && now <= Object.values( times )[ i ] ); + + i++; + + } + while ( i < Object.keys( times ).length && ! is_open ); + + return is_open; + + }, + + display: function ( is_open, $sign ) { + + var string = ( is_open ) ? wpcw_hours.i18n.open : wpcw_hours.i18n.closed; + + $sign + .toggleClass( 'open', is_open ) + .toggleClass( 'closed', ! is_open ) + .text( string ); + + } + + }; + + hoursWidget.init(); + +} )( jQuery ); diff --git a/assets/js/hours.min.js b/assets/js/hours.min.js new file mode 100644 index 0000000..520a3ca --- /dev/null +++ b/assets/js/hours.min.js @@ -0,0 +1 @@ +!function(a){var b={init:function(){var c=new Date,d=c.getTime()+6e4*c.getTimezoneOffset(),e=new Date(d+parseInt(wpcw_hours.gmt_offset,10)),f=e.getDay(),g=e.getHours()+":"+e.getMinutes();a(".widget.wpcw-widget-hours").each(function(){var c=window[a(this).prop("id").replace("-","_")],d=b.isOpen(c[f].open,g),e=a(this).find(".wpcw-open-sign");b.display(d,e)})},isOpen:function(a,b){var c=0;do is_open=Object.keys(a)[c]<=b&&b<=Object.values(a)[c],c++;while(c