public override Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
        {
            if (!isVisible)
            {
                output.SuppressOutput();
                return(Task.CompletedTask);
            }
            #region << Init >>
            var initSuccess = InitField(context, output);

            if (!initSuccess)
            {
                return(Task.CompletedTask);
            }

            if (Value == "")
            {
                Value = null;
            }

            if (Value != null && !(Value is List <EntityRecord>))
            {
                output.Content.AppendHtml("<div class='go-red'>'value' property should be 'List&lt;EntityRecord>'");
                return(Task.CompletedTask);
            }

            if (Value != null && Value is List <EntityRecord> )
            {
                var valueRecords = (List <EntityRecord>)Value;
                foreach (var file in valueRecords)
                {
                    if (!file.Properties.ContainsKey(PathFieldName))
                    {
                        output.Content.AppendHtml($"<div class='go-red'>{PathFieldName} property is missing in value (List<EntityRecord>)");
                        return(Task.CompletedTask);
                    }

                    var fileId = (Guid)file["id"];
                    RelatedFileIds.Add(fileId);
                    var fileRecord = new EntityRecord();
                    fileRecord["id"] = fileId;
                    var fileUrl = (string)file[PathFieldName];
                    if (fileUrl.StartsWith("/fs"))
                    {
                        fileUrl = fileUrl.Substring(3);
                    }
                    fileRecord["path"]       = fileUrl;
                    fileRecord["icon_class"] = new RenderService().GetPathTypeIcon(fileUrl);
                    fileRecord["name"]       = Path.GetFileName(fileUrl);
                    fileRecord["size"]       = (decimal)0;
                    if (!string.IsNullOrWhiteSpace(SizeFieldName) && file.Properties.ContainsKey(SizeFieldName))
                    {
                        fileRecord["size"] = (decimal)file[SizeFieldName];
                    }

                    FileRecords.Add(fileRecord);
                }
            }

            #endregion

            #region << Render >>
            if (Mode == FieldRenderMode.Form)
            {
                if (Access == FieldAccess.Full || Access == FieldAccess.FullAndCreate)
                {
                    #region << Hidden input for posting >>
                    output.Content.AppendHtml($"<input type='hidden' id='input-{FieldId}' name='{Name}' value='{String.Join(',', RelatedFileIds)}' data-entity-name='{FileEntityName}' data-path-field-name='{PathFieldName}'/>");
                    #endregion

                    #region << fake upload >>
                    var inputGroupEl = new TagBuilder("div");
                    inputGroupEl.AddCssClass("input-group erp-file-multiple-input");

                    var fakeInputEl         = new TagBuilder("div");
                    var inputElCssClassList = new List <string>();
                    inputElCssClassList.Add("form-control erp-file with-progress");
                    fakeInputEl.Attributes.Add("id", $"fake-{FieldId}");

                    if (ValidationErrors.Count > 0)
                    {
                        inputElCssClassList.Add("is-invalid");
                    }
                    fakeInputEl.Attributes.Add("class", String.Join(' ', inputElCssClassList));

                    var fakeInputProgress = new TagBuilder("div");
                    fakeInputProgress.AddCssClass("form-control-progress");
                    fakeInputEl.InnerHtml.AppendHtml(fakeInputProgress);

                    inputGroupEl.InnerHtml.AppendHtml(fakeInputEl);

                    var appendEl = new TagBuilder("span");
                    appendEl.AddCssClass("input-group-append action erp-file");
                    var selectFileLink = new TagBuilder("button");
                    selectFileLink.Attributes.Add("type", $"button");
                    selectFileLink.AddCssClass("btn btn-white");
                    selectFileLink.Attributes.Add("onclick", $"document.getElementById('file-{FieldId}').click();");
                    selectFileLink.InnerHtml.AppendHtml("browse");
                    appendEl.InnerHtml.AppendHtml(selectFileLink);
                    inputGroupEl.InnerHtml.AppendHtml(appendEl);
                    output.Content.AppendHtml(inputGroupEl);

                    var realHiddenFileInput = new TagBuilder("input");
                    realHiddenFileInput.Attributes.Add("id", $"file-{FieldId}");
                    realHiddenFileInput.Attributes.Add("type", $"file");
                    realHiddenFileInput.Attributes.Add("multiple", $"true");
                    realHiddenFileInput.AddCssClass("d-none");
                    realHiddenFileInput.Attributes.Add("value", $"");
                    if (!String.IsNullOrWhiteSpace(Accept))
                    {
                        realHiddenFileInput.Attributes.Add("accept", $"{Accept}");
                    }
                    output.Content.AppendHtml(realHiddenFileInput);

                    #endregion

                    #region << Files list element >>

                    var filesListEl = new TagBuilder("div");
                    filesListEl.AddCssClass("form-control erp-file-multiple-list form");
                    filesListEl.Attributes.Add("id", $"fake-list-{FieldId}");

                    if (FileRecords.Count == 0)
                    {
                        filesListEl.AddCssClass("d-none");
                    }


                    //Generate the files list
                    foreach (var file in FileRecords)
                    {
                        var fileRow = new TagBuilder("div");
                        fileRow.AddCssClass("filerow");
                        fileRow.Attributes.Add("data-file-id", ((Guid)file["id"]).ToString());
                        //Append icon
                        fileRow.InnerHtml.AppendHtml($"<div class='icon'><i class='fa {(string)file["icon_class"]}'></i></div>");

                        //Append meta
                        var rowMeta = new TagBuilder("div");
                        rowMeta.AddCssClass("meta");

                        //Append file
                        rowMeta.InnerHtml.AppendHtml($"<a class='link' href='/fs{(string)file["path"]}' target='_blank' title='/fs{(string)file["path"]}'>{(string)file["name"]}<em></em></a>");
                        //Append size
                        var sizeString = "";
                        var sizeKBInt  = (int)((decimal)file["size"]);                        //size is in KB
                        if (sizeKBInt < 1024)
                        {
                            sizeString = sizeKBInt + " KB";
                        }
                        else if (sizeKBInt >= 1024 && sizeKBInt < Math.Pow(1024, 2))
                        {
                            sizeString = Math.Round((decimal)(sizeKBInt / 1024), 1) + " MB";
                        }
                        else
                        {
                            sizeString = Math.Round((decimal)(sizeKBInt / Math.Pow(1024, 2)), 1) + " GB";
                        }

                        rowMeta.InnerHtml.AppendHtml($"<div class='size'>{sizeString}</div>");

                        fileRow.InnerHtml.AppendHtml(rowMeta);

                        //Action
                        var rowAction = new TagBuilder("div");
                        rowAction.AddCssClass("action remove");
                        rowAction.InnerHtml.AppendHtml($"<a class='link' href='#'><i class='fa fa-times-circle'></i></a>");
                        //rowAction.InnerHtml.AppendHtml($"<span class='progress d-none'>0%</span>");
                        //rowAction.InnerHtml.AppendHtml($"<span class='error go-red d-none'><i class='fas fa-exclamation-circle'></i></span>");

                        fileRow.InnerHtml.AppendHtml(rowAction);
                        filesListEl.InnerHtml.AppendHtml(fileRow);
                    }

                    output.Content.AppendHtml(filesListEl);

                    #endregion


                    var jsCompressor = new JavaScriptCompressor();

                    #region << Init Scripts >>
                    var tagHelperInitialized = false;
                    var fileName             = "form";
                    if (ViewContext.HttpContext.Items.ContainsKey(typeof(WvFieldUserFileMultiple) + fileName))
                    {
                        var tagHelperContext = (WvTagHelperContext)ViewContext.HttpContext.Items[typeof(WvFieldUserFileMultiple) + fileName];
                        tagHelperInitialized = tagHelperContext.Initialized;
                    }
                    if (!tagHelperInitialized)
                    {
                        var scriptContent = FileService.GetEmbeddedTextResource("form.js", "WebVella.Erp.Web.TagHelpers.WvFieldUserFileMultiple");
                        var scriptEl      = new TagBuilder("script");
                        scriptEl.Attributes.Add("type", "text/javascript");
                        //scriptEl.InnerHtml.AppendHtml(scriptContent);
                        scriptEl.InnerHtml.AppendHtml(jsCompressor.Compress(scriptContent));
                        output.PostContent.AppendHtml(scriptEl);

                        ViewContext.HttpContext.Items[typeof(WvFieldUserFileMultiple) + fileName] = new WvTagHelperContext()
                        {
                            Initialized = true
                        };
                    }
                    #endregion

                    #region << Add Inline Init Script for this instance >>
                    var initScript = new TagBuilder("script");
                    initScript.Attributes.Add("type", "text/javascript");
                    var scriptTemplate = @"
						$(function(){
							FieldUserMultiFileFormInit(""{{FieldId}}"",{{ConfigJson}});
						});"                        ;
                    scriptTemplate = scriptTemplate.Replace("{{FieldId}}", (FieldId ?? null).ToString());

                    var fieldConfig = new WvFieldFileConfig()
                    {
                        ApiUrl       = ApiUrl,
                        CanAddValues = Access == FieldAccess.FullAndCreate ? true : false,
                        Accept       = Accept
                    };

                    scriptTemplate = scriptTemplate.Replace("{{ConfigJson}}", JsonConvert.SerializeObject(fieldConfig));

                    initScript.InnerHtml.AppendHtml(jsCompressor.Compress(scriptTemplate));

                    output.PostContent.AppendHtml(initScript);
                    #endregion
                }
                else if (Access == FieldAccess.ReadOnly)
                {
                    //if (!String.IsNullOrWhiteSpace(Value))
                    //{
                    //	var inputGroupEl = new TagBuilder("div");
                    //	inputGroupEl.AddCssClass("input-group");
                    //	var prependEl = new TagBuilder("span");
                    //	prependEl.AddCssClass($"input-group-prepend icon-addon {(String.IsNullOrWhiteSpace(Value) ? "d-none" : "")} {(ValidationErrors.Count > 0 ? "is-invalid" : "")}");
                    //	prependEl.Attributes.Add("title", $"/fs{Value}");
                    //	var prependText = new TagBuilder("span");
                    //	prependText.AddCssClass("input-group-text");
                    //	var prependIcon = new TagBuilder("span");
                    //	prependIcon.AddCssClass($"fa fa-fw type-icon {PathTypeIcon}");
                    //	prependText.InnerHtml.AppendHtml(prependIcon);
                    //	prependEl.InnerHtml.AppendHtml(prependText);
                    //	inputGroupEl.InnerHtml.AppendHtml(prependEl);

                    //	var inputEl = new TagBuilder("div");
                    //	inputEl.AddCssClass("form-control erp-file disabled");
                    //	var inputElLink = new TagBuilder("a");
                    //	inputElLink.Attributes.Add("href", $"/fs{Value}");
                    //	inputElLink.Attributes.Add("target", "_blank");
                    //	inputElLink.Attributes.Add("title", $"/fs{Value}");
                    //	inputElLink.InnerHtml.Append(FileName);
                    //	inputEl.InnerHtml.AppendHtml(inputElLink);
                    //	inputGroupEl.InnerHtml.AppendHtml(inputEl);
                    //	output.Content.AppendHtml(inputGroupEl);

                    //	//Hidden input with the value
                    //	var hiddenInput = new TagBuilder("input");
                    //	hiddenInput.Attributes.Add("type", "hidden");
                    //	hiddenInput.Attributes.Add("id", $"input-{FieldId}");
                    //	hiddenInput.Attributes.Add("name", Name);
                    //	hiddenInput.Attributes.Add("value", (Value ?? "").ToString());
                    //	output.Content.AppendHtml(hiddenInput);
                    //}
                    //else {
                    //	var inputEl = new TagBuilder("input");
                    //	inputEl.Attributes.Add("readonly", null);
                    //	inputEl.AddCssClass("form-control erp-file");
                    //	inputEl.Attributes.Add("value","");
                    //	inputEl.Attributes.Add("name", Name);
                    //	output.Content.AppendHtml(inputEl);
                    //}
                }
            }
            else if (Mode == FieldRenderMode.Display)
            {
                output.Content.AppendHtml("Not implemented yet");
                //if (!String.IsNullOrWhiteSpace(Value))
                //{
                //	var divEl = new TagBuilder("div");
                //	divEl.Attributes.Add("id", $"input-{FieldId}");
                //	divEl.AddCssClass("form-control-plaintext erp-file");
                //	var iconEl = new TagBuilder("span");
                //	iconEl.AddCssClass($"fa fa-fw {PathTypeIcon}");
                //	divEl.InnerHtml.AppendHtml(iconEl);
                //	var linkEl = new TagBuilder("a");
                //	linkEl.Attributes.Add("href", $"/fs{Value}");
                //	linkEl.Attributes.Add("target", $"_blank");
                //	linkEl.InnerHtml.Append(FileName);
                //	divEl.InnerHtml.AppendHtml(linkEl);
                //	output.Content.AppendHtml(divEl);
                //}
                //else
                //{
                //	output.Content.AppendHtml(EmptyValEl);
                //}
            }
            else if (Mode == FieldRenderMode.Simple)
            {
                output.Content.AppendHtml("Not implemented yet");
                //output.SuppressOutput();
                //var linkEl = new TagBuilder("a");
                //linkEl.Attributes.Add("href", $"/fs{Value}");
                //linkEl.Attributes.Add("target", $"_blank");
                //linkEl.InnerHtml.Append(FileName);
                //output.Content.AppendHtml(linkEl);
                //return Task.CompletedTask;
            }
            else if (Mode == FieldRenderMode.InlineEdit)
            {
                output.Content.AppendHtml("Not implemented yet");
                //if (Access == FieldAccess.Full || Access == FieldAccess.FullAndCreate)
                //{
                //	#region << View Wrapper >>
                //	{
                //		var viewWrapperEl = new TagBuilder("div");
                //		viewWrapperEl.AddCssClass("input-group view-wrapper");
                //		viewWrapperEl.Attributes.Add("title", "double click to edit");
                //		viewWrapperEl.Attributes.Add("id", $"view-{FieldId}");

                //		var viewInputPrepend = new TagBuilder("span");
                //		viewInputPrepend.AddCssClass($"input-group-prepend icon-addon {(String.IsNullOrWhiteSpace(Value) ? "d-none" : "")}");
                //		viewInputPrepend.Attributes.Add("title", $"/fs{Value}");
                //		var viewInputPrependText = new TagBuilder("span");
                //		viewInputPrependText.AddCssClass("input-group-text");
                //		var prependIcon = new TagBuilder("span");
                //		prependIcon.AddCssClass($"fa fa-fw type-icon {PathTypeIcon}");
                //		viewInputPrependText.InnerHtml.AppendHtml(prependIcon);
                //		viewInputPrepend.InnerHtml.AppendHtml(viewInputPrependText);
                //		viewWrapperEl.InnerHtml.AppendHtml(viewInputPrepend);

                //		var viewFormControlEl = new TagBuilder("div");
                //		viewFormControlEl.AddCssClass("form-control erp-file");

                //		var viewFormControlLinkEl = new TagBuilder("a");
                //		viewFormControlLinkEl.Attributes.Add("href", $"/fs{Value}");
                //		viewFormControlLinkEl.Attributes.Add("target", "_blank");
                //		viewFormControlLinkEl.Attributes.Add("title", $"/fs{Value}");
                //		viewFormControlLinkEl.InnerHtml.Append(FileName);
                //		viewFormControlEl.InnerHtml.AppendHtml(viewFormControlLinkEl);

                //		viewWrapperEl.InnerHtml.AppendHtml(viewFormControlEl);

                //		var viewInputActionEl = new TagBuilder("span");
                //		viewInputActionEl.AddCssClass("input-group-append action");
                //		viewInputActionEl.Attributes.Add("title", "edit");

                //		var viewInputActionLinkEl = new TagBuilder("button");
                //		viewInputActionLinkEl.Attributes.Add("type", "button");
                //		viewInputActionLinkEl.AddCssClass("btn btn-white");

                //		var viewInputActionIconEl = new TagBuilder("span");
                //		viewInputActionIconEl.AddCssClass("fa fa-fw fa-pencil-alt");
                //		viewInputActionLinkEl.InnerHtml.AppendHtml(viewInputActionIconEl);
                //		viewInputActionEl.InnerHtml.AppendHtml(viewInputActionLinkEl);
                //		viewWrapperEl.InnerHtml.AppendHtml(viewInputActionEl);

                //		output.Content.AppendHtml(viewWrapperEl);
                //	}
                //	#endregion

                //	#region << Edit Wrapper>>
                //	{
                //		var editWrapperEl = new TagBuilder("div");
                //		editWrapperEl.Attributes.Add("id", $"edit-{FieldId}");
                //		editWrapperEl.Attributes.Add("style", $"display:none;");
                //		editWrapperEl.AddCssClass("edit-wrapper");

                //		var editInputGroupEl = new TagBuilder("div");
                //		editInputGroupEl.AddCssClass("input-group");

                //		var editWrapperPrependEl = new TagBuilder("span");
                //		editWrapperPrependEl.AddCssClass($"input-group-prepend icon-addon {(String.IsNullOrWhiteSpace(Value) ? "d-none" : "")} {(ValidationErrors.Count > 0 ? "is-invalid" : "")}");
                //		editWrapperPrependEl.Attributes.Add("title", $"/fs{Value}");
                //		var editWrapperPrependText = new TagBuilder("span");
                //		editWrapperPrependText.AddCssClass("input-group-text");
                //		var editWrapperPrependIcon = new TagBuilder("span");
                //		editWrapperPrependIcon.AddCssClass($"fa fa-fw type-icon {PathTypeIcon}");
                //		editWrapperPrependText.InnerHtml.AppendHtml(editWrapperPrependIcon);
                //		editWrapperPrependEl.InnerHtml.AppendHtml(editWrapperPrependText);
                //		editInputGroupEl.InnerHtml.AppendHtml(editWrapperPrependEl);


                //		var fakeInputEl = new TagBuilder("div");
                //		var inputElCssClassList = new List<string>();
                //		inputElCssClassList.Add("form-control erp-file with-progress ");

                //		fakeInputEl.Attributes.Add("id", $"fake-{FieldId}");

                //		if (ValidationErrors.Count > 0)
                //		{
                //			inputElCssClassList.Add("is-invalid");
                //		}

                //		fakeInputEl.Attributes.Add("class", String.Join(' ', inputElCssClassList));

                //		var fakeInputFileLinkEl = new TagBuilder("a");
                //		fakeInputFileLinkEl.Attributes.Add("href", $"/fs{Value}");
                //		fakeInputFileLinkEl.Attributes.Add("target", "_blank");
                //		fakeInputFileLinkEl.Attributes.Add("title", $"/fs{Value}");
                //		fakeInputFileLinkEl.InnerHtml.Append(FileName);
                //		fakeInputEl.InnerHtml.AppendHtml(fakeInputFileLinkEl);
                //		var fakeInputProgress = new TagBuilder("div");
                //		fakeInputProgress.AddCssClass("form-control-progress");
                //		fakeInputEl.InnerHtml.AppendHtml(fakeInputProgress);
                //		editInputGroupEl.InnerHtml.AppendHtml(fakeInputEl);


                //		var editInputGroupAppendEl = new TagBuilder("span");
                //		editInputGroupAppendEl.AddCssClass("input-group-append");

                //		if (!Required)
                //		{
                //			var appendDeleteLink = new TagBuilder("button");
                //			appendDeleteLink.Attributes.Add("type", $"button");
                //			appendDeleteLink.Attributes.Add("id", $"remove-{FieldId}");
                //			appendDeleteLink.AddCssClass($"btn btn-white remove {(String.IsNullOrWhiteSpace(Value) ? "d-none" : "")}");
                //			appendDeleteLink.Attributes.Add("title", "select as undefined");
                //			var appendDeleteLinkIcon = new TagBuilder("span");
                //			appendDeleteLinkIcon.AddCssClass("fa fa-fw fa-trash go-red");
                //			appendDeleteLink.InnerHtml.AppendHtml(appendDeleteLinkIcon);
                //			editInputGroupAppendEl.InnerHtml.AppendHtml(appendDeleteLink);
                //		}

                //		var selectFileLink = new TagBuilder("button");
                //		selectFileLink.Attributes.Add("type", $"button");
                //		selectFileLink.AddCssClass("btn btn-white");
                //		selectFileLink.Attributes.Add("onclick", $"document.getElementById('file-{FieldId}').click();");
                //		selectFileLink.InnerHtml.AppendHtml("select");
                //		editInputGroupAppendEl.InnerHtml.AppendHtml(selectFileLink);


                //		var editSaveBtnEl = new TagBuilder("button");
                //		editSaveBtnEl.Attributes.Add("type", "submit");
                //		editSaveBtnEl.AddCssClass("btn btn-white save");
                //		editSaveBtnEl.Attributes.Add("title", "save");

                //		var editSaveIconEl = new TagBuilder("span");
                //		editSaveIconEl.AddCssClass("fa fa-fw fa-check go-green");
                //		editSaveBtnEl.InnerHtml.AppendHtml(editSaveIconEl);
                //		editInputGroupAppendEl.InnerHtml.AppendHtml(editSaveBtnEl);

                //		var editCancelBtnEl = new TagBuilder("button");
                //		editCancelBtnEl.Attributes.Add("type", "submit");
                //		editCancelBtnEl.AddCssClass("btn btn-white cancel");
                //		editCancelBtnEl.Attributes.Add("title", "cancel");

                //		var editCancelIconEl = new TagBuilder("span");
                //		editCancelIconEl.AddCssClass("fa fa-fw fa-times go-gray");
                //		editCancelBtnEl.InnerHtml.AppendHtml(editCancelIconEl);
                //		editInputGroupAppendEl.InnerHtml.AppendHtml(editCancelBtnEl);

                //		editInputGroupEl.InnerHtml.AppendHtml(editInputGroupAppendEl);
                //		editWrapperEl.InnerHtml.AppendHtml(editInputGroupEl);

                //		output.Content.AppendHtml(editWrapperEl);

                //		var realHiddenFileInput = new TagBuilder("input");
                //		realHiddenFileInput.Attributes.Add("id", $"file-{FieldId}");
                //		realHiddenFileInput.Attributes.Add("type", $"file");
                //		realHiddenFileInput.AddCssClass("d-none");
                //		realHiddenFileInput.Attributes.Add("value", $"");
                //		if (!String.IsNullOrWhiteSpace(Accept))
                //		{
                //			realHiddenFileInput.Attributes.Add("accept", $"{Accept}");
                //		}
                //		output.Content.AppendHtml(realHiddenFileInput);

                //		var realSubmitInput = new TagBuilder("input");
                //		realSubmitInput.Attributes.Add("id", $"input-{FieldId}");
                //		realSubmitInput.Attributes.Add("type", $"hidden");
                //		realSubmitInput.Attributes.Add("value", $"{Value}");
                //		realSubmitInput.Attributes.Add("data-newfilepath", $"{Value}");
                //		realSubmitInput.Attributes.Add("data-filename", $"{FileName}");
                //		realSubmitInput.Attributes.Add("data-newfilename", $"{FileName}");
                //		output.Content.AppendHtml(realSubmitInput);

                //	}
                //	#endregion

                //	var jsCompressor = new JavaScriptCompressor();

                //	#region << Init Scripts >>
                //	var tagHelperInitialized = false;
                //	if (ViewContext.HttpContext.Items.ContainsKey(typeof(WvFieldFile) + "-inline-edit"))
                //	{
                //		var tagHelperContext = (WvTagHelperContext)ViewContext.HttpContext.Items[typeof(WvFieldFile) + "-inline-edit"];
                //		tagHelperInitialized = tagHelperContext.Initialized;
                //	}
                //	if (!tagHelperInitialized)
                //	{
                //		var scriptContent = FileService.GetEmbeddedTextResource("inline-edit.js", "WebVella.Erp.Web.TagHelpers.WvFieldFile");
                //		var scriptEl = new TagBuilder("script");
                //		scriptEl.Attributes.Add("type", "text/javascript");
                //		scriptEl.InnerHtml.AppendHtml(jsCompressor.Compress(scriptContent));
                //		output.PostContent.AppendHtml(scriptEl);

                //		ViewContext.HttpContext.Items[typeof(WvFieldFile) + "-inline-edit"] = new WvTagHelperContext()
                //		{
                //			Initialized = true
                //		};

                //	}
                //	#endregion

                //	#region << Add Inline Init Script for this instance >>
                //	var initScript = new TagBuilder("script");
                //	initScript.Attributes.Add("type", "text/javascript");
                //	var scriptTemplate = @"
                //		$(function(){
                //			FileInlineEditInit(""{{FieldId}}"",""{{Name}}"",""{{EntityName}}"",""{{RecordId}}"",{{ConfigJson}});
                //		});";
                //	scriptTemplate = scriptTemplate.Replace("{{FieldId}}", (FieldId ?? null).ToString());
                //	scriptTemplate = scriptTemplate.Replace("{{Name}}", Name);
                //	scriptTemplate = scriptTemplate.Replace("{{EntityName}}", EntityName);
                //	scriptTemplate = scriptTemplate.Replace("{{RecordId}}", (RecordId ?? null).ToString());

                //	var fieldConfig = new WvFieldFileConfig()
                //	{
                //		ApiUrl = ApiUrl,
                //		CanAddValues = Access == FieldAccess.FullAndCreate ? true : false,
                //		Accept = Accept
                //	};

                //	scriptTemplate = scriptTemplate.Replace("{{ConfigJson}}", JsonConvert.SerializeObject(fieldConfig));

                //	initScript.InnerHtml.AppendHtml(jsCompressor.Compress(scriptTemplate));

                //	output.PostContent.AppendHtml(initScript);
                //	#endregion
                //}
                //else if (Access == FieldAccess.ReadOnly)
                //{

                //	var divEl = new TagBuilder("div");
                //	divEl.AddCssClass("input-group");

                //	var prependEl = new TagBuilder("span");
                //	prependEl.AddCssClass($"input-group-prepend icon-addon {(String.IsNullOrWhiteSpace(Value) ? "d-none" : "")} {(ValidationErrors.Count > 0 ? "is-invalid" : "")}");
                //	prependEl.Attributes.Add("title", $"/fs{Value}");
                //	var prependText = new TagBuilder("span");
                //	prependText.AddCssClass("input-group-text");
                //	var prependIcon = new TagBuilder("span");
                //	prependIcon.AddCssClass($"fa fa-fw type-icon {PathTypeIcon}");
                //	prependText.InnerHtml.AppendHtml(prependIcon);
                //	prependEl.InnerHtml.AppendHtml(prependText);
                //	divEl.InnerHtml.AppendHtml(prependEl);

                //	var inputEl = new TagBuilder("div");
                //	inputEl.AddCssClass("form-control erp-file disabled");
                //	var inputElLink = new TagBuilder("a");
                //	inputElLink.Attributes.Add("href", $"/fs{Value}");
                //	inputElLink.Attributes.Add("target", "_blank");
                //	inputElLink.Attributes.Add("title", $"/fs{Value}");
                //	inputElLink.InnerHtml.Append(FileName);
                //	inputEl.InnerHtml.AppendHtml(inputElLink);
                //	divEl.InnerHtml.AppendHtml(inputEl);

                //	var appendActionSpan = new TagBuilder("span");
                //	appendActionSpan.AddCssClass("input-group-append");
                //	appendActionSpan.AddCssClass("action");

                //	var appendTextSpan = new TagBuilder("span");
                //	appendTextSpan.AddCssClass("input-group-text");

                //	var appendIconSpan = new TagBuilder("span");
                //	appendIconSpan.AddCssClass("fa fa-fw fa-lock");
                //	appendTextSpan.InnerHtml.AppendHtml(appendIconSpan);
                //	appendActionSpan.InnerHtml.AppendHtml(appendTextSpan);

                //	divEl.InnerHtml.AppendHtml(appendActionSpan);
                //	output.Content.AppendHtml(divEl);
                //}
            }
            #endregion


            //Finally
            if (SubInputEl != null)
            {
                output.PostContent.AppendHtml(SubInputEl);
            }

            return(Task.CompletedTask);
        }
示例#2
0
        public override Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
        {
            if (!isVisible)
            {
                output.SuppressOutput();
                return(Task.CompletedTask);
            }
            #region << Init >>
            var initSuccess = InitField(context, output);

            if (!initSuccess)
            {
                return(Task.CompletedTask);
            }

            if (Value == null)
            {
                Value = new List <dynamic>();
            }
            else if (Value is string)
            {
                var stringValue = (string)Value;
                if (String.IsNullOrWhiteSpace(stringValue))
                {
                    Value = new List <dynamic>();
                }
                else if (stringValue.Contains(","))
                {
                    var filePaths = stringValue.Split(",", StringSplitOptions.RemoveEmptyEntries).ToList();
                    Value = GetFileObjectsFromStringList(filePaths);
                }
                else
                {
                    var filePaths = new List <string> {
                        stringValue
                    };
                    Value = GetFileObjectsFromStringList(filePaths);
                }
            }

            else if (Value is List <string> )
            {
                var filePaths = (List <string>)Value;
                Value = GetFileObjectsFromStringList(filePaths);
            }
            else if (Value is List <object> )
            {
                var valueObjects = (List <object>)Value;
                var resultFiles  = new List <dynamic>();
                foreach (var fileObject in valueObjects)
                {
                    var      type          = fileObject.GetType();
                    var      filePath      = "";
                    var      fileSize      = 0;
                    var      fileIcon      = "";
                    var      fileName      = "";
                    DateTime?fileTimestamp = null;
                    var      fileAuthor    = "";

                    if (!String.IsNullOrWhiteSpace(PathPropName) && type.GetProperty(PathPropName) != null && type.GetProperty(PathPropName).GetValue(fileObject) != null)
                    {
                        var propValue = type.GetProperty(PathPropName).GetValue(fileObject);
                        if (propValue is string)
                        {
                            filePath = propValue.ToString();
                        }
                    }

                    if (!String.IsNullOrWhiteSpace(SizePropName) && type.GetProperty(SizePropName) != null && type.GetProperty(SizePropName).GetValue(fileObject) != null)
                    {
                        var propValue = type.GetProperty(SizePropName).GetValue(fileObject);
                        if (propValue is int || propValue is decimal || propValue is double)
                        {
                            fileSize = (int)propValue;
                        }
                    }

                    if (!String.IsNullOrWhiteSpace(IconPropName) && type.GetProperty(IconPropName) != null && type.GetProperty(IconPropName).GetValue(fileObject) != null)
                    {
                        var propValue = type.GetProperty(IconPropName).GetValue(fileObject);
                        if (propValue is string)
                        {
                            fileIcon = propValue.ToString();
                        }
                    }
                    if (!String.IsNullOrWhiteSpace(filePath) && String.IsNullOrWhiteSpace(fileIcon))
                    {
                        fileIcon = "fa " + WvHelpers.GetPathTypeIcon(filePath);
                    }

                    if (!String.IsNullOrWhiteSpace(NamePropName) && type.GetProperty(NamePropName) != null && type.GetProperty(NamePropName).GetValue(fileObject) != null)
                    {
                        var propValue = type.GetProperty(NamePropName).GetValue(fileObject);
                        if (propValue is string)
                        {
                            fileName = propValue.ToString();
                        }
                    }
                    if (!String.IsNullOrWhiteSpace(filePath) && String.IsNullOrWhiteSpace(fileName))
                    {
                        fileName = WvHelpers.GetFileNameFromPath(filePath);
                    }

                    if (!String.IsNullOrWhiteSpace(TimestampPropName) && type.GetProperty(TimestampPropName) != null && type.GetProperty(TimestampPropName).GetValue(fileObject) != null)
                    {
                        var propValue = type.GetProperty(TimestampPropName).GetValue(fileObject);
                        if (propValue is DateTime)
                        {
                            fileTimestamp = (DateTime)propValue;
                        }
                    }

                    if (!String.IsNullOrWhiteSpace(AuthorPropName) && type.GetProperty(AuthorPropName) != null && type.GetProperty(AuthorPropName).GetValue(fileObject) != null)
                    {
                        var propValue = type.GetProperty(AuthorPropName).GetValue(fileObject);
                        if (propValue is string)
                        {
                            fileAuthor = propValue.ToString();
                        }
                    }

                    dynamic file = new
                    {
                        path      = filePath,
                        size      = fileSize,
                        name      = fileName,
                        icon      = fileIcon,
                        timestamp = fileTimestamp,
                        author    = fileAuthor
                    };
                    resultFiles.Add(file);
                }
                Value = resultFiles;
            }
            else
            {
                output.Content.AppendHtml("<div class='go-red'>'value' property type is not supported</div>");
                return(Task.CompletedTask);
            }

            #endregion

            #region << Render >>
            var fileObjects = (List <dynamic>)Value;
            if (Mode == WvFieldRenderMode.Form)
            {
                if (Access == WvFieldAccess.Full || Access == WvFieldAccess.FullAndCreate)
                {
                    #region << Hidden input for posting >>
                    output.Content.AppendHtml($"<input type='hidden' id='input-{FieldId}' name='{Name}' value='{String.Join(',', fileObjects.Select(x => x.path).ToList())}'/>");
                    #endregion

                    #region << fake upload >>
                    var inputGroupEl = new TagBuilder("div");
                    inputGroupEl.AddCssClass("input-group erp-file-multiple-input");

                    var fakeInputEl         = new TagBuilder("div");
                    var inputElCssClassList = new List <string>();
                    inputElCssClassList.Add("form-control erp-file with-progress");
                    fakeInputEl.Attributes.Add("id", $"fake-{FieldId}");
                    fakeInputEl.Attributes.Add("style", "cursor:pointer");
                    inputElCssClassList.Add("go-gray");
                    fakeInputEl.InnerHtml.AppendHtml("Activate 'Paste Image' from clipboard");


                    if (ValidationErrors.Count > 0)
                    {
                        inputElCssClassList.Add("is-invalid");
                    }
                    fakeInputEl.Attributes.Add("class", String.Join(' ', inputElCssClassList));

                    var fakeInputProgress = new TagBuilder("div");
                    fakeInputProgress.AddCssClass("form-control-progress");
                    fakeInputEl.InnerHtml.AppendHtml(fakeInputProgress);

                    fakeInputEl.Attributes.Add("data-handler-prefix", GetHandlerPrefix);
                    fakeInputEl.Attributes.Add("data-file-upload-api", FileUploadApi);
                    fakeInputEl.Attributes.Add("data-path-name", PathPropName);
                    fakeInputEl.Attributes.Add("data-size-name", SizePropName);
                    fakeInputEl.Attributes.Add("data-name-name", NamePropName);
                    fakeInputEl.Attributes.Add("data-icon-name", IconPropName);
                    fakeInputEl.Attributes.Add("data-timestamp-name", TimestampPropName);
                    fakeInputEl.Attributes.Add("data-author-name", AuthorPropName);
                    fakeInputEl.Attributes.Add("data-field-id", (FieldId != null ? FieldId.Value.ToString() : ""));


                    inputGroupEl.InnerHtml.AppendHtml(fakeInputEl);

                    var appendEl = new TagBuilder("span");
                    appendEl.AddCssClass("input-group-append action erp-file");
                    var selectFileLink = new TagBuilder("button");
                    selectFileLink.Attributes.Add("type", $"button");
                    selectFileLink.AddCssClass("btn btn-white");
                    selectFileLink.Attributes.Add("onclick", $"window.document.getElementById('file-{FieldId}').click();");
                    selectFileLink.InnerHtml.AppendHtml("browse");
                    appendEl.InnerHtml.AppendHtml(selectFileLink);
                    inputGroupEl.InnerHtml.AppendHtml(appendEl);
                    output.Content.AppendHtml(inputGroupEl);

                    var realHiddenFileInput = new TagBuilder("input");
                    realHiddenFileInput.Attributes.Add("id", $"file-{FieldId}");
                    realHiddenFileInput.Attributes.Add("type", $"file");
                    realHiddenFileInput.Attributes.Add("multiple", $"true");
                    realHiddenFileInput.AddCssClass("d-none");
                    realHiddenFileInput.Attributes.Add("value", $"");
                    if (!String.IsNullOrWhiteSpace(Accept))
                    {
                        realHiddenFileInput.Attributes.Add("accept", $"{Accept}");
                    }
                    output.Content.AppendHtml(realHiddenFileInput);

                    #endregion

                    #region << Files list element >>

                    var filesListEl = new TagBuilder("div");
                    filesListEl.AddCssClass("form-control erp-file-multiple-list form");
                    filesListEl.Attributes.Add("id", $"fake-list-{FieldId}");

                    if (fileObjects.Count == 0)
                    {
                        filesListEl.AddCssClass("d-none");
                    }


                    //Generate the files list
                    foreach (var fileObject in fileObjects)
                    {
                        var fileRow = new TagBuilder("div");
                        fileRow.AddCssClass("filerow");
                        fileRow.Attributes.Add("data-file-path", fileObject.path);
                        fileRow.Attributes.Add("data-field-id", (FieldId != null ? FieldId.Value.ToString() : ""));

                        //Append icon
                        fileRow.InnerHtml.AppendHtml($"<div class='icon'><i class='fa {fileObject.icon}'></i></div>");

                        //Append meta
                        var rowMeta = new TagBuilder("div");
                        rowMeta.AddCssClass("meta");

                        //Append file
                        rowMeta.InnerHtml.AppendHtml($"<a class='link' href='{GetHandlerPrefix}{fileObject.path}' target='_blank' title='{GetHandlerPrefix}{fileObject.path}'>{fileObject.name}<em></em></a>");

                        if (((int)fileObject.size) > 0 || ((DateTime?)fileObject.timestamp) != null || String.IsNullOrWhiteSpace((string)fileObject.author))
                        {
                            var fileRowMetaDetailsEl = new TagBuilder("div");
                            fileRowMetaDetailsEl.AddCssClass("details");

                            if (((int)fileObject.size) > 0)
                            {
                                var sizeString = WvHelpers.GetSizeStringFromSize((int)fileObject.size);
                                fileRowMetaDetailsEl.InnerHtml.AppendHtml($"<span class='size'>{sizeString}</span>");
                            }
                            if (((DateTime?)fileObject.timestamp) != null)
                            {
                                var timestampString = ((DateTime)fileObject.timestamp).ToString("dd MMM yyyy HH:mm", Culture);
                                fileRowMetaDetailsEl.InnerHtml.AppendHtml($"<span class='timestamp'>{timestampString}</span>");
                            }
                            if (!String.IsNullOrWhiteSpace((string)fileObject.author))
                            {
                                fileRowMetaDetailsEl.InnerHtml.AppendHtml($"<span class='author'>{(string)fileObject.author}</span>");
                            }

                            rowMeta.InnerHtml.AppendHtml(fileRowMetaDetailsEl);
                        }

                        fileRow.InnerHtml.AppendHtml(rowMeta);

                        //Action
                        var rowAction = new TagBuilder("div");
                        rowAction.AddCssClass("action remove");
                        rowAction.InnerHtml.AppendHtml($"<a class='link' href='#'><i class='fa fa-times-circle'></i></a>");

                        fileRow.InnerHtml.AppendHtml(rowAction);
                        filesListEl.InnerHtml.AppendHtml(fileRow);
                    }

                    output.Content.AppendHtml(filesListEl);

                    #endregion


                    var jsCompressor = new JavaScriptCompressor();

                    #region << Init Scripts >>
                    {
                        var tagHelperInitialized = false;
                        var fileName             = "form";
                        if (ViewContext.HttpContext.Items.ContainsKey(typeof(WvFieldFileMultiple) + fileName))
                        {
                            var tagHelperContext = (WvTagHelperContext)ViewContext.HttpContext.Items[typeof(WvFieldFileMultiple) + fileName];
                            tagHelperInitialized = tagHelperContext.Initialized;
                        }
                        if (!tagHelperInitialized)
                        {
                            var scriptContent = WvHelpers.GetEmbeddedTextResource("form.js", "WebVella.TagHelpers.TagHelpers.WvFieldFileMultiple", "WebVella.TagHelpers");
                            var scriptEl      = new TagBuilder("script");
                            scriptEl.Attributes.Add("type", "text/javascript");
                            //scriptEl.InnerHtml.AppendHtml(scriptContent);
                            scriptEl.InnerHtml.AppendHtml(jsCompressor.Compress(scriptContent));
                            output.PostContent.AppendHtml(scriptEl);

                            ViewContext.HttpContext.Items[typeof(WvFieldFileMultiple) + fileName] = new WvTagHelperContext()
                            {
                                Initialized = true
                            };
                        }
                    }
                    #endregion

                    #region << Add Inline Init Script for this instance >>
                    var initScript = new TagBuilder("script");
                    initScript.Attributes.Add("type", "text/javascript");
                    var scriptTemplate = @"
						$(function(){
							FieldMultiFileFormInit(""{{FieldId}}"",{{ConfigJson}});
						});"                        ;
                    scriptTemplate = scriptTemplate.Replace("{{FieldId}}", (FieldId != null ? FieldId.Value.ToString() : ""));

                    var fieldConfig = new WvFieldFileConfig()
                    {
                        ApiUrl        = ApiUrl,
                        CanAddValues  = Access == WvFieldAccess.FullAndCreate ? true : false,
                        Accept        = Accept,
                        FileUploadApi = FileUploadApi
                    };

                    scriptTemplate = scriptTemplate.Replace("{{ConfigJson}}", JsonConvert.SerializeObject(fieldConfig));

                    initScript.InnerHtml.AppendHtml(jsCompressor.Compress(scriptTemplate));

                    output.PostContent.AppendHtml(initScript);
                    #endregion
                }
                else if (Access == WvFieldAccess.ReadOnly)
                {
                    output.Content.AppendHtml(GenerateDisplayHtml(fileObjects, GetHandlerPrefix));
                }
            }
            else if (Mode == WvFieldRenderMode.Display)
            {
                output.Content.AppendHtml(GenerateDisplayHtml(fileObjects, GetHandlerPrefix));
            }
            else if (Mode == WvFieldRenderMode.Simple)
            {
                output.SuppressOutput();
                foreach (var fileObject in fileObjects)
                {
                    var fileSpan = new TagBuilder("span");
                    fileSpan.AddCssClass("mr-2");
                    if (!String.IsNullOrWhiteSpace(fileObject.icon))
                    {
                        fileSpan.InnerHtml.AppendHtml($"<i class='{fileObject.icon}'></i> ");
                    }
                    var fileLink = new TagBuilder("a");
                    fileLink.Attributes.Add("href", GetHandlerPrefix + fileObject.path);
                    fileLink.Attributes.Add("title", GetHandlerPrefix + fileObject.path);
                    fileLink.Attributes.Add("target", "_blank");

                    fileLink.InnerHtml.Append(fileObject.name);

                    fileSpan.InnerHtml.AppendHtml(fileLink);

                    output.Content.AppendHtml(fileSpan);
                }
            }
            else if (Mode == WvFieldRenderMode.InlineEdit)
            {
                output.Content.AppendHtml("Not implemented yet");
            }
            #endregion


            //Finally
            if (SubInputEl != null)
            {
                output.PostContent.AppendHtml(SubInputEl);
            }

            return(Task.CompletedTask);
        }
示例#3
0
        public override Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
        {
            if (!isVisible)
            {
                output.SuppressOutput();
                return(Task.CompletedTask);
            }
            #region << Init >>
            var initSuccess = InitField(context, output);

            if (!initSuccess)
            {
                return(Task.CompletedTask);
            }

            if (Value != null && !String.IsNullOrWhiteSpace((Value ?? "").ToString()))
            {
                if (Value.StartsWith("/fs"))
                {
                    Value = Value.Substring(3);
                }
                PathTypeIcon = new RenderService().GetPathTypeIcon(Value);
                FileName     = Path.GetFileName(Value);
            }

            #endregion

            #region << Render >>
            if (Mode == FieldRenderMode.Form)
            {
                if (Access == FieldAccess.Full || Access == FieldAccess.FullAndCreate)
                {
                    var inputGroupEl = new TagBuilder("div");
                    inputGroupEl.AddCssClass("input-group");
                    var prependEl = new TagBuilder("span");
                    prependEl.AddCssClass($"input-group-prepend icon-addon {(String.IsNullOrWhiteSpace(Value) ? "d-none" : "")} {(ValidationErrors.Count > 0 ? "is-invalid" : "")}");
                    prependEl.Attributes.Add("title", $"/fs{Value}");
                    var prependText = new TagBuilder("span");
                    prependText.AddCssClass("input-group-text");
                    var prependIcon = new TagBuilder("span");
                    prependIcon.AddCssClass($"fa fa-fw type-icon {PathTypeIcon}");
                    prependText.InnerHtml.AppendHtml(prependIcon);
                    prependEl.InnerHtml.AppendHtml(prependText);
                    inputGroupEl.InnerHtml.AppendHtml(prependEl);

                    var fakeInputEl         = new TagBuilder("div");
                    var inputElCssClassList = new List <string>();
                    inputElCssClassList.Add("form-control erp-file with-progress ");

                    fakeInputEl.Attributes.Add("id", $"fake-{FieldId}");

                    if (ValidationErrors.Count > 0)
                    {
                        inputElCssClassList.Add("is-invalid");
                    }

                    fakeInputEl.Attributes.Add("class", String.Join(' ', inputElCssClassList));

                    var fakeInputFileLinkEl = new TagBuilder("a");
                    fakeInputFileLinkEl.Attributes.Add("href", $"/fs{Value}");
                    fakeInputFileLinkEl.Attributes.Add("target", "_blank");
                    fakeInputFileLinkEl.Attributes.Add("title", $"/fs{Value}");
                    fakeInputFileLinkEl.InnerHtml.Append(FileName);
                    fakeInputEl.InnerHtml.AppendHtml(fakeInputFileLinkEl);
                    var fakeInputProgress = new TagBuilder("div");
                    fakeInputProgress.AddCssClass("form-control-progress");
                    fakeInputEl.InnerHtml.AppendHtml(fakeInputProgress);
                    inputGroupEl.InnerHtml.AppendHtml(fakeInputEl);

                    var appendEl = new TagBuilder("span");
                    appendEl.AddCssClass("input-group-append action erp-file");
                    if (!Required)
                    {
                        var appendDeleteLink = new TagBuilder("button");
                        appendDeleteLink.Attributes.Add("type", $"button");
                        appendDeleteLink.Attributes.Add("id", $"remove-{FieldId}");
                        appendDeleteLink.AddCssClass($"btn btn-white remove {(String.IsNullOrWhiteSpace(Value) ? "d-none" : "")}");
                        appendDeleteLink.Attributes.Add("title", "select as undefined");
                        var appendDeleteLinkIcon = new TagBuilder("span");
                        appendDeleteLinkIcon.AddCssClass("fa fa-fw fa-trash go-red");
                        appendDeleteLink.InnerHtml.AppendHtml(appendDeleteLinkIcon);
                        appendEl.InnerHtml.AppendHtml(appendDeleteLink);
                    }

                    var selectFileLink = new TagBuilder("button");
                    selectFileLink.Attributes.Add("type", $"button");
                    selectFileLink.AddCssClass("btn btn-white");
                    selectFileLink.Attributes.Add("onclick", $"document.getElementById('file-{FieldId}').click();");
                    selectFileLink.InnerHtml.AppendHtml("browse");
                    appendEl.InnerHtml.AppendHtml(selectFileLink);

                    inputGroupEl.InnerHtml.AppendHtml(appendEl);
                    output.Content.AppendHtml(inputGroupEl);

                    var realHiddenFileInput = new TagBuilder("input");
                    realHiddenFileInput.Attributes.Add("id", $"file-{FieldId}");
                    realHiddenFileInput.Attributes.Add("type", $"file");
                    realHiddenFileInput.AddCssClass("d-none");
                    realHiddenFileInput.Attributes.Add("value", $"");
                    if (!String.IsNullOrWhiteSpace(Accept))
                    {
                        realHiddenFileInput.Attributes.Add("accept", $"{Accept}");
                    }
                    output.Content.AppendHtml(realHiddenFileInput);

                    var realSubmitInput = new TagBuilder("input");
                    realSubmitInput.Attributes.Add("id", $"input-{FieldId}");
                    realSubmitInput.Attributes.Add("type", $"hidden");
                    realSubmitInput.Attributes.Add("name", $"{Name}");
                    realSubmitInput.Attributes.Add("value", $"{Value}");
                    output.Content.AppendHtml(realSubmitInput);

                    var jsCompressor = new JavaScriptCompressor();

                    #region << Init Scripts >>
                    var tagHelperInitialized = false;
                    if (ViewContext.HttpContext.Items.ContainsKey(typeof(WvFieldFile) + "-form"))
                    {
                        var tagHelperContext = (WvTagHelperContext)ViewContext.HttpContext.Items[typeof(WvFieldFile) + "-form"];
                        tagHelperInitialized = tagHelperContext.Initialized;
                    }
                    if (!tagHelperInitialized)
                    {
                        var scriptContent = FileService.GetEmbeddedTextResource("form.js", "WebVella.Erp.Web.TagHelpers.WvFieldFile");
                        var scriptEl      = new TagBuilder("script");
                        scriptEl.Attributes.Add("type", "text/javascript");
                        scriptEl.InnerHtml.AppendHtml(jsCompressor.Compress(scriptContent));
                        output.PostContent.AppendHtml(scriptEl);

                        ViewContext.HttpContext.Items[typeof(WvFieldFile) + "-form"] = new WvTagHelperContext()
                        {
                            Initialized = true
                        };
                    }
                    #endregion

                    #region << Add Inline Init Script for this instance >>
                    var initScript = new TagBuilder("script");
                    initScript.Attributes.Add("type", "text/javascript");
                    var scriptTemplate = @"
						$(function(){
							FileFormInit(""{{FieldId}}"",""{{Name}}"",{{ConfigJson}});
						});"                        ;
                    scriptTemplate = scriptTemplate.Replace("{{FieldId}}", (FieldId ?? null).ToString());
                    scriptTemplate = scriptTemplate.Replace("{{Name}}", Name);

                    var fieldConfig = new WvFieldFileConfig()
                    {
                        ApiUrl       = ApiUrl,
                        CanAddValues = Access == FieldAccess.FullAndCreate ? true : false,
                        Accept       = Accept
                    };

                    scriptTemplate = scriptTemplate.Replace("{{ConfigJson}}", JsonConvert.SerializeObject(fieldConfig));

                    initScript.InnerHtml.AppendHtml(jsCompressor.Compress(scriptTemplate));

                    output.PostContent.AppendHtml(initScript);
                    #endregion
                }
                else if (Access == FieldAccess.ReadOnly)
                {
                    if (!String.IsNullOrWhiteSpace(Value))
                    {
                        var inputGroupEl = new TagBuilder("div");
                        inputGroupEl.AddCssClass("input-group");
                        var prependEl = new TagBuilder("span");
                        prependEl.AddCssClass($"input-group-prepend icon-addon {(String.IsNullOrWhiteSpace(Value) ? "d-none" : "")} {(ValidationErrors.Count > 0 ? "is-invalid" : "")}");
                        prependEl.Attributes.Add("title", $"/fs{Value}");
                        var prependText = new TagBuilder("span");
                        prependText.AddCssClass("input-group-text");
                        var prependIcon = new TagBuilder("span");
                        prependIcon.AddCssClass($"fa fa-fw type-icon {PathTypeIcon}");
                        prependText.InnerHtml.AppendHtml(prependIcon);
                        prependEl.InnerHtml.AppendHtml(prependText);
                        inputGroupEl.InnerHtml.AppendHtml(prependEl);

                        var inputEl = new TagBuilder("div");
                        inputEl.AddCssClass("form-control erp-file disabled");
                        var inputElLink = new TagBuilder("a");
                        inputElLink.Attributes.Add("href", $"/fs{Value}");
                        inputElLink.Attributes.Add("target", "_blank");
                        inputElLink.Attributes.Add("title", $"/fs{Value}");
                        inputElLink.InnerHtml.Append(FileName);
                        inputEl.InnerHtml.AppendHtml(inputElLink);
                        inputGroupEl.InnerHtml.AppendHtml(inputEl);
                        output.Content.AppendHtml(inputGroupEl);

                        //Hidden input with the value
                        var hiddenInput = new TagBuilder("input");
                        hiddenInput.Attributes.Add("type", "hidden");
                        hiddenInput.Attributes.Add("id", $"input-{FieldId}");
                        hiddenInput.Attributes.Add("name", Name);
                        hiddenInput.Attributes.Add("value", (Value ?? "").ToString());
                        output.Content.AppendHtml(hiddenInput);
                    }
                    else
                    {
                        var inputEl = new TagBuilder("input");
                        inputEl.Attributes.Add("readonly", null);
                        inputEl.AddCssClass("form-control erp-file");
                        inputEl.Attributes.Add("value", "");
                        inputEl.Attributes.Add("name", Name);
                        output.Content.AppendHtml(inputEl);
                    }
                }
            }
            else if (Mode == FieldRenderMode.Display)
            {
                if (!String.IsNullOrWhiteSpace(Value))
                {
                    var divEl = new TagBuilder("div");
                    divEl.Attributes.Add("id", $"input-{FieldId}");
                    divEl.AddCssClass("form-control-plaintext erp-file");
                    var iconEl = new TagBuilder("span");
                    iconEl.AddCssClass($"fa fa-fw {PathTypeIcon}");
                    divEl.InnerHtml.AppendHtml(iconEl);
                    var linkEl = new TagBuilder("a");
                    linkEl.Attributes.Add("href", $"/fs{Value}");
                    linkEl.Attributes.Add("target", $"_blank");
                    linkEl.InnerHtml.Append(FileName);
                    divEl.InnerHtml.AppendHtml(linkEl);
                    output.Content.AppendHtml(divEl);
                }
                else
                {
                    output.Content.AppendHtml(EmptyValEl);
                }
            }
            else if (Mode == FieldRenderMode.Simple)
            {
                output.SuppressOutput();
                var linkEl = new TagBuilder("a");
                linkEl.Attributes.Add("href", $"/fs{Value}");
                linkEl.Attributes.Add("target", $"_blank");
                linkEl.InnerHtml.Append(FileName);
                output.Content.AppendHtml(linkEl);
                return(Task.CompletedTask);
            }
            else if (Mode == FieldRenderMode.InlineEdit)
            {
                if (Access == FieldAccess.Full || Access == FieldAccess.FullAndCreate)
                {
                    #region << View Wrapper >>
                    {
                        var viewWrapperEl = new TagBuilder("div");
                        viewWrapperEl.AddCssClass("input-group view-wrapper");
                        viewWrapperEl.Attributes.Add("title", "double click to edit");
                        viewWrapperEl.Attributes.Add("id", $"view-{FieldId}");

                        var viewInputPrepend = new TagBuilder("span");
                        viewInputPrepend.AddCssClass($"input-group-prepend icon-addon {(String.IsNullOrWhiteSpace(Value) ? "d-none" : "")}");
                        viewInputPrepend.Attributes.Add("title", $"/fs{Value}");
                        var viewInputPrependText = new TagBuilder("span");
                        viewInputPrependText.AddCssClass("input-group-text");
                        var prependIcon = new TagBuilder("span");
                        prependIcon.AddCssClass($"fa fa-fw type-icon {PathTypeIcon}");
                        viewInputPrependText.InnerHtml.AppendHtml(prependIcon);
                        viewInputPrepend.InnerHtml.AppendHtml(viewInputPrependText);
                        viewWrapperEl.InnerHtml.AppendHtml(viewInputPrepend);

                        var viewFormControlEl = new TagBuilder("div");
                        viewFormControlEl.AddCssClass("form-control erp-file");

                        var viewFormControlLinkEl = new TagBuilder("a");
                        viewFormControlLinkEl.Attributes.Add("href", $"/fs{Value}");
                        viewFormControlLinkEl.Attributes.Add("target", "_blank");
                        viewFormControlLinkEl.Attributes.Add("title", $"/fs{Value}");
                        viewFormControlLinkEl.InnerHtml.Append(FileName);
                        viewFormControlEl.InnerHtml.AppendHtml(viewFormControlLinkEl);

                        viewWrapperEl.InnerHtml.AppendHtml(viewFormControlEl);

                        var viewInputActionEl = new TagBuilder("span");
                        viewInputActionEl.AddCssClass("input-group-append action");
                        viewInputActionEl.Attributes.Add("title", "edit");

                        var viewInputActionLinkEl = new TagBuilder("button");
                        viewInputActionLinkEl.Attributes.Add("type", "button");
                        viewInputActionLinkEl.AddCssClass("btn btn-white");

                        var viewInputActionIconEl = new TagBuilder("span");
                        viewInputActionIconEl.AddCssClass("fa fa-fw fa-pencil-alt");
                        viewInputActionLinkEl.InnerHtml.AppendHtml(viewInputActionIconEl);
                        viewInputActionEl.InnerHtml.AppendHtml(viewInputActionLinkEl);
                        viewWrapperEl.InnerHtml.AppendHtml(viewInputActionEl);

                        output.Content.AppendHtml(viewWrapperEl);
                    }
                    #endregion

                    #region << Edit Wrapper>>
                    {
                        var editWrapperEl = new TagBuilder("div");
                        editWrapperEl.Attributes.Add("id", $"edit-{FieldId}");
                        editWrapperEl.Attributes.Add("style", $"display:none;");
                        editWrapperEl.AddCssClass("edit-wrapper");

                        var editInputGroupEl = new TagBuilder("div");
                        editInputGroupEl.AddCssClass("input-group");

                        var editWrapperPrependEl = new TagBuilder("span");
                        editWrapperPrependEl.AddCssClass($"input-group-prepend icon-addon {(String.IsNullOrWhiteSpace(Value) ? "d-none" : "")} {(ValidationErrors.Count > 0 ? "is-invalid" : "")}");
                        editWrapperPrependEl.Attributes.Add("title", $"/fs{Value}");
                        var editWrapperPrependText = new TagBuilder("span");
                        editWrapperPrependText.AddCssClass("input-group-text");
                        var editWrapperPrependIcon = new TagBuilder("span");
                        editWrapperPrependIcon.AddCssClass($"fa fa-fw type-icon {PathTypeIcon}");
                        editWrapperPrependText.InnerHtml.AppendHtml(editWrapperPrependIcon);
                        editWrapperPrependEl.InnerHtml.AppendHtml(editWrapperPrependText);
                        editInputGroupEl.InnerHtml.AppendHtml(editWrapperPrependEl);


                        var fakeInputEl         = new TagBuilder("div");
                        var inputElCssClassList = new List <string>();
                        inputElCssClassList.Add("form-control erp-file with-progress ");

                        fakeInputEl.Attributes.Add("id", $"fake-{FieldId}");

                        if (ValidationErrors.Count > 0)
                        {
                            inputElCssClassList.Add("is-invalid");
                        }

                        fakeInputEl.Attributes.Add("class", String.Join(' ', inputElCssClassList));

                        var fakeInputFileLinkEl = new TagBuilder("a");
                        fakeInputFileLinkEl.Attributes.Add("href", $"/fs{Value}");
                        fakeInputFileLinkEl.Attributes.Add("target", "_blank");
                        fakeInputFileLinkEl.Attributes.Add("title", $"/fs{Value}");
                        fakeInputFileLinkEl.InnerHtml.Append(FileName);
                        fakeInputEl.InnerHtml.AppendHtml(fakeInputFileLinkEl);
                        var fakeInputProgress = new TagBuilder("div");
                        fakeInputProgress.AddCssClass("form-control-progress");
                        fakeInputEl.InnerHtml.AppendHtml(fakeInputProgress);
                        editInputGroupEl.InnerHtml.AppendHtml(fakeInputEl);


                        var editInputGroupAppendEl = new TagBuilder("span");
                        editInputGroupAppendEl.AddCssClass("input-group-append");

                        if (!Required)
                        {
                            var appendDeleteLink = new TagBuilder("button");
                            appendDeleteLink.Attributes.Add("type", $"button");
                            appendDeleteLink.Attributes.Add("id", $"remove-{FieldId}");
                            appendDeleteLink.AddCssClass($"btn btn-white remove {(String.IsNullOrWhiteSpace(Value) ? "d-none" : "")}");
                            appendDeleteLink.Attributes.Add("title", "select as undefined");
                            var appendDeleteLinkIcon = new TagBuilder("span");
                            appendDeleteLinkIcon.AddCssClass("fa fa-fw fa-trash go-red");
                            appendDeleteLink.InnerHtml.AppendHtml(appendDeleteLinkIcon);
                            editInputGroupAppendEl.InnerHtml.AppendHtml(appendDeleteLink);
                        }

                        var selectFileLink = new TagBuilder("button");
                        selectFileLink.Attributes.Add("type", $"button");
                        selectFileLink.AddCssClass("btn btn-white");
                        selectFileLink.Attributes.Add("onclick", $"document.getElementById('file-{FieldId}').click();");
                        selectFileLink.InnerHtml.AppendHtml("select");
                        editInputGroupAppendEl.InnerHtml.AppendHtml(selectFileLink);


                        var editSaveBtnEl = new TagBuilder("button");
                        editSaveBtnEl.Attributes.Add("type", "submit");
                        editSaveBtnEl.AddCssClass("btn btn-white save");
                        editSaveBtnEl.Attributes.Add("title", "save");

                        var editSaveIconEl = new TagBuilder("span");
                        editSaveIconEl.AddCssClass("fa fa-fw fa-check go-green");
                        editSaveBtnEl.InnerHtml.AppendHtml(editSaveIconEl);
                        editInputGroupAppendEl.InnerHtml.AppendHtml(editSaveBtnEl);

                        var editCancelBtnEl = new TagBuilder("button");
                        editCancelBtnEl.Attributes.Add("type", "submit");
                        editCancelBtnEl.AddCssClass("btn btn-white cancel");
                        editCancelBtnEl.Attributes.Add("title", "cancel");

                        var editCancelIconEl = new TagBuilder("span");
                        editCancelIconEl.AddCssClass("fa fa-fw fa-times go-gray");
                        editCancelBtnEl.InnerHtml.AppendHtml(editCancelIconEl);
                        editInputGroupAppendEl.InnerHtml.AppendHtml(editCancelBtnEl);

                        editInputGroupEl.InnerHtml.AppendHtml(editInputGroupAppendEl);
                        editWrapperEl.InnerHtml.AppendHtml(editInputGroupEl);

                        output.Content.AppendHtml(editWrapperEl);

                        var realHiddenFileInput = new TagBuilder("input");
                        realHiddenFileInput.Attributes.Add("id", $"file-{FieldId}");
                        realHiddenFileInput.Attributes.Add("type", $"file");
                        realHiddenFileInput.AddCssClass("d-none");
                        realHiddenFileInput.Attributes.Add("value", $"");
                        if (!String.IsNullOrWhiteSpace(Accept))
                        {
                            realHiddenFileInput.Attributes.Add("accept", $"{Accept}");
                        }
                        output.Content.AppendHtml(realHiddenFileInput);

                        var realSubmitInput = new TagBuilder("input");
                        realSubmitInput.Attributes.Add("id", $"input-{FieldId}");
                        realSubmitInput.Attributes.Add("type", $"hidden");
                        realSubmitInput.Attributes.Add("value", $"{Value}");
                        realSubmitInput.Attributes.Add("data-newfilepath", $"{Value}");
                        realSubmitInput.Attributes.Add("data-filename", $"{FileName}");
                        realSubmitInput.Attributes.Add("data-newfilename", $"{FileName}");
                        output.Content.AppendHtml(realSubmitInput);
                    }
                    #endregion

                    var jsCompressor = new JavaScriptCompressor();

                    #region << Init Scripts >>
                    var tagHelperInitialized = false;
                    if (ViewContext.HttpContext.Items.ContainsKey(typeof(WvFieldFile) + "-inline-edit"))
                    {
                        var tagHelperContext = (WvTagHelperContext)ViewContext.HttpContext.Items[typeof(WvFieldFile) + "-inline-edit"];
                        tagHelperInitialized = tagHelperContext.Initialized;
                    }
                    if (!tagHelperInitialized)
                    {
                        var scriptContent = FileService.GetEmbeddedTextResource("inline-edit.js", "WebVella.Erp.Web.TagHelpers.WvFieldFile");
                        var scriptEl      = new TagBuilder("script");
                        scriptEl.Attributes.Add("type", "text/javascript");
                        scriptEl.InnerHtml.AppendHtml(jsCompressor.Compress(scriptContent));
                        output.PostContent.AppendHtml(scriptEl);

                        ViewContext.HttpContext.Items[typeof(WvFieldFile) + "-inline-edit"] = new WvTagHelperContext()
                        {
                            Initialized = true
                        };
                    }
                    #endregion

                    #region << Add Inline Init Script for this instance >>
                    var initScript = new TagBuilder("script");
                    initScript.Attributes.Add("type", "text/javascript");
                    var scriptTemplate = @"
						$(function(){
							FileInlineEditInit(""{{FieldId}}"",""{{Name}}"",""{{EntityName}}"",""{{RecordId}}"",{{ConfigJson}});
						});"                        ;
                    scriptTemplate = scriptTemplate.Replace("{{FieldId}}", (FieldId ?? null).ToString());
                    scriptTemplate = scriptTemplate.Replace("{{Name}}", Name);
                    scriptTemplate = scriptTemplate.Replace("{{EntityName}}", EntityName);
                    scriptTemplate = scriptTemplate.Replace("{{RecordId}}", (RecordId ?? null).ToString());

                    var fieldConfig = new WvFieldFileConfig()
                    {
                        ApiUrl       = ApiUrl,
                        CanAddValues = Access == FieldAccess.FullAndCreate ? true : false,
                        Accept       = Accept
                    };

                    scriptTemplate = scriptTemplate.Replace("{{ConfigJson}}", JsonConvert.SerializeObject(fieldConfig));

                    initScript.InnerHtml.AppendHtml(jsCompressor.Compress(scriptTemplate));

                    output.PostContent.AppendHtml(initScript);
                    #endregion
                }
                else if (Access == FieldAccess.ReadOnly)
                {
                    var divEl = new TagBuilder("div");
                    divEl.AddCssClass("input-group");

                    var prependEl = new TagBuilder("span");
                    prependEl.AddCssClass($"input-group-prepend icon-addon {(String.IsNullOrWhiteSpace(Value) ? "d-none" : "")} {(ValidationErrors.Count > 0 ? "is-invalid" : "")}");
                    prependEl.Attributes.Add("title", $"/fs{Value}");
                    var prependText = new TagBuilder("span");
                    prependText.AddCssClass("input-group-text");
                    var prependIcon = new TagBuilder("span");
                    prependIcon.AddCssClass($"fa fa-fw type-icon {PathTypeIcon}");
                    prependText.InnerHtml.AppendHtml(prependIcon);
                    prependEl.InnerHtml.AppendHtml(prependText);
                    divEl.InnerHtml.AppendHtml(prependEl);

                    var inputEl = new TagBuilder("div");
                    inputEl.AddCssClass("form-control erp-file disabled");
                    var inputElLink = new TagBuilder("a");
                    inputElLink.Attributes.Add("href", $"/fs{Value}");
                    inputElLink.Attributes.Add("target", "_blank");
                    inputElLink.Attributes.Add("title", $"/fs{Value}");
                    inputElLink.InnerHtml.Append(FileName);
                    inputEl.InnerHtml.AppendHtml(inputElLink);
                    divEl.InnerHtml.AppendHtml(inputEl);

                    var appendActionSpan = new TagBuilder("span");
                    appendActionSpan.AddCssClass("input-group-append");
                    appendActionSpan.AddCssClass("action");

                    var appendTextSpan = new TagBuilder("span");
                    appendTextSpan.AddCssClass("input-group-text");

                    var appendIconSpan = new TagBuilder("span");
                    appendIconSpan.AddCssClass("fa fa-fw fa-lock");
                    appendTextSpan.InnerHtml.AppendHtml(appendIconSpan);
                    appendActionSpan.InnerHtml.AppendHtml(appendTextSpan);

                    divEl.InnerHtml.AppendHtml(appendActionSpan);
                    output.Content.AppendHtml(divEl);
                }
            }
            #endregion


            //Finally
            if (SubInputEl != null)
            {
                output.PostContent.AppendHtml(SubInputEl);
            }

            return(Task.CompletedTask);
        }
        public override Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
        {
            if (!isVisible)
            {
                output.SuppressOutput();
                return(Task.CompletedTask);
            }
            #region << Init >>
            var initSuccess = InitField(context, output);

            if (!initSuccess)
            {
                return(Task.CompletedTask);
            }

            if (Value is string && Value == "")
            {
                Value = null;
            }

            if (Value != null && !(Value is List <string>))
            {
                output.Content.AppendHtml("<div class='go-red'>'value' property should be 'List&lt;string>'</div>");
                return(Task.CompletedTask);
            }

            if (Value != null && Value is List <string> )
            {
                FilePaths = (List <string>)Value;
            }

            #endregion

            #region << Render >>
            if (Mode == WvFieldRenderMode.Form)
            {
                if (Access == WvFieldAccess.Full || Access == WvFieldAccess.FullAndCreate)
                {
                    #region << Hidden input for posting >>
                    output.Content.AppendHtml($"<input type='hidden' id='input-{FieldId}' name='{Name}' value='{String.Join(',', FilePaths)}'/>");
                    #endregion

                    #region << fake upload >>
                    var inputGroupEl = new TagBuilder("div");
                    inputGroupEl.AddCssClass("input-group erp-file-multiple-input");

                    var fakeInputEl         = new TagBuilder("div");
                    var inputElCssClassList = new List <string>();
                    inputElCssClassList.Add("form-control erp-file with-progress");
                    fakeInputEl.Attributes.Add("id", $"fake-{FieldId}");

                    if (ValidationErrors.Count > 0)
                    {
                        inputElCssClassList.Add("is-invalid");
                    }
                    fakeInputEl.Attributes.Add("class", String.Join(' ', inputElCssClassList));

                    var fakeInputProgress = new TagBuilder("div");
                    fakeInputProgress.AddCssClass("form-control-progress");
                    fakeInputEl.InnerHtml.AppendHtml(fakeInputProgress);

                    inputGroupEl.InnerHtml.AppendHtml(fakeInputEl);

                    var appendEl = new TagBuilder("span");
                    appendEl.AddCssClass("input-group-append action erp-file");
                    var selectFileLink = new TagBuilder("button");
                    selectFileLink.Attributes.Add("type", $"button");
                    selectFileLink.AddCssClass("btn btn-white");
                    selectFileLink.Attributes.Add("onclick", $"window.document.getElementById('file-{FieldId}').click();");
                    selectFileLink.InnerHtml.AppendHtml("browse");
                    appendEl.InnerHtml.AppendHtml(selectFileLink);
                    inputGroupEl.InnerHtml.AppendHtml(appendEl);
                    output.Content.AppendHtml(inputGroupEl);

                    var realHiddenFileInput = new TagBuilder("input");
                    realHiddenFileInput.Attributes.Add("id", $"file-{FieldId}");
                    realHiddenFileInput.Attributes.Add("type", $"file");
                    realHiddenFileInput.Attributes.Add("multiple", $"true");
                    realHiddenFileInput.AddCssClass("d-none");
                    realHiddenFileInput.Attributes.Add("value", $"");
                    if (!String.IsNullOrWhiteSpace(Accept))
                    {
                        realHiddenFileInput.Attributes.Add("accept", $"{Accept}");
                    }
                    output.Content.AppendHtml(realHiddenFileInput);

                    #endregion

                    #region << Files list element >>

                    var filesListEl = new TagBuilder("div");
                    filesListEl.AddCssClass("form-control erp-file-multiple-list form");
                    filesListEl.Attributes.Add("id", $"fake-list-{FieldId}");

                    if (FilePaths.Count == 0)
                    {
                        filesListEl.AddCssClass("d-none");
                    }


                    //Generate the files list
                    foreach (var filePath in FilePaths)
                    {
                        var fileRow = new TagBuilder("div");
                        fileRow.AddCssClass("filerow");
                        fileRow.Attributes.Add("data-file-path", filePath);
                        //Append icon
                        var iconClass = WvHelpers.GetPathTypeIcon(filePath);
                        fileRow.InnerHtml.AppendHtml($"<div class='icon'><i class='fa {iconClass}'></i></div>");

                        //Append meta
                        var rowMeta = new TagBuilder("div");
                        rowMeta.AddCssClass("meta");

                        //Append file
                        var fileName = WvHelpers.GetFileNameFromPath(filePath);
                        rowMeta.InnerHtml.AppendHtml($"<a class='link' href='{filePath}' target='_blank' title='{filePath}'>{fileName}<em></em></a>");

                        fileRow.InnerHtml.AppendHtml(rowMeta);

                        //Action
                        var rowAction = new TagBuilder("div");
                        rowAction.AddCssClass("action remove");
                        rowAction.InnerHtml.AppendHtml($"<a class='link' href='#'><i class='fa fa-times-circle'></i></a>");
                        //rowAction.InnerHtml.AppendHtml($"<span class='progress d-none'>0%</span>");
                        //rowAction.InnerHtml.AppendHtml($"<span class='error go-red d-none'><i class='fas fa-exclamation-circle'></i></span>");

                        fileRow.InnerHtml.AppendHtml(rowAction);
                        filesListEl.InnerHtml.AppendHtml(fileRow);
                    }

                    output.Content.AppendHtml(filesListEl);

                    #endregion


                    var jsCompressor = new JavaScriptCompressor();

                    #region << Init Scripts >>
                    {
                        var tagHelperInitialized = false;
                        var fileName             = "form";
                        if (ViewContext.HttpContext.Items.ContainsKey(typeof(WvFieldFileMultiple) + fileName))
                        {
                            var tagHelperContext = (WvTagHelperContext)ViewContext.HttpContext.Items[typeof(WvFieldFileMultiple) + fileName];
                            tagHelperInitialized = tagHelperContext.Initialized;
                        }
                        if (!tagHelperInitialized)
                        {
                            var scriptContent = WvHelpers.GetEmbeddedTextResource("form.js", "WebVella.TagHelpers.TagHelpers.WvFieldFileMultiple", "WebVella.TagHelpers");
                            var scriptEl      = new TagBuilder("script");
                            scriptEl.Attributes.Add("type", "text/javascript");
                            //scriptEl.InnerHtml.AppendHtml(scriptContent);
                            scriptEl.InnerHtml.AppendHtml(jsCompressor.Compress(scriptContent));
                            output.PostContent.AppendHtml(scriptEl);

                            ViewContext.HttpContext.Items[typeof(WvFieldFileMultiple) + fileName] = new WvTagHelperContext()
                            {
                                Initialized = true
                            };
                        }
                    }
                    #endregion

                    #region << Add Inline Init Script for this instance >>
                    var initScript = new TagBuilder("script");
                    initScript.Attributes.Add("type", "text/javascript");
                    var scriptTemplate = @"
						$(function(){
							FieldMultiFileFormInit(""{{FieldId}}"",{{ConfigJson}});
						});"                        ;
                    scriptTemplate = scriptTemplate.Replace("{{FieldId}}", (FieldId ?? null).ToString());

                    var fieldConfig = new WvFieldFileConfig()
                    {
                        ApiUrl        = ApiUrl,
                        CanAddValues  = Access == WvFieldAccess.FullAndCreate ? true : false,
                        Accept        = Accept,
                        FileUploadApi = FileUploadApi
                    };

                    scriptTemplate = scriptTemplate.Replace("{{ConfigJson}}", JsonConvert.SerializeObject(fieldConfig));

                    initScript.InnerHtml.AppendHtml(jsCompressor.Compress(scriptTemplate));

                    output.PostContent.AppendHtml(initScript);
                    #endregion
                }
                else if (Access == WvFieldAccess.ReadOnly)
                {
                    output.Content.AppendHtml("Not implemented yet");
                }
            }
            else if (Mode == WvFieldRenderMode.Display)
            {
                output.Content.AppendHtml("Not implemented yet");
            }
            else if (Mode == WvFieldRenderMode.Simple)
            {
                output.Content.AppendHtml("Not implemented yet");
            }
            else if (Mode == WvFieldRenderMode.InlineEdit)
            {
                output.Content.AppendHtml("Not implemented yet");
            }
            #endregion


            //Finally
            if (SubInputEl != null)
            {
                output.PostContent.AppendHtml(SubInputEl);
            }

            return(Task.CompletedTask);
        }