Hello,
Anyone have any idea how to handle translation when you want to use data persistence?
Here, template helper + template kendo + kendo grid
@* ===================================== HELPER and Template ===================================== *@
@* =============== Toolbar =============== *@
@helper ToolbarTemplate()
{
<
div
>
<
a
class
=
"k-button k-button-icontext k-grid-excel"
href
=
"\#"
>@Tools.GetStringRessource("AllList_ExportToExcel", "Download To Excel")</
a
>
</
div
>
}
<
script
type
=
"text/x-kendo-template"
id
=
"toolbarTemplate"
>
@Html.Raw(@ToolbarTemplate().ToHtmlString().Replace("#", "\\#").Replace("</
scr
", "<\\/scr"))
</script>
@* =============== ColumnAction =============== *@
@helper ColumnActionTemplate(bool canEdit, bool canDelete)
{
@* Voir page CableDrum_Customer pour les différentes recherches *@
@* VERSION 2: Solution bricolé - href généré avec Url.Action (encode les params mais sera décodé dans le js pour retrouver #= #) *@
var hrefEdit = Url.Action("CableDrumEdit_Site", new { idCustomer = @ViewContext.RouteData.Values["idCustomer"], idSite = @ViewContext.RouteData.Values["idSite"], idCableDrum = "#=Id#" });
var edit = $"<
a
class=\"btn icon bg-white tooltip-bottom\" href=\"{@hrefEdit}\" title = \"{Tools.GetStringRessource("AllList_EditItem", "Edit")}\" >#=library.getKendoTemplate(data,'IconCreateTemplate')#</
a
>";
var resultEdit = Convert.ToBoolean(canEdit) ? edit : "";
var resultDelete = Convert.ToBoolean(canDelete) ? "#=library.getKendoTemplate(data,'DeleteTemplate')#" : "";
<
div
class
=
"action"
>
<
span
>
@Html.Raw(@resultEdit)
</
span
>
<
span
>
@Html.Raw(@resultDelete)
</
span
>
</
div
>
}
<
script
type
=
"text/x-kendo-template"
id
=
"columnActionTemplate"
>
@Html.Raw(@ColumnActionTemplate(ViewBag.CanEdit, ViewBag.CanDelete).ToHtmlString())
</
script
>
@* =============== Header =============== *@
@helper HeaderTemplate()
{
<
span
class
=
"k-link"
>
@Tools.GetStringRessource("AllList_EditBtn", "Action")
</
span
>
}
<
script
type
=
"text/x-kendo-template"
id
=
"headerTemplate"
>
@Html.Raw(@HeaderTemplate().ToHtmlString())
</
script
>
@* ===================================== FIN HELPER and Template ===================================== *@
@(Html.Kendo().Grid<
CableDrumUIDto
>()
.Name("CableDrumGrid")
.ToolBar(tools =>
{
tools.Template(@<
text
>@ToolbarTemplate()</
text
>);
})
.Excel(excel => excel
.FileName(Tools.GetStringRessource("ExportToExcel_CableDrums", "siteDrum.xlsx"))
.Filterable(true)
.AllPages(true)
)
.DataSource(dataSource => dataSource
.Ajax()
.PageSize(10)
.Read(read => read.Action("CableDrumInfo_Read", "CableDrums").Data("CableDrumLib.getAdditionalData").Type(HttpVerbs.Post))
)
.Events(e => e
.DataBound(@<
text
>function(e){ CableDrumLib.gridDataBound(); library.dataBound(); }</
text
>)
.ExcelExport("onExcelExport")
)
.Columns(columns =>
{
columns.Bound(p => p.ProductName).Title(Tools.GetStringRessource("CableDrum_ProductName", "PRODUCT NAME"));
columns.Bound(p => p.ProductRef).Title(Tools.GetStringRessource("CableDrum_ProductRef", "REFERENCE"));
columns.Bound(p => p.ProductRefCustomer).Title(Tools.GetStringRessource("CableDrum_ProductRefClient", "REFERENCE CUSTOMER"));
columns.Bound(p => p.LabelProductSerialNumber).Title(Tools.GetStringRessource("CableDrum_Identifier", "DRUM"));
columns.Bound(p => p.Location).Title(Tools.GetStringRessource("CableDrumEdit_DetailsTab_Location", "LOCATION"));
if (ViewBag.DisplayLengthInFeets.Equals(true))
{
columns.Bound(p => p.CurrentLengthInM).Title(Tools.GetStringRessource("CableDrum_ProductLengthInF", "LENGTH"));
}
if (ViewBag.DisplayLengthInMeters.Equals(true))
{
columns.Bound(p => p.CurrentLengthInM).Title(Tools.GetStringRessource("CableDrum_ProductLengthInM", "LENGTH"));
}
/**/
columns.Bound(p => p.CF_CustomerDrumNumber).Title(Tools.GetStringRessource("Generic_CF_CustomerDrumNumber", "Customer Drum Number")).Hidden();
columns.Bound(p => p.CF_CustomerShipmentDate).ClientTemplate("#= (CF_CustomerShipmentDate !== null) ? kendo.toString(CF_CustomerShipmentDate,'d') : '' #").Title(Tools.GetStringRessource("Generic_CF_CustomerShipmentDate", "Customer Shipment Date")).Hidden();
columns.Bound(p => p.CF_SaleOrderNumber).Title(Tools.GetStringRessource("Generic_CF_SaleOrderNumber", "Sale Order Number")).Hidden();
columns.Bound(p => p.CF_LineOrderNumber).Title(Tools.GetStringRessource("Generic_CF_LineOrderNumber", "Line Order Number")).Hidden();
columns.Bound(p => p.CF_CustomerPurchaseOrderNumber).Title(Tools.GetStringRessource("Generic_CF_CustomerPurchaseOrderNumber", "Customer Purchase Order Number")).Hidden();
columns.Bound(p => p.CF_CustomerLineOrderNumber).Title(Tools.GetStringRessource("Generic_CF_CustomerLineOrderNumber", "Customer Line Order Number")).Hidden();
columns.Bound(p => p.CF_ProductionOrderNumber).Title(Tools.GetStringRessource("Generic_CF_ProductionOrderNumber", "Production Order Number")).Hidden();
columns
.Template(@<
text
></
text
>)
.Title(@Tools.GetStringRessource("AllList_EditBtn", "Action"))
.HeaderTemplate(HeaderTemplate().ToHtmlString())
.Width(90)
.ClientTemplate(ColumnActionTemplate(ViewBag.CanEdit, ViewBag.CanDelete).ToHtmlString());
})
.NoRecords(Tools.GetStringRessource("Grid_NoRecords", "No Data"))
.ColumnMenu()
.Sortable(s => s.SortMode(GridSortMode.MultipleColumn))
.Reorderable(r => r.Columns(true))
.Resizable(r => r.Columns(true))
.Scrollable(sc => sc.Height("auto"))
.Pageable(page => page
.Input(true)
.Numeric(false)
.Info(true)
.PreviousNext(true)
.Messages(message => message
.Display(ViewBag.Title + " {0}-{1}/{2}")
.Empty(Tools.GetStringRessource("Grid_NoRecords", "No Data"))
.Of("/{0}")
.Page(string.Empty)
)
)
Here, i save grid option
window.onbeforeunload =
function
() {
var
elGrid = $(GRID_CABLEDRUM);
if
(elGrid !==
null
)
{
var
grid = elGrid.data(
"kendoGrid"
);
if
(grid !==
null
&& grid.element.length > 0)
{
var
fullOptions = grid.getOptions();
// Récupération uniquement des informations qui m'intéresse (affichage des colonnes, tri, filtre, taille colonnes)
var
options = {
columns: fullOptions.columns,
dataSource: fullOptions.dataSource
}
localStorage.setItem(`_kendoGridCookie_${grid.element[0].id}`, kendo.stringify(options));
}
}
}
Here i add my template toolbar + template header + i manually apply the translations.
var
gridElement = $(
this
);
var
gridId = gridElement[0].id;
var
kendoGrid = $(`
#${gridId}`).data("kendoGrid");
// Récupération des préférences utilisateurs de la grille dans le localStorage
var
kendoGridOptions = localStorage.getItem(`_kendoGridCookie_${gridId}`);
if
(kendoGridOptions && kendoGridOptions !==
null
) {
var
kendoGridOptionsParse = JSON.parse(kendoGridOptions);
// Ajout du template présent dans le toolbar https://github.com/telerik/ui-for-aspnet-mvc-examples/blob/master/grid/grid-preserve-server-toolbar-template-after-set-options/GridPerserveToolbarServerTemplate/Views/Home/Index.cshtml
var
templateToolbar = $(
"#toolbarTemplate"
).html();
if
(templateToolbar !== undefined) {
kendoGridOptionsParse.toolbar = [
{ template: templateToolbar }
];
}
//Récupération de la colonne Action. J'ai pas beaucoup de moyen pour l'identifier donc je me base sur qu'elle est la propriété template
var
colAction = kendoGridOptionsParse.columns.find(c => c.template !== undefined)
//Template header colonne action
var
templateHeader = $(
"#headerTemplate"
).html();
if
(templateHeader !== undefined) {
colAction.headerTemplate = templateHeader;
}
// Template colonne action
var
templateAction = $(
"#columnActionTemplate"
).html();
if
(templateAction !== undefined) {
var
action = decodeURIComponent(templateAction);
colAction.template = action;
}
//Récupération des traductions des entêtes des colonnes
if
(kendoGridOptionsParse !==
null
&& kendoGrid !==
null
&& kendoGridOptionsParse.columns !==
null
&& kendoGrid.columns !==
null
&& kendoGridOptionsParse.columns.length === kendoGrid.columns.length) {
for
(let indice = 0; indice < kendoGridOptionsParse.columns.length; indice++) {
var
kendoGridOptionsColCurrent = kendoGridOptionsParse.columns[indice]
var
listCorrespondanceColonne;
var
titleCurrent =
""
;
// Soit colonne lié à des champs
if
(kendoGridOptionsColCurrent.field !== undefined) {
listCorrespondanceColonne = kendoGrid.columns.filter(c => c.field !== undefined && c.field === kendoGridOptionsColCurrent.field);
}
else
{
// Soit colonne template
listCorrespondanceColonne = kendoGrid.columns.filter(c => c.field === undefined && c.template !== undefined);
}
if
(listCorrespondanceColonne.length === 1) {
titleCurrent = listCorrespondanceColonne[0].title;
}
kendoGridOptionsColCurrent.title = titleCurrent;
}
}
//Rechargement option https://docs.telerik.com/kendo-ui/api/javascript/ui/grid/methods/setoptions
kendoGrid.setOptions(kendoGridOptionsParse);
}
I see that the operation is not solid and I would like to find a more standard solution for the translation of the columns.
Thank you for your time.