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 @@ - 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( '
@@ -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 "weForms is the next generation contact form plugin for WordPress.
+
+
+
+
+ +
+
+
+
+
+
+
+ +
+ 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 ); ?> | +date ) ); ?> | +note; ?> | +