Poll, Survey, Quiz, Slideshow, Form, Story & Landing Page - Version 19.7.7

Version Description

  • internal code improvements
    • tested up to 5.7 Wordpress
Download this release

Release Info

Developer artemopinionstage
Plugin Icon 128x128 Poll, Survey, Quiz, Slideshow, Form, Story & Landing Page
Version 19.7.7
Comparing to
See all releases

Code changes from version 19.7.6 to 19.7.7

admin/css/menu-page.css CHANGED
@@ -482,9 +482,11 @@ td.long {
482
  padding-left: 10px;
483
  width: 55%;
484
  }
485
- td.long div{
486
- width: 90%;
487
- }
 
 
488
  td.action a.opinionstage-blue-bordered-btn{
489
  font-size: 15px;
490
  margin-right: 9px;
@@ -743,7 +745,7 @@ td.image {
743
  padding: 10px;
744
  width: 100%;
745
  }
746
- .opinionstage-section-header #searchItem {
747
  color: #797979;
748
  height: auto;
749
  padding: 8.5px 10px;
@@ -752,10 +754,10 @@ td.image {
752
  #opinionstage-content .opinionstage-item-view-dashboard .opinionstage-dashboard-section {
753
  margin: 0;
754
  }
755
- .opinionstage-item-view-dashboard #check tbody:last-child tr.settingBorderOs {
756
  border-bottom: 1px #e5e5e5 solid;
757
  }
758
- .opinionstage-item-view-dashboard #check tbody .action .opinionstage-edit-content:last-child {
759
  margin-right: 0;
760
  }
761
  .opinionstage-item-action-container {
@@ -861,7 +863,7 @@ div#opinionstage-load-more {
861
  float: none;
862
  display: inline !important;
863
  }
864
- .opinionstage-item-view-dashboard #check {
865
  width: 100%;
866
  }
867
  .opinionstage-item-create:before {
@@ -924,7 +926,7 @@ a.help-center-os.help-link:focus {
924
  .opinionstage-item-action-container {
925
  float: none;
926
  }
927
- #check .action .opinionstage-item-action-container a {
928
  display: block;
929
  float: none;
930
  margin-bottom: 10px;
482
  padding-left: 10px;
483
  width: 55%;
484
  }
485
+ td.long > div {
486
+ position: relative;
487
+ width: 90%;
488
+ height: 85px;
489
+ }
490
  td.action a.opinionstage-blue-bordered-btn{
491
  font-size: 15px;
492
  margin-right: 9px;
745
  padding: 10px;
746
  width: 100%;
747
  }
748
+ .opinionstage-section-header #opinionstage-my-items-search-field {
749
  color: #797979;
750
  height: auto;
751
  padding: 8.5px 10px;
754
  #opinionstage-content .opinionstage-item-view-dashboard .opinionstage-dashboard-section {
755
  margin: 0;
756
  }
757
+ .opinionstage-item-view-dashboard #opinionstage-items-table tbody:last-child tr.settingBorderOs {
758
  border-bottom: 1px #e5e5e5 solid;
759
  }
760
+ .opinionstage-item-view-dashboard #opinionstage-items-table tbody .action .opinionstage-edit-content:last-child {
761
  margin-right: 0;
762
  }
763
  .opinionstage-item-action-container {
863
  float: none;
864
  display: inline !important;
865
  }
866
+ .opinionstage-item-view-dashboard #opinionstage-items-table {
867
  width: 100%;
868
  }
869
  .opinionstage-item-create:before {
926
  .opinionstage-item-action-container {
927
  float: none;
928
  }
929
+ #opinionstage-items-table .action .opinionstage-item-action-container a {
930
  display: block;
931
  float: none;
932
  margin-bottom: 10px;
admin/js/admin-feedback.js CHANGED
@@ -1,6 +1,6 @@
1
  ;(function ($) {
2
  var OpinionStageDialogApp = {
3
- cacheElements: function cacheElements() {
4
  this.cache = {
5
  $deactivateLink: $('#the-list').find('[data-slug="social-polls-by-opinionstage"] span.deactivate a'),
6
  $modal: $('#opinionistage-deactivate-feedback-modal'),
@@ -10,47 +10,47 @@
10
  $dialogForm: $('#opinionstage-deactivate-feedback-dialog-form')
11
  }
12
  },
13
- deactivate: function deactivate(e) {
14
- location.href = this.cache.$deactivateLink.attr('href');
15
  },
16
- bindEvents: function bindEvents() {
17
- var self = this;
18
  self.cache.$deactivateLink.on('click', function (e) {
19
- e.preventDefault();
20
- self.cache.$modal.fadeIn();
21
- });
22
 
23
  self.cache.$modal.on('click', function (e) {
24
  if ($(e.target).is(self.cache.$modal)) {
25
- self.cache.$modal.fadeOut();
26
  }
27
- });
28
  self.cache.$closeButton.on('click', function (e) {
29
- self.cache.$modal.fadeOut();
30
  })
31
 
32
  self.cache.$skipButton.on('click', function (e) {
33
- self.deactivate();
34
  })
35
  self.cache.$submitButton.on('click', function (e) {
36
- e.preventDefault();
37
- self.sendFeedback();
38
- $(this).addClass('opinionstage-loading');
39
  })
40
  },
41
- sendFeedback: function sendFeedback(){
42
- var self = this,
43
- formData = self.cache.$dialogForm.serialize();
44
- $.post(ajaxurl, formData, this.deactivate.bind(this));
45
  },
46
- init: function init() {
47
- this.cacheElements();
48
- this.bindEvents();
49
  }
50
  }
51
 
52
  $(function () {
53
- OpinionStageDialogApp.init();
54
- });
55
 
56
- }(jQuery));
1
  ;(function ($) {
2
  var OpinionStageDialogApp = {
3
+ cacheElements: function() {
4
  this.cache = {
5
  $deactivateLink: $('#the-list').find('[data-slug="social-polls-by-opinionstage"] span.deactivate a'),
6
  $modal: $('#opinionistage-deactivate-feedback-modal'),
10
  $dialogForm: $('#opinionstage-deactivate-feedback-dialog-form')
11
  }
12
  },
13
+ deactivate: function() {
14
+ location.href = this.cache.$deactivateLink.attr('href')
15
  },
16
+ bindEvents: function() {
17
+ var self = this
18
  self.cache.$deactivateLink.on('click', function (e) {
19
+ e.preventDefault()
20
+ self.cache.$modal.fadeIn()
21
+ })
22
 
23
  self.cache.$modal.on('click', function (e) {
24
  if ($(e.target).is(self.cache.$modal)) {
25
+ self.cache.$modal.fadeOut()
26
  }
27
+ })
28
  self.cache.$closeButton.on('click', function (e) {
29
+ self.cache.$modal.fadeOut()
30
  })
31
 
32
  self.cache.$skipButton.on('click', function (e) {
33
+ self.deactivate()
34
  })
35
  self.cache.$submitButton.on('click', function (e) {
36
+ e.preventDefault()
37
+ self.sendFeedback()
38
+ $(this).addClass('opinionstage-loading')
39
  })
40
  },
41
+ sendFeedback: function(){
42
+ var self = this
43
+ var formData = self.cache.$dialogForm.serialize()
44
+ $.post(ajaxurl, formData, this.deactivate.bind(this))
45
  },
46
+ init: function() {
47
+ this.cacheElements()
48
+ this.bindEvents()
49
  }
50
  }
51
 
52
  $(function () {
53
+ OpinionStageDialogApp.init()
54
+ })
55
 
56
+ }(jQuery))
admin/js/menu-page.js CHANGED
@@ -1,185 +1,132 @@
1
  jQuery(document).ready(function ($) {
2
  var toggleSettingsAjax = function (currObject, action) {
3
- $.post(ajaxurl, {action: action, activate: currObject.is(':checked')}, function (response) {
4
- });
5
- };
6
 
7
  $('#fly-out-switch').change(function () {
8
- toggleSettingsAjax($(this), "opinionstage_ajax_toggle_flyout");
9
- });
10
 
11
  $('#article-placement-switch').change(function () {
12
- toggleSettingsAjax($(this), "opinionstage_ajax_toggle_article_placement");
13
- });
14
 
15
  $('#sidebar-placement-switch').change(function () {
16
- toggleSettingsAjax($(this), "opinionstage_ajax_toggle_sidebar_placement");
17
- });
18
-
19
-
20
- $.ajax({
21
- url: OPINIONSTAGE.WidgetApiUrl,
22
- headers: {
23
- 'Accept': 'application/vnd.api+json',
24
- 'Content-Type': 'application/vnd.api+json',
25
- 'OSWP-Plugin-Version': OPINIONSTAGE.OswpPluginVersion,
26
- 'OSWP-Client-Token': OPINIONSTAGE.OswpClientToken
27
- },
28
- method: 'GET',
29
- dataType: 'json',
30
- success: function (data) {
31
- dropdownOptions = data;
32
- if (dropdownOptions.data.length == 0) {
33
- var adminUrlCreateLink = OPINIONSTAGE.adminUrlCreateLink;
34
- var viewtext = '<tbody><tr><td><p><span class="opinionstage-no-items">No items yet..., </span><a href="' + adminUrlCreateLink + '" class="opinionstage-add-our-first-item">Add your first item</a></p></td></tr></tbody>';
35
- $('.result_progress').css('display', 'none');
36
- $(viewtext).appendTo('#container table#check');
37
- } else {
38
- for (var i = 0; i < dropdownOptions.data.length; i++) {
39
- var previewBlockOsTitle = dropdownOptions.data[i].attributes['title'];
40
- var previewBlockOsType = dropdownOptions.data[i].attributes['type'];
41
- var previewBlockOsDate = dropdownOptions.data[i].attributes['updated-at'];
42
- previewBlockOsDate = new Date(previewBlockOsDate);
43
- previewBlockOsDate = previewBlockOsDate.toDateString();
44
- var resDateOs = previewBlockOsDate.split(" ");
45
- previewBlockOsDate = resDateOs[2] + ' ' + resDateOs[1] + ' ' + resDateOs[3];
46
- var previewBlockOsImageUrl = dropdownOptions.data[i].attributes['image-url'];
47
- var previewBlockOsView = dropdownOptions.data[i].attributes['landing-page-url'];
48
- var previewBlockOsEdit = dropdownOptions.data[i].attributes['edit-url'];
49
- var previewBlockOsStatistics = dropdownOptions.data[i].attributes['stats-url'];
50
- var viewtext = '<tbody id="count"><tr class="settingBorderOs"><td class="image"><a href="' + previewBlockOsView + '" target="_blank"><div class="content-item-image quiz"><img height="90" src="' + previewBlockOsImageUrl + '" width="120"><div class="content-item-label">' + previewBlockOsType + '</div></div></a></td><td class="long"><div style="position: relative;height: 85px;"><a href="' + previewBlockOsEdit + '" class="opinionstage-item-title" target="_blank">' + previewBlockOsTitle + '</a><table><tbody><tr><td><span class="os-icon-plugin icon-os-common-date"></span><div class="label">' + previewBlockOsDate + '</div></td></tr></tbody></table></div></td><td class="action"><div class="opinionstage-item-action-container"><a href="' + previewBlockOsView + '" class="opinionstage-blue-bordered-btn opinionstage-edit-content " target="_blank"> View </a><a href="' + previewBlockOsEdit + '" class="opinionstage-blue-bordered-btn opinionstage-edit-content " target="_blank"> Edit </a><a href="' + previewBlockOsStatistics + '" class="opinionstage-blue-bordered-btn opinionstage-edit-content " target="_blank"> Results </div></a></td></tr></tbody>';
51
- $('.result_progress').css('display', 'none');
52
- $(viewtext).appendTo('#container table#check');
53
- }
54
  }
55
  },
56
- complete: function () {
57
- size_li = $("table#check tbody#count").size();
58
- dropdownDataLength = dropdownOptions.data.length;
59
-
60
- loadMore(size_li, dropdownDataLength, "all");
61
- var data = {
62
- 'action': 'opinionstage_ajax_item_count',
63
- 'oswp_item_count': dropdownOptions.data.length
64
- };
65
- // todo - move it to main ajax call
66
- jQuery.post(ajaxurl, data);
67
-
68
- jQuery('#itemList').on('change', function () {
69
- var selectedValue = this.value;
70
- var contentLabel = jQuery(".content-item-label");
71
- var item_count = 0;
72
-
73
- jQuery('.no_item').css('display', 'none');
74
- contentLabel.each(function () {
75
- getContainer = jQuery(this).parent().parent().parent().parent();
76
- if (selectedValue != 'all' && selectedValue != jQuery(this).text().toLowerCase()) {
77
- getContainer.parent().css('display', 'none');
78
- getContainer.parent().removeClass('countItem');
79
- } else {
80
- jQuery("#searchItem").val('');
81
- getContainer.parent().css('display', 'table-row-group');
82
- getContainer.parent().addClass('countItem');
83
- item_count = item_count + 1;
84
- }
85
- });
86
-
87
- if (item_count == 0) {
88
- jQuery('.no_item').css('display', 'block');
89
- }
90
-
91
- size = $("table#check tbody.countItem").size();
92
- $("#opinionstage-load-more").fadeOut(500);
93
- loadMore(size, item_count, "filter");
94
- });
95
-
96
- $("#searchItem").on("keyup", function search(e) {
97
- if (e.keyCode == 13) {
98
- var searchItem = $(this).val();
99
- var listTitle = jQuery('td.long a');
100
- var dropdownValue = jQuery('#itemList').val();
101
- var contentList = jQuery(".content-item-label");
102
-
103
- listTitle.each(function () {
104
- var title = jQuery(this).text().toLowerCase();
105
- outerContainer = jQuery(this).parent().parent().parent().parent();
106
-
107
- if (dropdownValue == 'all') {
108
- if (!title.includes(searchItem)) {
109
- outerContainer.css('display', 'none');
110
  } else {
111
- outerContainer.css('display', 'table-row-group');
112
  }
113
  } else {
114
- contentList.each(function () {
115
- if (dropdownValue == jQuery(this).text().toLowerCase()) {
116
- if (outerContainer.hasClass('countItem')) {
117
- if (!title.includes(searchItem)) {
118
- outerContainer.css('display', 'none');
119
- } else {
120
- outerContainer.css('display', 'table-row-group');
121
- }
122
- }
123
- }
124
- });
125
  }
126
- });
 
 
127
  }
128
- });
129
  },
130
- error: function () {
131
- console.log(data.statusText);
132
- }
133
- });
134
-
135
-
136
- function loadMore(size, dataLength, item) {
137
-
138
- if (dataLength == size && dataLength > 10) {
139
- setTimeout(function () {
140
 
141
- x = (x - 0 < 0) ? 10 : x - 0;
142
- if (item == 'all') {
143
- $('table#check tbody#count').not(':lt(' + x + ')').hide();
144
- } else {
145
- $('table#check tbody#countItem').not(':lt(' + x + ')').hide();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
146
  }
147
- }, 500);
148
- }
149
- // Show the div in 5s
150
- var countItemOS = 10;
151
- if (dataLength > countItemOS) {
152
- $("#opinionstage-load-more").delay(2000).fadeIn(500);
153
- }
154
-
155
- x = 10;
156
- $('table#check ttbody#count:lt(' + x + ')').show();
157
- $('#opinionstage-load-more').click(function () {
158
- x = (x + 10 <= size) ? x + 10 : size;
159
 
160
- if (item == 'all') {
161
- $('table#check tbody#count:lt(' + x + ')').show(500);
162
- } else {
163
- $('table#check tbody#countItem:lt(' + x + ')').show(500);
164
- }
 
165
 
166
- if (size == x) {
167
- $("#opinionstage-load-more").hide(500);
168
- }
169
- });
 
170
  }
 
171
 
172
  if ($('.opinionstage-show-anchor-list').length > 0) {
173
 
174
- $('.opinionstage-show-anchor-list').click(function (e){
175
- e.preventDefault();
176
- $('.opinionstage-anchors-list').toggleClass('opened');
177
  })
178
 
179
  $(document).click(function (e) {
180
- if ( ! $(e.target).is('.opinionstage-show-anchor-list') && $('.opinionstage-anchors-list').hasClass('opened') ) {
181
- $('.opinionstage-anchors-list').removeClass('opened');
182
  }
183
  })
184
  }
185
- });
1
  jQuery(document).ready(function ($) {
2
  var toggleSettingsAjax = function (currObject, action) {
3
+ $.post(ajaxurl, {action: action, activate: currObject.is(':checked'), security: OPINIONSTAGE.myPlacementsNonce}, function (response) {
4
+ })
5
+ }
6
 
7
  $('#fly-out-switch').change(function () {
8
+ toggleSettingsAjax($(this), "opinionstage_ajax_toggle_flyout")
9
+ })
10
 
11
  $('#article-placement-switch').change(function () {
12
+ toggleSettingsAjax($(this), "opinionstage_ajax_toggle_article_placement")
13
+ })
14
 
15
  $('#sidebar-placement-switch').change(function () {
16
+ toggleSettingsAjax($(this), "opinionstage_ajax_toggle_sidebar_placement")
17
+ })
18
+
19
+
20
+ var OpinionstageMyItems = {
21
+ cacheElements: function() {
22
+ this.cache = {
23
+ $messageLoading: $('#opinionstage-my-items-loading-message'),
24
+ $messageNoItemsFound: $('#opinionstage-my-items-no-items'),
25
+ $buttonLoadMore: $('#opinionstage-load-more'),
26
+ $table: $('#opinionstage-items-table'),
27
+ $loadtPage: 1,
28
+ $selectorWidgetType: $('#itemList'),
29
+ $searchField: $('#opinionstage-my-items-search-field'),
30
+ $failedLoadItemsMessage: $('#opinionstage-failed-load-items-request'),
31
+ $searchTerm: '',
32
+
33
+ $widgetType: $('#itemList').val() ? $('#itemList').val() : 'all'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
34
  }
35
  },
36
+ loadItems: function(override = true){
37
+ var self = this
38
+ if( override ) {
39
+ self.cache.$table.html('')
40
+ self.cache.$messageLoading.show()
41
+ self.cache.$messageNoItemsFound.hide()
42
+ }
43
+ self.cache.$buttonLoadMore.hide()
44
+ self.cache.$failedLoadItemsMessage.hide();
45
+
46
+ $.ajax({
47
+ url: ajaxurl,
48
+ type: 'GET',
49
+ data: {
50
+ action: 'opinionstage_ajax_load_my_items',
51
+ type: self.cache.$widgetType,
52
+ per_page: 10,
53
+ page: self.cache.$loadtPage,
54
+ title_like: self.cache.$searchTerm,
55
+ security: OPINIONSTAGE.myItemsNonce
56
+ },
57
+ success: function( response ) {
58
+ self.cache.$messageLoading.hide()
59
+ console.log(response.success)
60
+ if( response.success ) {
61
+ if( response.html.length > 0 ) {
62
+ self.renderResults( response.html, override )
63
+ if( response.nextPage ) {
64
+ self.cache.$buttonLoadMore.show()
65
+ self.cache.$loadtPage = response.nextPage
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
  } else {
67
+ self.cache.$buttonLoadMore.hide()
68
  }
69
  } else {
70
+ self.cache.$messageNoItemsFound.show()
 
 
 
 
 
 
 
 
 
 
71
  }
72
+ } else {
73
+ self.cache.$failedLoadItemsMessage.show();
74
+ }
75
  }
76
+ })
77
  },
 
 
 
 
 
 
 
 
 
 
78
 
79
+ bindEvents: function() {
80
+ var self = this
81
+ self.cache.$buttonLoadMore.on('click', function (e) {
82
+ e.preventDefault()
83
+ self.loadItems(false)
84
+ })
85
+
86
+ self.cache.$selectorWidgetType.on('change', function (e) {
87
+ e.preventDefault()
88
+ self.cache.$loadtPage = 1
89
+ self.cache.$searchField.val('')
90
+ self.cache.$searchTerm = ''
91
+ self.cache.$widgetType = $(this).val()
92
+ self.loadItems()
93
+ })
94
+
95
+ self.cache.$searchField.on("keyup", function(e) {
96
+ if (e.key === 'Enter') {
97
+ self.cache.$searchTerm = $(this).val()
98
+ self.cache.$loadtPage = 1
99
+ self.loadItems()
100
  }
101
+ })
102
+ },
 
 
 
 
 
 
 
 
 
 
103
 
104
+ renderResults: function( html_ajax, override ){
105
+ var self = this
106
+ var html = override ? '' : self.cache.$table.html()
107
+ html += html_ajax
108
+ self.cache.$table.html(html)
109
+ },
110
 
111
+ init: function() {
112
+ this.cacheElements()
113
+ this.loadItems()
114
+ this.bindEvents()
115
+ }
116
  }
117
+ OpinionstageMyItems.init()
118
 
119
  if ($('.opinionstage-show-anchor-list').length > 0) {
120
 
121
+ $('.opinionstage-show-anchor-list').click(function (e) {
122
+ e.preventDefault()
123
+ $('.opinionstage-anchors-list').toggleClass('opened')
124
  })
125
 
126
  $(document).click(function (e) {
127
+ if (!$(e.target).is('.opinionstage-show-anchor-list') && $('.opinionstage-anchors-list').hasClass('opened')) {
128
+ $('.opinionstage-anchors-list').removeClass('opened')
129
  }
130
  })
131
  }
132
+ })
admin/menu-page.php CHANGED
@@ -14,38 +14,21 @@ add_action( 'admin_menu', 'opinionstage_register_menu_page' );
14
  */
15
  function opinionstage_register_menu_page() {
16
  if ( function_exists( 'add_menu_page' ) ) {
17
- $os_options = (array) get_option( OPINIONSTAGE_OPTIONS_KEY );
18
  $os_client_logged_in = opinionstage_user_logged_in();
19
  if ( $os_client_logged_in ) {
20
- if ( isset( $os_options['item_count'] ) && $os_options['item_count'] > 0 ) {
21
- add_menu_page(
22
- __( 'Opinion Stage', 'social-polls-by-opinionstage' ),
23
- __( 'Opinion Stage', 'social-polls-by-opinionstage' ),
24
- 'edit_posts',
25
- OPINIONSTAGE_VIEW_ITEM_SLUG,
26
- 'opinionstage_load_template',
27
- plugins_url( 'admin/images/os-icon.png', plugin_dir_path( __FILE__ ) ),
28
- '25.234323221'
29
- );
30
- add_submenu_page( OPINIONSTAGE_VIEW_ITEM_SLUG, 'View My Items', 'My Items', 'edit_posts', OPINIONSTAGE_VIEW_ITEM_SLUG );
31
- add_submenu_page( OPINIONSTAGE_VIEW_ITEM_SLUG, 'Create...', 'Create...', 'edit_posts', OPINIONSTAGE_MENU_SLUG, 'opinionstage_load_template' );
32
- add_submenu_page( OPINIONSTAGE_VIEW_ITEM_SLUG, 'Placements', 'Placements', 'edit_posts', OPINIONSTAGE_PLACEMENT_SLUG, 'opinionstage_load_template' );
33
- add_submenu_page( OPINIONSTAGE_VIEW_ITEM_SLUG, 'Help Resources', 'Help Resources', 'edit_posts', OPINIONSTAGE_HELP_RESOURCE_SLUG, 'opinionstage_load_template' );
34
- } else {
35
- add_menu_page(
36
- __( 'Opinion Stage', 'social-polls-by-opinionstage' ),
37
- __( 'Opinion Stage', 'social-polls-by-opinionstage' ),
38
- 'edit_posts',
39
- OPINIONSTAGE_MENU_SLUG,
40
- 'opinionstage_load_template',
41
- plugins_url( 'admin/images/os-icon.png', plugin_dir_path( __FILE__ ) ),
42
- '25.234323221'
43
- );
44
- add_submenu_page( OPINIONSTAGE_MENU_SLUG, 'Create...', 'Create...', 'edit_posts', OPINIONSTAGE_MENU_SLUG );
45
- add_submenu_page( OPINIONSTAGE_MENU_SLUG, 'View My Items', 'My Items', 'edit_posts', 'opinionstage-view-my-items', 'opinionstage_load_template' );
46
- add_submenu_page( OPINIONSTAGE_MENU_SLUG, 'Placements', 'Placements', 'edit_posts', OPINIONSTAGE_PLACEMENT_SLUG, 'opinionstage_load_template' );
47
- add_submenu_page( OPINIONSTAGE_MENU_SLUG, 'Help Resources', 'Help Resources', 'edit_posts', OPINIONSTAGE_HELP_RESOURCE_SLUG, 'opinionstage_load_template' );
48
- }
49
  } else {
50
  add_menu_page(
51
  __( 'Opinion Stage', 'social-polls-by-opinionstage' ),
14
  */
15
  function opinionstage_register_menu_page() {
16
  if ( function_exists( 'add_menu_page' ) ) {
 
17
  $os_client_logged_in = opinionstage_user_logged_in();
18
  if ( $os_client_logged_in ) {
19
+ add_menu_page(
20
+ __( 'Opinion Stage', 'social-polls-by-opinionstage' ),
21
+ __( 'Opinion Stage', 'social-polls-by-opinionstage' ),
22
+ 'edit_posts',
23
+ OPINIONSTAGE_MENU_SLUG,
24
+ 'opinionstage_load_template',
25
+ plugins_url( 'admin/images/os-icon.png', plugin_dir_path( __FILE__ ) ),
26
+ '25.234323221'
27
+ );
28
+ add_submenu_page( OPINIONSTAGE_MENU_SLUG, 'Create...', 'Create...', 'edit_posts', OPINIONSTAGE_MENU_SLUG );
29
+ add_submenu_page( OPINIONSTAGE_MENU_SLUG, 'View My Items', 'My Items', 'edit_posts', OPINIONSTAGE_VIEW_ITEM_SLUG, 'opinionstage_load_template' );
30
+ add_submenu_page( OPINIONSTAGE_MENU_SLUG, 'Placements', 'Placements', 'edit_posts', OPINIONSTAGE_PLACEMENT_SLUG, 'opinionstage_load_template' );
31
+ add_submenu_page( OPINIONSTAGE_MENU_SLUG, 'Help Resources', 'Help Resources', 'edit_posts', OPINIONSTAGE_HELP_RESOURCE_SLUG, 'opinionstage_load_template' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
  } else {
33
  add_menu_page(
34
  __( 'Opinion Stage', 'social-polls-by-opinionstage' ),
admin/menu-target.php DELETED
@@ -1,19 +0,0 @@
1
- <?php
2
- add_action('admin_footer', 'OpinionStage_addMenuTargetLink');
3
-
4
- function OpinionStage_addMenuTargetLink(){
5
- if ( isset($os_options['item_count']) && $os_options['item_count'] > 0) { ?>
6
- <script type="text/javascript">
7
- jQuery(document).ready(function(){
8
- jQuery("li.toplevel_page_opinionstage-view-my-items ul li:nth-last-child(1) a,li.toplevel_page_opinionstage-settings ul li:nth-last-child(1) a").attr('target', '_blank');
9
- });
10
- </script>
11
- <?php }else{ ?>
12
- <script type="text/javascript">
13
- jQuery(document).ready(function(){
14
- jQuery("li.toplevel_page_opinionstage-getting-started ul li:nth-last-child(1) a,li.toplevel_page_opinionstage-settings ul li:nth-last-child(1) a").attr('target', '_blank');
15
- });
16
- </script>
17
- <?php }
18
- }
19
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
admin/resources/common.php CHANGED
@@ -19,10 +19,8 @@ function opinionstage_common_load_resources() {
19
  opinionstage_asset_name( 'menu-page' ),
20
  'OPINIONSTAGE',
21
  array(
22
- 'WidgetApiUrl' => esc_url( OPINIONSTAGE_CONTENT_POPUP_CLIENT_WIDGETS_API . '?type=all&page=1&per_page=99' ),
23
- 'OswpPluginVersion' => OPINIONSTAGE_WIDGET_VERSION,
24
- 'OswpClientToken' => opinionstage_user_access_token(),
25
- 'adminUrlCreateLink' => esc_url( admin_url( 'admin.php?page=opinionstage-settings' ) ),
26
  )
27
  );
28
 
19
  opinionstage_asset_name( 'menu-page' ),
20
  'OPINIONSTAGE',
21
  array(
22
+ 'myPlacementsNonce' => wp_create_nonce( 'opinionstage-my-placements' ),
23
+ 'myItemsNonce' => wp_create_nonce( 'opinionstage-load-my-items' ),
 
 
24
  )
25
  );
26
 
admin/template-parts/my-items-tbody-element.php ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Table Element on My Items page
4
+ *
5
+ * @package OpinionStageWordPressPlugin
6
+ */
7
+
8
+ ?>
9
+ <tbody>
10
+ <tr class="settingBorderOs">
11
+ <td class="image">
12
+ <a href="<?php echo esc_url( $item['attributes']['landing-page-url'] ); ?>" target="_blank">
13
+ <div class="content-item-image quiz">
14
+ <img height="90" src="<?php echo esc_url( $item['attributes']['image-url'] ); ?>" width="120">
15
+ <div class="content-item-label"><?php echo esc_html( $item['attributes']['type'] ); ?></div>
16
+ </div>
17
+ </a>
18
+ </td>
19
+ <td class="long">
20
+ <div><a
21
+ href="<?php echo esc_url( $item['attributes']['edit-url'] ); ?>"
22
+ class="opinionstage-item-title"
23
+ target="_blank"><?php echo esc_html( $item['attributes']['title'] ); ?></a>
24
+ <table>
25
+ <tbody>
26
+ <tr>
27
+ <td><span class="os-icon-plugin icon-os-common-date"></span>
28
+ <div class="label"><?php echo esc_html( $item['attributes']['updated-at'] ); ?></div>
29
+ </td>
30
+ </tr>
31
+ </tbody>
32
+ </table>
33
+ </div>
34
+ </td>
35
+ <td class="action">
36
+ <div class="opinionstage-item-action-container"><a
37
+ href="<?php echo esc_url( $item['attributes']['landing-page-url'] ); ?>"
38
+ class="opinionstage-blue-bordered-btn opinionstage-edit-content "
39
+ target="_blank"> <?php esc_html_e( 'View', 'social-polls-by-opinionstage' ); ?> </a><a
40
+ href="<?php echo esc_url( $item['attributes']['edit-url'] ); ?>"
41
+ class="opinionstage-blue-bordered-btn opinionstage-edit-content "
42
+ target="_blank"> <?php esc_html_e( 'Edit', 'social-polls-by-opinionstage' ); ?> </a><a
43
+ href="<?php echo esc_url( $item['attributes']['stats-url'] ); ?>"
44
+ class="opinionstage-blue-bordered-btn opinionstage-edit-content "
45
+ target="_blank"> <?php esc_html_e( 'Results', 'social-polls-by-opinionstage' ); ?> </a></div>
46
+ </td>
47
+ </tr>
48
+ </tbody>
admin/views/view_my_items.php CHANGED
@@ -41,12 +41,12 @@ defined( 'ABSPATH' ) || die();
41
  <option value="poll"><?php esc_html_e( 'POLL', 'social-polls-by-opinionstage' ); ?></option>
42
  <option value="survey"><?php esc_html_e( 'SURVEY', 'social-polls-by-opinionstage' ); ?></option>
43
  <option value="trivia"><?php esc_html_e( 'TRIVIA QUIZ', 'social-polls-by-opinionstage' ); ?></option>
44
- <option value="personality"><?php esc_html_e( 'PERSONALITY QUIZ', 'social-polls-by-opinionstage' ); ?></option>
45
  <option value="form"><?php esc_html_e( 'CLASSIC FORM', 'social-polls-by-opinionstage' ); ?></option>
46
  </select>
47
  </div>
48
  <div class="search search-container">
49
- <input id="searchItem" class="std-input" name="search" placeholder="Search" type="text">
50
  </div>
51
  </div>
52
 
@@ -63,9 +63,12 @@ defined( 'ABSPATH' ) || die();
63
  </div>
64
  </div>
65
  </div>
66
- <p class="result_progress" style="display: block; font-size: 16px; text-align: center;"><?php esc_html_e( 'Loading...', 'social-polls-by-opinionstage' ); ?></p>
67
- <table id="check"></table>
 
68
  <p class="no_item" style="display: none; font-size: 15px; text-align: center;"><?php esc_html_e( 'No items found', 'social-polls-by-opinionstage' ); ?></p>
 
 
69
  <div id="opinionstage-load-more" class="btn btn_aqua btn_full-width" style="display: none;"><?php esc_html_e( 'Click for more', 'social-polls-by-opinionstage' ); ?></div>
70
  </div>
71
  </div>
41
  <option value="poll"><?php esc_html_e( 'POLL', 'social-polls-by-opinionstage' ); ?></option>
42
  <option value="survey"><?php esc_html_e( 'SURVEY', 'social-polls-by-opinionstage' ); ?></option>
43
  <option value="trivia"><?php esc_html_e( 'TRIVIA QUIZ', 'social-polls-by-opinionstage' ); ?></option>
44
+ <option value="outcome"><?php esc_html_e( 'PERSONALITY QUIZ', 'social-polls-by-opinionstage' ); ?></option>
45
  <option value="form"><?php esc_html_e( 'CLASSIC FORM', 'social-polls-by-opinionstage' ); ?></option>
46
  </select>
47
  </div>
48
  <div class="search search-container">
49
+ <input id="opinionstage-my-items-search-field" class="std-input" name="search" placeholder="Search" type="text">
50
  </div>
51
  </div>
52
 
63
  </div>
64
  </div>
65
  </div>
66
+ <p id="opinionstage-my-items-loading-message" class="opinionstage-my-items-message" style="display: block; font-size: 16px; text-align: center;"><?php esc_html_e( 'Loading...', 'social-polls-by-opinionstage' ); ?></p>
67
+ <p id="opinionstage-my-items-no-items" class="opinionstage-my-items-message" style="display: none; font-size: 16px; text-align: center;"><?php esc_html_e( 'No items found', 'social-polls-by-opinionstage' ); ?></p>
68
+ <table id="opinionstage-items-table"></table>
69
  <p class="no_item" style="display: none; font-size: 15px; text-align: center;"><?php esc_html_e( 'No items found', 'social-polls-by-opinionstage' ); ?></p>
70
+ <p id="opinionstage-failed-load-items-request" style="display: none; font-size: 15px; text-align: center;"><?php esc_html_e( 'An error occurred while loading the items.', 'social-polls-by-opinionstage' ); ?>
71
+ <a href="https://www.opinionstage.com/live-chat/?utm_source=wordpress&utm_campaign=WPMainPI&utm_medium=link&o=wp35e8" target="_blank"><?php esc_html_e('Please contact our chat support for help', 'social-polls-by-opinionstage'); ?></a></p>
72
  <div id="opinionstage-load-more" class="btn btn_aqua btn_full-width" style="display: none;"><?php esc_html_e( 'Click for more', 'social-polls-by-opinionstage' ); ?></div>
73
  </div>
74
  </div>
includes/opinionstage-ajax-functions.php CHANGED
@@ -1,55 +1,125 @@
1
  <?php
 
 
 
 
 
2
 
3
- // block direct access to plugin PHP files:
4
- defined( 'ABSPATH' ) or die();
5
 
6
  add_action( 'wp_ajax_opinionstage_ajax_toggle_flyout', 'opinionstage_ajax_toggle_flyout' );
7
  add_action( 'wp_ajax_opinionstage_ajax_toggle_article_placement', 'opinionstage_ajax_toggle_article_placement' );
8
  add_action( 'wp_ajax_opinionstage_ajax_toggle_sidebar_placement', 'opinionstage_ajax_toggle_sidebar_placement' );
9
  add_action( 'wp_ajax_osa_message_delete', 'opinionstage_message_delete' );
10
- add_action( 'wp_ajax_opinionstage_ajax_item_count', 'opinionstage_ajax_item_count' );
11
 
12
 
13
- // Toggle the flyout placement activation flag
 
 
14
  function opinionstage_ajax_toggle_flyout() {
15
- $os_options = (array) get_option(OPINIONSTAGE_OPTIONS_KEY);
16
- $os_options['fly_out_active'] = sanitize_text_field($_POST['activate']);
17
 
18
- update_option(OPINIONSTAGE_OPTIONS_KEY, $os_options);
19
- wp_die('1');
 
 
 
 
 
20
  }
21
- // Toggle the article placement activation flag
 
 
 
22
  function opinionstage_ajax_toggle_article_placement() {
23
- $os_options = (array) get_option(OPINIONSTAGE_OPTIONS_KEY);
24
- $os_options['article_placement_active'] = sanitize_text_field($_POST['activate']);
25
 
26
- update_option(OPINIONSTAGE_OPTIONS_KEY, $os_options);
27
- wp_die('1');
 
 
 
 
 
28
  }
29
- // Toggle the sidebar placement activation flag
 
 
 
30
  function opinionstage_ajax_toggle_sidebar_placement() {
31
- $os_options = (array) get_option(OPINIONSTAGE_OPTIONS_KEY);
32
- $os_options['sidebar_placement_active'] = sanitize_text_field($_POST['activate']);
 
 
 
33
 
34
- update_option(OPINIONSTAGE_OPTIONS_KEY, $os_options);
35
- wp_die('1');
 
36
  }
37
 
 
 
 
38
  function opinionstage_message_delete() {
39
- if(isset($_POST['delete_options_oswp']) && $_POST['delete_options_oswp'] == true){
40
- $message_title = delete_option('oswp_message_title');
41
- $message_content = delete_option('oswp_message_content');
42
- update_option('oswp_message_activity_time', time());
 
43
  }
44
- wp_die('1');
45
  }
46
 
47
- function opinionstage_ajax_item_count() {
48
- $os_options = (array) get_option(OPINIONSTAGE_OPTIONS_KEY);
49
- $os_options['item_count'] = intval($_POST['oswp_item_count']);
 
 
50
 
51
- update_option(OPINIONSTAGE_OPTIONS_KEY, $os_options);
52
- wp_die('1');
53
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54
 
55
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  <?php
2
+ /**
3
+ * Ajax Functions
4
+ *
5
+ * @package OpinionStageWordPressPlugin
6
+ */
7
 
8
+ defined( 'ABSPATH' ) || die();
 
9
 
10
  add_action( 'wp_ajax_opinionstage_ajax_toggle_flyout', 'opinionstage_ajax_toggle_flyout' );
11
  add_action( 'wp_ajax_opinionstage_ajax_toggle_article_placement', 'opinionstage_ajax_toggle_article_placement' );
12
  add_action( 'wp_ajax_opinionstage_ajax_toggle_sidebar_placement', 'opinionstage_ajax_toggle_sidebar_placement' );
13
  add_action( 'wp_ajax_osa_message_delete', 'opinionstage_message_delete' );
14
+ add_action( 'wp_ajax_opinionstage_ajax_load_my_items', 'opinionstage_load_my_items' );
15
 
16
 
17
+ /**
18
+ * Toggle the flyout placement activation flag.
19
+ */
20
  function opinionstage_ajax_toggle_flyout() {
21
+ check_ajax_referer( 'opinionstage-my-placements', 'security' );
 
22
 
23
+ if ( isset( $_POST['activate'] ) ) {
24
+ $os_options = (array) get_option( OPINIONSTAGE_OPTIONS_KEY );
25
+ $os_options['fly_out_active'] = sanitize_text_field( wp_unslash( $_POST['activate'] ) );
26
+
27
+ update_option( OPINIONSTAGE_OPTIONS_KEY, $os_options );
28
+ }
29
+ wp_die( '1' );
30
  }
31
+
32
+ /**
33
+ * Toggle the article placement activation flag.
34
+ */
35
  function opinionstage_ajax_toggle_article_placement() {
36
+ check_ajax_referer( 'opinionstage-my-placements', 'security' );
 
37
 
38
+ if ( isset( $_POST['activate'] ) ) {
39
+ $os_options = (array) get_option( OPINIONSTAGE_OPTIONS_KEY );
40
+ $os_options['article_placement_active'] = sanitize_text_field( wp_unslash( $_POST['activate'] ) );
41
+
42
+ update_option( OPINIONSTAGE_OPTIONS_KEY, $os_options );
43
+ }
44
+ wp_die( '1' );
45
  }
46
+
47
+ /**
48
+ * Toggle the sidebar placement activation flag.
49
+ */
50
  function opinionstage_ajax_toggle_sidebar_placement() {
51
+ check_ajax_referer( 'opinionstage-my-placements', 'security' );
52
+
53
+ if ( isset( $_POST['activate'] ) ) {
54
+ $os_options = (array) get_option( OPINIONSTAGE_OPTIONS_KEY );
55
+ $os_options['sidebar_placement_active'] = sanitize_text_field( wp_unslash( $_POST['activate'] ) );
56
 
57
+ update_option( OPINIONSTAGE_OPTIONS_KEY, $os_options );
58
+ }
59
+ wp_die( '1' );
60
  }
61
 
62
+ /**
63
+ * Delete message
64
+ */
65
  function opinionstage_message_delete() {
66
+
67
+ if ( isset( $_POST['delete_options_oswp'] ) && $_POST['delete_options_oswp'] == true ) {
68
+ $message_title = delete_option( 'oswp_message_title' );
69
+ $message_content = delete_option( 'oswp_message_content' );
70
+ update_option( 'oswp_message_activity_time', time() );
71
  }
72
+ wp_die( '1' );
73
  }
74
 
75
+ /**
76
+ * Load My items
77
+ */
78
+ function opinionstage_load_my_items() {
79
+ check_ajax_referer( 'opinionstage-load-my-items', 'security' );
80
 
81
+ $args_clean = array();
82
+ $allowed_args = array( 'type', 'per_page', 'page', 'title_like' );
83
+ foreach ( $_GET as $key => $val ) {
84
+ if ( in_array( $key, $allowed_args, true ) ) {
85
+ $args_clean[ $key ] = $val;
86
+ }
87
+ }
88
+
89
+ $access_token = opinionstage_user_access_token();
90
+
91
+ $url = add_query_arg( $args_clean, OPINIONSTAGE_CONTENT_POPUP_CLIENT_WIDGETS_API );
92
+
93
+ $response = wp_remote_get(
94
+ $url,
95
+ array(
96
+ 'headers' => array(
97
+ 'OSWP-Plugin-Version' => OPINIONSTAGE_WIDGET_VERSION,
98
+ 'OSWP-Client-Token' => $access_token,
99
+ ),
100
+ )
101
+ );
102
+
103
+ if ( 200 === wp_remote_retrieve_response_code( $response ) ) {
104
+ $res_arr = json_decode( wp_remote_retrieve_body( $response ), true );
105
 
106
+ $html = '';
107
+ if ( isset( $res_arr['data'] ) && ! empty( $res_arr['data'] ) ) {
108
+ ob_start();
109
+ foreach ( $res_arr['data'] as $item ) {
110
+ include plugin_dir_path( dirname( __FILE__ ) ) . 'admin/template-parts/my-items-tbody-element.php';
111
+ }
112
+ $html = ob_get_clean();
113
+ }
114
+
115
+ wp_send_json(
116
+ array(
117
+ 'success' => true,
118
+ 'nextPage' => $res_arr['meta']['nextPage'],
119
+ 'html' => $html,
120
+ )
121
+ );
122
+ }
123
+
124
+ wp_send_json_error();
125
+ }
opinionstage-polls.php CHANGED
@@ -3,7 +3,7 @@
3
  Plugin Name: Poll, Survey, Form & Quiz Maker by OpinionStage (Deprecated)
4
  Plugin URI: https://www.opinionstage.com
5
  Description: Add a highly engaging poll, survey, quiz or contact form builder to your site. You can add the poll, survey, quiz or form to any post/page or to the sidebar.
6
- Version: 19.7.6
7
  Author: OpinionStage.com
8
  Author URI: https://www.opinionstage.com
9
  Text Domain: social-polls-by-opinionstage
3
  Plugin Name: Poll, Survey, Form & Quiz Maker by OpinionStage (Deprecated)
4
  Plugin URI: https://www.opinionstage.com
5
  Description: Add a highly engaging poll, survey, quiz or contact form builder to your site. You can add the poll, survey, quiz or form to any post/page or to the sidebar.
6
+ Version: 19.7.7
7
  Author: OpinionStage.com
8
  Author URI: https://www.opinionstage.com
9
  Text Domain: social-polls-by-opinionstage
plugin.php CHANGED
@@ -8,7 +8,7 @@
8
  * Plugin Name: Poll, Survey & Quiz by OpinionStage
9
  * Plugin URI: https://www.opinionstage.com
10
  * Description: Add a highly engaging poll, survey, quiz or contact form builder to your site. You can add the poll, survey, quiz or form to any post/page or to the sidebar.
11
- * Version: 19.7.6
12
  * Author: OpinionStage.com
13
  * Author URI: https://www.opinionstage.com
14
  * Text Domain: social-polls-by-opinionstage
@@ -34,7 +34,7 @@ if ( defined( 'WP_DEBUG' ) && true === WP_DEBUG ) {
34
  }
35
  }
36
 
37
- define( 'OPINIONSTAGE_WIDGET_VERSION', '19.7.6' );
38
 
39
  define( 'OPINIONSTAGE_TEXT_DOMAIN', 'social-polls-by-opinionstage' );
40
 
8
  * Plugin Name: Poll, Survey & Quiz by OpinionStage
9
  * Plugin URI: https://www.opinionstage.com
10
  * Description: Add a highly engaging poll, survey, quiz or contact form builder to your site. You can add the poll, survey, quiz or form to any post/page or to the sidebar.
11
+ * Version: 19.7.7
12
  * Author: OpinionStage.com
13
  * Author URI: https://www.opinionstage.com
14
  * Text Domain: social-polls-by-opinionstage
34
  }
35
  }
36
 
37
+ define( 'OPINIONSTAGE_WIDGET_VERSION', '19.7.7' );
38
 
39
  define( 'OPINIONSTAGE_TEXT_DOMAIN', 'social-polls-by-opinionstage' );
40
 
readme.txt CHANGED
@@ -4,7 +4,7 @@ Donate link: https://www.opinionstage.com
4
  Tags: poll, quiz, survey, poll plugin, quiz plugin, survey plugin
5
  Requires at least: 2.8
6
  Tested up to: 5.6
7
- Stable tag: 19.7.6
8
  Requires PHP: 5.2
9
 
10
  Add a Poll, Survey, or Quiz to your Wordpress site. Create a poll, quiz, or survey from scratch or based on templates.
@@ -12,7 +12,9 @@ Add a Poll, Survey, or Quiz to your Wordpress site. Create a poll, quiz, or surv
12
  == Description ==
13
 
14
  * <a href="https://www.opinionstage.com/templates/c/surveys?o=wp35e8" target="_blank">Survey Templates & Examples</a>
 
15
  * <a href="https://www.opinionstage.com/templates/c/quizzes?o=wp35e8" target="_blank">Quiz Templates & Examples</a>
 
16
  * <a href="https://www.opinionstage.com/templates/c/polls?o=wp35e8" target="_blank">Poll Templates & Examples</a>
17
 
18
  Opinion Stage is a poll, survey and quiz maker plugin for WordPress. It's the easiest way to create anything from opinion polls, feedback surveys, buzzfeed-syle quizzes to contact forms.
@@ -140,6 +142,9 @@ Opinion Stage makes it easy for you to comply with the GDPR regulation. For more
140
  N/A
141
 
142
  == Changelog ==
 
 
 
143
  = 19.7.6 =
144
  * UI update
145
  * internal code improvements
4
  Tags: poll, quiz, survey, poll plugin, quiz plugin, survey plugin
5
  Requires at least: 2.8
6
  Tested up to: 5.6
7
+ Stable tag: 19.7.7
8
  Requires PHP: 5.2
9
 
10
  Add a Poll, Survey, or Quiz to your Wordpress site. Create a poll, quiz, or survey from scratch or based on templates.
12
  == Description ==
13
 
14
  * <a href="https://www.opinionstage.com/templates/c/surveys?o=wp35e8" target="_blank">Survey Templates & Examples</a>
15
+
16
  * <a href="https://www.opinionstage.com/templates/c/quizzes?o=wp35e8" target="_blank">Quiz Templates & Examples</a>
17
+
18
  * <a href="https://www.opinionstage.com/templates/c/polls?o=wp35e8" target="_blank">Poll Templates & Examples</a>
19
 
20
  Opinion Stage is a poll, survey and quiz maker plugin for WordPress. It's the easiest way to create anything from opinion polls, feedback surveys, buzzfeed-syle quizzes to contact forms.
142
  N/A
143
 
144
  == Changelog ==
145
+ = 19.7.7 =
146
+ * internal code improvements
147
+ * tested up to 5.7 Wordpress
148
  = 19.7.6 =
149
  * UI update
150
  * internal code improvements