From ac8d83cb715effb9034260cf31eabcbe7de2f9e7 Mon Sep 17 00:00:00 2001 From: Steve Sutton Date: Tue, 22 May 2018 16:34:33 -0400 Subject: [PATCH] End of day commit I have the list view showing the leads. will need to add paging and alpha sorting I added the jqueryui tabs have been working on the contacts and notes tabs. These are done using ajax calls. the edit is done by just a form submit. --- assets/cancel.png | Bin 0 -> 587 bytes assets/goCompany.png | Bin 0 -> 3032 bytes assets/goContact.png | Bin 0 -> 3140 bytes assets/logo.png | Bin 0 -> 32920 bytes assets/new.png | Bin 0 -> 4520 bytes assets/newLead.png | Bin 0 -> 3106 bytes assets/tlSave.png | Bin 0 -> 2987 bytes assets/travelLeads.png | Bin 0 -> 3887 bytes assets/travelToList.png | Bin 0 -> 2714 bytes classes/data/dataContacts.php | 181 +++++++ classes/data/dataLeads.php | 265 +++++++++ classes/data/dataNotes.php | 173 ++++++ config/plugin.ini | 8 +- css/admin.css.save | 287 ++++++++++ index.php | 14 +- models/admin/ajax/travelContacts.php | 108 ++++ models/admin/ajax/travelNotes.php | 110 ++++ models/admin/travel/index.php | 503 ++++++++++++++++++ setup/adminMenus.php | 25 + .../create_database_V0.0.1.sql | 22 +- setup/databaseScripts/dbVersions.php | 2 +- setup/validActions.php | 10 +- views/admin/ajax/contacts/list.html | 16 + views/admin/ajax/notes/list.html | 14 + views/admin/travel/edit.html | 177 ++++++ views/admin/travel/footer.html | 2 + views/admin/travel/header.html | 3 + views/admin/travel/index.html | 31 ++ views/admin/travel/searchForm.html | 30 ++ 29 files changed, 1954 insertions(+), 27 deletions(-) create mode 100755 assets/cancel.png create mode 100755 assets/goCompany.png create mode 100755 assets/goContact.png create mode 100644 assets/logo.png create mode 100755 assets/new.png create mode 100755 assets/newLead.png create mode 100755 assets/tlSave.png create mode 100755 assets/travelLeads.png create mode 100755 assets/travelToList.png create mode 100644 classes/data/dataContacts.php create mode 100644 classes/data/dataLeads.php create mode 100644 classes/data/dataNotes.php create mode 100755 css/admin.css.save create mode 100644 models/admin/ajax/travelContacts.php create mode 100644 models/admin/ajax/travelNotes.php create mode 100644 models/admin/travel/index.php create mode 100644 views/admin/ajax/contacts/list.html create mode 100644 views/admin/ajax/notes/list.html create mode 100644 views/admin/travel/edit.html create mode 100644 views/admin/travel/footer.html create mode 100644 views/admin/travel/header.html create mode 100644 views/admin/travel/index.html create mode 100644 views/admin/travel/searchForm.html diff --git a/assets/cancel.png b/assets/cancel.png new file mode 100755 index 0000000000000000000000000000000000000000..c149c2bc017d5ce5a8ae9330dd7dbd012482e0f4 GIT binary patch literal 587 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 literal 0 HcmV?d00001 diff --git a/assets/logo.png b/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ecab363f0bdc7547943729f25123bc32758fa76d GIT binary patch literal 32920 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 CuXauV literal 0 HcmV?d00001 diff --git a/assets/newLead.png b/assets/newLead.png new file mode 100755 index 0000000000000000000000000000000000000000..184347f05742ecc6a933f2c40e6ac5092a8b8c99 GIT binary patch literal 3106 zcmaJ@c{G%JA0HxH)|--|G1i2!Gm{ZxW^gsQV+lu=SuAB1Gb3Y!>?DJd5<(?PgoGkO z_BBhkA|iz1k}TmJ-Ri!7yuHsk&+}W(=kxil=X{@7YfDo>eo1}+03c{?hQP4bX7&r@ z-OK)-w$k%uFNf$z2f7W}gYNH6B>;@^WGn$_PIUJqUbib_g#z{gGgbs0RV%O42nDM9DxqR5s-9fVKvj zkf{Wqj+(kEPF+_WsH>r-p{1>-r>6qcRM$`kt80QaG*vb9pjw(xb#>s62gJ5U#d|<8 z2-FW->=O*+MW<7sV6eZxznZ_68ky<|)__1DyBeCBs%(TREr3LKXQ+~BvOg6N1R9R& zO`&^}Nx)r2cP!bD4g;}0{U-z><(Djp_9IQ~gn=3E6tISx`ff-+foSyqhZ2du&@?)R z@UOrBQQUWOQKGEC9fJ!yI93%NU+d z5A?AakZP)7;S|fR>UVCw()VqSOXRU!=H!$&npMITnPp_&pcP?G{qe<8Cw$ELP zVb9cu^uW(gg?Fl_FN91F$FOcyzUPjv=X2Y9(0-vr6R~JoJ03B~S8~@kl%k*AB5Sel zAa68HxWY*Ph?Qnxl*@hUAz;2zs(6sOc#`4BU9y)}d`+>MKFg=>*k-u2{ zTb}WyXG`y|JpzK|MZ@n{UOrW!0iB5Y(>YWS((jNz6jfeW&6#fz{UAB_sgb@gPwu9W zj9pUPv~-XpD2bN{v#)@Kx(XFnrcb&;%2bDJW#3>k(wRlARK|Gkl2AH!lbc1n$j ze3Y~be(^d@kGQ{;87?z3cxh^CesKBV&0^95uDKsCK-@^Mva$$&OKM6g9}87bJUYfn*Ryh5wo9 zomX;4#zsb(5WV@84YJgvrLGb3cuUopm=px>1nm&rEu&=o z>SE^g1}O8JY?X6%Lt=+sa;z*OCW%}3OZ4?%KwO8EwWq}DTZC(kbW1TN{T>Ipc>sU= zj!ksW70e9tg5U9!gAuThDuZu?n#GR2`&C}OfI)QHS?IOGaF(U*ySX`K--0`bbGuyO zZ(Ai-gwb53f0-3d_iqKNdwflF@!+fsUJ*$5@~P_zcDh_Es+iD@ycpQSciofI4#GX7 z$?BRNoUhQlQhK!Zbsf2bIiJp5^0Znqe#gt0W+8B?HNXDT0CVBMFkKc7k%e6w5GCi_M}OhUQ)InU9TnY{ZJDmZ0C3GHe*v zxGeQo=QoK)0iVB~msQY;o8szg+$Ry=o#c1MjxXiI^u*v;XJVYMiIs|dAv9bHcgVkE zy;e$p#U(2%Gp}jm$vLyzy0NQ=rNY*jJVAFFbB-@qA51P@7*9m4|GhuA*VyOu5z&M+ z)0v>gPtuWa$@-VZvqy=ZHqS%vTozC~!4jA%xeUTCJW(l}6qAoqP(i3*7|#WKipxk& z3BA*XO_>RqhzPU&)XcH1Z<`!bVdjxv8V8B5OMTQu6nruDl8B*d@iT2{I}Iu%~e*c!YKusG1^fzDjN{nfyAq{)#naR*~A?!5QUZU%oT!#EBo&L3X zxWL}%D90;?SM_4JdsFW*33gRt;=|MwVL1_v?ibEiGGZkn_oW1D9d?|tEeI)ndj0v$ zq4SaFTR(1POqwPt$0*%nazoF|m!Cc=y)A!2F^${%>7|1qUr>o1J;FDZJ_H^$vZ~52 z%#EHx3c5PhGxOI64Lj>hmU)qQ&QtGUcataEEX)>r8^%-lH_Rt8KMC<%%4*wyP$ybb zHVug(sh1v+Z3qHm{p<_ zw@I#6X^psKtBO1n&M>;s!csjqq+~=pJiI-0*ki0s4v8{L%h5~qodj2ZJ<$@YJnu6Y z1M4z4L{(0r?c@dGd4ybp1xMmmcLq|@JA;GVHzX=c!B~dRYNw_4z}VdZutfyPjT5Gj zM$WS_%j$^5**vRzn1EvQ&u#KCbv#HkMwPH zpL-?O2A4KP7C%!8g*C^WNy!Sl>0;H!!6$RbF|TOrYrCUC=}k)@28&GnIF#j_6g=9C ziyeN@SQwtyIT$7wDehIH71h$xJzf)J_kp8i<7&)Ku3$R&gw$))8|`weUt_r=NsRw$ z0T24wfOYD&opv&@PO3*E;Z#HyZHse!tYPB9>@iys%KNO~==1HvO7cV2P4-3yW;Z2U zZk&_I_;8>s_}-*qo}B%5+4|^&L(viTL{-sWFqbGXQRgBFEm`z>uy;;dtobh1{^TdhV?K!;i-xB!*faNC(eN7| zN8UAZ59H^#9_JjVY-h$mPn>v;Mx!hI;&!mCJx73xxi7N9yu{*JET-VzJ&lcxYqH}; j7VoS=jk(>|$^m--kzZ?Dxab*myMOKGNJ~T^+%4=sZT)WI literal 0 HcmV?d00001 diff --git a/assets/tlSave.png b/assets/tlSave.png new file mode 100755 index 0000000000000000000000000000000000000000..c4c1ec804c7a808d71b8f5ad334fe9235dd1541c GIT binary patch literal 2987 zcmbVOc|4T)A0J{Xcea#}X|U-SGs7Ha5Hn_`Xotawat`xgR&$scX6SH-k|efrC50SC zjwN!3RE|_?NQDi}mZQTu*Kc&}@At>P_K)B5`aaM1`n=zt`}KMfsCN656}BpXKpH?JOG4eaC`u;4U6s%I0AG=Xiz6$4g#%V zFlnv=SIW;gUk=NNzA9rRVsWKt5Xjt8#HITN0s^oP;Ll`RK&I*%Az&uM0^)+Az$sj7 zAb`0)j0ZS{+0lH%0)4Rzh~-|exd3a1T1_6H&5d>O5 zz8d99p@OYBJOGR`f`_4cF z_`WXWSDFt$z3*UY?EYQRs-V;woIQ^zO$z-8k>eZ80@wl@q6I{H zW5i%Ga7ZK)j)$W$NGusif+G-ktO?1Qh$f@(cruy*hkxhzCoBPlCn8ZMC^8C;K_EzQ zEXf*6LYrU+XoNAD3`c#(+OYWoI@=fcu9qp*`wffyS1it&2har^9*x5}^1TA60UQB` zAHd;)t({O{7bcs*5%O1)^VL@(z+;903^I?y0)L4vj`c9cqU)^6}W|$kQNcuLuPScjLsdr>$3wLfq*fO*dC%|_X zsph$c#F>_zu=OeX)q41QfV71w;q2lW#Q^PHb{DE!i;V zLfV*XvJq?w<4Bgb@w%0X+F-juMB8~#Wke2{tC{2{*LoG}DIv+^!=NHCeZZ`u1JrV@)<%! z$o;jw_so8)nv?`p(?+gzQ(dTyJwDZHvY$aOGlu0l*37Omj*cPRciV;ESpF#Usfyh? zE&0X%kPNDC&{A}9s{2o`X8I1EajyVY`n&3Qk%&QmR#2t5t@&j3I^gceMN;h$4l%jQ6RuME>-co*x3jM(iTw0zJ_;5Kl4(33+RW^Wo~ zdJAV&g6hkvo=5bwta)7tQ_2Kbw`%h~R6PK1nSFcfz;8c|^ForQ3wGFU*HAiJ@J>l} zP%?it!rpN`sba~)tb+@(P2Q>UyMiqC)RcATHq8%P%619uJ-ZjQLsMJ!Ywl38SLoXf zEvn;&_z8^PVWwUzO_pblZyfEWQotn2vyA)>d$+O>dgFGPCTz{IDb@L=9fdEnqO`VZ zrEJchyUrMa(j?y18Mp!Mk|)RC{dpp7rE}7rtM1ZdvSmPN)22;K*fr>@noNb|4si)e zjOwaVzx4b2+nVCj+8L1X=pL#j(3pxG#V3ms_AY*0zSwC$*bDcBSIpNd?@LZaZm_wJEHSkv-xvG zRZfm`?XDb}Bhj&Hd5hY;&n-FQQOks7+jna#3QGz{^R@RZI86Rbc%AF$4S-2U;&G{j z?$2u?(RLNlKBt6RbqzNWkX=^7%ZBo89Yy7+OEbF*lCq4`(o-%a-x^O?Qr?I5c^16^ zY6Sgl;dwfH;`|N+|H=D5NG3A(Bxq?B6kG1~o17@dC@cGGRl;J2WAt=&=a>CoCCuwS z*rGBzl)+I>j8v}1i^is0F@Q_R?(y(le@7Q-&aUYFKk7&#Lf~_&}GiD~Bs#M!VbQ?yI=KNa%O+H+@;3X?yfU_l*d%9F{3a z*lzjbc)`ra+^q2r@u1plZA#2=ltT7Vpw5`~RwBFXN&g|m{%PtO~jE^1ALx7?1xHri%> zPo05Fl4g$fkNVq2^w}~ETUP?ZVZVv!H*|Z+(5bW5 zWtZFvbI!fr literal 0 HcmV?d00001 diff --git a/assets/travelLeads.png b/assets/travelLeads.png new file mode 100755 index 0000000000000000000000000000000000000000..beb4ec1f528460cadd63f3189296b0573dc5100f GIT binary patch literal 3887 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 literal 0 HcmV?d00001 diff --git a/assets/travelToList.png b/assets/travelToList.png new file mode 100755 index 0000000000000000000000000000000000000000..8f618490afd8cfa53b07ac97c7434c512d6cae0b GIT binary patch literal 2714 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 CJ*_qX literal 0 HcmV?d00001 diff --git a/classes/data/dataContacts.php b/classes/data/dataContacts.php new file mode 100644 index 0000000..13d99fe --- /dev/null +++ b/classes/data/dataContacts.php @@ -0,0 +1,181 @@ + + * @license http://www.gaslightmedia.com Gaslightmedia + * @release SVN: $Id: dataLeads.php,v 1.0 2011/01/25 19:31:47 cscott Exp $ + */ + +/** + * GlmDataLeads class + * + * PHP version 5 + * + * @category Data + * @package GLM Member DB + * @author Chuck Scott + * @license http://www.gaslightmedia.com Gaslightmedia + * @release SVN: $Id: dataMembers.php,v 1.0 2011/01/25 19:31:47 cscott + * Exp $ + */ +class GlmDataTravelContacts extends GlmDataAbstract +{ + + /** + * WordPress Database Object + * + * @var $wpdb + * @access public + */ + public $wpdb; + /** + * Plugin Configuration Data + * + * @var $config + * @access public + */ + public $config; + /** + * Data Table Name + * + * @var $table + * @access public + */ + public $table; + /** + * Field definitions + * + * 'type' is type of field as defined by the application + * text Regular text field + * pointer Pointer to an entry in another table + * 'filters' is the filter name for a particular filter ID in PHP filter + * functions + * See PHP filter_id() + * + * 'use' is when to use the field + * l = List + * g = Get + * n = New + * i = Insert + * e = Edit + * u = Update + * d = Delete + * a = All + * + * @var $ini + * @access public + */ + public $fields = false; + + /** + * Constructor + * + * @param object $d database connection + * @param array $config Configuration array + * @param bool $limitedEdit Flag to say indicate limited edit requested + * + * @return void + * @access public + */ + public function __construct($wpdb, $config, $limitedEdit = false) + { + + // If this class is not being extended along with existing $wpdb and $config + if (!$this->wpdb) { + + // Save WordPress Database object + $this->wpdb = $wpdb; + + // Save plugin configuration object + $this->config = $config; + + } + + /* + * Table Name + */ + $this->table = GLM_MEMBERS_TRAVEL_PLUGIN_DB_PREFIX . 'lead_contacts'; + + /* + * Table Data Fields + */ + + $this->fields = array( + + 'id' => array( + 'field' => 'id', + 'type' => 'integer', + 'view_only' => true, + 'use' => 'a', + ), + + 'lead' => array( + 'field' => 'lead', + 'type' => 'pointer', + 'p_table' => GLM_MEMBERS_TRAVEL_PLUGIN_DB_PREFIX . 'leads', + 'p_field' => 'id', + 'p_id' => 'id', + 'p_orderby' => 'lname,fname', + 'required' => true, + 'use' => 'a', + ), + + 'updated' => array( + 'field' => 'updated', + 'type' => 'datetime', + 'required' => true, + 'use' => 'a', + ), + + 'name' => array( + 'field' => 'name', + 'type' => 'text', + 'required' => false, + 'use' => 'a', + ), + + 'email' => array( + 'field' => 'email', + 'type' => 'text', + 'required' => false, + 'unique' => false, + 'use' => 'a', + ), + + 'phone' => array( + 'field' => 'phone', + 'type' => 'text', + 'required' => false, + 'use' => 'a', + ), + + ); + + } + + /** + * Entry Post Processing Call-Back Method + * + * Perform post-processing for all result entries. + * + * In this case we're using it to append an array of category + * data to each member result and also sort by member name. + * + * @param array $r Array of field result data for a single entry + * @param string $a Action being performed (l, i, g, ...) + * + * @return object Class object + * + */ + public function entryPostProcessing($r, $a) + { + return $r; + } + +} diff --git a/classes/data/dataLeads.php b/classes/data/dataLeads.php new file mode 100644 index 0000000..8aadd80 --- /dev/null +++ b/classes/data/dataLeads.php @@ -0,0 +1,265 @@ + + * @license http://www.gaslightmedia.com Gaslightmedia + * @release SVN: $Id: dataLeads.php,v 1.0 2011/01/25 19:31:47 cscott Exp $ + */ + +/** + * GlmDataLeads class + * + * PHP version 5 + * + * @category Data + * @package GLM Member DB + * @author Chuck Scott + * @license http://www.gaslightmedia.com Gaslightmedia + * @release SVN: $Id: dataMembers.php,v 1.0 2011/01/25 19:31:47 cscott + * Exp $ + */ +class GlmDataTravelLeads extends GlmDataAbstract +{ + + /** + * WordPress Database Object + * + * @var $wpdb + * @access public + */ + public $wpdb; + /** + * Plugin Configuration Data + * + * @var $config + * @access public + */ + public $config; + /** + * Data Table Name + * + * @var $table + * @access public + */ + public $table; + /** + * Field definitions + * + * 'type' is type of field as defined by the application + * text Regular text field + * pointer Pointer to an entry in another table + * 'filters' is the filter name for a particular filter ID in PHP filter + * functions + * See PHP filter_id() + * + * 'use' is when to use the field + * l = List + * g = Get + * n = New + * i = Insert + * e = Edit + * u = Update + * d = Delete + * a = All + * + * @var $ini + * @access public + */ + public $fields = false; + + /** + * Constructor + * + * @param object $d database connection + * @param array $config Configuration array + * @param bool $limitedEdit Flag to say indicate limited edit requested + * + * @return void + * @access public + */ + public function __construct($wpdb, $config, $limitedEdit = false) + { + + // If this class is not being extended along with existing $wpdb and $config + if (!$this->wpdb) { + + // Save WordPress Database object + $this->wpdb = $wpdb; + + // Save plugin configuration object + $this->config = $config; + + } + + /* + * Table Name + */ + $this->table = GLM_MEMBERS_TRAVEL_PLUGIN_DB_PREFIX . 'leads'; + + /* + * Table Data Fields + */ + + $this->fields = array( + + 'id' => array( + 'field' => 'id', + 'type' => 'integer', + 'view_only' => true, + 'use' => 'a', + ), + + 'create_date' => array( + 'field' => 'create_date', + 'type' => 'date', + 'required' => true, + 'use' => 'a', + ), + + 'updated' => array( + 'field' => 'updated', + 'type' => 'datetime', + 'required' => true, + 'use' => 'a', + ), + + 'status' => array( + 'field' => 'status', + 'type' => 'list', + 'list' => $this->config['lead_status'], + 'required' => true, + 'default' => $this->config['lead_status_numb']['Inactive'], + 'use' => 'a' + ), + + 'fname' => array( + 'field' => 'fname', + 'type' => 'text', + 'required' => false, + 'use' => 'a', + ), + + 'lname' => array( + 'field' => 'lname', + 'type' => 'text', + 'required' => false, + 'use' => 'a', + ), + + 'email' => array( + 'field' => 'email', + 'type' => 'text', + 'required' => false, + 'unique' => false, + 'use' => 'a', + ), + + 'company' => array( + 'field' => 'company', + 'type' => 'text', + 'required' => false, + 'use' => 'a', + ), + + 'address' => array( + 'field' => 'address', + 'type' => 'text', + 'required' => false, + 'use' => 'a', + ), + + 'address2' => array( + 'field' => 'address2', + 'type' => 'text', + 'required' => false, + 'use' => 'a', + ), + + 'city' => array( + 'field' => 'city', + 'type' => 'text', + 'required' => false, + 'use' => 'a', + ), + + 'state' => array( + 'field' => 'state', + 'type' => 'list', + 'list' => $this->config['states'], + 'default' => 'MI', + 'required' => false, + 'use' => 'a', + ), + + 'zip' => array( + 'field' => 'zip', + 'type' => 'list', + 'required' => false, + 'use' => 'a', + ), + + 'phone' => array( + 'field' => 'phone', + 'type' => 'text', + 'required' => false, + 'use' => 'a', + ), + + 'fax' => array( + 'field' => 'fax', + 'type' => 'text', + 'required' => false, + 'use' => 'a', + ), + + 'website' => array( + 'field' => 'website', + 'type' => 'text', + 'required' => false, + 'use' => 'a', + ), + + 'mail_ok' => array( + 'field' => 'mail_ok', + 'type' => 'checkbox', + 'required' => false, + 'use' => 'a', + ), + + // 'member_ok' => array( + // 'field' => 'member_ok', + // 'type' => 'checkbox', + // 'required' => false, + // 'use' => 'a', + // ), + + ); + + } + + /** + * Entry Post Processing Call-Back Method + * + * Perform post-processing for all result entries. + * + * In this case we're using it to append an array of category + * data to each member result and also sort by member name. + * + * @param array $r Array of field result data for a single entry + * @param string $a Action being performed (l, i, g, ...) + * + * @return object Class object + * + */ + public function entryPostProcessing($r, $a) + { + return $r; + } + +} diff --git a/classes/data/dataNotes.php b/classes/data/dataNotes.php new file mode 100644 index 0000000..9fd55ed --- /dev/null +++ b/classes/data/dataNotes.php @@ -0,0 +1,173 @@ + + * @license http://www.gaslightmedia.com Gaslightmedia + * @release SVN: $Id: dataLeads.php,v 1.0 2011/01/25 19:31:47 cscott Exp $ + */ + +/** + * GlmDataLeads class + * + * PHP version 5 + * + * @category Data + * @package GLM Member DB + * @author Chuck Scott + * @license http://www.gaslightmedia.com Gaslightmedia + * @release SVN: $Id: dataMembers.php,v 1.0 2011/01/25 19:31:47 cscott + * Exp $ + */ +class GlmDataTravelNotes extends GlmDataAbstract +{ + + /** + * WordPress Database Object + * + * @var $wpdb + * @access public + */ + public $wpdb; + /** + * Plugin Configuration Data + * + * @var $config + * @access public + */ + public $config; + /** + * Data Table Name + * + * @var $table + * @access public + */ + public $table; + /** + * Field definitions + * + * 'type' is type of field as defined by the application + * text Regular text field + * pointer Pointer to an entry in another table + * 'filters' is the filter name for a particular filter ID in PHP filter + * functions + * See PHP filter_id() + * + * 'use' is when to use the field + * l = List + * g = Get + * n = New + * i = Insert + * e = Edit + * u = Update + * d = Delete + * a = All + * + * @var $ini + * @access public + */ + public $fields = false; + + /** + * Constructor + * + * @param object $d database connection + * @param array $config Configuration array + * @param bool $limitedEdit Flag to say indicate limited edit requested + * + * @return void + * @access public + */ + public function __construct($wpdb, $config, $limitedEdit = false) + { + + // If this class is not being extended along with existing $wpdb and $config + if (!$this->wpdb) { + + // Save WordPress Database object + $this->wpdb = $wpdb; + + // Save plugin configuration object + $this->config = $config; + + } + + /* + * Table Name + */ + $this->table = GLM_MEMBERS_TRAVEL_PLUGIN_DB_PREFIX . 'lead_notes'; + + /* + * Table Data Fields + */ + + $this->fields = array( + + 'id' => array( + 'field' => 'id', + 'type' => 'integer', + 'view_only' => true, + 'use' => 'a', + ), + + 'lead' => array( + 'field' => 'lead', + 'type' => 'pointer', + 'p_table' => GLM_MEMBERS_TRAVEL_PLUGIN_DB_PREFIX . 'leads', + 'p_field' => 'id', + 'p_id' => 'id', + 'p_orderby' => 'lname,fname', + 'required' => true, + 'use' => 'a', + ), + + 'created' => array( + 'field' => 'created', + 'type' => 'date', + 'required' => true, + 'use' => 'a', + ), + + 'updated' => array( + 'field' => 'updated', + 'type' => 'datetime', + 'required' => true, + 'use' => 'a', + ), + + 'notes' => array( + 'field' => 'notes', + 'type' => 'text', + 'required' => false, + 'use' => 'a', + ), + + ); + + } + + /** + * Entry Post Processing Call-Back Method + * + * Perform post-processing for all result entries. + * + * In this case we're using it to append an array of category + * data to each member result and also sort by member name. + * + * @param array $r Array of field result data for a single entry + * @param string $a Action being performed (l, i, g, ...) + * + * @return object Class object + * + */ + public function entryPostProcessing($r, $a) + { + return $r; + } + +} diff --git a/config/plugin.ini b/config/plugin.ini index 9222f7e..99b840b 100644 --- a/config/plugin.ini +++ b/config/plugin.ini @@ -2,7 +2,13 @@ ; Main Configuration File ; {descrName} ; -; Place any static configuration parameters here. +; Place any static configuration parameters here. ; [common] + +lead_status[10] = 'Active' +lead_status[20] = 'Inactive' + +lead_status_numb['Active'] = 10 +lead_status_numb['Inactive'] = 20 diff --git a/css/admin.css.save b/css/admin.css.save new file mode 100755 index 0000000..0cb8e47 --- /dev/null +++ b/css/admin.css.save @@ -0,0 +1,287 @@ +#travel-admin { + font-family: arial, sans-serif; + /* font-size: 13px !important; */ + /* font-size: 1.3rem !important; */ + margin: 0; + padding: 0; + padding-left: 40px; + background: url(http://www.circlemichigan.com/assets/logo.png) fixed no-repeat 1:w + 15px 100px; + } +#travel-admin a:link { + color: #28195e; + } +#travel-admin a:visited { + color: #28195e; + } +#travel-admin a:hover { + color: #000; + } +#travel-admin a:active { + color: #28195e; + } + +/* Travel Leads style framework */ +#travel-admin .tlRounded { + border-radius: 5px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + } +#travel-admin .tlShadow { + -moz-box-shadow:inset 0 0 7px #fff,1px 1px 7px rgba(153, 153, 153, 0.2); + -webkit-box-shadow:inset 0 0 7px #fff,1px 1px 7px rgba(153, 153, 153, 0.2); + box-shadow:inset 0 0 7px #fff,1px 1px 7px rgba(153, 153, 153, 0.2); + } +#travel-admin .tlBorder { + border: 1px solid #999; + } +#travel-admin .tlTrans1 { + background: #fff; + background: rgba(255, 255, 255, .9); + } +#travel-wrapper { + padding: 25px; + width: 720px; + min-height: 400px; + background: rgba(255, 255, 255, .7); + } + /* main page fieldsets */ +#fieldsets { + height: 1%; + overflow: hidden; + } +#travel-admin fieldset { + display: block; + float: left; + margin-right: 20px; + height: 9em; + padding: 10px; + } +#travel-admin fieldset:last-child { + margin-right: 0; + } +#travel-admin fieldset p { + font-weight: bold; + font-family: Georgia, arial, sans-serif; + font-size: 16px; + font-size: 1.2rem; + margin: 0.5em 0; + } +#findLeads div { + margin: 0 0 10px 0; + } +#findLeads label { + width: 100px; + display: block; + float: left; + line-height: 30px; + } +#travel-admin fieldset form input { + height: 28px; + padding: 0; + margin: 0; + border-width: 1px; + font-size: 14px; + font-size: 1.0rem; + display: block; + width: 99%; + } +/* Buttons */ +#travel-admin .button { + width: 198px; + height: 30px; + text-indent: -9000px; + display: block; + cursor: pointer; + margin-top: 10px; + border-right: 1px solid #aaa; + border-bottom: 1px solid #aaa; + border-left: 1px solid #eee; + border-top: 1px solid #eee; + } +#travel-admin .button:hover { + border-right: 1px solid #888; + border-bottom: 1px solid #888; + border-left: 1px solid #ccc; + border-top: 1px solid #ccc; + } +/* Save Button */ +#travel-admin .tlSave { + float: right; + background-image: url(../assets/tlSave.png); + margin-right: 5px; + margin-top: -5px; + } +#travel-admin fieldset form #leadCompanySearch { + background-image: url(../assets/goCompany.png); + } +#travel-admin fieldset form #leadContactSearch { + background-image: url(../assets/goContact.png); + } +#travelToList { + background-image: url(../assets/travelToList.png); + } +#newLead { + background-image: url(../assets/newLead.png); + } +/* Pagination */ + +#travel-admin .paging { + display: block; + } +#travel-admin .paging, +#travel-admin .business-first-letter { + clear: both; + margin: 1em 0; + padding: 1em 0 0 0; + height: 1%; + overflow: hidden; + margin-left: 2px; + } +#travel-admin .business-first-letter { + margin-bottom: 1em; + border-bottom: 1px dotted #369; + padding-bottom: 1em; + } +#travel-admin .paging b, +#travel-admin .business-first-letter a.curr { + padding: 0.2em 0.4em; + background: #eee; + border: 1px solid #9AAFE5; + margin-left: 0.2em; + display: block; + float: left; + } +#travel-admin .paging a, +#travel-admin .business-first-letter a { + margin-left: 0.2em; + color: #036; + padding: 0.2em 0.4em; + border: 1px solid #9AAFE5; + text-decoration: none; + background: white; + display: block; + float: left; + } +#travel-admin .paging a:hover, +#travel-admin .business-first-letter a:hover { + border: 1px solid #2e8d32; + background: #eee; + } +/* Table Grid */ +#dataGrid { + margin: 0.5em 0 1em 0; + background: rgba(255, 255, 255, 0.0); + } +#dataGrid, #dataGrid tr, #dataGrid th, #dataGrid td { + border: 1px solid #999; + border-collapse: collapse; + } +#dataGrid th, #dataGrid td { + padding: 10px 20px; + } +#dataGrid th { + background: #fff; + } +#dataGrid tr:nth-child(even) { + background: rgba(231, 231, 231, .9); + } +#dataGrid tr:nth-child(odd) { + background: rgba(248, 248, 248, .9);; + } +#dataGrid tr:hover { + background: #fff; + cursor: pointer; + } +#dataGrid a { + text-decoration: none; + color: black; + } +#dataGrid th a { + text-decoration: underline; + font-family: Georgia, arial, sans-serif; + white-space: nowrap; + } +/* Breadcrumbs */ +#breadcrumbs { + background: white; + color: #000; + padding: 10px 15px; + margin-bottom: 1em; + } +#breadcrumbs i { + font-weight: bold; + font-style: normal; + } +#lead-delete { + float: right; + margin-top: 10px; + } +#lead-delete a { + margin: 5px; + background: red; + background: rgba(204, 0, 0, .4); + padding: 5px; + border: 1px solid #ccc; + border-radius: 5px; + color: white; + text-shadow: 1px 1px 1px #888; + text-decoration: none; + } +#lead-delete a:hover { + background: red; + background: rgba(204, 0, 0, 1.0); +} +/* Overriding Form Framework */ +div.webform td { + font-size: 13px !important; + font-size: 1.3rem !important; + } +div.webform table, div.webform td { + border: 1px solid #aaa !important; + } +/* Overriding JqueryUI */ +#travel-admin .ui-state-highlight { + margin-bottom: .5em; + padding: 15px; + } +#travel-admin .ui-state-highlight p { + margin: 0; + } +#travel-admin .ui-icon { + float: left; + margin-right: .3em; + display: block; + } +#tabs li a { + font-size: 13px; + font-size: 1.3rem; + } +#travel-admin .tsLog { + margin: 10px 0; + border-top: 1px dotted #369; + border: 1px solid #eee; + height: 1%; + overflow: hidden; + } +#travel-admin .tsLog h2 { + font-family: Georgia, arial, sans-serif; + font-size: 16px; + font-size: 1.6rem; + padding: 5px 10px; + background: #eee; + font-weight: normal; + margin: 0 0 1em 0 ; + } +#travel-admin .tsLog p { + margin: 0 10px; + } +#travel-admin .tlDelete { + display: block; + float: right; + width: 16px; + height: 16px; + background: url(assets/cancel.png) no-repeat; + text-indent: -9000px; + margin: 10px; + } diff --git a/index.php b/index.php index c31475e..11455c0 100644 --- a/index.php +++ b/index.php @@ -150,16 +150,16 @@ if (is_file(GLM_MEMBERS_TRAVEL_PLUGIN_DB_SCRIPTS.'/dbVersions.php')) { * * Then add the data to the "config" array under "// Add this add-on to the add-ons array" below. */ -$glmMembersTravelDatabasePluginVersion = get_option('glmMembersDatabasePluginVersion'); +$glmMembersTravelDatabasePluginVersion = get_option('glmMembersTravelDbVersion'); if ( $glmMembersTravelDatabasePluginVersion ) { // Management - $glmMembersTravelManagementSettings = $wpdb->get_row( "SELECT * FROM ".GLM_MEMBERS_TRAVEL_PLUGIN_DB_PREFIX."management WHERE id = 1", ARRAY_A ); - unset($glmMembersTravelManagementSettings['id']); + // $glmMembersTravelManagementSettings = $wpdb->get_row( "SELECT * FROM ".GLM_MEMBERS_TRAVEL_PLUGIN_DB_PREFIX."management WHERE id = 1", ARRAY_A ); + // unset($glmMembersTravelManagementSettings['id']); // Settings - $glmMembersTravelSettingsTerms = $wpdb->get_row( "SELECT * FROM ".GLM_MEMBERS_TRAVEL_PLUGIN_DB_PREFIX."settings_terms WHERE id = 1", ARRAY_A ); - unset($glmMembersTravelSettingsTerms['id']); + // $glmMembersTravelSettingsTerms = $wpdb->get_row( "SELECT * FROM ".GLM_MEMBERS_TRAVEL_PLUGIN_DB_PREFIX."settings_terms WHERE id = 1", ARRAY_A ); + // unset($glmMembersTravelSettingsTerms['id']); } @@ -174,8 +174,8 @@ function glmMembersTravelRegisterAddOn($addOns) { 'slug' => GLM_MEMBERS_TRAVEL_PLUGIN_SLUG, 'actions' => $GLOBALS['glmMembersTravelAddOnValidActions'], 'config' => array( - 'settings' => $GLOBALS['glmMembersTravelManagementSettings'], - 'terms' => $GLOBALS['glmMembersTravelSettingsTerms'] + // 'settings' => $GLOBALS['glmMembersTravelManagementSettings'], + // 'terms' => $GLOBALS['glmMembersTravelSettingsTerms'] ), 'shortcodes' => $GLOBALS['glmMembersTravelShortcodes'], 'shortcodesDescription' => $GLOBALS['glmMembersTravelShortcodesDescription'] diff --git a/models/admin/ajax/travelContacts.php b/models/admin/ajax/travelContacts.php new file mode 100644 index 0000000..9bf197c --- /dev/null +++ b/models/admin/ajax/travelContacts.php @@ -0,0 +1,108 @@ + + * @license http://www.gaslightmedia.com Gaslightmedia + * @version 0.1 + */ + +// Load Members data abstract +require_once GLM_MEMBERS_TRAVEL_PLUGIN_CLASS_PATH . '/data/dataContacts.php'; + +/** + * This class performs the work of handling images passed to it via + * an AJAX call that goes through the WorPress AJAX Handler. + * + */ +class GlmMembersAdmin_ajax_travelContacts extends GlmDataTravelContacts +{ + + /** + * WordPress Database Object + * + * @var $wpdb + * @access public + */ + public $wpdb; + /** + * Plugin Configuration Data + * + * @var $config + * @access public + */ + public $config; + + /* + * Constructor + * + * This constructor sets up this model. At this time that only includes + * storing away the WordPress data object. + * + * @return object Class object + * + */ + public function __construct ($wpdb, $config) + { + + // Save WordPress Database object + $this->wpdb = $wpdb; + + // Save plugin configuration object + $this->config = $config; + + // Run constructor for data class + parent::__construct(false, false); + + } + + /* + * Perform Model Action + * + * This model checks to see if the credentials passed in are correct. + * + * This model action does not return, it simply does it's work then calls die(); + * + * @param $actionData + * + * Output JSON string as response and does not return + */ + public function modelAction( $actionData = false ) + { + $return = false; + $success = true; + + $option = filter_var( $_REQUEST['option'], FILTER_SANITIZE_STRING ); + trigger_error( print_r( $_REQUEST, E_USER_NOTICE ) ); + + switch ( $option ) { + case 'list': + default: + $lead_id = filter_var( $_REQUEST['lead_id'], FILTER_VALIDATE_INT ); + $return = $this->getList( "T.lead = $lead_id" ); + + $view = 'list.html'; + break; + } + + // Compile template data + $templateData = array( + 'data' => $return, + ); + + // Return status, suggested view, and data to controller + return array( + 'status' => $success, + 'menuItemRedirect' => false, + 'modelRedirect' => false, + 'view' => 'admin/ajax/contacts/'.$view, + 'data' => $templateData + ); + } +} diff --git a/models/admin/ajax/travelNotes.php b/models/admin/ajax/travelNotes.php new file mode 100644 index 0000000..693be80 --- /dev/null +++ b/models/admin/ajax/travelNotes.php @@ -0,0 +1,110 @@ + + * @license http://www.gaslightmedia.com Gaslightmedia + * @version 0.1 + */ + +// Load Members data abstract +require_once GLM_MEMBERS_TRAVEL_PLUGIN_CLASS_PATH . '/data/dataNotes.php'; + +/** + * This class performs the work of handling images passed to it via + * an AJAX call that goes through the WorPress AJAX Handler. + * + */ +class GlmMembersAdmin_ajax_travelNotes extends GlmDataTravelNotes +{ + + /** + * WordPress Database Object + * + * @var $wpdb + * @access public + */ + public $wpdb; + /** + * Plugin Configuration Data + * + * @var $config + * @access public + */ + public $config; + + /* + * Constructor + * + * This constructor sets up this model. At this time that only includes + * storing away the WordPress data object. + * + * @return object Class object + * + */ + public function __construct ($wpdb, $config) + { + + // Save WordPress Database object + $this->wpdb = $wpdb; + + // Save plugin configuration object + $this->config = $config; + + // Run constructor for data class + parent::__construct(false, false); + + } + + /* + * Perform Model Action + * + * This model checks to see if the credentials passed in are correct. + * + * This model action does not return, it simply does it's work then calls die(); + * + * @param $actionData + * + * Output JSON string as response and does not return + */ + public function modelAction( $actionData = false ) + { + $return = false; + $success = true; + + $option = isset($_REQUEST['option']) ? filter_var( $_REQUEST['option'], FILTER_SANITIZE_STRING ) : ''; + trigger_error( print_r( $_REQUEST, E_USER_NOTICE ) ); + + switch ( $option ) { + case 'list': + default: + $lead_id = filter_var( $_REQUEST['lead_id'], FILTER_VALIDATE_INT ); + $notes = $this->getList( "T.lead = $lead_id" ); + + $view = 'list.html'; + break; + } + + // Compile template data + $templateData = array( + 'lead_id' => $lead_id, + 'notes' => $notes, + 'editPage' => 'glm-members-admin-menu-glm-travel', + ); + + // Return status, suggested view, and data to controller + return array( + 'status' => $success, + 'menuItemRedirect' => false, + 'modelRedirect' => false, + 'view' => 'admin/ajax/notes/'.$view, + 'data' => $templateData + ); + } +} diff --git a/models/admin/travel/index.php b/models/admin/travel/index.php new file mode 100644 index 0000000..819d733 --- /dev/null +++ b/models/admin/travel/index.php @@ -0,0 +1,503 @@ + + * @license http://www.gaslightmedia.com Gaslightmedia + * @release index.php,v 1.0 2014/10/31 19:31:47 cscott Exp $ + * @link http://dev.gaslightmedia.com/ + */ + +// Load Leads data abstract +require_once GLM_MEMBERS_TRAVEL_PLUGIN_CLASS_PATH.'/data/dataLeads.php'; +require_once GLM_MEMBERS_TRAVEL_PLUGIN_CLASS_PATH . '/data/dataContacts.php'; +require_once GLM_MEMBERS_TRAVEL_PLUGIN_CLASS_PATH . '/data/dataNotes.php'; + +class GlmMembersAdmin_travel_index extends GlmDataTravelLeads +{ + + /** + * WordPress Database Object + * + * @var $wpdb + * @access public + */ + public $wpdb; + /** + * Plugin Configuration Data + * + * @var $config + * @access public + */ + public $config; + + public $entryId = false; + /* + * Constructor + * + * This contructor performs the work for this model. This model returns + * an array containing the following. + * + * 'status' + * + * True if successfull and false if there was a fatal failure. + * + * 'view' + * + * A suggested view name that the contoller should use instead of the + * default view for this model or false to indicate that the default view + * should be used. + * + * 'data' + * + * Data that the model is returning for use in merging with the view to + * produce output. + * + * @wpdb object WordPress database object + * + * @return array Array containing status, suggested view, and any data + */ + public function __construct ($wpdb, $config) + { + + // Save WordPress Database object + $this->wpdb = $wpdb; + + // Save plugin configuration object + $this->config = $config; + + /* + * Run constructor for the data class + * + * Note, the third parameter is a flag that indicates to the + * data class that it should flag a group of fields as 'view_only'. + */ + parent::__construct(false, false, true); + + + } + + public function modelAction($actionData = false) + { + $where = ' true '; + $option = false; + $user_can_edit_leads = false; + $wpUser = $this->config['loggedInUser']['wpUser']; + $search_id = false; + $numbDisplayed = false; + $lastDisplayed = false; + $paging = true; + $prevStart = false; + $nextStart = false; + $start = 1; + $limit = 20; // Set to the number of listings per page + $haveLeads = false; + $leadCount = 0; + $addingLead = false; + $searching = false; + $updating = false; + $updating_error = false; + $inserting = false; + $inserting_error = false; + $groups = false; + $sources = false; + $entry = false; + $hasSearch = false; + + // Get any provided option + if ( isset( $_REQUEST['option'] ) ) { + $option = $_REQUEST['option']; + } + + if ( isset( $_REQUEST['glm_action'] ) && $_REQUEST['glm_action'] === 'csvExport' ) { + $search = true; + $option = 'csv'; + } + + // Get entry ID if supplied + if (isset($_REQUEST['id'])) { + + // Make sure it's numeric + $this->entryId = ( $_REQUEST['id'] - 0 ); + + if ( $this->entryId <= 0 ) { + $this->entryId = false; + } + + } + + // Check for a search being done. + if ( isset( $_REQUEST['search'] ) ) { + $search = filter_var( $_REQUEST['search'], FILTER_VALIDATE_BOOLEAN); + } + if ( isset( $_REQUEST['back'] ) ) { + $back = filter_var( $_REQUEST['back'], FILTER_VALIDATE_BOOLEAN); + if ( $back ) { + $searching = true; + } + } + + if ( isset( $this->config['loggedInUser']['contactUser'] ) && empty( $this->config['loggedInUser']['contactUser'] ) ) { + $user_can_edit_leads = true; + } + + if ( ( isset( $search ) && $search ) || isset( $search_params ) && $search_params ) { + if ( isset( $search ) && $search ) { + $searching = true; + } + // Filter the $_POST variables from the search form. + // Verify mm/dd/YYYY date format for the from and to dates. + if ( !isset( $search_params ) ) { + $search_params = filter_var_array( + $_POST, + array( + 'source_id' => FILTER_VALIDATE_INT, + 'company' => FILTER_SANITIZE_STRING, + 'contact' => FILTER_SANITIZE_STRING, + 'from_date' => array( + 'filter' => FILTER_VALIDATE_REGEXP, + 'options' => array( + 'regexp' => '%([0-9]{2})/([0-9]{2})/([0-9]{4})%' + ) + ), + 'to_date' => array( + 'filter' => FILTER_VALIDATE_REGEXP, + 'options' => array( + 'regexp' => '%([0-9]{2})/([0-9]{2})/([0-9]{4})%' + ) + ), + 'mail_ok' => FILTER_VALIDATE_BOOLEAN, + 'member_ok' => FILTER_VALIDATE_BOOLEAN, + 'interests' => array( + 'filter' => FILTER_VALIDATE_BOOLEAN, + 'flags' => FILTER_FORCE_ARRAY + ) + ) + ); + } + // checking the booleans for empty or false + if ( isset( $_REQUEST['mail_ok'] ) && $_REQUEST['mail_ok'] === '0' ) { + $search_params['mail_ok'] = (int)0; + } + if ( isset( $_REQUEST['member_ok'] ) && $_REQUEST['member_ok'] === '0' ) { + $search_params['member_ok'] = (int)0; + } + + + // build the $where part + $where_parts = array(); + if ( isset( $search_params['member_ok'] ) && $search_params['member_ok'] !== false ) { + $member_ok = ( $search_params['member_ok'] === true ) ? 'true' : 'false'; + $where_parts[] = "T.lead_id IN ( + SELECT id + FROM " . GLM_MEMBERS_LEADS_PLUGIN_DB_PREFIX . "leads + WHERE member_ok = $member_ok)"; + } + if ( isset( $search_params['mail_ok'] ) && $search_params['mail_ok'] !== false ) { + $mail_ok = ( $search_params['mail_ok'] === true ) ? 'true' : 'false'; + $where_parts[] = "T.lead_id IN ( + SELECT id + FROM " . GLM_MEMBERS_LEADS_PLUGIN_DB_PREFIX . "leads + WHERE mail_ok = $mail_ok)"; + } + if ( isset( $this->config['loggedInUser']['contactUser'] ) && !empty( $this->config['loggedInUser']['contactUser'] ) ) { + $where_parts[] = "T.lead_id IN ( + SELECT id + FROM " . GLM_MEMBERS_LEADS_PLUGIN_DB_PREFIX . "leads + WHERE member_ok = true)"; + } else { + $user_can_edit_leads = true; + } + if ( $search_params['source_id'] ) { + $where_parts[] = "source_id = {$search_params['source_id']}"; + } + if ( $search_params['company'] ) { + $where_parts[] = "org = '" . esc_sql( $search_params['company'] ) . "'"; + } + if ( $search_params['contact'] ) { + // Search for name. + // Could be in these formats: + // fname lname + // lname, fname + // lname fname + // lname + // fname + $name_parts = array(); + $name_parts[] = "SOUNDEX(CONCAT_WS(' ', fname, lname)) = SOUNDEX( '" . esc_sql( $search_params['contact'] ) . "')"; + $name_parts[] = "SOUNDEX(CONCAT_WS(' ', lname, fname)) = SOUNDEX( '" . esc_sql( $search_params['contact'] ) . "')"; + $name_parts[] = "SOUNDEX(fname) = SOUNDEX( '" . esc_sql( $search_params['contact'] ) . "')"; + $name_parts[] = "SOUNDEX(lname) = SOUNDEX( '" . esc_sql( $search_params['contact'] ) . "')"; + $where_parts[] = implode( ' OR ', $name_parts ); + } + if ( $search_params['interests'] ) { + /* + * Search for the interest. + * Checks the tables for lead_interests. + */ + // $where_parts[] = " T.id IN ( + // SELECT lead_entry_id + // FROM " . GLM_MEMBERS_LEADS_PLUGIN_DB_PREFIX . "lead_interests + // WHERE interest_id IN ( " . implode( ", ", array_keys( $search_params['interests'] ) ) . " ) ) "; + } + if ( $search_params['from_date'] && $search_params['to_date'] ) { + /* + * We get a date from the form in mm/dd/YYYY format. + * Here in mysql we reformat the date using STR_TO_DATE function. + */ + $where_parts[] = "T.date_submitted BETWEEN STR_TO_DATE('{$search_params['from_date']}', '%m/%d/%Y') " + . "AND STR_TO_DATE('{$search_params['to_date']}', '%m/%d/%Y')"; + } else if ( $search_params['from_date'] ) { + $where_parts[] = "T.date_submitted >= STR_TO_DATE('{$search_params['from_date']}', '%m/%d/%Y')"; + } else if ( $search_params['to_date'] ) { + $where_parts[] = "T.date_submitted <= STR_TO_DATE('{$search_params['to_date']}', '%m/%d/%Y')"; + } + if ( ( isset( $search ) && $search ) || $searching ) { + if ( isset( $where_parts ) && !empty( $where_parts ) ) { + $where .= ' AND ' . implode( ' AND ', $where_parts ); + } + $order = "T.lname, T.fname"; + + // Check if we're doing paging + if (isset($_REQUEST['pageSelect'])) { + + // If request is for Next + if ( isset( $_REQUEST['pageSelect'][0] ) && $_REQUEST['pageSelect'][0] == 'N') { + $newStart = $_REQUEST['nextStart'] - 0; + + // Otherwise it must be Previous + } else { + $newStart = $_REQUEST['prevStart'] - 0; + } + + if ($newStart > 0) { + $start = $newStart; + } + } + + // Get count of members listed + $leadCount = $this->getStats($where); + + // If the number of members is less than a page, don't do paging + if ($leadCount <= $limit) { + $paging = false; + } + + + switch ( $option ) { + case 'csv': + // $sql = " + // SELECT T.*,L.email + // FROM " . GLM_MEMBERS_LEADS_PLUGIN_DB_PREFIX . "lead_entry T, + // " . GLM_MEMBERS_LEADS_PLUGIN_DB_PREFIX . "leads L + // WHERE $where + // AND T.lead_id = L.id + // ORDER BY $order"; + $leads = $this->wpdb->get_results( $sql, ARRAY_A ); + break; + default: + $listResult = $this->getSimpleEntriesList( $where, $order, true, 'id', $start, $limit ); + // Get paging results + $numbDisplayed = $listResult['returned']; + $lastDisplayed = $listResult['last']; + if ($start == 1) { + $prevStart = false; + } else { + $prevStart = $start - $limit; + if ($start < 1) { + $start = 1; + } + } + if ($listResult['returned'] == $limit) { + $nextStart = $start + $limit; + } + + // since we're doing paging, we have to break out just the member data + $leads = $listResult['list']; + //echo '
$leads: ' . print_r( $leads, true ) . '
'; + //exit; + unset($listResult); + + // If we have list entries - even if it's an empty list + break; + } + $success = true; + $haveLeads = false; + if ($leads !== false) { + + $success = true; + + // If we have any entries + if (count($leads) > 0) { + $haveLeads = true; + } + } + + + + } else { + $leads = false; + } + } else { + $leads = ''; + $search_params = array( + 'mail_ok' => null, + 'member_ok' => null, + 'company' => '', + 'contact' => '', + 'from_date' => '', + 'to_date' => '', + 'interests' => array(), + ); + } + + // Initialize the interests array + $interests = array(); + + // Initialize the grouped_interests array + $grouped_interests = array(); + + switch ( $option ) { + case 'addLog': + echo '
$_REQUEST: ' . print_r( $_REQUEST, true ) . '
'; + + $this->wpdb->insert( + GLM_MEMBERS_TRAVEL_PLUGIN_DB_PREFIX . 'lead_notes', + array( + 'lead' => $this->entryId, + 'created' => date( 'Y-m-d' ), + 'updated' => date( 'Y-m-d' ), + 'notes' => filter_var( $_REQUEST['new_log'], FILTER_SANITIZE_STRING ) + ), + array( + '%d', + '%s', + '%s', + '%s' + ) + ); + + $entry = $this->editEntry( $this->entryId ); + $view = 'edit.html'; + break; + case 'delete': + // echo '
$this->entryId: ' . print_r( $this->entryId, true ) . '
'; + if ( $this->entryId ) { + $return = $this->deleteEntry( $this->entryId, true, 'id' ); + // echo '
$return: ' . print_r( $return, true ) . '
'; + } + $entry = $this->getList(); + $view = 'index.html'; + break; + + case 'update': + $updating = true; + if ( $this->config['loggedInUser']['contactUser'] ) { + break; + } + $entry = $this->updateEntry( $this->entryId ); + $view = 'index.html'; + + break; + + case 'edit': + if ( $this->config['loggedInUser']['contactUser'] ) { + break; + } + // Get the record for this Entry. + $entry = $this->editEntry( $this->entryId ); + + // Use the edit view file. + $view = 'edit.html'; + + break; + + case 'insert': + $inserting = true; + + // Setup the create date and update date + $_REQUEST['create_date'] = date('Y-m-d'); + $_REQUEST['updated'] = date('Y-m-d H:i'); + + $lead = $this->insertEntry(); + + // echo '
$lead: ' . print_r( $lead, true ) . '
'; + + if ( $lead['status'] ) { + // Then goto edit page. + $entry = $lead; + + } else { + // There's an error. + $inserting_error = true; + } + + $view = 'edit.html'; + break; + + case 'add': + if ( $this->config['loggedInUser']['contactUser'] ) { + break; + } + $entry = $this->newEntry(); + $addingLead = true; + + // Use the edit view file. + $view = 'edit.html'; + + break; + + default: + + $entry = $this->getList(); + + // echo '
$entry: ' . print_r( $entry, true ) . '
'; + + $view = 'index.html'; + + break; + } + + // Enqueue the scripts for jqueryui + wp_enqueue_script( 'jquery-ui-tabs' ); + wp_enqueue_style( 'jquery-ui-smoothness', 'https://code.jquery.com/ui/1.12.1/themes/smoothness/jquery-ui.min.css' ); + + // Common things to place into the $templateData array + $templateData = array( + 'hasSearch' => $hasSearch, + 'lead' => $entry, + 'haveLeads' => $haveLeads, + 'leadCount' => $leadCount, + 'numbDisplayed' => $numbDisplayed, + 'lastDisplayed' => $lastDisplayed, + 'prevStart' => $prevStart, + 'nextStart' => $nextStart, + 'prev' => ( isset( $_REQUEST['prevStart'] ) ? $_REQUEST['prevStart'] : ''), + 'next' => ( isset( $_REQUEST['nextStart'] ) ? $_REQUEST['nextStart'] : ''), + 'pageSelect' => ( isset( $_REQUEST['pageSelect'] ) ? $_REQUEST['pageSelect'] : ''), + 'start' => $start, + 'limit' => $limit, + 'paging' => $paging, + 'searching' => $searching, + 'updating' => $updating, + 'updating_error' => $updating_error, + 'inserting' => $inserting, + 'inserting_error' => $inserting_error, + ); + + + // Return status, any suggested view, and any data to controller + return array( + 'status' => true, + 'modelRedirect' => false, + 'view' => 'admin/travel/' . $view, + 'data' => $templateData + ); + + } + +} diff --git a/setup/adminMenus.php b/setup/adminMenus.php index d2decd2..793b4a4 100644 --- a/setup/adminMenus.php +++ b/setup/adminMenus.php @@ -50,3 +50,28 @@ * */ +// Add Travel leads sub-menu for GLM Members Members (admins) +add_submenu_page( + 'glm-members-admin-menu-members', + 'Travel Leads', + 'Travel Leads', + 'glm_members_members', + 'glm-members-admin-menu-glm-travel', + function(){$this->controller('travel');} +); + +// If a contact is logged in (ownEntity isn't false), add Contact Profile menu item +if ( isset( $this->config['loggedInUser']['contactUser'] ) && $this->config['loggedInUser']['contactUser'] ) { + // Check for the option GLM_MEMBERS_LEADS_PLUGIN_MEMBER_ACCESS_OPTION + // $memberCanAccessLeads = get_option( GLM_MEMBERS_LEADS_PLUGIN_MEMBER_ACCESS_OPTION ); + // if ( $memberCanAccessLeads ) { + add_submenu_page( + $mainMenuSlug, + 'Leads', + 'Leads', + 'glm_members_edit_my_entity', + 'glm-members-admin-menu-travel-index', + function() {$this->controller('travel');} + ); + // } +} diff --git a/setup/databaseScripts/create_database_V0.0.1.sql b/setup/databaseScripts/create_database_V0.0.1.sql index 1fc8b5a..a4cf815 100644 --- a/setup/databaseScripts/create_database_V0.0.1.sql +++ b/setup/databaseScripts/create_database_V0.0.1.sql @@ -14,8 +14,10 @@ CREATE TABLE {prefix}leads ( id INT NOT NULL AUTO_INCREMENT, status INT NOT NULL DEFAULT 0, -- Lead Status (active, inactive) create_date DATE NOT NULL, -- Date contact was created + updated DATETIME NOT NULL, -- Updated Timestamp fname TEXT NULL, -- First Name lname TEXT NULL, -- Last Name + email TINYTEXT NULL, -- Email company TEXT NULL, -- Company Name address TEXT NULL, -- Address address2 TEXT NULL, -- Address 2 @@ -57,10 +59,11 @@ CREATE TABLE {prefix}referredby ( ---- -- Lead Notes -CREATE TABLE {prefix}lead_notes +CREATE TABLE {prefix}lead_notes ( id INT NOT NULL AUTO_INCREMENT, lead INT NOT NULL, -- Reference to lead table created DATETIME NOT NULL, -- Created Timestamp + updated DATETIME NOT NULL, -- Updated Timestamp notes TEXT, -- Note Entry PRIMARY KEY (id), INDEX(lead) @@ -72,25 +75,10 @@ CREATE TABLE {prefix}lead_notes CREATE TABLE {prefix}lead_contacts ( id INT NOT NULL AUTO_INCREMENT, lead INT NOT NULL, -- Reference to lead table + updated DATETIME NOT NULL, -- Updated Timestamp name TINYTEXT, -- Name of Contact email TINYTEXT, -- Email of Contact phone TINYTEXT, -- Phone of Contact PRIMARY KEY (id), INDEX(lead) ); - ----- - --- Management -CREATE TABLE {prefix}management ( - id INT NOT NULL AUTO_INCREMENT, - PRIMARY KEY (id) -); - ----- - --- settings_terms -CREATE TABLE {prefix}settings_terms ( - id INT NOT NULL AUTO_INCREMENT, - PRIMARY KEY (id) -); diff --git a/setup/databaseScripts/dbVersions.php b/setup/databaseScripts/dbVersions.php index f271145..1a972c5 100644 --- a/setup/databaseScripts/dbVersions.php +++ b/setup/databaseScripts/dbVersions.php @@ -25,7 +25,7 @@ * again and the proper number of tables that should * exist with that version. */ -$glmMembersDbVersions = array( +$glmMembersTravelDbVersions = array( '0.0.1' => array('version' => '0.0.1', 'tables' => 5, 'date' => '05/18/18'), ); diff --git a/setup/validActions.php b/setup/validActions.php index f132376..89159c2 100644 --- a/setup/validActions.php +++ b/setup/validActions.php @@ -59,9 +59,17 @@ $glmMembersTravelAddOnValidActions = array( 'adminActions' => array( + 'ajax' => array( + 'travelContacts' => GLM_MEMBERS_TRAVEL_PLUGIN_SLUG, + 'travelInterest' => GLM_MEMBERS_TRAVEL_PLUGIN_SLUG, + 'travelNotes' => GLM_MEMBERS_TRAVEL_PLUGIN_SLUG, + ), + 'travel' => array( + 'index' => GLM_MEMBERS_TRAVEL_PLUGIN_SLUG, + ) ), 'frontActions' => array( ) ); -?> \ No newline at end of file +?> diff --git a/views/admin/ajax/contacts/list.html b/views/admin/ajax/contacts/list.html new file mode 100644 index 0000000..5a3487a --- /dev/null +++ b/views/admin/ajax/contacts/list.html @@ -0,0 +1,16 @@ + +
+
+ Add New Contact + + + + +
+
diff --git a/views/admin/ajax/notes/list.html b/views/admin/ajax/notes/list.html new file mode 100644 index 0000000..78c2420 --- /dev/null +++ b/views/admin/ajax/notes/list.html @@ -0,0 +1,14 @@ +
+ + + + + + +
+ +{foreach $notes as $n} +
+ {$n.notes} +
+{/foreach} diff --git a/views/admin/travel/edit.html b/views/admin/travel/edit.html new file mode 100644 index 0000000..d788d19 --- /dev/null +++ b/views/admin/travel/edit.html @@ -0,0 +1,177 @@ +{include file='admin/travel/header.html'} + +

Lead

+{if isset($lead.fieldData) && isset($lead.fieldData.id)} + +{/if} + +
+ + + +
+
+ + + {if isset($lead.fieldData) && isset($lead.fieldData.id)} + + + {else} + + {/if} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Status: + + {if $lead.fieldFail.status}

{$lead.fieldFail.status}

{/if} +
Company: + + {if $lead.fieldFail.company}

{$lead.fieldFail.company}

{/if} +
First Name: + + {if $lead.fieldFail.fname}

{$lead.fieldFail.fname}

{/if} +
Last Name: + + {if $lead.fieldFail.lname}

{$lead.fieldFail.lname}

{/if} +
Address: + + {if $lead.fieldFail.address}

{$lead.fieldFail.address}

{/if} +
Address 2: + + {if $lead.fieldFail.address2}

{$lead.fieldFail.address2}

{/if} +
City: + + {if $lead.fieldFail.city}

{$lead.fieldFail.city}

{/if} +
State/Province: + + {if $lead.fieldFail.state}

{$lead.fieldFail.state}

{/if} +
ZIP/Postal Code: + + {if $lead.fieldFail.zip}

{$lead.fieldFail.zip}

{/if} +
Email: + + {if $lead.fieldFail.email}

{$lead.fieldFail.email}

{/if} +
Phone: + + {if $lead.fieldFail.phone}

{$lead.fieldFail.phone}

{/if} +
Fax: + + {if $lead.fieldFail.fax}

{$lead.fieldFail.fax}

{/if} +
Website: + + {if $lead.fieldFail.website}

{$lead.fieldFail.website}

{/if} +
+ +
+ +
+
+ +
+ + + +{include file='admin/travel/footer.html'} diff --git a/views/admin/travel/footer.html b/views/admin/travel/footer.html new file mode 100644 index 0000000..ebc6381 --- /dev/null +++ b/views/admin/travel/footer.html @@ -0,0 +1,2 @@ + + diff --git a/views/admin/travel/header.html b/views/admin/travel/header.html new file mode 100644 index 0000000..201b1e2 --- /dev/null +++ b/views/admin/travel/header.html @@ -0,0 +1,3 @@ +
+

Travel Leads

+
diff --git a/views/admin/travel/index.html b/views/admin/travel/index.html new file mode 100644 index 0000000..e746ccf --- /dev/null +++ b/views/admin/travel/index.html @@ -0,0 +1,31 @@ +{include file='admin/travel/header.html'} + +{include file='admin/travel/searchForm.html'} + + + + + + + + + + + + + + + {foreach $lead as $e} + + + + + + + + + {/foreach} + +
EditCompanyFirst NameLast NameUpdatedStatus
Edit {$e.company} {$e.fname} {$e.lname} {$e.updated.datetime} {$e.status.name}
+ +{include file='admin/travel/footer.html'} diff --git a/views/admin/travel/searchForm.html b/views/admin/travel/searchForm.html new file mode 100644 index 0000000..cbfd15d --- /dev/null +++ b/views/admin/travel/searchForm.html @@ -0,0 +1,30 @@ +{if $hasSearch} + +{/if} +
+
+

Find Company

+
+
+ + +
+
+
+
+

Find Contact

+
+
+ + +
+
+
+
+

Quick Links

+ New Lead +
+
+ -- 2.17.1