19 require_once(
"$admLibrary/aGroupSupport.i");
20 require_once(
"$admLibrary/userSearch.i");
25 "operation" => array(
"filter" => FILTER_SANITIZE_STRING),
26 "gParameters" => array(
"filter" => FILTER_SANITIZE_STRING),
27 "gGroup" => array(
"filter" => FILTER_SANITIZE_STRING)
29 HCU_ImportVars($admVars,
"GROUP_SEARCH", $admOk);
31 $sOperation = isset($admVars[
"GROUP_SEARCH"][
"operation"]) ? $admVars[
"GROUP_SEARCH"][
"operation"] :
null;
32 $sParameters = isset($admVars[
"GROUP_SEARCH"][
"gParameters"]) ? $admVars[
"GROUP_SEARCH"][
"gParameters"] :
null;
33 $sGroup = isset($admVars[
"GROUP_SEARCH"][
"gGroup"]) ? $admVars[
"GROUP_SEARCH"][
"gGroup"] :
null;
35 $sContext = GroupContext($SYSENV, $Cu);
40 switch ($sOperation) {
45 header(
'Content-type: application/json');
47 $sParams = GroupParameters($SYSENV, $sParameters);
48 if ($sParams[
'parameter'] ==
"name") {
49 $sGroups = GroupSearchByName($SYSENV, $dbh, $sContext, $sParams);
50 $sOperation =
"groupSearchByName";
51 }
else if ($sParams[
'parameter'] ==
"member") {
52 $sGroups = GroupSearchByMember($SYSENV, $dbh, $sContext, $sParams);
53 $sOperation =
"groupSearchByMember";
54 }
else if ($sParams[
'parameter'] ==
"user") {
55 $sGroups = GroupSearchByUser($SYSENV, $dbh, $sContext, $sParams);
56 $sOperation =
"groupSearchByUser";
59 if ($sGroups[
'groups'] && count($sGroups[
'groups']) == 1) {
61 $sGroup = $sGroups[
'groups'][0];
65 $sContext[
'g_name'] = strtolower($sGroup[
'g_name']);
66 $sContext[
"g_id"] = $sGroup[
"g_id"];
67 $sSelect = GroupSelect($SYSENV, $dbh, $sContext);
73 $sEncrypt = GroupEncrypt($SYSENV, $Cu, $sSelect);
75 $aryResult[
'data'][
'group'] = $sSelect;
76 $aryResult[
'data'][
'encrypt'] = $sEncrypt;
78 $aryResult[
'data'][
'groups'] = $sGroups[
'groups'];
80 GroupReply($aryResult, $aryReply, $sOperation);
84 header(
'Content-type: application/json');
88 $sGroup = html_entity_decode($sGroup, ENT_QUOTES);
89 $sGroup = HCU_JsonDecode($sGroup);
93 $sContext[
'g_name'] = strtolower($sGroup[
'g_name']);
94 $sContext[
"g_id"] = $sGroup[
"g_id"];
95 $sSelect = GroupSelect($SYSENV, $dbh, $sContext);
98 $sEncrypt = GroupEncrypt($SYSENV, $Cu, $sSelect);
100 $aryResult[
'data'][
'group'] = $sSelect;
101 $aryResult[
'data'][
'encrypt'] = $sEncrypt;
102 GroupReply($aryResult, $aryReply, $sOperation);
105 throw new Exception(
"Unknown server request: " . $sOperation);
109 }
catch (Exception $e) {
110 $aryReply[
'errors'][] = $e->getMessage();
111 $aryResult[
'data'] = array();
112 $aryResult[
'info'] = array();
114 GroupReply($aryResult, $aryReply, $sOperation);
131 function GroupSearchByUser($pEnv, $pDbh, $pContext, $pParameters) {
132 $cuTable = $pContext[
'cu_table'];
133 $cuCode = $pContext[
'cu_code'];
135 $sqlReturn = array();
136 $sqlValue = $pParameters[
'partial'] ?
137 "%{$pParameters['value']}%" :
138 "{$pParameters['value']}";
139 $sqlEq = $pParameters[
'partial'] ?
144 g.group_name AS g_name, 145 u.user_name AS g_user";
149 FROM {$cuTable}user u 150 LEFT JOIN {$cuTable}group g 151 ON g.group_id = u.group_id 152 WHERE LOWER(u.user_name) $sqlEq '$sqlValue' 153 ORDER BY lower(g.group_name)";
154 $sqlSelectRs = db_query($sqlSelect, $pDbh);
156 $pEnv[
'logger']->error(db_last_error());
157 throw new Exception(
"Failed to select group.");
160 $sqlReturn[
'groups'] = db_fetch_all($sqlSelectRs);
178 function GroupSearchByMember($pEnv, $pDbh, $pContext, $pParameters) {
179 $cuTable = $pContext[
'cu_table'];
180 $cuCode = $pContext[
'cu_code'];
182 $sqlReturn = array();
185 g.group_name AS g_name, 186 u.user_name AS g_primary";
189 FROM {$cuTable}useraccounts a 190 INNER JOIN {$cuTable}user u 191 ON u.user_id = a.user_id 192 RIGHT JOIN {$cuTable}group g 193 ON g.group_id = u.group_id 194 WHERE LOWER(a.accountnumber) = '{$pParameters['value']}' 195 AND u.is_group_primary = 'TRUE' 196 ORDER BY lower(g.group_name)";
197 $sqlSelectRs = db_query($sqlSelect, $pDbh);
199 $pEnv[
'logger']->error(db_last_error());
200 throw new Exception(
"Failed to select group.");
203 $sqlReturn[
'groups'] = db_fetch_all($sqlSelectRs);
220 function GroupSearchByName($pEnv, $pDbh, $pContext, $pParameters) {
221 $cuTable = $pContext[
'cu_table'];
222 $cuCode = $pContext[
'cu_code'];
224 $sqlReturn = array();
225 $sqlValue = $pParameters[
'partial'] ?
226 "%{$pParameters['value']}%" :
227 "{$pParameters['value']}";
228 $sqlEq = $pParameters[
'partial'] ?
233 g.group_name AS g_name, 234 u.user_name AS g_primary";
237 FROM {$cuTable}group g 238 LEFT JOIN {$cuTable}user u 239 ON u.group_id = g.group_id 240 AND u.is_group_primary = 'TRUE' 241 WHERE LOWER(g.group_name) $sqlEq '$sqlValue' 242 ORDER BY lower(g.group_name)";
244 $sqlSelectRs = db_query($sqlSelect, $pDbh);
246 $pEnv[
'logger']->error(db_last_error());
247 throw new Exception(
"Failed to select group.");
250 $sqlReturn[
'groups'] = db_fetch_all($sqlSelectRs);
254 function GroupParameters($pEnv, $pParameters) {
255 $gParameters = $pParameters;
256 $gValidate = array();
259 $gParameters = html_entity_decode($pParameters, ENT_QUOTES);
260 $gParameters = HCU_JsonDecode($gParameters);
263 $parameter = trim($gParameters[
'parameter']);
264 $parameter = strtolower($parameter);
266 switch ($parameter) {
268 $value = prep_save($gParameters[
'value'], 50);
269 $value = strtolower($value);
270 $value = trim($value);
273 $value = prep_save($gParameters[
'value'], 12);
274 $value = preg_replace(
'/[^0-9]/',
"", $value);
275 $value = strtolower($value);
276 $value = trim($value);
279 $value = prep_save($gParameters[
'value'], 50);
280 $value = strtolower($value);
281 $value = trim($value);
285 $gValidate[
'partial'] = $partial = $gParameters[
'partial'] ==
"t" ? true :
false;
286 $gValidate[
'parameter'] = $parameter;
287 $gValidate[
'value'] = $value;
302 <?php
function PrintGroupSearch() { ?>
303 <style type=
"text/css">
304 #gsSearch input[type="radio"], 305 #gsSearch input[type="checkbox"] { 309 #gsSearch label[for^="gs"].vsgDisabled, 310 #gsSearch input[type="text"].vsgDisabled, 311 #gsSearch input[type="radio"].vsgDisabled, 312 #gsSearch input[type="checkbox"].vsgDisabled { 316 #gsSearch input[type="text"].vsgDisabled, 317 #gsSearch input[type="radio"].vsgDisabled, 318 #gsSearch input[type="checkbox"].vsgDisabled { 319 background-color: rgba(0,0,0,.18);
322 #gsSearch label[for^="gs"], 323 #gsSearch input[type="radio"], 324 #gsSearch input[type="checkbox"] { 329 overflow:
auto !important;
333 <div
id=
"status"></div>
334 <div
class=
"row hcuSpacer">
335 <div
class=
"col-sm-5">
336 <input type=
"radio" name=
"gsRadioField" value=
"Name" checked=
"true">
337 <label
for=
"gsInputName"> Group Name</label>
339 <div
class=
"col-sm-7">
340 <input type=
"text" name=
"gsInputName" id=
"gsInputName" maxlength=
"50" class=
"k-input k-textbox hcu-all-100" data-required-msg=
"Group name is required" 345 <div
class=
"row hcuSpacer">
346 <div
class=
"col-sm-5">
347 <input type=
"radio" name=
"gsRadioField" value=
"Member">
348 <label
for=
"gsInputMember"> Account #</label>
350 <div
class=
"col-sm-7">
351 <input type=
"text" name=
"gsInputMember" id=
"gsInputMember" maxlength=
"12" class=
"k-input k-textbox hcu-all-100 vsgDisabled" disabled=
"true" data-required-msg=
"Account number is required">
355 <div
class=
"row hcuSpacer">
356 <div
class=
"col-sm-5">
357 <input type=
"radio" name=
"gsRadioField" value=
"User">
358 <label
for=
"gsInputUser"> 
User Name</label>
360 <div
class=
"col-sm-7">
361 <input type=
"text" name=
"gsInputUser" id=
"gsInputUser" maxlength=
"50" class=
"k-input k-textbox hcu-all-100 vsgDisabled" disabled=
"true" data-required-msg=
"User name is required">
365 <div
class=
"row hcuSpacer">
366 <div
class=
"col-sm-5"> </div>
367 <div
class=
"col-sm-7">
368 <input type=
"checkbox" name=
"gsInputPartial" id=
"gsInputPartial" class=
"">
369 <label
for=
"gsInputPartial" id=
"gsLabelPartial" class=
""> Partial Match</label>
374 <div
id=
"gsResults" class=
"fusedGridDialog">
375 <div
id=
"gsResultsGrid"></div>
378 <div
id=
"gsNoResults">
379 <p>No groups were found.</p>
407 <script type=
"text/javascript">
410 var gsCardWindows =
null;
411 var gsCardContainer =
null;
417 var gsResults =
null;
418 var gsResultsGrid =
null;
419 var gsResultsGridData =
null;
420 var gsNoResults =
null;
423 var gsDataSource =
null;
424 var ghResults =
null;
426 var DataBuildGroups =
function(data) {
427 gsResultsGridData = [];
428 for (var i = 0; i < data.length; i++) {
430 group.g_name = data[i].g_name ? data[i].g_name.trim() :
"";
431 group.g_primary = data[i].g_primary ? data[i].g_primary.trim() :
"";
432 group.g_user = data[i].g_user ? data[i].g_user.trim() :
"";
433 group.g_id = data[i].g_id ? data[i].g_id.trim() :
"";
434 gsResultsGridData.push(group);
437 gsResultsGrid.dataSource.data(gsResultsGridData);
440 var EventShowTip =
function(e) {
441 var target = $(e.target);
442 var
id = target.attr(
"id");
447 case "gsInputMember":
449 content =
"Group search does not allow multiple fields.";
451 case "gsLabelPartial":
452 case "gsInputPartial":
453 content =
"Partial search is not allowed for the selected field.";
459 var EventOpenWindow =
function(e) {
460 var windowElement = this.element[0];
461 var windowId = windowElement.id;
465 $(
"#gsInputName").focus();
466 $(
"#gsInputName").val(
"");
467 $(
"#gsInputMember").val(
"");
468 $(
"#gsInputUser").val(
"");
469 $(
"#gsInputPartial").prop(
"checked",
false);
471 $(
"input[name=gsRadioField][value='" + (ghSearchOptionSelected ==
null ?
"Name" : ghSearchOptionSelected) +
"']").trigger(
"click");
474 if (ghSearchRowSelected !=
null)
475 $(
"#gsResultsGrid tbody tr:eq("+ ghSearchRowSelected +
")").addClass(
"k-state-selected");
479 gsCardWindows.push(
this);
482 var EventCloseWindow =
function(e) {
483 var windowElement = this.element[0];
484 var windowId = windowElement.id;
488 var radio = $(
"input[name=gsRadioField]:checked");
489 var rValue = radio.val();
490 var input = $(
"#gsInput" + rValue);
491 var iValue = input.val().trim();
493 if ($.homecuValidator.validate()) {
497 partial: $(
"#gsInputPartial").prop(
"checked")
501 operation:
"groupSearch",
502 gParameters: JSON.stringify(groupData)
505 gsDataSource.transport.options.read.type =
"POST";
506 gsDataSource.read(groupRequest);
507 EventPopWindow(windowId);
513 EventPopWindow(windowId);
517 EventPopWindow(windowId);
524 var EventPopWindow =
function(windowId) {
526 for (var i = 0; i < gsCardWindows.length; i++) {
527 var openWindow = gsCardWindows[i].element[0];
528 var openId = openWindow.id;
530 if (openId == windowId) {
537 gsCardWindows.splice(popIndex, 1);
541 var InitDataSources =
function() {
542 gsDataSource =
new kendo.data.DataSource({
547 contentType:
"application/x-www-form-urlencoded",
555 requestStart:
function(request) {
558 requestEnd:
function(response) {
559 setTimeout(hideWaitWindow, 500);
561 if (response.hasOwnProperty(
"response")) {
562 if (response.response.hasOwnProperty(
"Results")) {
563 var results = response.response.Results;
565 if (results.hasOwnProperty(
"error")) {
566 $.homecuValidator.homecuResetMessage =
true;
567 $.homecuValidator.displayMessage(results.error, $.homecuValidator.settings.statusError);
568 }
else if (results.hasOwnProperty(
"info")) {
569 $.homecuValidator.homecuResetMessage =
true;
570 $.homecuValidator.displayMessage(results.info, $.homecuValidator.settings.statusSuccess);
573 $.homecuValidator.displayMessage(
"Error Parsing Server", $.homecuValidator.settings.statusError);
576 $.homecuValidator.displayMessage(
"Error Parsing Server", $.homecuValidator.settings.statusError);
580 parse:
function(response) {
582 var resultData =
null;
583 var resultOperation =
null;
585 if (response.hasOwnProperty(
"Results")) {
586 results = response.Results;
587 resultData = results.data;
588 resultOperation = results.operation;
593 if (results.hasOwnProperty(
"errors")) {
597 if (resultData == undefined || resultData ==
null) {
601 setTimeout(
function() {
602 switch (resultOperation) {
603 case "groupSearchByName":
604 case "groupSearchByMember":
605 case "groupSearchByUser":
606 if (resultData.encrypt) {
608 gsCall(
"updateGroupResults", []);
612 if (resultData.encrypt) {
614 gsCall(
"updateGroupInfo", resultData.group);
615 gsCall(
"updateGroupEncrypt", resultData.encrypt);
617 if (resultData.groups) {
618 DataBuildGroups(resultData.groups);
619 if (resultOperation ==
"groupSearchByUser") {
620 gsResultsGrid.showColumn(2);
622 gsResultsGrid.hideColumn(2);
625 gsCall(
"updateGroupResults", gsResultsGridData);
631 if (resultOperation !=
"groupSelect")
634 ghSearchOptionSelected= $(
"[name='gsRadioField']:checked").val();
647 var InitDataViews =
function() {
648 gsSearch = $(
"#gsSearch").kendoDialog({
649 title:
"Group Search",
655 show: EventOpenWindow,
656 close: EventCloseWindow,
659 action:
function() { gsAction =
"searchCancel"; }
661 { text:
"Search", primary:
true,
662 action:
function() { gsAction =
"searchSubmit"; }
665 }).data(
"kendoDialog");
667 gsTip = homecuTooltip.defaults;
668 gsTip.filter =
".vsgDisabled";
669 gsTip.content = EventShowTip;
670 $(
"#gsSearch").kendoTooltip(gsTip);
672 gsResults = $(
"#gsResults").kendoDialog({
673 title:
"Group Select",
680 show: EventOpenWindow,
681 close: EventCloseWindow,
684 action:
function() { gsAction =
"searchCancel"; }
686 { text:
"Start Over", primary:
true,
687 action:
function() { gsAction =
"searchStart"; }
690 }).data(
"kendoDialog");
692 gsNoResults = $(
"#gsNoResults").kendoDialog({
693 title:
"Group Select",
699 show: EventOpenWindow,
700 close: EventCloseWindow,
703 action:
function() { gsAction =
"searchCancel"; }
705 { text:
"Start Over", primary:
true,
706 action:
function() { gsAction =
"searchStart"; }
709 }).data(
"kendoDialog");
711 gsResultsGrid = $(
"#gsResultsGrid").kendoGrid({
715 change:
function(e) {
716 var row = this.select();
717 var rowItem = this.dataItem(row);
720 operation:
"groupSelect",
721 gGroup: JSON.stringify(rowItem)
725 gsDataSource.transport.options.read.type =
"POST";
726 gsDataSource.read(groupRequest);
728 ghSearchRowSelected= row.index();
731 data: gsResultsGridData
734 { title:
"Group", field:
"g_name" },
735 { title:
"Primary Owner", field:
"g_primary" },
736 { title:
"User Name", field:
"g_user" },
737 { hidden:
true, field:
"g_id"},
739 }).data(
"kendoGrid");
742 var InitDataActions =
function() {
744 $(
"#gsInputName, #gsInputMember, #gsInputUser").on(
"keyup",
function(e) {
745 var key = e.keyCode || e.which;
746 if (key == 13) { gsAction =
"searchSubmit"; gsSearch.close(); }
750 $(
"#gsSearch input[name=gsRadioField]").on(
"change",
function(e) {
752 var value = input.val();
756 $(
"#gsSearch input[type=text]:not(:disabled)").val(
"");
757 $(
"#gsSearch input[type=text]:not(:disabled)").addClass(
"vsgDisabled");
758 $(
"#gsSearch input[type=text]:not(:disabled)").removeClass(
"k-invalid");
759 $(
"#gsSearch input[type=text]:not(:disabled)").css(
"border",
"1px solid #ceced2");
760 $(
"#gsSearch input[type=text]:not(:disabled)").prop(
"disabled",
true);
761 $(
"#gsSearch input[type=text]:not(:disabled)").removeProp(
"required");
764 $(
"#gsInput" + value).prop(
"disabled",
false);
765 $(
"#gsInput" + value).prop(
"required",
"required");
766 $(
"#gsInput" + value).removeClass(
"vsgDisabled");
767 $(
"#gsInput" + value).focus();
770 if (value ==
"Name" || value ==
"User") {
771 $(
"#gsInputPartial").prop(
"disabled",
false);
772 $(
"#gsInputPartial").removeClass(
"vsgDisabled");
773 $(
"#gsSearch label[for=gsInputPartial]").removeClass(
"vsgDisabled");
774 }
else if (value ==
"Member") {
775 $(
"#gsInputPartial").prop(
"disabled",
true);
776 $(
"#gsInputPartial").prop(
"checked",
false);
777 $(
"#gsInputPartial").addClass(
"vsgDisabled");
778 $(
"#gsLabelPartial").addClass(
"vsgDisabled");
783 $(
"#gsSearch label[for^=gs]").on(
"click",
function(e) {
785 var
id = label.attr(
"for");
786 var value =
id.substring(7,
id.length);
787 var input = $(
"#gsSearch input[name=gsRadioField][value=" + value +
"]");
788 input.trigger(
"click");
792 this.Open =
function(windowStack) {
794 $.homecuValidator.setup({
795 formStatusField:
"status",
796 formValidate:
"gsSearch" 799 gsCardWindows = windowStack;
800 if (ghResults !=
null && ghResults.length > 0)
802 $(
"#gsResultsGrid").data(
"kendoGrid").dataSource.data(ghResults);
809 this.Close =
function() {
813 gsNoResults.destroy();
816 this.Data =
function(data, optionSelected) {
818 ghSearchOptionSelected= optionSelected;
821 this.Init =
function(hubCall, cardContainer) {
823 gsCardContainer = cardContainer;