Export User Data - Version 2.2.4

Version Description

Download this release

Release Info

Developer qlstudio
Plugin Icon wp plugin Export User Data
Version 2.2.4
Comparing to
See all releases

Code changes from version 2.2.3 to 2.2.4

CHANGELOG.md CHANGED
@@ -1,6 +1,6 @@
1
  ## Changelog ##
2
 
3
- *** 2.2.3 ***
4
 
5
  * New: WordPress Security release
6
 
1
  ## Changelog ##
2
 
3
+ *** 2.2.4 ***
4
 
5
  * New: WordPress Security release
6
 
export-user-data.php CHANGED
@@ -12,7 +12,7 @@
12
  * Plugin Name: Export User Data
13
  * Plugin URI: http://qstudio.us/releases/export-user-data
14
  * Description: Export User data and metadata.
15
- * Version: 2.2.3
16
  * Author: Q Studio
17
  * Author URI: https://qstudio.us
18
  * License: GPL-2.0+
@@ -50,10 +50,10 @@ require_once __DIR__ . '/plugin.php';
50
  require_once __DIR__ . '/vendor/PHP_XLSXWriter/xlsxwriter.class.php';
51
 
52
  // get plugin instance ##
53
- $plugin = plugin::get_instance();
54
 
55
  // validate instance ##
56
- if( ! ( $plugin instanceof \q\eud\plugin ) ) {
57
 
58
  error_log( 'Error in Export User Data plugin instance' );
59
 
@@ -63,51 +63,51 @@ if( ! ( $plugin instanceof \q\eud\plugin ) ) {
63
  }
64
 
65
  // fire hooks - build log, helper and config objects and translations ##
66
- \add_action( 'init', function() use( $plugin ){
67
 
68
  // set text domain on init hook ##
69
- \add_action( 'init', [ $plugin, 'load_plugin_textdomain' ], 1 );
70
 
71
  // check debug settings ##
72
- \add_action( 'plugins_loaded', [ $plugin, 'debug' ], 11 );
73
 
74
  }, 0 );
75
 
76
  // build export object ##
77
- $export = new eud\core\export( $plugin );
78
 
79
  // build filters object ##
80
- $filters = new eud\core\filters( $plugin );
81
 
82
  // build user object ##
83
- $user = new eud\core\user( $plugin );
84
 
85
  // build admin object ##
86
- $admin = new eud\admin\render( $plugin, $user );
87
 
88
  // build buddypress object ##
89
- // $buddypress = new eud\core\buddypress();
90
 
91
  if ( \is_admin() ){
92
 
93
  // run export ##
94
- \add_action( 'admin_init', [ $export, 'render' ], 1000003 );
95
 
96
  // load BP ##
97
- // \add_action( 'admin_init', [ $buddypress, 'load' ], 1000001 );
98
 
99
  // EUD - filter key shown ##
100
- \add_filter( 'q/eud/admin/display_key', [ $filters, 'display_key' ], 1, 1 );
101
 
102
  // user option ##
103
- \add_action( 'admin_init', [ $user, 'load' ], 1000002 );
104
 
105
  // add export menu inside admin ##
106
- \add_action( 'admin_menu', [ $admin, 'add_menu' ] );
107
 
108
  // UI style and functionality ##
109
- \add_action( 'admin_enqueue_scripts', [ $admin, 'admin_enqueue_scripts' ], 1 );
110
- \add_action( 'admin_footer', [ $admin, 'jquery' ], 100000 );
111
- \add_action( 'admin_footer', [ $admin, 'css' ], 100000 );
112
 
113
  }
12
  * Plugin Name: Export User Data
13
  * Plugin URI: http://qstudio.us/releases/export-user-data
14
  * Description: Export User data and metadata.
15
+ * Version: 2.2.4
16
  * Author: Q Studio
17
  * Author URI: https://qstudio.us
18
  * License: GPL-2.0+
50
  require_once __DIR__ . '/vendor/PHP_XLSXWriter/xlsxwriter.class.php';
51
 
52
  // get plugin instance ##
53
+ $_plugin = plugin::get_instance();
54
 
55
  // validate instance ##
56
+ if( ! ( $_plugin instanceof \q\eud\plugin ) ) {
57
 
58
  error_log( 'Error in Export User Data plugin instance' );
59
 
63
  }
64
 
65
  // fire hooks - build log, helper and config objects and translations ##
66
+ \add_action( 'init', function() use( $_plugin ){
67
 
68
  // set text domain on init hook ##
69
+ \add_action( 'init', [ $_plugin, 'load_plugin_textdomain' ], 1 );
70
 
71
  // check debug settings ##
72
+ \add_action( 'plugins_loaded', [ $_plugin, 'debug' ], 11 );
73
 
74
  }, 0 );
75
 
76
  // build export object ##
77
+ $_export = new eud\core\export( $_plugin );
78
 
79
  // build filters object ##
80
+ $_filters = new eud\core\filters( $_plugin );
81
 
82
  // build user object ##
83
+ $_user = new eud\core\user( $_plugin );
84
 
85
  // build admin object ##
86
+ $_admin = new eud\admin\render( $_plugin, $_user );
87
 
88
  // build buddypress object ##
89
+ // $_buddypress = new eud\core\buddypress( $_plugin );
90
 
91
  if ( \is_admin() ){
92
 
93
  // run export ##
94
+ \add_action( 'admin_init', [ $_export, 'render' ], 1000003 );
95
 
96
  // load BP ##
97
+ // \add_action( 'admin_init', [ $_buddypress, 'load' ], 1000001 );
98
 
99
  // EUD - filter key shown ##
100
+ \add_filter( 'q/eud/admin/display_key', [ $_filters, 'display_key' ], 1, 1 );
101
 
102
  // user option ##
103
+ \add_action( 'admin_init', [ $_user, 'load' ], 1000002 );
104
 
105
  // add export menu inside admin ##
106
+ \add_action( 'admin_menu', [ $_admin, 'add_menu' ] );
107
 
108
  // UI style and functionality ##
109
+ \add_action( 'admin_enqueue_scripts', [ $_admin, 'admin_enqueue_scripts' ], 1 );
110
+ \add_action( 'admin_footer', [ $_admin, 'jquery' ], 100000 );
111
+ \add_action( 'admin_footer', [ $_admin, 'css' ], 100000 );
112
 
113
  }
library/admin/css/image/ui-bg_flat_0_aaaaaa_40x100 (1).png ADDED
Binary file
library/admin/css/image/ui-bg_flat_0_aaaaaa_40x100.png ADDED
Binary file
library/admin/css/image/ui-bg_flat_75_ffffff_40x100.png ADDED
Binary file
library/admin/css/image/ui-bg_glass_55_fbf9ee_1x400.png ADDED
Binary file
library/admin/css/image/ui-bg_glass_65_ffffff_1x400.png ADDED
Binary file
library/admin/css/image/ui-bg_glass_75_dadada_1x400.png ADDED
Binary file
library/admin/css/image/ui-bg_glass_75_e6e6e6_1x400.png ADDED
Binary file
library/admin/css/image/ui-bg_glass_95_fef1ec_1x400.png ADDED
Binary file
library/admin/css/image/ui-bg_highlight-soft_75_cccccc_1x100.png ADDED
Binary file
library/admin/css/image/ui-icons_222222_256x240.png ADDED
Binary file
library/admin/css/jquery-ui.css ADDED
@@ -0,0 +1,2009 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*! jQuery UI - v1.8.24 - 2012-09-28
2
+ * https://github.com/jquery/jquery-ui
3
+ * Includes: jquery.ui.core.css, jquery.ui.accordion.css, jquery.ui.autocomplete.css, jquery.ui.button.css, jquery.ui.datepicker.css, jquery.ui.dialog.css, jquery.ui.progressbar.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.slider.css, jquery.ui.tabs.css, jquery.ui.theme.css
4
+ * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
5
+
6
+ /* Layout helpers
7
+ ----------------------------------*/
8
+ .ui-helper-hidden {
9
+ display: none;
10
+ }
11
+
12
+ .ui-helper-hidden-accessible {
13
+ position: absolute !important;
14
+ clip: rect(1px 1px 1px 1px);
15
+ clip: rect(1px, 1px, 1px, 1px);
16
+ }
17
+
18
+ .ui-helper-reset {
19
+ margin: 0;
20
+ padding: 0;
21
+ border: 0;
22
+ outline: 0;
23
+ line-height: 1.3;
24
+ text-decoration: none;
25
+ font-size: 100%;
26
+ list-style: none;
27
+ }
28
+
29
+ .ui-helper-clearfix:before,
30
+ .ui-helper-clearfix:after {
31
+ content: "";
32
+ display: table;
33
+ }
34
+
35
+ .ui-helper-clearfix:after {
36
+ clear: both;
37
+ }
38
+
39
+ .ui-helper-clearfix {
40
+ zoom: 1;
41
+ }
42
+
43
+ .ui-helper-zfix {
44
+ width: 100%;
45
+ height: 100%;
46
+ top: 0;
47
+ left: 0;
48
+ position: absolute;
49
+ opacity: 0;
50
+ filter: Alpha(Opacity=0);
51
+ }
52
+
53
+
54
+ /* Interaction Cues
55
+ ----------------------------------*/
56
+ .ui-state-disabled {
57
+ cursor: default !important;
58
+ }
59
+
60
+
61
+ /* Icons
62
+ ----------------------------------*/
63
+
64
+ /* states and image */
65
+ .ui-icon {
66
+ display: block;
67
+ text-indent: -99999px;
68
+ overflow: hidden;
69
+ background-repeat: no-repeat;
70
+ }
71
+
72
+
73
+ /* Misc visuals
74
+ ----------------------------------*/
75
+
76
+ /* Overlays */
77
+ .ui-widget-overlay {
78
+ position: absolute;
79
+ top: 0;
80
+ left: 0;
81
+ width: 100%;
82
+ height: 100%;
83
+ }
84
+
85
+ /* IE/Win - Fix animation bug - #4615 */
86
+ .ui-accordion {
87
+ width: 100%;
88
+ }
89
+
90
+ .ui-accordion .ui-accordion-header {
91
+ cursor: pointer;
92
+ position: relative;
93
+ margin-top: 1px;
94
+ zoom: 1;
95
+ }
96
+
97
+ .ui-accordion .ui-accordion-li-fix {
98
+ display: inline;
99
+ }
100
+
101
+ .ui-accordion .ui-accordion-header-active {
102
+ border-bottom: 0 !important;
103
+ }
104
+
105
+ .ui-accordion .ui-accordion-header a {
106
+ display: block;
107
+ font-size: 1em;
108
+ padding: .5em .5em .5em .7em;
109
+ }
110
+
111
+ .ui-accordion-icons .ui-accordion-header a {
112
+ padding-left: 2.2em;
113
+ }
114
+
115
+ .ui-accordion .ui-accordion-header .ui-icon {
116
+ position: absolute;
117
+ left: .5em;
118
+ top: 50%;
119
+ margin-top: -8px;
120
+ }
121
+
122
+ .ui-accordion .ui-accordion-content {
123
+ padding: 1em 2.2em;
124
+ border-top: 0;
125
+ margin-top: -2px;
126
+ position: relative;
127
+ top: 1px;
128
+ margin-bottom: 2px;
129
+ overflow: auto;
130
+ display: none;
131
+ zoom: 1;
132
+ }
133
+
134
+ .ui-accordion .ui-accordion-content-active {
135
+ display: block;
136
+ }
137
+
138
+ .ui-autocomplete {
139
+ position: absolute;
140
+ cursor: default;
141
+ }
142
+
143
+ /* workarounds */
144
+ * html .ui-autocomplete {
145
+ width: 1px;
146
+ }
147
+
148
+ /* without this, the menu expands to 100% in IE6 */
149
+
150
+ /*
151
+ * jQuery UI Menu 1.8.24
152
+ *
153
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
154
+ * Dual licensed under the MIT or GPL Version 2 licenses.
155
+ * http://jquery.org/license
156
+ *
157
+ * http://docs.jquery.com/UI/Menu#theming
158
+ */
159
+ .ui-menu {
160
+ list-style: none;
161
+ padding: 2px;
162
+ margin: 0;
163
+ display: block;
164
+ float: left;
165
+ }
166
+
167
+ .ui-menu .ui-menu {
168
+ margin-top: -3px;
169
+ }
170
+
171
+ .ui-menu .ui-menu-item {
172
+ margin: 0;
173
+ padding: 0;
174
+ zoom: 1;
175
+ float: left;
176
+ clear: left;
177
+ width: 100%;
178
+ }
179
+
180
+ .ui-menu .ui-menu-item a {
181
+ text-decoration: none;
182
+ display: block;
183
+ padding: .2em .4em;
184
+ line-height: 1.5;
185
+ zoom: 1;
186
+ }
187
+
188
+ .ui-menu .ui-menu-item a.ui-state-hover,
189
+ .ui-menu .ui-menu-item a.ui-state-active {
190
+ font-weight: normal;
191
+ margin: -1px;
192
+ }
193
+
194
+ .ui-button {
195
+ display: inline-block;
196
+ position: relative;
197
+ padding: 0;
198
+ margin-right: .1em;
199
+ text-decoration: none !important;
200
+ cursor: pointer;
201
+ text-align: center;
202
+ zoom: 1;
203
+ overflow: visible;
204
+ }
205
+
206
+ /* the overflow property removes extra width in IE */
207
+ .ui-button-icon-only {
208
+ width: 2.2em;
209
+ }
210
+
211
+ /* to make room for the icon, a width needs to be set here */
212
+ button.ui-button-icon-only {
213
+ width: 2.4em;
214
+ }
215
+
216
+ /* button elements seem to need a little more width */
217
+ .ui-button-icons-only {
218
+ width: 3.4em;
219
+ }
220
+
221
+ button.ui-button-icons-only {
222
+ width: 3.7em;
223
+ }
224
+
225
+ /*button text element */
226
+ .ui-button .ui-button-text {
227
+ display: block;
228
+ line-height: 1.4;
229
+ }
230
+
231
+ .ui-button-text-only .ui-button-text {
232
+ padding: .4em 1em;
233
+ }
234
+
235
+ .ui-button-icon-only .ui-button-text,
236
+ .ui-button-icons-only .ui-button-text {
237
+ padding: .4em;
238
+ text-indent: -9999999px;
239
+ }
240
+
241
+ .ui-button-text-icon-primary .ui-button-text,
242
+ .ui-button-text-icons .ui-button-text {
243
+ padding: .4em 1em .4em 2.1em;
244
+ }
245
+
246
+ .ui-button-text-icon-secondary .ui-button-text,
247
+ .ui-button-text-icons .ui-button-text {
248
+ padding: .4em 2.1em .4em 1em;
249
+ }
250
+
251
+ .ui-button-text-icons .ui-button-text {
252
+ padding-left: 2.1em;
253
+ padding-right: 2.1em;
254
+ }
255
+
256
+ /* no icon support for input elements, provide padding by default */
257
+ input.ui-button {
258
+ padding: .4em 1em;
259
+ }
260
+
261
+ /*button icon element(s) */
262
+ .ui-button-icon-only .ui-icon,
263
+ .ui-button-text-icon-primary .ui-icon,
264
+ .ui-button-text-icon-secondary .ui-icon,
265
+ .ui-button-text-icons .ui-icon,
266
+ .ui-button-icons-only .ui-icon {
267
+ position: absolute;
268
+ top: 50%;
269
+ margin-top: -8px;
270
+ }
271
+
272
+ .ui-button-icon-only .ui-icon {
273
+ left: 50%;
274
+ margin-left: -8px;
275
+ }
276
+
277
+ .ui-button-text-icon-primary .ui-button-icon-primary,
278
+ .ui-button-text-icons .ui-button-icon-primary,
279
+ .ui-button-icons-only .ui-button-icon-primary {
280
+ left: .5em;
281
+ }
282
+
283
+ .ui-button-text-icon-secondary .ui-button-icon-secondary,
284
+ .ui-button-text-icons .ui-button-icon-secondary,
285
+ .ui-button-icons-only .ui-button-icon-secondary {
286
+ right: .5em;
287
+ }
288
+
289
+ .ui-button-text-icons .ui-button-icon-secondary,
290
+ .ui-button-icons-only .ui-button-icon-secondary {
291
+ right: .5em;
292
+ }
293
+
294
+ /*button sets*/
295
+ .ui-buttonset {
296
+ margin-right: 7px;
297
+ }
298
+
299
+ .ui-buttonset .ui-button {
300
+ margin-left: 0;
301
+ margin-right: -.3em;
302
+ }
303
+
304
+ /* workarounds */
305
+ button.ui-button::-moz-focus-inner {
306
+ border: 0;
307
+ padding: 0;
308
+ }
309
+
310
+ /* reset extra padding in Firefox */
311
+
312
+ .ui-datepicker {
313
+ width: 17em;
314
+ padding: .2em .2em 0;
315
+ display: none;
316
+ }
317
+
318
+ .ui-datepicker .ui-datepicker-header {
319
+ position: relative;
320
+ padding: .2em 0;
321
+ }
322
+
323
+ .ui-datepicker .ui-datepicker-prev,
324
+ .ui-datepicker .ui-datepicker-next {
325
+ position: absolute;
326
+ top: 2px;
327
+ width: 1.8em;
328
+ height: 1.8em;
329
+ }
330
+
331
+ .ui-datepicker .ui-datepicker-prev-hover,
332
+ .ui-datepicker .ui-datepicker-next-hover {
333
+ top: 1px;
334
+ }
335
+
336
+ .ui-datepicker .ui-datepicker-prev {
337
+ left: 2px;
338
+ }
339
+
340
+ .ui-datepicker .ui-datepicker-next {
341
+ right: 2px;
342
+ }
343
+
344
+ .ui-datepicker .ui-datepicker-prev-hover {
345
+ left: 1px;
346
+ }
347
+
348
+ .ui-datepicker .ui-datepicker-next-hover {
349
+ right: 1px;
350
+ }
351
+
352
+ .ui-datepicker .ui-datepicker-prev span,
353
+ .ui-datepicker .ui-datepicker-next span {
354
+ display: block;
355
+ position: absolute;
356
+ left: 50%;
357
+ margin-left: -8px;
358
+ top: 50%;
359
+ margin-top: -8px;
360
+ }
361
+
362
+ .ui-datepicker .ui-datepicker-title {
363
+ margin: 0 2.3em;
364
+ line-height: 1.8em;
365
+ text-align: center;
366
+ }
367
+
368
+ .ui-datepicker .ui-datepicker-title select {
369
+ font-size: 1em;
370
+ margin: 1px 0;
371
+ }
372
+
373
+ .ui-datepicker select.ui-datepicker-month-year {
374
+ width: 100%;
375
+ }
376
+
377
+ .ui-datepicker select.ui-datepicker-month,
378
+ .ui-datepicker select.ui-datepicker-year {
379
+ width: 49%;
380
+ }
381
+
382
+ .ui-datepicker table {
383
+ width: 100%;
384
+ font-size: .9em;
385
+ border-collapse: collapse;
386
+ margin: 0 0 .4em;
387
+ }
388
+
389
+ .ui-datepicker th {
390
+ padding: .7em .3em;
391
+ text-align: center;
392
+ font-weight: bold;
393
+ border: 0;
394
+ }
395
+
396
+ .ui-datepicker td {
397
+ border: 0;
398
+ padding: 1px;
399
+ }
400
+
401
+ .ui-datepicker td span,
402
+ .ui-datepicker td a {
403
+ display: block;
404
+ padding: .2em;
405
+ text-align: right;
406
+ text-decoration: none;
407
+ }
408
+
409
+ .ui-datepicker .ui-datepicker-buttonpane {
410
+ background-image: none;
411
+ margin: .7em 0 0 0;
412
+ padding: 0 .2em;
413
+ border-left: 0;
414
+ border-right: 0;
415
+ border-bottom: 0;
416
+ }
417
+
418
+ .ui-datepicker .ui-datepicker-buttonpane button {
419
+ float: right;
420
+ margin: .5em .2em .4em;
421
+ cursor: pointer;
422
+ padding: .2em .6em .3em .6em;
423
+ width: auto;
424
+ overflow: visible;
425
+ }
426
+
427
+ .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
428
+ float: left;
429
+ }
430
+
431
+ /* with multiple calendars */
432
+ .ui-datepicker.ui-datepicker-multi {
433
+ width: auto;
434
+ }
435
+
436
+ .ui-datepicker-multi .ui-datepicker-group {
437
+ float: left;
438
+ }
439
+
440
+ .ui-datepicker-multi .ui-datepicker-group table {
441
+ width: 95%;
442
+ margin: 0 auto .4em;
443
+ }
444
+
445
+ .ui-datepicker-multi-2 .ui-datepicker-group {
446
+ width: 50%;
447
+ }
448
+
449
+ .ui-datepicker-multi-3 .ui-datepicker-group {
450
+ width: 33.3%;
451
+ }
452
+
453
+ .ui-datepicker-multi-4 .ui-datepicker-group {
454
+ width: 25%;
455
+ }
456
+
457
+ .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header {
458
+ border-left-width: 0;
459
+ }
460
+
461
+ .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
462
+ border-left-width: 0;
463
+ }
464
+
465
+ .ui-datepicker-multi .ui-datepicker-buttonpane {
466
+ clear: left;
467
+ }
468
+
469
+ .ui-datepicker-row-break {
470
+ clear: both;
471
+ width: 100%;
472
+ font-size: 0em;
473
+ }
474
+
475
+ /* RTL support */
476
+ .ui-datepicker-rtl {
477
+ direction: rtl;
478
+ }
479
+
480
+ .ui-datepicker-rtl .ui-datepicker-prev {
481
+ right: 2px;
482
+ left: auto;
483
+ }
484
+
485
+ .ui-datepicker-rtl .ui-datepicker-next {
486
+ left: 2px;
487
+ right: auto;
488
+ }
489
+
490
+ .ui-datepicker-rtl .ui-datepicker-prev:hover {
491
+ right: 1px;
492
+ left: auto;
493
+ }
494
+
495
+ .ui-datepicker-rtl .ui-datepicker-next:hover {
496
+ left: 1px;
497
+ right: auto;
498
+ }
499
+
500
+ .ui-datepicker-rtl .ui-datepicker-buttonpane {
501
+ clear: right;
502
+ }
503
+
504
+ .ui-datepicker-rtl .ui-datepicker-buttonpane button {
505
+ float: left;
506
+ }
507
+
508
+ .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current {
509
+ float: right;
510
+ }
511
+
512
+ .ui-datepicker-rtl .ui-datepicker-group {
513
+ float: right;
514
+ }
515
+
516
+ .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header {
517
+ border-right-width: 0;
518
+ border-left-width: 1px;
519
+ }
520
+
521
+ .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
522
+ border-right-width: 0;
523
+ border-left-width: 1px;
524
+ }
525
+
526
+ /* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
527
+ .ui-datepicker-cover {
528
+ position: absolute;
529
+ /*must have*/
530
+ z-index: -1;
531
+ /*must have*/
532
+ filter: mask();
533
+ /*must have*/
534
+ top: -4px;
535
+ /*must have*/
536
+ left: -4px;
537
+ /*must have*/
538
+ width: 200px;
539
+ /*must have*/
540
+ height: 200px;
541
+ /*must have*/
542
+ }
543
+
544
+ .ui-dialog {
545
+ position: absolute;
546
+ padding: .2em;
547
+ width: 300px;
548
+ overflow: hidden;
549
+ }
550
+
551
+ .ui-dialog .ui-dialog-titlebar {
552
+ padding: .4em 1em;
553
+ position: relative;
554
+ }
555
+
556
+ .ui-dialog .ui-dialog-title {
557
+ float: left;
558
+ margin: .1em 16px .1em 0;
559
+ }
560
+
561
+ .ui-dialog .ui-dialog-titlebar-close {
562
+ position: absolute;
563
+ right: .3em;
564
+ top: 50%;
565
+ width: 19px;
566
+ margin: -10px 0 0 0;
567
+ padding: 1px;
568
+ height: 18px;
569
+ }
570
+
571
+ .ui-dialog .ui-dialog-titlebar-close span {
572
+ display: block;
573
+ margin: 1px;
574
+ }
575
+
576
+ .ui-dialog .ui-dialog-titlebar-close:hover,
577
+ .ui-dialog .ui-dialog-titlebar-close:focus {
578
+ padding: 0;
579
+ }
580
+
581
+ .ui-dialog .ui-dialog-content {
582
+ position: relative;
583
+ border: 0;
584
+ padding: .5em 1em;
585
+ background: none;
586
+ overflow: auto;
587
+ zoom: 1;
588
+ }
589
+
590
+ .ui-dialog .ui-dialog-buttonpane {
591
+ text-align: left;
592
+ border-width: 1px 0 0 0;
593
+ background-image: none;
594
+ margin: .5em 0 0 0;
595
+ padding: .3em 1em .5em .4em;
596
+ }
597
+
598
+ .ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
599
+ float: right;
600
+ }
601
+
602
+ .ui-dialog .ui-dialog-buttonpane button {
603
+ margin: .5em .4em .5em 0;
604
+ cursor: pointer;
605
+ }
606
+
607
+ .ui-dialog .ui-resizable-se {
608
+ width: 14px;
609
+ height: 14px;
610
+ right: 3px;
611
+ bottom: 3px;
612
+ }
613
+
614
+ .ui-draggable .ui-dialog-titlebar {
615
+ cursor: move;
616
+ }
617
+
618
+ .ui-progressbar {
619
+ height: 2em;
620
+ text-align: left;
621
+ overflow: hidden;
622
+ }
623
+
624
+ .ui-progressbar .ui-progressbar-value {
625
+ margin: -1px;
626
+ height: 100%;
627
+ }
628
+
629
+ .ui-resizable {
630
+ position: relative;
631
+ }
632
+
633
+ .ui-resizable-handle {
634
+ position: absolute;
635
+ font-size: 0.1px;
636
+ display: block;
637
+ }
638
+
639
+ .ui-resizable-disabled .ui-resizable-handle,
640
+ .ui-resizable-autohide .ui-resizable-handle {
641
+ display: none;
642
+ }
643
+
644
+ .ui-resizable-n {
645
+ cursor: n-resize;
646
+ height: 7px;
647
+ width: 100%;
648
+ top: -5px;
649
+ left: 0;
650
+ }
651
+
652
+ .ui-resizable-s {
653
+ cursor: s-resize;
654
+ height: 7px;
655
+ width: 100%;
656
+ bottom: -5px;
657
+ left: 0;
658
+ }
659
+
660
+ .ui-resizable-e {
661
+ cursor: e-resize;
662
+ width: 7px;
663
+ right: -5px;
664
+ top: 0;
665
+ height: 100%;
666
+ }
667
+
668
+ .ui-resizable-w {
669
+ cursor: w-resize;
670
+ width: 7px;
671
+ left: -5px;
672
+ top: 0;
673
+ height: 100%;
674
+ }
675
+
676
+ .ui-resizable-se {
677
+ cursor: se-resize;
678
+ width: 12px;
679
+ height: 12px;
680
+ right: 1px;
681
+ bottom: 1px;
682
+ }
683
+
684
+ .ui-resizable-sw {
685
+ cursor: sw-resize;
686
+ width: 9px;
687
+ height: 9px;
688
+ left: -5px;
689
+ bottom: -5px;
690
+ }
691
+
692
+ .ui-resizable-nw {
693
+ cursor: nw-resize;
694
+ width: 9px;
695
+ height: 9px;
696
+ left: -5px;
697
+ top: -5px;
698
+ }
699
+
700
+ .ui-resizable-ne {
701
+ cursor: ne-resize;
702
+ width: 9px;
703
+ height: 9px;
704
+ right: -5px;
705
+ top: -5px;
706
+ }
707
+
708
+ .ui-selectable-helper {
709
+ position: absolute;
710
+ z-index: 100;
711
+ border: 1px dotted black;
712
+ }
713
+
714
+ .ui-slider {
715
+ position: relative;
716
+ text-align: left;
717
+ }
718
+
719
+ .ui-slider .ui-slider-handle {
720
+ position: absolute;
721
+ z-index: 2;
722
+ width: 1.2em;
723
+ height: 1.2em;
724
+ cursor: default;
725
+ }
726
+
727
+ .ui-slider .ui-slider-range {
728
+ position: absolute;
729
+ z-index: 1;
730
+ font-size: .7em;
731
+ display: block;
732
+ border: 0;
733
+ background-position: 0 0;
734
+ }
735
+
736
+ .ui-slider-horizontal {
737
+ height: .8em;
738
+ }
739
+
740
+ .ui-slider-horizontal .ui-slider-handle {
741
+ top: -.3em;
742
+ margin-left: -.6em;
743
+ }
744
+
745
+ .ui-slider-horizontal .ui-slider-range {
746
+ top: 0;
747
+ height: 100%;
748
+ }
749
+
750
+ .ui-slider-horizontal .ui-slider-range-min {
751
+ left: 0;
752
+ }
753
+
754
+ .ui-slider-horizontal .ui-slider-range-max {
755
+ right: 0;
756
+ }
757
+
758
+ .ui-slider-vertical {
759
+ width: .8em;
760
+ height: 100px;
761
+ }
762
+
763
+ .ui-slider-vertical .ui-slider-handle {
764
+ left: -.3em;
765
+ margin-left: 0;
766
+ margin-bottom: -.6em;
767
+ }
768
+
769
+ .ui-slider-vertical .ui-slider-range {
770
+ left: 0;
771
+ width: 100%;
772
+ }
773
+
774
+ .ui-slider-vertical .ui-slider-range-min {
775
+ bottom: 0;
776
+ }
777
+
778
+ .ui-slider-vertical .ui-slider-range-max {
779
+ top: 0;
780
+ }
781
+
782
+ .ui-tabs {
783
+ position: relative;
784
+ padding: .2em;
785
+ zoom: 1;
786
+ }
787
+
788
+ /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
789
+ .ui-tabs .ui-tabs-nav {
790
+ margin: 0;
791
+ padding: .2em .2em 0;
792
+ }
793
+
794
+ .ui-tabs .ui-tabs-nav li {
795
+ list-style: none;
796
+ float: left;
797
+ position: relative;
798
+ top: 1px;
799
+ margin: 0 .2em 1px 0;
800
+ border-bottom: 0 !important;
801
+ padding: 0;
802
+ white-space: nowrap;
803
+ }
804
+
805
+ .ui-tabs .ui-tabs-nav li a {
806
+ float: left;
807
+ padding: .5em 1em;
808
+ text-decoration: none;
809
+ }
810
+
811
+ .ui-tabs .ui-tabs-nav li.ui-tabs-selected {
812
+ margin-bottom: 0;
813
+ padding-bottom: 1px;
814
+ }
815
+
816
+ .ui-tabs .ui-tabs-nav li.ui-tabs-selected a,
817
+ .ui-tabs .ui-tabs-nav li.ui-state-disabled a,
818
+ .ui-tabs .ui-tabs-nav li.ui-state-processing a {
819
+ cursor: text;
820
+ }
821
+
822
+ .ui-tabs .ui-tabs-nav li a,
823
+ .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a {
824
+ cursor: pointer;
825
+ }
826
+
827
+ /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
828
+ .ui-tabs .ui-tabs-panel {
829
+ display: block;
830
+ border-width: 0;
831
+ padding: 1em 1.4em;
832
+ background: none;
833
+ }
834
+
835
+ .ui-tabs .ui-tabs-hide {
836
+ display: none !important;
837
+ }
838
+
839
+ /* Component containers
840
+ ----------------------------------*/
841
+ .ui-widget {
842
+ font-family: Verdana,
843
+ Arial,
844
+ sans-serif
845
+ /*{ffDefault}*/
846
+ ;
847
+ font-size: 1.1em
848
+ /*{fsDefault}*/
849
+ ;
850
+ }
851
+
852
+ .ui-widget .ui-widget {
853
+ font-size: 1em;
854
+ }
855
+
856
+ .ui-widget input,
857
+ .ui-widget select,
858
+ .ui-widget textarea,
859
+ .ui-widget button {
860
+ font-family: Verdana,
861
+ Arial,
862
+ sans-serif
863
+ /*{ffDefault}*/
864
+ ;
865
+ font-size: 1em;
866
+ }
867
+
868
+ .ui-widget-content {
869
+ border: 1px solid #aaaaaa
870
+ /*{borderColorContent}*/
871
+ ;
872
+ background: #ffffff
873
+ /*{bgColorContent}*/
874
+ url(image/ui-bg_flat_75_ffffff_40x100.png)
875
+ /*{bgImgUrlContent}*/
876
+ 50%
877
+ /*{bgContentXPos}*/
878
+ 50%
879
+ /*{bgContentYPos}*/
880
+ repeat-x
881
+ /*{bgContentRepeat}*/
882
+ ;
883
+ color: #222222
884
+ /*{fcContent}*/
885
+ ;
886
+ }
887
+
888
+ .ui-widget-content a {
889
+ color: #222222
890
+ /*{fcContent}*/
891
+ ;
892
+ }
893
+
894
+ .ui-widget-header {
895
+ border: 1px solid #aaaaaa
896
+ /*{borderColorHeader}*/
897
+ ;
898
+ background: #cccccc
899
+ /*{bgColorHeader}*/
900
+ url(image/ui-bg_highlight-soft_75_cccccc_1x100.png)
901
+ /*{bgImgUrlHeader}*/
902
+ 50%
903
+ /*{bgHeaderXPos}*/
904
+ 50%
905
+ /*{bgHeaderYPos}*/
906
+ repeat-x
907
+ /*{bgHeaderRepeat}*/
908
+ ;
909
+ color: #222222
910
+ /*{fcHeader}*/
911
+ ;
912
+ font-weight: bold;
913
+ }
914
+
915
+ .ui-widget-header a {
916
+ color: #222222
917
+ /*{fcHeader}*/
918
+ ;
919
+ }
920
+
921
+ /* Interaction states
922
+ ----------------------------------*/
923
+ .ui-state-default,
924
+ .ui-widget-content .ui-state-default,
925
+ .ui-widget-header .ui-state-default {
926
+ border: 1px solid #d3d3d3
927
+ /*{borderColorDefault}*/
928
+ ;
929
+ background: #e6e6e6
930
+ /*{bgColorDefault}*/
931
+ url(image/ui-bg_glass_75_e6e6e6_1x400.png)
932
+ /*{bgImgUrlDefault}*/
933
+ 50%
934
+ /*{bgDefaultXPos}*/
935
+ 50%
936
+ /*{bgDefaultYPos}*/
937
+ repeat-x
938
+ /*{bgDefaultRepeat}*/
939
+ ;
940
+ font-weight: normal
941
+ /*{fwDefault}*/
942
+ ;
943
+ color: #555555
944
+ /*{fcDefault}*/
945
+ ;
946
+ }
947
+
948
+ .ui-state-default a,
949
+ .ui-state-default a:link,
950
+ .ui-state-default a:visited {
951
+ color: #555555
952
+ /*{fcDefault}*/
953
+ ;
954
+ text-decoration: none;
955
+ }
956
+
957
+ .ui-state-hover,
958
+ .ui-widget-content .ui-state-hover,
959
+ .ui-widget-header .ui-state-hover,
960
+ .ui-state-focus,
961
+ .ui-widget-content .ui-state-focus,
962
+ .ui-widget-header .ui-state-focus {
963
+ border: 1px solid #999999
964
+ /*{borderColorHover}*/
965
+ ;
966
+ background: #dadada
967
+ /*{bgColorHover}*/
968
+ url(image/ui-bg_glass_75_dadada_1x400.png)
969
+ /*{bgImgUrlHover}*/
970
+ 50%
971
+ /*{bgHoverXPos}*/
972
+ 50%
973
+ /*{bgHoverYPos}*/
974
+ repeat-x
975
+ /*{bgHoverRepeat}*/
976
+ ;
977
+ font-weight: normal
978
+ /*{fwDefault}*/
979
+ ;
980
+ color: #212121
981
+ /*{fcHover}*/
982
+ ;
983
+ }
984
+
985
+ .ui-state-hover a,
986
+ .ui-state-hover a:hover {
987
+ color: #212121
988
+ /*{fcHover}*/
989
+ ;
990
+ text-decoration: none;
991
+ }
992
+
993
+ .ui-state-active,
994
+ .ui-widget-content .ui-state-active,
995
+ .ui-widget-header .ui-state-active {
996
+ border: 1px solid #aaaaaa
997
+ /*{borderColorActive}*/
998
+ ;
999
+ background: #ffffff
1000
+ /*{bgColorActive}*/
1001
+ url(image/ui-bg_glass_65_ffffff_1x400.png)
1002
+ /*{bgImgUrlActive}*/
1003
+ 50%
1004
+ /*{bgActiveXPos}*/
1005
+ 50%
1006
+ /*{bgActiveYPos}*/
1007
+ repeat-x
1008
+ /*{bgActiveRepeat}*/
1009
+ ;
1010
+ font-weight: normal
1011
+ /*{fwDefault}*/
1012
+ ;
1013
+ color: #212121
1014
+ /*{fcActive}*/
1015
+ ;
1016
+ }
1017
+
1018
+ .ui-state-active a,
1019
+ .ui-state-active a:link,
1020
+ .ui-state-active a:visited {
1021
+ color: #212121
1022
+ /*{fcActive}*/
1023
+ ;
1024
+ text-decoration: none;
1025
+ }
1026
+
1027
+ .ui-widget :active {
1028
+ outline: none;
1029
+ }
1030
+
1031
+ /* Interaction Cues
1032
+ ----------------------------------*/
1033
+ .ui-state-highlight,
1034
+ .ui-widget-content .ui-state-highlight,
1035
+ .ui-widget-header .ui-state-highlight {
1036
+ border: 1px solid #fcefa1
1037
+ /*{borderColorHighlight}*/
1038
+ ;
1039
+ background: #fbf9ee
1040
+ /*{bgColorHighlight}*/
1041
+ url(image/ui-bg_glass_55_fbf9ee_1x400.png)
1042
+ /*{bgImgUrlHighlight}*/
1043
+ 50%
1044
+ /*{bgHighlightXPos}*/
1045
+ 50%
1046
+ /*{bgHighlightYPos}*/
1047
+ repeat-x
1048
+ /*{bgHighlightRepeat}*/
1049
+ ;
1050
+ color: #363636
1051
+ /*{fcHighlight}*/
1052
+ ;
1053
+ }
1054
+
1055
+ .ui-state-highlight a,
1056
+ .ui-widget-content .ui-state-highlight a,
1057
+ .ui-widget-header .ui-state-highlight a {
1058
+ color: #363636
1059
+ /*{fcHighlight}*/
1060
+ ;
1061
+ }
1062
+
1063
+ .ui-state-error,
1064
+ .ui-widget-content .ui-state-error,
1065
+ .ui-widget-header .ui-state-error {
1066
+ border: 1px solid #cd0a0a
1067
+ /*{borderColorError}*/
1068
+ ;
1069
+ background: #fef1ec
1070
+ /*{bgColorError}*/
1071
+ url(image/ui-bg_glass_95_fef1ec_1x400.png)
1072
+ /*{bgImgUrlError}*/
1073
+ 50%
1074
+ /*{bgErrorXPos}*/
1075
+ 50%
1076
+ /*{bgErrorYPos}*/
1077
+ repeat-x
1078
+ /*{bgErrorRepeat}*/
1079
+ ;
1080
+ color: #cd0a0a
1081
+ /*{fcError}*/
1082
+ ;
1083
+ }
1084
+
1085
+ .ui-state-error a,
1086
+ .ui-widget-content .ui-state-error a,
1087
+ .ui-widget-header .ui-state-error a {
1088
+ color: #cd0a0a
1089
+ /*{fcError}*/
1090
+ ;
1091
+ }
1092
+
1093
+ .ui-state-error-text,
1094
+ .ui-widget-content .ui-state-error-text,
1095
+ .ui-widget-header .ui-state-error-text {
1096
+ color: #cd0a0a
1097
+ /*{fcError}*/
1098
+ ;
1099
+ }
1100
+
1101
+ .ui-priority-primary,
1102
+ .ui-widget-content .ui-priority-primary,
1103
+ .ui-widget-header .ui-priority-primary {
1104
+ font-weight: bold;
1105
+ }
1106
+
1107
+ .ui-priority-secondary,
1108
+ .ui-widget-content .ui-priority-secondary,
1109
+ .ui-widget-header .ui-priority-secondary {
1110
+ opacity: .7;
1111
+ filter: Alpha(Opacity=70);
1112
+ font-weight: normal;
1113
+ }
1114
+
1115
+ .ui-state-disabled,
1116
+ .ui-widget-content .ui-state-disabled,
1117
+ .ui-widget-header .ui-state-disabled {
1118
+ opacity: .35;
1119
+ filter: Alpha(Opacity=35);
1120
+ background-image: none;
1121
+ }
1122
+
1123
+ /* Icons
1124
+ ----------------------------------*/
1125
+
1126
+ /* states and image */
1127
+ .ui-icon {
1128
+ width: 16px;
1129
+ height: 16px;
1130
+ background-image: url(image/ui-icons_222222_256x240.png)
1131
+ /*{iconsContent}*/
1132
+ ;
1133
+ }
1134
+
1135
+ .ui-widget-content .ui-icon {
1136
+ background-image: url(image/ui-icons_222222_256x240.png)
1137
+ /*{iconsContent}*/
1138
+ ;
1139
+ }
1140
+
1141
+ .ui-widget-header .ui-icon {
1142
+ background-image: url(image/ui-icons_222222_256x240.png)
1143
+ /*{iconsHeader}*/
1144
+ ;
1145
+ }
1146
+
1147
+ .ui-state-default .ui-icon {
1148
+ background-image: url(image/ui-icons_888888_256x240.png)
1149
+ /*{iconsDefault}*/
1150
+ ;
1151
+ }
1152
+
1153
+ .ui-state-hover .ui-icon,
1154
+ .ui-state-focus .ui-icon {
1155
+ background-image: url(image/ui-icons_454545_256x240.png)
1156
+ /*{iconsHover}*/
1157
+ ;
1158
+ }
1159
+
1160
+ .ui-state-active .ui-icon {
1161
+ background-image: url(image/ui-icons_454545_256x240.png)
1162
+ /*{iconsActive}*/
1163
+ ;
1164
+ }
1165
+
1166
+ .ui-state-highlight .ui-icon {
1167
+ background-image: url(image/ui-icons_2e83ff_256x240.png)
1168
+ /*{iconsHighlight}*/
1169
+ ;
1170
+ }
1171
+
1172
+ .ui-state-error .ui-icon,
1173
+ .ui-state-error-text .ui-icon {
1174
+ background-image: url(image/ui-icons_cd0a0a_256x240.png)
1175
+ /*{iconsError}*/
1176
+ ;
1177
+ }
1178
+
1179
+ /* positioning */
1180
+ .ui-icon-carat-1-n {
1181
+ background-position: 0 0;
1182
+ }
1183
+
1184
+ .ui-icon-carat-1-ne {
1185
+ background-position: -16px 0;
1186
+ }
1187
+
1188
+ .ui-icon-carat-1-e {
1189
+ background-position: -32px 0;
1190
+ }
1191
+
1192
+ .ui-icon-carat-1-se {
1193
+ background-position: -48px 0;
1194
+ }
1195
+
1196
+ .ui-icon-carat-1-s {
1197
+ background-position: -64px 0;
1198
+ }
1199
+
1200
+ .ui-icon-carat-1-sw {
1201
+ background-position: -80px 0;
1202
+ }
1203
+
1204
+ .ui-icon-carat-1-w {
1205
+ background-position: -96px 0;
1206
+ }
1207
+
1208
+ .ui-icon-carat-1-nw {
1209
+ background-position: -112px 0;
1210
+ }
1211
+
1212
+ .ui-icon-carat-2-n-s {
1213
+ background-position: -128px 0;
1214
+ }
1215
+
1216
+ .ui-icon-carat-2-e-w {
1217
+ background-position: -144px 0;
1218
+ }
1219
+
1220
+ .ui-icon-triangle-1-n {
1221
+ background-position: 0 -16px;
1222
+ }
1223
+
1224
+ .ui-icon-triangle-1-ne {
1225
+ background-position: -16px -16px;
1226
+ }
1227
+
1228
+ .ui-icon-triangle-1-e {
1229
+ background-position: -32px -16px;
1230
+ }
1231
+
1232
+ .ui-icon-triangle-1-se {
1233
+ background-position: -48px -16px;
1234
+ }
1235
+
1236
+ .ui-icon-triangle-1-s {
1237
+ background-position: -64px -16px;
1238
+ }
1239
+
1240
+ .ui-icon-triangle-1-sw {
1241
+ background-position: -80px -16px;
1242
+ }
1243
+
1244
+ .ui-icon-triangle-1-w {
1245
+ background-position: -96px -16px;
1246
+ }
1247
+
1248
+ .ui-icon-triangle-1-nw {
1249
+ background-position: -112px -16px;
1250
+ }
1251
+
1252
+ .ui-icon-triangle-2-n-s {
1253
+ background-position: -128px -16px;
1254
+ }
1255
+
1256
+ .ui-icon-triangle-2-e-w {
1257
+ background-position: -144px -16px;
1258
+ }
1259
+
1260
+ .ui-icon-arrow-1-n {
1261
+ background-position: 0 -32px;
1262
+ }
1263
+
1264
+ .ui-icon-arrow-1-ne {
1265
+ background-position: -16px -32px;
1266
+ }
1267
+
1268
+ .ui-icon-arrow-1-e {
1269
+ background-position: -32px -32px;
1270
+ }
1271
+
1272
+ .ui-icon-arrow-1-se {
1273
+ background-position: -48px -32px;
1274
+ }
1275
+
1276
+ .ui-icon-arrow-1-s {
1277
+ background-position: -64px -32px;
1278
+ }
1279
+
1280
+ .ui-icon-arrow-1-sw {
1281
+ background-position: -80px -32px;
1282
+ }
1283
+
1284
+ .ui-icon-arrow-1-w {
1285
+ background-position: -96px -32px;
1286
+ }
1287
+
1288
+ .ui-icon-arrow-1-nw {
1289
+ background-position: -112px -32px;
1290
+ }
1291
+
1292
+ .ui-icon-arrow-2-n-s {
1293
+ background-position: -128px -32px;
1294
+ }
1295
+
1296
+ .ui-icon-arrow-2-ne-sw {
1297
+ background-position: -144px -32px;
1298
+ }
1299
+
1300
+ .ui-icon-arrow-2-e-w {
1301
+ background-position: -160px -32px;
1302
+ }
1303
+
1304
+ .ui-icon-arrow-2-se-nw {
1305
+ background-position: -176px -32px;
1306
+ }
1307
+
1308
+ .ui-icon-arrowstop-1-n {
1309
+ background-position: -192px -32px;
1310
+ }
1311
+
1312
+ .ui-icon-arrowstop-1-e {
1313
+ background-position: -208px -32px;
1314
+ }
1315
+
1316
+ .ui-icon-arrowstop-1-s {
1317
+ background-position: -224px -32px;
1318
+ }
1319
+
1320
+ .ui-icon-arrowstop-1-w {
1321
+ background-position: -240px -32px;
1322
+ }
1323
+
1324
+ .ui-icon-arrowthick-1-n {
1325
+ background-position: 0 -48px;
1326
+ }
1327
+
1328
+ .ui-icon-arrowthick-1-ne {
1329
+ background-position: -16px -48px;
1330
+ }
1331
+
1332
+ .ui-icon-arrowthick-1-e {
1333
+ background-position: -32px -48px;
1334
+ }
1335
+
1336
+ .ui-icon-arrowthick-1-se {
1337
+ background-position: -48px -48px;
1338
+ }
1339
+
1340
+ .ui-icon-arrowthick-1-s {
1341
+ background-position: -64px -48px;
1342
+ }
1343
+
1344
+ .ui-icon-arrowthick-1-sw {
1345
+ background-position: -80px -48px;
1346
+ }
1347
+
1348
+ .ui-icon-arrowthick-1-w {
1349
+ background-position: -96px -48px;
1350
+ }
1351
+
1352
+ .ui-icon-arrowthick-1-nw {
1353
+ background-position: -112px -48px;
1354
+ }
1355
+
1356
+ .ui-icon-arrowthick-2-n-s {
1357
+ background-position: -128px -48px;
1358
+ }
1359
+
1360
+ .ui-icon-arrowthick-2-ne-sw {
1361
+ background-position: -144px -48px;
1362
+ }
1363
+
1364
+ .ui-icon-arrowthick-2-e-w {
1365
+ background-position: -160px -48px;
1366
+ }
1367
+
1368
+ .ui-icon-arrowthick-2-se-nw {
1369
+ background-position: -176px -48px;
1370
+ }
1371
+
1372
+ .ui-icon-arrowthickstop-1-n {
1373
+ background-position: -192px -48px;
1374
+ }
1375
+
1376
+ .ui-icon-arrowthickstop-1-e {
1377
+ background-position: -208px -48px;
1378
+ }
1379
+
1380
+ .ui-icon-arrowthickstop-1-s {
1381
+ background-position: -224px -48px;
1382
+ }
1383
+
1384
+ .ui-icon-arrowthickstop-1-w {
1385
+ background-position: -240px -48px;
1386
+ }
1387
+
1388
+ .ui-icon-arrowreturnthick-1-w {
1389
+ background-position: 0 -64px;
1390
+ }
1391
+
1392
+ .ui-icon-arrowreturnthick-1-n {
1393
+ background-position: -16px -64px;
1394
+ }
1395
+
1396
+ .ui-icon-arrowreturnthick-1-e {
1397
+ background-position: -32px -64px;
1398
+ }
1399
+
1400
+ .ui-icon-arrowreturnthick-1-s {
1401
+ background-position: -48px -64px;
1402
+ }
1403
+
1404
+ .ui-icon-arrowreturn-1-w {
1405
+ background-position: -64px -64px;
1406
+ }
1407
+
1408
+ .ui-icon-arrowreturn-1-n {
1409
+ background-position: -80px -64px;
1410
+ }
1411
+
1412
+ .ui-icon-arrowreturn-1-e {
1413
+ background-position: -96px -64px;
1414
+ }
1415
+
1416
+ .ui-icon-arrowreturn-1-s {
1417
+ background-position: -112px -64px;
1418
+ }
1419
+
1420
+ .ui-icon-arrowrefresh-1-w {
1421
+ background-position: -128px -64px;
1422
+ }
1423
+
1424
+ .ui-icon-arrowrefresh-1-n {
1425
+ background-position: -144px -64px;
1426
+ }
1427
+
1428
+ .ui-icon-arrowrefresh-1-e {
1429
+ background-position: -160px -64px;
1430
+ }
1431
+
1432
+ .ui-icon-arrowrefresh-1-s {
1433
+ background-position: -176px -64px;
1434
+ }
1435
+
1436
+ .ui-icon-arrow-4 {
1437
+ background-position: 0 -80px;
1438
+ }
1439
+
1440
+ .ui-icon-arrow-4-diag {
1441
+ background-position: -16px -80px;
1442
+ }
1443
+
1444
+ .ui-icon-extlink {
1445
+ background-position: -32px -80px;
1446
+ }
1447
+
1448
+ .ui-icon-newwin {
1449
+ background-position: -48px -80px;
1450
+ }
1451
+
1452
+ .ui-icon-refresh {
1453
+ background-position: -64px -80px;
1454
+ }
1455
+
1456
+ .ui-icon-shuffle {
1457
+ background-position: -80px -80px;
1458
+ }
1459
+
1460
+ .ui-icon-transfer-e-w {
1461
+ background-position: -96px -80px;
1462
+ }
1463
+
1464
+ .ui-icon-transferthick-e-w {
1465
+ background-position: -112px -80px;
1466
+ }
1467
+
1468
+ .ui-icon-folder-collapsed {
1469
+ background-position: 0 -96px;
1470
+ }
1471
+
1472
+ .ui-icon-folder-open {
1473
+ background-position: -16px -96px;
1474
+ }
1475
+
1476
+ .ui-icon-document {
1477
+ background-position: -32px -96px;
1478
+ }
1479
+
1480
+ .ui-icon-document-b {
1481
+ background-position: -48px -96px;
1482
+ }
1483
+
1484
+ .ui-icon-note {
1485
+ background-position: -64px -96px;
1486
+ }
1487
+
1488
+ .ui-icon-mail-closed {
1489
+ background-position: -80px -96px;
1490
+ }
1491
+
1492
+ .ui-icon-mail-open {
1493
+ background-position: -96px -96px;
1494
+ }
1495
+
1496
+ .ui-icon-suitcase {
1497
+ background-position: -112px -96px;
1498
+ }
1499
+
1500
+ .ui-icon-comment {
1501
+ background-position: -128px -96px;
1502
+ }
1503
+
1504
+ .ui-icon-person {
1505
+ background-position: -144px -96px;
1506
+ }
1507
+
1508
+ .ui-icon-print {
1509
+ background-position: -160px -96px;
1510
+ }
1511
+
1512
+ .ui-icon-trash {
1513
+ background-position: -176px -96px;
1514
+ }
1515
+
1516
+ .ui-icon-locked {
1517
+ background-position: -192px -96px;
1518
+ }
1519
+
1520
+ .ui-icon-unlocked {
1521
+ background-position: -208px -96px;
1522
+ }
1523
+
1524
+ .ui-icon-bookmark {
1525
+ background-position: -224px -96px;
1526
+ }
1527
+
1528
+ .ui-icon-tag {
1529
+ background-position: -240px -96px;
1530
+ }
1531
+
1532
+ .ui-icon-home {
1533
+ background-position: 0 -112px;
1534
+ }
1535
+
1536
+ .ui-icon-flag {
1537
+ background-position: -16px -112px;
1538
+ }
1539
+
1540
+ .ui-icon-calendar {
1541
+ background-position: -32px -112px;
1542
+ }
1543
+
1544
+ .ui-icon-cart {
1545
+ background-position: -48px -112px;
1546
+ }
1547
+
1548
+ .ui-icon-pencil {
1549
+ background-position: -64px -112px;
1550
+ }
1551
+
1552
+ .ui-icon-clock {
1553
+ background-position: -80px -112px;
1554
+ }
1555
+
1556
+ .ui-icon-disk {
1557
+ background-position: -96px -112px;
1558
+ }
1559
+
1560
+ .ui-icon-calculator {
1561
+ background-position: -112px -112px;
1562
+ }
1563
+
1564
+ .ui-icon-zoomin {
1565
+ background-position: -128px -112px;
1566
+ }
1567
+
1568
+ .ui-icon-zoomout {
1569
+ background-position: -144px -112px;
1570
+ }
1571
+
1572
+ .ui-icon-search {
1573
+ background-position: -160px -112px;
1574
+ }
1575
+
1576
+ .ui-icon-wrench {
1577
+ background-position: -176px -112px;
1578
+ }
1579
+
1580
+ .ui-icon-gear {
1581
+ background-position: -192px -112px;
1582
+ }
1583
+
1584
+ .ui-icon-heart {
1585
+ background-position: -208px -112px;
1586
+ }
1587
+
1588
+ .ui-icon-star {
1589
+ background-position: -224px -112px;
1590
+ }
1591
+
1592
+ .ui-icon-link {
1593
+ background-position: -240px -112px;
1594
+ }
1595
+
1596
+ .ui-icon-cancel {
1597
+ background-position: 0 -128px;
1598
+ }
1599
+
1600
+ .ui-icon-plus {
1601
+ background-position: -16px -128px;
1602
+ }
1603
+
1604
+ .ui-icon-plusthick {
1605
+ background-position: -32px -128px;
1606
+ }
1607
+
1608
+ .ui-icon-minus {
1609
+ background-position: -48px -128px;
1610
+ }
1611
+
1612
+ .ui-icon-minusthick {
1613
+ background-position: -64px -128px;
1614
+ }
1615
+
1616
+ .ui-icon-close {
1617
+ background-position: -80px -128px;
1618
+ }
1619
+
1620
+ .ui-icon-closethick {
1621
+ background-position: -96px -128px;
1622
+ }
1623
+
1624
+ .ui-icon-key {
1625
+ background-position: -112px -128px;
1626
+ }
1627
+
1628
+ .ui-icon-lightbulb {
1629
+ background-position: -128px -128px;
1630
+ }
1631
+
1632
+ .ui-icon-scissors {
1633
+ background-position: -144px -128px;
1634
+ }
1635
+
1636
+ .ui-icon-clipboard {
1637
+ background-position: -160px -128px;
1638
+ }
1639
+
1640
+ .ui-icon-copy {
1641
+ background-position: -176px -128px;
1642
+ }
1643
+
1644
+ .ui-icon-contact {
1645
+ background-position: -192px -128px;
1646
+ }
1647
+
1648
+ .ui-icon-image {
1649
+ background-position: -208px -128px;
1650
+ }
1651
+
1652
+ .ui-icon-video {
1653
+ background-position: -224px -128px;
1654
+ }
1655
+
1656
+ .ui-icon-script {
1657
+ background-position: -240px -128px;
1658
+ }
1659
+
1660
+ .ui-icon-alert {
1661
+ background-position: 0 -144px;
1662
+ }
1663
+
1664
+ .ui-icon-info {
1665
+ background-position: -16px -144px;
1666
+ }
1667
+
1668
+ .ui-icon-notice {
1669
+ background-position: -32px -144px;
1670
+ }
1671
+
1672
+ .ui-icon-help {
1673
+ background-position: -48px -144px;
1674
+ }
1675
+
1676
+ .ui-icon-check {
1677
+ background-position: -64px -144px;
1678
+ }
1679
+
1680
+ .ui-icon-bullet {
1681
+ background-position: -80px -144px;
1682
+ }
1683
+
1684
+ .ui-icon-radio-off {
1685
+ background-position: -96px -144px;
1686
+ }
1687
+
1688
+ .ui-icon-radio-on {
1689
+ background-position: -112px -144px;
1690
+ }
1691
+
1692
+ .ui-icon-pin-w {
1693
+ background-position: -128px -144px;
1694
+ }
1695
+
1696
+ .ui-icon-pin-s {
1697
+ background-position: -144px -144px;
1698
+ }
1699
+
1700
+ .ui-icon-play {
1701
+ background-position: 0 -160px;
1702
+ }
1703
+
1704
+ .ui-icon-pause {
1705
+ background-position: -16px -160px;
1706
+ }
1707
+
1708
+ .ui-icon-seek-next {
1709
+ background-position: -32px -160px;
1710
+ }
1711
+
1712
+ .ui-icon-seek-prev {
1713
+ background-position: -48px -160px;
1714
+ }
1715
+
1716
+ .ui-icon-seek-end {
1717
+ background-position: -64px -160px;
1718
+ }
1719
+
1720
+ .ui-icon-seek-start {
1721
+ background-position: -80px -160px;
1722
+ }
1723
+
1724
+ /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
1725
+ .ui-icon-seek-first {
1726
+ background-position: -80px -160px;
1727
+ }
1728
+
1729
+ .ui-icon-stop {
1730
+ background-position: -96px -160px;
1731
+ }
1732
+
1733
+ .ui-icon-eject {
1734
+ background-position: -112px -160px;
1735
+ }
1736
+
1737
+ .ui-icon-volume-off {
1738
+ background-position: -128px -160px;
1739
+ }
1740
+
1741
+ .ui-icon-volume-on {
1742
+ background-position: -144px -160px;
1743
+ }
1744
+
1745
+ .ui-icon-power {
1746
+ background-position: 0 -176px;
1747
+ }
1748
+
1749
+ .ui-icon-signal-diag {
1750
+ background-position: -16px -176px;
1751
+ }
1752
+
1753
+ .ui-icon-signal {
1754
+ background-position: -32px -176px;
1755
+ }
1756
+
1757
+ .ui-icon-battery-0 {
1758
+ background-position: -48px -176px;
1759
+ }
1760
+
1761
+ .ui-icon-battery-1 {
1762
+ background-position: -64px -176px;
1763
+ }
1764
+
1765
+ .ui-icon-battery-2 {
1766
+ background-position: -80px -176px;
1767
+ }
1768
+
1769
+ .ui-icon-battery-3 {
1770
+ background-position: -96px -176px;
1771
+ }
1772
+
1773
+ .ui-icon-circle-plus {
1774
+ background-position: 0 -192px;
1775
+ }
1776
+
1777
+ .ui-icon-circle-minus {
1778
+ background-position: -16px -192px;
1779
+ }
1780
+
1781
+ .ui-icon-circle-close {
1782
+ background-position: -32px -192px;
1783
+ }
1784
+
1785
+ .ui-icon-circle-triangle-e {
1786
+ background-position: -48px -192px;
1787
+ }
1788
+
1789
+ .ui-icon-circle-triangle-s {
1790
+ background-position: -64px -192px;
1791
+ }
1792
+
1793
+ .ui-icon-circle-triangle-w {
1794
+ background-position: -80px -192px;
1795
+ }
1796
+
1797
+ .ui-icon-circle-triangle-n {
1798
+ background-position: -96px -192px;
1799
+ }
1800
+
1801
+ .ui-icon-circle-arrow-e {
1802
+ background-position: -112px -192px;
1803
+ }
1804
+
1805
+ .ui-icon-circle-arrow-s {
1806
+ background-position: -128px -192px;
1807
+ }
1808
+
1809
+ .ui-icon-circle-arrow-w {
1810
+ background-position: -144px -192px;
1811
+ }
1812
+
1813
+ .ui-icon-circle-arrow-n {
1814
+ background-position: -160px -192px;
1815
+ }
1816
+
1817
+ .ui-icon-circle-zoomin {
1818
+ background-position: -176px -192px;
1819
+ }
1820
+
1821
+ .ui-icon-circle-zoomout {
1822
+ background-position: -192px -192px;
1823
+ }
1824
+
1825
+ .ui-icon-circle-check {
1826
+ background-position: -208px -192px;
1827
+ }
1828
+
1829
+ .ui-icon-circlesmall-plus {
1830
+ background-position: 0 -208px;
1831
+ }
1832
+
1833
+ .ui-icon-circlesmall-minus {
1834
+ background-position: -16px -208px;
1835
+ }
1836
+
1837
+ .ui-icon-circlesmall-close {
1838
+ background-position: -32px -208px;
1839
+ }
1840
+
1841
+ .ui-icon-squaresmall-plus {
1842
+ background-position: -48px -208px;
1843
+ }
1844
+
1845
+ .ui-icon-squaresmall-minus {
1846
+ background-position: -64px -208px;
1847
+ }
1848
+
1849
+ .ui-icon-squaresmall-close {
1850
+ background-position: -80px -208px;
1851
+ }
1852
+
1853
+ .ui-icon-grip-dotted-vertical {
1854
+ background-position: 0 -224px;
1855
+ }
1856
+
1857
+ .ui-icon-grip-dotted-horizontal {
1858
+ background-position: -16px -224px;
1859
+ }
1860
+
1861
+ .ui-icon-grip-solid-vertical {
1862
+ background-position: -32px -224px;
1863
+ }
1864
+
1865
+ .ui-icon-grip-solid-horizontal {
1866
+ background-position: -48px -224px;
1867
+ }
1868
+
1869
+ .ui-icon-gripsmall-diagonal-se {
1870
+ background-position: -64px -224px;
1871
+ }
1872
+
1873
+ .ui-icon-grip-diagonal-se {
1874
+ background-position: -80px -224px;
1875
+ }
1876
+
1877
+
1878
+ /* Misc visuals
1879
+ ----------------------------------*/
1880
+
1881
+ /* Corner radius */
1882
+ .ui-corner-all,
1883
+ .ui-corner-top,
1884
+ .ui-corner-left,
1885
+ .ui-corner-tl {
1886
+ -moz-border-radius-topleft: 4px
1887
+ /*{cornerRadius}*/
1888
+ ;
1889
+ -webkit-border-top-left-radius: 4px
1890
+ /*{cornerRadius}*/
1891
+ ;
1892
+ -khtml-border-top-left-radius: 4px
1893
+ /*{cornerRadius}*/
1894
+ ;
1895
+ border-top-left-radius: 4px
1896
+ /*{cornerRadius}*/
1897
+ ;
1898
+ }
1899
+
1900
+ .ui-corner-all,
1901
+ .ui-corner-top,
1902
+ .ui-corner-right,
1903
+ .ui-corner-tr {
1904
+ -moz-border-radius-topright: 4px
1905
+ /*{cornerRadius}*/
1906
+ ;
1907
+ -webkit-border-top-right-radius: 4px
1908
+ /*{cornerRadius}*/
1909
+ ;
1910
+ -khtml-border-top-right-radius: 4px
1911
+ /*{cornerRadius}*/
1912
+ ;
1913
+ border-top-right-radius: 4px
1914
+ /*{cornerRadius}*/
1915
+ ;
1916
+ }
1917
+
1918
+ .ui-corner-all,
1919
+ .ui-corner-bottom,
1920
+ .ui-corner-left,
1921
+ .ui-corner-bl {
1922
+ -moz-border-radius-bottomleft: 4px
1923
+ /*{cornerRadius}*/
1924
+ ;
1925
+ -webkit-border-bottom-left-radius: 4px
1926
+ /*{cornerRadius}*/
1927
+ ;
1928
+ -khtml-border-bottom-left-radius: 4px
1929
+ /*{cornerRadius}*/
1930
+ ;
1931
+ border-bottom-left-radius: 4px
1932
+ /*{cornerRadius}*/
1933
+ ;
1934
+ }
1935
+
1936
+ .ui-corner-all,
1937
+ .ui-corner-bottom,
1938
+ .ui-corner-right,
1939
+ .ui-corner-br {
1940
+ -moz-border-radius-bottomright: 4px
1941
+ /*{cornerRadius}*/
1942
+ ;
1943
+ -webkit-border-bottom-right-radius: 4px
1944
+ /*{cornerRadius}*/
1945
+ ;
1946
+ -khtml-border-bottom-right-radius: 4px
1947
+ /*{cornerRadius}*/
1948
+ ;
1949
+ border-bottom-right-radius: 4px
1950
+ /*{cornerRadius}*/
1951
+ ;
1952
+ }
1953
+
1954
+ /* Overlays */
1955
+ .ui-widget-overlay {
1956
+ background: #aaaaaa
1957
+ /*{bgColorOverlay}*/
1958
+ url(image/ui-bg_flat_0_aaaaaa_40x100.png)
1959
+ /*{bgImgUrlOverlay}*/
1960
+ 50%
1961
+ /*{bgOverlayXPos}*/
1962
+ 50%
1963
+ /*{bgOverlayYPos}*/
1964
+ repeat-x
1965
+ /*{bgOverlayRepeat}*/
1966
+ ;
1967
+ opacity: .3;
1968
+ filter:Alpha(Opacity=30)
1969
+ /*{opacityOverlay}*/
1970
+ ;
1971
+ }
1972
+
1973
+ .ui-widget-shadow {
1974
+ margin: -8px
1975
+ /*{offsetTopShadow}*/
1976
+ 0 0 -8px
1977
+ /*{offsetLeftShadow}*/
1978
+ ;
1979
+ padding: 8px
1980
+ /*{thicknessShadow}*/
1981
+ ;
1982
+ background: #aaaaaa
1983
+ /*{bgColorShadow}*/
1984
+ url(image/ui-bg_flat_0_aaaaaa_40x100.png)
1985
+ /*{bgImgUrlShadow}*/
1986
+ 50%
1987
+ /*{bgShadowXPos}*/
1988
+ 50%
1989
+ /*{bgShadowYPos}*/
1990
+ repeat-x
1991
+ /*{bgShadowRepeat}*/
1992
+ ;
1993
+ opacity: .3;
1994
+ filter:Alpha(Opacity=30)
1995
+ /*{opacityShadow}*/
1996
+ ;
1997
+ -moz-border-radius: 8px
1998
+ /*{cornerRadiusShadow}*/
1999
+ ;
2000
+ -khtml-border-radius: 8px
2001
+ /*{cornerRadiusShadow}*/
2002
+ ;
2003
+ -webkit-border-radius: 8px
2004
+ /*{cornerRadiusShadow}*/
2005
+ ;
2006
+ border-radius: 8px
2007
+ /*{cornerRadiusShadow}*/
2008
+ ;
2009
+ }
library/admin/render.php CHANGED
@@ -14,7 +14,7 @@ class render {
14
 
15
  private $plugin, $user;
16
 
17
- function __construct( \q\eud\plugin $plugin, \q\eud\core\user $user ){
18
 
19
  $this->plugin = $plugin;
20
 
@@ -27,11 +27,12 @@ class render {
27
  *
28
  * @since 0.1
29
  **/
30
- public function add_menu(){
 
31
 
32
  \add_users_page (
33
- __( 'Export User Data', 'q-export-user-data' ),
34
- __( 'Export User Data', 'q-export-user-data' ),
35
  \apply_filters( 'q/eud/admin_capability', 'list_users' ),
36
  'q-export-user-data',
37
  [ $this, 'admin_page' ] // callback method ##
@@ -49,7 +50,7 @@ class render {
49
  // quick security check ##
50
  if ( ! \current_user_can( \apply_filters( 'q/eud/admin_capability', 'list_users' ) ) ) {
51
 
52
- \wp_die( __( 'You do not have sufficient permissions to access this page.', 'q-export-user-data' ) );
53
 
54
  }
55
 
@@ -65,16 +66,16 @@ class render {
65
  if ( ! empty( $_POST['save_new_export_name'] ) ) {
66
 
67
  // assign value ##
68
- $save_export = $_POST['save_new_export_name'];
69
 
70
  } elseif ( ! empty( $_POST['export_name'] ) ) {
71
 
72
- $save_export = $_POST['export_name'];
73
 
74
  }
75
 
76
  // clean up $save_export ##
77
- $save_export = \sanitize_text_field( $save_export );
78
 
79
  // Build array of $options to save and save them ##
80
  if ( isset( $save_export ) ) {
@@ -197,8 +198,12 @@ class render {
197
  <?php
198
 
199
  // nothing happening? ##
200
- if ( isset( $_GET['error'] ) ) {
201
- echo '<div class="updated"><p><strong>' . \__( 'No users found.', 'q-export-user-data' ) . '</strong></p></div>';
 
 
 
 
202
  }
203
 
204
  // get props
@@ -225,16 +230,19 @@ class render {
225
  global $wpdb;
226
 
227
  // filterable SQL ##
228
- $meta_keys = \apply_filters(
229
  'q/eud/admin/sql',
230
- $wpdb->get_results( "SELECT distinct(meta_key) FROM $wpdb->usermeta" )
231
  );
232
 
 
 
 
233
  // filterable sort ##
234
- \apply_filters(
235
- 'q/eud/admin/sort',
236
- asort( $meta_keys )
237
- );
238
 
239
  // get meta_key value from object ##
240
  $meta_keys = \wp_list_pluck( $meta_keys, 'meta_key' );
@@ -411,7 +419,7 @@ class render {
411
 
412
  printf(
413
  \__( 'Include Standard user profile fields, such as user_login. <a href="%s" target="_blank">%s</a>', 'q-export-user-data' )
414
- , \esc_html('https://codex.wordpress.org/Database_Description#Table:_wp_users')
415
  , 'Codex'
416
  );
417
 
@@ -423,32 +431,34 @@ class render {
423
  <th scope="row"><label for="q_eud_users_role"><?php \_e( 'Role', 'q-export-user-data' ); ?></label></th>
424
  <td>
425
  <select name="role" id="q_eud_users_role">
426
- <?php
 
427
 
428
- echo '<option value="">' . \__( 'All Roles', 'q-export-user-data' ) . '</option>';
429
 
430
- global $wp_roles;
431
 
432
- foreach ( $wp_roles->role_names as $role => $name ) {
433
 
434
- if ( isset ( $_role ) && ( $_role == $role ) ) {
 
 
435
 
436
- echo "\n\t<option selected value='" . \esc_attr( $role ) . "'>$name</option>";
437
 
438
- } else {
 
 
439
 
440
- echo "\n\t<option value='" . \esc_attr( $role ) . "'>$name</option>";
 
441
 
442
- }
443
- }
444
-
445
-
446
- ?>
447
  </select>
448
  <p class="description"><?php
449
  printf(
450
  \__( 'Filter the exported users by a WordPress Role. <a href="%s" target="_blank">%s</a>', 'q-export-user-data' )
451
- , \esc_html('http://codex.wordpress.org/Roles_and_Capabilities')
452
  , 'Codex'
453
  );
454
  ?></p>
@@ -462,7 +472,7 @@ class render {
462
  <p class="description"><?php
463
  printf(
464
  \__( 'Include all of the users <a href="%s" target="_blank">%s</a>', 'q-export-user-data' )
465
- , \esc_html('http://codex.wordpress.org/Roles_and_Capabilities')
466
  , 'Roles'
467
  );
468
  ?></p>
@@ -472,8 +482,8 @@ class render {
472
  <tr valign="top" class="toggleable">
473
  <th scope="row"><label><?php \_e( 'Registered', 'q-export-user-data' ); ?></label></th>
474
  <td>
475
- <input type="text" id="q_eud_users_start_date" name="start_date" value="<?php echo $_start_date; ?>" class="start-datepicker" />
476
- <input type="text" id="q_eud_users_end_date" name="end_date" value="<?php echo $_end_date; ?>" class="end-datepicker" />
477
  <p class="description"><?php
478
  printf(
479
  \__( 'Pick a start and end user registration date to limit the results.', 'q-export-user-data' )
@@ -485,12 +495,12 @@ class render {
485
  <tr valign="top" class="toggleable">
486
  <th scope="row"><label><?php \_e( 'Limit Range', 'q-export-user-data' ); ?></label></th>
487
  <td>
488
- <input name="limit_offset" type="text" id="q_eud_users_limit_offset" value="<?php echo( $_limit_offset ); ?>" class="regular-text code numeric" style="width: 136px;" placeholder="<?php _e( 'Offset', 'q-export-user-data' ); ?>">
489
- <input name="limit_total" type="text" id="q_eud_users_limit_total" value="<?php echo ( $_limit_total ); ?>" class="regular-text code numeric" style="width: 136px;" placeholder="<?php _e( 'Total', 'q-export-user-data' ); ?>">
490
  <p class="description"><?php
491
  printf(
492
  \__( 'Enter an offset start number and a total number of users to export. <a href="%s" target="_blank">%s</a>', 'q-export-user-data' )
493
- , \esc_html('http://codex.wordpress.org/Function_Reference/get_users#Parameters')
494
  , 'Codex'
495
  );
496
  ?></p>
@@ -558,28 +568,37 @@ class render {
558
  <th scope="row"><label for="q_eud_users_format"><?php \_e( 'Format', 'q-export-user-data' ); ?></label></th>
559
  <td>
560
  <select name="format" id="q_eud_users_format">
561
- <?php
562
 
563
- if ( isset ( $_format ) && ( $_format == 'excel2007' ) ) {
564
 
565
- echo '<option selected value="excel2007">' . __( 'Excel 2007 (xlsx)', 'q-export-user-data' ) . '</option>';
 
 
 
 
566
 
567
- } else {
 
 
568
 
569
- echo '<option value="excel2007">' . __( 'Excel 2007 (xlsx)', 'q-export-user-data' ) . '</option>';
570
 
571
- }
572
 
573
- if ( isset ( $_format ) && ( $_format == 'csv' ) ) {
 
 
574
 
575
- echo '<option selected value="csv">' . __( 'CSV', 'q-export-user-data' ) . '</option>';
576
 
577
- } else {
 
 
578
 
579
- echo '<option value="csv">' . __( 'CSV', 'q-export-user-data' ) . '</option>';
580
 
581
- }
582
- ?>
583
  </select>
584
  <p class="description"><?php
585
  printf(
@@ -594,7 +613,7 @@ class render {
594
  <td>
595
 
596
  <div class="row">
597
- <input type="text" class="regular-text" name="save_new_export_name" id="q_eud_save_options_new_export" placeholder="<?php \_e( 'Export Name', 'q-export-user-data' ); ?>" value="<?php echo isset( $_POST['export_name'] ) ? \sanitize_text_field( $_POST['export_name'] ) : '' ; ?>">
598
  <input type="submit" id="save_export" class="button-primary" name="save_export" value="<?php \_e( 'Save', 'q-export-user-data' ); ?>" />
599
  </div>
600
  <?php
@@ -602,37 +621,41 @@ class render {
602
  // check if the user has any saved exports ##
603
  if ( $this->user->get_user_options() ) {
604
 
605
- ?>
606
  <div class="row">
607
  <select name="export_name" id="q_eud_save_options" class="regular-text">
608
- <?php
609
 
610
- // loop over each saved export ##
611
- foreach( $this->user->get_user_options() as $export ) {
612
 
613
- // select Loaded export name, if selected ##
614
- if (
615
- isset( $_POST['load_export'] )
616
- && isset( $_POST['export_name'] )
617
- && ( \sanitize_text_field( $_POST['export_name'] ) == $export )
618
- ) {
619
 
620
- echo "<option selected value='$export'>".$export."</option>";
 
 
621
 
622
- // just list previous export name ##
623
- } else {
624
 
625
- echo "<option value='$export'>".$export."</option>";
 
 
626
 
627
- }
628
 
629
- }
630
 
631
- ?>
632
  </select>
633
 
634
- <input type="submit" id="load_export" class="button-primary" name="load_export" value="<?php _e( 'Load', 'q-export-user-data' ); ?>" />
635
- <input type="submit" id="delete_export" class="button-primary" name="delete_export" value="<?php _e( 'Delete', 'q-export-user-data' ); ?>" />
636
  <?php
637
 
638
  }
@@ -657,19 +680,20 @@ class render {
657
 
658
  </table>
659
  <p class="submit">
660
- <input type="hidden" name="_wp_http_referer" value="<?php echo \esc_url( $_SERVER['REQUEST_URI'] ); ?>" />
661
  <input type="submit" class="button-primary" value="<?php \_e( 'Run Export', 'q-export-user-data' ); ?>" />
662
  </p>
663
  </form>
664
  </div>
665
-
666
- <?php
667
- }
668
 
669
  /**
670
  * style and interaction
671
  */
672
- function admin_enqueue_scripts( $hook ){
 
673
 
674
  // load the scripts on only the plugin admin page ##
675
  if (
@@ -678,17 +702,17 @@ class render {
678
 
679
  ) {
680
 
681
- return false;
682
 
683
  }
684
 
685
- \wp_register_style( 'q-eud-css', \plugins_url( 'css/q-eud.css' ,__FILE__ ), '', $this->plugin->get( '_version' ) );
686
  \wp_enqueue_style( 'q-eud-css' );
687
- \wp_enqueue_script( 'q_eud_multi_select_js', \plugins_url( 'javascript/jquery.multi-select.js', __FILE__ ), array('jquery'), '0.9.8', false );
688
 
689
  // add script ##
690
  \wp_enqueue_script('jquery-ui-datepicker');
691
- \wp_register_style('jquery-ui', 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css');
692
  \wp_enqueue_style('jquery-ui');
693
 
694
  }
@@ -697,21 +721,21 @@ class render {
697
  * Inline jQuery
698
  * @since 0.8.2
699
  */
700
- function jquery(){
701
 
702
- // load the scripts on only the plugin admin page
703
  if (
704
  ! isset( $_GET['page'] )
705
- || $_GET['page'] != 'q-export-user-data'
706
  ) {
707
 
708
- return false;
709
 
710
  }
711
 
712
- $_usermeta_saved_fields = $this->plugin->get( '_usermeta_saved_fields' );
713
- $_bp_fields_saved_fields = $this->plugin->get( '_bp_fields_saved_fields' );
714
- $_bp_fields_update_time_saved_fields = $this->plugin->get( '_bp_fields_update_time_saved_fields' );
715
 
716
  ?>
717
  <script>
@@ -723,9 +747,9 @@ class render {
723
  jQuery('#usermeta, #bp_fields, #bp_fields_update_time').multiSelect();
724
 
725
  // Select any fields from saved settings ##
726
- jQuery('#usermeta').multiSelect('select',([<?php echo( \q\eud\core\helper::quote_array( $_usermeta_saved_fields ) ); ?>]));
727
- jQuery('#bp_fields').multiSelect('select',([<?php echo( \q\eud\core\helper::quote_array( $_bp_fields_saved_fields ) ); ?>]));
728
- jQuery('#bp_fields_update_time').multiSelect('select',([<?php echo( \q\eud\core\helper::quote_array( $_bp_fields_update_time_saved_fields ) ); ?>]));
729
 
730
  // show only common ##
731
  jQuery('.usermeta-common').click(function(e){
@@ -779,9 +803,9 @@ class render {
779
  $toggleable = jQuery("tr.toggleable");
780
  $toggleable.toggle();
781
  if ( $toggleable.is(":visible") ) {
782
- jQuery(this).text("<?php _e( 'Hide', 'q-export-user-data' ); ?>");
783
  } else {
784
- jQuery(this).text("<?php _e( 'Show', 'q-export-user-data' ); ?>");
785
  }
786
  });
787
 
@@ -807,8 +831,7 @@ class render {
807
 
808
  });
809
 
810
- <?php
811
-
812
  // method returns an object with "first" & "last" keys ##
813
  $dates = \q\eud\core\get::user_registered_dates();
814
 
@@ -817,21 +840,20 @@ class render {
817
  $start_of_week = \get_option('start_of_week') ? \get_option('start_of_week') : 'yy-mm-dd' ;
818
  #self::log( 'Date format: '.$date_format );
819
 
820
- ?>
821
-
822
  // start date picker ##
823
  jQuery('.start-datepicker').datepicker( {
824
  dateFormat : '<?php \esc_attr_e( $date_format ); ?>',
825
- minDate : '<?php echo substr( $dates["0"]->first, 0, 10 ); ?>',
826
- maxDate : '<?php echo substr( $dates["0"]->last, 0, 10 ); ?>',
827
  firstDay : '<?php \esc_attr_e( $start_of_week ); ?>'
828
  } );
829
 
830
  // end date picker ##
831
  jQuery('.end-datepicker').datepicker( {
832
  dateFormat : '<?php \esc_attr_e( $date_format ); ?>',
833
- minDate : '<?php echo substr( $dates["0"]->first, 0, 10 ); ?>',
834
- maxDate : '<?php echo substr( $dates["0"]->last, 0, 10 ); ?>',
835
  firstDay : '<?php \esc_attr_e( $start_of_week ); ?>'
836
  } );
837
 
@@ -839,16 +861,16 @@ class render {
839
  // might want to set minDate to something else, but not sure
840
  // what would be best for everyone
841
  jQuery('.updated-datepicker').datepicker( {
842
- dateFormat : '<?php echo $date_format; ?>',
843
- minDate : '<?php echo substr( $dates["0"]->first, 0, 10 ); ?>',
844
  maxDate : '0',
845
- firstDay : '<?php echo $start_of_week; ?>'
846
  } );
847
 
848
  });
849
 
850
  </script>
851
- <?php
852
 
853
  }
854
 
@@ -857,7 +879,7 @@ class render {
857
  *
858
  * @since 0.8.2
859
  */
860
- function css(){
861
 
862
  // load the scripts on only the plugin admin page
863
  if (
@@ -865,16 +887,16 @@ class render {
865
  || $_GET['page'] != 'q-export-user-data'
866
  ) {
867
 
868
- return false;
869
 
870
  }
871
 
872
- ?>
873
  <style>
874
  .toggleable { display: none; }
875
  .hidden { display: none; }
876
  </style>
877
- <?php
878
 
879
  }
880
 
14
 
15
  private $plugin, $user;
16
 
17
+ public function __construct( \q\eud\plugin $plugin, \q\eud\core\user $user ){
18
 
19
  $this->plugin = $plugin;
20
 
27
  *
28
  * @since 0.1
29
  **/
30
+ public function add_menu():void
31
+ {
32
 
33
  \add_users_page (
34
+ \__( 'Export User Data', 'q-export-user-data' ),
35
+ \__( 'Export User Data', 'q-export-user-data' ),
36
  \apply_filters( 'q/eud/admin_capability', 'list_users' ),
37
  'q-export-user-data',
38
  [ $this, 'admin_page' ] // callback method ##
50
  // quick security check ##
51
  if ( ! \current_user_can( \apply_filters( 'q/eud/admin_capability', 'list_users' ) ) ) {
52
 
53
+ \wp_die( \__( 'You do not have sufficient permissions to access this page.', 'q-export-user-data' ) );
54
 
55
  }
56
 
66
  if ( ! empty( $_POST['save_new_export_name'] ) ) {
67
 
68
  // assign value ##
69
+ $save_export = \sanitize_text_field( $_POST['save_new_export_name'] );
70
 
71
  } elseif ( ! empty( $_POST['export_name'] ) ) {
72
 
73
+ $save_export = \sanitize_text_field( $_POST['export_name'] );
74
 
75
  }
76
 
77
  // clean up $save_export ##
78
+ // $save_export = \sanitize_text_field( $save_export );
79
 
80
  // Build array of $options to save and save them ##
81
  if ( isset( $save_export ) ) {
198
  <?php
199
 
200
  // nothing happening? ##
201
+ if ( isset( $_GET['qeud_error'] ) && 'empty' == $_GET['qeud_error'] ) {
202
+
203
+ ?>
204
+ <div class="updated"><p><strong><?php \_e( 'No users found to export in passed query.', 'q-export-user-data' ); ?></strong></p></div>
205
+ <?php
206
+
207
  }
208
 
209
  // get props
230
  global $wpdb;
231
 
232
  // filterable SQL ##
233
+ $meta_keys_sql = \apply_filters(
234
  'q/eud/admin/sql',
235
+ "SELECT distinct(meta_key) FROM $wpdb->usermeta"
236
  );
237
 
238
+ // run Query ##
239
+ $meta_keys = $wpdb->get_results( $meta_keys_sql );
240
+
241
  // filterable sort ##
242
+ // \apply_filters(
243
+ // 'q/eud/admin/sort',
244
+ asort( $meta_keys );
245
+ // );
246
 
247
  // get meta_key value from object ##
248
  $meta_keys = \wp_list_pluck( $meta_keys, 'meta_key' );
419
 
420
  printf(
421
  \__( 'Include Standard user profile fields, such as user_login. <a href="%s" target="_blank">%s</a>', 'q-export-user-data' )
422
+ , \esc_url('https://codex.wordpress.org/Database_Description#Table:_wp_users')
423
  , 'Codex'
424
  );
425
 
431
  <th scope="row"><label for="q_eud_users_role"><?php \_e( 'Role', 'q-export-user-data' ); ?></label></th>
432
  <td>
433
  <select name="role" id="q_eud_users_role">
434
+ <option value=""><?php \_e( 'All Roles', 'q-export-user-data' ); ?></option>
435
+ <?php
436
 
437
+ global $wp_roles;
438
 
439
+ foreach ( $wp_roles->role_names as $role => $name ) {
440
 
441
+ if ( isset ( $_role ) && ( $_role == $role ) ) {
442
 
443
+ ?>
444
+ <option selected value="<?php \esc_attr_e( $role ); ?>"><?php \esc_attr_e( $name ); ?></option>
445
+ <?php
446
 
447
+ } else {
448
 
449
+ ?>
450
+ <option value="<?php \esc_attr_e( $role ); ?>"><?php \esc_attr_e( $name ); ?></option>
451
+ <?php
452
 
453
+ }
454
+ }
455
 
456
+ ?>
 
 
 
 
457
  </select>
458
  <p class="description"><?php
459
  printf(
460
  \__( 'Filter the exported users by a WordPress Role. <a href="%s" target="_blank">%s</a>', 'q-export-user-data' )
461
+ , \esc_url('http://codex.wordpress.org/Roles_and_Capabilities')
462
  , 'Codex'
463
  );
464
  ?></p>
472
  <p class="description"><?php
473
  printf(
474
  \__( 'Include all of the users <a href="%s" target="_blank">%s</a>', 'q-export-user-data' )
475
+ , \esc_url('http://codex.wordpress.org/Roles_and_Capabilities')
476
  , 'Roles'
477
  );
478
  ?></p>
482
  <tr valign="top" class="toggleable">
483
  <th scope="row"><label><?php \_e( 'Registered', 'q-export-user-data' ); ?></label></th>
484
  <td>
485
+ <input type="text" id="q_eud_users_start_date" name="start_date" value="<?php \esc_attr_e( $_start_date ); ?>" class="start-datepicker" />
486
+ <input type="text" id="q_eud_users_end_date" name="end_date" value="<?php \esc_attr_e( $_end_date ); ?>" class="end-datepicker" />
487
  <p class="description"><?php
488
  printf(
489
  \__( 'Pick a start and end user registration date to limit the results.', 'q-export-user-data' )
495
  <tr valign="top" class="toggleable">
496
  <th scope="row"><label><?php \_e( 'Limit Range', 'q-export-user-data' ); ?></label></th>
497
  <td>
498
+ <input name="limit_offset" type="text" id="q_eud_users_limit_offset" value="<?php \esc_attr_e( $_limit_offset ); ?>" class="regular-text code numeric" style="width: 136px;" placeholder="<?php \_e( 'Offset', 'q-export-user-data' ); ?>">
499
+ <input name="limit_total" type="text" id="q_eud_users_limit_total" value="<?php \esc_attr_e ( $_limit_total ); ?>" class="regular-text code numeric" style="width: 136px;" placeholder="<?php \_e( 'Total', 'q-export-user-data' ); ?>">
500
  <p class="description"><?php
501
  printf(
502
  \__( 'Enter an offset start number and a total number of users to export. <a href="%s" target="_blank">%s</a>', 'q-export-user-data' )
503
+ , \esc_url('http://codex.wordpress.org/Function_Reference/get_users#Parameters')
504
  , 'Codex'
505
  );
506
  ?></p>
568
  <th scope="row"><label for="q_eud_users_format"><?php \_e( 'Format', 'q-export-user-data' ); ?></label></th>
569
  <td>
570
  <select name="format" id="q_eud_users_format">
571
+ <?php
572
 
573
+ if ( isset ( $_format ) && ( $_format == 'excel2007' ) ) {
574
 
575
+ ?>
576
+ <option selected value="excel2007"><?php \_e( 'Excel 2007 (xlsx)', 'q-export-user-data' ); ?></option>
577
+ <?php
578
+
579
+ } else {
580
 
581
+ ?>
582
+ <option value="excel2007"><?php \_e( 'Excel 2007 (xlsx)', 'q-export-user-data' ); ?></option>
583
+ <?php
584
 
585
+ }
586
 
587
+ if ( isset ( $_format ) && ( $_format == 'csv' ) ) {
588
 
589
+ ?>
590
+ <option selected value="csv"><?php \_e( 'CSV', 'q-export-user-data' ); ?></option>
591
+ <?php
592
 
593
+ } else {
594
 
595
+ ?>
596
+ <option value="csv"><?php \_e( 'CSV', 'q-export-user-data' ); ?></option>
597
+ <?php
598
 
599
+ }
600
 
601
+ ?>
 
602
  </select>
603
  <p class="description"><?php
604
  printf(
613
  <td>
614
 
615
  <div class="row">
616
+ <input type="text" class="regular-text" name="save_new_export_name" id="q_eud_save_options_new_export" placeholder="<?php \_e( 'Export Name', 'q-export-user-data' ); ?>" value="<?php echo isset( $_POST['export_name'] ) ? \esc_attr_e( $_POST['export_name'] ) : '' ; ?>">
617
  <input type="submit" id="save_export" class="button-primary" name="save_export" value="<?php \_e( 'Save', 'q-export-user-data' ); ?>" />
618
  </div>
619
  <?php
621
  // check if the user has any saved exports ##
622
  if ( $this->user->get_user_options() ) {
623
 
624
+ ?>
625
  <div class="row">
626
  <select name="export_name" id="q_eud_save_options" class="regular-text">
627
+ <?php
628
 
629
+ // loop over each saved export ##
630
+ foreach( $this->user->get_user_options() as $export ) {
631
 
632
+ // select Loaded export name, if selected ##
633
+ if (
634
+ isset( $_POST['load_export'] )
635
+ && isset( $_POST['export_name'] )
636
+ && ( $_POST['export_name'] == $export )
637
+ ) {
638
 
639
+ ?>
640
+ <option selected value='<?php \esc_attr_e( $export ); ?>'><?php \esc_attr_e( $export ); ?></option>
641
+ <?php
642
 
643
+ // just list previous export name ##
644
+ } else {
645
 
646
+ ?>
647
+ <option value='<?php \esc_attr_e( $export ); ?>'><?php \esc_attr_e( $export ); ?></option>
648
+ <?php
649
 
650
+ }
651
 
652
+ }
653
 
654
+ ?>
655
  </select>
656
 
657
+ <input type="submit" id="load_export" class="button-primary" name="load_export" value="<?php \_e( 'Load', 'q-export-user-data' ); ?>" />
658
+ <input type="submit" id="delete_export" class="button-primary" name="delete_export" value="<?php \_e( 'Delete', 'q-export-user-data' ); ?>" />
659
  <?php
660
 
661
  }
680
 
681
  </table>
682
  <p class="submit">
683
+ <input type="hidden" name="_wp_http_referer" value="<?php echo isset( $_SERVER['REQUEST_URI'] ) ? \esc_url( $_SERVER['REQUEST_URI'] ) : '' ; ?>" />
684
  <input type="submit" class="button-primary" value="<?php \_e( 'Run Export', 'q-export-user-data' ); ?>" />
685
  </p>
686
  </form>
687
  </div>
688
+ <?php
689
+
690
+ }
691
 
692
  /**
693
  * style and interaction
694
  */
695
+ public function admin_enqueue_scripts( $hook ):void
696
+ {
697
 
698
  // load the scripts on only the plugin admin page ##
699
  if (
702
 
703
  ) {
704
 
705
+ return;
706
 
707
  }
708
 
709
+ \wp_register_style( 'q-eud-css', $this->plugin::get_plugin_url( 'library/admin/css/q-eud.css' ), '', $this->plugin->get( '_version' ) );
710
  \wp_enqueue_style( 'q-eud-css' );
711
+ \wp_enqueue_script( 'q-eud-multi-select', $this->plugin::get_plugin_url( 'library/admin/javascript/jquery.multi-select.js' ), array('jquery'), '0.9.8', false );
712
 
713
  // add script ##
714
  \wp_enqueue_script('jquery-ui-datepicker');
715
+ \wp_register_style('jquery-ui', $this->plugin::get_plugin_url( 'library/admin/css/jquery-ui.css' ), array(), '1.8.0' );
716
  \wp_enqueue_style('jquery-ui');
717
 
718
  }
721
  * Inline jQuery
722
  * @since 0.8.2
723
  */
724
+ public function jquery(){
725
 
726
+ // load the scripts only on the plugin admin page
727
  if (
728
  ! isset( $_GET['page'] )
729
+ || \sanitize_text_field( $_GET['page'] ) != 'q-export-user-data'
730
  ) {
731
 
732
+ return ;
733
 
734
  }
735
 
736
+ $_usermeta_saved_fields = h::quote_array( $this->plugin->get( '_usermeta_saved_fields' ) );
737
+ $_bp_fields_saved_fields = h::quote_array( $this->plugin->get( '_bp_fields_saved_fields' ) );
738
+ $_bp_fields_update_time_saved_fields = h::quote_array( $this->plugin->get( '_bp_fields_update_time_saved_fields' ) );
739
 
740
  ?>
741
  <script>
747
  jQuery('#usermeta, #bp_fields, #bp_fields_update_time').multiSelect();
748
 
749
  // Select any fields from saved settings ##
750
+ jQuery('#usermeta').multiSelect('select',([<?php echo $_usermeta_saved_fields; // escaped by quote_array ?>]));
751
+ // jQuery('#bp_fields').multiSelect('select',([<?php #echo $_bp_fields_saved_fields; // escaped by quote_array ?>]));
752
+ // jQuery('#bp_fields_update_time').multiSelect('select',([<?php #echo $_bp_fields_update_time_saved_fields; // escaped by quote_array ?>]));
753
 
754
  // show only common ##
755
  jQuery('.usermeta-common').click(function(e){
803
  $toggleable = jQuery("tr.toggleable");
804
  $toggleable.toggle();
805
  if ( $toggleable.is(":visible") ) {
806
+ jQuery(this).text("<?php \_e( 'Hide', 'q-export-user-data' ); ?>");
807
  } else {
808
+ jQuery(this).text("<?php \_e( 'Show', 'q-export-user-data' ); ?>");
809
  }
810
  });
811
 
831
 
832
  });
833
 
834
+ <?php
 
835
  // method returns an object with "first" & "last" keys ##
836
  $dates = \q\eud\core\get::user_registered_dates();
837
 
840
  $start_of_week = \get_option('start_of_week') ? \get_option('start_of_week') : 'yy-mm-dd' ;
841
  #self::log( 'Date format: '.$date_format );
842
 
843
+ ?>
 
844
  // start date picker ##
845
  jQuery('.start-datepicker').datepicker( {
846
  dateFormat : '<?php \esc_attr_e( $date_format ); ?>',
847
+ minDate : '<?php \esc_attr_e( substr( $dates["0"]->first, 0, 10 ) ); ?>',
848
+ maxDate : '<?php \esc_attr_e( substr( $dates["0"]->last, 0, 10 ) ); ?>',
849
  firstDay : '<?php \esc_attr_e( $start_of_week ); ?>'
850
  } );
851
 
852
  // end date picker ##
853
  jQuery('.end-datepicker').datepicker( {
854
  dateFormat : '<?php \esc_attr_e( $date_format ); ?>',
855
+ minDate : '<?php \esc_attr_e( substr( $dates["0"]->first, 0, 10 ) ); ?>',
856
+ maxDate : '<?php \esc_attr_e( substr( $dates["0"]->last, 0, 10 ) ); ?>',
857
  firstDay : '<?php \esc_attr_e( $start_of_week ); ?>'
858
  } );
859
 
861
  // might want to set minDate to something else, but not sure
862
  // what would be best for everyone
863
  jQuery('.updated-datepicker').datepicker( {
864
+ dateFormat : '<?php \esc_attr_e( $date_format ); ?>',
865
+ minDate : '<?php \esc_attr_e( substr( $dates["0"]->first, 0, 10 ) ); ?>',
866
  maxDate : '0',
867
+ firstDay : '<?php \esc_attr_e( $start_of_week ); ?>'
868
  } );
869
 
870
  });
871
 
872
  </script>
873
+ <?php
874
 
875
  }
876
 
879
  *
880
  * @since 0.8.2
881
  */
882
+ public function css(){
883
 
884
  // load the scripts on only the plugin admin page
885
  if (
887
  || $_GET['page'] != 'q-export-user-data'
888
  ) {
889
 
890
+ return;
891
 
892
  }
893
 
894
+ ?>
895
  <style>
896
  .toggleable { display: none; }
897
  .hidden { display: none; }
898
  </style>
899
+ <?php
900
 
901
  }
902
 
library/api/admin.php CHANGED
@@ -72,8 +72,8 @@ class admin {
72
  }
73
 
74
  ?>
75
- <tr valign="top" class="<?php echo $toggleable; ?>">
76
- <th scope="row"><label for="q_eud_<?php echo $array['label']; ?>"><?php echo $array['title']; ?></label></th>
77
  <td>
78
  <?php
79
 
@@ -84,7 +84,7 @@ class admin {
84
  if ( isset( $array['description'] ) ) {
85
 
86
  ?>
87
- <p class="description"><?php echo $array['description']; ?></p>
88
  <?php
89
 
90
  }
@@ -175,11 +175,11 @@ class admin {
175
  $multiselect = isset( $array['multiselect'] ) ? ' multiple="multiple"' : '' ;
176
 
177
  ?>
178
- <select <?php echo $multiselect; ?> name="<?php echo $array['label']; ?>" id="q_eud_<?php echo $array['label']; ?>">
179
- <?php
180
 
181
  // label ##
182
- echo '<option value="">'.$array['label_select'].'</option>';
183
 
184
  // loop over all options ##
185
  foreach ( $array['options'] as $item ) {
@@ -201,7 +201,7 @@ class admin {
201
  }
202
 
203
  ?>
204
- <option value='<?php echo \esc_attr( $id ); ?>'><?php echo $title; ?></option>
205
  <?php
206
 
207
  }
72
  }
73
 
74
  ?>
75
+ <tr valign="top" class="<?php \esc_attr_e( $toggleable ); ?>">
76
+ <th scope="row"><label for="q_eud_<?php \esc_attr_e( $array['label'] ); ?>"><?php \esc_attr_e( $array['title'] ); ?></label></th>
77
  <td>
78
  <?php
79
 
84
  if ( isset( $array['description'] ) ) {
85
 
86
  ?>
87
+ <p class="description"><?php \esc_attr_e( $array['description'] ); ?></p>
88
  <?php
89
 
90
  }
175
  $multiselect = isset( $array['multiselect'] ) ? ' multiple="multiple"' : '' ;
176
 
177
  ?>
178
+ <select <?php \esc_attr_e( $multiselect ); ?> name="<?php \esc_attr_e( $array['label'] ); ?>" id="q_eud_<?php \esc_attr_e( $array['label'] ); ?>">
179
+ <?php
180
 
181
  // label ##
182
+ echo '<option value="">'.\esc_attr( $array['label_select'] ).'</option>';
183
 
184
  // loop over all options ##
185
  foreach ( $array['options'] as $item ) {
201
  }
202
 
203
  ?>
204
+ <option value='<?php \esc_attr_e( $id ); ?>'><?php esc_attr_e( $title ); ?></option>
205
  <?php
206
 
207
  }
library/api/function.php CHANGED
@@ -14,7 +14,7 @@ if ( ! function_exists( 'export_user_data' ) ) {
14
 
15
  // sanity ##
16
  if(
17
- ! class_exists( '\export_user_data\plugin' )
18
  ){
19
 
20
  error_log( 'e:>Export User Data is not available to '.__FUNCTION__ );
14
 
15
  // sanity ##
16
  if(
17
+ ! class_exists( 'q\eud\plugin' )
18
  ){
19
 
20
  error_log( 'e:>Export User Data is not available to '.__FUNCTION__ );
library/core/.__excel2003.php DELETED
@@ -1,85 +0,0 @@
1
- <?php
2
-
3
- namespace q\eud\core;
4
-
5
- // import classes ##
6
- use q\eud;
7
- use q\eud\core\core;
8
- use q\eud\core\helper as h;
9
-
10
- /**
11
- * XML template for excel file format
12
- *
13
- * @since 0.7.7
14
- **/
15
-
16
- class excel2003 {
17
-
18
- public static function begin(){
19
-
20
- $xml_doc_begin =
21
- '<?xml version="1.0"?>
22
- <?mso-application progid="Excel.Sheet"?>
23
- <Workbook
24
- xmlns="urn:schemas-microsoft-com:office:spreadsheet"
25
- xmlns:o="urn:schemas-microsoft-com:office:office"
26
- xmlns:x="urn:schemas-microsoft-com:office:excel"
27
- xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
28
- xmlns:html="http://www.w3.org/TR/REC-html40">
29
- <Worksheet ss:Name="Exported Users">
30
- <Table>';
31
-
32
- return $xml_doc_begin;
33
-
34
- }
35
-
36
-
37
- public static function pre(){
38
-
39
- $xml_pre =
40
- '<Row>
41
- <Cell>
42
- <Data ss:Type="String">';
43
-
44
- return $xml_pre;
45
-
46
- }
47
-
48
-
49
- public static function seperator(){
50
-
51
- $xml_seperator =
52
- '</Data>
53
- </Cell>
54
- <Cell>
55
- <Data ss:Type="String">';
56
-
57
- return $xml_seperator;
58
-
59
- }
60
-
61
-
62
- public static function breaker(){
63
-
64
- $xml_breaker =
65
- '</Data>
66
- </Cell>
67
- </Row>';
68
-
69
- return $xml_breaker;
70
-
71
- }
72
-
73
-
74
- public static function end(){
75
-
76
- $xml_doc_end = '
77
- </Table>
78
- </Worksheet>
79
- </Workbook>';
80
-
81
- return $xml_doc_end;
82
-
83
- }
84
-
85
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
library/core/.__method.php DELETED
@@ -1,99 +0,0 @@
1
- <?php
2
-
3
- namespace q\eud\core;
4
-
5
- // import classes ##
6
- use q\eud;
7
- use q\eud\plugin as plugin;
8
- use q\eud\core\helper as h;
9
-
10
- class method {
11
-
12
- /**
13
- * Get the array of standard WP_User fields to return
14
- */
15
- public static function get_user_fields(){
16
-
17
- // standard wp_users fields ##
18
- if ( isset( $_POST['user_fields'] ) && '1' == $_POST['user_fields'] ) {
19
-
20
- // debug ##
21
- #h::log( 'full' );
22
-
23
- // exportable user data ##
24
- $user_fields = array(
25
- 'ID'
26
- , 'user_login'
27
- #, 'user_pass'
28
- , 'user_nicename'
29
- , 'user_email'
30
- , 'user_url'
31
- , 'user_registered'
32
- #, 'user_activation_key'
33
- , 'user_status'
34
- , 'display_name'
35
- );
36
-
37
- } else {
38
-
39
- // debug ##
40
- #h::log( 'reduced' );
41
-
42
- // just return the user ID
43
- $user_fields = array(
44
- 'ID'
45
- );
46
-
47
- }
48
-
49
- // kick back values via filter ##
50
- return \apply_filters( 'q/eud/export/user_fields', $user_fields );
51
-
52
- }
53
-
54
- /**
55
- * Get the array of special user fields to return
56
- */
57
- public static function get_special_fields(){
58
-
59
- // exportable user data ##
60
- $special_fields = array(
61
- # 'roles' // list of WP Roles
62
- #, 'groups' // BP Groups
63
- );
64
-
65
- // should we allow groups ##
66
- if ( isset( $_POST['groups'] ) && '1' == $_POST['groups'] ) {
67
-
68
- $special_fields[] = 'groups'; // add groups ##
69
-
70
- }
71
-
72
- // should we allow roles ##
73
- if ( isset( $_POST['roles'] ) && '1' == $_POST['roles'] ) {
74
-
75
- $special_fields[] = 'roles'; // add groups ##
76
-
77
- }
78
-
79
- // kick back the array via filter ##
80
- return \apply_filters( 'q/eud/export/special_fields', $special_fields );
81
-
82
- }
83
-
84
- /**
85
- * Data to exclude from export
86
- */
87
- public static function get_exclude_fields(){
88
-
89
- $exclude_fields = array (
90
- 'user_pass'
91
- , 'q_eud_exports'
92
- #, 'user_activation_key'
93
- );
94
-
95
- // kick back array via filter ##
96
- return \apply_filters( 'q/eud/export/exclude_fields', $exclude_fields );
97
-
98
- }
99
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
library/core/config.php CHANGED
@@ -29,9 +29,6 @@ class config {
29
  // load api admin fields ##
30
  self::get_admin_fields();
31
 
32
- // kick it back ##
33
- return true;
34
-
35
  }
36
 
37
  /**
29
  // load api admin fields ##
30
  self::get_admin_fields();
31
 
 
 
 
32
  }
33
 
34
  /**
library/core/export.php CHANGED
@@ -27,25 +27,39 @@ class export {
27
  */
28
  public function render(){
29
 
 
 
30
  // Check if the user clicked on the Save, Load, or Delete Settings buttons ##
31
  if (
32
  ! isset( $_POST['_wpnonce-q-eud-admin-page'] )
33
- || isset( $_POST['load_export'] )
 
 
 
 
 
 
 
 
 
 
34
  || isset( $_POST['save_export'] )
35
  || isset( $_POST['delete_export'] ) )
36
  {
37
 
38
- return false;
39
 
40
- }
41
 
42
- // Increase maximum execution time to prevent "Maximum execution time exceeded" error ##
43
- ini_set( 'max_execution_time', -1 );
44
- ini_set( 'memory_limit', -1 ); // bad idea? ##
45
 
46
  // check admin referer ##
47
  \check_admin_referer( 'q-eud-admin-page', '_wpnonce-q-eud-admin-page' );
48
 
 
 
 
 
49
  // build argument array ##
50
  $args = array(
51
  'fields' => ( isset( $_POST['user_fields'] ) && '1' == $_POST['user_fields'] ) ?
@@ -76,20 +90,25 @@ class export {
76
  // add custom args via filters ##
77
  $args = \apply_filters( 'q/eud/export/args', $args );
78
 
79
- #h::log( $args );
80
 
81
  // pre_user query ##
82
  \add_action( 'pre_user_query', [ $this, 'pre_user_query' ] );
 
 
83
  $users = \get_users( $args );
 
 
84
  \remove_action( 'pre_user_query', [ $this, 'pre_user_query' ] );
85
 
86
  // test args ##
87
- #h::log ( $users );
88
 
89
  // no users found, so chuck an error into the args array and exit the export ##
90
  if ( ! $users ) {
91
 
92
- \wp_redirect( \add_query_arg( 'error', 'empty', \wp_get_referer() ) );
 
93
  exit;
94
 
95
  }
@@ -111,14 +130,16 @@ class export {
111
  // set export filename structure ##
112
  $filename = $sitename . 'report.' . date( 'Y-m-d-H-i-s' );
113
 
 
114
  switch ( $export_method ) {
115
 
 
116
  case ( 'csv' ):
117
 
118
  // to csv ##
119
  header( 'Content-Description: File Transfer' );
120
- header( 'Content-Disposition: attachment; filename='.$filename.'.csv' );
121
- header( 'Content-Type: text/csv; charset=' . \get_option( 'blog_charset' ), true );
122
 
123
  // set a csv check flag
124
  $is_csv = true;
@@ -140,47 +161,14 @@ class export {
140
 
141
  break;
142
 
143
- /*
144
- case ( 'excel2003' ):
145
-
146
- // to xls ##
147
- header( 'Content-Description: File Transfer' );
148
- header("Content-Type: application/vnd.ms-excel");
149
- header("Content-Disposition: attachment; filename=$filename.xls");
150
- header("Pragma: no-cache");
151
- header("Expires: 0");
152
-
153
- // set a csv check flag
154
- $is_csv = false;
155
-
156
- // open xml
157
- $doc_begin = excel2003::begin();
158
-
159
- //preformat
160
- $pre = excel2003::pre();
161
-
162
- // how to seperate data ##
163
- $seperator = excel2003::seperator();
164
-
165
- // line break ##
166
- $breaker = excel2003::breaker();
167
-
168
- // close xml
169
- $doc_end = excel2003::end();
170
-
171
- break;
172
- */
173
-
174
  case ( 'excel2007' ):
175
 
176
  // to xlsx ##
177
  header( 'Content-Description: File Transfer' );
178
  header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
179
- header("Content-Disposition: attachment; filename=$filename.xlsx");
180
  header('Content-Transfer-Encoding: binary');
181
- //header('Content-Length: ' . filesize($file));
182
- //header('Cache-Control: must-revalidate');
183
- //header('Pragma: public');
184
  header("Pragma: no-cache");
185
  header("Expires: 0");
186
 
@@ -202,21 +190,14 @@ class export {
202
 
203
 
204
  // check for selected usermeta fields ##
205
- $usermeta = isset( $_POST['usermeta'] ) ? $_POST['usermeta']: '';
206
- #h::log( $usermeta );
207
- $usermeta_fields = [];
208
-
209
- // loop over each field and sanitize ## @todo - user array_map ##
210
- if ( $usermeta && is_array( $usermeta ) ) {
211
- foreach( $usermeta as $field ) {
212
- $usermeta_fields[] = \sanitize_text_field ( $field );
213
- }
214
- }
215
-
216
- #h::log( $usermeta_fields );
217
- #exit;
218
 
219
  // check for selected x profile fields ##
 
220
  $bp_fields = isset( $_POST['bp_fields'] ) ? $_POST['bp_fields'] : '';
221
  $bp_fields_passed = array();
222
  if ( $bp_fields && is_array( $bp_fields ) ) {
@@ -249,6 +230,7 @@ class export {
249
  }
250
 
251
  }
 
252
 
253
  // global wpdb object ##
254
  global $wpdb;
@@ -269,7 +251,7 @@ class export {
269
  #h::log( $fields );
270
 
271
  // build the document headers ##
272
- $headers = array();
273
 
274
  foreach ( $fields as $key => $field ) {
275
 
@@ -286,17 +268,19 @@ class export {
286
  // ditch 'em ##
287
  unset( $fields[$key] );
288
 
 
 
289
  } else {
290
 
291
- if ( $is_csv ) {
292
 
293
- $headers[] = '"' . $field . '"';
294
 
295
- } else {
296
 
297
  $headers[] = $field;
298
 
299
- }
300
 
301
  }
302
 
@@ -311,7 +295,7 @@ class export {
311
 
312
  // get the value in bytes allocated for Memory via php.ini ##
313
  // @link http://wordpress.org/support/topic/how-to-exporting-a-lot-of-data-out-of-memory-issue
314
- $memory_limit = helper::return_bytes( ini_get('memory_limit') ) * .75;
315
 
316
  // we need to disable caching while exporting because we export so much data that it could blow the memory cache
317
  // if we can't override the cache here, we'll have to clear it later...
@@ -331,23 +315,35 @@ class export {
331
 
332
  }
333
 
334
- if ( $export_method !== "excel2007" ) {
 
 
 
 
 
 
 
 
 
 
335
  // open doc wrapper.. ##
336
- echo $doc_begin;
 
 
 
337
 
338
  // echo headers ##
339
- echo $pre . implode( $seperator, $headers ) . $breaker;
340
 
341
- #h::log( $users );
342
  } else {
343
 
344
  $xlsx_header = array_flip( $headers );
345
 
346
- foreach($xlsx_header as $k => $v) {
347
  $xlsx_header[$k] = "string";
348
  }
349
 
350
- $writer->writeSheetHeader('Sheet1', $xlsx_header);
351
 
352
  }
353
 
@@ -363,9 +359,10 @@ class export {
363
  }
364
 
365
  // open up a new empty array ##
366
- $data = array();
367
 
368
  // BP loaded ? ##
 
369
  if (
370
  ! $this->plugin->get( '_bp_data_available' )
371
  && function_exists ( 'bp_is_active' )
@@ -379,8 +376,10 @@ class export {
379
  $this->plugin->set( '_bp_data_available', true ); // we only need to check for BP once ##
380
 
381
  }
 
382
 
383
  // grab all user data ##
 
384
  if (
385
  $this->plugin->get( '_bp_data_available' )
386
  && ! $bp_data = \BP_XProfile_ProfileData::get_all_for_user( $user->ID )
@@ -392,6 +391,7 @@ class export {
392
  // h::log( 'XProfile returned no data ID#: '.$user->ID );
393
 
394
  }
 
395
 
396
  // single query method - get all user_meta data ##
397
  $get_user_meta = (array)\get_user_meta( $user->ID );
@@ -400,6 +400,7 @@ class export {
400
  // loop over each field ##
401
  foreach ( $fields as $field ) {
402
 
 
403
  // check if this is a BP field ##
404
  if (
405
  isset( $bp_data )
@@ -415,16 +416,6 @@ class export {
415
  $value = \maybe_unserialize( $value['field_data'] ); // suggested by @grexican ##
416
  #$value = $value['field_data'];
417
 
418
- /**
419
- * cwjordan
420
- * after unserializing it we then
421
- * need to implode it so
422
- * that we have something readable?
423
- * Going to use :: as a separator
424
- * because that's what Buddypress Members Import
425
- * expects, but we might want to make that
426
- * configurable.
427
- */
428
  if ( is_array( $value ) ) {
429
  $value = implode( "::", $value );
430
  }
@@ -454,7 +445,10 @@ class export {
454
  );
455
 
456
  // include the user's role in the export ##
457
- } elseif ( isset( $_POST['roles'] ) && '1' == $_POST['roles'] && $field == 'roles' ) {
 
 
 
458
 
459
  // empty array ##
460
  $user_roles = [];
@@ -475,10 +469,11 @@ class export {
475
  // empty value if no role found - or flat array of user roles ##
476
  $value =
477
  ! empty( $user_roles ) ?
478
- helper::json_encode( $user_roles ) /*implode( '|', $user_roles )*/ :
479
  '';
480
 
481
  // include the user's BP group in the export ##
 
482
  } elseif ( isset( $_POST['groups'] ) && '1' == $_POST['groups'] && $field == 'groups' ) {
483
 
484
  if ( function_exists( 'groups_get_user_groups' ) ) {
@@ -495,7 +490,7 @@ class export {
495
  } else {
496
 
497
  // new empty array ##
498
- $groups = array();
499
 
500
  // loop over all groups ##
501
  foreach( $group_ids["groups"] as $group_id ) {
@@ -506,7 +501,7 @@ class export {
506
 
507
  // implode it ##
508
  // $value = implode( $groups, '|' );
509
- $value = helper::json_encode( $groups );
510
 
511
  }
512
 
@@ -516,6 +511,7 @@ class export {
516
 
517
  }
518
 
 
519
  /*
520
  } elseif (
521
  ( $field == 'bp_latest_update' && function_exists( 'bp_get_user_last_activity' ) )
@@ -551,7 +547,7 @@ class export {
551
  // ---------- cleanup and format the value, before exporting ##
552
 
553
  // the $value might be serialized, so try to unserialize ##
554
- $value = helper::unserialize( $value );
555
 
556
  // the value is an array ##
557
  if (
@@ -559,90 +555,61 @@ class export {
559
  || is_object ( $value )
560
  ){
561
 
562
- // helper::log( 'is_array || is_object' );
563
- // helper::log( $value );
564
-
565
- // recursive implode it ##
566
- // $value = helper::recursive_implode( $value );
567
-
568
- // json_encode value to object
569
- $value = helper::json_encode( $value );
570
 
571
- // } else {
 
572
 
573
  }
574
 
575
- // sanitize string value ##
576
- $value = helper::sanitize( $value );
577
 
578
- // }
 
579
 
580
- // filter $value ##
581
- // $value = \apply_filters( 'q/eud/export/value', $value, $field );
582
 
583
- // sanitize ##
584
- // $value = helper::sanitize( $value );
585
-
586
- // if no filter is added, apply default sanitiziation ##
587
- // if( has_filter( 'q/eud/export/value' ) ){
588
-
589
- // $value = \apply_filters( 'q/eud/export/value', $value );
590
-
591
- // } else {
592
-
593
- // $value = helper::format_value( $value );
594
-
595
- // }
596
-
597
- // helper::log( $value );
598
-
599
- // wrap values in quotes and add to array ##
600
- if ( $is_csv ) {
601
-
602
- // replace single-double quotes with double-double quotes, if not dealing with a JSON string ###
603
- // if( ! helper::is_json( $value ) ) {
604
-
605
- // $value = str_replace( '"', '\"', $value );
606
-
607
- // }
608
 
609
- // wrap value in double quotes ##
610
- $value = '"' . $value . '"';
611
 
612
- // helper::log( $value );
613
 
614
- // add value to $data array ##
615
- $data[] = $value;
 
 
616
 
617
- // just add to array ##
618
- } else {
619
 
620
- $data[] = $value;
621
 
622
- }
 
623
 
624
- }
625
-
626
- if ( $export_method !== "excel2007" ) {
627
-
628
- // echo row data ##
629
- echo $pre . implode( $seperator, $data ) . $breaker;
630
 
631
  } else {
632
 
 
633
  $writer->writeSheetRow( 'Sheet1', $data );
634
 
635
  }
636
 
637
  }
638
 
639
- if ( $export_method !== "excel2007" ) {
640
 
641
  // close doc wrapper..
642
- echo $doc_end;
643
 
644
  } else {
645
-
 
646
  echo $writer->writeToString();
647
 
648
  }
@@ -657,8 +624,10 @@ class export {
657
  *
658
  * @since 2.0.0
659
  */
660
- function pre_user_query( $user_search = null ){
 
661
 
 
662
  global $wpdb;
663
 
664
  $where = '';
@@ -681,6 +650,7 @@ class export {
681
  }
682
 
683
  // search by last update time of BP extended fields ##
 
684
  if (
685
  class_exists( 'BP_Xprofile_Field' )
686
  && ( isset ($_POST['updated_since_date'] ) && $_POST['updated_since_date'] != '' )
@@ -702,6 +672,7 @@ class export {
702
  $where .= $wpdb->prepare( " AND XP.field_id = %s AND XP.last_updated >= %s", $field_updated_since_id, $this->plugin->get( '_updated_since_date' ) );
703
 
704
  }
 
705
 
706
  if ( ! empty( $where ) ) {
707
 
27
  */
28
  public function render(){
29
 
30
+ // h::log( $_POST );
31
+
32
  // Check if the user clicked on the Save, Load, or Delete Settings buttons ##
33
  if (
34
  ! isset( $_POST['_wpnonce-q-eud-admin-page'] )
35
+ ){
36
+
37
+ // h::log( 'No nonce set' );
38
+
39
+ return;
40
+
41
+ }
42
+
43
+ // Check if the user clicked on the Save, Load, or Delete Settings buttons ##
44
+ if (
45
+ isset( $_POST['load_export'] )
46
  || isset( $_POST['save_export'] )
47
  || isset( $_POST['delete_export'] ) )
48
  {
49
 
50
+ // h::log( 'Not exporting, so return...' );
51
 
52
+ return;
53
 
54
+ }
 
 
55
 
56
  // check admin referer ##
57
  \check_admin_referer( 'q-eud-admin-page', '_wpnonce-q-eud-admin-page' );
58
 
59
+ // Increase maximum execution time to prevent "Maximum execution time exceeded" error ##
60
+ ini_set( 'max_execution_time', -1 );
61
+ ini_set( 'memory_limit', -1 );
62
+
63
  // build argument array ##
64
  $args = array(
65
  'fields' => ( isset( $_POST['user_fields'] ) && '1' == $_POST['user_fields'] ) ?
90
  // add custom args via filters ##
91
  $args = \apply_filters( 'q/eud/export/args', $args );
92
 
93
+ // h::log( $args );
94
 
95
  // pre_user query ##
96
  \add_action( 'pre_user_query', [ $this, 'pre_user_query' ] );
97
+
98
+ // run WP_User_Query ##
99
  $users = \get_users( $args );
100
+
101
+ // remove pre_user_query again ##
102
  \remove_action( 'pre_user_query', [ $this, 'pre_user_query' ] );
103
 
104
  // test args ##
105
+ // h::log ( $users );
106
 
107
  // no users found, so chuck an error into the args array and exit the export ##
108
  if ( ! $users ) {
109
 
110
+ \wp_redirect( \add_query_arg( 'qeud_error', 'empty', \wp_get_referer() ) );
111
+
112
  exit;
113
 
114
  }
130
  // set export filename structure ##
131
  $filename = $sitename . 'report.' . date( 'Y-m-d-H-i-s' );
132
 
133
+ // switch of export methods - csv / excel ##
134
  switch ( $export_method ) {
135
 
136
+ // CSV ##
137
  case ( 'csv' ):
138
 
139
  // to csv ##
140
  header( 'Content-Description: File Transfer' );
141
+ header( 'Content-Disposition: attachment; filename='.\esc_attr( $filename ).'.csv' );
142
+ header( 'Content-Type: text/csv; charset=' . \esc_attr( \get_option( 'blog_charset' ) ), true );
143
 
144
  // set a csv check flag
145
  $is_csv = true;
161
 
162
  break;
163
 
164
+ // Excel ##
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
165
  case ( 'excel2007' ):
166
 
167
  // to xlsx ##
168
  header( 'Content-Description: File Transfer' );
169
  header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
170
+ header("Content-Disposition: attachment; filename=".\esc_attr( $filename ).".xlsx");
171
  header('Content-Transfer-Encoding: binary');
 
 
 
172
  header("Pragma: no-cache");
173
  header("Expires: 0");
174
 
190
 
191
 
192
  // check for selected usermeta fields ##
193
+ $usermeta_fields =
194
+ isset( $_POST['usermeta'] ) && is_array( $_POST['usermeta'] ) ?
195
+ array_map( 'sanitize_text_field', $_POST['usermeta'] ) :
196
+ [];
197
+ // h::log( $usermeta_fields );
 
 
 
 
 
 
 
 
198
 
199
  // check for selected x profile fields ##
200
+ /*
201
  $bp_fields = isset( $_POST['bp_fields'] ) ? $_POST['bp_fields'] : '';
202
  $bp_fields_passed = array();
203
  if ( $bp_fields && is_array( $bp_fields ) ) {
230
  }
231
 
232
  }
233
+ */
234
 
235
  // global wpdb object ##
236
  global $wpdb;
251
  #h::log( $fields );
252
 
253
  // build the document headers ##
254
+ $headers = [];
255
 
256
  foreach ( $fields as $key => $field ) {
257
 
268
  // ditch 'em ##
269
  unset( $fields[$key] );
270
 
271
+ continue;
272
+
273
  } else {
274
 
275
+ // if ( $is_csv ) {
276
 
277
+ // $headers[] = '"' . $field . '"';
278
 
279
+ // } else {
280
 
281
  $headers[] = $field;
282
 
283
+ // }
284
 
285
  }
286
 
295
 
296
  // get the value in bytes allocated for Memory via php.ini ##
297
  // @link http://wordpress.org/support/topic/how-to-exporting-a-lot-of-data-out-of-memory-issue
298
+ $memory_limit = h::return_bytes( ini_get('memory_limit') ) * .75;
299
 
300
  // we need to disable caching while exporting because we export so much data that it could blow the memory cache
301
  // if we can't override the cache here, we'll have to clear it later...
315
 
316
  }
317
 
318
+ // escape each header value ##
319
+ $headers = array_map( function( $header ){
320
+ return esc_attr( $header );
321
+ }, $headers );
322
+
323
+ // h::log( $headers );
324
+
325
+ if (
326
+ $is_csv
327
+ ){
328
+
329
  // open doc wrapper.. ##
330
+ \esc_html_e( $doc_begin );
331
+
332
+ // get header string ##
333
+ $headers_string = $pre.implode( $seperator, $headers ).$breaker;
334
 
335
  // echo headers ##
336
+ \esc_html_e( $headers_string );
337
 
 
338
  } else {
339
 
340
  $xlsx_header = array_flip( $headers );
341
 
342
+ foreach( $xlsx_header as $k => $v ) {
343
  $xlsx_header[$k] = "string";
344
  }
345
 
346
+ $writer->writeSheetHeader( 'Sheet1', $xlsx_header );
347
 
348
  }
349
 
359
  }
360
 
361
  // open up a new empty array ##
362
+ $data = [];
363
 
364
  // BP loaded ? ##
365
+ /*
366
  if (
367
  ! $this->plugin->get( '_bp_data_available' )
368
  && function_exists ( 'bp_is_active' )
376
  $this->plugin->set( '_bp_data_available', true ); // we only need to check for BP once ##
377
 
378
  }
379
+ */
380
 
381
  // grab all user data ##
382
+ /*
383
  if (
384
  $this->plugin->get( '_bp_data_available' )
385
  && ! $bp_data = \BP_XProfile_ProfileData::get_all_for_user( $user->ID )
391
  // h::log( 'XProfile returned no data ID#: '.$user->ID );
392
 
393
  }
394
+ */
395
 
396
  // single query method - get all user_meta data ##
397
  $get_user_meta = (array)\get_user_meta( $user->ID );
400
  // loop over each field ##
401
  foreach ( $fields as $field ) {
402
 
403
+ /*
404
  // check if this is a BP field ##
405
  if (
406
  isset( $bp_data )
416
  $value = \maybe_unserialize( $value['field_data'] ); // suggested by @grexican ##
417
  #$value = $value['field_data'];
418
 
 
 
 
 
 
 
 
 
 
 
419
  if ( is_array( $value ) ) {
420
  $value = implode( "::", $value );
421
  }
445
  );
446
 
447
  // include the user's role in the export ##
448
+ } else
449
+ */
450
+
451
+ if ( isset( $_POST['roles'] ) && '1' == $_POST['roles'] && $field == 'roles' ) {
452
 
453
  // empty array ##
454
  $user_roles = [];
469
  // empty value if no role found - or flat array of user roles ##
470
  $value =
471
  ! empty( $user_roles ) ?
472
+ h::json_encode( $user_roles ) /*implode( '|', $user_roles )*/ :
473
  '';
474
 
475
  // include the user's BP group in the export ##
476
+ /*
477
  } elseif ( isset( $_POST['groups'] ) && '1' == $_POST['groups'] && $field == 'groups' ) {
478
 
479
  if ( function_exists( 'groups_get_user_groups' ) ) {
490
  } else {
491
 
492
  // new empty array ##
493
+ $groups = [];
494
 
495
  // loop over all groups ##
496
  foreach( $group_ids["groups"] as $group_id ) {
501
 
502
  // implode it ##
503
  // $value = implode( $groups, '|' );
504
+ $value = h::json_encode( $groups );
505
 
506
  }
507
 
511
 
512
  }
513
 
514
+ */
515
  /*
516
  } elseif (
517
  ( $field == 'bp_latest_update' && function_exists( 'bp_get_user_last_activity' ) )
547
  // ---------- cleanup and format the value, before exporting ##
548
 
549
  // the $value might be serialized, so try to unserialize ##
550
+ $value = h::unserialize( $value );
551
 
552
  // the value is an array ##
553
  if (
555
  || is_object ( $value )
556
  ){
557
 
558
+ // h::log( 'is_array || is_object' );
559
+ // h::log( $value );
 
 
 
 
 
 
560
 
561
+ // json_encode value to string ##
562
+ $value = h::json_encode( $value );
563
 
564
  }
565
 
566
+ // sanitize string value ##
567
+ // $value = h::sanitize( $value );
568
 
569
+ // apply generic filter to value ##
570
+ if( has_filter( 'q/eud/export/value' ) ){
571
 
572
+ $value = \apply_filters( 'q/eud/export/value', $value );
 
573
 
574
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
575
 
576
+ // add value to new key in $data array ##
577
+ $data[] = $value;
578
 
579
+ }
580
 
581
+ // escape array values ##
582
+ $data = array_map(function($x){
583
+ return esc_attr($x);
584
+ }, $data);
585
 
586
+ // h::log( $data );
 
587
 
588
+ if ( $is_csv ) {
589
 
590
+ // get row string ##
591
+ $row_string = $pre.implode( $seperator, $data ).$breaker;
592
 
593
+ // echo headers ##
594
+ \esc_html_e( $row_string );
 
 
 
 
595
 
596
  } else {
597
 
598
+ // each value in the $data array has already been escaped via esc_attr ##
599
  $writer->writeSheetRow( 'Sheet1', $data );
600
 
601
  }
602
 
603
  }
604
 
605
+ if ( $is_csv ) {
606
 
607
  // close doc wrapper..
608
+ \esc_html_e( $doc_end );
609
 
610
  } else {
611
+
612
+ // xss: all column headers and data values have been escaped previously ##
613
  echo $writer->writeToString();
614
 
615
  }
624
  *
625
  * @since 2.0.0
626
  */
627
+ public function pre_user_query( object $user_search = null ):object
628
+ {
629
 
630
+ // import WPDB object ##
631
  global $wpdb;
632
 
633
  $where = '';
650
  }
651
 
652
  // search by last update time of BP extended fields ##
653
+ /*
654
  if (
655
  class_exists( 'BP_Xprofile_Field' )
656
  && ( isset ($_POST['updated_since_date'] ) && $_POST['updated_since_date'] != '' )
672
  $where .= $wpdb->prepare( " AND XP.field_id = %s AND XP.last_updated >= %s", $field_updated_since_id, $this->plugin->get( '_updated_since_date' ) );
673
 
674
  }
675
+ */
676
 
677
  if ( ! empty( $where ) ) {
678
 
library/core/filters.php CHANGED
@@ -28,7 +28,7 @@ class filters {
28
 
29
  if ( is_null( $string ) ) {
30
 
31
- return false;
32
 
33
  }
34
 
28
 
29
  if ( is_null( $string ) ) {
30
 
31
+ return;
32
 
33
  }
34
 
library/core/get.php CHANGED
@@ -41,7 +41,7 @@ class get {
41
 
42
  // just return the user ID
43
  $user_fields = array(
44
- 'ID'
45
  );
46
 
47
  }
41
 
42
  // just return the user ID
43
  $user_fields = array(
44
+ 'ID'
45
  );
46
 
47
  }
library/core/helper.php CHANGED
@@ -269,7 +269,7 @@ class helper {
269
  $value = array_values( $value );
270
 
271
  // encode and escape ##
272
- $value = htmlspecialchars( json_encode( $value, JSON_FORCE_OBJECT ) );
273
 
274
  // self::log( $value );
275
 
@@ -293,7 +293,7 @@ class helper {
293
 
294
  foreach( $array as $element ) {
295
 
296
- $string .= $prefix . "'" . $element . "'";
297
  $prefix = ','; // prefix all remaining items with a comma ##
298
 
299
  }
269
  $value = array_values( $value );
270
 
271
  // encode and escape ##
272
+ $value = json_encode( $value, JSON_FORCE_OBJECT );
273
 
274
  // self::log( $value );
275
 
293
 
294
  foreach( $array as $element ) {
295
 
296
+ $string .= $prefix . "'" . \esc_attr( $element ) . "'";
297
  $prefix = ','; // prefix all remaining items with a comma ##
298
 
299
  }
library/core/user.php CHANGED
@@ -18,12 +18,12 @@ class user {
18
  }
19
 
20
  /**
21
- * Load up saved exports for this user
22
- * Set to public as hooked into action
23
- *
24
- * @since 0.9.6
25
- * @return Array of saved exports
26
- */
27
  public function load(){
28
 
29
  // convert outdated stored meta from q_report to q_eud_exports ##
@@ -61,12 +61,13 @@ class user {
61
  }
62
 
63
  /**
64
- * Get list of saved exports for this user
65
- *
66
- * @since 0.9.4
67
- * @return Array of saved exports
68
- */
69
- function get_user_options(){
 
70
 
71
  // get props ##
72
  $_q_eud_exports = $this->plugin->get( '_q_eud_exports' );
@@ -77,7 +78,7 @@ class user {
77
  // quick check if the array is empty ##
78
  if ( empty ( $_q_eud_exports ) ) {
79
 
80
- return false;
81
 
82
  }
83
 
@@ -100,15 +101,21 @@ class user {
100
  }
101
 
102
  /**
103
- * Check for and load stored user options
104
- *
105
- * @since 0.9.3
106
- * @return void
107
- */
108
- function get_user_options_by_export( $export = null ){
 
 
109
 
110
  // sanity check ##
111
- if ( is_null ( $export ) ) { return false; }
 
 
 
 
112
 
113
  // get props ##
114
  $_q_eud_exports = $this->plugin->get( '_q_eud_exports' );
@@ -168,20 +175,21 @@ class user {
168
  }
169
 
170
  /**
171
- * Method to store user options
172
- *
173
- * @param string $save_export Export Key name
174
- * @param array $save_options Array of export options to save
175
- * @since 0.9.3
176
- * @return void
177
- */
178
- function set_user_options( $key = null, $options = null ){
 
179
 
180
  // sanity check ##
181
  if ( is_null ( $key ) || is_null ( $options ) ) {
182
 
183
  #h::log( 'missing save values' );
184
- return false;
185
 
186
  }
187
 
@@ -192,12 +200,12 @@ class user {
192
  $_q_eud_exports = $this->plugin->get( '_q_eud_exports' );
193
 
194
  // for now, I'm simply allowing keys to be resaved - but this is not so logical ##
195
- if ( array_key_exists( $key, $_q_eud_exports ) ) {
196
 
197
  #h::log( 'key exists, skipping save' );
198
  #return false;
199
 
200
- }
201
 
202
  if ( isset( $options ) && is_array( $options ) ) {
203
 
@@ -244,13 +252,14 @@ class user {
244
  }
245
 
246
  /**
247
- * method to delete user options
248
- *
249
- * @param $key String Key name to drop from property
250
- * @since 0.9.3
251
- * @return void
252
- */
253
- function delete_user_options( $key = null ){
 
254
 
255
  // get prop ##
256
  $_q_eud_exports = $this->plugin->get( '_q_eud_exports' );
18
  }
19
 
20
  /**
21
+ * Load up saved exports for this user
22
+ * Set to public as hooked into action
23
+ *
24
+ * @since 0.9.6
25
+ * @return Array of saved exports
26
+ */
27
  public function load(){
28
 
29
  // convert outdated stored meta from q_report to q_eud_exports ##
61
  }
62
 
63
  /**
64
+ * Get list of saved exports for this user
65
+ *
66
+ * @since 0.9.4
67
+ * @return Array of saved exports
68
+ */
69
+ public function get_user_options():array
70
+ {
71
 
72
  // get props ##
73
  $_q_eud_exports = $this->plugin->get( '_q_eud_exports' );
78
  // quick check if the array is empty ##
79
  if ( empty ( $_q_eud_exports ) ) {
80
 
81
+ return [];
82
 
83
  }
84
 
101
  }
102
 
103
  /**
104
+ * Check for and load stored user options
105
+ *
106
+ * @since 0.9.3
107
+ * @param string
108
+ * @return void
109
+ */
110
+ public function get_user_options_by_export( string $export = null ):void
111
+ {
112
 
113
  // sanity check ##
114
+ if ( is_null ( $export ) ) {
115
+
116
+ return;
117
+
118
+ }
119
 
120
  // get props ##
121
  $_q_eud_exports = $this->plugin->get( '_q_eud_exports' );
175
  }
176
 
177
  /**
178
+ * Method to store user options
179
+ *
180
+ * @param string $save_export Export Key name
181
+ * @param array $save_options Array of export options to save
182
+ * @since 0.9.3
183
+ * @return void
184
+ */
185
+ public function set_user_options( $key = null, $options = null ):void
186
+ {
187
 
188
  // sanity check ##
189
  if ( is_null ( $key ) || is_null ( $options ) ) {
190
 
191
  #h::log( 'missing save values' );
192
+ return;
193
 
194
  }
195
 
200
  $_q_eud_exports = $this->plugin->get( '_q_eud_exports' );
201
 
202
  // for now, I'm simply allowing keys to be resaved - but this is not so logical ##
203
+ // if ( array_key_exists( $key, $_q_eud_exports ) ) {
204
 
205
  #h::log( 'key exists, skipping save' );
206
  #return false;
207
 
208
+ // }
209
 
210
  if ( isset( $options ) && is_array( $options ) ) {
211
 
252
  }
253
 
254
  /**
255
+ * delete user options
256
+ *
257
+ * @param $key String Key name to drop from property
258
+ * @since 0.9.3
259
+ * @return void
260
+ */
261
+ public function delete_user_options( string $key = null ):bool
262
+ {
263
 
264
  // get prop ##
265
  $_q_eud_exports = $this->plugin->get( '_q_eud_exports' );
plugin.php CHANGED
@@ -20,14 +20,14 @@ final class plugin {
20
  /**
21
  * Instance
22
  *
23
- * @var Object $instance
24
  */
25
- private static $instance;
26
 
27
  public static
28
 
29
  // current tag ##
30
- $_version = '2.2.3',
31
 
32
  // debugging control ##
33
  $_debug = \WP_DEBUG
@@ -74,26 +74,26 @@ final class plugin {
74
 
75
  // object defined once --> singleton ##
76
  if (
77
- isset( self::$instance )
78
- && NULL !== self::$instance
79
  ){
80
 
81
- return self::$instance;
82
 
83
  }
84
 
85
  // create an object, if null ##
86
- self::$instance = new self;
87
 
88
  // store instance in filter, for potential external access ##
89
  \add_filter( __NAMESPACE__.'/instance', function() {
90
 
91
- return self::$instance;
92
 
93
  });
94
 
95
  // return the object ##
96
- return self::$instance;
97
 
98
  }
99
 
@@ -195,11 +195,11 @@ final class plugin {
195
 
196
  }
197
 
198
- $plugin = isset( $_REQUEST['plugin'] ) ? $_REQUEST['plugin'] : '';
199
- \check_admin_referer( "activate-plugin_{$plugin}" );
200
 
201
  // store data about the current plugin state at activation point ##
202
- $config = [
203
  'configured' => true ,
204
  'version' => self::$_version ,
205
  'wp' => \get_bloginfo( 'version' ) ?? null ,
@@ -207,7 +207,7 @@ final class plugin {
207
  ];
208
 
209
  // activation running, so update configuration flag ##
210
- \update_option( 'plugin_export_user_data', $config, true );
211
 
212
  }
213
 
@@ -228,8 +228,8 @@ final class plugin {
228
 
229
  }
230
 
231
- $plugin = isset( $_REQUEST['plugin'] ) ? $_REQUEST['plugin'] : '';
232
- \check_admin_referer( "deactivate-plugin_{$plugin}" );
233
 
234
  // de-configure plugin ##
235
  \delete_option('plugin_export_user_data');
20
  /**
21
  * Instance
22
  *
23
+ * @var Object $_instance
24
  */
25
+ private static $_instance;
26
 
27
  public static
28
 
29
  // current tag ##
30
+ $_version = '2.2.4',
31
 
32
  // debugging control ##
33
  $_debug = \WP_DEBUG
74
 
75
  // object defined once --> singleton ##
76
  if (
77
+ isset( self::$_instance )
78
+ && NULL !== self::$_instance
79
  ){
80
 
81
+ return self::$_instance;
82
 
83
  }
84
 
85
  // create an object, if null ##
86
+ self::$_instance = new self;
87
 
88
  // store instance in filter, for potential external access ##
89
  \add_filter( __NAMESPACE__.'/instance', function() {
90
 
91
+ return self::$_instance;
92
 
93
  });
94
 
95
  // return the object ##
96
+ return self::$_instance;
97
 
98
  }
99
 
195
 
196
  }
197
 
198
+ $_plugin = isset( $_REQUEST['plugin'] ) ? \sanitize_text_field( $_REQUEST['plugin'] ) : '';
199
+ \check_admin_referer( "activate-plugin_{$_plugin}" );
200
 
201
  // store data about the current plugin state at activation point ##
202
+ $_config = [
203
  'configured' => true ,
204
  'version' => self::$_version ,
205
  'wp' => \get_bloginfo( 'version' ) ?? null ,
207
  ];
208
 
209
  // activation running, so update configuration flag ##
210
+ \update_option( 'plugin_export_user_data', $_config, true );
211
 
212
  }
213
 
228
 
229
  }
230
 
231
+ $_plugin = isset( $_REQUEST['plugin'] ) ? \sanitize_text_field($_REQUEST['plugin'] ) : '';
232
+ \check_admin_referer( "deactivate-plugin_{$_plugin}" );
233
 
234
  // de-configure plugin ##
235
  \delete_option('plugin_export_user_data');
readme.txt CHANGED
@@ -4,7 +4,7 @@ Tags: users, export, usermeta, excel
4
  Requires PHP: 7.0
5
  Requires at least: 4.8
6
  Tested up to: 5.8.2
7
- Stable tag: 2.2.3
8
  License: GPLv2
9
 
10
  Export users data and metadata to a csv or Excel file
4
  Requires PHP: 7.0
5
  Requires at least: 4.8
6
  Tested up to: 5.8.2
7
+ Stable tag: 2.2.4
8
  License: GPLv2
9
 
10
  Export users data and metadata to a csv or Excel file