farzinmonsef / tk1

0 stars 0 forks source link

Programs #8

Open farzinmonsef opened 4 years ago

farzinmonsef commented 4 years ago

RequiredIf,

farzinmonsef commented 4 years ago

RequiredIfAttribute.cs

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Usage in MeataData . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [UIHint("NumberFormated")] [RequiredIf(Field = "TransType", Values = "5|6|7", ErrorMessage = "Cancel and Retire is required for this Trans Type")] [Display(Name = "Cancel and Retire")] public Nullable CancelandRetire { get; set; } . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . In View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (function ($, kendo) { $.extend(true, kendo.ui.validator, { rules: { requiredif: function (input) { var tmp = input[0].attributes["data-val-requiredif"]; if (typeof tmp != 'undefined') { var requiredifExists = input[0].attributes["data-val-requiredif"].value; var requirediffield = input[0].attributes["data-val-requiredif-field"].value; var requiredifvalues = input[0].attributes["data-val-requiredif-values"].value; var v = $("input[name=" + requirediffield + "]")[0].value var requiredifvaluesArray = requiredifvalues.split('|'); var match = false; for (var i = 0; i < requiredifvaluesArray.length; i++) { if (requiredifvaluesArray[i] == v) { match = true; break; } } if (match) { if ((input[0].value == '') || (input[0].value == null)) { return false; } } } return true; } }, messages: { requiredif: function (input) { return input[0].attributes["data-val-requiredif"].value; } } }); })(jQuery, kendo);

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . RequiredIfAttribute.cs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web.Mvc;

namespace Entitites { [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)] public class RequiredIfAttribute : ValidationAttribute, IClientValidatable { public string Field { get; set; } public string Values { get; set; }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule
        {
            ErrorMessage = ErrorMessage,
            ValidationType = "requiredif"
        };
        rule.ValidationParameters["field"] = Field;
        rule.ValidationParameters["values"] = Values;
        yield return rule;
    }
    private const string DefaultErrorMessageFormatString = "The {0} field is required.";

    private bool IsValueRequired(string checkValue, Object currentValue)
    {
        if (checkValue.Equals("!null", StringComparison.InvariantCultureIgnoreCase))
        {
            return currentValue != null;
        }
        return checkValue.Equals(currentValue.ToString());
    }

    protected override ValidationResult IsValid(Object value, ValidationContext context)
    {
        Object instance = context.ObjectInstance;
        System.Type type = instance.GetType();
        bool valueRequired = false;
        var ValuesArray = Values.Split('|').ToList();
        Object propertyValue = type.GetProperty(Field).GetValue(instance, null);
        for (int i = 0; i < ValuesArray.Count; i++) {
            valueRequired = IsValueRequired(ValuesArray[i], propertyValue);
            if (valueRequired) break;
        }

        if (valueRequired)
        {
            return !string.IsNullOrEmpty(Convert.ToString(value))
                ? ValidationResult.Success
                : new ValidationResult(ErrorMessage != "" ? ErrorMessage
                            : string.Format(DefaultErrorMessageFormatString, context.DisplayName));
        }
        return ValidationResult.Success;
    }
}

}

farzinmonsef commented 4 years ago

LINQ ++ LEFT OUTER JOIN

        DateTime dt1 = DateTime.Now;

        int categoryId = RoleToCategory((int)userRole);
        var transactions = new List<TransactionDTO>();
        var query = Db.Transactions
            .SelectMany(tr => Db.Types.Where(type => type.Id == tr.TransType).DefaultIfEmpty(), (tr, ty) => new { tr, ty })
            .SelectMany(tra => Db.Types.Where(type => type.Id == tra.tr.Status).DefaultIfEmpty(), (tra, typ) => new { tra, typ })
            .SelectMany(tran => Db.Types.Where(type => type.Id == tran.tra.tr.CategoryId).DefaultIfEmpty(), (tran, type) => new { tran, type })
            .SelectMany(trans => Db.Types.Where(type => type.Id == trans.tran.tra.tr.PlanName).DefaultIfEmpty(), (trans, typee) => new { trans, typee })
            .Where(x => (userRole != RoleType.Administrator ? x.trans.tran.tra.tr.CategoryId == categoryId : 1 == 1))
            .Select(x => new TransactionDTO
            {
                Id = x.trans.tran.tra.tr.Id,
                CategoryId = x.trans.tran.tra.tr.CategoryId,
                Category = x.trans.type.Name,
                . . . .
                . . . .
            })
            //.ToDataSourceResult(request)
            ;

        transactions = query.ToList();
        //DateTime dt1 = DateTime.Now;
        DateTime dt2 = DateTime.Now;
        TimeSpan span = dt2 - dt1;
        int ms = (int)span.TotalMilliseconds;
        Debug.WriteLine("Total, time(ms)= " + ms.ToString());
        return transactions;
farzinmonsef commented 4 years ago

Persist Custom Filters in Grid

https://demos.telerik.com/aspnet-mvc/filter/persist-state

farzinmonsef commented 3 years ago

MyDataSourceResult

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;

//using System; //using System.Collections.Generic; //using System.Linq; //using System.Linq.Dynamic; using System.Linq.Expressions; using DynamicExpression = System.Linq.Dynamic.DynamicExpression; using Kendo.DynamicLinq; using System.Linq.Dynamic;

namespace Data { public static class DBTools { }

public static class QueryableExtensions
{
    /// <summary>
    /// Applies data processing (paging, sorting, filtering and aggregates) over IQueryable using Dynamic Linq.
    /// </summary>
    /// <typeparam name="T">The type of the IQueryable.</typeparam>
    /// <param name="queryable">The IQueryable which should be processed.</param>
    /// <param name="take">Specifies how many items to take. Configurable via the pageSize setting of the Kendo DataSource.</param>
    /// <param name="skip">Specifies how many items to skip.</param>
    /// <param name="sort">Specifies the current sort order.</param>
    /// <param name="filter">Specifies the current filter.</param>
    /// <param name="aggregates">Specifies the current aggregates.</param>
    /// <returns>A DataSourceResult object populated from the processed IQueryable.</returns>
    public static DataSourceResult ToMyDataSourceResult<T>(this IQueryable<T> queryable, int take, int skip, IEnumerable<Sort> sort, Filter filter, IEnumerable<Aggregator> aggregates)
    {
        // Filter the data first
        queryable = MyFilter(queryable, filter);

        // Calculate the total number of records (needed for paging)
        var total = queryable.Count();

        // Calculate the aggregates
        var aggregate = MyAggregate(queryable, aggregates);

        // Sort the data
        queryable = MySort(queryable, sort);

        // Finally page the data
        if (take > 0)
        {
            queryable = MyPage(queryable, take, skip);
        }

        return new DataSourceResult
        {
            Data = queryable.ToList(),
            Total = total,
            Aggregates = aggregate
        };
    }

    /// <summary>
    /// Applies data processing (paging, sorting and filtering) over IQueryable using Dynamic Linq.
    /// </summary>
    /// <typeparam name="T">The type of the IQueryable.</typeparam>
    /// <param name="queryable">The IQueryable which should be processed.</param>
    /// <param name="take">Specifies how many items to take. Configurable via the pageSize setting of the Kendo DataSource.</param>
    /// <param name="skip">Specifies how many items to skip.</param>
    /// <param name="sort">Specifies the current sort order.</param>
    /// <param name="filter">Specifies the current filter.</param>
    /// <returns>A DataSourceResult object populated from the processed IQueryable.</returns>
    public static DataSourceResult ToMyDataSourceResult<T>(this IQueryable<T> queryable, int take, int skip, IEnumerable<Sort> sort, Filter filter)
    {
        return queryable.ToMyDataSourceResult(take, skip, sort, filter, null);
    }

    /// <summary>
    ///  Applies data processing (paging, sorting and filtering) over IQueryable using Dynamic Linq.
    /// </summary>
    /// <typeparam name="T">The type of the IQueryable.</typeparam>
    /// <param name="queryable">The IQueryable which should be processed.</param>
    /// <param name="request">The DataSourceRequest object containing take, skip, order, and filter data.</param>
    /// <returns>A DataSourceResult object populated from the processed IQueryable.</returns>
    public static DataSourceResult ToMyDataSourceResult<T>(this IQueryable<T> queryable, DataSourceRequest request)
    {
        return queryable.ToMyDataSourceResult(request.Take, request.Skip, request.Sort, request.Filter, null);
    }

    private static IQueryable<T> MyFilter<T>(IQueryable<T> queryable, Filter filter)
    {
        if (filter != null && filter.Logic != null)
        {
            // Collect a flat list of all filters
            var filters = filter.All();

            // Get all filter values as array (needed by the Where method of Dynamic Linq)
            var values = filters.Select(f => f.Value).ToArray();

            // Create a predicate expression e.g. Field1 = @0 And Field2 > @1
            string predicate = filter.ToExpression(filters);

            // Use the Where method of Dynamic Linq to filter the data
            queryable = queryable.Where(predicate, values);
        }

        return queryable;
    }

    private static object MyAggregate<T>(IQueryable<T> queryable, IEnumerable<Aggregator> aggregates)
    {
        if (aggregates != null && aggregates.Any())
        {
            var objProps = new Dictionary<DynamicProperty, object>();
            var groups = aggregates.GroupBy(g => g.Field);
            Type type = null;
            foreach (var group in groups)
            {
                var fieldProps = new Dictionary<DynamicProperty, object>();
                foreach (var aggregate in group)
                {
                    var prop = typeof(T).GetProperty(aggregate.Field);
                    var param = Expression.Parameter(typeof(T), "s");
                    var selector = aggregate.Aggregate == "count" && (Nullable.GetUnderlyingType(prop.PropertyType) != null)
                        ? Expression.Lambda(Expression.NotEqual(Expression.MakeMemberAccess(param, prop), Expression.Constant(null, prop.PropertyType)), param)
                        : Expression.Lambda(Expression.MakeMemberAccess(param, prop), param);
                    var mi = aggregate.MethodInfo(typeof(T));
                    if (mi == null)
                        continue;

                    var val = queryable.Provider.Execute(Expression.Call(null, mi,
                        aggregate.Aggregate == "count" && (Nullable.GetUnderlyingType(prop.PropertyType) == null)
                            ? new[] { queryable.Expression }
                            : new[] { queryable.Expression, Expression.Quote(selector) }));

                    fieldProps.Add(new DynamicProperty(aggregate.Aggregate, typeof(object)), val);
                }
                type = DynamicExpression.CreateClass(fieldProps.Keys);
                var fieldObj = Activator.CreateInstance(type);
                foreach (var p in fieldProps.Keys)
                    type.GetProperty(p.Name).SetValue(fieldObj, fieldProps[p], null);
                objProps.Add(new DynamicProperty(group.Key, fieldObj.GetType()), fieldObj);
            }

            type = DynamicExpression.CreateClass(objProps.Keys);

            var obj = Activator.CreateInstance(type);

            foreach (var p in objProps.Keys)
            {
                type.GetProperty(p.Name).SetValue(obj, objProps[p], null);
            }

            return obj;
        }
        else
        {
            return null;
        }
    }

    private static IQueryable<T> MySort<T>(IQueryable<T> queryable, IEnumerable<Sort> sort)
    {
        if (sort != null && sort.Any())
        {
            // Create ordering expression e.g. Field1 asc, Field2 desc
            var ordering = String.Join(",", sort.Select(s => s.ToExpression()));

            // Use the OrderBy method of Dynamic Linq to sort the data
            return queryable.OrderBy(ordering);
        }

        return queryable;
    }

    private static IQueryable<T> MyPage<T>(IQueryable<T> queryable, int take, int skip)
    {
        return queryable.Skip(skip).Take(take);
    }
}

}

farzinmonsef commented 3 years ago

BusEmail.cs

using Common.SendEmail; using Common.SendEmail.Model; using System; using System.Linq; using Data; using Entitites;

namespace Business { public class BusEmail { public string previewLetter(int TransactionId, User user) { //getting Template & SMTP values from databse, table appConfig var SmtpServerName = ""; var SmtpPortNumber = ""; var Username = ""; var Password = ""; string template = ""; string to = ""; string subject = ""; var appSettingData = new AppSettingData(); var settingsData = appSettingData.FindAppSettingByToolID(getToolId(TransactionId)); if (settingsData != null && settingsData.Count > 0) { SmtpServerName = settingsData.FirstOrDefault(x => x.Key.ToUpper() == "SMTPSERVER")?.Value; SmtpPortNumber = settingsData.FirstOrDefault(x => x.Key.ToUpper() == "SMTPPORT")?.Value; Username = settingsData.FirstOrDefault(x => x.Key.ToUpper() == "SMTPUSERNAME")?.Value; Password = settingsData.FirstOrDefault(x => x.Key.ToUpper() == "SMTPPASSWORD")?.Value; template = Convert.ToString(settingsData.FirstOrDefault(x => x.Key.ToUpper() == "TEMPLATE")?.Value); to = Convert.ToString(settingsData.FirstOrDefault(x => x.Key.ToUpper() == "TO")?.Value); subject = Convert.ToString(settingsData.FirstOrDefault(x => x.Key.ToUpper() == "SUBJECT")?.Value); } //replace field values in found template if (!string.IsNullOrEmpty(template)) { TransactionData transactionData = new TransactionData(); Transaction transaction = transactionData.FindTransactionByID(TransactionId); template = template.Replace("[NetSharesToBroker]", transaction.NetSharesToMerrillLynch == null ? "" : string.Format("{0:n0}", transaction.NetSharesToMerrillLynch));

            TypeData typeData = new TypeData();
            var planName = transaction.PlanName == null ? null : typeData.FindTypeByID((int)transaction.PlanName);
            template = template.Replace("[PlanName]", planName == null ? "" : (planName.Name == null ? "" : Convert.ToString(planName.Name)));
            var title = typeData.FindTypeByID((int)transaction.TransactionType);
            template = template.Replace("[Title]", title.Name == null ? "" : Convert.ToString(title.Name));

            var JobTitlkeFormated = "";
            CORPDIRECTORYLOADData corpdirectoryData = new CORPDIRECTORYLOADData();
            var corpdirectory = corpdirectoryData.FindCORPDIRECTORYLOADByNBKID(user.StandardId);
            if (corpdirectory != null)
            {
                var usertitle = corpdirectory.JobTitle;
                var tmp = usertitle.ToString().Split(';');
                JobTitlkeFormated = tmp[0];
            }

            template = template.Replace("[LetterYear]", DateTime.Now.ToString("yyyy"));

            template = template.Replace("[Approved]", Convert.ToString(user.FirstName) + " " + Convert.ToString(user.LastName));
            template = template.Replace("[CorporateTitle]", Convert.ToString(JobTitlkeFormated));

            UserData userData = new UserData();
            User preparedUser = userData.FindByID(transaction.CreatedById);
            template = template.Replace("[Prepared]",
                preparedUser != null ? Convert.ToString(preparedUser.FirstName) + " " + Convert.ToString(preparedUser.LastName) : "");
            template = template.Replace("[EntryDate]", transaction.EntryDate.Value == null ? "" : transaction.EntryDate.Value.ToString("MMMM dd, yyyy"));
        }

        return template;
    }

    public string sndEmail(int TransactionId, string msgBody, int Status_Pending, int Status_Approved, int approver, string BOALogo_filename) //, int testbit = 0)
    {
        string pendingReqRepResult = "";
        try
        {
            TransactionData transactionData = new TransactionData();
            Transaction transact = transactionData.FindTransactionByID(TransactionId, Status_Pending);
            if (transact != null)
            {
                string ToEmail = "",
                        CcEmail = "",
                        Subject = "";
                IAppSettingBLL _oAppSettingDomain = new Common.SendEmail.AppSettingBLL();
                IEmailMessage messageItem = new EmailMessage();

                var appSettingEmailData = _oAppSettingDomain.GetAppSettingsDataByToolId(getToolId(TransactionId));// Convert.ToInt32(appPortalTool.EQMPendingReport));
                var settingEmailData = appSettingEmailData.ToList();

                if (appSettingEmailData != null && settingEmailData.Count > 0)
                {
                    ToEmail = settingEmailData.FirstOrDefault(x => x.Key == "TO")?.Value;
                    CcEmail = settingEmailData.FirstOrDefault(x => x.Key == "CC")?.Value;
                    Subject = settingEmailData.FirstOrDefault(x => x.Key == "SUBJECT")?.Value;
                }
                messageItem.Body = msgBody;
                messageItem.Cc = CcEmail;
                messageItem.Subject = Subject;
                messageItem.To = ToEmail;
                messageItem.AttachmentFileName = BOALogo_filename;
                messageItem.Key = "WithAttachment";
                messageItem.MediaTypeName = "image/jpeg";

                Email msg = new Email(appPortalTool.SMTPSettings);
                msg.Send(messageItem);
                pendingReqRepResult = Convert.ToString(messageItem.Error);

                //////////   Logging return of Send Email for Checking Purposes
                BusLogDB busLogDB = new BusLogDB();
                busLogDB.LogDB(new LogDB()
                {
                    Date_Time = DateTime.Now,
                    UserName = Convert.ToString(approver),
                    Controller = "BusEmail",
                    Action = "sndEmail",
                    Message = pendingReqRepResult,
                    Comment = "Return From Send Email for Transaction ID= " + Convert.ToString(transact.Id) + " Setting Status=" + Convert.ToString(Status_Approved)
                });
                ///////////////////////////////////////////////////////////////
                if (string.IsNullOrEmpty(pendingReqRepResult) ||
                       ((pendingReqRepResult.ToUpper().IndexOf("FAILURE") < 0) &&
                        (pendingReqRepResult.ToUpper().IndexOf("ERROR") < 0))
                    )
                {
                    pendingReqRepResult = "";
                    transact = transactionData.SetTransactionStatus(transact, approver, Status_Approved);
                }
            }
            else
            {
                pendingReqRepResult = "You already EMAILED the transaction\nNo further action permitted!";
            }
        }
        catch (Exception ex)
        {
            pendingReqRepResult = "Error: " + ex.ToString();
        }
        return Convert.ToString(pendingReqRepResult);
    }

    /// <summary>
    /// Takes a transaction and returns the Tool Id needed for email settings for that type
    /// </summary>
    /// <param name="transactionId">Transaction Identitifer</param>
    /// <returns>Tool ID</returns>
    private int getToolId(int transactionId)
    {
        TransactionData transactionData = new TransactionData();
        Transaction transaction = transactionData.FindTransactionByID(transactionId);
        TypeData typeData = new TypeData();
        var transactionType = typeData.FindTypeByID((int)transaction.TransactionType);
        return Convert.ToInt32(transactionType.Comment);
    }
}

}

farzinmonsef commented 3 years ago

email-template


[BOA-Logo]
Equity Management Communication

[Title]

To: [To]
From: [From]
 
 
[Title]
We have been notified that the following shares should be released as follows:
 
●  Effective Date: [TransactionEffectiveDate]
 
●  Requisition Number: [RequisitionNumber]
 
●  Debit: DWAC from DTC
●  Debit Shares: [NetSharesToBroker]
 
●  Debit: Cancel and Retire (R469) - Payment for taxes
●  Debit Shares: [TotalShares]
 
●  Credit: Restricted Stock Account for Stock Plan Participants (Account #5793106)
●  Credit Shares: [SharesForTax]
 
 
Approved By: [Approved]
Corporate Title: [CorporateTitle]
 
Prepared by: [Prepared]
Date: [EntryDate]
Transaction Id:  [TransactionId]
 
Bank of America N.A. Member FDIC © [LetterYear] Bank of America Corporation. All rights reserved
 
farzinmonsef commented 3 years ago

Trans..Controler

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")] [HttpPost] public ActionResult GetPreviewLetter(int TransactionId) { BusEmail ml = new BusEmail(); string tmp1 = ml.previewLetter(TransactionId, (User)Session["currentUser"]); string tmp2 = tmp1; Session["previewLetter"] = tmp2.Replace("[BOA-Logo]", "<img src=\"cid:DSitesEqmwwwrootImagesBOALogoLetter.jpg\" alt=\"Bank of America Logo\" />"); Session["TransactionId"] = TransactionId;

        string display_BOA_logo = "<p style='text-align:right'>" +
            "    <img alt='Bank Of America Logo' height='32' width='300'" +
            "         src='data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAkACQAAD/4QBcRXhpZgAATU0AKgAAAAgABAMCAAIAAAAWAAAAPlEQAAEAAAABAQAAAFERAAQAAAABAAAXElESAAQAAAABAAAXEgAAAABQaG90b3Nob3AgSUNDIHByb2ZpbGUA/+IMWElDQ19QUk9GSUxFAAEBAAAMSExpbm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYAMQAAYWNzcE1TRlQAAAAASUVDIHNSR0IAAAAAAAAAAAAAAAEAAPbWAAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARY3BydAAAAVAAAAAzZGVzYwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAAAgQAAAAUclhZWgAAAhgAAAAUZ1hZWgAAAiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQAAABwZG1kZAAAAsQAAACIdnVlZAAAA0wAAACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAUbWVhcwAABAwAAAAkdGVjaAAABDAAAAAMclRSQwAABDwAAAgMZ1RSQwAABDwAAAgMYlRSQwAABDwAAAgMdGV4dAAAAABDb3B5cmlnaHQgKGMpIDE5OTggSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkAAGRlc2MAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9kZXNjAAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD7cwABBMLAANcngAAAAFYWVogAAAAAABMCVYAUAAAAFcf521lYXMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAKPAAAAAnNpZyAAAAAAQ1JUIGN1cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3AHwAgQCGAIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQETARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHpAfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAMLAxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZIBlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghuCIIIlgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3ArzCwsLIgs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3eDfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQuRDXEPURExExEU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTwFRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkgGUUZaxmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3DHeweFh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLdIwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0oPyhxKKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1BLXYtqy3hLhYuTC6CLrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy1DMNM0YzfzO4M/E0KzRlNJ402DUTNU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76DwnPGU8pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPARANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkviTCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSPVNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3JXhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeTZ+loP2iWaOxpQ2maafFqSGqfavdrT2una/9sV2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHwcktypnMBc11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzhfUF9oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhpiM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS45NNk7aUIJSKlPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFHobaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6hrxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8IbybvRW9j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp22vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf56noMui86Ubp0Opb6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn+3f8B/yY/Sn9uv5L/tz/bf///9sAQwACAQECAQECAgICAgICAgMFAwMDAwMGBAQDBQcGBwcHBgcHCAkLCQgICggHBwoNCgoLDAwMDAcJDg8NDA4LDAwM/9sAQwECAgIDAwMGAwMGDAgHCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM/8AAEQgAqgXwAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A/fyiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiivC/2pf+Cjnwo/Y+uPsnjHXLxNWZd0en2WnzXE0vGcBgoiB/3nFZ1KkKceabsvM9HK8nx2Z4hYTL6MqtR7RhFyfrZdF1eyPdKK/K/wCNf/ByG5M1v8Ovh0q9fKvvEd3n6ZtoD/7Wrwnw7/wX1/aA0fxbLqF3deE9WsZWBGl3GjrHbRDuEaNlm/FpGrzamd4WLsm36I/ZMt+jnxpi6DrTpQpaXUZzXM/RR5kn/icT9xqK/NT4Jf8ABxz4V1kw2/xB8B6xochwrXmi3CX0JP8AeMUnlug9gzn619j/AAJ/4KDfBr9pEwxeE/iBoN3fz4CafdSmyvmPoIZgjtj1UEe9dVHH4er8El+T/E+F4i8MeKMjTlmOCnGK3klzw+coc0V82j2Siiiuw+ECiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK5X4yaz4w0LwHd3HgXQ9F8Q+IVH7iz1PUmsIG6871ikyRx8p2g8/MtfkD/wAFBvit+2prIvovH2j+KPCvhX5vMt/C0BGkhPSS4t2kLqR/DLKR7CuLGY1YeN3Fv0WnzZ+i8A+HdbijEeyhi6NBXt781zv/AA0780vnZeZ+mf7SH/BSf4M/ssGa38UeM9Pm1iHIOk6Yft18G/utHHkRn/roUHvWX8Hv+CrvwB+NflR6d8RtH0u8kwPsut7tLkVj/DumCox/3Gav57Ccmivn3xBW5rqKt21/P/gH9T0/or5AsGqVTFVXW/nXIo/+Acr0/wC3r+Z/Utpup2+s2EV1Z3EN1azrvjmhcSRyL6hhwR7iodd8P6f4p0uSx1Oxs9SsphiS3uoVmikHurAg/jX80fwh/aO8ffAPUPtPgvxh4i8Mvu3MlhfSRQyn/bjB2OPZgRX2R8B/+DhP4r+AfJtvG2jaD48skwHmCf2bfsP9+IGL/wAhZ9676OfUZ6VU4/iv6+R+X8QfRh4hwT9tk9eGIS2X8Ofyu3H586P0G+NP/BIH9n/42CaS48C2nh2+lzi78PSHTWQnuIk/ck/70Zr47+Ov/BuFqVms118NvH9tfKMmPT/ENuYZMen2iEMrE+8Sj39Ppr9n3/guL8C/jWYLXVdWvvAOqy4Uw69Dsty3fFyhaML7yFPpX1v4d8S6d4v0a31LSdQstU0+6XfDdWk6zQzL6q6kqR7g11fVcFileKT9NH+H6nxtPjbxG4Mqqhi6lamtlGsnOD8oud1b/BJep/Ot+0B/wT3+Mf7MizTeLvAmtWumwZLalaIL2xA9TNCWRM+jlT7V4zX9ThGRXzx+0Z/wSw+CP7TKXE2seDbPR9Ynyf7V0IDT7vcf4m2Dy5G95EevMxHD73oy+T/z/wCAfsPC/wBKiEmqXEOEt3nSd184Sd/um/JH4vfAD/gpP8a/2avJh8N+PNXk0yDAGmam/wDaFmFH8KxzbvLH/XMqfevub9nj/g42sbvyLP4peB5bNzhX1Tw7J5kefU20zblA6kiVj6LXnP7S3/BvH468Ei41D4Z+IrDxpYrll02/22GogdlVifJkPuWj+lfB3xQ+EHir4J+KJNF8XeHtY8N6pFybbULV4HYf3l3D5lPZlyD2NcHtcdg3aV0vPVH6f/Ynhv4gU3Vw0adSo9W4fu6q85Jcsn6yUl6n9FH7Pv7afwt/aktFbwP400XWrll3tYeb5F9GMZO63kCygD12446mvUa/lt0Nr5NYtW003Q1BZVNubbd5wkz8uzbzuz0xzX6ef8E+/in+3RZfYbf/AIRXUPFHhP5QW8d/6C8cf96O4kK3LZGMHbKAOi17GDzp1Xyzg7+Wv4H4L4hfR3o5NSeMy/MKah0jXlGnL0jPSMn5NR9T9VqKo+GbnUrzw/Zy6xZ2en6pJEGura0umuoIX7qkrRxlwPUoufSr1e8fzDOLjJxfTs7/AIrR+qCiiigkKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK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KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiikdxGpZiFVRkk9qAFrn/ih8V/DPwS8D33ibxhr+keGfD+mJ5l1qGp3SW1vCPd3IGT0A6k8AE1+ev/BS3/g5U+FP7Hjah4X+GotPix8QIN0T/ZLj/iR6VIOP31yufOZT1jhz0KtJGRX4L/tp/wDBQv4t/wDBQDx3/bnxO8WXmsLC7NY6XEfI0vSweMQW6/IpxwXOXYAbmY819pknBWMxtqtf93T7vd+i/V/K54eOzyjQ92n70vwXq/8AI/Wb/go1/wAHXdjo5vvC/wCzho66lcLuhfxlrlsVt07brS0bDP6h59oBHMTA5r8Yfjt+0N44/ad+IV14q+IPirWvF3iC84e81K5aZkXJIRB92OMZ4RAFXsBXG16p+yT+xT8Tv25PiTH4V+GPhPUfEmo/K11NGvl2enRk48y4nbEcSdeWILEYUMcCv1TL8ny/KqTlSSjZaye/zb29FZeR8liMZicXO0m32S2+48rr68/4J4f8ETfjh/wUXurXUvD+h/8ACL+BZHxL4q1xGgsmUHn7OmPMuW4I/dgoCMM6da/Xj/gmv/wbD/DP9mQaf4o+Mctl8VPG0O2VdOaI/wDCPabJ1wImAa6IOfmmAQ5/1QIBr9RLOzh06zit7eGOC3gQRxRRqFSNQMBQBwABwAK+PzrxAhC9LLlzP+Z7fJdfV6eTPZwPDspe/iXZdlv82fE//BPL/ggf8Cv2AlsdZXSf+FgfEC12ufEevwpIbaUfxWttzHb4PIYbpRnHmEV9uUV8vf8ABQr/AIK9/Bf/AIJvaFIvjTXxqfi6SLzLPwrpBW41S4yMqzrkLBGeu+UqCAdu4jbX5zKpjczxGvNUm/n/AMMvuSPpoxoYWnpaMUfUJOK+Av8Agob/AMHFHwN/Yga+0LQ7wfFTx7bbozpOhXK/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vjq1Z1akqst5NvTbXse1TgoRUF00CiiisigooooAKKKKACiiigAooooAKKKKACiiigAooooAq63oln4l0e60/UrO11DT76JoLi2uYllhnjYYZHVgQykHBBGDX5Wf8FHf+CFc2j/b/GnwRtZLq1+ae98J7i0sPdms2PLjv5LHd/cLZCD9XaK5cVg6WIjy1F8+qPtuCPEDOOFcZ9byupo7c0HrCa7SXfs1aS6Pc/lnvLObTruW3uIpILiBzHJHIpV42BwVIPIIPBBqOv3V/wCCkH/BInwt+2XZXfibw2LPwt8SFTcL0JttNYIHCXSqPvdhMoLDuHAAH5efAn/glT8XvjN+0PffD668O3nhmbQZVGt6lqER+yadETw6uOJi4BMaxk7+uQoLD4/FZXXpVFBK99mv60P764N8aOHc9yueYVaqoSpRvUhNq8V3T+3FvRNK92k0m0jxn4J/A3xV+0V8RLHwr4N0a71zW9Qb5IYV+WNRjdJIx+WONc8uxAHrX7X/APBOP/gkf4T/AGLrC18ReIPsnir4kOmW1Bo91rpJI5S1Vh17GVgHIzgICVPsX7HP7Engf9iP4cLoXhGx3Xlwqtqer3Chr3VJB/FI3ZRk7Y1wq5PGSSfX6+gy7KI0P3lXWX4L/g+Z/K3ix4743iJzyzJ26OD2b2nV/wAX8sX/ACrf7Tey8h/aS/avh+Bt6uk6Xo//AAkPiH7CdVuYpbv7HY6RZeZ5QubufZIyK8mURY45JHZW2rhWI5n4O/txT+I/iFZ+GPGWhaXol3qk6WllqGk6nNe2LXLo7x2863FvbXFvJKsUhiLxGOUxOFcsNtcb+2joNx4B8V+P77UobiLwt8T9C0vTzrqJKYdBu7G4mYpctEGeGGWKfck2NqyI4YrvUnk/BFjpnxo+JMnhvwPqVz8Qbafxho/iK98cHULnUI9P0nTrn7dDYSXMpKeck5khijgY5jneRwG3s/RUr1FVsn8vv+eumvQ+Wy3hvKamTqtUpN3jd1bytHSDk3qoJwlKcVBpynyqyfMpL7iooor0j8hCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//2Q==' />" +
            "</p>";
        string display_command =
            "<p style='text-align:right;padding:opx 50px'>" +
            "   <input type='button' class='k-button' name='cancelemailLetter' value='Cancel' onclick='cancelemailLetter()'>" +
            "   <input type='button' class='k-button k-primary' name='emailLetter' value='Send Email to ComputerShare' onclick='emailLetterconfirm()'>&nbsp;&nbsp;&nbsp;" +
            "</p>";
        tmp1 = tmp1.Replace("[BOA-Logo]", display_BOA_logo) + display_command;
        return Json(tmp1);
    }

    [OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
    [HttpPost]
    public ActionResult SendMail()
    {
        var ret = "";
        try
        {
            int TransactionId = (int)Session["TransactionId"];
            BusEmail busEmail = new BusEmail();
            ret = busEmail.sndEmail(TransactionId, (string)Session["previewLetter"],
                (int)Session["Status_Pending"], (int)Session["Status_Approved"],
                (int)Session["userId"], Path.Combine(Server.MapPath("~/Images"), "BOALogoLetter.jpg"));
        }
        catch (Exception ex)
        {
            ret = ex.ToString();
            //throw ex;
        }
        return Json(ret);
    }
farzinmonsef commented 3 years ago

Data Metadata

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.ComponentModel.DataAnnotations; //using Attributes;

namespace Entitites { [MetadataType(typeof(TransactionMetaData))] public partial class Transaction { public static explicit operator List(Transaction t) { throw new NotImplementedException(); } } public class TransactionMetaData { //[UIHint("Date")] //[UIHint("NumberFormated")] //[DisplayFormat(DataFormatString = "{0:n0}")] //[ScaffoldColumn(false)] //[DataType(DataType.Text)] [Display(Name = "Transaction ID")] [Editable(false)] [UIHint("NumberFormatedDisbled")] public int Id { get; set; }

    [UIHint("DropDownCategory")]
    [Required(ErrorMessage = "Category is required.")]
    [Display(Name = "Category")]
    public Nullable<int> CategoryId { get; set; }

    //[UIHint("DropDownCategory")]
    [UIHint("DropDownTransactionType")]
    [Required(ErrorMessage = "Transaction Type is required.")]
    [Display(Name = "Transaction Type")]
    public Nullable<int> TransactionType { get; set; }

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . } }

farzinmonsef commented 3 years ago

GRID VIEW

@using Entitites @using EQM.Enumerations; @{ViewBag.Title = "Transactions"; }

@*

<br />
<input type="button" value="download" onclick="testDownload( 163 );" />*@


@(Html.Kendo().Grid() .Name("transactiongrid") .Columns(columns => { columns.Bound(c => c.Id).Title("ID").Filterable(filterable => filterable.UI("integerFilter")); ;//.ClientTemplate("#= kendo.toString(Id, \'n0\')#"); /*.Hidden();*/ columns.Bound(c => c.Category).Title("Category"); columns.Bound(c => c.TypeName).Title("Transaction Type"); columns.Bound(c => c.EntryDate).Format("{0: MM/dd/yyyy}"); columns.Bound(c => c.TransactionEffectiveDate).Format("{0: MM/dd/yyyy}"); columns.Command(command => { command.Edit().CancelText("Cancel").UpdateText("Submit").Text("Edit"); }).Hidden(); columns.Template(@) //.ClientTemplate(@"").Title("#"); .ClientTemplate(@"#if (FileName!= null) {# #} else {# #=''# #}#").Title("Attach"); columns.Bound(c => c.StatusName).Title("Status"); columns.Template(@).Width(100) .ClientTemplate(@" Edit") .Title("Actions"); columns.Command(command => command.Custom("Preview Letter") .HtmlAttributes(new { @class = "btn k-button k-grid-customCommand btnPreviewLetter" }).Click("showPreview")) .Width(90).Hidden(!((int)Session["userRole"] == (int)RoleType.Administrator)); columns.Template(@) .ClientTemplate(@"") .Title(" "); columns.Bound(c => c.FileName).Hidden(); }) .Groupable(g => g.Enabled(true)) .ColumnMenu() .Pageable(pageable => pageable .Refresh(true) .PageSizes(true) .ButtonCount(5) .PageSizes(new string[] { "10", "20", "50", "100" }) ) .Navigatable() .Selectable(selectable => { selectable.Mode(GridSelectionMode.Single); selectable.Type(GridSelectionType.Row); }) .ClientDetailTemplateId("template") .Sortable(sortable => { sortable.SortMode(GridSortMode.SingleColumn); }) .Filterable() .Scrollable(scrollable => scrollable.Enabled(false)) .Editable(ed => ed.Mode(GridEditMode.PopUp) .DisplayDeleteConfirmation(false) .TemplateName("_EditTransaction") .Window(w => w.Title("Add/Edit Transaction") .Width(1050) .Scrollable(false) .Name("EditTransaction") ) ) .Events(events => { events.DataBound("onTransactionDataBound"); events.Change("onTransactionChange"); events.Edit("onTransactionEdit"); events.Cancel("onTransactionCancel"); events.Save("onTransactionSave"); events.DetailExpand("onTransactionDetailExpand"); events.DetailCollapse("onTransactionDetailCollapse"); }) .Resizable(resize => resize.Columns(true)) .DataSource(dataSource => dataSource .Ajax() .ServerOperation(true) .Filter(filters => { filters.Add(TransactionDTO => TransactionDTO.StatusName).IsEqualTo("Pending"); }) .Model(model => { model.Id(p => p.Id); model.Field(t => t.Id).Editable(false); }) .PageSize(10) .Events(events => { events.Error("data_error_handler"); }) .Read(read => read.Action("ListAllTransactions", "Transaction")) .Create(create => create.Action("Transactions_Create", "Transaction")) .Update(update => update.Action("Transactions_Update", "Transaction")) .Destroy(destroy => destroy.Action("Transactions_Destroy", "Transaction")) ) //.ServerFitering(true) )
<Div id="myDiv">

</Div>
<br />
<script id="template" type="text/kendo-tmpl">
    #if(TransactionType=='14') @*Restricted Stock Issuance*@
    {#
    <div class="row">
        <div class="col-md-6 offset-md-3 row">
            <div class="col">
                <div class="form-group row">
                    <span class="font-weight-bold text-right col-md-8">Requisition Number:</span>
                    <span class="col-md-4">#= RequisitionNumber != null ? RequisitionNumber : '' #</span>
                </div>
                <div class="form-group row">
                    <span class="font-weight-bold text-right col-md-8">Reserve Name:</span>
                    <span class="col-md-4">#= ReserveName != null ? ReserveName : '' #</span>
                </div>
                <div class="form-group row">
                    <span class="font-weight-bold text-right col-md-8">Total Vested Shares:</span>
                    <span class="col-md-4">#= kendo.toString(TotalVestedShares != null ? TotalVestedShares : '', "n0") #</span>
                </div>
            </div>
            <div class="col">
                <div class="form-group row">
                    <span class="font-weight-bold text-right col-md-4">Memo:</span>
                    <span class="col-md-8">#= Memo != null ? Memo : '' #</span>
                </div>
            </div>
        </div>
    </div>
    #}#

    #if(TransactionType=='15') @*Restricted Stock Issuance - Reversal*@
    {#
    <div class="row">
        <div class="col-md-6 offset-md-3 row">
            <div class="col">
                <div class="form-group row">
                    <span class="font-weight-bold text-right col-md-8">Requisition Number:</span>
                    <span class="col-md-4">#= RequisitionNumber != null ? RequisitionNumber : '' #</span>
                </div>
                <div class="form-group row">
                    <span class="font-weight-bold text-right col-md-8">Reserve Name:</span>
                    <span class="col-md-4">#= ReserveName != null ? ReserveName : '' #</span>
                </div>
                <div class="form-group row">
                    <span class="font-weight-bold text-right col-md-8">Total Vested Shares:</span>
                    <span class="col-md-4">#= kendo.toString(TotalVestedShares != null ? TotalVestedShares : '', "n0") #</span>
                </div>
            </div>
            <div class="col">
                <div class="form-group row">
                    <span class="font-weight-bold text-right col-md-4">Memo:</span>
                    <span class="col-md-8">#= Memo != null ? Memo : '' #</span>
                </div>
            </div>
        </div>
    </div>
    #}#

    #if(TransactionType=='3') @*Restricted Stock Release*@
    {#
    <div class="row">
        <div class="col">
            <div class="form-group row">
                <span class="font-weight-bold text-right col-md-8">Requisition Number:</span>
                <span class="col-md-4">#= RequisitionNumber != null ? RequisitionNumber : '' #</span>
            </div>
            @*<div class="form-group row">
                    <span class="font-weight-bold text-right col-md-8">Reserve Name:</span>
                    <span class="col-md-4">#= ReserveName != null ? ReserveName : '' #</span>
                </div>*@
            <div class="form-group row">
                <span class="font-weight-bold text-right col-md-8">Total Vested Shares:</span>
                <span class="col-md-4"> #= kendo.toString(TotalShares != null ? TotalShares : '', "n0") #</span>
            </div>
        </div>
        <div class="col">
            <div class="form-group row">
                <span class="font-weight-bold text-right col-md-8">Net Shares to Broker:</span>
                <span class="col-md-4"> #= kendo.toString(NetSharesToMerrillLynch != null ? NetSharesToMerrillLynch : '', "n0") #</span>
            </div>
            <div class="form-group row">
                <span class="font-weight-bold text-right col-md-8">Shares for Tax:</span>
                <span class="col-md-4">#= kendo.toString(SharesForTax != null ? SharesForTax : '', "n0") #</span>
            </div>
            <div class="form-group row">
                <span class="font-weight-bold text-right col-md-8">Value of Tax Shares:</span>
                <span class="col-md-4">#= kendo.toString(ValueOfTaxShares != null ? ValueOfTaxShares : '', "c") #</span>
            </div>
        </div>
        <div class="col">
            <div class="form-group row">
                <span class="font-weight-bold text-right col-md-2">Memo:</span>
                <span class="col-md-10">#= Memo != null ? Memo : '' #</span>
            </div>
        </div>
    </div>
    #}#

    #if(TransactionType=='4') @*Restricted Stock Release - Reversal*@
    {#
    <div class="row">
        <div class="col">
            <div class="form-group row">
                <span class="font-weight-bold text-right col-md-8">Requisition Number:</span>
                <span class="col-md-4">#= RequisitionNumber != null ? RequisitionNumber : '' #</span>
            </div>
            <div class="form-group row">
                <span class="font-weight-bold text-right col-md-8">Reserve Name:</span>
                <span class="col-md-4">#= ReserveName != null ? ReserveName : '' #</span>
            </div>
            <div class="form-group row">
                <span class="font-weight-bold text-right col-md-8">Total Vested Shares:</span>
                <span class="col-md-4"> #= kendo.toString(TotalShares != null ? TotalShares : '', "n0") #</span>
            </div>
        </div>
        <div class="col">
            <div class="form-group row">
                <span class="font-weight-bold text-right col-md-8">Net Shares to Broker:</span>
                <span class="col-md-4"> #= kendo.toString(NetSharesToMerrillLynch != null ? NetSharesToMerrillLynch : '', "n0") #</span>
            </div>
            <div class="form-group row">
                <span class="font-weight-bold text-right col-md-8">Shares for Tax:</span>
                <span class="col-md-4">#= kendo.toString(SharesForTax != null ? SharesForTax : '', "n0") #</span>
            </div>
            <div class="form-group row">
                <span class="font-weight-bold text-right col-md-8">Value of Tax Shares:</span>
                <span class="col-md-4">#= kendo.toString(ValueOfTaxShares != null ? ValueOfTaxShares : '', "c") #</span>
            </div>
        </div>
        <div class="col">
            <div class="form-group row">
                <span class="font-weight-bold text-right col-md-2">Memo:</span>
                <span class="col-md-10">#= Memo != null ? Memo : '' #</span>
            </div>
        </div>
    </div>
    #}#

    #if(TransactionType=='5') @*Annuity*@
    {#
    <div class="row">
        <div class="col">
            <div class="form-group row">
                <span class="font-weight-bold text-right col-md-8">Plan Name:</span>
                <span class="col-md-4">#= PlanName!= null ? TypePlanName : '' #</span>
            </div>
            <div class="form-group row">
                <span class="font-weight-bold text-right col-md-8">Gross Stock Units Distributed:</span>
                <span class="col-md-4">#= kendo.toString(GrossStockUnitsDistributed != null ? GrossStockUnitsDistributed : '', "n0")  #</span>
            </div>
            <div class="form-group row">
                <span class="font-weight-bold text-right col-md-8">Net Stock Unit Shares to Distribute:</span>
                <span class="col-md-4"> #= kendo.toString(NetStockUnitSharestoDistribute!= null ? NetStockUnitSharestoDistribute : '', "n0") #</span>
            </div>
            <div class="form-group row">
                <span class="font-weight-bold text-right col-md-8">Cancel and Retire Shares:</span>
                <span class="col-md-4"> #= kendo.toString(CancelandRetireShares != null ? CancelandRetireShares : '', "n0") #</span>
            </div>
            <div class="form-group row">
                <span class="font-weight-bold text-right col-md-8">Value of Tax Shares:</span>
                <span class="col-md-4">#= kendo.toString(ValueOfTaxShares != null ? ValueOfTaxShares : '', "c") #</span>
            </div>
        </div>
        <div class="col">
            <div class="form-group row">
                <span class="font-weight-bold text-right col-md-2">Memo:</span>
                <span class="col-md-10">#= Memo != null ? Memo : '' #</span>
            </div>
        </div>
    </div>
    #}#

    #if(TransactionType=='6') @* For Director Grant *@
    {#
    <div class="row">
        <div class="col">
            <div class="form-group row">
                <span class="font-weight-bold text-right col-md-8">Reserve Name:</span>
                <span class="col-md-4">#= ReserveName!= null ? ReserveName : '' #</span>
            </div>
            <div class="form-group row">
                <span class="font-weight-bold text-right col-md-8">Common Restricted Unvested Shares Granted:</span>
                <span class="col-md-4">#= kendo.toString(CommonRestrictedUnvestedSharesGranted != null ? CommonRestrictedUnvestedSharesGranted : '', "n0")  #</span>
            </div>
            <div class="form-group row">
                <span class="font-weight-bold text-right col-md-8">Common Restricted Unvested Shares INTO CR1:</span>
                <span class="col-md-4"> #= kendo.toString(CommonRestrictedUnvestedSharesINTOCR1!= null ? CommonRestrictedUnvestedSharesINTOCR1 : '', "n0") #</span>
            </div>
            <div class="form-group row">
                <span class="font-weight-bold text-right col-md-8">Cancel and Retire Shares:</span>
                <span class="col-md-4"> #= kendo.toString(CancelandRetireShares != null ? CancelandRetireShares : '', "n0") #</span>
            </div>
            <div class="form-group row">
                <span class="font-weight-bold text-right col-md-8">Director Name:</span>
                <span class="col-md-4"> #= kendo.toString(DirectorName != null ? DirectorName : '') #</span>
            </div>
            <div class="form-group row">
                <span class="font-weight-bold text-right col-md-8">Value of Tax Shares:</span>
                <span class="col-md-4">#= kendo.toString(ValueOfTaxShares != null ? ValueOfTaxShares : '', "c") #</span>
            </div>
        </div>
        <div class="col">
            <div class="form-group row">
                <span class="font-weight-bold text-right col-md-2">Memo:</span>
                <span class="col-md-10">#= Memo != null ? Memo : '' #</span>
            </div>
        </div>
    </div>
    #}#

    #if(TransactionType=='7') @* For Director Vesting *@
    {#
    <div class="row">
        <div class="col">
            <div class="form-group row">
                <span class="font-weight-bold text-right col-md-8">Common Restricted Unvested Shares FROM CR1:</span>
                <span class="col-md-4"> #= kendo.toString(CommonRestrictedUnvestedSharesFROMCR1!= null ? CommonRestrictedUnvestedSharesFROMCR1 : '', "n0") #</span>
            </div>
            <div class="form-group row">
                <span class="font-weight-bold text-right col-md-8"> Common Restricted Shares INTO CR2:</span>
                <span class="col-md-4"> #= kendo.toString(CommonRestrictedShareINTOCR2!= null ? CommonRestrictedShareINTOCR2 : '', "n0") #</span>
            </div>
            <div class="form-group row">
                <span class="font-weight-bold text-right col-md-8">Cancel and Retire Shares:</span>
                <span class="col-md-4"> #= kendo.toString(CancelandRetireShares != null ? CancelandRetireShares : '', "n0") #</span>
            </div>
            <div class="form-group row">
                <span class="font-weight-bold text-right col-md-8">Director Name:</span>
                <span class="col-md-4"> #= kendo.toString(DirectorName != null ? DirectorName : '') #</span>
            </div>
            <div class="form-group row">
                <span class="font-weight-bold text-right col-md-8">Value of Tax Shares:</span>
                <span class="col-md-4">#= kendo.toString(ValueOfTaxShares != null ? ValueOfTaxShares : '', "c") #</span>
            </div>
        </div>
        <div class="col">
            <div class="form-group row">
                <span class="font-weight-bold text-right col-md-2">Memo:</span>
                <span class="col-md-10">#= Memo != null ? Memo : '' #</span>
            </div>
        </div>
    </div>
    #}#
    #if(TransactionType=='10') @* For Retire Treasury Shares*@
    {#
    <div class="row">
        <div class="col">
            <div class="form-group row">
                <span class="font-weight-bold text-right col-md-8">Account Name:</span>
                <span class="col-md-4"> #= kendo.toString(AccountName!= null ? AccountName : '', "n0") #</span>
            </div>
            <div class="form-group row">
                <span class="font-weight-bold text-right col-md-8"> Total Treasury Shares:</span>
                <span class="col-md-4"> #= kendo.toString(TotalTreasurySharestoRetire!= null ? TotalTreasurySharestoRetire : '', "n0") #</span>
            </div>
            <div class="form-group row">
                <span class="font-weight-bold text-right col-md-8">Cancel and Retire Shares:</span>
                <span class="col-md-4"> #= kendo.toString(CancelandRetireShares != null ? CancelandRetireShares : '', "n0") #</span>
            </div>
        </div>
        <div class="col">
            <div class="form-group row">
                <span class="font-weight-bold text-right col-md-2">Memo:</span>
                <span class="col-md-10">#= Memo != null ? Memo : '' #</span>
            </div>
        </div>
    </div>
    #}#
</script>

@(Html.Kendo().Window()
.Name("windowPreview")
.Title("Preview Letter")
.Modal(true)
.Visible(false)
.Content(@<text>
        <html>
        <head>
        </head>
        <body lang=EN-US>
            <div style="font-size:medium">
                <br />
                [BOA-Logo]
                <table style="width:100%">
                    <tr><td colspan="5" style="padding:20px 0px 0px 0px"><h6>Equity Management Communication</h6></td></tr>
                    <tr><td colspan="5" style="padding:30px 0px 30px 0px"><h3>[Title]</h3></td></tr>
                    <tr><td colspan="5"><b>To:</b>&nbsp;[To]</td></tr>
                    <tr><td colspan="5"><b>From:</b>&nbsp;[From]</td></tr>

                    <tr><td colspan="5">&nbsp;</td></tr>
                    <tr><td colspan="5" style="padding:10px 0px 10px 0px">Under the terms of the Bank of America Key 2003 Employee Equity Plan, we instruct you as follows:</td></tr>
                    <tr><td colspan="5" style="padding:0px 0px 40px 0px;color:#e61837"><h5>[Title]</h5></td></tr>

                    <tr><td></td><td colspan="3">&#9830;&nbsp;&nbsp;Requisition Number:&nbsp;[RequisitionNumber]</td></tr>
                    <tr><td></td><td colspan="3">&#9830;&nbsp;&nbsp;Effective Date:&nbsp;[TransactionEffectiveDate]</td></tr>
                    <tr><td></td><td colspan="3">&#9830;&nbsp;&nbsp;Debit:&nbsp;[ReserveName]</td></tr>
                    <tr><td></td><td colspan="3">&#9830;&nbsp;&nbsp;Debit Shares:&nbsp;[TotalVestedShares]</td></tr>
                    <tr><td></td><td colspan="3">&#9830;&nbsp;&nbsp;Credit: Restricted Stock Account for Stock Plan Participants </td></tr>
                    <tr><td></td><td colspan="3">&#9830;&nbsp;&nbsp;Credit Shares:&nbsp;[TotalVestedShares]</td></tr>
                    <tr><td colspan="5">&nbsp;</td></tr>

                    <tr><td colspan="4">&nbsp;</td></tr>
                    <tr><td colspan="5">Approved By: [Approved]</td></tr>
                    <tr><td colspan="5">Corporate Title: [CorporateTitle]</td></tr>
                    <tr><td colspan="5">&nbsp;</td></tr>
                    <tr><td colspan="5">Prepared by: [Prepared]</td></tr>
                    <tr><td colspan="5">Date: [EntryDate]</td></tr>
                    <tr class="tblrowbotoomborder"><td colspan="5">&nbsp;</td></tr>
                    <tr><td colspan="5" style="padding:10px 0px 40px 0px">Bank of America N.A. Member FDIC © [LetterYear] Bank of America Corporation. All rights reserved</td></tr>
                    <tr><td>&nbsp;</td></tr>
                </table>
            </div>
        </body>
    </html>
    <p style="text-align:center;padding: 50px">
        <input type="button" class="k-button" name="cancelemailLetter" value="Cancel" onclick="cancelemailLetter()">
        <input type="button" class="k-button k-primary" name="emailLetter" value="Send Email to ComputerShare" onclick="emailLetter()">&nbsp;&nbsp;&nbsp;
    </p>
</text>)

.Draggable() .Resizable() .Width(800) .Actions(actions => actions.Pin().Minimize().Maximize().Close()) .Events(ev => ev.Close("onWindowClose")) )

<div id="msg" style="background:#0d005d;
        visibility:hidden;
        width:30%;
        top:0px;
        left: 0%;
        position:absolute;
        color:white;
        box-shadow: 10px 10px 5px #aaaaaa;
        text-align: center;
        border-radius: 4px;
        border: 4px black;
        padding: 0px 18px 18px 18px;
        border: 4px solid #333;
        font-size: 20px;
        z-index: 8888;
        opacity: 0.97;">
    <table style="width:100%;height:100%;">
        <tbody>
            <tr>
                <td id="mymsgtitle" colspan="2" style="text-align:center;padding: 0px 0px 18px 0px;font-size:30px;">
                </td>
            </tr>
            <tr>
                <td>
                    <img id="msgIcon" src="../Images/_info.png" alt="Success">
                </td>
                <td id="mymsg" style="vertical-align: middle">
                </td>
            </tr>
        </tbody>
    </table>
</div>
<div id="alertboxmodal"
     style="display: none; /* Hidden by default */
    position: fixed; /* Stay in place */
    z-index: 9999; /* Sit on top */
    padding-top: 100px; /* Location of the box */
    left: 0;
    top: 0;
    width: 100%; /* Full width */
    height: 100%; /* Full height */
    overflow: auto; /* Enable scroll if needed */
    background-color: rgb(0,0,0); /* Fallback color */
    background-color: rgba(0,0,0,0.4); /* Black w/ opacity */"
     class="alertboxmodal">
    <div style="background-color: #fefefe;
        margin: auto;
        padding: 20px;
        border: 1px solid #888;
        width: 40%;"
         class="alertbox-content">
        <table style="width:100%;height:100%;">
            <tbody>
                <tr>
                    <td id="mymsgtitle" colspan="5" style="text-align:center;padding: 0px 0px 0px 0px;">
                        <span class="close" id="alertboxclose"
                              style="{width:30px;height:30px;text-align:right;color: #aaaaaa;float:right;font-size:28px;font-weight:bold;}
                            :hover,
                            :focus {color: #000;text-decoration: none;cursor: pointer;}"
                              onclick="alertboxclose();">&times;</span>
                    </td>
                </tr>
                <tr>
                    <td id="mymsgtitle" colspan="5" style="text-align:center;padding: 0px 0px 18px 0px;font-size:30px;">
                        <span id="alertboxtitle" style="text-align:center">MY-TITLE-HERE</span>
                    </td>
                </tr>
                <tr>
                    <td>
                        <img id="msgIcon" src="../Images/_question.png" alt="Success">
                    </td>
                    <td colspan="3" style="vertical-align: middle">
                        <span id="alertboxmsg" style="text-align:center">MY-MESSAGE-HERE</span>
                    </td>
                </tr>
                <tr>
                    <td colspan="2" style="vertical-align:left;text-align:center;padding: 40px 0px 0px 0px;font-size:15px;">
                        <span id="alertboxftr" style="text-align:center">MY-FOOTER-HERE</span>
                    </td>
                    <td style="text-align:right">
                        <input type="button" value="OK" class="k-button k-primary" onclick="modaldlgclick(1);" />&nbsp;
                        <input type="button" value="Cancel" class="k-button" onclick="modaldlgclick(0);" />&nbsp;
                    </td>
                </tr>
            </tbody>
        </table>
    </div>
</div>
<!-- #endregion -->

<script type="text/javascript">
// #region Main
$(document).ready(function () {
    $("#transactiongrid").kendoTooltip({
        filter: "td:nth-child(8)",
        position: "below",
        hideAfter: 500,
        content: function (e) {
            //debugger;
            var dataItem = $("#transactiongrid").data("kendoGrid").dataItem(e.target.closest("tr"));
            var content = dataItem.FileName;
            if ((content == "") || (content == null))
            { content = "(No File)"; }
            else
            { content = 'Download "' + content + '"'; }
            return '<div style="text-align:center;width: ' + content.length * .5 + 'em; max-width: 14em">' + content + '</div>';
        }
    }).data("kendoTooltip");
})
function openWindow(e) {
    e.preventDefault();

    var row = $(e.currentTarget).closest("tr");
    wnd.center().open();

    $("#yes").click(function () {
        grid.removeRow(row);
        wnd.close();
    });

    $("#no").click(function () {
        wnd.close();
    });
}
function data_error_handler(e) {
    if (e.errors) {
        var message = "Data Errors:\n";
        //ev.preventDefault();
        $.each(e.errors, function (key, value) {
            if ('errors' in value) {
                $.each(value.errors, function () {
                    message += this + "\n";
                });
            }
        });
        alertBox(3, message, '', 10000);
    }
}
function integerFilter(e) {
    e.kendoNumericTextBox({
        decimals: 0,
        format: "g"
    });
}
// #endregion

// #region Transaction Grid Events

var rowselected;
var transactionEdit = 0

function onTransactionChange(e) {
    //if (typeof rowselected != 'undefined') {
    //    $("#transactiongrid").data("kendoGrid").select(rowselected);
    //}
}
var gridEdit = null;
function onTransactionEdit(e) {
    debugger;
    gridEdit = e;
    console.log("Grid data Edit= " + (transactionEdit++));
    //rowselected = $(event.srcElement).closest("tr");
    var row = $(event.srcElement).closest("tr");
    var grid = $("#transactiongrid").data("kendoGrid");
    rowselected = row;
    grid.select(row);

    var datepickerinput = e.container.find("input[name=EntryDate]"); // get the input element for the field
    var datepicker = datepickerinput.data("kendoDatePicker");
    datepicker.enable(false); //disable the date picker
    if (e.model.isNew() && !e.model.dirty) {
        var tmp = e.container.find("input[name=TransactionType]"); // get the input element for the field
        tmp.val(2); // set the value
        tmp.change(); // trigger change in order to notify the model binding

        var tmp1 = e.container.find("input[name=AccountName]"); // get the input element for the field
        tmp1.val("BAC Treasury Acct. (KEEP-TS) - T35"); // set the value
        tmp1.change(); // trigger change in order to notify the model binding

        var today = new Date();
        var dd = String(today.getDate()).padStart(2, '0');
        var mm = String(today.getMonth() + 1).padStart(2, '0'); //January is 0!
        var yyyy = today.getFullYear();
        today = mm + '/' + dd + '/' + yyyy;
        datepickerinput.val(today); // set the value
        datepickerinput.change(); // trigger change in order to notify the model binding
        hideAll();
        hideTransactionId();
    }
    else {
        var id = e.container.find("input[name=Id]");
        callSetFilePrefix(id[0].value);
        var cat = $("#Category").data("kendoDropDownList");
        cat.value(e.model.CategoryId);
        cat.enable(false);
        refreshTransactionType(e.model.CategoryId);
        var planname = $("#PlanName").data("kendoDropDownList");
        planname.value(e.model.PlanName);

        var tt = $("#TransactionType").data("kendoDropDownList");
        tt.value(e.model.TransactionType);
        tt.enable(false);
        //var ttt = tt.data("kendoDropDownList");
        var txt = tt.text();
        showTransactionFields(e, txt);
        console.log("DD-Text=" + txt);
    }
    //$("#transactiongrid").data("kendoGrid").select(".k-grid-edit-row");

    //grid.select(row);
}

function onTransactionCancel(e) {
}
function onTransactionDataBound(e) {
    var grid = this;
    adjustButtonPreview(grid);
    //if (typeof rowselected != 'undefined') {
    //    $("#transactiongrid").data("kendoGrid").select(rowselected);
    //}

}
function onTransactionSaveChanges(e) {
    var tmp = e.container.find("input[name=TransactionType]"); // get the input element for the field
    console.log("TransactionType is " + tmp[0].value); // set the value
    e.model.TransactionType = tmp[0].value;
    e.model.TypeName = $("#TransactionType").data("kendoDropDownList").text();
    var tmp1 = e.container.find("input[name=Category]"); // get the input element for the field
    console.log("Category is " + tmp1[0].value); // set the value
    e.model.CategoryId = tmp1[0].value;
    if ( '@Session["UplodedFile"]' != '') {
        e.model.FileName = '@Session["UplodedFile"]';
    }
}

function onTransactionDetailCollapse(e) {
    var row = $(event.srcElement).closest("tr");
    var grid = $("#transactiongrid").data("kendoGrid");
    rowselected = row;
    grid.select(row);
}
function onTransactionDetailExpand(e) {
    var row = $(event.srcElement).closest("tr");
    var grid = $("#transactiongrid").data("kendoGrid");
    rowselected = row;
    grid.select(row);
}

function onTransactionSave(e) {
    console.log("Grid Save");
    var tmp2 = e.container.find("input[name=PlanName]"); // get the input element for the field
    console.log("PlanName is " + tmp2[0].value); // set the value
    e.model.PlanName= tmp2[0].value;
    e.model.TypePlanName = $("#PlanName").data("kendoDropDownList").text();
    var tmp = e.container.find("input[name=TransactionType]"); // get the input element for the field
    console.log("TransactionType is " + tmp[0].value); // set the value
    e.model.TransactionType = tmp[0].value;
    e.model.TypeName = $("#TransactionType").data("kendoDropDownList").text();
    var tmp1 = e.container.find("input[name=Category]"); // get the input element for the field
    console.log("Category is " + tmp1[0].value); // set the value
    e.model.CategoryId = tmp1[0].value;
    e.model.Category = $("#Category").data("kendoDropDownList").text();
    if ( '@Session["UplodedFile"]' != '') {
        e.model.FileName = '@Session["UplodedFile"]';
    }

    if (e.model.isNew()) {
        var datepickerinput = e.container.find("input[name=EntryDate]"); // get the input element for the field
        //var datepicker = datepickerinput.data("kendoDatePicker");
        console.log("datepickerinput=" + datepickerinput[0].value);
        e.model.EntryDate = datepickerinput[0].value;
        e.model.CreatedOn = new Date();
        e.model.CreatedById = '@Session["userId"]';
        e.model.Status = '@Session["Status_Pending"]';
        e.model.StatusName = 'Pending';
    }
    else {
        e.model.ModifiedOn = new Date();
        e.model.ModifiedById = '@Session["userId"]';
    }
    //if (typeof rowselected != 'undefined') {
    //    $("#transactiongrid").data("kendoGrid").select(rowselected);
    //}
}

function callSetFilePrefix(id) {
    var data = {};
    data.id = id;
    $.ajax({
        type: "POST",
        url: '@Url.Action("setFilePrefix", "TransUpload")',
        //url: "/TransUpload/setFilePrefix",
        data: JSON.stringify(data),
        contentType: "application/json",
        dataType: "json",
        cache: false
    }).done(function (response) {
        console.log('callSetFilePrefix= ' + response);
    }).fail(function (response) {
        console.log('Error: ' + 'callSetFilePrefix= ' + response);
    });
}

function addRowTransaction() {
    var userNo = '@Session["userNumber"]';
    callSetFilePrefix(userNo);
    var grid = $("#transactiongrid").data("kendoGrid");
    grid.addRow();
}

function adjustButtonPreview(grid) {
    grid.tbody.find("tr[role='row']").each(function () {
        var model = grid.dataItem(this);
        if (model.Status != '@Session["Status_Pending"]') {
            $(this).find(".k-grid-customCommand").removeClass("k-primary");
            $(this).find(".k-grid-customCommand").addClass("k-state-disabled");
            $(this).find(".k-grid-customCommand").addClass("k-btn-grayed");
            $(this).find(".k-grid-edit").removeClass("k-outline-primary");
            $(this).find(".k-grid-edit").addClass("k-state-disabled");
            $(this).find(".k-grid-edit").addClass("k-btn-grayed");
        } else {
            $(this).find(".k-grid-customCommand").addClass("k-primary ");
            $(this).find(".k-grid-edit").addClass("k-outline-primary");
        }
    });
}
// #endregion

// #region Upload Functions
function onUploadSelect(e) {
    console.log("Select :: " + getFileInfo(e));
}

function onUploadUpload(e) {
    console.log("Upload :: " + getFileInfo(e));
}

function onUploadSuccess(e) {
    //debugger;
    console.log("Success (" + e.operation + ") :: " + getFileInfo(e));

    var upload = $("#files").data("kendoUpload"),
        files = upload.getFiles();
    console.log("You have selected " + files.length + " files");
    console.log(files);

    var txtfilename = $('input[name="FileName"]');
    var myfileName = files.length > 0 ? files[0].name : '';
    txtfilename.val(myfileName);
    gridEdit.model.FileName = myfileName;
    gridEdit.model.dirty = true;
}

function onUploadError(e) {
    console.log("Error (" + e.operation + ") :: " + getFileInfo(e));
}

function onUploadComplete(e) {
    console.log("Complete");
}

function onUploadCancel(e) {
    console.log("Cancel :: " + getFileInfo(e));
}

function onUploadRemove(e) {
    console.log("Remove :: " + getFileInfo(e));
}

function onUploadProgress(e) {
    console.log("Upload progress :: " + e.percentComplete + "% :: " + getFileInfo(e));
}

function getFileInfo(e) {
    return $.map(e.files, function (file) {
        var info = file.name;
        if (file.size > (5 * 1024 * 1024)) {
            return false;
        }
        return true;//info;
    });
}
// #endregion

// #region Dropdown Events
function onDDTransactionTypeChange(e) {
    if (e.item) {
        var dataItem = this.dataItem(e.item);
        //if ( dataItem.Text
        console.log("event :: Change (" + dataItem.Text + " : " + dataItem.Value + ")");
    } else {
        console.log("event :: Change");
    }
}
function onDDTransactionTypeSelect(e) {
    if (e.item) {
        var txt = e.item[0].innerText;
        console.log("Selected Text = " + txt);
        console.log(txt.indexOf("issuance") < 0);
        showTransactionFields(e, txt);
    } else {
        console.log("event :: select");
    }
}
function onChangeCategory(e) {
    var catval = $("#Category").data("kendoDropDownList").value();
    refreshTransactionType(catval);
}
function refreshTransactionType(categoryValue) {
    var tt = $("#TransactionType").data("kendoDropDownList");
    var ttData = tt.dataSource;
    ttData.data([]); tt.text(""); tt.value(""); hideAll();

    var ttList = '@Session["StrTransactionTypeList"]';
    var ttListAr = ttList.split('|');
    for (var i = 0; i < ttListAr.length; i++) {
        var ttListArItem = ttListAr[i].split('^');
        if (ttListArItem[0] == categoryValue) {
            ttData.add({ "Id": ttListArItem[1], "Name": ttListArItem[2] });
        }
    }
}
// #endregion

// #region Show/Hide Transaction Fields
function showTransactionFields(e, txt) {
    hideAll();
    var effectiveDate = gridEdit.container.find("label[for=TransactionEffectiveDate]");
    effectiveDate[0].innerText = 'Effective Date';
    if (txt.toLowerCase().indexOf("issuance") > 0) {
        showFieldsByClass("issuance");
    }
    else if (txt.toLowerCase().indexOf("release") > 0) {
        showFieldsByClass("release");
    }
    else if (txt.toLowerCase() == "annuity") {
        showFieldsByClass("annuity");
    }
    else if (txt.toLowerCase().indexOf("grant") > 0) {
        showFieldsByClass("Grant");
    }
    else if (txt.toLowerCase().indexOf("vesting") > 0) {
        showFieldsByClass("Vesting");
    }
    else if (txt.toLowerCase().indexOf("treasury") > 0) {
        showFieldsByClass("Treasury");
    }
    else if (txt.toLowerCase().indexOf("repurchase") > 0) {
        showFieldsByClass("Repurchase");
        effectiveDate[0].innerText = 'Settlement Date';
    }

}
function showFieldsByClass(className) {
    var i; var x = null;
    x = document.getElementsByClassName(className);
    for (i = 0; i < x.length; i++) {
        x[i].style.display = "";
    }
}
function hideFieldsByClass(className) {
    var i; var x = null;
    x = document.getElementsByClassName(className);
    for (i = 0; i < x.length; i++) {
        x[i].style.display = "none";
    }
}
function hideAll() {
    hideFieldsByClass("issuance");
    hideFieldsByClass("release");
    hideFieldsByClass("annuity");
    hideFieldsByClass("Grant");
    hideFieldsByClass("Vesting");
    hideFieldsByClass("Treasury");
    hideFieldsByClass("Repurchase");
}
function hideTransactionId() {
    hideFieldsByClass("TransactionId");
}
// #endregion

// #region Show Preview Letter & Send Email
function showPreview(e) {
    e.preventDefault();

    var row = $(event.srcElement).closest("tr");
    var grid = $("#transactiongrid").getKendoGrid();
    console.log(row);
    grid.select(row);

    var dataItem = grid.dataItem(row);
    console.log("TransactionId: " + dataItem.Id);

    grid.tbody.find("tr[role='row']")
    rowselected = row;

    var data = {};
    data.TransactionId = dataItem.Id;
    $.ajax({
        type: "POST",
        url: '@Url.Action("GetPreviewLetter", "Transaction")',
        data: JSON.stringify(data),
        contentType: "application/json",
        dataType: "json",
        cache: false
    }).done(function (data) {
        console.log('data= ' + data);
        var wnd = $("#windowPreview").data("kendoWindow");
        wnd.content(data);
        wnd.center().open();
    }).fail(function (data) {
        console.log('Error-GetPreviewLetter: ' + data);
    });
}

var emailLetterFunc = function emailLetter() {
    $.ajax({
        type: "POST",
        url: '@Url.Action("SendMail", "Transaction")',
        cache: false
    }).done(function (data) {
        console.log('data= ' + data);
        if (!data.toLowerCase().includes("error") && !data.toLowerCase().includes("failure")) {
            if (data.toLowerCase().includes("already emailed")) {
                $("#windowPreview").data("kendoWindow").close();
                alertBox(2, data, '', 7000);
            }
            else {
                $("#windowPreview").data("kendoWindow").close();
                $("#transactiongrid").data("kendoGrid").dataSource.read();
                $("#transactiongrid").data("kendoGrid").dataSource.sync();
                alertBox(0, "Letter emailed !", '', 8000);
            }
        }
        else {
            $("#windowPreview").data("kendoWindow").close();
            alertBox(2, "Sending Letter Error !\n" + data, '', 12000);
        }
    }).fail(function (data) {
        console.log('Error Connecting Send Email: \n' + data);
    });
}
function cancelemailLetter() {
    $("#windowPreview").data("kendoWindow").close();
}
function onWindowClose() {
    console.log("Popup Window Closed");
}

function emailLetterconfirm() {

    alertboxmodal("Are You Sure Want to Send Email to ComputerShare?"  //message
        , "Sending Email to ComputerShare"  //title
        , "Equity Management"  //footer
        , emailLetterFunc);    //callback function for OK

}
// #endregion

// #region Custom Validation Rules
(function ($, kendo) {
    $.extend(true, kendo.ui.validator, {
        rules: {
            requiredif: function (input) {
                var tmp = input[0].attributes["data-val-requiredif"];
                if (typeof tmp != 'undefined') {
                    var requiredifExists = input[0].attributes["data-val-requiredif"].value;
                    var requirediffield = input[0].attributes["data-val-requiredif-field"].value;
                    var requiredifvalues = input[0].attributes["data-val-requiredif-values"].value;
                    var v = $("input[name=" + requirediffield + "]")[0].value
                    var requiredifvaluesArray = requiredifvalues.split('|');
                    var match = false;
                    for (var i = 0; i < requiredifvaluesArray.length; i++) {
                        if (requiredifvaluesArray[i] == v) {
                            match = true;
                            break;
                        }
                    }
                    if (match) {
                        if ((input[0].value == '') || (input[0].value == null)) {
                            return false;
                        }
                    }
                }
                return true;
            }
        },
        messages: {
            requiredif: function (input) {
                return input[0].attributes["data-val-requiredif"].value;
            }
        }
    });
})(jQuery, kendo);
// #endregion

// #region AlertBox
//to Start the Alert Box, Selecting Mode(Success(Default=any value), Warning=2, Error=3, Info=4),
//Set Message, Title, Position and Show/Animate the Box
function alertBox(action, msg, title, alerttime) {
    var scroll_pos = (0);
    var scrollTop = 0;
    $('html, body').animate({ scrollTop: (scroll_pos) }, '2000');
    switch (action) {
        case 2://warn
            $("#msgIcon")[0].src = "../Images/_warn.png"
            $("#msg").css({ background: '#fae780', color: 'Black', border: '4px #4b4002' });
            if (title == '') { title = 'Warning'; }
            alertBoxMsg(msg, title, alerttime);
            break;
        case 3://error
            $("#msgIcon")[0].src = "../Images/_error.png"
            $("#msg").css({ background: '#f75656', color: 'Black', border: '4px #680707' });
            if (title == '') { title = 'Error'; }
            alertBoxMsg(msg, title, alerttime);
            break;
        case 4://info
            $("#msgIcon")[0].src = "../Images/_info.png"
            $("#msg").css({ background: '#35f9f9', color: 'Black', border: '4px #055e5f' });
            if (title == '') { title = 'Information'; }
            alertBoxMsg(msg, title, alerttime);
            break;
        default://success
            $("#msgIcon")[0].src = "../Images/_success.png"
            $("#msg").css({ background: '#0d005d', color: 'white', border: '4px black' });
            if (title == '') { title = 'Success'; }
            alertBoxMsg(msg, title, alerttime);
    }
}

function alertBoxShow(msg, mytime) {
    alertBoxPos();
    var ret = setwidth(msg);
    $("#msg").animate({ top: '30px', width: ret + '%', left: (98 - ret) + '%' });
    setTimeout(() => {
        $("#msg").animate({ top: '-50%' });
        setTimeout(() => { $("#msg").css({ visibility: 'hidden' }); }, 500);
    }, mytime);
}
//to Initiate the Alert Box Position, start mode
function alertBoxPos() {
    $("#msg").css({ top: '30px', left: '105%' });
    $("#msg").css({ visibility: 'visible' });
}
//to Set the Alert Box Message and Title, then Show the Box
function alertBoxMsg(msg, title, mytime) {
    $("#mymsg").text(msg);
    $("#mymsgtitle").text(title);
    setwidth(msg);
    alertBoxShow(msg, mytime);
}
function setwidth(msg) {
    var val = msg.length;
    var ret = 30;
    if ((200 <= val) && (val < 500)) { ret = 60; }
    else {
        if (500 <= val) { ret = 90; }
    }
    return ret;
}
// #endregion

// #region AlertBox Modal
var ModalDlgState = -1;
var modal = document.getElementById("alertboxmodal");
function alertboxclose() {
    modaldlgclick(0);
}
function modaldlgclick(ModalDlgValue) {
    ModalDlgState = ModalDlgValue;
    closeModal();
}
function closeModal() {
    modal.style.display = "none";
}
function alertboxmodalinit(msg, title, footer) {
    var alertboxtitle = document.getElementById("alertboxtitle");
    alertboxtitle.innerText = title;
    var alertboxmsg = document.getElementById("alertboxmsg");
    alertboxmsg.innerText = msg;
    var alertboxftr = document.getElementById("alertboxftr");
    alertboxftr.innerText = footer;

    ModalDlgState = -1;
    modal.style.display = "block";
}
var waitfunc = null;
var wait = function (condFunc, readyFunc, checkInterval) {
    var checkFunc = function () {
        if (condFunc()) {
            readyFunc();
        }
        else {
            waitfunc = setTimeout(checkFunc, checkInterval);
        }
    };
    checkFunc();
};
function alertboxmodal(msg, ttl, ftr, OKFunction, CancelFunction) {
    alertboxmodalinit(msg, ttl, ftr);
    wait(
        function () { return ((ModalDlgState >= 0) || (new Date().getSeconds() == 10)); },
        function () {
            clearTimeout(waitfunc);
            console.log("Done");
            if (ModalDlgState > 0) {
                if (typeof OKFunction != 'undefined') {
                    OKFunction();
                }
            }
            else {
                if (typeof CancelFunction != 'undefined') {
                    CancelFunction();
                }
            }
        },
        100
    );
    return ModalDlgState;
}
// #endregion

// #region Custom Delete Transaction
var rowToDelete = null;
function deleteTransaction() {
    var row = $(event.srcElement).closest("tr");
    var grid = $("#transactiongrid").data("kendoGrid");
    rowselected = row;
    grid.select(row);
    $("#transactiongrid").data("kendoGrid").removeRow(rowToDelete); // remove the row
}

function deleteTransactionconfirm(e) {

    var dataItem = $("#transactiongrid").data("kendoGrid").dataSource.get(e);
    rowToDelete = $("#transactiongrid").data("kendoGrid").tbody.find("tr[data-uid='" + dataItem.uid + "']");
    alertboxmodal("Are You Sure You Want to DELETE the Selected Transaction?"  //message
        , "DELETE the Transaction"  //title
        , "Equity Management"  //footer
        , deleteTransaction);    //callback function for OK
}
// #endregion
//////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////// Download Attachment File
//////////////////////////////////////////////////////////////////////////////////////////////////
function downloadFile(id) {
    debugger;
    var mypath='@Url.Action("GetFile", "Transaction")' + "?Id=" + id;
    window.location = mypath;
}
//////////////////////////////////////////////////////////////////////////////////////////////////
function onChangeNumericNegative() {
        debugger;
        var value = this.value();
        if (value > 0) {
            value = -1 * value;
            this._old = this._value;
            this._value = value;
            this._text.val(this._value);
            this.element.val(this._value);
            gridEdit.model.set(this.element[0].id, value);
        }
}

farzinmonsef commented 3 years ago

Setting Color Grid Selected Row

grid > table > tbody > tr.k-state-selected >td {

color:yellow;
background-color:blue;
text-decoration: underline;
text-decoration-color: red;

}

https://dojo.telerik.com/IFejITAV

change: function(e){
$("tr.k-state-selected").hover(function(){ $(this).find("td").css("color", "red") }) $("tr.k-state-selected").mouseleave(function(){ $(this).find("td").css("color", "black") }) },

grid > table > tbody > tr.k-state-selected > td:hover {

    color:red;

}

grid > table > tbody > tr.k-state-selected >td {

color:yellow;
background-color:blue;
text-decoration: underline;
text-decoration-color: red;

}

farzinmonsef commented 3 years ago

UploadFileData.cs

using System; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.IO; using System.Text; using System.Web;

namespace Data { public class UploadFileData { public char delimiterFile { get; set; } = '`'; //Method to put file into database from drive: public void databaseFilePut(string varFilePath, int LinkId, int Action, string tabelName, string dataFieldName, string fileFieldName, string idFieldName)//Action: (0=Add, 1=UPDATE) { byte[] file; var justFile = varFilePath.ToString().Split(delimiterFile); using (var stream = new FileStream(varFilePath, FileMode.Open, FileAccess.Read)) { using (var reader = new BinaryReader(stream)) { file = reader.ReadBytes((int)stream.Length); } } string connectionString = ConfigurationManager.ConnectionStrings["EQM"].ConnectionString; using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); if (Action == 0) {//ADD

                //string sql = "INSERT INTO [eqmuser].[Transaction] (Attachments, TransactionId, fileName) Values(@File, @TransactionId, @fileName)";
                string sql = "INSERT INTO " + tabelName + " (" + dataFieldName + ",  " + idFieldName + "," + fileFieldName + ") Values(@File, @TransactionId, @fileName)";
                using (SqlCommand command = new SqlCommand(sql, connection))
                {
                    command.Parameters.Add("@File", SqlDbType.VarBinary, file.Length).Value = file;
                    command.Parameters.Add("@TransactionId", SqlDbType.Int).Value = LinkId;
                    command.Parameters.Add("@fileName", SqlDbType.VarChar, justFile[1].Length).Value = justFile[1];
                    command.ExecuteNonQuery();
                }
            }
            else
            {//update
                //string sql = "Update [eqmuser].[Transaction] set Attachments=@File, fileName=@fileName Where Id=@TransactionId";
                string sql = "Update " + tabelName + " set " + dataFieldName + "=@File, " + fileFieldName + "=@fileName Where  " + idFieldName + "=@TransactionId";
                using (SqlCommand command = new SqlCommand(sql, connection))
                {
                    command.Parameters.Add("@File", SqlDbType.VarBinary, file.Length).Value = file;
                    command.Parameters.Add("@TransactionId", SqlDbType.Int).Value = LinkId;
                    command.Parameters.Add("@fileName", SqlDbType.VarChar, justFile[1].Length).Value = justFile[1];
                    command.ExecuteNonQuery();
                }
            }
        }
    }
    //This method is to get file from database and save it on drive:
    public void databaseFileRead(string varID, string varPathToNewLocation, string tabelName, string dataFieldName, string idFieldName)
    {

        string connectionString = ConfigurationManager.ConnectionStrings["EQM"].ConnectionString;
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();
            //string sql = @"SELECT [Attachments] FROM [EQMUser].[Transaction] WHERE [AttachmentId] = @varID";
            string sql = @"SELECT " + dataFieldName + " FROM " + tabelName + " WHERE " + idFieldName + " = @varID";
            using (SqlCommand sqlQuery = new SqlCommand(sql, connection))
            {
                sqlQuery.Parameters.AddWithValue("@varID", varID);
                using (var sqlQueryResult = sqlQuery.ExecuteReader())
                    if (sqlQueryResult != null)
                    {
                        sqlQueryResult.Read();
                        var blob = new Byte[(sqlQueryResult.GetBytes(0, 0, null, 0, int.MaxValue))];
                        sqlQueryResult.GetBytes(0, 0, blob, 0, blob.Length);
                        using (var fs = new FileStream(varPathToNewLocation, FileMode.Create, FileAccess.Write))
                            fs.Write(blob, 0, blob.Length);
                    }
            }
        }
    }
    //This method is to get file from database and put it as MemoryStream
    //public MemoryStream databaseFileReadArray(string varID, string tabelName, string dataFieldName, string idFieldName)
    public byte[] databaseFileReadArray(string varID, string tabelName, string dataFieldName, string idFieldName)
    {

        MemoryStream memoryStream = new MemoryStream();

        //string result = "";
        byte[] blob = new byte[] { };
        try
        {
            string connectionString = ConfigurationManager.ConnectionStrings["EQM"].ConnectionString;
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();
                //string sql = @"SELECT [Attachments] FROM [EQMUser].[Transaction] WHERE [AttachmentId] = @varID";
                string sql = @"SELECT " + dataFieldName + " FROM " + tabelName + " WHERE " + idFieldName + " = @varID";
                using (SqlCommand sqlQuery = new SqlCommand(sql, connection))
                {
                    sqlQuery.Parameters.AddWithValue("@varID", varID);
                    using (var sqlQueryResult = sqlQuery.ExecuteReader())
                        if (sqlQueryResult != null)
                        {
                            sqlQueryResult.Read();
                            blob = new Byte[(sqlQueryResult.GetBytes(0, 0, null, 0, int.MaxValue))];
                            sqlQueryResult.GetBytes(0, 0, blob, 0, blob.Length);
                            //using (var fs = new MemoryStream(memoryStream, FileMode.Create, FileAccess.Write)) {
                            //memoryStream.Write(blob, 0, blob.Length);
                            //}

                            //result = Encoding.UTF8.GetString(blob, 0, blob.Length);
                        }
                }
                //return memoryStream;
                //string result = memoryStream.ReadToEnd();
            }
        }
        catch (Exception ex)
        {
            //result = "ERROR: " + ex.ToString();
            //throw ex;
        }
        return blob;
    }
    //This method is to put MemoryStream into database:
    public int databaseFilePut(MemoryStream fileToPut, string tabelName, string dataFieldName, string idFieldName)
    {
        int varID = 0;
        byte[] file = fileToPut.ToArray();
        string preparedCommand =
               "INSERT INTO " + tabelName + " (" + dataFieldName + ") VALUES (@File) "
               + " SELECT " + idFieldName + " FROM " + tabelName + " WHERE " + idFieldName + " = SCOPE_IDENTITY()";
        //@"INSERT INTO [EQMUser].[Transaction] ([Attachments]) VALUES (@File)
        // SELECT [AttachmentId] FROM [EQMUser].[Transaction] WHERE [AttachmentId] = SCOPE_IDENTITY()";
        string connectionString = ConfigurationManager.ConnectionStrings["EQM"].ConnectionString;
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();
            using (SqlCommand sqlWrite = new SqlCommand(preparedCommand, connection))
            {
                sqlWrite.Parameters.Add("@File", SqlDbType.VarBinary, file.Length).Value = file;

                using (var sqlWriteQuery = sqlWrite.ExecuteReader())
                    while (sqlWriteQuery != null && sqlWriteQuery.Read())
                    {
                        varID = sqlWriteQuery["AttachmentId"] is int ? (int)sqlWriteQuery["AttachmentId"] : 0;
                    }
            }
            return varID;
        }

    }
}

}

farzinmonsef commented 3 years ago

TransUploadController.cs

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc;

using System.IO; using EQM.Helper;

namespace EQM.Controllers { public class TransUploadController : BaseController { [OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")] [HttpPost] public void setFilePrefix(string id) { Tools.filePrefix = Convert.ToString(id) + Tools.delimiterFile; Session["UplodedFile"] = ""; }

    public ActionResult Async()
    {
        return View();
    }

    public ActionResult Async_Save(IEnumerable<HttpPostedFileBase> files)
    {
        if (files != null)
        {
            foreach (var file in files)
            {
                var fileName = Path.GetFileName(file.FileName);
                var physicalPath = Path.Combine(Server.MapPath("~/App_Data"), Tools.filePrefix + fileName);

                if (System.IO.File.Exists(physicalPath)) {
                    System.IO.File.Delete(physicalPath);
                }
                file.SaveAs(physicalPath);
                Session["UplodedFile"] = fileName;
                //fileDB.databaseFilePut(physicalPath, 3, 1);
            }
        }
        return Content("");
    }

    public ActionResult Async_Remove(string[] fileNames)
    {
        if (fileNames != null)
        {
            foreach (var fullName in fileNames)
            {
                var fileName = Path.GetFileName(fullName);
                var physicalPath = Path.Combine(Server.MapPath("~/App_Data"), Tools.filePrefix + fileName);
                if (System.IO.File.Exists(physicalPath))
                {
                    System.IO.File.Delete(physicalPath);
                }
                Session["UplodedFile"] = "";
            }
        }
        return Content("");
    }
}

}

farzinmonsef commented 3 years ago

BusUploadFile.cs

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Data; using Entitites; using EQM.Enumerations;

namespace Business { public class BusUploadFile { ///

/// Gets all Transactions if the user is an Administrator.
/// Otherwise, filter the category by their role. ///
/// Transaction Entities public void databaseFilePut(string varFilePath, int LinkId, int Action, string tabelName, string dataFieldName, string fileFieldName, string idFieldName)//Action: (0=Add, 1=UPDATE) { UploadFileData uploadFileData = new UploadFileData(); uploadFileData.databaseFilePut(varFilePath, LinkId, Action, tabelName, dataFieldName, fileFieldName, idFieldName);//Action: (0=Add, 1=UPDATE) } public void databaseFileRead(string varID, string varPathToNewLocation, string tabelName, string dataFieldName, string idFieldName) { UploadFileData uploadFileData = new UploadFileData(); uploadFileData.databaseFileRead(varID, varPathToNewLocation, tabelName, dataFieldName, idFieldName); //(string varID, string tabelName, string dataFieldName, string idFieldName) } } }