Odyssey
aGroupSearch.prg
1 <?php
2 /**
3  * @package GroupHub
4  * @author MGHandy
5  *
6  * @uses admin group search
7  * * search for groups with no parameters, returning all groups associated with the credit union.
8  * * search for groups by member number, gorup name or user name.
9  * * search for groups by partial member number, group name or user name.
10  *
11  * @var string $sOperation: requested search action
12  * @var string $sMember: requested member number
13  * @var string $sGroup: requested group name
14  * @var string $sUser: requested user name
15  * @var boolean $sPartial: requested search type (partial or exact)
16  * @var string $sSelected: selected group information for encyrption (JSON object string)
17  */
18 
19 require_once("$admLibrary/aGroupSupport.i");
20 require_once("$admLibrary/userSearch.i");
21 
22 try {
23  $admVars = array();
24  $admOk = array(
25  "operation" => array("filter" => FILTER_SANITIZE_STRING),
26  "gParameters" => array("filter" => FILTER_SANITIZE_STRING),
27  "gGroup" => array("filter" => FILTER_SANITIZE_STRING)
28  );
29  HCU_ImportVars($admVars, "GROUP_SEARCH", $admOk);
30 
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;
34 
35  $sContext = GroupContext($SYSENV, $Cu);
36 
37  $aryResult = array();
38  $aryReply = array();
39 
40  switch ($sOperation) {
41  case "":
42  PrintGroupSearch();
43  break;
44  case "groupSearch":
45  header('Content-type: application/json');
46  $sGroups = array();
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";
57  }
58 
59  if ($sGroups['groups'] && count($sGroups['groups']) == 1) {
60  // single group found
61  $sGroup = $sGroups['groups'][0];
62 
63  // add name to context
64  // select group by name
65  $sContext['g_name'] = strtolower($sGroup['g_name']);
66  $sContext["g_id"] = $sGroup["g_id"];
67  $sSelect = GroupSelect($SYSENV, $dbh, $sContext);
68 
69  // get user payload for primary user
70  // admin click user name on group hub screen
71  // to visit user hub with this user
72  // encrypt group
73  $sEncrypt = GroupEncrypt($SYSENV, $Cu, $sSelect);
74 
75  $aryResult['data']['group'] = $sSelect;
76  $aryResult['data']['encrypt'] = $sEncrypt;
77  } else {
78  $aryResult['data']['groups'] = $sGroups['groups'];
79  }
80  GroupReply($aryResult, $aryReply, $sOperation);
81  break;
82 
83  case "groupSelect":
84  header('Content-type: application/json');
85 
86  // decode html
87  // decode json into array
88  $sGroup = html_entity_decode($sGroup, ENT_QUOTES);
89  $sGroup = HCU_JsonDecode($sGroup);
90 
91  // add name to context
92  // select group by name
93  $sContext['g_name'] = strtolower($sGroup['g_name']);
94  $sContext["g_id"] = $sGroup["g_id"];
95  $sSelect = GroupSelect($SYSENV, $dbh, $sContext);
96 
97  // encrypt group
98  $sEncrypt = GroupEncrypt($SYSENV, $Cu, $sSelect);
99 
100  $aryResult['data']['group'] = $sSelect;
101  $aryResult['data']['encrypt'] = $sEncrypt;
102  GroupReply($aryResult, $aryReply, $sOperation);
103  break;
104  default:
105  throw new Exception("Unknown server request: " . $sOperation);
106  break;
107  }
108 
109 } catch (Exception $e) {
110  $aryReply['errors'][] = $e->getMessage();
111  $aryResult['data'] = array();
112  $aryResult['info'] = array();
113 
114  GroupReply($aryResult, $aryReply, $sOperation);
115 }
116 
117 /**
118  * GroupSearchByUser
119  * @uses search for group by any member account associated with it:
120  * * user name
121  *
122  * @param $pEnv array: environment object for debugging
123  * @param $pDbh object: database access object
124  * @param $pContext array: context variable holding decrypted info and cu codes
125  * for use to access tables and values.
126  * @param $pParameters array: list of data fields to search on, validated for
127  * proper database use.
128  *
129  * @return $sqlReturn array: list of groups matching search criteria
130  */
131 function GroupSearchByUser($pEnv, $pDbh, $pContext, $pParameters) {
132  $cuTable = $pContext['cu_table'];
133  $cuCode = $pContext['cu_code'];
134 
135  $sqlReturn = array();
136  $sqlValue = $pParameters['partial'] ?
137  "%{$pParameters['value']}%" :
138  "{$pParameters['value']}";
139  $sqlEq = $pParameters['partial'] ?
140  "LIKE" :
141  "=";
142  $sqlColumns = "
143  g.group_id AS g_id,
144  g.group_name AS g_name,
145  u.user_name AS g_user";
146 
147  $sqlSelect = "
148  SELECT $sqlColumns
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);
155  if (!$sqlSelectRs) {
156  $pEnv['logger']->error(db_last_error());
157  throw new Exception("Failed to select group.");
158  }
159 
160  $sqlReturn['groups'] = db_fetch_all($sqlSelectRs);
161  return $sqlReturn;
162 }
163 
164 /**
165  * GroupSearchByMember
166  * @uses search for group by any member account associated with it:
167  * * member account number
168  *
169  * @param $pEnv array: environment object for debugging
170  * @param $pDbh object: database access object
171  * @param $pContext array: context variable holding decrypted info and cu codes
172  * for use to access tables and values.
173  * @param $pParameters array: list of data fields to search on, validated for
174  * proper database use.
175  *
176  * @return $sqlReturn array: list of groups matching search criteria
177  */
178 function GroupSearchByMember($pEnv, $pDbh, $pContext, $pParameters) {
179  $cuTable = $pContext['cu_table'];
180  $cuCode = $pContext['cu_code'];
181 
182  $sqlReturn = array();
183  $sqlColumns = "
184  g.group_id AS g_id,
185  g.group_name AS g_name,
186  u.user_name AS g_primary";
187  $sqlSelect = "
188  SELECT $sqlColumns
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);
198  if (!$sqlSelectRs) {
199  $pEnv['logger']->error(db_last_error());
200  throw new Exception("Failed to select group.");
201  }
202 
203  $sqlReturn['groups'] = db_fetch_all($sqlSelectRs);
204  return $sqlReturn;
205 }
206 
207 /**
208  * GroupSearchByName
209  * @uses search for group by its name
210  *
211  * @param $pEnv array: environment object for debugging
212  * @param $pDbh object: database access object
213  * @param $pContext array: context variable holding decrypted info and cu codes
214  * for use to access tables and values.
215  * @param $pParameters array: list of data fields to search on, validated for
216  * proper database use.
217  *
218  * @return $sqlReturn array: list of groups matching search criteria
219  */
220 function GroupSearchByName($pEnv, $pDbh, $pContext, $pParameters) {
221  $cuTable = $pContext['cu_table'];
222  $cuCode = $pContext['cu_code'];
223 
224  $sqlReturn = array();
225  $sqlValue = $pParameters['partial'] ?
226  "%{$pParameters['value']}%" :
227  "{$pParameters['value']}";
228  $sqlEq = $pParameters['partial'] ?
229  "LIKE" :
230  "=";
231  $sqlColumns = "
232  g.group_id AS g_id,
233  g.group_name AS g_name,
234  u.user_name AS g_primary";
235  $sqlSelect = "
236  SELECT $sqlColumns
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)";
243 
244  $sqlSelectRs = db_query($sqlSelect, $pDbh);
245  if (!$sqlSelectRs) {
246  $pEnv['logger']->error(db_last_error());
247  throw new Exception("Failed to select group.");
248  }
249 
250  $sqlReturn['groups'] = db_fetch_all($sqlSelectRs);
251  return $sqlReturn;
252 }
253 
254 function GroupParameters($pEnv, $pParameters) {
255  $gParameters = $pParameters;
256  $gValidate = array();
257 
258  // decode into array
259  $gParameters = html_entity_decode($pParameters, ENT_QUOTES);
260  $gParameters = HCU_JsonDecode($gParameters);
261 
262  // validate group_name
263  $parameter = trim($gParameters['parameter']);
264  $parameter = strtolower($parameter);
265  $value = null;
266  switch ($parameter) {
267  case "name":
268  $value = prep_save($gParameters['value'], 50);
269  $value = strtolower($value);
270  $value = trim($value);
271  break;
272  case "member":
273  $value = prep_save($gParameters['value'], 12);
274  $value = preg_replace('/[^0-9]/', "", $value);
275  $value = strtolower($value);
276  $value = trim($value);
277  break;
278  case "user":
279  $value = prep_save($gParameters['value'], 50);
280  $value = strtolower($value);
281  $value = trim($value);
282  break;
283  }
284 
285  $gValidate['partial'] = $partial = $gParameters['partial'] == "t" ? true : false;
286  $gValidate['parameter'] = $parameter;
287  $gValidate['value'] = $value;
288  return $gValidate;
289 }
290 ?>
291 <?php
292 /**
293  * PrintGroupSearch
294  *
295  * @uses this function contains the templates for the search window,
296  * dialogs and results grid.
297  *
298  * this function also contains all javascript needed for the client to display and
299  * interact with the group search feature.
300  */
301 ?>
302 <?php function PrintGroupSearch() { ?>
303 <style type="text/css">
304  #gsSearch input[type="radio"],
305  #gsSearch input[type="checkbox"] {
306  margin-top: -3px;
307  }
308 
309  #gsSearch label[for^="gs"].vsgDisabled,
310  #gsSearch input[type="text"].vsgDisabled,
311  #gsSearch input[type="radio"].vsgDisabled,
312  #gsSearch input[type="checkbox"].vsgDisabled {
313  cursor: not-allowed;
314  }
315 
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);
320  }
321 
322  #gsSearch label[for^="gs"],
323  #gsSearch input[type="radio"],
324  #gsSearch input[type="checkbox"] {
325  cursor: pointer;
326  }
327 
328  #gsResults {
329  overflow: auto !important;
330  }
331 </style>
332 <div id="gsSearch">
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">&ensp;Group Name</label>
338  </div>
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"
341  required>
342  </div>
343  </div>
344 
345  <div class="row hcuSpacer">
346  <div class="col-sm-5">
347  <input type="radio" name="gsRadioField" value="Member">
348  <label for="gsInputMember">&ensp;Account #</label>
349  </div>
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">
352  </div>
353  </div>
354 
355  <div class="row hcuSpacer">
356  <div class="col-sm-5">
357  <input type="radio" name="gsRadioField" value="User">
358  <label for="gsInputUser">&ensp;User Name</label>
359  </div>
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">
362  </div>
363  </div>
364 
365  <div class="row hcuSpacer">
366  <div class="col-sm-5">&nbsp;</div>
367  <div class="col-sm-7">
368  <input type="checkbox" name="gsInputPartial" id="gsInputPartial" class="">
369  <label for="gsInputPartial" id="gsLabelPartial" class="">&ensp;Partial Match</label>
370  </div>
371  </div>
372 </div>
373 
374 <div id="gsResults" class="fusedGridDialog">
375  <div id="gsResultsGrid"></div>
376 </div>
377 
378 <div id="gsNoResults">
379  <p>No groups were found.</p>
380 </div>
381 <?php
382 /**
383  * @package GroupSearch
384  * @uses this object is used to display and interact with the groupsearch feature.
385  *
386  * @var Init public: public call to initialize data/view/action objects
387  * @var Open public: public call to open the group search module/window
388  * @var Close public: public call to close the group search module/window
389  * @var Data public: public call to set previous search results.
390  *
391  * @var InitDataSources private: initialize all data sources/objects
392  * @var InitDataViews private: initialize all data views/objects
393  * @var InitDataActions private: initialize all user actions on html.
394  *
395  * @var EventOpenDialog private: open kendoDialog/kendoWindow objects
396  * @var EventClosedialog private: close kendoDialog/kendoWindow objects
397  * @var EventPopDialog private: remove the correct window from the window stack.
398  *
399  * @var Event* private: other event functions explained by name.
400  * Some are entesions of kendo objects, others just help with events of html objects.
401  *
402  * @var DataBuild* private: these functions facilitate re-constructing
403  * data for proper use in javascript functions and html displays.
404  *
405  */
406 ?>
407 <script type="text/javascript">
408 
409 var GroupSearch = function(results) {
410  var gsCardWindows = null;
411  var gsCardContainer = null;
412 
413  var gsCall = null;
414  var gsAction = null;
415 
416  var gsSearch = null;
417  var gsResults = null;
418  var gsResultsGrid = null;
419  var gsResultsGridData = null;
420  var gsNoResults = null;
421  var gsTip = null;
422 
423  var gsDataSource = null;
424  var ghResults = null;
425 
426  var DataBuildGroups = function(data) {
427  gsResultsGridData = [];
428  for (var i = 0; i < data.length; i++) {
429  var group = {};
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);
435  }
436 
437  gsResultsGrid.dataSource.data(gsResultsGridData);
438  }
439 
440  var EventShowTip = function(e) {
441  var target = $(e.target);
442  var id = target.attr("id");
443  var content = "";
444 
445  switch (id) {
446  case "gsInputName":
447  case "gsInputMember":
448  case "gsInputUser":
449  content = "Group search does not allow multiple fields.";
450  break;
451  case "gsLabelPartial":
452  case "gsInputPartial":
453  content = "Partial search is not allowed for the selected field.";
454  break;
455  }
456  return content;
457  }
458 
459  var EventOpenWindow = function(e) {
460  var windowElement = this.element[0];
461  var windowId = windowElement.id;
462 
463  switch (windowId) {
464  case "gsSearch":
465  $("#gsInputName").focus();
466  $("#gsInputName").val("");
467  $("#gsInputMember").val("");
468  $("#gsInputUser").val("");
469  $("#gsInputPartial").prop("checked", false);
470 
471  $("input[name=gsRadioField][value='" + (ghSearchOptionSelected == null ? "Name" : ghSearchOptionSelected) + "']").trigger("click");
472  break;
473  case "gsResults":
474  if (ghSearchRowSelected != null)
475  $("#gsResultsGrid tbody tr:eq("+ ghSearchRowSelected + ")").addClass("k-state-selected");
476  break;
477  }
478 
479  gsCardWindows.push(this);
480  }
481 
482  var EventCloseWindow = function(e) {
483  var windowElement = this.element[0];
484  var windowId = windowElement.id;
485 
486  switch (gsAction) {
487  case "searchSubmit":
488  var radio = $("input[name=gsRadioField]:checked");
489  var rValue = radio.val();
490  var input = $("#gsInput" + rValue);
491  var iValue = input.val().trim();
492 
493  if ($.homecuValidator.validate()) {
494  var groupData = {
495  parameter: rValue,
496  value: iValue,
497  partial: $("#gsInputPartial").prop("checked")
498  };
499 
500  var groupRequest = {
501  operation: "groupSearch",
502  gParameters: JSON.stringify(groupData)
503  };
504 
505  gsDataSource.transport.options.read.type = "POST";
506  gsDataSource.read(groupRequest);
507  EventPopWindow(windowId);
508  } else {
509  e.preventDefault();
510  }
511  break;
512  case "searchStart":
513  EventPopWindow(windowId);
514  gsSearch.open();
515  break;
516  default:
517  EventPopWindow(windowId);
518  break;
519  }
520 
521  gsAction = null;
522  }
523 
524  var EventPopWindow = function(windowId) {
525  var popIndex = -1;
526  for (var i = 0; i < gsCardWindows.length; i++) {
527  var openWindow = gsCardWindows[i].element[0];
528  var openId = openWindow.id;
529 
530  if (openId == windowId) {
531  popIndex = i;
532  break;
533  }
534  }
535 
536  if (popIndex > -1) {
537  gsCardWindows.splice(popIndex, 1);
538  }
539  }
540 
541  var InitDataSources = function() {
542  gsDataSource = new kendo.data.DataSource({
543  transport: {
544  read: {
545  url: "main.prg",
546  dataType: "json",
547  contentType: "application/x-www-form-urlencoded",
548  type: "GET",
549  cache: false,
550  data: {
551  ft: "102102"
552  }
553  }
554  },
555  requestStart: function(request) {
556  showWaitWindow();
557  },
558  requestEnd: function(response) {
559  setTimeout(hideWaitWindow, 500);
560 
561  if (response.hasOwnProperty("response")) {
562  if (response.response.hasOwnProperty("Results")) {
563  var results = response.response.Results;
564 
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);
571  }
572  } else {
573  $.homecuValidator.displayMessage("Error Parsing Server", $.homecuValidator.settings.statusError);
574  }
575  } else {
576  $.homecuValidator.displayMessage("Error Parsing Server", $.homecuValidator.settings.statusError);
577  }
578  },
579  schema: {
580  parse: function(response) {
581  var results = null;
582  var resultData = null;
583  var resultOperation = null;
584 
585  if (response.hasOwnProperty("Results")) {
586  results = response.Results;
587  resultData = results.data;
588  resultOperation = results.operation;
589  } else {
590  return [];
591  }
592 
593  if (results.hasOwnProperty("errors")) {
594  return [];
595  }
596 
597  if (resultData == undefined || resultData == null) {
598  return [];
599  }
600 
601  setTimeout(function() {
602  switch (resultOperation) {
603  case "groupSearchByName":
604  case "groupSearchByMember":
605  case "groupSearchByUser":
606  if (resultData.encrypt) {
607  // single result, don't preserve list
608  gsCall("updateGroupResults", []);
609  }
610  // No break so fall through.
611  case "groupSelect":
612  if (resultData.encrypt) {
613  // single group found
614  gsCall("updateGroupInfo", resultData.group);
615  gsCall("updateGroupEncrypt", resultData.encrypt);
616  } else {
617  if (resultData.groups) {
618  DataBuildGroups(resultData.groups);
619  if (resultOperation == "groupSearchByUser") {
620  gsResultsGrid.showColumn(2);
621  } else {
622  gsResultsGrid.hideColumn(2);
623  }
624  gsResults.open();
625  gsCall("updateGroupResults", gsResultsGridData);
626  } else {
627  gsNoResults.open();
628  }
629  }
630 
631  if (resultOperation != "groupSelect") // Changing the group back and forth in the result list should not clear the option selected.
632  {
633  // Perserve the option before it is maybe removed.
634  ghSearchOptionSelected= $("[name='gsRadioField']:checked").val();
635  }
636  break;
637  }
638 
639  }, 500);
640 
641  return [];
642  }
643  }
644  });
645  }
646 
647  var InitDataViews = function() {
648  gsSearch = $("#gsSearch").kendoDialog({
649  title: "Group Search",
650  modal: true,
651  minWidth: 400,
652  maxWidth: 900,
653  visible: false,
654  resizable: false,
655  show: EventOpenWindow,
656  close: EventCloseWindow,
657  actions: [
658  { text: "Cancel",
659  action: function() { gsAction = "searchCancel"; }
660  },
661  { text: "Search", primary: true,
662  action: function() { gsAction = "searchSubmit"; }
663  }
664  ]
665  }).data("kendoDialog");
666 
667  gsTip = homecuTooltip.defaults;
668  gsTip.filter = ".vsgDisabled";
669  gsTip.content = EventShowTip;
670  $("#gsSearch").kendoTooltip(gsTip);
671 
672  gsResults = $("#gsResults").kendoDialog({
673  title: "Group Select",
674  modal: true,
675  minWidth: 300,
676  maxWidth: 900,
677  maxHeight: 500,
678  visible: false,
679  resizable: false,
680  show: EventOpenWindow,
681  close: EventCloseWindow,
682  actions: [
683  { text: "Cancel",
684  action: function() { gsAction = "searchCancel"; }
685  },
686  { text: "Start Over", primary: true,
687  action: function() { gsAction = "searchStart"; }
688  }
689  ]
690  }).data("kendoDialog");
691 
692  gsNoResults = $("#gsNoResults").kendoDialog({
693  title: "Group Select",
694  modal: true,
695  minWidth: 300,
696  maxWidth: 900,
697  visible: false,
698  resizable: false,
699  show: EventOpenWindow,
700  close: EventCloseWindow,
701  actions: [
702  { text: "Cancel",
703  action: function() { gsAction = "searchCancel"; }
704  },
705  { text: "Start Over", primary: true,
706  action: function() { gsAction = "searchStart"; }
707  }
708  ]
709  }).data("kendoDialog");
710 
711  gsResultsGrid = $("#gsResultsGrid").kendoGrid({
712  selectable: "row",
713  scrollable: true,
714  sortable: true,
715  change: function(e) {
716  var row = this.select();
717  var rowItem = this.dataItem(row);
718 
719  var groupRequest = {
720  operation: "groupSelect",
721  gGroup: JSON.stringify(rowItem)
722  };
723 
724  gsResults.close();
725  gsDataSource.transport.options.read.type = "POST";
726  gsDataSource.read(groupRequest);
727 
728  ghSearchRowSelected= row.index();
729  },
730  dataSource: {
731  data: gsResultsGridData
732  },
733  columns: [
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"},
738  ]
739  }).data("kendoGrid");
740  }
741 
742  var InitDataActions = function() {
743  // enter key action:
744  $("#gsInputName, #gsInputMember, #gsInputUser").on("keyup", function(e) {
745  var key = e.keyCode || e.which;
746  if (key == 13) { gsAction = "searchSubmit"; gsSearch.close(); }
747  });
748 
749  // radio change
750  $("#gsSearch input[name=gsRadioField]").on("change", function(e) {
751  var input = $(this);
752  var value = input.val();
753 
754  // clear previous input
755  // disable previous input
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");
762 
763  // enable check field
764  $("#gsInput" + value).prop("disabled", false);
765  $("#gsInput" + value).prop("required", "required");
766  $("#gsInput" + value).removeClass("vsgDisabled");
767  $("#gsInput" + value).focus();
768 
769  // enable/disabe partial field
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");
779  }
780  });
781 
782  // label clicks to select
783  $("#gsSearch label[for^=gs]").on("click", function(e) {
784  var label = $(this);
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");
789  });
790  }
791 
792  this.Open = function(windowStack) {
793  // setup validator
794  $.homecuValidator.setup({
795  formStatusField: "status",
796  formValidate: "gsSearch"
797  });
798 
799  gsCardWindows = windowStack;
800  if (ghResults != null && ghResults.length > 0)
801  {
802  $("#gsResultsGrid").data("kendoGrid").dataSource.data(ghResults);
803  gsResults.open();
804  }
805  else
806  gsSearch.open();
807  }
808 
809  this.Close = function() {
810 
811  gsSearch.destroy();
812  gsResults.destroy();
813  gsNoResults.destroy();
814  }
815 
816  this.Data = function(data, optionSelected) {
817  ghResults = data;
818  ghSearchOptionSelected= optionSelected;
819  }
820 
821  this.Init = function(hubCall, cardContainer) {
822  gsCall = hubCall;
823  gsCardContainer = cardContainer;
824 
825  InitDataSources();
826  InitDataViews();
827  InitDataActions();
828  }
829 }
830 </script>
831 <?php } ?>
832 
833 
834 
835 
836 
837 
838 
839 
840 
Definition: User.php:7