diff --git a/assets/css/style.css b/assets/css/style.css index fd7bda3c1d..f04301310f 100644 --- a/assets/css/style.css +++ b/assets/css/style.css @@ -4156,7 +4156,6 @@ div.media-sidebar a.edit-attachment { background-color: #fff; color: #444; border: 1px solid #ededed; - height: 255px; } .dokan-single-store .profile-frame .profile-info-box .profile-info-summery-wrapper .profile-info-summery { width: 100%; @@ -4213,7 +4212,7 @@ div.media-sidebar a.edit-attachment { margin-left: 8px; } .dokan-single-store .profile-frame .profile-info-box.profile-layout-layout1 .profile-info-summery-wrapper { - height: 175px; + height: 275px; padding: 0 8px; } .dokan-single-store .profile-frame .profile-info-box.profile-layout-layout1 .profile-info-summery-wrapper .profile-info-summery { diff --git a/assets/js/dokan.js b/assets/js/dokan.js index 78c6089b86..26a16c956c 100644 --- a/assets/js/dokan.js +++ b/assets/js/dokan.js @@ -1954,4 +1954,71 @@ jQuery(function($) { resize_dummy_image(); }); + // Ajax product search box + $( ':input.dokan-product-search' ).filter( ':not(.enhanced)' ).each( function() { + var select2_args = { + allowClear: $( this ).data( 'allow_clear' ) ? true : false, + placeholder: $( this ).data( 'placeholder' ), + minimumInputLength: $( this ).data( 'minimum_input_length' ) ? $( this ).data( 'minimum_input_length' ) : '3', + escapeMarkup: function( m ) { + return m; + }, + ajax: { + url: dokan.ajaxurl, + dataType: 'json', + delay: 250, + data: function( params ) { + console.log( params ); + return { + term: params.term, + action: $( this ).data( 'action' ) || 'dokan_json_search_products_and_variations', + security: dokan.search_products_nonce, + exclude: $( this ).data( 'exclude' ), + user_ids: $( this ).data( 'user_ids' ), + include: $( this ).data( 'include' ), + limit: $( this ).data( 'limit' ) + }; + }, + processResults: function( data ) { + var terms = []; + + console.log( data ); + + if ( data ) { + $.each( data, function( id, text ) { + terms.push( { id: id, text: text } ); + }); + } + return { + results: terms + }; + }, + cache: true + } + }; + + // select2_args = $.extend( select2_args, {} ); + + $( this ).select2( select2_args ).addClass( 'enhanced' ); + + if ( $( this ).data( 'sortable' ) ) { + var $select = $(this); + var $list = $( this ).next( '.select2-container' ).find( 'ul.select2-selection__rendered' ); + + $list.sortable({ + placeholder : 'ui-state-highlight select2-selection__choice', + forcePlaceholderSize: true, + items : 'li:not(.select2-search__field)', + tolerance : 'pointer', + stop: function() { + $( $list.find( '.select2-selection__choice' ).get().reverse() ).each( function() { + var id = $( this ).data( 'data' ).id; + var option = $select.find( 'option[value="' + id + '"]' )[0]; + $select.prepend( option ); + } ); + } + }); + } + }); + })(jQuery); \ No newline at end of file diff --git a/assets/src/js/script.js b/assets/src/js/script.js index dace9168b6..8f8a15a948 100755 --- a/assets/src/js/script.js +++ b/assets/src/js/script.js @@ -683,4 +683,71 @@ jQuery(function($) { resize_dummy_image(); }); + // Ajax product search box + $( ':input.dokan-product-search' ).filter( ':not(.enhanced)' ).each( function() { + var select2_args = { + allowClear: $( this ).data( 'allow_clear' ) ? true : false, + placeholder: $( this ).data( 'placeholder' ), + minimumInputLength: $( this ).data( 'minimum_input_length' ) ? $( this ).data( 'minimum_input_length' ) : '3', + escapeMarkup: function( m ) { + return m; + }, + ajax: { + url: dokan.ajaxurl, + dataType: 'json', + delay: 250, + data: function( params ) { + console.log( params ); + return { + term: params.term, + action: $( this ).data( 'action' ) || 'dokan_json_search_products_and_variations', + security: dokan.search_products_nonce, + exclude: $( this ).data( 'exclude' ), + user_ids: $( this ).data( 'user_ids' ), + include: $( this ).data( 'include' ), + limit: $( this ).data( 'limit' ) + }; + }, + processResults: function( data ) { + var terms = []; + + console.log( data ); + + if ( data ) { + $.each( data, function( id, text ) { + terms.push( { id: id, text: text } ); + }); + } + return { + results: terms + }; + }, + cache: true + } + }; + + // select2_args = $.extend( select2_args, {} ); + + $( this ).select2( select2_args ).addClass( 'enhanced' ); + + if ( $( this ).data( 'sortable' ) ) { + var $select = $(this); + var $list = $( this ).next( '.select2-container' ).find( 'ul.select2-selection__rendered' ); + + $list.sortable({ + placeholder : 'ui-state-highlight select2-selection__choice', + forcePlaceholderSize: true, + items : 'li:not(.select2-search__field)', + tolerance : 'pointer', + stop: function() { + $( $list.find( '.select2-selection__choice' ).get().reverse() ).each( function() { + var id = $( this ).data( 'data' ).id; + var option = $select.find( 'option[value="' + id + '"]' )[0]; + $select.prepend( option ); + } ); + } + }); + } + }); + })(jQuery); \ No newline at end of file diff --git a/assets/src/less/store.less b/assets/src/less/store.less index 8ac4693af4..b2b4750ec5 100644 --- a/assets/src/less/store.less +++ b/assets/src/less/store.less @@ -800,7 +800,6 @@ background-color: #fff; color: #444; border: 1px solid @borderColor; - height: 255px; .profile-info-summery { width: 100%; @@ -882,7 +881,7 @@ &.profile-layout-layout1 { .profile-info-summery-wrapper { - height: 175px; + height: 275px; padding: 0 8px; .profile-info-summery { diff --git a/assets/vendors/font-awesome/font-awesome.min.css b/assets/vendors/font-awesome/font-awesome.min.css index ec53d4d6d5..540440ce89 100644 --- a/assets/vendors/font-awesome/font-awesome.min.css +++ b/assets/vendors/font-awesome/font-awesome.min.css @@ -1,4 +1,4 @@ /*! - * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.2.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff?v=4.2.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.2.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"} \ No newline at end of file + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/assets/vendors/fonts/FontAwesome.otf b/assets/vendors/fonts/FontAwesome.otf index 81c9ad949b..401ec0f36e 100644 Binary files a/assets/vendors/fonts/FontAwesome.otf and b/assets/vendors/fonts/FontAwesome.otf differ diff --git a/assets/vendors/fonts/fontawesome-webfont.eot b/assets/vendors/fonts/fontawesome-webfont.eot index 84677bc0c5..e9f60ca953 100644 Binary files a/assets/vendors/fonts/fontawesome-webfont.eot and b/assets/vendors/fonts/fontawesome-webfont.eot differ diff --git a/assets/vendors/fonts/fontawesome-webfont.svg b/assets/vendors/fonts/fontawesome-webfont.svg index d907b25ae6..855c845e53 100644 --- a/assets/vendors/fonts/fontawesome-webfont.svg +++ b/assets/vendors/fonts/fontawesome-webfont.svg @@ -1,520 +1,2671 @@ - - + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/vendors/fonts/fontawesome-webfont.ttf b/assets/vendors/fonts/fontawesome-webfont.ttf index 96a3639cdd..35acda2fa1 100644 Binary files a/assets/vendors/fonts/fontawesome-webfont.ttf and b/assets/vendors/fonts/fontawesome-webfont.ttf differ diff --git a/assets/vendors/fonts/fontawesome-webfont.woff b/assets/vendors/fonts/fontawesome-webfont.woff index 628b6a52a8..400014a4b0 100644 Binary files a/assets/vendors/fonts/fontawesome-webfont.woff and b/assets/vendors/fonts/fontawesome-webfont.woff differ diff --git a/assets/vendors/fonts/fontawesome-webfont.woff2 b/assets/vendors/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000000..4d13fc6040 Binary files /dev/null and b/assets/vendors/fonts/fontawesome-webfont.woff2 differ diff --git a/changelog.txt b/changelog.txt index 53950e0de2..0f65f10167 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,11 @@ +v2.6.8 -> Sep 7, 2017 +--------------------- +- [new] Dokan Emails now configurable from WooCommerce Email settings with theme override support +- [new] Canceled withdraw requests are now shown for vendor +- [fix] Date time format fixed for order and product listing to support global format +- [fix] saving variable product prices +- [tweak] fontawesome library updated + v2.6.7 -> Aug 3, 2017 --------------------- - [fix] Fix multiple vendor order creating issue diff --git a/classes/admin-withdraw.php b/classes/admin-withdraw.php index 291d36e1fa..595cd1d309 100644 --- a/classes/admin-withdraw.php +++ b/classes/admin-withdraw.php @@ -81,8 +81,8 @@ function bulk_action_handler() { $amount = $_POST['amount'][$key]; $method = $_POST['method'][$key]; $note = $_POST['note'][$key]; - - Dokan_Email::init()->withdraw_request_cancel( $user_id, $amount, $method, $note ); + + do_action( 'dokan_withdraw_request_cancelled', $user_id, $amount, $method, $note ); $this->update_status( $withdraw_id, $user_id, 2 ); } @@ -97,9 +97,9 @@ function bulk_action_handler() { $user_id = $_POST['user_id'][$key]; $amount = $_POST['amount'][$key]; $method = $_POST['method'][$key]; - - Dokan_Email::init()->withdraw_request_approve( $user_id, $amount, $method ); + $this->update_status( $withdraw_id, $user_id, 1 ); + do_action( 'dokan_withdraw_request_approved', $user_id, $amount, $method ); } wp_redirect( admin_url( 'admin.php?page=dokan-withdraw&message=approved&status=' . $status ) ); diff --git a/classes/ajax.php b/classes/ajax.php index b4e443e66d..575ac6d8ef 100755 --- a/classes/ajax.php +++ b/classes/ajax.php @@ -65,6 +65,9 @@ function init_ajax() { add_action( 'wp_ajax_dokan_create_new_product', array( $this, 'create_product' ) ); add_action( 'wp_ajax_custom-header-crop', array( $this, 'crop_store_banner' ) ); + + add_action( 'wp_ajax_dokan_json_search_products_and_variations', array( $this, 'json_search_product' ), 10 ); + add_action( 'wp_ajax_nopriv_dokan_json_search_products_and_variations', array( $this, 'json_search_product' ), 10 ); } /** @@ -316,8 +319,8 @@ function contact_seller() { $message = sprintf( $error_template, __( 'Something went wrong!', 'dokan-lite' ) ); wp_send_json_error( $message ); } - - Dokan_Email::init()->contact_seller( $seller->user_email, $contact_name, $contact_email, $contact_message ); + + do_action( 'dokan_trigger_contact_seller_mail', $seller->user_email, $contact_name, $contact_email, $contact_message ); $success = sprintf( '
%s
', __( 'Email sent successfully!', 'dokan-lite' ) ); wp_send_json_success( $success ); @@ -638,6 +641,48 @@ public function crop_store_banner() { wp_send_json_success( $object ); } + /** + * Search product using term + * + * @since 2.6.8 + * + * @return void + **/ + public function json_search_product() { + check_ajax_referer( 'search-products', 'security' ); + + $term = wc_clean( empty( $term ) ? stripslashes( $_GET['term'] ) : $term ); + $include_variations = ! empty( $_GET['include_variations'] ) ? true : false; + $user_ids = ! empty( $_GET['user_ids'] ) ? $_GET['user_ids'] : false; + + if ( empty( $term ) ) { + wp_die(); + } + + $ids = dokan_search_seller_products( $term, $user_ids, '', (bool) $include_variations ); + + if ( ! empty( $_GET['exclude'] ) ) { + $ids = array_diff( $ids, (array) $_GET['exclude'] ); + } + + if ( ! empty( $_GET['include'] ) ) { + $ids = array_intersect( $ids, (array) $_GET['include'] ); + } + + if ( ! empty( $_GET['limit'] ) ) { + $ids = array_slice( $ids, 0, absint( $_GET['limit'] ) ); + } + + $product_objects = array_filter( array_map( 'wc_get_product', $ids ), 'dokan_products_array_filter_editable' ); + $products = array(); + + foreach ( $product_objects as $product_object ) { + $products[ $product_object->get_id() ] = rawurldecode( $product_object->get_formatted_name() ); + } + + wp_send_json( apply_filters( 'dokan_json_search_found_products', $products ) ); + } + /** * Calculate width and height based on what the currently selected theme supports. * diff --git a/classes/seller-setup-wizard.php b/classes/seller-setup-wizard.php index a969b68b3c..0aece08365 100644 --- a/classes/seller-setup-wizard.php +++ b/classes/seller-setup-wizard.php @@ -217,6 +217,7 @@ public function dokan_setup_introduction() {

+ +

@@ -297,7 +300,6 @@ public function dokan_setup_store() {

- store_id, 'dokan_profile_settings', $dokan_settings ); + do_action( 'dokan_seller_wizard_store_field_save', $this ); + wp_redirect( esc_url_raw( $this->get_next_step_link() ) ); exit; } @@ -423,6 +429,8 @@ public function dokan_setup_payment() {

@@ -432,6 +440,9 @@ public function dokan_setup_payment() {

store_id, 'dokan_profile_settings', $dokan_settings ); + do_action( 'dokan_seller_wizard_payment_field_save', $this ); + wp_redirect( apply_filters( 'dokan_ww_payment_redirect',esc_url_raw( $this->get_next_step_link() ) ) ); exit; } diff --git a/classes/template-products.php b/classes/template-products.php index 30ac287b85..c0ec5f8d89 100644 --- a/classes/template-products.php +++ b/classes/template-products.php @@ -221,11 +221,7 @@ function handle_all_submit() { update_post_meta( $product_id, '_visibility', 'visible' ); do_action( 'dokan_new_product_added', $product_id, $post_data ); - - if ( dokan_get_option( 'product_add_mail', 'dokan_general', 'on' ) == 'on' ) { - Dokan_Email::init()->new_product_added( $product_id, $product_status ); - } - + $redirect = apply_filters( 'dokan_add_new_product_redirect', dokan_edit_product_url( $product_id ), $product_id ); if ( 'create_and_add_new' === $_POST['add_product'] ) { diff --git a/classes/template-withdraw.php b/classes/template-withdraw.php index 05c97f0596..4a27293f15 100755 --- a/classes/template-withdraw.php +++ b/classes/template-withdraw.php @@ -142,6 +142,8 @@ public function withdraw_form_and_listing() { $this->withdraw_form( self::$validate ); } elseif ( $this->current_status == 'approved' ) { $this->user_approved_withdraws( get_current_user_id() ); + } elseif ( $this->current_status == 'cancelled' ) { + $this->user_cancelled_withdraws( get_current_user_id() ); } } @@ -232,7 +234,7 @@ function validate() { */ function insert_withdraw_info() { - global $current_user, $wpdb; + global $current_user; $amount = floatval( $_POST['witdraw_amount'] ); $method = $_POST['withdraw_method']; @@ -247,7 +249,8 @@ function insert_withdraw_info() { ); $update = $this->insert_withdraw( $data_info ); - Dokan_Email::init()->new_withdraw_request( $current_user, $amount, $method ); + + do_action( 'dokan_after_withdraw_request', $current_user, $amount, $method ); wp_redirect( add_query_arg( array( 'message' => 'request_success' ), dokan_get_navigation_url( 'withdraw' ) ) ); } @@ -385,5 +388,31 @@ function user_approved_withdraws( $user_id ) { } } + + /** + * Print the cancelled user withdraw requests + * + * @param int $user_id + * + * @return void + */ + function user_cancelled_withdraws( $user_id ){ + + $requests = $this->get_withdraw_requests( $user_id, 2, 100 ); + + if ( $requests ) { + + dokan_get_template_part( 'withdraw/cancelled-request-listing', '', array( + 'requests' => $requests + ) ); + + } else { + + dokan_get_template_part( 'global/dokan-warning', '', array( + 'deleted' => false, + 'message' => __( 'Sorry, no transactions were found!', 'dokan-lite' ) + ) ); + } + } } diff --git a/dokan.php b/dokan.php index e3bd8ad5fe..eedd449423 100755 --- a/dokan.php +++ b/dokan.php @@ -3,7 +3,7 @@ Plugin Name: Dokan Plugin URI: https://wordpress.org/plugins/dokan-lite/ Description: An e-commerce marketplace plugin for WordPress. Powered by WooCommerce and weDevs. -Version: 2.6.7 +Version: 2.6.8 Author: weDevs Author URI: https://wedevs.com/ Text Domain: dokan-lite @@ -45,7 +45,7 @@ define( '__DIR__', dirname( __FILE__ ) ); } -define( 'DOKAN_PLUGIN_VERSION', '2.6.7' ); +define( 'DOKAN_PLUGIN_VERSION', '2.6.8' ); define( 'DOKAN_FILE', __FILE__ ); define( 'DOKAN_DIR', __DIR__ ); define( 'DOKAN_INC_DIR', __DIR__ . '/includes' ); @@ -230,6 +230,11 @@ function init_actions() { add_action( 'in_plugin_update_message-dokan-lite/dokan.php', array( 'Dokan_Installer', 'in_plugin_update_message' ) ); + //Dokan Email filters for WC Email + add_filter( 'woocommerce_email_classes', array( $this, 'load_dokan_emails' ), 35 ); + add_filter( 'woocommerce_template_directory', array( $this, 'set_email_template_directory' ), 15, 2 ); + add_filter( 'woocommerce_email_actions' , array( $this, 'register_email_actions' ) ); + } public function register_scripts() { @@ -408,7 +413,8 @@ function conditional_localized_args( $default_args ) { 'selectAndCrop' => __( 'Select and Crop', 'dokan-lite' ), 'chooseImage' => __( 'Choose Image', 'dokan-lite' ), 'product_title_required' => __( 'Product title is required', 'dokan-lite' ), - 'product_category_required' => __( 'Product category is required', 'dokan-lite' ) + 'product_category_required' => __( 'Product category is required', 'dokan-lite' ), + 'search_products_nonce' => wp_create_nonce( 'search-products' ) ); $default_args = array_merge( $default_args, $custom_args ); @@ -540,6 +546,7 @@ function includes() { require_once $inc_dir . 'admin/admin.php'; require_once $inc_dir . 'admin/ajax.php'; require_once $inc_dir . 'admin-functions.php'; + require_once $lib_dir . '/class-weforms-upsell.php'; } else { require_once $inc_dir . 'template-tags.php'; } @@ -613,6 +620,7 @@ function init_classes() { new Dokan_Admin_User_Profile(); Dokan_Admin_Ajax::init(); new Dokan_Upgrade(); + new WeForms_Upsell( '409' ); } else { new Dokan_Pageviews(); } @@ -809,6 +817,91 @@ function plugin_action_links( $links ) { return $links; } + /** + * Add Dokan Email classes in WC Email + * + * @since 2.6.8 + * + * @param array $wc_emails + * + * @return $wc_emails + */ + function load_dokan_emails( $wc_emails ){ + $wc_emails['Dokan_Email_New_Product'] = include( DOKAN_INC_DIR.'/emails/class-dokan-email-new-product.php' ); + $wc_emails['Dokan_Email_New_Product_Pending'] = include( DOKAN_INC_DIR.'/emails/class-dokan-email-new-product-pending.php' ); + $wc_emails['Dokan_Email_Product_Published'] = include( DOKAN_INC_DIR.'/emails/class-dokan-email-product-published.php' ); + $wc_emails['Dokan_Email_New_Seller'] = include( DOKAN_INC_DIR.'/emails/class-dokan-email-new-seller-registered.php' ); + $wc_emails['Dokan_Vendor_Withdraw_Request'] = include( DOKAN_INC_DIR.'/emails/class-dokan-vendor-withdraw-request.php' ); + $wc_emails['Dokan_Email_Withdraw_Approved'] = include( DOKAN_INC_DIR.'/emails/class-dokan-withdraw-approved.php' ); + $wc_emails['Dokan_Email_Withdraw_Cancelled'] = include( DOKAN_INC_DIR.'/emails/class-dokan-withdraw-cancelled.php' ); + $wc_emails['Dokan_Email_Contact_Seller'] = include( DOKAN_INC_DIR.'/emails/class-dokan-email-contact-seller.php' ); + return $wc_emails; + } + + /** + * Register Dokan Email actions for WC + * + * @since 2.6.8 + * + * @param array $actions + * + * @return $actions + */ + function register_email_actions( $actions ) { + + $dokan_email_actions = apply_filters( 'dokan_email_actions', array( + 'dokan_new_product_added', + 'dokan_email_trigger_new_pending_product', + 'dokan_new_seller_created', + 'dokan_after_withdraw_request', + 'dokan_withdraw_request_approved', + 'dokan_withdraw_request_cancelled', + 'dokan_pending_product_published_notification', + 'dokan_trigger_contact_seller_mail', + ) ); + + foreach ( $dokan_email_actions as $action ) { + $actions[] = $action; + } + + return $actions; + } + + /** + * Set template override directory for Dokan Emails + * + * @since 2.6.8 + * + * @param string $template_dir + * + * @param string $template + * + * @return string + */ + function set_email_template_directory( $template_dir, $template ){ + + $dokan_emails = apply_filters( 'dokan_email_list', + array( + 'new-product.php', + 'new-product-pending.php', + 'product-published.php', + 'contact-seller.php', + 'new-seller-registered.php', + 'withdraw-new.php', + 'withdraw-cancel.php', + 'withdraw-approve.php', + ) + ); + + $template_name = basename( $template ); + + if ( in_array( $template_name, $dokan_emails ) ) { + return 'dokan'; + } + + return $template_dir; + } + } // WeDevs_Dokan /** diff --git a/includes/admin-functions.php b/includes/admin-functions.php index 9c38a52dc4..46c433c529 100755 --- a/includes/admin-functions.php +++ b/includes/admin-functions.php @@ -537,9 +537,10 @@ function dokan_send_notification_on_product_publish( $post ) { if ( $post->post_type != 'product' ) { return; } - + $seller = get_user_by( 'id', $post->post_author ); - Dokan_Email::init()->product_published( $post, $seller ); + + do_action( 'dokan_pending_product_published_notification', $post, $seller ); } add_action( 'pending_to_publish', 'dokan_send_notification_on_product_publish' ); diff --git a/includes/admin/ajax.php b/includes/admin/ajax.php index 6dba32c207..22ad2c6ff4 100644 --- a/includes/admin/ajax.php +++ b/includes/admin/ajax.php @@ -69,8 +69,8 @@ function handle_withdraw_action() { $amount = $postdata['amount'][$withdraw_id]; $method = $postdata['method'][$withdraw_id]; $note = $postdata['note'][$withdraw_id]; - - Dokan_Email::init()->withdraw_request_cancel( $user_id, $amount, $method, $note ); + + do_action( 'dokan_withdraw_request_cancelled', $user_id, $amount, $method, $note ); $withdraw->update_status( $withdraw_id, $user_id, 2 ); $url = admin_url( 'admin.php?page=dokan-withdraw&message=cancelled&status=' . $status ); @@ -84,9 +84,10 @@ function handle_withdraw_action() { $amount = $postdata['amount'][$withdraw_id]; $method = $postdata['method'][$withdraw_id]; - Dokan_Email::init()->withdraw_request_approve( $user_id, $amount, $method ); $withdraw->update_status( $withdraw_id, $user_id, 1 ); + do_action( 'dokan_withdraw_request_approved', $user_id, $amount, $method ); + $url = admin_url( 'admin.php?page=dokan-withdraw&message=approved&status=' . $status ); wp_send_json_success( array( 'url'=> $url ) ); diff --git a/includes/emails/class-dokan-email-contact-seller.php b/includes/emails/class-dokan-email-contact-seller.php new file mode 100644 index 0000000000..dff26fb301 --- /dev/null +++ b/includes/emails/class-dokan-email-contact-seller.php @@ -0,0 +1,172 @@ +id = 'dokan_contact_seller'; + $this->title = __( 'Dokan Contact Vendor', 'dokan-lite' ); + $this->description = __( 'These emails are sent to a vendor who is contacted by customer via contact form widget ', 'dokan-lite' ); + $this->template_html = 'emails/contact-seller.php'; + $this->template_plain = 'emails/plain/contact-seller.php'; + $this->template_base = DOKAN_DIR.'/templates/'; + + // Triggers for this email + add_action( 'dokan_trigger_contact_seller_mail', array( $this, 'trigger' ), 30, 4 ); + + // Call parent constructor + parent::__construct(); + + // Other settings + $this->recipient = 'vendor@ofthe.product'; + } + + /** + * Get email subject. + * + * @since 3.1.0 + * @return string + */ + public function get_default_subject() { + return __( '[{customer_name}] sent you a message from your store at - {site_name}', 'dokan-lite' ); + } + + /** + * Get email heading. + * + * @since 3.1.0 + * @return string + */ + public function get_default_heading() { + return __( '{customer_name} - Sent a message from {site_name}', 'dokan-lite' ); + } + + /** + * Trigger the this email. + */ + public function trigger( $seller_email, $contact_name, $contact_email, $contact_message ) { + + if ( ! $this->is_enabled() || ! $this->get_recipient() ) { + return; + } + + $seller = get_user_by( 'email', $seller_email ); + + $this->find['seller_name'] = '{seller_name}'; + $this->find['customer_name'] = '{customer_name}'; + $this->find['customer_email'] = '{customer_email}'; + $this->find['message'] = '{message}'; + $this->find['site_name'] = '{site_name}'; + $this->find['site_url'] = '{site_url}'; + + $this->replace['seller_name'] = $seller->display_name; + $this->replace['customer_name'] = $contact_name; + $this->replace['customer_email'] = $contact_email; + $this->replace['message'] = $contact_message; + $this->replace['site_name'] = $this->get_from_name(); + $this->replace['site_url'] = site_url(); + + $this->setup_locale(); + $this->send( $seller_email, $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() ); + $this->restore_locale(); + } + + /** + * Get content html. + * + * @access public + * @return string + */ + public function get_content_html() { + ob_start(); + wc_get_template( $this->template_html, array( + 'email_heading' => $this->get_heading(), + 'sent_to_admin' => true, + 'plain_text' => false, + 'email' => $this, + 'data' => $this->replace + ), 'dokan/', $this->template_base ); + return ob_get_clean(); + + } + + /** + * Get content plain. + * + * @access public + * @return string + */ + public function get_content_plain() { + ob_start(); + wc_get_template( $this->template_html, array( + 'email_heading' => $this->get_heading(), + 'sent_to_admin' => true, + 'plain_text' => true, + 'email' => $this, + 'data' => $this->replace + ), 'dokan/', $this->template_base ); + return ob_get_clean(); + } + + /** + * Initialize settings form fields. + */ + public function init_form_fields() { + $this->form_fields = array( + 'enabled' => array( + 'title' => __( 'Enable/Disable', 'dokan-lite' ), + 'type' => 'checkbox', + 'label' => __( 'Enable this email notification', 'dokan-lite' ), + 'default' => 'yes', + ), + + 'subject' => array( + 'title' => __( 'Subject', 'dokan-lite' ), + 'type' => 'text', + 'desc_tip' => true, + /* translators: %s: list of placeholders */ + 'description' => sprintf( __( 'Available placeholders: %s', 'dokan-lite' ), '{seller_name}, {customer_name}, {site_name}' ), + 'placeholder' => $this->get_default_subject(), + 'default' => '', + ), + 'heading' => array( + 'title' => __( 'Email heading', 'dokan-lite' ), + 'type' => 'text', + 'desc_tip' => true, + /* translators: %s: list of placeholders */ + 'description' => sprintf( __( 'Available placeholders: %s', 'dokan-lite' ), '{seller_name}, {customer_name}, {site_name}' ), + 'placeholder' => $this->get_default_heading(), + 'default' => '', + ), + 'email_type' => array( + 'title' => __( 'Email type', 'dokan-lite' ), + 'type' => 'select', + 'description' => __( 'Choose which format of email to send.', 'dokan-lite' ), + 'default' => 'html', + 'class' => 'email_type wc-enhanced-select', + 'options' => $this->get_email_type_options(), + 'desc_tip' => true, + ), + ); + } +} + +endif; + +return new Dokan_Email_Contact_Seller(); diff --git a/includes/emails/class-dokan-email-new-product-pending.php b/includes/emails/class-dokan-email-new-product-pending.php new file mode 100644 index 0000000000..4983ce740e --- /dev/null +++ b/includes/emails/class-dokan-email-new-product-pending.php @@ -0,0 +1,199 @@ +id = 'new_product_pending'; + $this->title = __( 'Dokan New Pending Product', 'dokan-lite' ); + $this->description = __( 'New Pending Product emails are sent to chosen recipient(s) when a new product is created by vendors.', 'dokan-lite' ); + $this->template_html = 'emails/new-product-pending.php'; + $this->template_plain = 'emails/plain/new-product-pending.php'; + $this->template_base = DOKAN_DIR.'/templates/'; + + // Triggers for this email + add_action( 'dokan_email_trigger_new_pending_product', array( $this, 'trigger' ), 30, 2 ); + + // Call parent constructor + parent::__construct(); + + // Other settings + $this->recipient = $this->get_option( 'recipient', get_option( 'admin_email' ) ); + } + + /** + * Get email subject. + * + * @since 3.1.0 + * @return string + */ + public function get_default_subject() { + return __( '[{site_title}] A New product is pending from ({seller_name}) - {product_title}', 'dokan-lite' ); + } + + /** + * Get email heading. + * + * @since 3.1.0 + * @return string + */ + public function get_default_heading() { + return __( 'New pending product added by Vendor {seller_name}', 'dokan-lite' ); + } + + /** + * Trigger the sending of this email. + * + * @param int $product_id The product ID. + * @param array $postdata. + */ + public function trigger( $product_id, $postdata ) { + + if ( ! $this->is_enabled() || ! $this->get_recipient() ) { + return; + } + + $product = wc_get_product( $product_id ); + $seller_id = get_post_field( 'post_author', $product_id ); + $seller = get_user_by( 'id', $seller_id ); + $category = wp_get_post_terms( dokan_get_prop( $product, 'id' ), 'product_cat', array( 'fields' => 'names' ) ); + $category_name = $category ? reset( $category ) : 'N/A'; + + if ( is_a( $product, 'WC_Product' ) ) { + $this->object = $product; + + $this->find['product-title'] = '{product_title}'; + $this->find['price'] = '{price}'; + $this->find['seller-name'] = '{seller_name}'; + $this->find['seller_url'] = '{seller_url}'; + $this->find['category'] = '{category}'; + $this->find['product_link'] = '{product_link}'; + $this->find['site_name'] = '{site_name}'; + $this->find['site_url'] = '{site_url}'; + + $this->replace['product-title'] = $product->get_title(); + $this->replace['price'] = $product->get_price(); + $this->replace['seller-name'] = $seller->display_name; + $this->replace['seller_url'] = dokan_get_store_url( $seller->ID ); + $this->replace['category'] = $category_name; + $this->replace['product_link'] = admin_url( 'post.php?action=edit&post=' . $product_id ); + $this->replace['site_name'] = $this->get_from_name(); + $this->replace['site_url'] = site_url(); + } + + $this->setup_locale(); + $this->send( $this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() ); + $this->restore_locale(); + } + + /** + * Get content html. + * + * @access public + * @return string + */ + public function get_content_html() { + ob_start(); + wc_get_template( $this->template_html, array( + 'product' => $this->object, + 'email_heading' => $this->get_heading(), + 'sent_to_admin' => true, + 'plain_text' => false, + 'email' => $this, + 'data' => $this->replace + ), 'dokan/', $this->template_base ); + return ob_get_clean(); + + } + + /** + * Get content plain. + * + * @access public + * @return string + */ + public function get_content_plain() { + ob_start(); + wc_get_template( $this->template_html, array( + 'product' => $this->object, + 'email_heading' => $this->get_heading(), + 'sent_to_admin' => true, + 'plain_text' => true, + 'email' => $this, + 'data' => $this->replace + ), 'dokan/', $this->template_base ); + return ob_get_clean(); + } + + /** + * Initialise settings form fields. + */ + public function init_form_fields() { + $this->form_fields = array( + 'enabled' => array( + 'title' => __( 'Enable/Disable', 'dokan-lite' ), + 'type' => 'checkbox', + 'label' => __( 'Enable this email notification', 'dokan-lite' ), + 'default' => 'yes', + ), + 'recipient' => array( + 'title' => __( 'Recipient(s)', 'dokan-lite' ), + 'type' => 'text', + 'description' => sprintf( __( 'Enter recipients (comma separated) for this email. Defaults to %s.', 'dokan-lite' ), '' . esc_attr( get_option( 'admin_email' ) ) . '' ), + 'placeholder' => '', + 'default' => '', + 'desc_tip' => true, + ), + 'subject' => array( + 'title' => __( 'Subject', 'dokan-lite' ), + 'type' => 'text', + 'desc_tip' => true, + /* translators: %s: list of placeholders */ + 'description' => sprintf( __( 'Available placeholders: %s', 'dokan-lite' ), '{site_title}, {product_title}, {seller_name}' ), + 'placeholder' => $this->get_default_subject(), + 'default' => '', + ), + 'heading' => array( + 'title' => __( 'Email heading', 'dokan-lite' ), + 'type' => 'text', + 'desc_tip' => true, + /* translators: %s: list of placeholders */ + 'description' => sprintf( __( 'Available placeholders: %s', 'dokan-lite' ), '{site_title}, {product_title}, {seller_name}' ), + 'placeholder' => $this->get_default_heading(), + 'default' => '', + ), + 'email_type' => array( + 'title' => __( 'Email type', 'dokan-lite' ), + 'type' => 'select', + 'description' => __( 'Choose which format of email to send.', 'dokan-lite' ), + 'default' => 'html', + 'class' => 'email_type wc-enhanced-select', + 'options' => $this->get_email_type_options(), + 'desc_tip' => true, + ), + ); + } +} + +endif; + +return new Dokan_Email_New_Product_Pending(); diff --git a/includes/emails/class-dokan-email-new-product.php b/includes/emails/class-dokan-email-new-product.php new file mode 100644 index 0000000000..e874212a77 --- /dev/null +++ b/includes/emails/class-dokan-email-new-product.php @@ -0,0 +1,207 @@ +id = 'new_product'; + $this->title = __( 'Dokan New Product', 'dokan-lite' ); + $this->description = __( 'New Product emails are sent to chosen recipient(s) when a new product is created by vendors.', 'dokan-lite' ); + $this->template_html = 'emails/new-product.php'; + $this->template_plain = 'emails/plain/new-product.php'; + $this->template_base = DOKAN_DIR.'/templates/'; + + // Triggers for this email + add_action( 'dokan_new_product_added', array( $this, 'trigger' ), 30, 2 ); + + // Call parent constructor + parent::__construct(); + + // Other settings + $this->recipient = $this->get_option( 'recipient', get_option( 'admin_email' ) ); + } + + /** + * Get email subject. + * + * @since 3.1.0 + * @return string + */ + public function get_default_subject() { + return __( '[{site_name}] A New product is added by ({seller_name}) - {product_title}', 'dokan-lite' ); + } + + /** + * Get email heading. + * + * @since 3.1.0 + * @return string + */ + public function get_default_heading() { + return __( 'New product added by Vendor {seller_name}', 'dokan-lite' ); + } + + /** + * Trigger the sending of this email. + * + * @param int $product_id The product ID. + * @param array $postdata. + */ + public function trigger( $product_id, $postdata ) { + + if ( dokan_get_option( 'product_add_mail', 'dokan_general', 'on' ) != 'on' ) { + return; + } + + if ( dokan_get_new_post_status() == 'pending' ) { + do_action( 'dokan_email_trigger_new_pending_product', $product_id, $postdata ); + return; + } + + if ( ! $this->is_enabled() || ! $this->get_recipient() ) { + return; + } + + $product = wc_get_product( $product_id ); + $seller_id = get_post_field( 'post_author', $product_id ); + $seller = get_user_by( 'id', $seller_id ); + $category = wp_get_post_terms( dokan_get_prop( $product, 'id' ), 'product_cat', array( 'fields' => 'names' ) ); + $category_name = $category ? reset( $category ) : 'N/A'; + + if ( is_a( $product, 'WC_Product' ) ) { + $this->object = $product; + + $this->find['product-title'] = '{product_title}'; + $this->find['price'] = '{price}'; + $this->find['seller-name'] = '{seller_name}'; + $this->find['seller_url'] = '{seller_url}'; + $this->find['category'] = '{category}'; + $this->find['product_link'] = '{product_link}'; + $this->find['site_name'] = '{site_name}'; + $this->find['site_url'] = '{site_url}'; + + $this->replace['product-title'] = $product->get_title(); + $this->replace['price'] = $product->get_price(); + $this->replace['seller-name'] = $seller->display_name; + $this->replace['seller_url'] = dokan_get_store_url( $seller->ID ); + $this->replace['category'] = $category_name; + $this->replace['product_link'] = admin_url( 'post.php?action=edit&post=' . $product_id ); + $this->replace['site_name'] = $this->get_from_name(); + $this->replace['site_url'] = site_url(); + } + + $this->setup_locale(); + $this->send( $this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() ); + $this->restore_locale(); + } + + /** + * Get content html. + * + * @access public + * @return string + */ + public function get_content_html() { + ob_start(); + wc_get_template( $this->template_html, array( + 'product' => $this->object, + 'email_heading' => $this->get_heading(), + 'sent_to_admin' => true, + 'plain_text' => false, + 'email' => $this, + 'data' => $this->replace + ), 'dokan/', $this->template_base ); + return ob_get_clean(); + + } + + /** + * Get content plain. + * + * @access public + * @return string + */ + public function get_content_plain() { + ob_start(); + wc_get_template( $this->template_html, array( + 'product' => $this->object, + 'email_heading' => $this->get_heading(), + 'sent_to_admin' => true, + 'plain_text' => true, + 'email' => $this, + 'data' => $this->replace + ), 'dokan/', $this->template_base ); + return ob_get_clean(); + } + + /** + * Initialise settings form fields. + */ + public function init_form_fields() { + $this->form_fields = array( + 'enabled' => array( + 'title' => __( 'Enable/Disable', 'dokan-lite' ), + 'type' => 'checkbox', + 'label' => __( 'Enable this email notification', 'dokan-lite' ), + 'default' => 'yes', + ), + 'recipient' => array( + 'title' => __( 'Recipient(s)', 'dokan-lite' ), + 'type' => 'text', + 'description' => sprintf( __( 'Enter recipients (comma separated) for this email. Defaults to %s.', 'dokan-lite' ), '' . esc_attr( get_option( 'admin_email' ) ) . '' ), + 'placeholder' => '', + 'default' => '', + 'desc_tip' => true, + ), + 'subject' => array( + 'title' => __( 'Subject', 'dokan-lite' ), + 'type' => 'text', + 'desc_tip' => true, + /* translators: %s: list of placeholders */ + 'description' => sprintf( __( 'Available placeholders: %s', 'dokan-lite' ), '{site_name}, {product_title}, {seller_name}' ), + 'placeholder' => $this->get_default_subject(), + 'default' => '', + ), + 'heading' => array( + 'title' => __( 'Email heading', 'dokan-lite' ), + 'type' => 'text', + 'desc_tip' => true, + /* translators: %s: list of placeholders */ + 'description' => sprintf( __( 'Available placeholders: %s', 'dokan-lite' ), '{site_name}, {product_title}, {seller_name}' ), + 'placeholder' => $this->get_default_heading(), + 'default' => '', + ), + 'email_type' => array( + 'title' => __( 'Email type', 'dokan-lite' ), + 'type' => 'select', + 'description' => __( 'Choose which format of email to send.', 'dokan-lite' ), + 'default' => 'html', + 'class' => 'email_type wc-enhanced-select', + 'options' => $this->get_email_type_options(), + 'desc_tip' => true, + ), + ); + } +} + +endif; + +return new Dokan_Email_New_Product(); diff --git a/includes/emails/class-dokan-email-new-seller-registered.php b/includes/emails/class-dokan-email-new-seller-registered.php new file mode 100644 index 0000000000..faca032b91 --- /dev/null +++ b/includes/emails/class-dokan-email-new-seller-registered.php @@ -0,0 +1,187 @@ +id = 'dokan_new_seller'; + $this->title = __( 'Dokan New Seller Registered', 'dokan-lite' ); + $this->description = __( 'These emails are sent to chosen recipient(s) when a new vendor registers in marketplace', 'dokan-lite' ); + $this->template_html = 'emails/new-seller-registered.php'; + $this->template_plain = 'emails/plain/new-seller-registered.php'; + $this->template_base = DOKAN_DIR.'/templates/'; + + // Triggers for this email + add_action( 'dokan_new_seller_created', array( $this, 'trigger' ), 30, 2 ); + + // Call parent constructor + parent::__construct(); + + // Other settings + $this->recipient = $this->get_option( 'recipient', get_option( 'admin_email' ) ); + } + + /** + * Get email subject. + * + * @since 3.1.0 + * @return string + */ + public function get_default_subject() { + return __( '[{site_name}] A New vendor has registered', 'dokan-lite' ); + } + + /** + * Get email heading. + * + * @since 3.1.0 + * @return string + */ + public function get_default_heading() { + return __( 'New Vendor Registered - {seller_name}', 'dokan-lite' ); + } + + /** + * Trigger the sending of this email. + * + * @param int $product_id The product ID. + * @param array $postdata. + */ + public function trigger( $user_id, $dokan_settings ) { + + if ( ! $this->is_enabled() || ! $this->get_recipient() ) { + return; + } + + $seller = get_user_by( 'id', $user_id ); + $this->object = $seller; + $this->find['seller_name'] = '{seller_name}'; + $this->find['store_url'] = '{store_url}'; + $this->find['store_name'] = '{store_name}'; + $this->find['seller_edit'] = '{seller_edit}'; + $this->find['site_name'] = '{site_name}'; + $this->find['site_url'] = '{site_url}'; + + $this->replace['seller_name'] = $seller->display_name; + $this->replace['store_url'] = dokan_get_store_url( $seller->ID ); + $this->replace['store_name'] = $dokan_settings['store_name']; + $this->replace['seller_edit'] = admin_url( 'user-edit.php?user_id=' . $user_id ); + $this->replace['site_name'] = $this->get_from_name(); + $this->replace['site_url'] = site_url(); + + $this->setup_locale(); + $this->send( $this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() ); + $this->restore_locale(); + } + + /** + * Get content html. + * + * @access public + * @return string + */ + public function get_content_html() { + ob_start(); + wc_get_template( $this->template_html, array( + 'seller' => $this->object, + 'email_heading' => $this->get_heading(), + 'sent_to_admin' => true, + 'plain_text' => false, + 'email' => $this, + 'data' => $this->replace + ), 'dokan/', $this->template_base ); + return ob_get_clean(); + + } + + /** + * Get content plain. + * + * @access public + * @return string + */ + public function get_content_plain() { + ob_start(); + wc_get_template( $this->template_html, array( + 'seller' => $this->object, + 'email_heading' => $this->get_heading(), + 'sent_to_admin' => true, + 'plain_text' => true, + 'email' => $this, + 'data' => $this->replace + ), 'dokan/', $this->template_base ); + return ob_get_clean(); + } + + /** + * Initialise settings form fields. + */ + public function init_form_fields() { + $this->form_fields = array( + 'enabled' => array( + 'title' => __( 'Enable/Disable', 'dokan-lite' ), + 'type' => 'checkbox', + 'label' => __( 'Enable this email notification', 'dokan-lite' ), + 'default' => 'yes', + ), + 'recipient' => array( + 'title' => __( 'Recipient(s)', 'dokan-lite' ), + 'type' => 'text', + 'description' => sprintf( __( 'Enter recipients (comma separated) for this email. Defaults to %s.', 'dokan-lite' ), '' . esc_attr( get_option( 'admin_email' ) ) . '' ), + 'placeholder' => '', + 'default' => '', + 'desc_tip' => true, + ), + 'subject' => array( + 'title' => __( 'Subject', 'dokan-lite' ), + 'type' => 'text', + 'desc_tip' => true, + /* translators: %s: list of placeholders */ + 'description' => sprintf( __( 'Available placeholders: %s', 'dokan-lite' ), '{site_name}, {store_name}, {seller_name}' ), + 'placeholder' => $this->get_default_subject(), + 'default' => '', + ), + 'heading' => array( + 'title' => __( 'Email heading', 'dokan-lite' ), + 'type' => 'text', + 'desc_tip' => true, + /* translators: %s: list of placeholders */ + 'description' => sprintf( __( 'Available placeholders: %s', 'dokan-lite' ), '{site_name}, {store_name}, {seller_name}' ), + 'placeholder' => $this->get_default_heading(), + 'default' => '', + ), + 'email_type' => array( + 'title' => __( 'Email type', 'dokan-lite' ), + 'type' => 'select', + 'description' => __( 'Choose which format of email to send.', 'dokan-lite' ), + 'default' => 'html', + 'class' => 'email_type wc-enhanced-select', + 'options' => $this->get_email_type_options(), + 'desc_tip' => true, + ), + ); + } +} + +endif; + +return new Dokan_Email_New_Seller(); diff --git a/includes/emails/class-dokan-email-product-published.php b/includes/emails/class-dokan-email-product-published.php new file mode 100644 index 0000000000..3879a38363 --- /dev/null +++ b/includes/emails/class-dokan-email-product-published.php @@ -0,0 +1,185 @@ +id = 'pending_product_published'; + $this->title = __( 'Dokan Pending Product Published', 'dokan-lite' ); + $this->description = __( 'These emails are sent to vendor of the product when a pending product is published.', 'dokan-lite' ); + $this->template_html = 'emails/product-published.php'; + $this->template_plain = 'emails/plain/product-published.php'; + $this->template_base = DOKAN_DIR.'/templates/'; + + // Triggers for this email + add_action( 'dokan_pending_product_published_notification', array( $this, 'trigger' ), 30, 2 ); + + // Call parent constructor + parent::__construct(); + + // Other settings + $this->recipient = 'vendor@ofthe.product'; + } + + /** + * Get email subject. + * + * @since 3.1.0 + * @return string + */ + public function get_default_subject() { + return __( '[{site_name}] Your product - {product_title} - is now published', 'dokan-lite' ); + } + + /** + * Get email heading. + * + * @since 3.1.0 + * @return string + */ + public function get_default_heading() { + return __( '{product_title} - is published', 'dokan-lite' ); + } + + /** + * Trigger the sending of this email. + * + * @param int $product_id The product ID. + * @param array $postdata. + */ + public function trigger( $post, $seller ) { + + if ( ! $this->is_enabled() || ! $this->get_recipient() ) { + return; + } + + $product = wc_get_product( $post->ID ); + + if ( is_a( $product, 'WC_Product' ) ) { + $this->object = $product; + + $this->find['product-title'] = '{product_title}'; + $this->find['price'] = '{price}'; + $this->find['seller-name'] = '{seller_name}'; + $this->find['product_url'] = '{product_url}'; + $this->find['product_edit_link'] = '{product_edit_link}'; + $this->find['site_name'] = '{site_name}'; + $this->find['site_url'] = '{site_url}'; + + $this->replace['product-title'] = $product->get_title(); + $this->replace['price'] = $product->get_price(); + $this->replace['seller-name'] = $seller->display_name; + $this->replace['product_url'] = get_permalink( $post->ID ); + $this->replace['product_edit_link'] = dokan_edit_product_url( $post->ID ); + $this->replace['site_name'] = $this->get_from_name(); + $this->replace['site_url'] = site_url(); + } + + $this->setup_locale(); + $this->send( $seller->user_email, $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() ); + $this->restore_locale(); + } + + /** + * Get content html. + * + * @access public + * @return string + */ + public function get_content_html() { + ob_start(); + wc_get_template( $this->template_html, array( + 'product' => $this->object, + 'email_heading' => $this->get_heading(), + 'sent_to_admin' => true, + 'plain_text' => false, + 'email' => $this, + 'data' => $this->replace + ), 'dokan/', $this->template_base ); + return ob_get_clean(); + + } + + /** + * Get content plain. + * + * @access public + * @return string + */ + public function get_content_plain() { + ob_start(); + wc_get_template( $this->template_html, array( + 'product' => $this->object, + 'email_heading' => $this->get_heading(), + 'sent_to_admin' => true, + 'plain_text' => true, + 'email' => $this, + 'data' => $this->replace + ), 'dokan/', $this->template_base ); + return ob_get_clean(); + } + + /** + * Initialise settings form fields. + */ + public function init_form_fields() { + $this->form_fields = array( + 'enabled' => array( + 'title' => __( 'Enable/Disable', 'dokan-lite' ), + 'type' => 'checkbox', + 'label' => __( 'Enable this email notification', 'dokan-lite' ), + 'default' => 'yes', + ), + + 'subject' => array( + 'title' => __( 'Subject', 'dokan-lite' ), + 'type' => 'text', + 'desc_tip' => true, + /* translators: %s: list of placeholders */ + 'description' => sprintf( __( 'Available placeholders: %s', 'dokan-lite' ), '{site_name}, {product_title}, {seller_name}' ), + 'placeholder' => $this->get_default_subject(), + 'default' => '', + ), + 'heading' => array( + 'title' => __( 'Email heading', 'dokan-lite' ), + 'type' => 'text', + 'desc_tip' => true, + /* translators: %s: list of placeholders */ + 'description' => sprintf( __( 'Available placeholders: %s', 'dokan-lite' ), '{site_name}, {product_title}, {seller_name}' ), + 'placeholder' => $this->get_default_heading(), + 'default' => '', + ), + 'email_type' => array( + 'title' => __( 'Email type', 'dokan-lite' ), + 'type' => 'select', + 'description' => __( 'Choose which format of email to send.', 'dokan-lite' ), + 'default' => 'html', + 'class' => 'email_type wc-enhanced-select', + 'options' => $this->get_email_type_options(), + 'desc_tip' => true, + ), + ); + } +} + +endif; + +return new Dokan_Email_Product_Published(); diff --git a/includes/emails/class-dokan-vendor-withdraw-request.php b/includes/emails/class-dokan-vendor-withdraw-request.php new file mode 100644 index 0000000000..87bdbb7daa --- /dev/null +++ b/includes/emails/class-dokan-vendor-withdraw-request.php @@ -0,0 +1,189 @@ +id = 'dokan_vendor_withdraw_request'; + $this->title = __( 'Dokan New Withdrawal Request', 'dokan-lite' ); + $this->description = __( 'These emails are sent to chosen recipient(s) when a vendor send request to withdraw', 'dokan-lite' ); + $this->template_html = 'emails/withdraw-new.php'; + $this->template_plain = 'emails/plain/withdraw-new.php'; + $this->template_base = DOKAN_DIR.'/templates/'; + + // Triggers for this email + add_action( 'dokan_after_withdraw_request', array( $this, 'trigger' ), 30, 3 ); + + // Call parent constructor + parent::__construct(); + + // Other settings + $this->recipient = $this->get_option( 'recipient', get_option( 'admin_email' ) ); + } + + /** + * Get email subject. + * + * @since 3.1.0 + * @return string + */ + public function get_default_subject() { + return __( '[{site_name}] A New withdrawal request is made by {user_name}', 'dokan-lite' ); + } + + /** + * Get email heading. + * + * @since 3.1.0 + * @return string + */ + public function get_default_heading() { + return __( 'New Withdraw Request from - {user_name}', 'dokan-lite' ); + } + + /** + * Trigger the sending of this email. + * + * @param int $product_id The product ID. + * @param array $postdata. + */ + public function trigger( $current_user, $amount, $method ) { + + if ( ! $this->is_enabled() || ! $this->get_recipient() ) { + return; + } + + $seller = get_user_by( 'id', $current_user->ID ); + $this->object = $current_user; + $this->find['username'] = '{user_name}'; + $this->find['amount'] = '{amount}'; + $this->find['method'] = '{method}'; + $this->find['profile_url'] = '{profile_url}'; + $this->find['withdraw_page'] = '{withdraw_page}'; + $this->find['site_name'] = '{site_name}'; + $this->find['site_url'] = '{site_url}'; + + $this->replace['username'] = $seller->user_login; + $this->replace['amount'] = wc_price( $amount ); + $this->replace['method'] = dokan_withdraw_get_method_title( $method ); + $this->replace['profile_url'] = admin_url( 'user-edit.php?user_id=' . $seller->ID ); + $this->replace['withdraw_page'] = admin_url( 'admin.php?page=dokan-withdraw' ); + $this->replace['site_name'] = $this->get_from_name(); + $this->replace['site_url'] = site_url(); + + $this->setup_locale(); + $this->send( $this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() ); + $this->restore_locale(); + + } + + /** + * Get content html. + * + * @access public + * @return string + */ + public function get_content_html() { + ob_start(); + wc_get_template( $this->template_html, array( + 'seller' => $this->object, + 'email_heading' => $this->get_heading(), + 'sent_to_admin' => true, + 'plain_text' => false, + 'email' => $this, + 'data' => $this->replace + ), 'dokan/', $this->template_base ); + return ob_get_clean(); + + } + + /** + * Get content plain. + * + * @access public + * @return string + */ + public function get_content_plain() { + ob_start(); + wc_get_template( $this->template_html, array( + 'seller' => $this->object, + 'email_heading' => $this->get_heading(), + 'sent_to_admin' => true, + 'plain_text' => true, + 'email' => $this, + 'data' => $this->replace + ), 'dokan/', $this->template_base ); + return ob_get_clean(); + } + + /** + * Initialise settings form fields. + */ + public function init_form_fields() { + $this->form_fields = array( + 'enabled' => array( + 'title' => __( 'Enable/Disable', 'dokan-lite' ), + 'type' => 'checkbox', + 'label' => __( 'Enable this email notification', 'dokan-lite' ), + 'default' => 'yes', + ), + 'recipient' => array( + 'title' => __( 'Recipient(s)', 'dokan-lite' ), + 'type' => 'text', + 'description' => sprintf( __( 'Enter recipients (comma separated) for this email. Defaults to %s.', 'dokan-lite' ), '' . esc_attr( get_option( 'admin_email' ) ) . '' ), + 'placeholder' => '', + 'default' => '', + 'desc_tip' => true, + ), + 'subject' => array( + 'title' => __( 'Subject', 'dokan-lite' ), + 'type' => 'text', + 'desc_tip' => true, + /* translators: %s: list of placeholders */ + 'description' => sprintf( __( 'Available placeholders: %s', 'dokan-lite' ), '{site_name},{amount},{user_name}' ), + 'placeholder' => $this->get_default_subject(), + 'default' => '', + ), + 'heading' => array( + 'title' => __( 'Email heading', 'dokan-lite' ), + 'type' => 'text', + 'desc_tip' => true, + /* translators: %s: list of placeholders */ + 'description' => sprintf( __( 'Available placeholders: %s', 'dokan-lite' ), '{site_name},{amount},{user_name}' ), + 'placeholder' => $this->get_default_heading(), + 'default' => '', + ), + 'email_type' => array( + 'title' => __( 'Email type', 'dokan-lite' ), + 'type' => 'select', + 'description' => __( 'Choose which format of email to send.', 'dokan-lite' ), + 'default' => 'html', + 'class' => 'email_type wc-enhanced-select', + 'options' => $this->get_email_type_options(), + 'desc_tip' => true, + ), + ); + } +} + +endif; + +return new Dokan_Vendor_Withdraw_Request(); diff --git a/includes/emails/class-dokan-withdraw-approved.php b/includes/emails/class-dokan-withdraw-approved.php new file mode 100644 index 0000000000..5180d84db1 --- /dev/null +++ b/includes/emails/class-dokan-withdraw-approved.php @@ -0,0 +1,181 @@ +id = 'dokan_vendor_withdraw_approved'; + $this->title = __( 'Dokan Withdraw Approved', 'dokan-lite' ); + $this->description = __( 'These emails are sent to vendor when a vendor withdraw request is approved', 'dokan-lite' ); + $this->template_html = 'emails/withdraw-approve.php'; + $this->template_plain = 'emails/plain/withdraw-approve.php'; + $this->template_base = DOKAN_DIR.'/templates/'; + + // Triggers for this email + add_action( 'dokan_withdraw_request_approved', array( $this, 'trigger' ), 30, 3 ); + + // Call parent constructor + parent::__construct(); + + // Other settings + $this->recipient = 'venodor@ofthe.product'; + } + + /** + * Get email subject. + * + * @since 3.1.0 + * @return string + */ + public function get_default_subject() { + return __( '[{site_name}] Your withdrawal request was approved', 'dokan-lite' ); + } + + /** + * Get email heading. + * + * @since 3.1.0 + * @return string + */ + public function get_default_heading() { + return __( 'Withdrawal request for {amount} is approved', 'dokan-lite' ); + } + + /** + * Trigger the sending of this email. + * + * @param int $product_id The product ID. + * @param array $postdata. + */ + public function trigger( $user_id, $amount, $method ) { + + if ( ! $this->is_enabled() || ! $this->get_recipient() ) { + return; + } + + $seller = get_user_by( 'id', $user_id ); + $this->object = $seller; + $this->find['username'] = '{user_name}'; + $this->find['amount'] = '{amount}'; + $this->find['method'] = '{method}'; + $this->find['profile_url'] = '{profile_url}'; + $this->find['withdraw_page'] = '{withdraw_page}'; + $this->find['site_name'] = '{site_name}'; + $this->find['site_url'] = '{site_url}'; + + $this->replace['username'] = $seller->user_login; + $this->replace['amount'] = wc_price( $amount ); + $this->replace['method'] = dokan_withdraw_get_method_title( $method ); + $this->replace['profile_url'] = admin_url( 'user-edit.php?user_id=' . $seller->ID ); + $this->replace['withdraw_page'] = admin_url( 'admin.php?page=dokan-withdraw' ); + $this->replace['site_name'] = $this->get_from_name(); + $this->replace['site_url'] = site_url(); + + $this->setup_locale(); + $this->send( $seller->user_email, $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() ); + $this->restore_locale(); + + } + + /** + * Get content html. + * + * @access public + * @return string + */ + public function get_content_html() { + ob_start(); + wc_get_template( $this->template_html, array( + 'seller' => $this->object, + 'email_heading' => $this->get_heading(), + 'sent_to_admin' => true, + 'plain_text' => false, + 'email' => $this, + 'data' => $this->replace + ), 'dokan/', $this->template_base ); + return ob_get_clean(); + + } + + /** + * Get content plain. + * + * @access public + * @return string + */ + public function get_content_plain() { + ob_start(); + wc_get_template( $this->template_html, array( + 'seller' => $this->object, + 'email_heading' => $this->get_heading(), + 'sent_to_admin' => true, + 'plain_text' => true, + 'email' => $this, + 'data' => $this->replace + ), 'dokan/', $this->template_base ); + return ob_get_clean(); + } + + /** + * Initialise settings form fields. + */ + public function init_form_fields() { + $this->form_fields = array( + 'enabled' => array( + 'title' => __( 'Enable/Disable', 'dokan-lite' ), + 'type' => 'checkbox', + 'label' => __( 'Enable this email notification', 'dokan-lite' ), + 'default' => 'yes', + ), + 'subject' => array( + 'title' => __( 'Subject', 'dokan-lite' ), + 'type' => 'text', + 'desc_tip' => true, + /* translators: %s: list of placeholders */ + 'description' => sprintf( __( 'Available placeholders: %s', 'dokan-lite' ), '{site_name},{amount},{user_name}' ), + 'placeholder' => $this->get_default_subject(), + 'default' => '', + ), + 'heading' => array( + 'title' => __( 'Email heading', 'dokan-lite' ), + 'type' => 'text', + 'desc_tip' => true, + /* translators: %s: list of placeholders */ + 'description' => sprintf( __( 'Available placeholders: %s', 'dokan-lite' ), '{site_name},{amount},{user_name}' ), + 'placeholder' => $this->get_default_heading(), + 'default' => '', + ), + 'email_type' => array( + 'title' => __( 'Email type', 'dokan-lite' ), + 'type' => 'select', + 'description' => __( 'Choose which format of email to send.', 'dokan-lite' ), + 'default' => 'html', + 'class' => 'email_type wc-enhanced-select', + 'options' => $this->get_email_type_options(), + 'desc_tip' => true, + ), + ); + } +} + +endif; + +return new Dokan_Email_Withdraw_Approved(); diff --git a/includes/emails/class-dokan-withdraw-cancelled.php b/includes/emails/class-dokan-withdraw-cancelled.php new file mode 100644 index 0000000000..26a55e0947 --- /dev/null +++ b/includes/emails/class-dokan-withdraw-cancelled.php @@ -0,0 +1,183 @@ +id = 'dokan_vendor_withdraw_cancelled'; + $this->title = __( 'Dokan Withdraw cancelled', 'dokan-lite' ); + $this->description = __( 'These emails are sent to vendor when a vendor withdraw request is cancelled', 'dokan-lite' ); + $this->template_html = 'emails/withdraw-cancel.php'; + $this->template_plain = 'emails/plain/withdraw-cancel.php'; + $this->template_base = DOKAN_DIR.'/templates/'; + + // Triggers for this email + add_action( 'dokan_withdraw_request_cancelled', array( $this, 'trigger' ), 30, 4 ); + + // Call parent constructor + parent::__construct(); + + // Other settings + $this->recipient = 'venodor@ofthe.product'; + } + + /** + * Get email subject. + * + * @since 3.1.0 + * @return string + */ + public function get_default_subject() { + return __( '[{site_name}] Your withdrawal request was cancelled', 'dokan-lite' ); + } + + /** + * Get email heading. + * + * @since 3.1.0 + * @return string + */ + public function get_default_heading() { + return __( 'Withdrawal request for {amount} is cancelled', 'dokan-lite' ); + } + + /** + * Trigger the sending of this email. + * + * @param int $product_id The product ID. + * @param array $postdata. + */ + public function trigger( $user_id, $amount, $method, $note ) { + + if ( ! $this->is_enabled() || ! $this->get_recipient() ) { + return; + } + + $seller = get_user_by( 'id', $user_id ); + $this->object = $seller; + $this->find['username'] = '{user_name}'; + $this->find['amount'] = '{amount}'; + $this->find['method'] = '{method}'; + $this->find['profile_url'] = '{profile_url}'; + $this->find['withdraw_page'] = '{withdraw_page}'; + $this->find['site_name'] = '{site_name}'; + $this->find['site_url'] = '{site_url}'; + $this->find['note'] = '{note}'; + + $this->replace['username'] = $seller->user_login; + $this->replace['amount'] = wc_price( $amount ); + $this->replace['method'] = dokan_withdraw_get_method_title( $method ); + $this->replace['profile_url'] = admin_url( 'user-edit.php?user_id=' . $seller->ID ); + $this->replace['withdraw_page'] = admin_url( 'admin.php?page=dokan-withdraw' ); + $this->replace['site_name'] = $this->get_from_name(); + $this->replace['site_url'] = site_url(); + $this->replace['note'] = $note; + + $this->setup_locale(); + $this->send( $seller->user_email, $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() ); + $this->restore_locale(); + + } + + /** + * Get content html. + * + * @access public + * @return string + */ + public function get_content_html() { + ob_start(); + wc_get_template( $this->template_html, array( + 'seller' => $this->object, + 'email_heading' => $this->get_heading(), + 'sent_to_admin' => true, + 'plain_text' => false, + 'email' => $this, + 'data' => $this->replace + ), 'dokan/', $this->template_base ); + return ob_get_clean(); + + } + + /** + * Get content plain. + * + * @access public + * @return string + */ + public function get_content_plain() { + ob_start(); + wc_get_template( $this->template_html, array( + 'seller' => $this->object, + 'email_heading' => $this->get_heading(), + 'sent_to_admin' => true, + 'plain_text' => true, + 'email' => $this, + 'data' => $this->replace + ), 'dokan/', $this->template_base ); + return ob_get_clean(); + } + + /** + * Initialise settings form fields. + */ + public function init_form_fields() { + $this->form_fields = array( + 'enabled' => array( + 'title' => __( 'Enable/Disable', 'dokan-lite' ), + 'type' => 'checkbox', + 'label' => __( 'Enable this email notification', 'dokan-lite' ), + 'default' => 'yes', + ), + 'subject' => array( + 'title' => __( 'Subject', 'dokan-lite' ), + 'type' => 'text', + 'desc_tip' => true, + /* translators: %s: list of placeholders */ + 'description' => sprintf( __( 'Available placeholders: %s', 'dokan-lite' ), '{site_name},{amount},{user_name}' ), + 'placeholder' => $this->get_default_subject(), + 'default' => '', + ), + 'heading' => array( + 'title' => __( 'Email heading', 'dokan-lite' ), + 'type' => 'text', + 'desc_tip' => true, + /* translators: %s: list of placeholders */ + 'description' => sprintf( __( 'Available placeholders: %s', 'dokan-lite' ), '{site_name},{amount},{user_name}' ), + 'placeholder' => $this->get_default_heading(), + 'default' => '', + ), + 'email_type' => array( + 'title' => __( 'Email type', 'dokan-lite' ), + 'type' => 'select', + 'description' => __( 'Choose which format of email to send.', 'dokan-lite' ), + 'default' => 'html', + 'class' => 'email_type wc-enhanced-select', + 'options' => $this->get_email_type_options(), + 'desc_tip' => true, + ), + ); + } +} + +endif; + +return new Dokan_Email_Withdraw_Cancelled(); diff --git a/includes/functions.php b/includes/functions.php index cea81d38cd..bede6431b2 100755 --- a/includes/functions.php +++ b/includes/functions.php @@ -383,8 +383,12 @@ function dokan_get_seller_percentage( $seller_id = 0, $product_id = 0 ) { if ( $_per_product_commission != '' ) { return (float) $_per_product_commission; } + $category_commission = dokan_get_category_wise_seller_commission( $product_id ); + if ( !empty( $category_commission ) ) { + return (float) $category_commission; + } } - + //return seller wise percentage if ( $seller_id ) { $seller_percentage = get_user_meta( $seller_id, 'dokan_seller_percentage', true ); @@ -1590,6 +1594,10 @@ function dokan_get_social_profile_fields() { 'icon' => 'twitter-square', 'title' => __( 'Twitter', 'dokan-lite' ), ), + 'pinterest' => array( + 'icon' => 'pinterest-square', + 'title' => __( 'Pinterest', 'dokan-lite' ), + ), 'linkedin' => array( 'icon' => 'linkedin-square', 'title' => __( 'LinkedIn', 'dokan-lite' ), @@ -1847,4 +1855,28 @@ function dokan_set_is_home_false_on_store() { } } -register_sidebar( array( 'name' => __( 'Dokan Store Sidebar', 'dokan-lite' ), 'id' => 'sidebar-store' ) ); \ No newline at end of file +register_sidebar( array( 'name' => __( 'Dokan Store Sidebar', 'dokan-lite' ), 'id' => 'sidebar-store' ) ); + +/** + * Calculate category wise commission for given product + * + * @since 2.6.8 + * + * @param int $product_id + * + * @return int $commission_rate + * + */ +function dokan_get_category_wise_seller_commission( $product_id ){ + + $terms = get_the_terms( $product_id, 'product_cat' ); + $category_commision = null; + + if ( $terms ) { + if ( 1 == count( $terms ) ) { + $category_commision = get_woocommerce_term_meta( $terms[0]->term_id, 'per_category_commission', true ); + } + } + + return $category_commision; +} \ No newline at end of file diff --git a/includes/order-functions.php b/includes/order-functions.php index 07364f7178..0f16c614aa 100755 --- a/includes/order-functions.php +++ b/includes/order-functions.php @@ -481,6 +481,10 @@ function dokan_get_order_status_class( $status ) { case 'wc-failed': return 'danger'; break; + + default: + return apply_filters( 'dokan_get_order_status_class', '', $status ); + break; } } @@ -526,6 +530,10 @@ function dokan_get_order_status_translated( $status ) { case 'wc-failed': return __( 'Failed', 'dokan-lite' ); break; + + default: + return apply_filters( 'dokan_get_order_status_translated', '', $status ); + break; } } diff --git a/includes/product-functions.php b/includes/product-functions.php index 0e31bda7ca..5454da2ccb 100644 --- a/includes/product-functions.php +++ b/includes/product-functions.php @@ -143,10 +143,6 @@ function dokan_save_product( $args ) { do_action( 'dokan_new_product_added', $product_id, $data ); - if ( dokan_get_option( 'product_add_mail', 'dokan_general', 'on' ) == 'on' ) { - Dokan_Email::init()->new_product_added( $product_id, $post_status ); - } - return $product_id; } @@ -348,6 +344,93 @@ function dokan_get_product_visibility_options() { ) ); } +/** + * Search product data for a term and users ids and return only ids. + * + * @param string $term + * @param string $user_ids + * @param string $type of product + * @param bool $include_variations in search or not + * + * @return array of ids + */ +function dokan_search_seller_products( $term, $user_ids = false, $type = '', $include_variations = false ) { + global $wpdb; + + $like_term = '%' . $wpdb->esc_like( $term ) . '%'; + $post_types = $include_variations ? array( 'product', 'product_variation' ) : array( 'product' ); + $post_statuses = current_user_can( 'edit_private_products' ) ? array( 'private', 'publish' ) : array( 'publish' ); + $type_join = ''; + $type_where = ''; + $users_where = ''; + + if ( $type ) { + if ( in_array( $type, array( 'virtual', 'downloadable' ) ) ) { + $type_join = " LEFT JOIN {$wpdb->postmeta} postmeta_type ON posts.ID = postmeta_type.post_id "; + $type_where = " AND ( postmeta_type.meta_key = '_{$type}' AND postmeta_type.meta_value = 'yes' ) "; + } + } + + if ( $user_ids ) { + if ( is_array( $user_ids ) ) { + $users_where = " AND posts.post_author IN ('" . implode( "','", $user_ids ) . "')"; + } else { + $users_where = " AND posts.post_author = '$user_ids'"; + } + } + + $product_ids = $wpdb->get_col( + $wpdb->prepare( " + SELECT DISTINCT posts.ID FROM {$wpdb->posts} posts + LEFT JOIN {$wpdb->postmeta} postmeta ON posts.ID = postmeta.post_id + $type_join + WHERE ( + posts.post_title LIKE %s + OR posts.post_content LIKE %s + OR ( + postmeta.meta_key = '_sku' AND postmeta.meta_value LIKE %s + ) + ) + AND posts.post_type IN ('" . implode( "','", $post_types ) . "') + AND posts.post_status IN ('" . implode( "','", $post_statuses ) . "') + $type_where + $users_where + ORDER BY posts.post_parent ASC, posts.post_title ASC + ", + $like_term, + $like_term, + $like_term + ) + ); + + if ( is_numeric( $term ) ) { + $post_id = absint( $term ); + $post_type = get_post_type( $post_id ); + + if ( 'product_variation' === $post_type && $include_variations ) { + $product_ids[] = $post_id; + } elseif ( 'product' === $post_type ) { + $product_ids[] = $post_id; + } + + $product_ids[] = wp_get_post_parent_id( $post_id ); + } + + return wp_parse_id_list( $product_ids ); +} + +/** + * Callback for array filter to get products the user can edit only. + * + * @since 2.6.8 + * @param WC_Product $product + * @return bool + */ +function dokan_products_array_filter_editable( $product ) { + return $product && is_a( $product, 'WC_Product' ) && current_user_can( 'dokandar', $product->get_id() ); +} + + diff --git a/includes/wc-functions.php b/includes/wc-functions.php index 423d46dd4a..3fb8f42543 100755 --- a/includes/wc-functions.php +++ b/includes/wc-functions.php @@ -11,6 +11,7 @@ function dokan_process_product_meta( $post_id ) { global $wpdb, $woocommerce, $woocommerce_errors; $product_type = empty( $_POST['product_type'] ) ? 'simple' : stripslashes( $_POST['product_type'] ); + // Add any default post meta add_post_meta( $post_id, 'total_sales', '0', true ); @@ -208,38 +209,46 @@ function dokan_process_product_meta( $post_id ) { update_post_meta( $post_id, '_product_attributes', $attributes ); - // Sales and prices - $date_from = (string) isset( $_POST['_sale_price_dates_from'] ) ? wc_clean( $_POST['_sale_price_dates_from'] ) : ''; - $date_to = (string) isset( $_POST['_sale_price_dates_to'] ) ? wc_clean( $_POST['_sale_price_dates_to'] ) : ''; - $regular_price = (string) isset( $_POST['_regular_price'] ) ? wc_clean( $_POST['_regular_price'] ) : ''; - $sale_price = (string) isset( $_POST['_sale_price'] ) ? wc_clean( $_POST['_sale_price'] ) : ''; - - update_post_meta( $post_id, '_regular_price', '' === $regular_price ? '' : wc_format_decimal( $regular_price ) ); - update_post_meta( $post_id, '_sale_price', '' === $sale_price ? '' : wc_format_decimal( $sale_price ) ); - - // Dates - update_post_meta( $post_id, '_sale_price_dates_from', $date_from ? strtotime( $date_from ) : '' ); - update_post_meta( $post_id, '_sale_price_dates_to', $date_to ? strtotime( $date_to ) : '' ); - - if ( $date_to && ! $date_from ) { - $date_from = date( 'Y-m-d' ); - update_post_meta( $post_id, '_sale_price_dates_from', strtotime( $date_from ) ); - } - - // Update price if on sale - if ( '' !== $sale_price && '' === $date_to && '' === $date_from ) { - update_post_meta( $post_id, '_price', wc_format_decimal( $sale_price ) ); - } elseif ( '' !== $sale_price && $date_from && strtotime( $date_from ) <= strtotime( 'NOW', current_time( 'timestamp' ) ) ) { - update_post_meta( $post_id, '_price', wc_format_decimal( $sale_price ) ); - } else { - update_post_meta( $post_id, '_price', '' === $regular_price ? '' : wc_format_decimal( $regular_price ) ); - } - - if ( $date_to && strtotime( $date_to ) < strtotime( 'NOW', current_time( 'timestamp' ) ) ) { - update_post_meta( $post_id, '_price', '' === $regular_price ? '' : wc_format_decimal( $regular_price ) ); + if ( in_array( $product_type, array( 'variable', 'grouped' ) ) ) { + // Variable and grouped products have no prices + update_post_meta( $post_id, '_regular_price', '' ); update_post_meta( $post_id, '_sale_price', '' ); update_post_meta( $post_id, '_sale_price_dates_from', '' ); update_post_meta( $post_id, '_sale_price_dates_to', '' ); + } else { + // Sales and prices + $date_from = (string) isset( $_POST['_sale_price_dates_from'] ) ? wc_clean( $_POST['_sale_price_dates_from'] ) : ''; + $date_to = (string) isset( $_POST['_sale_price_dates_to'] ) ? wc_clean( $_POST['_sale_price_dates_to'] ) : ''; + $regular_price = (string) isset( $_POST['_regular_price'] ) ? wc_clean( $_POST['_regular_price'] ) : ''; + $sale_price = (string) isset( $_POST['_sale_price'] ) ? wc_clean( $_POST['_sale_price'] ) : ''; + + update_post_meta( $post_id, '_regular_price', '' === $regular_price ? '' : wc_format_decimal( $regular_price ) ); + update_post_meta( $post_id, '_sale_price', '' === $sale_price ? '' : wc_format_decimal( $sale_price ) ); + + // Dates + update_post_meta( $post_id, '_sale_price_dates_from', $date_from ? strtotime( $date_from ) : '' ); + update_post_meta( $post_id, '_sale_price_dates_to', $date_to ? strtotime( $date_to ) : '' ); + + if ( $date_to && ! $date_from ) { + $date_from = date( 'Y-m-d' ); + update_post_meta( $post_id, '_sale_price_dates_from', strtotime( $date_from ) ); + } + + // Update price if on sale + if ( '' !== $sale_price && '' === $date_to && '' === $date_from ) { + update_post_meta( $post_id, '_price', wc_format_decimal( $sale_price ) ); + } elseif ( '' !== $sale_price && $date_from && strtotime( $date_from ) <= strtotime( 'NOW', current_time( 'timestamp' ) ) ) { + update_post_meta( $post_id, '_price', wc_format_decimal( $sale_price ) ); + } else { + update_post_meta( $post_id, '_price', '' === $regular_price ? '' : wc_format_decimal( $regular_price ) ); + } + + if ( $date_to && strtotime( $date_to ) < strtotime( 'NOW', current_time( 'timestamp' ) ) ) { + update_post_meta( $post_id, '_price', '' === $regular_price ? '' : wc_format_decimal( $regular_price ) ); + update_post_meta( $post_id, '_sale_price', '' ); + update_post_meta( $post_id, '_sale_price_dates_from', '' ); + update_post_meta( $post_id, '_sale_price_dates_to', '' ); + } } //enable reviews @@ -481,7 +490,7 @@ function dokan_seller_registration_errors( $error ) { return $error; } - + } add_filter( 'woocommerce_process_registration_errors', 'dokan_seller_registration_errors' ); @@ -536,8 +545,8 @@ function dokan_on_create_seller( $user_id, $data ) { update_user_meta( $user_id, 'dokan_profile_settings', $dokan_settings ); update_user_meta( $user_id, 'dokan_store_name', $dokan_settings['store_name'] ); - - Dokan_Email::init()->new_seller_registered_mail( $user_id ); + + do_action( 'dokan_new_seller_created', $user_id, $dokan_settings ); } add_action( 'woocommerce_created_customer', 'dokan_on_create_seller', 10, 2); @@ -1153,3 +1162,26 @@ function dokan_clear_product_category_cache( $post_id ) { delete_transient( 'dokan-store-category-' . $seller_id ); } + +if ( !function_exists( 'dokan_date_time_format' ) ) { + + /** + * Format date time string to WC format + * + * @since 2.6.8 + * + * @param string $time + * @param boolean $date_only + * @return string + */ + function dokan_date_time_format( $time, $date_only = false ) { + + $format = apply_filters( 'dokan_date_time_format', wc_date_format() . ' ' . wc_time_format() ); + + if ( $date_only ) { + return date_i18n( wc_date_format(), strtotime( $time ) ); + } + return date_i18n( $format, strtotime( $time ) ); + } + +} diff --git a/languages/dokan-lite.pot b/languages/dokan-lite.pot index 66460a35db..a1c223c705 100644 --- a/languages/dokan-lite.pot +++ b/languages/dokan-lite.pot @@ -2,9 +2,9 @@ # This file is distributed under the GPL2. msgid "" msgstr "" -"Project-Id-Version: Dokan 2.6.7\n" +"Project-Id-Version: Dokan 2.6.8\n" "Report-Msgid-Bugs-To: http://wedevs.com/support/forum/theme-support/dokan/\n" -"POT-Creation-Date: 2017-08-03 04:10:07+00:00\n" +"POT-Creation-Date: 2017-09-07 05:57:52+00:00\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -17,7 +17,7 @@ msgstr "" msgid "1" msgstr "" -#: classes/admin-user-profile.php:67 classes/seller-setup-wizard.php:273 +#: classes/admin-user-profile.php:67 classes/seller-setup-wizard.php:274 msgid "Country" msgstr "" @@ -169,12 +169,14 @@ msgstr "" #: classes/admin-withdraw.php:220 classes/admin-withdraw.php:234 #: templates/withdraw/approved-request-listing.php:14 +#: templates/withdraw/cancelled-request-listing.php:14 #: templates/withdraw/pending-request-listing.php:14 msgid "Amount" msgstr "" #: classes/admin-withdraw.php:221 classes/admin-withdraw.php:235 #: templates/withdraw/approved-request-listing.php:15 +#: templates/withdraw/cancelled-request-listing.php:15 #: templates/withdraw/pending-request-listing.php:15 msgid "Method" msgstr "" @@ -184,6 +186,7 @@ msgid "Method Details" msgstr "" #: classes/admin-withdraw.php:223 classes/admin-withdraw.php:237 +#: templates/withdraw/cancelled-request-listing.php:17 msgid "Note" msgstr "" @@ -197,6 +200,7 @@ msgstr "" #: templates/products/products-listing.php:65 #: templates/products/products-listing.php:200 templates/sub-orders.php:26 #: templates/withdraw/approved-request-listing.php:16 +#: templates/withdraw/cancelled-request-listing.php:16 #: templates/withdraw/pending-request-listing.php:16 msgid "Date" msgstr "" @@ -206,7 +210,7 @@ msgid "Approve" msgstr "" #: classes/admin-withdraw.php:264 classes/admin-withdraw.php:268 -#: includes/product-functions.php:301 templates/my-orders.php:83 +#: includes/product-functions.php:297 templates/my-orders.php:83 #: templates/orders/details.php:186 #: templates/products/new-product-single.php:225 #: templates/products/new-product.php:159 @@ -222,7 +226,7 @@ msgid "Pending" msgstr "" #: classes/admin-withdraw.php:279 classes/admin-withdraw.php:358 -#: classes/ajax.php:443 includes/woo-views/html-product-download.php:18 +#: classes/ajax.php:446 includes/woo-views/html-product-download.php:18 #: includes/woo-views/html-product-download.php:38 msgid "Delete" msgstr "" @@ -275,60 +279,60 @@ msgstr "" msgid "»" msgstr "" -#: classes/ajax.php:91 +#: classes/ajax.php:94 msgid "Something wrong, please try again later" msgstr "" -#: classes/ajax.php:105 +#: classes/ajax.php:108 msgid "
Vendor: %s" msgstr "" -#: classes/ajax.php:120 classes/template-settings.php:207 +#: classes/ajax.php:123 classes/template-settings.php:207 #: classes/template-settings.php:215 classes/template-settings.php:221 #: classes/template-settings.php:227 classes/template-settings.php:261 #: classes/template-settings.php:323 classes/template-settings.php:362 -#: classes/template-settings.php:409 classes/template-withdraw.php:175 -#: classes/template-withdraw.php:200 +#: classes/template-settings.php:409 classes/template-withdraw.php:177 +#: classes/template-withdraw.php:202 msgid "Are you cheating?" msgstr "" -#: classes/ajax.php:155 classes/ajax.php:189 +#: classes/ajax.php:158 classes/ajax.php:192 msgid "You do not have sufficient permissions to access this page." msgstr "" -#: classes/ajax.php:159 classes/ajax.php:193 +#: classes/ajax.php:162 classes/ajax.php:196 msgid "You have taken too long. Please go back and retry." msgstr "" -#: classes/ajax.php:168 classes/ajax.php:202 +#: classes/ajax.php:171 classes/ajax.php:205 msgid "You do not have permission to change this order" msgstr "" -#: classes/ajax.php:253 +#: classes/ajax.php:256 msgid "File %d" msgstr "" -#: classes/ajax.php:304 classes/ajax.php:309 +#: classes/ajax.php:307 classes/ajax.php:312 msgid "Please provide your name." msgstr "" -#: classes/ajax.php:316 includes/template-tags.php:140 +#: classes/ajax.php:319 includes/template-tags.php:140 msgid "Something went wrong!" msgstr "" -#: classes/ajax.php:322 +#: classes/ajax.php:325 msgid "Email sent successfully!" msgstr "" -#: classes/ajax.php:377 templates/orders/details.php:265 +#: classes/ajax.php:380 templates/orders/details.php:265 msgid "Delete note" msgstr "" -#: classes/ajax.php:531 +#: classes/ajax.php:534 msgid "Error: Nonce verification failed" msgstr "" -#: classes/ajax.php:621 +#: classes/ajax.php:624 msgid "Image could not be processed. Please go back and try again." msgstr "" @@ -434,7 +438,7 @@ msgstr "" #: classes/installer.php:135 includes/admin/admin.php:322 #: includes/admin/setup-wizard.php:263 includes/admin-functions.php:52 -#: includes/admin-functions.php:563 includes/admin-functions.php:587 +#: includes/admin-functions.php:564 includes/admin-functions.php:588 #: includes/wc-template.php:14 templates/my-orders.php:31 msgid "Vendor" msgstr "" @@ -503,71 +507,71 @@ msgstr "" msgid "Not right now" msgstr "" -#: classes/seller-setup-wizard.php:241 includes/admin/setup-wizard.php:267 +#: classes/seller-setup-wizard.php:242 includes/admin/setup-wizard.php:267 msgid "Store Setup" msgstr "" -#: classes/seller-setup-wizard.php:245 templates/settings/store-form.php:117 +#: classes/seller-setup-wizard.php:246 templates/settings/store-form.php:117 msgid "Store Product Per Page" msgstr "" -#: classes/seller-setup-wizard.php:251 +#: classes/seller-setup-wizard.php:252 msgid "Street" msgstr "" -#: classes/seller-setup-wizard.php:257 templates/settings/address-form.php:44 +#: classes/seller-setup-wizard.php:258 templates/settings/address-form.php:44 msgid "Street 2" msgstr "" -#: classes/seller-setup-wizard.php:263 templates/settings/address-form.php:60 +#: classes/seller-setup-wizard.php:264 templates/settings/address-form.php:60 msgid "City" msgstr "" -#: classes/seller-setup-wizard.php:268 +#: classes/seller-setup-wizard.php:269 msgid "Post/Zip Code" msgstr "" -#: classes/seller-setup-wizard.php:280 +#: classes/seller-setup-wizard.php:281 msgid "State" msgstr "" -#: classes/seller-setup-wizard.php:282 +#: classes/seller-setup-wizard.php:283 msgid "State Name" msgstr "" -#: classes/seller-setup-wizard.php:286 templates/settings/store-form.php:147 +#: classes/seller-setup-wizard.php:287 templates/settings/store-form.php:147 msgid "Email" msgstr "" -#: classes/seller-setup-wizard.php:289 templates/settings/store-form.php:152 +#: classes/seller-setup-wizard.php:290 templates/settings/store-form.php:152 msgid "Show email address in store" msgstr "" -#: classes/seller-setup-wizard.php:295 classes/seller-setup-wizard.php:429 +#: classes/seller-setup-wizard.php:298 classes/seller-setup-wizard.php:437 #: includes/admin/setup-wizard.php:293 includes/admin/setup-wizard.php:373 #: includes/admin/setup-wizard.php:459 msgid "Continue" msgstr "" -#: classes/seller-setup-wizard.php:296 classes/seller-setup-wizard.php:430 +#: classes/seller-setup-wizard.php:299 classes/seller-setup-wizard.php:438 #: includes/admin/setup-wizard.php:294 includes/admin/setup-wizard.php:374 #: includes/admin/setup-wizard.php:460 msgid "Skip this step" msgstr "" -#: classes/seller-setup-wizard.php:316 +#: classes/seller-setup-wizard.php:318 msgid "Select an option…" msgstr "" -#: classes/seller-setup-wizard.php:407 +#: classes/seller-setup-wizard.php:413 msgid "Payment Setup" msgstr "" -#: classes/seller-setup-wizard.php:486 +#: classes/seller-setup-wizard.php:499 msgid "Your Store is Ready!" msgstr "" -#: classes/seller-setup-wizard.php:491 +#: classes/seller-setup-wizard.php:504 msgid "Go to your Store Dashboard!" msgstr "" @@ -625,27 +629,27 @@ msgstr "" msgid "Details of your product ..." msgstr "" -#: classes/template-products.php:120 classes/template-products.php:246 +#: classes/template-products.php:120 classes/template-products.php:242 #: includes/product-functions.php:32 msgid "Please enter product title" msgstr "" -#: classes/template-products.php:126 classes/template-products.php:252 +#: classes/template-products.php:126 classes/template-products.php:248 #: includes/product-functions.php:38 msgid "Please select a category" msgstr "" -#: classes/template-products.php:130 classes/template-products.php:256 +#: classes/template-products.php:130 classes/template-products.php:252 #: includes/product-functions.php:42 msgid "Please select AT LEAST ONE category" msgstr "" -#: classes/template-products.php:263 +#: classes/template-products.php:259 msgid "No product found !" msgstr "" #: classes/template-settings.php:70 classes/template-settings.php:74 -#: dokan.php:806 includes/admin/admin.php:236 includes/admin/admin.php:579 +#: dokan.php:814 includes/admin/admin.php:236 includes/admin/admin.php:579 #: includes/admin/welcome.php:20 msgid "Settings" msgstr "" @@ -687,7 +691,7 @@ msgstr "" msgid "Add Profile Picture to gain %s%% progress" msgstr "" -#: classes/template-settings.php:587 includes/functions.php:1583 +#: classes/template-settings.php:587 includes/functions.php:1587 msgid "Facebook" msgstr "" @@ -751,53 +755,53 @@ msgstr "" msgid "
Withdraw Threshold: %d days " msgstr "" -#: classes/template-withdraw.php:209 +#: classes/template-withdraw.php:211 msgid "Withdraw amount required " msgstr "" -#: classes/template-withdraw.php:212 +#: classes/template-withdraw.php:214 msgid "You don't have enough balance for this request" msgstr "" -#: classes/template-withdraw.php:214 +#: classes/template-withdraw.php:216 msgid "Withdraw amount must be greater than %d" msgstr "" -#: classes/template-withdraw.php:218 +#: classes/template-withdraw.php:220 msgid "withdraw method required" msgstr "" -#: classes/template-withdraw.php:281 +#: classes/template-withdraw.php:284 msgid "Your request has been cancelled successfully!" msgstr "" -#: classes/template-withdraw.php:285 +#: classes/template-withdraw.php:288 msgid "Your request has been received successfully and being reviewed!" msgstr "" -#: classes/template-withdraw.php:289 +#: classes/template-withdraw.php:292 msgid "Unknown error!" msgstr "" -#: classes/template-withdraw.php:316 +#: classes/template-withdraw.php:319 msgid "You already withdrawed %s. This amount will deducted from your balance." msgstr "" -#: classes/template-withdraw.php:325 +#: classes/template-withdraw.php:328 msgid "You already have pending withdraw request(s)." msgstr "" -#: classes/template-withdraw.php:325 +#: classes/template-withdraw.php:328 msgid "" "Please submit your request after approval or cancellation of your previous " "request." msgstr "" -#: classes/template-withdraw.php:340 +#: classes/template-withdraw.php:343 msgid "You don't have sufficient balance for a withdraw request!" msgstr "" -#: classes/template-withdraw.php:383 +#: classes/template-withdraw.php:386 classes/template-withdraw.php:413 msgid "Sorry, no transactions were found!" msgstr "" @@ -836,229 +840,229 @@ msgstr "" msgid "Dokan requires %sWooCommerce%s to be installed & activated!" msgstr "" -#: dokan.php:304 +#: dokan.php:309 msgid "Available" msgstr "" -#: dokan.php:305 +#: dokan.php:310 msgid "Not Available" msgstr "" -#: dokan.php:307 +#: dokan.php:312 msgid "Are you sure?" msgstr "" -#: dokan.php:308 +#: dokan.php:313 msgid "Something went wrong. Please try again." msgstr "" -#: dokan.php:371 +#: dokan.php:376 msgid "Upload featured image" msgstr "" -#: dokan.php:372 +#: dokan.php:377 msgid "Choose a file" msgstr "" -#: dokan.php:373 +#: dokan.php:378 msgid "Add Images to Product Gallery" msgstr "" -#: dokan.php:374 +#: dokan.php:379 msgid "Set featured image" msgstr "" -#: dokan.php:375 includes/woo-views/html-product-download.php:17 +#: dokan.php:380 includes/woo-views/html-product-download.php:17 #: includes/woo-views/html-product-download.php:32 msgid "Insert file URL" msgstr "" -#: dokan.php:376 +#: dokan.php:381 msgid "Add to gallery" msgstr "" -#: dokan.php:377 +#: dokan.php:382 msgid "Sorry, this attribute option already exists, Try a different one." msgstr "" -#: dokan.php:378 +#: dokan.php:383 msgid "" "Warning! This product will not have any variations if this option is not " "checked." msgstr "" -#: dokan.php:379 +#: dokan.php:384 msgid "Enter a name for the new attribute term:" msgstr "" -#: dokan.php:380 +#: dokan.php:385 msgid "Remove this attribute?" msgstr "" -#: dokan.php:388 +#: dokan.php:393 msgid "" "Are you sure you want to link all variations? This will create a new " "variation for each and every possible combination of variation attributes " "(max %d per run)." msgstr "" -#: dokan.php:389 +#: dokan.php:394 msgid "Enter a value" msgstr "" -#: dokan.php:390 +#: dokan.php:395 msgid "Variation menu order (determines position in the list of variations)" msgstr "" -#: dokan.php:391 +#: dokan.php:396 msgid "Enter a value (fixed or %)" msgstr "" -#: dokan.php:392 +#: dokan.php:397 msgid "Are you sure you want to delete all variations? This cannot be undone." msgstr "" -#: dokan.php:393 +#: dokan.php:398 msgid "Last warning, are you sure?" msgstr "" -#: dokan.php:394 +#: dokan.php:399 msgid "Choose an image" msgstr "" -#: dokan.php:395 +#: dokan.php:400 msgid "Set variation image" msgstr "" -#: dokan.php:396 +#: dokan.php:401 msgid "variation added" msgstr "" -#: dokan.php:397 +#: dokan.php:402 msgid "variations added" msgstr "" -#: dokan.php:398 +#: dokan.php:403 msgid "No variations added" msgstr "" -#: dokan.php:399 +#: dokan.php:404 msgid "Are you sure you want to remove this variation?" msgstr "" -#: dokan.php:400 +#: dokan.php:405 msgid "Sale start date (YYYY-MM-DD format or leave blank)" msgstr "" -#: dokan.php:401 +#: dokan.php:406 msgid "Sale end date (YYYY-MM-DD format or leave blank)" msgstr "" -#: dokan.php:402 +#: dokan.php:407 msgid "Save changes before changing page?" msgstr "" -#: dokan.php:403 +#: dokan.php:408 msgid "%qty% variation" msgstr "" -#: dokan.php:404 +#: dokan.php:409 msgid "%qty% variations" msgstr "" -#: dokan.php:405 +#: dokan.php:410 msgid "No Result Found" msgstr "" -#: dokan.php:408 +#: dokan.php:413 msgid "Select and Crop" msgstr "" -#: dokan.php:409 +#: dokan.php:414 msgid "Choose Image" msgstr "" -#: dokan.php:410 +#: dokan.php:415 msgid "Product title is required" msgstr "" -#: dokan.php:411 +#: dokan.php:416 msgid "Product category is required" msgstr "" -#: dokan.php:444 +#: dokan.php:450 msgid "This field is required" msgstr "" -#: dokan.php:445 +#: dokan.php:451 msgid "Please fix this field." msgstr "" -#: dokan.php:446 +#: dokan.php:452 msgid "Please enter a valid email address." msgstr "" -#: dokan.php:447 +#: dokan.php:453 msgid "Please enter a valid URL." msgstr "" -#: dokan.php:448 +#: dokan.php:454 msgid "Please enter a valid date." msgstr "" -#: dokan.php:449 +#: dokan.php:455 msgid "Please enter a valid date (ISO)." msgstr "" -#: dokan.php:450 +#: dokan.php:456 msgid "Please enter a valid number." msgstr "" -#: dokan.php:451 +#: dokan.php:457 msgid "Please enter only digits." msgstr "" -#: dokan.php:452 +#: dokan.php:458 msgid "Please enter a valid credit card number." msgstr "" -#: dokan.php:453 +#: dokan.php:459 msgid "Please enter the same value again." msgstr "" -#: dokan.php:454 +#: dokan.php:460 msgid "Please enter no more than {0} characters." msgstr "" -#: dokan.php:455 +#: dokan.php:461 msgid "Please enter at least {0} characters." msgstr "" -#: dokan.php:456 +#: dokan.php:462 msgid "Please enter a value between {0} and {1} characters long." msgstr "" -#: dokan.php:457 +#: dokan.php:463 msgid "Please enter a value between {0} and {1}." msgstr "" -#: dokan.php:458 +#: dokan.php:464 msgid "Please enter a value less than or equal to {0}." msgstr "" -#: dokan.php:459 +#: dokan.php:465 msgid "Please enter a value greater than or equal to {0}." msgstr "" -#: dokan.php:771 +#: dokan.php:779 msgid "Page %s" msgstr "" -#: dokan.php:803 +#: dokan.php:811 msgid "Get Pro" msgstr "" -#: dokan.php:807 includes/admin/welcome.php:21 +#: dokan.php:815 includes/admin/welcome.php:21 msgid "Documentation" msgstr "" @@ -1164,7 +1168,7 @@ msgstr "" msgid "Define the seller store URL (%s[this-text]/[seller-name])" msgstr "" -#: includes/admin/admin.php:312 includes/functions.php:997 +#: includes/admin/admin.php:312 includes/functions.php:1001 #: templates/settings/store-form.php:194 msgid "Terms and Conditions" msgstr "" @@ -1415,17 +1419,17 @@ msgstr "" msgid "Order Status for Withdraw" msgstr "" -#: includes/admin/setup-wizard.php:450 includes/order-functions.php:497 +#: includes/admin/setup-wizard.php:450 includes/order-functions.php:501 #: templates/dashboard/orders-widget.php:26 msgid "Completed" msgstr "" -#: includes/admin/setup-wizard.php:451 includes/order-functions.php:512 +#: includes/admin/setup-wizard.php:451 includes/order-functions.php:516 #: templates/dashboard/orders-widget.php:36 templates/orders/listing.php:96 msgid "Processing" msgstr "" -#: includes/admin/setup-wizard.php:452 includes/order-functions.php:507 +#: includes/admin/setup-wizard.php:452 includes/order-functions.php:511 msgid "On-hold" msgstr "" @@ -1526,12 +1530,12 @@ msgstr "" msgid "Approved" msgstr "" -#: includes/admin/withdraw.php:23 includes/order-functions.php:522 +#: includes/admin/withdraw.php:23 includes/order-functions.php:526 #: templates/dashboard/orders-widget.php:41 msgid "Cancelled" msgstr "" -#: includes/admin-functions.php:42 includes/product-functions.php:205 +#: includes/admin-functions.php:42 includes/product-functions.php:201 #: templates/my-orders.php:29 templates/orders/listing.php:19 #: templates/orders/listing.php:37 templates/products/products-listing.php:59 #: templates/products/products-listing.php:138 templates/sub-orders.php:27 @@ -1592,183 +1596,429 @@ msgstr "" msgid "Toggle Sub-orders" msgstr "" -#: includes/admin-functions.php:375 includes/admin-functions.php:737 +#: includes/admin-functions.php:375 includes/admin-functions.php:738 msgid "Total Sales" msgstr "" -#: includes/admin-functions.php:382 includes/admin-functions.php:744 +#: includes/admin-functions.php:382 includes/admin-functions.php:745 msgid "Total: " msgstr "" -#: includes/admin-functions.php:385 includes/admin-functions.php:747 +#: includes/admin-functions.php:385 includes/admin-functions.php:748 #: includes/reports.php:347 msgid "Number of orders" msgstr "" -#: includes/admin-functions.php:392 includes/admin-functions.php:754 +#: includes/admin-functions.php:392 includes/admin-functions.php:755 #: includes/reports.php:354 msgid "sales" msgstr "" -#: includes/admin-functions.php:395 includes/admin-functions.php:757 +#: includes/admin-functions.php:395 includes/admin-functions.php:758 msgid "Commision" msgstr "" -#: includes/admin-functions.php:402 includes/admin-functions.php:764 +#: includes/admin-functions.php:402 includes/admin-functions.php:765 msgid "Commision: " msgstr "" -#: includes/functions.php:553 templates/products/new-product-single.php:573 +#: includes/emails/class-dokan-email-contact-seller.php:24 +msgid "Dokan Contact Vendor" +msgstr "" + +#: includes/emails/class-dokan-email-contact-seller.php:25 +msgid "" +"These emails are sent to a vendor who is contacted by customer via contact " +"form widget " +msgstr "" + +#: includes/emails/class-dokan-email-contact-seller.php:47 +msgid "[{customer_name}] sent you a message from your store at - {site_name}" +msgstr "" + +#: includes/emails/class-dokan-email-contact-seller.php:57 +msgid "{customer_name} - Sent a message from {site_name}" +msgstr "" + +#: includes/emails/class-dokan-email-contact-seller.php:133 +#: includes/emails/class-dokan-email-new-product-pending.php:153 +#: includes/emails/class-dokan-email-new-product.php:161 +#: includes/emails/class-dokan-email-new-seller-registered.php:141 +#: includes/emails/class-dokan-email-product-published.php:146 +#: includes/emails/class-dokan-vendor-withdraw-request.php:143 +#: includes/emails/class-dokan-withdraw-approved.php:143 +#: includes/emails/class-dokan-withdraw-cancelled.php:145 +msgid "Enable/Disable" +msgstr "" + +#: includes/emails/class-dokan-email-contact-seller.php:135 +#: includes/emails/class-dokan-email-new-product-pending.php:155 +#: includes/emails/class-dokan-email-new-product.php:163 +#: includes/emails/class-dokan-email-new-seller-registered.php:143 +#: includes/emails/class-dokan-email-product-published.php:148 +#: includes/emails/class-dokan-vendor-withdraw-request.php:145 +#: includes/emails/class-dokan-withdraw-approved.php:145 +#: includes/emails/class-dokan-withdraw-cancelled.php:147 +msgid "Enable this email notification" +msgstr "" + +#: includes/emails/class-dokan-email-contact-seller.php:140 +#: includes/emails/class-dokan-email-new-product-pending.php:167 +#: includes/emails/class-dokan-email-new-product.php:175 +#: includes/emails/class-dokan-email-new-seller-registered.php:155 +#: includes/emails/class-dokan-email-product-published.php:153 +#: includes/emails/class-dokan-vendor-withdraw-request.php:157 +#: includes/emails/class-dokan-withdraw-approved.php:149 +#: includes/emails/class-dokan-withdraw-cancelled.php:151 +msgid "Subject" +msgstr "" + +#: includes/emails/class-dokan-email-contact-seller.php:144 +#: includes/emails/class-dokan-email-contact-seller.php:153 +#: includes/emails/class-dokan-email-new-product-pending.php:171 +#: includes/emails/class-dokan-email-new-product-pending.php:180 +#: includes/emails/class-dokan-email-new-product.php:179 +#: includes/emails/class-dokan-email-new-product.php:188 +#: includes/emails/class-dokan-email-new-seller-registered.php:159 +#: includes/emails/class-dokan-email-new-seller-registered.php:168 +#: includes/emails/class-dokan-email-product-published.php:157 +#: includes/emails/class-dokan-email-product-published.php:166 +#: includes/emails/class-dokan-vendor-withdraw-request.php:161 +#: includes/emails/class-dokan-vendor-withdraw-request.php:170 +#: includes/emails/class-dokan-withdraw-approved.php:153 +#: includes/emails/class-dokan-withdraw-approved.php:162 +#: includes/emails/class-dokan-withdraw-cancelled.php:155 +#: includes/emails/class-dokan-withdraw-cancelled.php:164 +#. translators: %s: list of placeholders +msgid "Available placeholders: %s" +msgstr "" + +#: includes/emails/class-dokan-email-contact-seller.php:149 +#: includes/emails/class-dokan-email-new-product-pending.php:176 +#: includes/emails/class-dokan-email-new-product.php:184 +#: includes/emails/class-dokan-email-new-seller-registered.php:164 +#: includes/emails/class-dokan-email-product-published.php:162 +#: includes/emails/class-dokan-vendor-withdraw-request.php:166 +#: includes/emails/class-dokan-withdraw-approved.php:158 +#: includes/emails/class-dokan-withdraw-cancelled.php:160 +msgid "Email heading" +msgstr "" + +#: includes/emails/class-dokan-email-contact-seller.php:158 +#: includes/emails/class-dokan-email-new-product-pending.php:185 +#: includes/emails/class-dokan-email-new-product.php:193 +#: includes/emails/class-dokan-email-new-seller-registered.php:173 +#: includes/emails/class-dokan-email-product-published.php:171 +#: includes/emails/class-dokan-vendor-withdraw-request.php:175 +#: includes/emails/class-dokan-withdraw-approved.php:167 +#: includes/emails/class-dokan-withdraw-cancelled.php:169 +msgid "Email type" +msgstr "" + +#: includes/emails/class-dokan-email-contact-seller.php:160 +#: includes/emails/class-dokan-email-new-product-pending.php:187 +#: includes/emails/class-dokan-email-new-product.php:195 +#: includes/emails/class-dokan-email-new-seller-registered.php:175 +#: includes/emails/class-dokan-email-product-published.php:173 +#: includes/emails/class-dokan-vendor-withdraw-request.php:177 +#: includes/emails/class-dokan-withdraw-approved.php:169 +#: includes/emails/class-dokan-withdraw-cancelled.php:171 +msgid "Choose which format of email to send." +msgstr "" + +#: includes/emails/class-dokan-email-new-product-pending.php:27 +msgid "Dokan New Pending Product" +msgstr "" + +#: includes/emails/class-dokan-email-new-product-pending.php:28 +msgid "" +"New Pending Product emails are sent to chosen recipient(s) when a new " +"product is created by vendors." +msgstr "" + +#: includes/emails/class-dokan-email-new-product-pending.php:50 +msgid "" +"[{site_title}] A New product is pending from ({seller_name}) - " +"{product_title}" +msgstr "" + +#: includes/emails/class-dokan-email-new-product-pending.php:60 +msgid "New pending product added by Vendor {seller_name}" +msgstr "" + +#: includes/emails/class-dokan-email-new-product-pending.php:159 +#: includes/emails/class-dokan-email-new-product.php:167 +#: includes/emails/class-dokan-email-new-seller-registered.php:147 +#: includes/emails/class-dokan-vendor-withdraw-request.php:149 +msgid "Recipient(s)" +msgstr "" + +#: includes/emails/class-dokan-email-new-product-pending.php:161 +#: includes/emails/class-dokan-email-new-product.php:169 +#: includes/emails/class-dokan-email-new-seller-registered.php:149 +#: includes/emails/class-dokan-vendor-withdraw-request.php:151 +msgid "Enter recipients (comma separated) for this email. Defaults to %s." +msgstr "" + +#: includes/emails/class-dokan-email-new-product.php:26 +msgid "Dokan New Product" +msgstr "" + +#: includes/emails/class-dokan-email-new-product.php:27 +msgid "" +"New Product emails are sent to chosen recipient(s) when a new product is " +"created by vendors." +msgstr "" + +#: includes/emails/class-dokan-email-new-product.php:49 +msgid "[{site_name}] A New product is added by ({seller_name}) - {product_title}" +msgstr "" + +#: includes/emails/class-dokan-email-new-product.php:59 +msgid "New product added by Vendor {seller_name}" +msgstr "" + +#: includes/emails/class-dokan-email-new-seller-registered.php:27 +msgid "Dokan New Seller Registered" +msgstr "" + +#: includes/emails/class-dokan-email-new-seller-registered.php:28 +msgid "" +"These emails are sent to chosen recipient(s) when a new vendor registers in " +"marketplace" +msgstr "" + +#: includes/emails/class-dokan-email-new-seller-registered.php:50 +msgid "[{site_name}] A New vendor has registered" +msgstr "" + +#: includes/emails/class-dokan-email-new-seller-registered.php:60 +msgid "New Vendor Registered - {seller_name}" +msgstr "" + +#: includes/emails/class-dokan-email-product-published.php:26 +msgid "Dokan Pending Product Published" +msgstr "" + +#: includes/emails/class-dokan-email-product-published.php:27 +msgid "" +"These emails are sent to vendor of the product when a pending product is " +"published." +msgstr "" + +#: includes/emails/class-dokan-email-product-published.php:49 +msgid "[{site_name}] Your product - {product_title} - is now published" +msgstr "" + +#: includes/emails/class-dokan-email-product-published.php:59 +msgid "{product_title} - is published" +msgstr "" + +#: includes/emails/class-dokan-vendor-withdraw-request.php:26 +msgid "Dokan New Withdrawal Request" +msgstr "" + +#: includes/emails/class-dokan-vendor-withdraw-request.php:27 +msgid "" +"These emails are sent to chosen recipient(s) when a vendor send request to " +"withdraw" +msgstr "" + +#: includes/emails/class-dokan-vendor-withdraw-request.php:49 +msgid "[{site_name}] A New withdrawal request is made by {user_name}" +msgstr "" + +#: includes/emails/class-dokan-vendor-withdraw-request.php:59 +msgid "New Withdraw Request from - {user_name}" +msgstr "" + +#: includes/emails/class-dokan-withdraw-approved.php:26 +msgid "Dokan Withdraw Approved" +msgstr "" + +#: includes/emails/class-dokan-withdraw-approved.php:27 +msgid "These emails are sent to vendor when a vendor withdraw request is approved" +msgstr "" + +#: includes/emails/class-dokan-withdraw-approved.php:49 +msgid "[{site_name}] Your withdrawal request was approved" +msgstr "" + +#: includes/emails/class-dokan-withdraw-approved.php:59 +msgid "Withdrawal request for {amount} is approved" +msgstr "" + +#: includes/emails/class-dokan-withdraw-cancelled.php:26 +msgid "Dokan Withdraw cancelled" +msgstr "" + +#: includes/emails/class-dokan-withdraw-cancelled.php:27 +msgid "These emails are sent to vendor when a vendor withdraw request is cancelled" +msgstr "" + +#: includes/emails/class-dokan-withdraw-cancelled.php:49 +msgid "[{site_name}] Your withdrawal request was cancelled" +msgstr "" + +#: includes/emails/class-dokan-withdraw-cancelled.php:59 +msgid "Withdrawal request for {amount} is cancelled" +msgstr "" + +#: includes/functions.php:557 templates/products/new-product-single.php:573 msgid "Online" msgstr "" -#: includes/functions.php:554 templates/products/new-product-single.php:574 +#: includes/functions.php:558 templates/products/new-product-single.php:574 msgid "Draft" msgstr "" -#: includes/functions.php:555 templates/dashboard/products-widget.php:41 +#: includes/functions.php:559 templates/dashboard/products-widget.php:41 msgid "Pending Review" msgstr "" -#: includes/functions.php:597 +#: includes/functions.php:601 msgid "Simple Product" msgstr "" -#: includes/functions.php:598 +#: includes/functions.php:602 msgid "Variable Product" msgstr "" -#: includes/functions.php:599 +#: includes/functions.php:603 msgid "Grouped Product" msgstr "" -#: includes/functions.php:600 +#: includes/functions.php:604 msgid "Scheduled Product" msgstr "" -#: includes/functions.php:798 +#: includes/functions.php:802 msgid "Author" msgstr "" -#: includes/functions.php:987 includes/template-tags.php:308 +#: includes/functions.php:991 includes/template-tags.php:308 #: templates/dashboard/products-widget.php:16 msgid "Products" msgstr "" -#: includes/functions.php:1034 +#: includes/functions.php:1038 msgid "Account Name: %s" msgstr "" -#: includes/functions.php:1038 +#: includes/functions.php:1042 msgid "Account Number: %s" msgstr "" -#: includes/functions.php:1042 +#: includes/functions.php:1046 msgid "Bank Name: %s" msgstr "" -#: includes/functions.php:1046 +#: includes/functions.php:1050 msgid "Address: %s" msgstr "" -#: includes/functions.php:1050 +#: includes/functions.php:1054 msgid "Routing Number: %s" msgstr "" -#: includes/functions.php:1054 +#: includes/functions.php:1058 msgid "IBAN: %s" msgstr "" -#: includes/functions.php:1058 +#: includes/functions.php:1062 msgid "SWIFT: %s" msgstr "" -#: includes/functions.php:1347 +#: includes/functions.php:1351 msgid "- Select a location -" msgstr "" -#: includes/functions.php:1351 includes/functions.php:1374 +#: includes/functions.php:1355 includes/functions.php:1378 msgid "Everywhere Else" msgstr "" -#: includes/functions.php:1370 +#: includes/functions.php:1374 msgid "- Select a State -" msgstr "" -#: includes/functions.php:1392 +#: includes/functions.php:1396 msgid "Ready to ship in..." msgstr "" -#: includes/functions.php:1393 +#: includes/functions.php:1397 msgid "1 business day" msgstr "" -#: includes/functions.php:1394 +#: includes/functions.php:1398 msgid "1-2 business day" msgstr "" -#: includes/functions.php:1395 +#: includes/functions.php:1399 msgid "1-3 business day" msgstr "" -#: includes/functions.php:1396 +#: includes/functions.php:1400 msgid "3-5 business day" msgstr "" -#: includes/functions.php:1397 +#: includes/functions.php:1401 msgid "1-2 weeks" msgstr "" -#: includes/functions.php:1398 +#: includes/functions.php:1402 msgid "2-3 weeks" msgstr "" -#: includes/functions.php:1399 +#: includes/functions.php:1403 msgid "3-4 weeks" msgstr "" -#: includes/functions.php:1400 +#: includes/functions.php:1404 msgid "4-6 weeks" msgstr "" -#: includes/functions.php:1401 +#: includes/functions.php:1405 msgid "6-8 weeks" msgstr "" -#: includes/functions.php:1501 +#: includes/functions.php:1505 msgid "All dates" msgstr "" -#: includes/functions.php:1514 +#: includes/functions.php:1518 #. translators: 1: month name, 2: 4-digit year msgid "%1$s %2$d" msgstr "" -#: includes/functions.php:1587 +#: includes/functions.php:1591 msgid "Google Plus" msgstr "" -#: includes/functions.php:1591 +#: includes/functions.php:1595 msgid "Twitter" msgstr "" -#: includes/functions.php:1595 +#: includes/functions.php:1599 +msgid "Pinterest" +msgstr "" + +#: includes/functions.php:1603 msgid "LinkedIn" msgstr "" -#: includes/functions.php:1599 +#: includes/functions.php:1607 msgid "Youtube" msgstr "" -#: includes/functions.php:1603 +#: includes/functions.php:1611 msgid "Instagram" msgstr "" -#: includes/functions.php:1607 +#: includes/functions.php:1615 msgid "Flickr" msgstr "" -#: includes/functions.php:1850 +#: includes/functions.php:1858 msgid "Dokan Store Sidebar" msgstr "" @@ -1776,196 +2026,196 @@ msgstr "" msgid "Mark parent order completed when all child orders are completed." msgstr "" -#: includes/order-functions.php:502 +#: includes/order-functions.php:506 msgid "Pending Payment" msgstr "" -#: includes/order-functions.php:517 templates/dashboard/orders-widget.php:46 +#: includes/order-functions.php:521 templates/dashboard/orders-widget.php:46 msgid "Refunded" msgstr "" -#: includes/order-functions.php:527 +#: includes/order-functions.php:531 msgid "Failed" msgstr "" -#: includes/product-functions.php:192 +#: includes/product-functions.php:188 msgid "" "Before you can add a variation you need to add some variation attributes on " "the Attributes section" msgstr "" -#: includes/product-functions.php:202 +#: includes/product-functions.php:198 msgid "Add variation" msgstr "" -#: includes/product-functions.php:203 +#: includes/product-functions.php:199 msgid "Create variations from all attributes" msgstr "" -#: includes/product-functions.php:204 +#: includes/product-functions.php:200 msgid "Delete all variations" msgstr "" -#: includes/product-functions.php:206 +#: includes/product-functions.php:202 msgid "Toggle "Enabled"" msgstr "" -#: includes/product-functions.php:207 +#: includes/product-functions.php:203 msgid "Toggle "Downloadable"" msgstr "" -#: includes/product-functions.php:208 +#: includes/product-functions.php:204 msgid "Toggle "Virtual"" msgstr "" -#: includes/product-functions.php:210 +#: includes/product-functions.php:206 msgid "Pricing" msgstr "" -#: includes/product-functions.php:211 +#: includes/product-functions.php:207 msgid "Set regular prices" msgstr "" -#: includes/product-functions.php:212 +#: includes/product-functions.php:208 msgid "Increase regular prices (fixed amount or percentage)" msgstr "" -#: includes/product-functions.php:213 +#: includes/product-functions.php:209 msgid "Decrease regular prices (fixed amount or percentage)" msgstr "" -#: includes/product-functions.php:214 +#: includes/product-functions.php:210 msgid "Set sale prices" msgstr "" -#: includes/product-functions.php:215 +#: includes/product-functions.php:211 msgid "Increase sale prices (fixed amount or percentage)" msgstr "" -#: includes/product-functions.php:216 +#: includes/product-functions.php:212 msgid "Decrease sale prices (fixed amount or percentage)" msgstr "" -#: includes/product-functions.php:217 +#: includes/product-functions.php:213 msgid "Set scheduled sale dates" msgstr "" -#: includes/product-functions.php:219 +#: includes/product-functions.php:215 #: templates/products/new-product-single.php:420 msgid "Inventory" msgstr "" -#: includes/product-functions.php:220 +#: includes/product-functions.php:216 msgid "Toggle "Manage stock"" msgstr "" -#: includes/product-functions.php:221 +#: includes/product-functions.php:217 #: templates/products/products-listing.php:61 #: templates/products/products-listing.php:150 msgid "Stock" msgstr "" -#: includes/product-functions.php:223 +#: includes/product-functions.php:219 msgid "Shipping" msgstr "" -#: includes/product-functions.php:224 +#: includes/product-functions.php:220 msgid "Length" msgstr "" -#: includes/product-functions.php:225 +#: includes/product-functions.php:221 msgid "Width" msgstr "" -#: includes/product-functions.php:226 +#: includes/product-functions.php:222 msgid "Height" msgstr "" -#: includes/product-functions.php:227 +#: includes/product-functions.php:223 msgid "Weight" msgstr "" -#: includes/product-functions.php:229 +#: includes/product-functions.php:225 msgid "Downloadable products" msgstr "" -#: includes/product-functions.php:230 +#: includes/product-functions.php:226 msgid "Download limit" msgstr "" -#: includes/product-functions.php:231 +#: includes/product-functions.php:227 msgid "Download expiry" msgstr "" -#: includes/product-functions.php:235 +#: includes/product-functions.php:231 msgid "Go" msgstr "" -#: includes/product-functions.php:242 +#: includes/product-functions.php:238 msgid "" "Default Form Values: These are the attributes that will be pre-selected on " "the frontend." msgstr "" -#: includes/product-functions.php:260 +#: includes/product-functions.php:256 msgid "No default" msgstr "" -#: includes/product-functions.php:300 +#: includes/product-functions.php:296 msgid "Save Variations" msgstr "" -#: includes/product-functions.php:304 +#: includes/product-functions.php:300 msgid "%s item" msgid_plural "%s items" msgstr[0] "" msgstr[1] "" -#: includes/product-functions.php:306 +#: includes/product-functions.php:302 msgid "Expand" msgstr "" -#: includes/product-functions.php:306 templates/orders/details.php:326 +#: includes/product-functions.php:302 templates/orders/details.php:326 msgid "Close" msgstr "" -#: includes/product-functions.php:309 +#: includes/product-functions.php:305 msgid "Go to the first page" msgstr "" -#: includes/product-functions.php:310 +#: includes/product-functions.php:306 msgid "Go to the previous page" msgstr "" -#: includes/product-functions.php:312 +#: includes/product-functions.php:308 msgid "Select Page" msgstr "" -#: includes/product-functions.php:313 +#: includes/product-functions.php:309 msgid "Current page" msgstr "" -#: includes/product-functions.php:320 +#: includes/product-functions.php:316 msgid "Go to the next page" msgstr "" -#: includes/product-functions.php:321 +#: includes/product-functions.php:317 msgid "Go to the last page" msgstr "" -#: includes/product-functions.php:344 +#: includes/product-functions.php:340 msgid "Visible" msgstr "" -#: includes/product-functions.php:345 +#: includes/product-functions.php:341 msgid "Catalog" msgstr "" -#: includes/product-functions.php:346 templates/products/listing-filter.php:50 +#: includes/product-functions.php:342 templates/products/listing-filter.php:50 msgid "Search" msgstr "" -#: includes/product-functions.php:347 +#: includes/product-functions.php:343 #: templates/products/new-product-single.php:124 msgid "Hidden" msgstr "" @@ -2044,95 +2294,95 @@ msgstr "" msgid "Order – %s" msgstr "" -#: includes/wc-functions.php:85 +#: includes/wc-functions.php:86 msgid "Product SKU must be unique." msgstr "" -#: includes/wc-functions.php:463 +#: includes/wc-functions.php:472 msgid "Cheating, eh?" msgstr "" -#: includes/wc-functions.php:469 +#: includes/wc-functions.php:478 msgid "Please enter your first name." msgstr "" -#: includes/wc-functions.php:470 +#: includes/wc-functions.php:479 msgid "Please enter your last name." msgstr "" -#: includes/wc-functions.php:471 +#: includes/wc-functions.php:480 msgid "Please enter your phone number." msgstr "" -#: includes/wc-functions.php:930 +#: includes/wc-functions.php:939 msgid "No ratings found yet!" msgstr "" -#: includes/wc-functions.php:934 +#: includes/wc-functions.php:943 msgid "%s rating from %d review" msgid_plural "%s rating from %d reviews" msgstr[0] "" msgstr[1] "" -#: includes/wc-functions.php:935 +#: includes/wc-functions.php:944 msgid "Rated %s out of %d" msgstr "" -#: includes/wc-functions.php:974 +#: includes/wc-functions.php:983 msgid "Your {site_title} order receipt from {order_date}" msgstr "" -#: includes/wc-functions.php:975 +#: includes/wc-functions.php:984 msgid "Your {site_title} order from {order_date} is complete" msgstr "" -#: includes/wc-functions.php:1072 +#: includes/wc-functions.php:1081 #: templates/global/seller-registration-form.php:15 msgid "First Name" msgstr "" -#: includes/wc-functions.php:1073 +#: includes/wc-functions.php:1082 #: templates/global/seller-registration-form.php:20 msgid "Last Name" msgstr "" -#: includes/wc-functions.php:1074 templates/dashboard/edit-account.php:62 +#: includes/wc-functions.php:1083 templates/dashboard/edit-account.php:62 msgid "Email address" msgstr "" -#: includes/wc-functions.php:1079 +#: includes/wc-functions.php:1088 msgid "is a required field." msgstr "" -#: includes/wc-functions.php:1085 +#: includes/wc-functions.php:1094 msgid "Please provide a valid email address." msgstr "" -#: includes/wc-functions.php:1087 +#: includes/wc-functions.php:1096 msgid "This email address is already registered." msgstr "" -#: includes/wc-functions.php:1093 +#: includes/wc-functions.php:1102 msgid "Your current password is incorrect." msgstr "" -#: includes/wc-functions.php:1098 +#: includes/wc-functions.php:1107 msgid "Please fill out all password fields." msgstr "" -#: includes/wc-functions.php:1101 +#: includes/wc-functions.php:1110 msgid "Please enter your current password." msgstr "" -#: includes/wc-functions.php:1104 +#: includes/wc-functions.php:1113 msgid "Please re-enter your password." msgstr "" -#: includes/wc-functions.php:1107 +#: includes/wc-functions.php:1116 msgid "New passwords do not match." msgstr "" -#: includes/wc-functions.php:1128 +#: includes/wc-functions.php:1137 msgid "Account details changed successfully." msgstr "" @@ -2148,8 +2398,6 @@ msgstr "" #: includes/widgets/menu-category.php:176 includes/widgets/store-contact.php:87 #: includes/widgets/store-location.php:94 includes/widgets/store-menu.php:101 #: includes/widgets/top-rated-product.php:61 -#: templates/emails/new-product-pending.php:8 -#: templates/emails/new-product.php:8 msgid "Title:" msgstr "" @@ -2337,6 +2585,18 @@ msgstr "" msgid "Canel" msgstr "" +#: lib/class-weforms-upsell.php:77 +msgid "Install Now" +msgstr "" + +#: lib/class-weforms-upsell.php:80 lib/class-weforms-upsell.php:81 +msgid "Dismiss this notice." +msgstr "" + +#: lib/class-weforms-upsell.php:353 +msgid "You don't have permission to install the plugins" +msgstr "" + #: lib/class.dokan-settings-api.php:31 msgid "Active" msgstr "" @@ -2413,210 +2673,185 @@ msgstr "" msgid "Sales this Month" msgstr "" -#: templates/emails/contact-seller.php:1 -msgid "From:" +#: templates/emails/contact-seller.php:19 +msgid "From : %s (%s)" msgstr "" -#: templates/emails/contact-seller.php:2 -msgid "IP:" +#: templates/emails/new-product-pending.php:18 +#: templates/emails/new-product.php:18 +msgid "Hello," msgstr "" -#: templates/emails/contact-seller.php:3 -msgid "User Agent:" +#: templates/emails/new-product-pending.php:20 +msgid "A new product is submitted to your site and is pending review" msgstr "" -#: templates/emails/contact-seller.php:13 -#: templates/emails/product-published.php:9 -#: templates/emails/refund-seller-mail.php:13 -#: templates/emails/refund_request.php:9 templates/emails/withdraw-new.php:15 -msgid "Sent from" +#: templates/emails/new-product-pending.php:21 +#: templates/emails/new-product.php:21 +#: templates/emails/plain/new-product-pending.php:22 +#: templates/emails/plain/new-product.php:22 +msgid "Summary of the product:" msgstr "" -#: templates/emails/new-product-pending.php:1 -#: templates/emails/new-product.php:1 -#: templates/emails/new-seller-registered.php:1 -msgid "Hello there," +#: templates/emails/new-product-pending.php:26 +#: templates/emails/new-product.php:26 +msgid "Title :" msgstr "" -#: templates/emails/new-product-pending.php:3 -#: templates/emails/new-product.php:3 -msgid "A new product has been submitted to your site" +#: templates/emails/new-product-pending.php:32 +#: templates/emails/new-product.php:32 +msgid "Price :" msgstr "" -#: templates/emails/new-product-pending.php:5 -#: templates/emails/new-product.php:5 -msgid "Summary of the product:" +#: templates/emails/new-product-pending.php:38 +#: templates/emails/new-product.php:38 +#: templates/emails/new-seller-registered.php:30 +msgid "Vendor :" msgstr "" -#: templates/emails/new-product-pending.php:9 -#: templates/emails/new-product.php:9 -msgid "Price:" +#: templates/emails/new-product-pending.php:45 +#: templates/emails/new-product.php:45 +msgid "Category :" msgstr "" -#: templates/emails/new-product-pending.php:10 -#: templates/emails/new-product.php:10 -#: templates/emails/new-seller-registered.php:8 -#: templates/global/product-tab.php:26 -msgid "Vendor:" +#: templates/emails/new-product-pending.php:51 +msgid "The product is currently in \"pending\" status." msgstr "" -#: templates/emails/new-product-pending.php:11 -#: templates/emails/new-product.php:11 -msgid "Category:" +#: templates/emails/new-product.php:20 +msgid "A new product is submitted to your site" msgstr "" -#: templates/emails/new-product-pending.php:13 +#: templates/emails/new-product.php:51 msgid "" -"The product is currently in \"pending\" state. Please review this product " -"before it goes public." -msgstr "" - -#: templates/emails/new-product-pending.php:15 -msgid "Moderate:" -msgstr "" - -#: templates/emails/new-product.php:13 -msgid "" -"The product is currently in \"publish\" state. So everyone can view the " +"The product is currently in \"publish\" status. So, everyone can view the " "product." msgstr "" -#: templates/emails/new-product.php:15 -msgid "In case it needs to be moderated:" +#: templates/emails/new-seller-registered.php:18 +#: templates/emails/plain/new-product-pending.php:18 +#: templates/emails/plain/new-product.php:18 +#: templates/emails/plain/new-seller-registered.php:18 +msgid "Hello there," msgstr "" -#: templates/emails/new-seller-registered.php:3 -msgid "A new vendor has been registered to your site " +#: templates/emails/new-seller-registered.php:20 +msgid "A new vendor has registered in your marketplace " msgstr "" -#: templates/emails/new-seller-registered.php:5 +#: templates/emails/new-seller-registered.php:24 +#: templates/emails/plain/new-seller-registered.php:21 msgid "Vendor Details:" msgstr "" -#: templates/emails/new-seller-registered.php:9 -msgid "Vendor Store:" +#: templates/emails/new-seller-registered.php:36 +msgid "Vendor Store :" msgstr "" -#: templates/emails/new-seller-registered.php:11 -msgid "To edit vendor access and details visit" +#: templates/emails/new-seller-registered.php:42 +msgid "To edit vendor access and details Click Here" msgstr "" -#: templates/emails/product-published.php:1 -msgid "Hello" +#: templates/emails/plain/new-product-pending.php:20 +msgid "A new product is submitted to your site and pending review" msgstr "" -#: templates/emails/product-published.php:3 -msgid "Your product" +#: templates/emails/plain/new-product-pending.php:31 +msgid "The product is currently in \"pending\" state." msgstr "" -#: templates/emails/product-published.php:3 -msgid "has been approved by one of our admin, congrats!" +#: templates/emails/plain/new-product-pending.php:33 +#: templates/emails/plain/new-product.php:33 +msgid "In case it needs to be moderated click here " msgstr "" -#: templates/emails/product-published.php:5 -msgid "View product:" +#: templates/emails/plain/new-product.php:20 +msgid "A new product is submitted to your site." msgstr "" -#: templates/emails/product-published.php:6 -msgid "Update:" -msgstr "" - -#: templates/emails/refund-seller-mail.php:1 -#: templates/emails/withdraw-new.php:1 -msgid "Hi," -msgstr "" - -#: templates/emails/refund-seller-mail.php:3 -msgid "Your refund request has been" -msgstr "" - -#: templates/emails/refund-seller-mail.php:5 -msgid "Order ID:" +#: templates/emails/plain/new-product.php:31 +msgid "" +"The product is currently in \"publish\" state. So everyone can view the " +"product." msgstr "" -#: templates/emails/refund-seller-mail.php:6 -msgid "Refund Amount:" +#: templates/emails/plain/new-seller-registered.php:20 +msgid "A new vendor has registered in your marketplace " msgstr "" -#: templates/emails/refund-seller-mail.php:7 -msgid "Refund Reason:" +#: templates/emails/plain/product-published.php:19 +msgid "has been approved by one of our admin, congrats!" msgstr "" -#: templates/emails/refund-seller-mail.php:9 -msgid "You can view the order details by going here:" +#: templates/emails/plain/withdraw-approve.php:20 +#: templates/emails/withdraw-approve.php:21 +msgid "Your withdraw request has been approved, congrats!" msgstr "" -#: templates/emails/refund_request.php:1 -#: templates/emails/withdraw-approve.php:1 -#: templates/emails/withdraw-cancel.php:1 -msgid "Hi" +#: templates/emails/plain/withdraw-approve.php:22 +#: templates/emails/plain/withdraw-cancel.php:22 +#: templates/emails/withdraw-approve.php:24 +#: templates/emails/withdraw-cancel.php:24 +msgid "You sent a withdraw request of:" msgstr "" -#: templates/emails/refund_request.php:3 -msgid "New refund request for order" +#: templates/emails/plain/withdraw-approve.php:27 +msgid "We'll transfer this amount to your preferred destination shortly." msgstr "" -#: templates/emails/refund_request.php:5 -msgid "You can process the request by going here:" +#: templates/emails/plain/withdraw-approve.php:29 +#: templates/emails/withdraw-approve.php:33 +msgid "Thanks for being with us." msgstr "" -#: templates/emails/withdraw-approve.php:3 -msgid "Your withdraw request has been approved, congrats!" +#: templates/emails/plain/withdraw-cancel.php:20 +msgid "Your withdraw request was cancelled" msgstr "" -#: templates/emails/withdraw-approve.php:5 -#: templates/emails/withdraw-cancel.php:5 -msgid "You sent a withdraw request of:" +#: templates/emails/plain/withdraw-cancel.php:27 +#: templates/emails/withdraw-cancel.php:31 +msgid "Here's the reason, why : " msgstr "" -#: templates/emails/withdraw-approve.php:7 -#: templates/emails/withdraw-cancel.php:7 -msgid "Amount:" -msgstr "" - -#: templates/emails/withdraw-approve.php:8 -#: templates/emails/withdraw-cancel.php:8 -msgid "Method:" +#: templates/emails/plain/withdraw-new.php:17 +#: templates/emails/withdraw-new.php:18 +msgid "Hi," msgstr "" -#: templates/emails/withdraw-approve.php:10 -msgid "We'll transfer this amount to your preferred destination shortly." +#: templates/emails/product-published.php:21 +msgid "Your product : %s is approved by the admin, congrats!" msgstr "" -#: templates/emails/withdraw-approve.php:12 -msgid "Thanks for being with us." +#: templates/emails/product-published.php:24 +msgid "To Edit product click : here" msgstr "" -#: templates/emails/withdraw-cancel.php:3 -msgid "Your withdraw request has been cancelled!" +#: templates/emails/withdraw-approve.php:31 +msgid "We'll transfer this amount to your preferred payment method shortly." msgstr "" -#: templates/emails/withdraw-cancel.php:10 -msgid "Here's the reason, why:" +#: templates/emails/withdraw-cancel.php:21 +msgid "Your withdraw request was cancelled!" msgstr "" -#: templates/emails/withdraw-new.php:3 +#: templates/emails/withdraw-new.php:21 msgid "A new withdraw request has been made by" msgstr "" -#: templates/emails/withdraw-new.php:5 -msgid "Request Amount:" -msgstr "" - -#: templates/emails/withdraw-new.php:6 -msgid "Payment Method:" +#: templates/emails/withdraw-new.php:27 +msgid "Username : " msgstr "" -#: templates/emails/withdraw-new.php:8 -msgid "Username:" +#: templates/emails/withdraw-new.php:34 +msgid "Request Amount:" msgstr "" -#: templates/emails/withdraw-new.php:9 -msgid "Profile:" +#: templates/emails/withdraw-new.php:40 +msgid "Payment Method: " msgstr "" -#: templates/emails/withdraw-new.php:11 -msgid "You can approve or deny it by going here:" +#: templates/emails/withdraw-new.php:46 +msgid "You can approve or deny it by going here " msgstr "" #: templates/global/header-menu.php:13 @@ -2659,6 +2894,10 @@ msgstr "" msgid "Store Name:" msgstr "" +#: templates/global/product-tab.php:26 +msgid "Vendor:" +msgstr "" + #: templates/global/product-tab.php:35 msgid "Address:" msgstr "" @@ -2834,6 +3073,16 @@ msgstr "" msgid "Date Shipped" msgstr "" +#: templates/orders/details.php:317 +#: templates/products/new-product-single.php:239 +#: templates/products/new-product-single.php:246 +#: templates/products/new-product.php:173 +#: templates/products/new-product.php:180 +#: templates/products/tmpl-add-product-popup.php:75 +#: templates/products/tmpl-add-product-popup.php:82 +msgid "YYYY-MM-DD" +msgstr "" + #: templates/orders/details.php:325 msgid "Add Tracking Details" msgstr "" @@ -3537,6 +3786,10 @@ msgstr "" msgid "Approved Requests" msgstr "" +#: templates/withdraw/status-listing.php:18 +msgid "Cancelled Requests" +msgstr "" + #. Plugin URI of the plugin/theme msgid "https://wordpress.org/plugins/dokan-lite/" msgstr "" @@ -3615,7 +3868,7 @@ msgctxt "enhanced select" msgid "Searching…" msgstr "" -#: includes/product-functions.php:318 +#: includes/product-functions.php:314 msgctxt "number of pages" msgid "of" msgstr "" diff --git a/lib/class-weforms-upsell.php b/lib/class-weforms-upsell.php new file mode 100644 index 0000000000..21c171067f --- /dev/null +++ b/lib/class-weforms-upsell.php @@ -0,0 +1,418 @@ +affiliate = $affiliate; + + add_action( 'init', array( $this, 'init_hooks' ) ); + } + + /** + * Initialize the hooks + * + * @return void + */ + public function init_hooks() { + + if ( class_exists( 'weForms' ) ) { + return; + } + + if ( ! current_user_can( 'manage_options' ) ) { + return; + } + + add_action( 'admin_notices', array( $this, 'activation_notice' ) ); + + add_action( 'wp_ajax_weforms_upsell_installer', array( $this, 'install_weforms' ) ); + add_action( 'wp_ajax_weforms_upsell_dismiss', array( $this, 'dismiss_weforms_notice' ) ); + } + + /** + * Show the plugin installation notice + * + * @return void + */ + public function activation_notice() { + + if ( $this->is_dismissed() ) { + return; + } + ?> +
+ +
+

weForms is here!

+ +

weForms is the next generation contact form plugin for WordPress.

+
+
+ +  Learn More +
+ +
+ +
+ + × + Close modal window + +
+ +
+ +
+ Learn more about weForms +
+
+
+ + + + + learn_more; + + if ( ! empty( $this->affiliate ) ) { + $link = add_query_arg( array( 'ref' => $this->affiliate ), $link ); + } + + return $link; + } + + /** + * Fail if plugin installtion/activation fails + * + * @param Object $thing + * + * @return void + */ + public function fail_on_error( $thing ) { + if ( is_wp_error( $thing ) ) { + wp_send_json_error( $thing->get_error_message() ); + } + } + + /** + * Install weForms + * + * @return void + */ + public function install_weforms() { + check_ajax_referer( 'weforms_upsell_installer' ); + + if ( ! current_user_can( 'manage_options' ) ) { + wp_send_json_error( __( 'You don\'t have permission to install the plugins' ) ); + } + + if ( ! class_exists( 'WP_User_Frontend' ) ) { + $wpuf_status = $this->install_plugin( 'wp-user-frontend', 'wpuf.php' ); + + $this->fail_on_error( $wpuf_status ); + } + + $weforms_status = $this->install_plugin( 'weforms', 'weforms.php' ); + $this->fail_on_error( $weforms_status ); + + $this->dismiss_notice(); + + if ( ! empty( $this->affiliate ) ) { + update_option( '_weforms_aff_ref', $this->affiliate ); + } + + wp_send_json_success(); + } + + /** + * Install and activate a plugin + * + * @param string $slug + * @param string $file + * + * @return WP_Error|null + */ + public function install_plugin( $slug, $file ) { + include_once ABSPATH . 'wp-admin/includes/plugin-install.php'; + include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; + + $plugin_basename = $slug . '/' . $file; + + // if exists and not activated + if ( file_exists( WP_PLUGIN_DIR . '/' . $plugin_basename ) ) { + return activate_plugin( $plugin_basename ); + } + + // seems like the plugin doesn't exists. Download and activate it + $upgrader = new Plugin_Upgrader( new WP_Ajax_Upgrader_Skin() ); + + $api = plugins_api( 'plugin_information', array( 'slug' => $slug, 'fields' => array( 'sections' => false ) ) ); + $result = $upgrader->install( $api->download_link ); + + if ( is_wp_error( $result ) ) { + return $result; + } + + return activate_plugin( $plugin_basename ); + } + + /** + * Dismiss the notice via Ajax + * + * @return void + */ + public function dismiss_weforms_notice() { + $this->dismiss_notice(); + + wp_send_json_success(); + } +} + +endif; diff --git a/package.json b/package.json index 609d40a11a..04ff6b04d2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dokan", - "version": "2.6.7", + "version": "2.6.8", "description": "A WordPress marketplace plugin", "author": "weDevs", "license": "GPL", diff --git a/readme.txt b/readme.txt index 515170ead1..254f5906b7 100644 --- a/readme.txt +++ b/readme.txt @@ -3,9 +3,10 @@ Contributors: tareq1988, wedevs, rafsuntaskin, sabbir1991, nazmulhassann20, rosh Donate Link: http://tareq.co/donate/ Tags: woocommerce, multivendor, multi-vendor, paypal, shop, vendor, seller, store, sell, online, amazon, dokan, ebay, Etsy, multi seller, multi store, multi vendor, multi vendors, multistore, multivendor, product vendor, product vendors, vendor, vendor system, vendors, wc market place, wc marketplace, wc vendors, woo vendors, woocommerce market place, woocommerce marketplace, woocommerce multi vendor, commission rate, e-commerce, ebay, ecommerce, yith, yithemes Requires at least: 4.4 -Tested up to: 4.8 +Tested up to: 4.8.1 WC requires at least: 2.6 -WC tested up to: 3.1.1 +WC tested up to: 3.1.2 +Requires PHP: 5.6 Stable tag: trunk License: GPLv2 or later License URI: http://www.gnu.org/licenses/gpl-2.0.html @@ -180,6 +181,14 @@ A. Just install and activate the PRO version without deleting the free plugin. A == Changelog == +v2.6.8 -> Sep 7, 2017 +--------------------- +- [new] Dokan Emails now configurable from WooCommerce Email settings with theme override support +- [new] Canceled withdraw requests are now shown for vendor +- [fix] Date time format fixed for order and product listing to support global format +- [fix] saving variable product prices +- [tweak] fontawesome library updated + v2.6.7 -> Aug 3, 2017 --------------------- - [fix] Fix multiple vendor order creating issue diff --git a/templates/emails/contact-seller.php b/templates/emails/contact-seller.php index 5f44a2b783..647dadee86 100644 --- a/templates/emails/contact-seller.php +++ b/templates/emails/contact-seller.php @@ -1,14 +1,29 @@ -%from_name% (%from_email%) - %user_ip% - %user_agent% + ------------------------------- +

+ +
+

+
+

+ +

+
- ---- - %site_name% -%site_url% \ No newline at end of file + + (%site_url%). +if ( ! defined( 'ABSPATH' ) ) { + exit; +} - ------------------------- +do_action( 'woocommerce_email_header', $email_heading, $email ); ?> - %title% - %price% -%seller_name% (%seller_url%) - %category% +

- +

+

+
+ +

- %product_link% + + (%site_url%). +if ( ! defined( 'ABSPATH' ) ) { + exit; +} - ------------------------- +do_action( 'woocommerce_email_header', $email_heading, $email ); ?> - %title% - %price% - %seller_name% (%seller_url%) - %category% +

- +

+

+
+ +

- -%product_link% + +(%site_url%). +if ( ! defined( 'ABSPATH' ) ) { + exit; +} - ------------------------- +do_action( 'woocommerce_email_header', $email_heading, $email ); ?> +

+ +
+ + +

+

+ +


+

+ +

+ Click Here', 'dokan-lite' ), $data['seller_edit'] ); ?> +

- %seller_name% - %store_url% + - %seller_edit% - ---- -%site_name% -%site_url% \ No newline at end of file +do_action( 'woocommerce_email_footer', $email ); diff --git a/templates/emails/plain/contact-seller.php b/templates/emails/plain/contact-seller.php new file mode 100644 index 0000000000..13b2558746 --- /dev/null +++ b/templates/emails/plain/contact-seller.php @@ -0,0 +1,30 @@ + + + +------------------------------------------------------------ + + + +------------------------------------------------------------ + + + + + + + + + + + + + + + + + + + click here ', 'dokan-lite' ), $data['product_link'] ); ?> + + + + + + + + + + + + + + + + + + + click here ', 'dokan-lite' ), $data['product_link'] ); ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + %seller_name%, + "%title%" +if ( ! defined( 'ABSPATH' ) ) { + exit; +} - %product_link% - %product_edit_link% +do_action( 'woocommerce_email_header', $email_heading, $email ); ?> +

+ +

+

+ %s is approved by the admin, congrats!', 'dokan-lite' ), $data['product_url'], $data['product-title'] ); ?> +

+

+ here', 'dokan-lite' ), $data['product_edit_link'] ); ?> +

+ %site_name% -%site_url% \ No newline at end of file +do_action( 'woocommerce_email_footer', $email ); diff --git a/templates/emails/refund-seller-mail.php b/templates/emails/refund-seller-mail.php deleted file mode 100644 index a09f9cb1d0..0000000000 --- a/templates/emails/refund-seller-mail.php +++ /dev/null @@ -1,14 +0,0 @@ - - - %status%. - - %order_id% - %amount% - %reason% - - -%order_page% - ---- - %site_name% -%site_url% \ No newline at end of file diff --git a/templates/emails/refund_request.php b/templates/emails/refund_request.php deleted file mode 100644 index fccc23fb4d..0000000000 --- a/templates/emails/refund_request.php +++ /dev/null @@ -1,10 +0,0 @@ -, - - # %order_id%. - - -%refund_page% - ---- - %site_name% -%site_url% \ No newline at end of file diff --git a/templates/emails/withdraw-approve.php b/templates/emails/withdraw-approve.php index 87890ac350..f460749856 100644 --- a/templates/emails/withdraw-approve.php +++ b/templates/emails/withdraw-approve.php @@ -1,16 +1,37 @@ - %username%, + +if ( ! defined( 'ABSPATH' ) ) { + exit; +} - +do_action( 'woocommerce_email_header', $email_heading, $email ); ?> +

+ +

+

+ +

+

+ +
+ +
+ +

+

+ - %amount% - %method% + +

- - - - ---- -%site_name% -%site_url% \ No newline at end of file + %username%, + +if ( ! defined( 'ABSPATH' ) ) { + exit; +} - +do_action( 'woocommerce_email_header', $email_heading, $email ); ?> +

+ +

+

+ +

+

+ +
+ +
+ +

+

+ +
+ +

- %amount% - %method% - - -%notes% - ---- -%site_name% -%site_url% \ No newline at end of file + + %username%. +if ( ! defined( 'ABSPATH' ) ) { + exit; +} - %amount% - %method% +do_action( 'woocommerce_email_header', $email_heading, $email ); ?> +

+ +

+

+ . +

+
+ - %username% - %profile_url% + here ', 'dokan-lite' ), $data['withdraw_page'] ); ?> - -%withdraw_page% + %site_name% -%site_url% \ No newline at end of file +do_action( 'woocommerce_email_footer', $email ); diff --git a/templates/orders/details.php b/templates/orders/details.php index ad01e28833..3282129bb1 100755 --- a/templates/orders/details.php +++ b/templates/orders/details.php @@ -314,7 +314,7 @@
- +
diff --git a/templates/orders/listing.php b/templates/orders/listing.php index ad16a0f04d..d0198d4de0 100755 --- a/templates/orders/listing.php +++ b/templates/orders/listing.php @@ -80,7 +80,7 @@ $h_time = get_the_time( __( 'Y/m/d', 'dokan-lite' ), dokan_get_prop( $the_order, 'id' ) ); } - echo '' . esc_html( apply_filters( 'post_date_column_time', $h_time, dokan_get_prop( $the_order, 'id' ) ) ) . ''; + echo '' . esc_html( apply_filters( 'post_date_column_time', dokan_date_time_format( $h_time, true ) , dokan_get_prop( $the_order, 'id' ) ) ) . ''; ?> diff --git a/templates/products/new-product-single.php b/templates/products/new-product-single.php index 7a6224da6a..118829584c 100755 --- a/templates/products/new-product-single.php +++ b/templates/products/new-product-single.php @@ -236,14 +236,14 @@
- +
- +
@@ -412,8 +412,8 @@ 50, 'quicktags' => false, 'media_buttons' => false, 'teeny' => true, 'editor_class' => 'post_content') ); ?> - - + +
diff --git a/templates/products/new-product.php b/templates/products/new-product.php index 4b00ac5be3..deae97b80d 100755 --- a/templates/products/new-product.php +++ b/templates/products/new-product.php @@ -170,14 +170,14 @@
- +
- +
diff --git a/templates/products/products-listing.php b/templates/products/products-listing.php index 3664d4325f..02a8bf423f 100755 --- a/templates/products/products-listing.php +++ b/templates/products/products-listing.php @@ -216,7 +216,7 @@ } } - echo '' . apply_filters( 'post_date_column_time', $h_time, $post, 'date', 'all' ) . ''; + echo '' . apply_filters( 'post_date_column_time', dokan_date_time_format( $h_time, true ), $post, 'date', 'all' ) . ''; echo '
'; if ( 'publish' == $post->post_status ) { _e( 'Published', 'dokan-lite' ); diff --git a/templates/products/tmpl-add-product-popup.php b/templates/products/tmpl-add-product-popup.php index 45dc48d83d..7460b2d79a 100644 --- a/templates/products/tmpl-add-product-popup.php +++ b/templates/products/tmpl-add-product-popup.php @@ -40,7 +40,7 @@
- +
@@ -72,14 +72,14 @@
- +
- +
diff --git a/templates/withdraw/cancelled-request-listing.php b/templates/withdraw/cancelled-request-listing.php new file mode 100644 index 0000000000..aba35a32cf --- /dev/null +++ b/templates/withdraw/cancelled-request-listing.php @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + +
amount ); ?>method ); ?>date ) ); ?>note; ?>
diff --git a/templates/withdraw/status-listing.php b/templates/withdraw/status-listing.php index 56c5226232..981dc02cfd 100644 --- a/templates/withdraw/status-listing.php +++ b/templates/withdraw/status-listing.php @@ -14,4 +14,7 @@ > + > + + \ No newline at end of file