Browse Source

#26000 Add Post Code in in Push Notification

#27925  api crdentials
Prod
shakun 6 months ago
parent
commit
895585f63e
  1. 57
      Swift.DAL/BL/SwiftSystem/ApplicationUserDao.cs
  2. 3
      Swift.DAL/MobileDao/MobileConfigDao.cs
  3. 16
      Swift.DAL/SwiftDAL/DbResult.cs
  4. 18
      Swift.web/Library/GetStatic.cs
  5. 135
      Swift.web/MobileRemit/Admin/PushNotification/ManageBroadCast.aspx
  6. 16
      Swift.web/MobileRemit/Admin/PushNotification/ManageBroadCast.aspx.cs
  7. 25
      Swift.web/MobileRemit/Admin/PushNotification/ManageBroadCast.aspx.designer.cs
  8. 8
      Swift.web/Remit/Transaction/Reports/TransactionNew/TranReport.aspx.cs
  9. 115
      Swift.web/SwiftSystem/UserManagement/AgentUserSetup/List.aspx
  10. 34
      Swift.web/SwiftSystem/UserManagement/AgentUserSetup/List.aspx.cs

57
Swift.DAL/BL/SwiftSystem/ApplicationUserDao.cs

@ -362,5 +362,62 @@ namespace Swift.DAL.BL.System.UserManagement
}
#endregion
#region Inbound API
public UserApiKeysModel GetApiCredentials(string userId, string userName)
{
UserApiKeysModel response = new UserApiKeysModel();
string sql = "EXEC PROC_USER_API_KEY";
sql += " @flag = 'GET-SECRET-KEYS'";
sql += ", @User = " + FilterString(userName);
sql += ", @userId = " + FilterString(userId);
DataRow dr = ExecuteDataRow(sql);
if (dr == null)
{
response.responseCode = "1";
response.responseMessage = "API auth keys not set";
return response;
}
response.responseCode = "0";
response.responseMessage = "Success";
response.UserId = Convert.ToString(dr["UserId"]);
response.APISecretKey = Convert.ToString(dr["APISecretKey"]);
response.AppId = Convert.ToString(dr["AppId"]);
return response;
}
public UserApiKeysModel GenerateCredentials(string userId, string userName, ApiSecretKeys apiCredentials)
{
UserApiKeysModel response = new UserApiKeysModel();
string sql = "EXEC PROC_USER_API_KEY";
sql += " @flag = 'REGENERATE'";
sql += ", @User = " + FilterString(userName);
sql += ", @userId = " + FilterString(userId);
sql += ", @ApiKey = " + FilterString(apiCredentials.ApiKey);
sql += ", @AppId = " + FilterString(apiCredentials.AppId);
DataRow dr = ExecuteDataRow(sql);
if (dr == null)
{
response.responseCode = "1";
response.responseMessage = "API auth keys not set";
return response;
}
response.responseCode = "0";
response.responseMessage = "Success";
response.UserId = Convert.ToString(dr["UserId"]);
response.APISecretKey = Convert.ToString(dr["APISecretKey"]);
response.AppId = Convert.ToString(dr["AppId"]);
return response;
}
#endregion
}
}

3
Swift.DAL/MobileDao/MobileConfigDao.cs

@ -78,7 +78,7 @@ namespace Swift.DAL.MobileDao
return ParseDbResult(sql);
}
public DbResult SaveBroadCastCustomer(string user, string rowId, string customerId, string msgType, string body, string customerType , string nativeCountry)
public DbResult SaveBroadCastCustomer(string user, string rowId, string customerId, string msgType, string body, string customerType , string nativeCountry, string postCode)
{
var sql = "EXEC ProcMobileConfig @flag = '" + (string.IsNullOrEmpty(rowId) ? "IN-BROADCAST" : "UN-BROADCAST") + "'";
sql += ", @User = " + FilterString(user);
@ -88,6 +88,7 @@ namespace Swift.DAL.MobileDao
sql += ", @msgType = " + FilterString(msgType);
sql += ", @customerType = " + FilterString(customerType);
sql += ", @nativeCountry = " + FilterString(nativeCountry);
sql += ", @postCode = " + FilterString(postCode);
return ParseDbResult(sql);
}

16
Swift.DAL/SwiftDAL/DbResult.cs

@ -70,4 +70,20 @@
Data = data;
}
}
public class UserApiKeysModel
{
public string responseCode { get; set; }
public string responseMessage { get; set; }
public string AppId { get; set; }
public string APISecretKey { get; set; }
public string UserId { get; set; }
}
public class ApiSecretKeys
{
public string ApiKey { get; set; }
public string AppId { get; set; }
}
}

18
Swift.web/Library/GetStatic.cs

@ -21,6 +21,7 @@ using System.IO;
using System.Xml.Serialization;
using SelectPdf;
using Newtonsoft.Json;
using System.Security.Cryptography;
//using SelectPdf;
@ -2660,6 +2661,23 @@ namespace Swift.web.Library
return MimeTypes.MimeTypeMap.GetExtension(contentType);
}
public static ApiSecretKeys GetKeys()
{
using (var cryptoProvider = new RNGCryptoServiceProvider())
{
ApiSecretKeys model = new ApiSecretKeys();
var APPID = Guid.NewGuid();
byte[] secretKeyByteArray = new byte[32]; //256 bit
cryptoProvider.GetBytes(secretKeyByteArray);
var APIKey = Convert.ToBase64String(secretKeyByteArray);
model.ApiKey = APIKey;
model.AppId = Convert.ToString(APPID);
return (model);
}
}
}
}

135
Swift.web/MobileRemit/Admin/PushNotification/ManageBroadCast.aspx

@ -29,27 +29,26 @@
<script type="text/javascript">
function CheckFormValidation() {
debugger;
var rowId = "<%=GetRowId()%>";
var rowId = "<%=GetRowId()%>";
var customerType = $("#ddlCustomerType").val();
alert(customerType);
// alert(customerType);
if (customerType == "All") {
return true;
}
else {
if (customerType != "nativeCountry") {
var customerId = $('#txtSearchData_aValue').val();
if (customerId == null || customerId == "") {
alert('No customer selected. Please choose a customer to send broadcast message.');
var reqField = "DDLBroadCastType,TXTBody,";
if (ValidRequiredField(reqField) == false) {
return false;
if ((customerType != "nativeCountry") && (customerType != "postCode")) {
var customerId = $('#txtSearchData_aValue').val();
if (customerId == null || customerId == "") {
alert('No customer selected. Please choose a customer to send broadcast message.');
var reqField = "DDLBroadCastType,TXTBody,";
if (ValidRequiredField(reqField) == false) {
return false;
}
}
}
}
}
}
function GetCustomerSearchType() {
return $("#ddlCustomerType").val();
@ -57,7 +56,6 @@
$(document).ready(function () {
ddlNativeCountry.style.display = 'none';
$('#<%=ddlCustomerType.ClientID%>').change(function () {
var customerType = $("#ddlCustomerType").val();
if (customerType === "nativeCountry") {
@ -73,6 +71,19 @@
});
});
$(document).ready(function () {
$('#<%=ddlCustomerType.ClientID%>').change(function () {
var customerType = $(this).val();
if (customerType === "postCode") {
$('#lblPostCode').show();
$('#<%=txtPostCode.ClientID%>').show();
} else {
$('#lblPostCode').hide();
$('#<%=txtPostCode.ClientID%>').hide();
}
});
});
//function CustomerTypeChanged() {
@ -129,7 +140,7 @@
<li><a href="BroadcastList.aspx">PushNotification List</a></li>
</ul>
</div>
<div class="tab-content">
<div class="col-md-12">
<div class="panel panel-default recent-activites">
<!-- Start .panel -->
<div class="panel-heading">
@ -141,57 +152,89 @@
</div>
<div class="panel-body">
<div class="row">
<div class="col-md-6" id="individualCustomerGroup" runat="server">
<label>
Select Customer : <span class="errormsg">*</span>
</label>
<%--<div class="col-md-6" id="individualCustomerGroup" runat="server">
<div class="form-group">
<div class="col-md-4">
<div class="form-group">
<asp:DropDownList ID="ddlCustomerType" runat="server" CssClass="form-control" Style="margin-bottom: 5px;">
</asp:DropDownList>
</div>
</div>
<div class="col-md-8">
<uc1:SwiftTextBox runat="server" ID="txtSearchData" Category="remit-searchCustomerForPushNotif" CssClass="form-control required" Param1="@GetCustomerSearchType()" Title="Blank for All" />
</div>
<div class="col-md-4">
<div class="form-group">
<asp:DropDownList ID="ddlNativeCountry" runat="server" CssClass="form-control" Style="margin-bottom: 5px;">
</asp:DropDownList>
<label class="col-md-4 control-label">
Select Customer : <span class="errormsg">*</span>
</label>
<div class="col-md-8">
<div class="row">
<div class="col-md-6">
<div class="form-group">
<asp:DropDownList ID="ddlCustomerType" runat="server" CssClass="form-control" Style="margin-bottom: 5px;"></asp:DropDownList>
</div>
</div>
<div class="col-md-6">
<uc1:SwiftTextBox runat="server" ID="txtSearchData" Category="remit-searchCustomerForPushNotif" CssClass="form-control required" Param1="@GetCustomerSearchType()" Title="Blank for All" />
</div>
<div class="col-md-6">
<div class="form-group">
<asp:DropDownList ID="ddlNativeCountry" runat="server" CssClass="form-control" Style="margin-bottom: 5px;"></asp:DropDownList>
</div>
</div>
</div>
</div>
</div>
</div>--%>
<div class="col-md-3 form-group">
<label>Select Customer : <span class="errormsg">*</span></label>
</div>
<div class="col-md-2 form-group">
<asp:DropDownList ID="ddlCustomerType" runat="server" CssClass="form-control" Style="margin-bottom: 5px;"></asp:DropDownList>
</div>
<div class="col-md-4 form-group">
<uc1:SwiftTextBox runat="server" ID="txtSearchData" Category="remit-searchCustomerForPushNotif" CssClass="form-control required" Param1="@GetCustomerSearchType()" Title="Blank for All" />
</div>
<div class="col-md-6">
<div class="form-group">
<div class="col-md-4">
<label>Notification Category : <span class="errormsg">*</span></label>
<select id="msgType" name="msgType" runat="server" class="form-control">
<option value="INFO" selected="selected">INFORMATION</option>
<option value="SUCCESS">SUCCESS</option>
<option value="ERROR">ERROR</option>
</select>
</div>
<asp:DropDownList ID="ddlNativeCountry" runat="server" CssClass="form-control" Style="margin-bottom: 5px;"></asp:DropDownList>
</div>
</div>
<%--<div class="col-md-4">
<div class="form-group">
<asp:TextBox ID="txtPostCode" AutoComplete="off" runat="server" CssClass="form-control"></asp:TextBox>
</div>
</div>--%>
</div>
<div class="row" id="divPostCode" runat="server">
<div class="col-md-3 form-group">
<label id="lblPostCode" style="display: none;">Post Code :</label>
</div>
<div class="col-md-2 form-group">
<asp:TextBox ID="txtPostCode" AutoComplete="off" runat="server" CssClass="form-control" Style="display: none;"></asp:TextBox>
</div>
</div>
<div class="row">
<div class="col-md-6" id="Div1" runat="server">
<div class="form-group" style="max-height: 400px;">
<label>
Notification Message : <span class="errormsg">*</span>
</label>
</div>
<div class="col-md-3 form-group">
<label>Notification Category : <span class="errormsg">*</span></label>
</div>
<div class="col-md-2 form-group">
<select id="msgType" name="msgType" runat="server" class="form-control">
<option value="INFO" selected="selected">INFORMATION</option>
<option value="SUCCESS">SUCCESS</option>
<option value="ERROR">ERROR</option>
</select>
</div>
</div>
<div class="row">
<div class="col-md-3" id="Div1" runat="server">
<label>
Notification Message : <span class="errormsg">*</span>
</label>
</div>
<div class="col-md-6" id="Div2" runat="server">
<div class="form-group">
<%-- <textarea name="TXTBody" rows="2" cols="20" id="TXTBody" runat="server"></textarea>--%>
<asp:TextBox runat="server" ID="TXTBody" TextMode="MultiLine" Rows="4" Columns="55"></asp:TextBox>
</div>
</div>
</div>
<div class="row">
</div>
<div class="row">
<div class="col-md-12">
<div class="form-group">

16
Swift.web/MobileRemit/Admin/PushNotification/ManageBroadCast.aspx.cs

@ -35,8 +35,8 @@ namespace Swift.web.MobileRemit.Admin.PushNotification
// PopulateData();
}
}
private void PopulateData()
{
DataRow dr = _mobileDao.GetBroadCastData(GetStatic.GetUser(), GetRowId());
@ -45,7 +45,7 @@ namespace Swift.web.MobileRemit.Admin.PushNotification
{
return;
}
// TXTTitle.Text = dr["Title"].ToString();
// TXTTitle.Text = dr["Title"].ToString();
TXTBody.Text = HttpUtility.HtmlDecode(dr["Body"].ToString());
msgType.Value = dr["messageType"].ToString();
}
@ -60,7 +60,6 @@ namespace Swift.web.MobileRemit.Admin.PushNotification
{
_sdd.SetDDL(ref ddlCustomerType, "exec proc_sendPageLoadData @flag='search-cust-by-for-broadcast'", "VALUE", "TEXT", "", "");
_sl.SetDDL(ref ddlNativeCountry, "EXEC proc_online_dropDownList @flag='groupForCountry',@user='" + GetStatic.GetUser() + "'", "countryId", "countryName", "", "Select..");
// _sl.SetDDL(ref ddlNativeCountry, "EXEC proc_online_dropDownList @flag='groupForCountry',@user='" + GetStatic.GetUser() + "'", "rowId", "grouoName", "", "Select..");
}
protected void btnSave_Click(object sender, EventArgs e)
@ -80,9 +79,10 @@ namespace Swift.web.MobileRemit.Admin.PushNotification
var category = msgType.Value;
var customerType = ddlCustomerType.SelectedValue;
var nativeCountry = ddlNativeCountry.SelectedValue;
var postCode = txtPostCode.Text;
if (string.IsNullOrEmpty(customerId) && customerType != "nativeCountry" && customerType.ToLower() != "all")
if (string.IsNullOrEmpty(customerId) && customerType != "nativeCountry" && customerType.ToLower() != "all" && customerType.ToLower() != "postcode")
{
GetStatic.AlertMessage(this, "Customer can not be empty!");
return null;
@ -94,8 +94,6 @@ namespace Swift.web.MobileRemit.Admin.PushNotification
}
if (customerType == "All")
nativeCountry = "ALL";
//if (string.IsNullOrEmpty(TXTTitle.Text))
//{
// GetStatic.AlertMessage(this, "BroadCast Title can not be empty!");
@ -111,7 +109,7 @@ namespace Swift.web.MobileRemit.Admin.PushNotification
matchString = Regex.Replace(text, @"<[^>]*>", String.Empty).Replace(@"&nbsp;", String.Empty).Replace(@"<\/?[^>] + (>|$)", String.Empty);
matchString = matchString.Replace("<\\S*?>", "");
DbResult _dbRes = _mobileDao.SaveBroadCastCustomer(GetStatic.GetUser(), GetRowId(), customerId, category, matchString, customerType, nativeCountry);
DbResult _dbRes = _mobileDao.SaveBroadCastCustomer(GetStatic.GetUser(), GetRowId(), customerId, category, matchString, customerType, nativeCountry, postCode);
return _dbRes;

25
Swift.web/MobileRemit/Admin/PushNotification/ManageBroadCast.aspx.designer.cs

@ -33,40 +33,49 @@ namespace Swift.web.MobileRemit.Admin.PushNotification
protected global::System.Web.UI.HtmlControls.HtmlForm form1;
/// <summary>
/// individualCustomerGroup control.
/// ddlCustomerType control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.HtmlControls.HtmlGenericControl individualCustomerGroup;
protected global::System.Web.UI.WebControls.DropDownList ddlCustomerType;
/// <summary>
/// ddlCustomerType control.
/// txtSearchData control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.DropDownList ddlCustomerType;
protected global::Swift.web.Component.AutoComplete.SwiftTextBox txtSearchData;
/// <summary>
/// txtSearchData control.
/// ddlNativeCountry control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::Swift.web.Component.AutoComplete.SwiftTextBox txtSearchData;
protected global::System.Web.UI.WebControls.DropDownList ddlNativeCountry;
/// <summary>
/// ddlNativeCountry control.
/// divPostCode control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.DropDownList ddlNativeCountry;
protected global::System.Web.UI.HtmlControls.HtmlGenericControl divPostCode;
/// <summary>
/// txtPostCode control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.TextBox txtPostCode;
/// <summary>
/// msgType control.

8
Swift.web/Remit/Transaction/Reports/TransactionNew/TranReport.aspx.cs

@ -177,11 +177,15 @@ namespace Swift.web.Remit.Transaction.Reports.TransactionNew
for (int i = 0; i < partnerTable.Columns.Count; i++)
{
if (i == 13 || i == 15 || i == 16 || i == 17 || i == 22 || i == 23)
if (i == 14 || i == 16 || i == 17 || i == 18 || i == 23 || i == 24)
{
decimal total = partnerTable.AsEnumerable()
.Sum(row => decimal.TryParse(row[i].ToString(), out decimal val) ? val : 0);
if(i == 22)
if(i == 14)
{
strTable.Append("<td align=\"left\"><b>" + total + "</b></td>");
}
else if (i == 23)
{
strTable.Append("<td align=\"left\"><b>" + total + " USD</b></td>");
}

115
Swift.web/SwiftSystem/UserManagement/AgentUserSetup/List.aspx

@ -117,7 +117,7 @@
<table width="100%" border="0" align="left" cellpadding="0" cellspacing="0">
<tr>
<td height="524" valign="top">
<div id="rpt_grid" runat="server" class="gridDiv" enableviewstate="false"></div>
<div id="rpt_grid" runat="server" class="gridDiv" enableviewstate="false"></div>
<asp:HiddenField ID="hddUserId" runat="server" />
<asp:HiddenField ID="hddUserName" runat="server" />
<asp:HiddenField ID="hdnchangeType" runat="server" />
@ -151,6 +151,39 @@
</div>
</div>
</div>
<!-- API Modal -->
<div class="modal fade" id="apiModal" tabindex="-1" aria-labelledby="apiModalLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header bg-white border-0 p-3">
<h5 class="modal-title">Generate API Key</h5>
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">
<i class="fa fa-times" aria-hidden="true"></i>
</button>
</div>
<div class="modal-body py-2 px-3">
<div class="col-md-12">
<div class="form-group form-control boxheight border-0 p-0 mb-3">
<span>App ID: </span>
<label id="appId" class="text-info"></label>
</div>
</div>
<div class="col-md-12">
<div class="form-group form-control boxheight border-0 p-0 mb-3">
<span>API Key: </span>
<label id="apiKey" class="text-info"></label>
</div>
</div>
<input id="userId" type="hidden" />
</div>
<div class="modal-footer text-end p-3">
<a type="button" id="createApi" onclick="GenerateCredentials()" class="btn btn-primary rounded-pill px-4 m-r-10 mb-2 mb-sm-0">Create/Re-Create</a>
<button type="button" class="btn btn-danger btn-simple" data-dismiss="modal">cancel</button>
</div>
</div>
</div>
</div>
</div>
</form>
<!--script--->
@ -168,24 +201,76 @@
$('#btnSendEmail').click();
}
function LockUnlock(user, changeType) {
if (user == "" || user == null)
return;
if (changeType == "l") {
if (confirm("Are you sure to lock/Unlock the user?")) {
GetElement("hddUserId").value = user;
GetElement("hdnchangeType").value = changeType;
GetElement("btnLockUnlockUser").click();
}
function LockUnlock(user, changeType) {
if (user == "" || user == null)
return;
if (changeType == "l") {
if (confirm("Are you sure to lock/Unlock the user?")) {
GetElement("hddUserId").value = user;
GetElement("hdnchangeType").value = changeType;
GetElement("btnLockUnlockUser").click();
}
}
else if (changeType == "r") {
if (confirm("Are you sure to Reset the user Password?")) {
GetElement("hddUserId").value = user;
GetElement("hdnchangeType").value = changeType;
GetElement("btnLockUnlockUser").click();
}
else if (changeType == "r") {
if (confirm("Are you sure to Reset the user Password?")) {
GetElement("hddUserId").value = user;
GetElement("hdnchangeType").value = changeType;
GetElement("btnLockUnlockUser").click();
}
}
function ShowApiCredentials(userId) {
$('#userId').val(userId);
$.ajax({
url: "List.aspx",
type: "Post",
data: {
UserId: userId,
MethodName: "GetApiCredentials"
},
success: function (response) {
$('#apiModal').modal('show');
if (response.responseCode == '0') {
$('#appId').text(response.AppId);
$('#apiKey').text(response.APISecretKey);
}
else {
alert(response.responseMessage);
}
},
error: function (response) {
alert(response.responseMessage);
}
})
}
function GenerateCredentials() {
if (confirm('Are you sure you want to generate/re-generate api credentials?')) {
$.ajax({
url: "List.aspx",
type: "Post",
data: {
UserId: $('#userId').val(),
MethodName: "GenerateCredentials"
},
success: function (response) {
$('#apiModal').modal('show');
if (response.responseCode == '0') {
$('#appId').text(response.AppId);
$('#apiKey').text(response.APISecretKey);
}
else {
alert(response.responseMessage);
}
},
error: function (response) {
alert(response.responseMessage);
}
})
}
}
</script>
</body>
</html>

34
Swift.web/SwiftSystem/UserManagement/AgentUserSetup/List.aspx.cs

@ -26,6 +26,9 @@ namespace Swift.web.SwiftSystem.UserManagement.AgentUserSetup
private const string LockUser = "10101180";
private const string SendQRCode = "10101140";
private const string ViewEditAuthKey = "10101190";
private readonly SwiftGrid _grid = new SwiftGrid();
private GoogleAuthenticatorAPI _auth = new GoogleAuthenticatorAPI();
private readonly ApplicationUserDao _obj = new ApplicationUserDao();
@ -34,18 +37,45 @@ namespace Swift.web.SwiftSystem.UserManagement.AgentUserSetup
protected void Page_Load(object sender, EventArgs e)
{
Authenticate();
string methodName = Request.Form["MethodName"];
if (!IsPostBack)
{
if (methodName == "GetApiCredentials")
GetApiCredentials();
if (methodName == "GenerateCredentials")
GenerateCredentials();
if (GetMode() == 1)
GetStatic.AlertMessage(Page);
else
GetStatic.PrintMessage(Page);
LoadTab();
}
DeleteRow();
LoadGrid();
}
private void GetApiCredentials()
{
string userId = Request.Form["UserId"];
var apiDetails = _obj.GetApiCredentials(userId, GetStatic.GetUser());
GetStatic.JsonResponse(apiDetails, this.Page);
}
private void GenerateCredentials()
{
string userId = Request.Form["UserId"];
var apiCredentials = GetStatic.GetKeys();
var apiDetails = _obj.GenerateCredentials(userId, GetStatic.GetUser(), apiCredentials);
GetStatic.JsonResponse(apiDetails, this.Page);
}
protected void LoadTab()
{
switch (GetMode())
@ -162,6 +192,10 @@ namespace Swift.web.SwiftSystem.UserManagement.AgentUserSetup
if (_sl.HasRight(SendQRCode))
customLinkText.Append("<a class=\"btn btn-xs btn-primary\" href=\"javascript:void(0);\" onclick=\"SendEmail('@userId', '@userName')\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"Send QR Code\"><i class=\"fa fa-envelope\"></i></btn>");
if (_sl.HasRight(ViewEditAuthKey))
customLinkText.Append("<a class=\"btn btn-xs btn-primary\" href=\"javascript:void(0);\" onclick=\"ShowApiCredentials('@userId')\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"Show API Credentials\"><i class=\"fa fa-key\"></i></btn>");
_grid.CustomLinkText = customLinkText.ToString();
_grid.CustomLinkVariables = "userName,userId,agentId";

Loading…
Cancel
Save