Awesome ASP.net Core and MVC Controls

Grid inline editing conditional


rows with 1 meal are not editable
dates with year less than 2012 are readonly
Organic is editable only if isAdmin set to true (set to false in code)
GridInlineEditDemo/ConditionalDemo.cshtml
@{ var grid = "DinnersGrid2"; }
@Html.InitDeletePopupForGrid(grid, "GridInlineEditDemo")

<div class="bar">
@Html.InlineCreateButtonForGrid(grid, new { DispOrganic = "" })
</div>

@{
var isAdmin = false;
}
@(Html.Awe().Grid(grid)
.Mod(o => o.PageInfo().InlineEdit(Url.Action("Create"), Url.Action("Edit")))
.Url(Url.Action("GridGetItems"))
.Height(350)
.Resizable()
.Columns(
new Column { Bind = "Id", Width = 75 }.Mod(o => o.InlineId()),
new Column { Bind = "Name" }.Mod(o => o.Inline(Html.Awe().TextBox("Name"))),

new Column { Bind = "Date", Width = 170 }
.Mod(o => o.InlineFunc("dateCond",
f => f.Param(p => p.Inline("<input type='hidden' name='Date' value='#Value'/>#Value"))
.Param(p => p.Inline(Html.Awe().DatePicker("Date")))
)),

new Column { Bind = "Chef.FirstName,Chef.LastName", ClientFormat = ".(ChefName)", Header = "Chef", Width = 200 }
.Mod(o => o.Inline(Html.Awe().Lookup("Chef").Controller("ChefLookup"), "ChefId")),

new Column { ClientFormat = ".Meals", Header = "Meals", Width = 220 }
.Mod(o => o.Inline(Html.Awe().AjaxCheckboxList("Meals").Multiselect().DataFunc("utils.getItems(meals)"), "MealsIds")),

new Column { Bind = "BonusMeal.Name", ClientFormat = ".BonusMeal", Header = "Bonus Meal" }
.Mod(o => o.Inline(Html.Awe().AjaxRadioList("BonusMealId").DataFunc("utils.getItems(meals)").Odropdown(), "BonusMealId")),

new Column { Bind = "Organic", Width = 100, ClientFormat = ".(DispOrganic)" }
.Mod(o =>
{
if (isAdmin)
o.Inline(Html.Awe().CheckBox("Organic").Otoggl());
else
o.InlineReadonly(); // readonly, used if you set isAdmin = false
}),

new Column { ClientFormatFunc = "editff", Width = 70 },
new Column { ClientFormatFunc = "delff", Width = 85 }))
<script>
var meals = @Html.Raw(DemoUtils.Encode(Db.Meals.Select(o => new KeyContent(o.Id, o.Name))));

function dateCond(o, params) {
if (o.DateReadOnly) return params[0];
return params[1];
}

function editff(o) {
return o.Editable === false ? '': '@Html.Raw(GridUtils.InlineEditFormat())';
}

function delff(o) {
var format = @Html.Raw(DemoUtils.Encode(Html.InlineDeleteFormatForGrid(grid)));
format = format.split(".(Id)").join(o.Id);
return o.Editable === false ? '': format;
}
</script>
Demos/Grid/GridInlineEditDemoController.cs
public class GridInlineEditDemoController : Controller
{
public ActionResult Index()
{
return View();
}

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

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

private object MapToGridModel(Dinner o)
{
return new
{
o.Id,
o.Name,
Date = o.Date.ToShortDateString(),
ChefName = o.Chef.FirstName + " " + o.Chef.LastName,
Meals = string.Join(", ", o.Meals.Select(m => m.Name)),
BonusMeal = o.BonusMeal.Name,
o.Organic,
DispOrganic = o.Organic ? "Yes" : "No",

// below properties used for inline editing only
MealsIds = o.Meals.Select(m => m.Id).ToArray(),
ChefId = o.Chef.Id,
BonusMealId = o.BonusMeal.Id,

// for conditional demo
Editable = o.Meals.Count() > 1,
DateReadOnly = o.Date.Year < 2012
};
}

public ActionResult GridGetItems(GridParams g, string search)
{
search = (search ?? "").ToLower();
var items = Db.Dinners.Where(o => o.Name.ToLower().Contains(search)).AsQueryable();

var model = new GridModelBuilder<Dinner>(items, g)
{
Key = "Id", // needed for api select, update, tree, nesting, EF
GetItem = () => Db.Get<Dinner>(Convert.ToInt32(g.Key)), // called by the grid.api.update
Map = MapToGridModel,
}.Build();

return Json(model);
}

[HttpPost]
public ActionResult Create(DinnerInput input)
{
if (ModelState.IsValid)
{
var dinner = new Dinner
{
Name = input.Name,
Date = input.Date.Value,
Chef = Db.Get<Chef>(input.Chef),
Meals = input.Meals.Select(mid => Db.Get<Meal>(mid)),
BonusMeal = Db.Get<Meal>(input.BonusMealId),
Organic = input.Organic ?? false
};

Db.Insert(dinner);

return Json(new { Item = MapToGridModel(dinner) });
}

return Json(ModelState.GetErrorsInline());
}

[HttpPost]
public ActionResult Edit(DinnerInput input)
{
if (ModelState.IsValid)
{
var dinner = Db.Get<Dinner>(input.Id);
dinner.Name = input.Name;
dinner.Date = input.Date.Value;
dinner.Chef = Db.Get<Chef>(input.Chef);

dinner.Meals = input.Meals.Select(mid => Db.Get<Meal>(mid));

dinner.BonusMeal = Db.Get<Meal>(input.BonusMealId);
dinner.Organic = input.Organic ?? false;
Db.Update(dinner);

return Json(new { });
}

return Json(ModelState.GetErrorsInline());
}

public ActionResult Delete(int id)
{
var dinner = Db.Get<Dinner>(id);

return PartialView(new DeleteConfirmInput
{
Id = id,
Type = "dinner",
Name = dinner.Name
});
}

[HttpPost]
public ActionResult Delete(DeleteConfirmInput input)
{
Db.Delete<Dinner>(input.Id);
return Json(new { input.Id });
}

public ActionResult Popup()
{
return PartialView();
}
}



Comments

We use cookies to improve your online experience. By accessing this site, you agree to the use of cookies and other technologies to process your personal data (e.g. IP address) to enhance and personalise your experience across our websites. Additionally, third-party companies, may store cookies on your device and use similar technologies to collect and use certain information. For more information, refer to our privacy policy and cookie policy.