}
+ /*
+ * Get simplified list of member info records.
+ *
+ * @param string $where Where clause
+ * Note the table refernces M and I.
+ *
+ * @return object Class object
+ *
+ */
+ public function getSimpleMemberInfoList($where = '')
+ {
+
+ // Save current list of fields
+ $f = $this->fields;
+
+ // Replace fields list with limited list
+ $this->fields = array(
+ 'id' => $f['id'],
+ 'member' => $f['member'],
+ 'member_name' => $f['member_name'],
+ 'member_slug' => $f['member_slug'],
+ 'member_pointer' => $f['member_pointer'],
+ 'reference_name' => $f['reference_name'],
+ 'status' => $f['status'],
+ 'create_time' => $f['create_time'],
+ 'modify_time' => $f['modify_time']
+ );
+
+ // Get the simplified list
+ $list = $this->getList($where);
+
+ // Restore full fields list
+ $this->fields = $f;
+
+ return $list;
+ }
+
}
)
);
+ // Set widget default position to right column
+ global $wp_meta_boxes;
+ $glm_dashboard_widget = $wp_meta_boxes['dashboard']['normal']['core']['glm_members_admin_dashboard_widget'];
+ unset($wp_meta_boxes['dashboard']['normal']['core']['glm_members_admin_dashboard_widget']);
+ $wp_meta_boxes['dashboard']['side']['core']['glm_members_admin_dashboard_widget'] = $glm_dashboard_widget;
+
}
}
+++ /dev/null
-/*-------------------------\r
- Simple reset\r
---------------------------*/\r
-\r
-\r
-/*\r
-*{\r
- margin:0;\r
- padding:0;\r
-}\r
-*/\r
-\r
-\r
-/*-------------------------\r
- General Styles\r
---------------------------*/\r
-\r
-/*\r
-\r
-html{\r
- background:url('../img/background_tile_2.jpg');\r
- min-height:100%;\r
- position:relative;\r
- \r
-}\r
-\r
-body{\r
- color:#fff;\r
- min-height:600px;\r
- font:14px/1.3 'Segoe UI',Arial, sans-serif;\r
-}\r
-\r
-a, a:visited {\r
- text-decoration:none;\r
- outline:none;\r
- color:#54a6de;\r
-}\r
-\r
-a:hover{\r
- text-decoration:underline;\r
-}\r
-\r
-header, footer{\r
- display:block;\r
-}\r
-\r
-*/\r
-\r
-/*-------------------------\r
- Header Styles\r
---------------------------*/\r
-\r
-/*\r
-\r
-header{\r
- background:url('../img/background_tile_1.jpg');\r
- padding:75px;\r
- position: relative;\r
-}\r
-\r
-header:before,\r
-#dropbox:before{\r
- display: block;\r
- content:'';\r
- height:4px;\r
- width:100%;\r
- background:url('../img/blue_line.jpg');\r
- position: absolute;\r
- top:0;\r
- left:0;\r
- box-shadow:0 2px 2px rgba(0,0,0,0.4);\r
-}\r
-\r
-\r
-h1{\r
- background:url('../img/logo.jpg') no-repeat top center;\r
- height:92px;\r
- overflow: hidden;\r
- text-indent: -99999px;\r
- text-align: center;\r
-}\r
-\r
-*/\r
-\r
-/*-------------------------\r
- Dropbox Element\r
---------------------------*/\r
-\r
-\r
-\r
-#dropbox{\r
-/* \r
- background:url('../img/background_tile_3.jpg');\r
- \r
- border-radius:3px;\r
- position: relative;\r
- margin:80px auto 90px;\r
- min-height: 290px;\r
- overflow: hidden;\r
- padding-bottom: 40px;\r
- width: 990px;\r
- \r
- box-shadow:0 0 4px rgba(0,0,0,0.3) inset,0 -3px 2px rgba(0,0,0,0.1);\r
-*/\r
-}\r
-\r
-\r
-#dropbox .message{\r
- font-size: 11px;\r
- text-align: center;\r
- padding-top:160px;\r
- display: block;\r
-}\r
-\r
-#dropbox .message i{\r
- color:#ccc;\r
- font-size:10px;\r
-}\r
-\r
-#dropbox:before{\r
- border-radius:3px 3px 0 0;\r
-}\r
-\r
-\r
-\r
-/*-------------------------\r
- Image Previews\r
---------------------------*/\r
-\r
-\r
-\r
-#dropbox .preview{\r
- width:245px;\r
- height: 215px;\r
- float:left;\r
- margin: 55px 0 0 60px;\r
- position: relative;\r
- text-align: center;\r
-}\r
-\r
-#dropbox .preview img{\r
- max-width: 240px;\r
- max-height:180px;\r
- border:3px solid #fff;\r
- display: block;\r
- \r
- box-shadow:0 0 2px #000;\r
-}\r
-\r
-#dropbox .imageHolder{\r
- display: inline-block;\r
- position:relative;\r
-}\r
-\r
-#dropbox .uploaded{\r
- position: absolute;\r
- top:0;\r
- left:0;\r
- height:100%;\r
- width:100%;\r
- background: url('../img/done.png') no-repeat center center rgba(255,255,255,0.5);\r
- display: none;\r
-}\r
-\r
-#dropbox .preview.done .uploaded{\r
- display: block;\r
-}\r
-\r
-\r
-\r
-/*-------------------------\r
- Progress Bars\r
---------------------------*/\r
-\r
-\r
-\r
-#dropbox .progressHolder{\r
- position: absolute;\r
- background-color:#252f38;\r
- height:12px;\r
- width:100%;\r
- left:0;\r
- bottom: 0;\r
- \r
- box-shadow:0 0 2px #000;\r
-}\r
-\r
-#dropbox .progress{\r
- background-color:#2586d0;\r
- position: absolute;\r
- height:100%;\r
- left:0;\r
- width:0;\r
- \r
- box-shadow: 0 0 1px rgba(255, 255, 255, 0.4) inset;\r
- \r
- -moz-transition:0.25s;\r
- -webkit-transition:0.25s;\r
- -o-transition:0.25s;\r
- transition:0.25s;\r
-}\r
-\r
-#dropbox .preview.done .progress{\r
- width:100% !important;\r
-}\r
-\r
-\r
-\r
-/*----------------------------\r
- The Footer\r
------------------------------*/\r
-\r
-/*\r
-\r
-footer{\r
- display:block;\r
- background-color: #151517;\r
- \r
- position:fixed;\r
- width:100%;\r
- height:70px;\r
- bottom:0;\r
- left:0;\r
- z-index: 100000;\r
- \r
- box-shadow: 0 -1px 2px #171717;\r
- -webkit-box-shadow: 0 -1px 2px #171717;\r
- -moz-box-shadow: 0 -1px 2px #171717;\r
-}\r
-\r
-footer h2{\r
- font-size:20px;\r
- font-weight:normal;\r
- left:50%;\r
- margin-left:-400px;\r
- padding:22px 0;\r
- position:absolute;\r
- width: 540px;\r
- color:#eee;\r
-}\r
-\r
-footer a.tzine,a.tzine:visited{\r
- background:url("../img/tzine.png") no-repeat right top;\r
- border:none;\r
- text-decoration:none;\r
- color:#FCFCFC;\r
- font-size:12px;\r
- height:70px;\r
- left:50%;\r
- line-height:31px;\r
- margin:23px 0 0 110px;\r
- position:absolute;\r
- top:0;\r
- width:290px;\r
-}\r
-*/
\ No newline at end of file
+++ /dev/null
-/*\r
- * Default text - jQuery plugin for html5 dragging files from desktop to browser\r
- *\r
- * Author: Weixi Yen\r
- *\r
- * Email: [Firstname][Lastname]@gmail.com\r
- * \r
- * Copyright (c) 2010 Resopollution\r
- * \r
- * Licensed under the MIT license:\r
- * http://www.opensource.org/licenses/mit-license.php\r
- *\r
- * Project home:\r
- * http://www.github.com/weixiyen/jquery-filedrop\r
- *\r
- * Version: 0.1.0\r
- *\r
- * Features:\r
- * Allows sending of extra parameters with file.\r
- * Works with Firefox 3.6+\r
- * Future-compliant with HTML5 spec (will work with Webkit browsers and IE9)\r
- * Usage:\r
- * See README at project homepage\r
- *\r
- */\r
-(function($){\r
-\r
- jQuery.event.props.push("dataTransfer");\r
- var opts = {},\r
- default_opts = {\r
- url: '',\r
- refresh: 1000,\r
- paramname: 'userfile',\r
- maxfiles: 25,\r
- maxfilesize: 1, // MBs\r
- data: {},\r
- drop: empty,\r
- dragEnter: empty,\r
- dragOver: empty,\r
- dragLeave: empty,\r
- docEnter: empty,\r
- docOver: empty,\r
- docLeave: empty,\r
- beforeEach: empty,\r
- afterAll: empty,\r
- rename: empty,\r
- error: function(err, file, i){alert(err);},\r
- uploadStarted: empty,\r
- uploadFinished: empty,\r
- progressUpdated: empty,\r
- speedUpdated: empty\r
- },\r
- errors = ["BrowserNotSupported", "TooManyFiles", "FileTooLarge"],\r
- doc_leave_timer,\r
- stop_loop = false,\r
- files_count = 0,\r
- files;\r
-\r
- $.fn.filedrop = function(options) {\r
- opts = $.extend( {}, default_opts, options );\r
- \r
- this.bind('drop', drop).bind('dragenter', dragEnter).bind('dragover', dragOver).bind('dragleave', dragLeave);\r
- $(document).bind('drop', docDrop).bind('dragenter', docEnter).bind('dragover', docOver).bind('dragleave', docLeave);\r
- };\r
- \r
- function drop(e) {\r
- opts.drop(e);\r
- files = e.dataTransfer.files;\r
- if (files === null || files === undefined) {\r
- opts.error(errors[0]);\r
- return false;\r
- }\r
- \r
- files_count = files.length;\r
- upload();\r
- e.preventDefault();\r
- return false;\r
- }\r
- \r
- function getBuilder(filename, filedata, boundary) {\r
- var dashdash = '--',\r
- crlf = '\r\n',\r
- builder = '';\r
-\r
- $.each(opts.data, function(i, val) {\r
- if (typeof val === 'function') val = val();\r
- builder += dashdash;\r
- builder += boundary;\r
- builder += crlf;\r
- builder += 'Content-Disposition: form-data; name="'+i+'"';\r
- builder += crlf;\r
- builder += crlf;\r
- builder += val;\r
- builder += crlf;\r
- });\r
- \r
- builder += dashdash;\r
- builder += boundary;\r
- builder += crlf;\r
- builder += 'Content-Disposition: form-data; name="'+opts.paramname+'"';\r
- builder += '; filename="' + filename + '"';\r
- builder += crlf;\r
- \r
- builder += 'Content-Type: application/octet-stream';\r
- builder += crlf;\r
- builder += crlf; \r
- \r
- builder += filedata;\r
- builder += crlf;\r
- \r
- builder += dashdash;\r
- builder += boundary;\r
- builder += dashdash;\r
- builder += crlf;\r
- return builder;\r
- }\r
-\r
- function progress(e) {\r
- if (e.lengthComputable) {\r
- var percentage = Math.round((e.loaded * 100) / e.total);\r
- if (this.currentProgress != percentage) {\r
- \r
- this.currentProgress = percentage;\r
- opts.progressUpdated(this.index, this.file, this.currentProgress);\r
- \r
- var elapsed = new Date().getTime();\r
- var diffTime = elapsed - this.currentStart;\r
- if (diffTime >= opts.refresh) {\r
- var diffData = e.loaded - this.startData;\r
- var speed = diffData / diffTime; // KB per second\r
- opts.speedUpdated(this.index, this.file, speed);\r
- this.startData = e.loaded;\r
- this.currentStart = elapsed;\r
- }\r
- }\r
- }\r
- }\r
- \r
- \r
- \r
- function upload() {\r
- stop_loop = false;\r
- if (!files) {\r
- opts.error(errors[0]);\r
- return false;\r
- }\r
- var filesDone = 0,\r
- filesRejected = 0;\r
- \r
- if (files_count > opts.maxfiles) {\r
- opts.error(errors[1]);\r
- return false;\r
- }\r
-\r
- for (var i=0; i<files_count; i++) {\r
- if (stop_loop) return false;\r
- try {\r
- if (beforeEach(files[i]) != false) {\r
- if (i === files_count) return;\r
- var reader = new FileReader(),\r
- max_file_size = 1048576 * opts.maxfilesize;\r
- \r
- reader.index = i;\r
- if (files[i].size > max_file_size) {\r
- opts.error(errors[2], files[i], i);\r
- filesRejected++;\r
- continue;\r
- }\r
- \r
- reader.onloadend = send;\r
- reader.readAsBinaryString(files[i]);\r
- } else {\r
- filesRejected++;\r
- }\r
- } catch(err) {\r
- opts.error(errors[0]);\r
- return false;\r
- }\r
- }\r
- \r
- function send(e) {\r
- // Sometimes the index is not attached to the\r
- // event object. Find it by size. Hack for sure.\r
- if (e.target.index == undefined) {\r
- e.target.index = getIndexBySize(e.total);\r
- }\r
- \r
- var xhr = new XMLHttpRequest(),\r
- upload = xhr.upload,\r
- file = files[e.target.index],\r
- index = e.target.index,\r
- start_time = new Date().getTime(),\r
- boundary = '------multipartformboundary' + (new Date).getTime(),\r
- builder;\r
- \r
- newName = rename(file.name);\r
- if (typeof newName === "string") {\r
- builder = getBuilder(newName, e.target.result, boundary);\r
- } else {\r
- builder = getBuilder(file.name, e.target.result, boundary);\r
- }\r
- \r
- upload.index = index;\r
- upload.file = file;\r
- upload.downloadStartTime = start_time;\r
- upload.currentStart = start_time;\r
- upload.currentProgress = 0;\r
- upload.startData = 0;\r
- upload.addEventListener("progress", progress, false);\r
- \r
- xhr.open("POST", opts.url, true);\r
- xhr.setRequestHeader('content-type', 'multipart/form-data; boundary=' \r
- + boundary);\r
- \r
- xhr.sendAsBinary(builder); \r
- \r
- opts.uploadStarted(index, file, files_count); \r
- \r
- xhr.onload = function() { \r
- if (xhr.responseText) {\r
- var now = new Date().getTime(),\r
- timeDiff = now - start_time,\r
- result = opts.uploadFinished(index, file, jQuery.parseJSON(xhr.responseText), timeDiff);\r
- filesDone++;\r
- if (filesDone == files_count - filesRejected) {\r
- afterAll();\r
- }\r
- if (result === false) stop_loop = true;\r
- }\r
- };\r
- }\r
- }\r
- \r
- function getIndexBySize(size) {\r
- for (var i=0; i < files_count; i++) {\r
- if (files[i].size == size) {\r
- return i;\r
- }\r
- }\r
- \r
- return undefined;\r
- }\r
- \r
- function rename(name) {\r
- return opts.rename(name);\r
- }\r
- \r
- function beforeEach(file) {\r
- return opts.beforeEach(file);\r
- }\r
- \r
- function afterAll() {\r
- return opts.afterAll();\r
- }\r
- \r
- function dragEnter(e) {\r
- clearTimeout(doc_leave_timer);\r
- e.preventDefault();\r
- opts.dragEnter(e);\r
- }\r
- \r
- function dragOver(e) {\r
- clearTimeout(doc_leave_timer);\r
- e.preventDefault();\r
- opts.docOver(e);\r
- opts.dragOver(e);\r
- }\r
- \r
- function dragLeave(e) {\r
- clearTimeout(doc_leave_timer);\r
- opts.dragLeave(e);\r
- e.stopPropagation();\r
- }\r
- \r
- function docDrop(e) {\r
- e.preventDefault();\r
- opts.docLeave(e);\r
- return false;\r
- }\r
- \r
- function docEnter(e) {\r
- clearTimeout(doc_leave_timer);\r
- e.preventDefault();\r
- opts.docEnter(e);\r
- return false;\r
- }\r
- \r
- function docOver(e) {\r
- clearTimeout(doc_leave_timer);\r
- e.preventDefault();\r
- opts.docOver(e);\r
- return false;\r
- }\r
- \r
- function docLeave(e) {\r
- doc_leave_timer = setTimeout(function(){\r
- opts.docLeave(e);\r
- }, 200);\r
- }\r
- \r
- function empty(){}\r
- \r
- try {\r
- if (XMLHttpRequest.prototype.sendAsBinary) return;\r
- XMLHttpRequest.prototype.sendAsBinary = function(datastr) {\r
- function byteValue(x) {\r
- return x.charCodeAt(0) & 0xff;\r
- }\r
- var ords = Array.prototype.map.call(datastr, byteValue);\r
- var ui8a = new Uint8Array(ords);\r
- this.send(ui8a.buffer);\r
- }\r
- } catch(e) {}\r
- \r
-})(jQuery);
\ No newline at end of file
+++ /dev/null
-$(function(){\r
- \r
- var dropbox = $('#dropbox'),\r
- message = $('.message', dropbox);\r
- \r
- dropbox.filedrop({\r
- // The name of the $_FILES entry:\r
- paramname:'pic',\r
- \r
- maxfiles: 5,\r
- maxfilesize: 2,\r
- url: 'post_file.php',\r
- \r
- uploadFinished:function(i,file,response){\r
- $.data(file).addClass('done');\r
- // response is the JSON object that post_file.php returns\r
- },\r
- \r
- error: function(err, file) {\r
- switch(err) {\r
- case 'BrowserNotSupported':\r
- showMessage('Your browser does not support HTML5 file uploads!');\r
- break;\r
- case 'TooManyFiles':\r
- alert('Too many files! Please select 5 at most! (configurable)');\r
- break;\r
- case 'FileTooLarge':\r
- alert(file.name+' is too large! Please upload files up to 2mb (configurable).');\r
- break;\r
- default:\r
- break;\r
- }\r
- },\r
- \r
- // Called before each upload is started\r
- beforeEach: function(file){\r
- if(!file.type.match(/^image\//)){\r
- alert('Only images are allowed!');\r
- \r
- // Returning false will cause the\r
- // file to be rejected\r
- return false;\r
- }\r
- },\r
- \r
- uploadStarted:function(i, file, len){\r
- createImage(file);\r
- },\r
- \r
- progressUpdated: function(i, file, progress) {\r
- $.data(file).find('.progress').width(progress);\r
- }\r
- \r
- });\r
- \r
- var template = '<div class="preview">'+\r
- '<span class="imageHolder">'+\r
- '<img />'+\r
- '<span class="uploaded"></span>'+\r
- '</span>'+\r
- '<div class="progressHolder">'+\r
- '<div class="progress"></div>'+\r
- '</div>'+\r
- '</div>'; \r
- \r
- \r
- function createImage(file){\r
-\r
- var preview = $(template), \r
- image = $('img', preview);\r
- \r
- var reader = new FileReader();\r
- \r
- image.width = 100;\r
- image.height = 100;\r
- \r
- reader.onload = function(e){\r
- \r
- // e.target.result holds the DataURL which\r
- // can be used as a source of the image:\r
- \r
- image.attr('src',e.target.result);\r
- };\r
- \r
- // Reading the file as a DataURL. When finished,\r
- // this will trigger the onload function above:\r
- reader.readAsDataURL(file);\r
- \r
- message.hide();\r
- preview.appendTo(dropbox);\r
- \r
- // Associating a preview container\r
- // with the file, using jQuery's $.data():\r
- \r
- $.data(file,preview);\r
- }\r
-\r
- function showMessage(msg){\r
- message.html(msg);\r
- }\r
-\r
-});
\ No newline at end of file
+++ /dev/null
-<?php\r
-\r
-// If you want to ignore the uploaded files, \r
-// set $demo_mode to true;\r
-\r
-$demo_mode = false;\r
-$upload_dir = 'uploads/';\r
-$allowed_ext = array('jpg','jpeg','png','gif');\r
-\r
-\r
-if(strtolower($_SERVER['REQUEST_METHOD']) != 'post'){\r
- exit_status('Error! Wrong HTTP method!');\r
-}\r
-\r
-\r
-if(array_key_exists('pic',$_FILES) && $_FILES['pic']['error'] == 0 ){\r
- \r
- $pic = $_FILES['pic'];\r
-\r
- if(!in_array(get_extension($pic['name']),$allowed_ext)){\r
- exit_status('Only '.implode(',',$allowed_ext).' files are allowed!');\r
- } \r
-\r
- if($demo_mode){\r
- \r
- // File uploads are ignored. We only log them.\r
- \r
- $line = implode(' ', array( date('r'), $_SERVER['REMOTE_ADDR'], $pic['size'], $pic['name']));\r
- file_put_contents('log.txt', $line.PHP_EOL, FILE_APPEND);\r
- \r
- exit_status('Uploads are ignored in demo mode.');\r
- }\r
- \r
- \r
- // Move the uploaded file from the temporary \r
- // directory to the uploads folder:\r
- \r
- if(move_uploaded_file($pic['tmp_name'], $upload_dir.$pic['name'])){\r
- exit_status('File was uploaded successfuly!');\r
- }\r
- \r
-}\r
-\r
-exit_status('Something went wrong with your upload!');\r
-\r
-\r
-// Helper functions\r
-\r
-function exit_status($str){\r
- echo json_encode(array('status'=>$str));\r
- exit;\r
-}\r
-\r
-function get_extension($file_name){\r
- $ext = explode('.', $file_name);\r
- $ext = array_pop($ext);\r
- return strtolower($ext);\r
-}\r
-?>
\ No newline at end of file
+++ /dev/null
-<!DOCTYPE html>\r
-<html>\r
- <head>\r
- <meta charset="utf-8" />\r
- <title>HTML5 File Drag and Drop Upload with jQuery and PHP | Tutorialzine Demo</title>\r
- \r
- <!-- Our CSS stylesheet file -->\r
- <link rel="stylesheet" href="assets/css/styles.css" />\r
- \r
- <!--[if lt IE 9]>\r
- <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>\r
- <![endif]-->\r
- </head>\r
- \r
- <body>\r
- \r
- <header>\r
- <h1>HTML5 File Upload with jQuery and PHP</h1>\r
- </header>\r
- \r
- <div id="dropbox">\r
- <span class="message">Drop images here to upload. <br /><i>(they will only be visible to you)</i></span>\r
- </div>\r
- \r
- <footer>\r
- <h2>HTML5 File Upload with jQuery and PHP</h2>\r
- <a class="tzine" href="http://tutorialzine.com/2011/09/html5-file-upload-jquery-php/">Read & Download on</a>\r
- </footer>\r
- \r
- <!-- Including The jQuery Library -->\r
- <script src="http://code.jquery.com/jquery-1.6.3.min.js"></script>\r
- \r
- <!-- Including the HTML5 Uploader plugin -->\r
- <script src="assets/js/jquery.filedrop.js"></script>\r
- \r
- <!-- The main script file -->\r
- <script src="assets/js/script.js"></script>\r
- \r
- </body>\r
-</html>\r
-\r
$MemberInfo = new GlmDataMemberInfo($this->wpdb, $this->config);
$membersPending = $MemberInfo->getStats('status = '.$this->config['status_numb']['Pending']);
+ // Get member information records with bad or no lat/lon
+ $hideArchived = " T.status != ".$this->config['status_numb']['Archived'];
+ $badLatLonList = $MemberInfo->getSimpleMemberInfoList($hideArchived.' AND (T.lat = 0 OR T.lon = 0)');
+ $haveBadLatLon = (count($badLatLonList) > 0);
+
// If there's members with pending information, list them
$pendingList = false;
if ($membersPending > 0) {
'numbMembers' => $stats,
'membersList' => $membersList,
'membersPending' => $membersPending,
+ 'haveBadLatLon' => $haveBadLatLon,
+ 'badLatLonList' => $badLatLonList,
'haveMemberTypes' => $haveMemberTypes,
'haveCategories' => $haveCategories,
'haveAccommodationTypes' => $haveAccommodationTypes,
*/
// Import Members
+ $numbMembersActive = 0;
+ $numbMembersInactive = 0;
while (list ($key, $val) = each ($member) ) {
+ // Determine if member is active and set access accordingly
+ if ($val['active'] == 't') {
+
+ // Member is active, so set to active-moderated
+ $access = $this->config['memb_access_numb']['Moderated'];
+ $numbMembersActive++;
+
+ } else {
+
+ // Member is not active, so set to no display no access
+ $access = $this->config['memb_access_numb']['NotDisplayed'];
+ $numbMembersInactive++;
+
+ }
+
+ // Add main member record
$res = $this->wpdb->insert(
GLM_MEMBERS_PLUGIN_DB_PREFIX.'members',
array(
- 'access' => $this->config['memb_access_numb']['Moderated'],
+ 'access' => $access,
'member_type' => $defaultMemberType,
'created' => date('Y-m-d'),
'name' => $val['member_name'],
$templateData['numbStates'] = count($state);
$templateData['numbRegions'] = count($region);
$templateData['numbMembers'] = count($member);
+ $templateData['numbMembersActive'] = $numbMembersActive;
+ $templateData['numbMembersInactive'] = $numbMembersInactive;
$templateData['numbCategories'] = count($catTrans);
$templateData['numbCategoryMembers'] = count($membCat);
$templateData['numbAmenities'] = count($amenity);
$MemberInfo = new GlmDataMemberInfo($this->wpdb, $this->config);
$membersPending = $MemberInfo->getStats('status = '.$this->config['status_numb']['Pending']);
+ // Get member information records with bad or no lat/lon
+ $hideArchived = " T.status != ".$this->config['status_numb']['Archived'];
+ $badLatLonList = $MemberInfo->getSimpleMemberInfoList($hideArchived.' AND (T.lat = 0 OR T.lon = 0)');
+ $haveBadLatLon = (count($badLatLonList) > 0);
+
// If there's members with pending information, list them
$pendingList = false;
if ($membersPending > 0) {
- $pendingList = $MemberInfo->getList('status = '.$this->config['status_numb']['Pending']);
+ $pendingList = $MemberInfo->getSimpleMemberInfoList('status = '.$this->config['status_numb']['Pending']);
}
// Compile template data
'numbMembers' => $stats,
'membersList' => $membersList,
'membersPending' => $membersPending,
+ 'haveBadLatLon' => $haveBadLatLon,
+ 'badLatLonList' => $badLatLonList,
'haveMemberTypes' => $haveMemberTypes,
'haveCategories' => $haveCategories,
'haveAccommodationTypes' => $haveAccommodationTypes,
$where .= " AND T.access != ".$this->config['memb_access_numb']['Archived'];
}
+ // Get a list of categories for filtering
+ require_once(GLM_MEMBERS_PLUGIN_CLASS_PATH.'/data/dataCategories.php');
+ $Categories = new GlmDataCategories($this->wpdb, $this->config);
+ $categories = $Categories->getListSortedParentChild(false);
+
+ // Check if there is a category filter
+ if (isset($_REQUEST['filterCategory'])) {
+ $filterCat = ($_REQUEST['filterCategory'] - 0);
+ $where .= " AND T.id in (
+ SELECT DISTINCT(I.member)
+ FROM ".GLM_MEMBERS_PLUGIN_DB_PREFIX."member_info I,
+ ".GLM_MEMBERS_PLUGIN_DB_PREFIX."category_member_info M,
+ ".GLM_MEMBERS_PLUGIN_DB_PREFIX."categories C
+ WHERE I.id = M.member_info
+ AND (
+ M.category = $filterCat
+ OR (C.parent = $filterCat AND M.category = C.id)
+ )
+ )";
+ }
+
+
// Get a current list of members
$list = $this->getList($where);
$templateData = array(
'haveMembers' => $haveMembers,
'members' => $list,
+ 'categories' => $categories,
'haveFilter' => $haveFilter,
'filterArchived' => $filterArchived,
'filterPending' => $filterPending,
+ 'filterCat' => $filterCat,
'filterName' => stripslashes($filterName)
// 'canEdit' => $canEdit
);
<tr><th>Number of Members Listed: </th><td><a href="{$adminURL}?page=glm-members-admin-menu-members-list" class="glm-right">List Members</a><span class="glm-left">{$numbMembers}</span></td></tr>
</table>
-{if $membersPending}
+{if $haveBadLatLon}
<hr>
- <h4><span class="glm-error">Pending Member Information</span></h4>
+ <h4><span class="glm-error">Records with Bad Map Locations</span></h4>
<table class="wp-list-table widefat fixed posts glm-admin-table"">
- <thead>
+ <tbody>
+ {assign var="i" value="0"}
+ {foreach $badLatLonList as $p}
+ {if $i++ is odd by 1}
<tr>
- <th>Member Name</th>
- <th>Reference Name</th>
+ {else}
+ <tr class="alternate">
+ {/if}
+ <td>
+ <a href="{$adminURL}?page=glm-members-admin-menu-member&glm_action=memberInfo&member={$p.member_pointer}&id={$p.id}}">{$p.member}</a>
+ </td>
</tr>
- </thead>
+ {/foreach}
+ </tbody>
+ </table>
+{/if}
+
+{if $membersPending}
+ <hr>
+ <h4><span class="glm-error">Pending Member Information</span></h4>
+
+ <table class="wp-list-table widefat fixed posts glm-admin-table"">
<tbody>
{assign var="i" value="0"}
{foreach $pendingList as $p}
<td>
<a href="{$adminURL}?page=glm-members-admin-menu-member&glm_action=memberInfo&member={$p.member_pointer}&id={$p.id}}">{$p.member}</a>
</td>
- <td>
- {$p.reference_name}
- </td>
</tr>
{/foreach}
</tbody>
<tr><th>States:</th><td>{$numbStates}</td></tr>
<tr><th>Regions:</th><td>{$numbRegions}</td></tr>
<tr><th>Members:</th><td>{$numbMembers}</td></tr>
+ <tr><th>Members Active:</th><td>{$numbMembersActive}</td></tr>
+ <tr><th>Members Inactive:</th><td>{$numbMembersInactive}</td></tr>
<tr><th>Categories:</th><td>{$numbCategories}</td></tr>
<tr><th>Member Category Entires:</th><td>{$numbCategoryMembers}</td></tr>
<tr><th>Amenities:</th><td>{$numbAmenities}</td></tr>
<p> </p>
- <div>
- <h3>Member Information Versions</h3>
+ <a href="{$thisURL}?page={$thisPage}&glm_action=memberInfo&member={$memberID}" class="button-primary glm-button glm-right">Add New Member Information Version</a>
+ <br clear="all">
+ <p>
+ <h3 class="glm-left">Member Information Versions</h3>
<span class="glm-right">
<p>
<input type="checkbox" id="showArchived"{if $showArchived} checked="checked"{/if}> Show archived information
</p>
</span>
- </div>
- {if $haveMember}
- {if $haveInfoRecords}
-
- <a href="{$thisURL}?page={$thisPage}&glm_action=memberInfo&member={$memberID}" class="button-primary glm-button glm-right">Add New Member Information Version</a>
-
- {if $noActive}
- <h3 class="glm-error">There is no active information for this member.</h3>
- {/if}
-
+ </p>
+
<table class="wp-list-table widefat fixed posts glm-admin-table"">
<thead>
<tr>
</tr>
</thead>
<tbody>
+
+ {if $haveMember}
+ {if $haveInfoRecords}
+
{assign var="i" value="0"}
{foreach $memberInfoRecords as $m}
{if $i++ is odd by 1}
</td>
</tr>
{/foreach}
- </tbody>
- </table>
{else}
- <h3 class="glm-notice">You do not yet have any member information entered.</h3>
- <p><a href="{$thisURL}?page={$thisPage}&glm_action=memberInfo&member={$memberID}">Click here too start entering information for this member.</a></p>
- {/if}
+ <tr><td colspan="5"><a href="{$thisURL}?page={$thisPage}&glm_action=memberInfo&member={$memberID}">Click here too start entering information for this member.</a></td></tr>
{/if}
+ </tbody>
+ </table>
+ {/if}
{else}
<h3 class="glm-error">You do not have any Member Types setup.</h3>
</form>
- <!-- Include scripts for html5-File-Upload -->
-
<script type="text/javascript">
jQuery(document).ready(function($) {
<table class="glm-admin-table">
<tr><th>Number of Members Listed: </th><td>{$numbMembers}</td></tr>
- <tr>
- <th{if $membersPending} class="glm-notice"{/if}>Pending Member Information: </th><td>{$membersPending}</td>
- </tr>
</table>
+{if $haveBadLatLon}
+ <h3>Member Information with Bad Map Location Information</h3>
+
+ <table class="wp-list-table widefat fixed posts glm-admin-table"">
+ <thead>
+ <tr>
+ <th>Member Name</th>
+ <th>Last Updated</th>
+ <th>Reference Name</th>
+ <th> </th>
+ </tr>
+ </thead>
+ <tbody>
+ {assign var="i" value="0"}
+ {foreach $badLatLonList as $p}
+ {if $i++ is odd by 1}
+ <tr>
+ {else}
+ <tr class="alternate">
+ {/if}
+ <td>
+ <a href="{$thisURL}?page=glm-members-admin-menu-member&glm_action=memberInfo&member={$p.member_pointer}&id={$p.id}}">{$p.member}</a>
+ </td>
+ <td>
+ {$p.modify_time.datetime}
+ </td>
+ <td>
+ {$p.reference_name}
+ </td>
+ <td>
+ <a href="{$thisURL}?page=glm-members-admin-menu-member&glm_action=memberInfo&member={$p.member_pointer}&id={$p.id}}" class="button-primary glm-right">Manage</a>
+ </td>
+ </tr>
+ {/foreach}
+ </tbody>
+ </table>
+{/if}
+
{if $membersPending}
- <h2>Pending Member Information</h2>
+ <h3>Pending Member Information</h3>
<table class="wp-list-table widefat fixed posts glm-admin-table"">
<thead>
<form class="glm-right" onSubmit="return false;">
<span{if $haveFilter} class="glm-notice"{/if}><b>List Filters:</b> </span>
- <span class="glm-item-container"><input type="checkbox" id="filterArchived" class="listFilter"{if $filterArchived} checked{/if}>Show Archived</span>
- <span class="glm-item-container"><input type="checkbox" id="filterPending" class="listFilter"{if $filterPending} checked{/if}>Only show Pending Information</span>
- <span class="glm-item-container"><input type="text" id="filterName" class="listFilter" value="{$filterName}"> Search</span>
+ <input type="checkbox" id="filterArchived" class="listFilter"{if $filterArchived} checked{/if}>Show Archived
+ <input type="checkbox" id="filterPending" class="listFilter"{if $filterPending} checked{/if}>Only show Pending Information
+ <select id="filterCategories" class="listFilter">
+ <option id="categoryNone" value=""></option>
+ {foreach from=$categories item=v}
+ <option value="{$v.id}" data-parent="{$v.parent.name}"{if $v.id == $filterCat} selected{/if}>
+ {if $v.parent.value} {/if}{$v.name}
+ </option>
+ {/foreach}
+ </select>
+ Categories
+
+ <input type="text" id="filterName" class="listFilter" value="{$filterName}"> Search
</form>
<h2>List of Members</h2>
filter += '&filterPending=true';
}
+ // Check for category filter
+ cat = $("#filterCategories").val();
+ if (cat != '') {
+ filter += '&filterCategory=' + cat;
+ }
+
// Check for member name filter
var filterName = $("#filterName").val();
if (filterName != '') {