inital
This commit is contained in:
12
OCPP.Core.Management/.config/dotnet-tools.json
Normal file
12
OCPP.Core.Management/.config/dotnet-tools.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"version": 1,
|
||||
"isRoot": true,
|
||||
"tools": {
|
||||
"dotnet-ef": {
|
||||
"version": "5.0.1",
|
||||
"commands": [
|
||||
"dotnet-ef"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
33
OCPP.Core.Management/Constants.cs
Normal file
33
OCPP.Core.Management/Constants.cs
Normal file
@@ -0,0 +1,33 @@
|
||||
/*
|
||||
* OCPP.Core - https://github.com/dallmann-consulting/OCPP.Core
|
||||
* Copyright (C) 2020-2021 dallmann consulting GmbH.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace OCPP.Core.Management
|
||||
{
|
||||
public class Constants
|
||||
{
|
||||
public static string AdminRoleName = "Administrator";
|
||||
|
||||
public static string HomeController = "Home";
|
||||
}
|
||||
}
|
||||
105
OCPP.Core.Management/Controllers/AccountController.cs
Normal file
105
OCPP.Core.Management/Controllers/AccountController.cs
Normal file
@@ -0,0 +1,105 @@
|
||||
/*
|
||||
* OCPP.Core - https://github.com/dallmann-consulting/OCPP.Core
|
||||
* Copyright (C) 2020-2021 dallmann consulting GmbH.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using OCPP.Core.Database;
|
||||
using OCPP.Core.Management.Models;
|
||||
|
||||
namespace OCPP.Core.Management.Controllers
|
||||
{
|
||||
[Authorize]
|
||||
public class AccountController : BaseController
|
||||
{
|
||||
public AccountController(
|
||||
UserManager userManager,
|
||||
ILoggerFactory loggerFactory,
|
||||
IConfiguration config,
|
||||
OCPPCoreContext dbContext) : base(userManager, loggerFactory, config, dbContext)
|
||||
{
|
||||
Logger = loggerFactory.CreateLogger<AccountController>();
|
||||
}
|
||||
|
||||
// GET: /Account/Login
|
||||
[HttpGet]
|
||||
[AllowAnonymous]
|
||||
public IActionResult Login(string returnUrl = null)
|
||||
{
|
||||
ViewData["ReturnUrl"] = returnUrl;
|
||||
return View();
|
||||
}
|
||||
|
||||
// POST: /Account/Login
|
||||
[HttpPost]
|
||||
[AllowAnonymous]
|
||||
[ValidateAntiForgeryToken]
|
||||
public async Task<IActionResult> Login(UserModel userModel, string returnUrl = null)
|
||||
{
|
||||
ViewData["ReturnUrl"] = returnUrl;
|
||||
if (ModelState.IsValid)
|
||||
{
|
||||
// This doesn't count login failures towards account lockout
|
||||
// To enable password failures to trigger account lockout, set lockoutOnFailure: true
|
||||
await UserManager.SignIn(this.HttpContext, userModel, false);
|
||||
if (userModel != null && !string.IsNullOrWhiteSpace(userModel.Username))
|
||||
{
|
||||
Logger.LogInformation("User '{0}' logged in", userModel.Username);
|
||||
return RedirectToLocal(returnUrl);
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger.LogInformation("Invalid login attempt: User '{0}'", userModel.Username);
|
||||
ModelState.AddModelError(string.Empty, "Invalid login attempt");
|
||||
return View(userModel);
|
||||
}
|
||||
}
|
||||
|
||||
// If we got this far, something failed, redisplay form
|
||||
return View(userModel);
|
||||
}
|
||||
|
||||
[AllowAnonymous]
|
||||
public async Task<IActionResult> Logout(UserModel userModel)
|
||||
{
|
||||
Logger.LogInformation("Signing our user '{0}'", userModel.Username);
|
||||
await UserManager.SignOut(this.HttpContext);
|
||||
|
||||
return RedirectToAction(nameof(AccountController.Login), "Account");
|
||||
}
|
||||
|
||||
private IActionResult RedirectToLocal(string returnUrl)
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(returnUrl) && Url.IsLocalUrl(returnUrl))
|
||||
{
|
||||
return Redirect(returnUrl);
|
||||
}
|
||||
else
|
||||
{
|
||||
return RedirectToAction(nameof(HomeController.Index), Constants.HomeController);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
177
OCPP.Core.Management/Controllers/ApiController.Reset.cs
Normal file
177
OCPP.Core.Management/Controllers/ApiController.Reset.cs
Normal file
@@ -0,0 +1,177 @@
|
||||
/*
|
||||
* OCPP.Core - https://github.com/dallmann-consulting/OCPP.Core
|
||||
* Copyright (C) 2020-2021 dallmann consulting GmbH.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Net;
|
||||
using System.Net.Http;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.Localization;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Newtonsoft.Json;
|
||||
using OCPP.Core.Database;
|
||||
|
||||
namespace OCPP.Core.Management.Controllers
|
||||
{
|
||||
public partial class ApiController : BaseController
|
||||
{
|
||||
private readonly IStringLocalizer<ApiController> _localizer;
|
||||
|
||||
public ApiController(
|
||||
UserManager userManager,
|
||||
IStringLocalizer<ApiController> localizer,
|
||||
ILoggerFactory loggerFactory,
|
||||
IConfiguration config,
|
||||
OCPPCoreContext dbContext) : base(userManager, loggerFactory, config, dbContext)
|
||||
{
|
||||
_localizer = localizer;
|
||||
Logger = loggerFactory.CreateLogger<ApiController>();
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
|
||||
public async Task<IActionResult> Reset(string Id)
|
||||
{
|
||||
if (User != null && !User.IsInRole(Constants.AdminRoleName))
|
||||
{
|
||||
Logger.LogWarning("Reset: Request by non-administrator: {0}", User?.Identity?.Name);
|
||||
return StatusCode((int)HttpStatusCode.Unauthorized);
|
||||
}
|
||||
|
||||
int httpStatuscode = (int)HttpStatusCode.OK;
|
||||
string resultContent = string.Empty;
|
||||
|
||||
Logger.LogTrace("Reset: Request to restart chargepoint '{0}'", Id);
|
||||
if (!string.IsNullOrEmpty(Id))
|
||||
{
|
||||
try
|
||||
{
|
||||
ChargePoint chargePoint = DbContext.ChargePoints.Find(Id);
|
||||
if (chargePoint != null)
|
||||
{
|
||||
string serverApiUrl = base.Config.GetValue<string>("ServerApiUrl");
|
||||
string apiKeyConfig = base.Config.GetValue<string>("ApiKey");
|
||||
if (!string.IsNullOrEmpty(serverApiUrl))
|
||||
{
|
||||
try
|
||||
{
|
||||
using (var httpClient = new HttpClient())
|
||||
{
|
||||
if (!serverApiUrl.EndsWith('/'))
|
||||
{
|
||||
serverApiUrl += "/";
|
||||
}
|
||||
Uri uri = new Uri(serverApiUrl);
|
||||
uri = new Uri(uri, $"Reset/{Uri.EscapeDataString(Id)}");
|
||||
httpClient.Timeout = new TimeSpan(0, 0, 4); // use short timeout
|
||||
|
||||
// API-Key authentication?
|
||||
if (!string.IsNullOrWhiteSpace(apiKeyConfig))
|
||||
{
|
||||
httpClient.DefaultRequestHeaders.Add("X-API-Key", apiKeyConfig);
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger.LogWarning("Reset: No API-Key configured!");
|
||||
}
|
||||
|
||||
HttpResponseMessage response = await httpClient.GetAsync(uri);
|
||||
if (response.StatusCode == HttpStatusCode.OK)
|
||||
{
|
||||
string jsonResult = await response.Content.ReadAsStringAsync();
|
||||
if (!string.IsNullOrEmpty(jsonResult))
|
||||
{
|
||||
try
|
||||
{
|
||||
dynamic jsonObject = JsonConvert.DeserializeObject(jsonResult);
|
||||
Logger.LogInformation("Reset: Result of API request is '{0}'", jsonResult);
|
||||
string status = jsonObject.status;
|
||||
switch (status)
|
||||
{
|
||||
case "Accepted":
|
||||
resultContent = _localizer["ResetAccepted"];
|
||||
break;
|
||||
case "Rejected":
|
||||
resultContent = _localizer["ResetRejected"];
|
||||
break;
|
||||
case "Scheduled":
|
||||
resultContent = _localizer["ResetScheduled"];
|
||||
break;
|
||||
default:
|
||||
resultContent = string.Format(_localizer["ResetUnknownStatus"], status);
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch (Exception exp)
|
||||
{
|
||||
Logger.LogError(exp, "Reset: Error in JSON result => {0}", exp.Message);
|
||||
httpStatuscode = (int)HttpStatusCode.OK;
|
||||
resultContent = _localizer["ResetError"];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger.LogError("Reset: Result of API request is empty");
|
||||
httpStatuscode = (int)HttpStatusCode.OK;
|
||||
resultContent = _localizer["ResetError"];
|
||||
}
|
||||
}
|
||||
else if (response.StatusCode == HttpStatusCode.NotFound)
|
||||
{
|
||||
// Chargepoint offline
|
||||
httpStatuscode = (int)HttpStatusCode.OK;
|
||||
resultContent = _localizer["ResetOffline"];
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger.LogError("Reset: Result of API request => httpStatus={0}", response.StatusCode);
|
||||
httpStatuscode = (int)HttpStatusCode.OK;
|
||||
resultContent = _localizer["ResetError"];
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception exp)
|
||||
{
|
||||
Logger.LogError(exp, "Reset: Error in API request => {0}", exp.Message);
|
||||
httpStatuscode = (int)HttpStatusCode.OK;
|
||||
resultContent = _localizer["ResetError"];
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger.LogWarning("Reset: Error loading charge point '{0}' from database", Id);
|
||||
httpStatuscode = (int)HttpStatusCode.OK;
|
||||
resultContent = _localizer["UnknownChargepoint"];
|
||||
}
|
||||
}
|
||||
catch (Exception exp)
|
||||
{
|
||||
Logger.LogError(exp, "Reset: Error loading charge point from database");
|
||||
httpStatuscode = (int)HttpStatusCode.OK;
|
||||
resultContent = _localizer["ResetError"];
|
||||
}
|
||||
}
|
||||
|
||||
return StatusCode(httpStatuscode, resultContent);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,165 @@
|
||||
/*
|
||||
* OCPP.Core - https://github.com/dallmann-consulting/OCPP.Core
|
||||
* Copyright (C) 2020-2021 dallmann consulting GmbH.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Net;
|
||||
using System.Net.Http;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Newtonsoft.Json;
|
||||
using OCPP.Core.Database;
|
||||
|
||||
namespace OCPP.Core.Management.Controllers
|
||||
{
|
||||
public partial class ApiController : BaseController
|
||||
{
|
||||
[Authorize]
|
||||
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
|
||||
public async Task<IActionResult> UnlockConnector(string Id)
|
||||
{
|
||||
if (User != null && !User.IsInRole(Constants.AdminRoleName))
|
||||
{
|
||||
Logger.LogWarning("UnlockConnector: Request by non-administrator: {0}", User?.Identity?.Name);
|
||||
return StatusCode((int)HttpStatusCode.Unauthorized);
|
||||
}
|
||||
|
||||
int httpStatuscode = (int)HttpStatusCode.OK;
|
||||
string resultContent = string.Empty;
|
||||
|
||||
Logger.LogTrace("UnlockConnector: Request to unlock chargepoint '{0}'", Id);
|
||||
if (!string.IsNullOrEmpty(Id))
|
||||
{
|
||||
try
|
||||
{
|
||||
ChargePoint chargePoint = DbContext.ChargePoints.Find(Id);
|
||||
if (chargePoint != null)
|
||||
{
|
||||
string serverApiUrl = base.Config.GetValue<string>("ServerApiUrl");
|
||||
string apiKeyConfig = base.Config.GetValue<string>("ApiKey");
|
||||
if (!string.IsNullOrEmpty(serverApiUrl))
|
||||
{
|
||||
try
|
||||
{
|
||||
using (var httpClient = new HttpClient())
|
||||
{
|
||||
if (!serverApiUrl.EndsWith('/'))
|
||||
{
|
||||
serverApiUrl += "/";
|
||||
}
|
||||
Uri uri = new Uri(serverApiUrl);
|
||||
uri = new Uri(uri, $"UnlockConnector/{Uri.EscapeDataString(Id)}");
|
||||
httpClient.Timeout = new TimeSpan(0, 0, 4); // use short timeout
|
||||
|
||||
// API-Key authentication?
|
||||
if (!string.IsNullOrWhiteSpace(apiKeyConfig))
|
||||
{
|
||||
httpClient.DefaultRequestHeaders.Add("X-API-Key", apiKeyConfig);
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger.LogWarning("UnlockConnector: No API-Key configured!");
|
||||
}
|
||||
|
||||
HttpResponseMessage response = await httpClient.GetAsync(uri);
|
||||
if (response.StatusCode == HttpStatusCode.OK)
|
||||
{
|
||||
string jsonResult = await response.Content.ReadAsStringAsync();
|
||||
if (!string.IsNullOrEmpty(jsonResult))
|
||||
{
|
||||
try
|
||||
{
|
||||
dynamic jsonObject = JsonConvert.DeserializeObject(jsonResult);
|
||||
Logger.LogInformation("UnlockConnector: Result of API request is '{0}'", jsonResult);
|
||||
string status = jsonObject.status;
|
||||
switch (status)
|
||||
{
|
||||
case "Unlocked":
|
||||
resultContent = _localizer["UnlockConnectorAccepted"];
|
||||
break;
|
||||
case "UnlockFailed":
|
||||
case "OngoingAuthorizedTransaction":
|
||||
case "UnknownConnector":
|
||||
resultContent = _localizer["UnlockConnectorFailed"];
|
||||
break;
|
||||
case "NotSupported":
|
||||
resultContent = _localizer["UnlockConnectorNotSupported"];
|
||||
break;
|
||||
default:
|
||||
resultContent = string.Format(_localizer["UnlockConnectorUnknownStatus"], status);
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch (Exception exp)
|
||||
{
|
||||
Logger.LogError(exp, "UnlockConnector: Error in JSON result => {0}", exp.Message);
|
||||
httpStatuscode = (int)HttpStatusCode.OK;
|
||||
resultContent = _localizer["UnlockConnectorError"];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger.LogError("UnlockConnector: Result of API request is empty");
|
||||
httpStatuscode = (int)HttpStatusCode.OK;
|
||||
resultContent = _localizer["UnlockConnectorError"];
|
||||
}
|
||||
}
|
||||
else if (response.StatusCode == HttpStatusCode.NotFound)
|
||||
{
|
||||
// Chargepoint offline
|
||||
httpStatuscode = (int)HttpStatusCode.OK;
|
||||
resultContent = _localizer["UnlockConnectorOffline"];
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger.LogError("UnlockConnector: Result of API request => httpStatus={0}", response.StatusCode);
|
||||
httpStatuscode = (int)HttpStatusCode.OK;
|
||||
resultContent = _localizer["UnlockConnectorError"];
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception exp)
|
||||
{
|
||||
Logger.LogError(exp, "UnlockConnector: Error in API request => {0}", exp.Message);
|
||||
httpStatuscode = (int)HttpStatusCode.OK;
|
||||
resultContent = _localizer["UnlockConnectorError"];
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger.LogWarning("UnlockConnector: Error loading charge point '{0}' from database", Id);
|
||||
httpStatuscode = (int)HttpStatusCode.OK;
|
||||
resultContent = _localizer["UnknownChargepoint"];
|
||||
}
|
||||
}
|
||||
catch (Exception exp)
|
||||
{
|
||||
Logger.LogError(exp, "UnlockConnector: Error loading charge point from database");
|
||||
httpStatuscode = (int)HttpStatusCode.OK;
|
||||
resultContent = _localizer["UnlockConnectorError"];
|
||||
}
|
||||
}
|
||||
|
||||
return StatusCode(httpStatuscode, resultContent);
|
||||
}
|
||||
}
|
||||
}
|
||||
52
OCPP.Core.Management/Controllers/BaseController.cs
Normal file
52
OCPP.Core.Management/Controllers/BaseController.cs
Normal file
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
* OCPP.Core - https://github.com/dallmann-consulting/OCPP.Core
|
||||
* Copyright (C) 2020-2021 dallmann consulting GmbH.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using OCPP.Core.Database;
|
||||
using OCPP.Core.Management.Models;
|
||||
|
||||
namespace OCPP.Core.Management.Controllers
|
||||
{
|
||||
public class BaseController : Controller
|
||||
{
|
||||
protected UserManager UserManager { get; private set; }
|
||||
|
||||
protected ILogger Logger { get; set; }
|
||||
|
||||
protected IConfiguration Config { get; private set; }
|
||||
|
||||
protected OCPPCoreContext DbContext { get; private set; }
|
||||
|
||||
public BaseController(
|
||||
UserManager userManager,
|
||||
ILoggerFactory loggerFactory,
|
||||
IConfiguration config,
|
||||
OCPPCoreContext dbContext)
|
||||
{
|
||||
UserManager = userManager;
|
||||
Config = config;
|
||||
DbContext = dbContext;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
162
OCPP.Core.Management/Controllers/HomeController.ChargePoint.cs
Normal file
162
OCPP.Core.Management/Controllers/HomeController.ChargePoint.cs
Normal file
@@ -0,0 +1,162 @@
|
||||
/*
|
||||
* OCPP.Core - https://github.com/dallmann-consulting/OCPP.Core
|
||||
* Copyright (C) 2020-2021 dallmann consulting GmbH.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using OCPP.Core.Database;
|
||||
using OCPP.Core.Management.Models;
|
||||
|
||||
namespace OCPP.Core.Management.Controllers
|
||||
{
|
||||
public partial class HomeController : BaseController
|
||||
{
|
||||
[Authorize]
|
||||
public IActionResult ChargePoint(string Id, ChargePointViewModel cpvm)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (User != null && !User.IsInRole(Constants.AdminRoleName))
|
||||
{
|
||||
Logger.LogWarning("ChargePoint: Request by non-administrator: {0}", User?.Identity?.Name);
|
||||
TempData["ErrMsgKey"] = "AccessDenied";
|
||||
return RedirectToAction("Error", new { Id = "" });
|
||||
}
|
||||
|
||||
cpvm.CurrentId = Id;
|
||||
|
||||
Logger.LogTrace("ChargePoint: Loading charge points...");
|
||||
List<ChargePoint> dbChargePoints = DbContext.ChargePoints.ToList<ChargePoint>();
|
||||
Logger.LogInformation("ChargePoint: Found {0} charge points", dbChargePoints.Count);
|
||||
|
||||
ChargePoint currentChargePoint = null;
|
||||
if (!string.IsNullOrEmpty(Id))
|
||||
{
|
||||
foreach (ChargePoint cp in dbChargePoints)
|
||||
{
|
||||
if (cp.ChargePointId.Equals(Id, StringComparison.InvariantCultureIgnoreCase))
|
||||
{
|
||||
currentChargePoint = cp;
|
||||
Logger.LogTrace("ChargePoint: Current charge point: {0} / {1}", cp.ChargePointId, cp.Name);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (Request.Method == "POST")
|
||||
{
|
||||
string errorMsg = null;
|
||||
|
||||
if (Id == "@")
|
||||
{
|
||||
Logger.LogTrace("ChargePoint: Creating new charge point...");
|
||||
|
||||
// Create new tag
|
||||
if (string.IsNullOrWhiteSpace(cpvm.ChargePointId))
|
||||
{
|
||||
errorMsg = _localizer["ChargePointIdRequired"].Value;
|
||||
Logger.LogInformation("ChargePoint: New => no charge point ID entered");
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(errorMsg))
|
||||
{
|
||||
// check if duplicate
|
||||
foreach (ChargePoint cp in dbChargePoints)
|
||||
{
|
||||
if (cp.ChargePointId.Equals(cpvm.ChargePointId, StringComparison.InvariantCultureIgnoreCase))
|
||||
{
|
||||
// id already exists
|
||||
errorMsg = _localizer["ChargePointIdExists"].Value;
|
||||
Logger.LogInformation("ChargePoint: New => charge point ID already exists: {0}", cpvm.ChargePointId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(errorMsg))
|
||||
{
|
||||
// Save tag in DB
|
||||
ChargePoint newChargePoint = new ChargePoint();
|
||||
newChargePoint.ChargePointId = cpvm.ChargePointId;
|
||||
newChargePoint.Name = cpvm.Name;
|
||||
newChargePoint.Comment = cpvm.Comment;
|
||||
newChargePoint.Username = cpvm.Username;
|
||||
newChargePoint.Password = cpvm.Password;
|
||||
newChargePoint.ClientCertThumb = cpvm.ClientCertThumb;
|
||||
DbContext.ChargePoints.Add(newChargePoint);
|
||||
DbContext.SaveChanges();
|
||||
Logger.LogInformation("ChargePoint: New => charge point saved: {0} / {1}", cpvm.ChargePointId, cpvm.Name);
|
||||
}
|
||||
else
|
||||
{
|
||||
ViewBag.ErrorMsg = errorMsg;
|
||||
return View("ChargePointDetail", cpvm);
|
||||
}
|
||||
}
|
||||
else if (currentChargePoint.ChargePointId == Id)
|
||||
{
|
||||
// Save existing charge point
|
||||
Logger.LogTrace("ChargePoint: Saving charge point '{0}'", Id);
|
||||
currentChargePoint.Name = cpvm.Name;
|
||||
currentChargePoint.Comment = cpvm.Comment;
|
||||
currentChargePoint.Username = cpvm.Username;
|
||||
currentChargePoint.Password = cpvm.Password;
|
||||
currentChargePoint.ClientCertThumb = cpvm.ClientCertThumb;
|
||||
|
||||
DbContext.SaveChanges();
|
||||
Logger.LogInformation("ChargePoint: Edit => charge point saved: {0} / {1}", cpvm.ChargePointId, cpvm.Name);
|
||||
}
|
||||
|
||||
return RedirectToAction("ChargePoint", new { Id = "" });
|
||||
}
|
||||
else
|
||||
{
|
||||
// Display charge point
|
||||
cpvm = new ChargePointViewModel();
|
||||
cpvm.ChargePoints = dbChargePoints;
|
||||
cpvm.CurrentId = Id;
|
||||
|
||||
if (currentChargePoint!= null)
|
||||
{
|
||||
cpvm = new ChargePointViewModel();
|
||||
cpvm.ChargePointId = currentChargePoint.ChargePointId;
|
||||
cpvm.Name = currentChargePoint.Name;
|
||||
cpvm.Comment = currentChargePoint.Comment;
|
||||
cpvm.Username = currentChargePoint.Username;
|
||||
cpvm.Password = currentChargePoint.Password;
|
||||
cpvm.ClientCertThumb = currentChargePoint.ClientCertThumb;
|
||||
}
|
||||
|
||||
string viewName = (!string.IsNullOrEmpty(cpvm.ChargePointId) || Id == "@") ? "ChargePointDetail" : "ChargePointList";
|
||||
return View(viewName, cpvm);
|
||||
}
|
||||
}
|
||||
catch (Exception exp)
|
||||
{
|
||||
Logger.LogError(exp, "ChargePoint: Error loading charge points from database");
|
||||
TempData["ErrMessage"] = exp.Message;
|
||||
return RedirectToAction("Error", new { Id = "" });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
163
OCPP.Core.Management/Controllers/HomeController.ChargeTag.cs
Normal file
163
OCPP.Core.Management/Controllers/HomeController.ChargeTag.cs
Normal file
@@ -0,0 +1,163 @@
|
||||
/*
|
||||
* OCPP.Core - https://github.com/dallmann-consulting/OCPP.Core
|
||||
* Copyright (C) 2020-2021 dallmann consulting GmbH.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.Extensions.Localization;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using OCPP.Core.Database;
|
||||
using OCPP.Core.Management.Models;
|
||||
|
||||
namespace OCPP.Core.Management.Controllers
|
||||
{
|
||||
public partial class HomeController : BaseController
|
||||
{
|
||||
[Authorize]
|
||||
public IActionResult ChargeTag(string Id, ChargeTagViewModel ctvm)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (User != null && !User.IsInRole(Constants.AdminRoleName))
|
||||
{
|
||||
Logger.LogWarning("ChargeTag: Request by non-administrator: {0}", User?.Identity?.Name);
|
||||
TempData["ErrMsgKey"] = "AccessDenied";
|
||||
return RedirectToAction("Error", new { Id = "" });
|
||||
}
|
||||
|
||||
ViewBag.DatePattern = CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern;
|
||||
ViewBag.Language = CultureInfo.CurrentCulture.TwoLetterISOLanguageName;
|
||||
ctvm.CurrentTagId = Id;
|
||||
|
||||
Logger.LogTrace("ChargeTag: Loading charge tags...");
|
||||
List<ChargeTag> dbChargeTags = DbContext.ChargeTags.ToList<ChargeTag>();
|
||||
Logger.LogInformation("ChargeTag: Found {0} charge tags", dbChargeTags.Count);
|
||||
|
||||
ChargeTag currentChargeTag = null;
|
||||
if (!string.IsNullOrEmpty(Id))
|
||||
{
|
||||
foreach (ChargeTag tag in dbChargeTags)
|
||||
{
|
||||
if (tag.TagId.Equals(Id, StringComparison.InvariantCultureIgnoreCase))
|
||||
{
|
||||
currentChargeTag = tag;
|
||||
Logger.LogTrace("ChargeTag: Current charge tag: {0} / {1}", tag.TagId, tag.TagName);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (Request.Method == "POST")
|
||||
{
|
||||
string errorMsg = null;
|
||||
|
||||
if (Id == "@")
|
||||
{
|
||||
Logger.LogTrace("ChargeTag: Creating new charge tag...");
|
||||
|
||||
// Create new tag
|
||||
if (string.IsNullOrWhiteSpace(ctvm.TagId))
|
||||
{
|
||||
errorMsg = _localizer["ChargeTagIdRequired"].Value;
|
||||
Logger.LogInformation("ChargeTag: New => no charge tag ID entered");
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(errorMsg))
|
||||
{
|
||||
// check if duplicate
|
||||
foreach (ChargeTag tag in dbChargeTags)
|
||||
{
|
||||
if (tag.TagId.Equals(ctvm.TagId, StringComparison.InvariantCultureIgnoreCase))
|
||||
{
|
||||
// tag-id already exists
|
||||
errorMsg = _localizer["ChargeTagIdExists"].Value;
|
||||
Logger.LogInformation("ChargeTag: New => charge tag ID already exists: {0}", ctvm.TagId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(errorMsg))
|
||||
{
|
||||
// Save tag in DB
|
||||
ChargeTag newTag = new ChargeTag();
|
||||
newTag.TagId = ctvm.TagId;
|
||||
newTag.TagName = ctvm.TagName;
|
||||
newTag.ParentTagId = ctvm.ParentTagId;
|
||||
newTag.ExpiryDate = ctvm.ExpiryDate;
|
||||
newTag.Blocked = ctvm.Blocked;
|
||||
DbContext.ChargeTags.Add(newTag);
|
||||
DbContext.SaveChanges();
|
||||
Logger.LogInformation("ChargeTag: New => charge tag saved: {0} / {1}", ctvm.TagId, ctvm.TagName);
|
||||
}
|
||||
else
|
||||
{
|
||||
ViewBag.ErrorMsg = errorMsg;
|
||||
return View("ChargeTagDetail", ctvm);
|
||||
}
|
||||
}
|
||||
else if (currentChargeTag.TagId == Id)
|
||||
{
|
||||
// Save existing tag
|
||||
currentChargeTag.TagName = ctvm.TagName;
|
||||
currentChargeTag.ParentTagId = ctvm.ParentTagId;
|
||||
currentChargeTag.ExpiryDate = ctvm.ExpiryDate;
|
||||
currentChargeTag.Blocked = ctvm.Blocked;
|
||||
DbContext.SaveChanges();
|
||||
Logger.LogInformation("ChargeTag: Edit => charge tag saved: {0} / {1}", ctvm.TagId, ctvm.TagName);
|
||||
}
|
||||
|
||||
return RedirectToAction("ChargeTag", new { Id = "" });
|
||||
}
|
||||
else
|
||||
{
|
||||
// List all charge tags
|
||||
ctvm = new ChargeTagViewModel();
|
||||
ctvm.ChargeTags = dbChargeTags;
|
||||
ctvm.CurrentTagId = Id;
|
||||
|
||||
if (currentChargeTag != null)
|
||||
{
|
||||
ctvm.TagId = currentChargeTag.TagId;
|
||||
ctvm.TagName = currentChargeTag.TagName;
|
||||
ctvm.ParentTagId = currentChargeTag.ParentTagId;
|
||||
ctvm.ExpiryDate = currentChargeTag.ExpiryDate;
|
||||
ctvm.Blocked = (currentChargeTag.Blocked != null) && currentChargeTag.Blocked.Value;
|
||||
}
|
||||
|
||||
string viewName = (!string.IsNullOrEmpty(ctvm.TagId) || Id=="@") ? "ChargeTagDetail" : "ChargeTagList";
|
||||
return View(viewName, ctvm);
|
||||
}
|
||||
|
||||
}
|
||||
catch (Exception exp)
|
||||
{
|
||||
Logger.LogError(exp, "ChargeTag: Error loading charge tags from database");
|
||||
TempData["ErrMessage"] = exp.Message;
|
||||
return RedirectToAction("Error", new { Id = "" });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
113
OCPP.Core.Management/Controllers/HomeController.Conector.cs
Normal file
113
OCPP.Core.Management/Controllers/HomeController.Conector.cs
Normal file
@@ -0,0 +1,113 @@
|
||||
/*
|
||||
* OCPP.Core - https://github.com/dallmann-consulting/OCPP.Core
|
||||
* Copyright (C) 2020-2021 dallmann consulting GmbH.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.Extensions.Localization;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using OCPP.Core.Database;
|
||||
using OCPP.Core.Management.Models;
|
||||
|
||||
namespace OCPP.Core.Management.Controllers
|
||||
{
|
||||
public partial class HomeController : BaseController
|
||||
{
|
||||
[Authorize]
|
||||
public IActionResult Connector(string Id, string ConnectorId, ConnectorStatusViewModel csvm)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (User != null && !User.IsInRole(Constants.AdminRoleName))
|
||||
{
|
||||
Logger.LogWarning("Connector: Request by non-administrator: {0}", User?.Identity?.Name);
|
||||
TempData["ErrMsgKey"] = "AccessDenied";
|
||||
return RedirectToAction("Error", new { Id = "" });
|
||||
}
|
||||
|
||||
ViewBag.DatePattern = CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern;
|
||||
ViewBag.Language = CultureInfo.CurrentCulture.TwoLetterISOLanguageName;
|
||||
|
||||
Logger.LogTrace("Connector: Loading connectors...");
|
||||
List<ConnectorStatus> dbConnectorStatuses = DbContext.ConnectorStatuses.ToList<ConnectorStatus>();
|
||||
Logger.LogInformation("Connector: Found {0} connectors", dbConnectorStatuses.Count);
|
||||
|
||||
ConnectorStatus currentConnectorStatus = null;
|
||||
if (!string.IsNullOrEmpty(Id) && !string.IsNullOrEmpty(ConnectorId))
|
||||
{
|
||||
foreach (ConnectorStatus cs in dbConnectorStatuses)
|
||||
{
|
||||
if (cs.ChargePointId.Equals(Id, StringComparison.InvariantCultureIgnoreCase) &&
|
||||
cs.ConnectorId.ToString().Equals(ConnectorId, StringComparison.InvariantCultureIgnoreCase))
|
||||
{
|
||||
currentConnectorStatus = cs;
|
||||
Logger.LogTrace("Connector: Current connector: {0} / {1}", cs.ChargePointId, cs.ConnectorId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (Request.Method == "POST")
|
||||
{
|
||||
if (currentConnectorStatus.ChargePointId == Id)
|
||||
{
|
||||
// Save connector
|
||||
currentConnectorStatus.ConnectorName = csvm.ConnectorName;
|
||||
DbContext.SaveChanges();
|
||||
Logger.LogInformation("Connector: Edit => Connector saved: {0} / {1} => '{2}'", csvm.ChargePointId, csvm.ConnectorId, csvm.ConnectorName);
|
||||
}
|
||||
|
||||
return RedirectToAction("Connector", new { Id = "" });
|
||||
}
|
||||
else
|
||||
{
|
||||
// List all charge tags
|
||||
csvm = new ConnectorStatusViewModel();
|
||||
csvm.ConnectorStatuses = dbConnectorStatuses;
|
||||
|
||||
if (currentConnectorStatus != null)
|
||||
{
|
||||
csvm.ChargePointId = currentConnectorStatus.ChargePointId;
|
||||
csvm.ConnectorId = currentConnectorStatus.ConnectorId;
|
||||
csvm.ConnectorName = currentConnectorStatus.ConnectorName;
|
||||
csvm.LastStatus = currentConnectorStatus.LastStatus;
|
||||
csvm.LastStatusTime = currentConnectorStatus.LastStatusTime;
|
||||
csvm.LastMeter = currentConnectorStatus.LastMeter;
|
||||
csvm.LastMeterTime = currentConnectorStatus.LastMeterTime;
|
||||
}
|
||||
|
||||
string viewName = (currentConnectorStatus != null) ? "ConnectorDetail" : "ConnectorList";
|
||||
return View(viewName, csvm);
|
||||
}
|
||||
}
|
||||
catch (Exception exp)
|
||||
{
|
||||
Logger.LogError(exp, "Connector: Error loading connectors from database");
|
||||
TempData["ErrMessage"] = exp.Message;
|
||||
return RedirectToAction("Error", new { Id = "" });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
234
OCPP.Core.Management/Controllers/HomeController.Export.cs
Normal file
234
OCPP.Core.Management/Controllers/HomeController.Export.cs
Normal file
@@ -0,0 +1,234 @@
|
||||
/*
|
||||
* OCPP.Core - https://github.com/dallmann-consulting/OCPP.Core
|
||||
* Copyright (C) 2020-2021 dallmann consulting GmbH.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.Extensions.Localization;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using OCPP.Core.Database;
|
||||
using OCPP.Core.Management.Models;
|
||||
|
||||
namespace OCPP.Core.Management.Controllers
|
||||
{
|
||||
public partial class HomeController : BaseController
|
||||
{
|
||||
const char CSV_Seperator = ';';
|
||||
|
||||
[Authorize]
|
||||
public IActionResult Export(string Id, string ConnectorId)
|
||||
{
|
||||
Logger.LogTrace("Export: Loading charge point transactions...");
|
||||
|
||||
int currentConnectorId = -1;
|
||||
int.TryParse(ConnectorId, out currentConnectorId);
|
||||
|
||||
TransactionListViewModel tlvm = new TransactionListViewModel();
|
||||
tlvm.CurrentChargePointId = Id;
|
||||
tlvm.CurrentConnectorId = currentConnectorId;
|
||||
tlvm.ConnectorStatuses = new List<ConnectorStatus>();
|
||||
tlvm.Transactions = new List<Transaction>();
|
||||
|
||||
try
|
||||
{
|
||||
string ts = Request.Query["t"];
|
||||
int days = 30;
|
||||
if (ts == "2")
|
||||
{
|
||||
// 90 days
|
||||
days = 90;
|
||||
tlvm.Timespan = 2;
|
||||
}
|
||||
else if (ts == "3")
|
||||
{
|
||||
// 365 days
|
||||
days = 365;
|
||||
tlvm.Timespan = 3;
|
||||
}
|
||||
else
|
||||
{
|
||||
// 30 days
|
||||
days = 30;
|
||||
tlvm.Timespan = 1;
|
||||
}
|
||||
|
||||
string currentConnectorName = string.Empty;
|
||||
|
||||
Logger.LogTrace("Export: Loading charge points...");
|
||||
tlvm.ConnectorStatuses = DbContext.ConnectorStatuses.ToList<ConnectorStatus>();
|
||||
|
||||
// Preferred: use specific connector name
|
||||
foreach (ConnectorStatus cs in tlvm.ConnectorStatuses)
|
||||
{
|
||||
if (cs.ChargePointId == Id && cs.ConnectorId == currentConnectorId)
|
||||
{
|
||||
currentConnectorName = cs.ConnectorName;
|
||||
/*
|
||||
if (string.IsNullOrEmpty(tlvm.CurrentConnectorName))
|
||||
{
|
||||
currentConnectorName = $"{Id}:{cs.ConnectorId}";
|
||||
}
|
||||
*/
|
||||
break;
|
||||
}
|
||||
}
|
||||
// default: combined name with charge point and connector
|
||||
if (string.IsNullOrEmpty(currentConnectorName))
|
||||
{
|
||||
tlvm.ChargePoints = DbContext.ChargePoints.ToList<ChargePoint>();
|
||||
foreach(ChargePoint cp in tlvm.ChargePoints)
|
||||
{
|
||||
if (cp.ChargePointId == Id)
|
||||
{
|
||||
currentConnectorName = $"{cp.Name}:{currentConnectorId}";
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (string.IsNullOrEmpty(currentConnectorName))
|
||||
{
|
||||
// Fallback: ID + connector
|
||||
currentConnectorName = $"{Id}:{currentConnectorId}";
|
||||
}
|
||||
}
|
||||
|
||||
// load charge tags for name resolution
|
||||
Logger.LogTrace("Export: Loading charge tags...");
|
||||
List<ChargeTag> chargeTags = DbContext.ChargeTags.ToList<ChargeTag>();
|
||||
tlvm.ChargeTags = new Dictionary<string, ChargeTag>();
|
||||
if (chargeTags != null)
|
||||
{
|
||||
foreach (ChargeTag tag in chargeTags)
|
||||
{
|
||||
tlvm.ChargeTags.Add(tag.TagId, tag);
|
||||
}
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(tlvm.CurrentChargePointId))
|
||||
{
|
||||
Logger.LogTrace("Export: Loading charge point transactions...");
|
||||
tlvm.Transactions = DbContext.Transactions
|
||||
.Where(t => t.ChargePointId == tlvm.CurrentChargePointId &&
|
||||
t.ConnectorId == tlvm.CurrentConnectorId &&
|
||||
t.StartTime >= DateTime.UtcNow.AddDays(-1 * days))
|
||||
.OrderByDescending(t => t.TransactionId)
|
||||
.ToList<Transaction>();
|
||||
}
|
||||
|
||||
StringBuilder connectorName = new StringBuilder(currentConnectorName);
|
||||
foreach (char c in Path.GetInvalidFileNameChars())
|
||||
{
|
||||
connectorName.Replace(c, '_');
|
||||
}
|
||||
|
||||
string filename = string.Format("Transactions_{0}.csv", connectorName);
|
||||
string csv = CreateCsv(tlvm, currentConnectorName);
|
||||
Logger.LogInformation("Export: File => {0} Chars / Name '{1}'", csv.Length, filename);
|
||||
|
||||
return File(Encoding.GetEncoding("ISO-8859-1").GetBytes(csv), "text/csv", filename);
|
||||
}
|
||||
catch (Exception exp)
|
||||
{
|
||||
Logger.LogError(exp, "Export: Error loading data from database");
|
||||
}
|
||||
|
||||
return View(tlvm);
|
||||
}
|
||||
|
||||
private string CreateCsv(TransactionListViewModel tlvm, string currentConnectorName)
|
||||
{
|
||||
StringBuilder csv = new StringBuilder(8192);
|
||||
csv.Append(EscapeCsvValue(_localizer["Connector"]));
|
||||
csv.Append(CSV_Seperator);
|
||||
csv.Append(EscapeCsvValue(_localizer["StartTime"]));
|
||||
csv.Append(CSV_Seperator);
|
||||
csv.Append(EscapeCsvValue(_localizer["StartTag"]));
|
||||
csv.Append(CSV_Seperator);
|
||||
csv.Append(EscapeCsvValue(_localizer["StartMeter"]));
|
||||
csv.Append(CSV_Seperator);
|
||||
csv.Append(EscapeCsvValue(_localizer["StopTime"]));
|
||||
csv.Append(CSV_Seperator);
|
||||
csv.Append(EscapeCsvValue(_localizer["StopTag"]));
|
||||
csv.Append(CSV_Seperator);
|
||||
csv.Append(EscapeCsvValue(_localizer["StopMeter"]));
|
||||
csv.Append(CSV_Seperator);
|
||||
csv.Append(EscapeCsvValue(_localizer["ChargeSum"]));
|
||||
|
||||
if (tlvm != null && tlvm.Transactions != null)
|
||||
{
|
||||
foreach (Transaction t in tlvm.Transactions)
|
||||
{
|
||||
string startTag = t.StartTagId;
|
||||
string stopTag = t.StopTagId;
|
||||
if (!string.IsNullOrEmpty(t.StartTagId) && tlvm.ChargeTags != null && tlvm.ChargeTags.ContainsKey(t.StartTagId))
|
||||
{
|
||||
startTag = tlvm.ChargeTags[t.StartTagId]?.TagName;
|
||||
}
|
||||
if (!string.IsNullOrEmpty(t.StopTagId) && tlvm.ChargeTags != null && tlvm.ChargeTags.ContainsKey(t.StopTagId))
|
||||
{
|
||||
stopTag = tlvm.ChargeTags[t.StopTagId]?.TagName;
|
||||
}
|
||||
|
||||
csv.AppendLine();
|
||||
csv.Append(EscapeCsvValue(currentConnectorName));
|
||||
csv.Append(CSV_Seperator);
|
||||
csv.Append(EscapeCsvValue(t.StartTime.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss")));
|
||||
csv.Append(CSV_Seperator);
|
||||
csv.Append(EscapeCsvValue(startTag));
|
||||
csv.Append(CSV_Seperator);
|
||||
csv.Append(EscapeCsvValue(string.Format("{0:0.0##}", t.MeterStart)));
|
||||
csv.Append(CSV_Seperator);
|
||||
csv.Append(EscapeCsvValue(((t.StopTime != null) ? t.StopTime.Value.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss") : string.Empty)));
|
||||
csv.Append(CSV_Seperator);
|
||||
csv.Append(EscapeCsvValue(stopTag));
|
||||
csv.Append(CSV_Seperator);
|
||||
csv.Append(EscapeCsvValue(((t.MeterStop != null) ? string.Format("{0:0.0##}", t.MeterStop) : string.Empty)));
|
||||
csv.Append(CSV_Seperator);
|
||||
csv.Append(EscapeCsvValue(((t.MeterStop != null) ? string.Format("{0:0.0##}", (t.MeterStop - t.MeterStart)) : string.Empty)));
|
||||
}
|
||||
}
|
||||
|
||||
return csv.ToString();
|
||||
}
|
||||
|
||||
private string EscapeCsvValue(string value)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(value))
|
||||
{
|
||||
if (value.Contains(CSV_Seperator))
|
||||
{
|
||||
if (value.Contains('"'))
|
||||
{
|
||||
// replace '"' with '""'
|
||||
value.Replace("\"", "\"\"");
|
||||
}
|
||||
|
||||
// put value in "
|
||||
value = string.Format("\"{0}\"", value);
|
||||
}
|
||||
}
|
||||
return value;
|
||||
}
|
||||
}
|
||||
}
|
||||
334
OCPP.Core.Management/Controllers/HomeController.Index.cs
Normal file
334
OCPP.Core.Management/Controllers/HomeController.Index.cs
Normal file
@@ -0,0 +1,334 @@
|
||||
/*
|
||||
* OCPP.Core - https://github.com/dallmann-consulting/OCPP.Core
|
||||
* Copyright (C) 2020-2021 dallmann consulting GmbH.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net.Http;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.Localization;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Newtonsoft.Json;
|
||||
using OCPP.Core.Database;
|
||||
using OCPP.Core.Management.Models;
|
||||
|
||||
namespace OCPP.Core.Management.Controllers
|
||||
{
|
||||
public partial class HomeController : BaseController
|
||||
{
|
||||
private readonly IStringLocalizer<HomeController> _localizer;
|
||||
|
||||
public HomeController(
|
||||
UserManager userManager,
|
||||
IStringLocalizer<HomeController> localizer,
|
||||
ILoggerFactory loggerFactory,
|
||||
IConfiguration config,
|
||||
OCPPCoreContext dbContext) : base(userManager, loggerFactory, config, dbContext)
|
||||
{
|
||||
_localizer = localizer;
|
||||
Logger = loggerFactory.CreateLogger<HomeController>();
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
public async Task<IActionResult> Index()
|
||||
{
|
||||
Logger.LogTrace("Index: Loading charge points with latest transactions...");
|
||||
|
||||
OverviewViewModel overviewModel = new OverviewViewModel();
|
||||
overviewModel.ChargePoints = new List<ChargePointsOverviewViewModel>();
|
||||
try
|
||||
{
|
||||
Dictionary<string, ChargePointStatus> dictOnlineStatus = new Dictionary<string, ChargePointStatus>();
|
||||
#region Load online status from OCPP server
|
||||
string serverApiUrl = base.Config.GetValue<string>("ServerApiUrl");
|
||||
string apiKeyConfig = base.Config.GetValue<string>("ApiKey");
|
||||
if (!string.IsNullOrEmpty(serverApiUrl))
|
||||
{
|
||||
bool serverError = false;
|
||||
try
|
||||
{
|
||||
ChargePointStatus[] onlineStatusList = null;
|
||||
|
||||
using (var httpClient = new HttpClient())
|
||||
{
|
||||
if (!serverApiUrl.EndsWith('/'))
|
||||
{
|
||||
serverApiUrl += "/";
|
||||
}
|
||||
Uri uri = new Uri(serverApiUrl);
|
||||
uri = new Uri(uri, "Status");
|
||||
httpClient.Timeout = new TimeSpan(0, 0, 4); // use short timeout
|
||||
|
||||
// API-Key authentication?
|
||||
if (!string.IsNullOrWhiteSpace(apiKeyConfig))
|
||||
{
|
||||
httpClient.DefaultRequestHeaders.Add("X-API-Key", apiKeyConfig);
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger.LogWarning("Index: No API-Key configured!");
|
||||
}
|
||||
|
||||
HttpResponseMessage response = await httpClient.GetAsync(uri);
|
||||
if (response.StatusCode == System.Net.HttpStatusCode.OK)
|
||||
{
|
||||
string jsonData = await response.Content.ReadAsStringAsync();
|
||||
if (!string.IsNullOrEmpty(jsonData))
|
||||
{
|
||||
onlineStatusList = JsonConvert.DeserializeObject<ChargePointStatus[]>(jsonData);
|
||||
overviewModel.ServerConnection = true;
|
||||
|
||||
if (onlineStatusList != null)
|
||||
{
|
||||
foreach(ChargePointStatus cps in onlineStatusList)
|
||||
{
|
||||
if (!dictOnlineStatus.TryAdd(cps.Id, cps))
|
||||
{
|
||||
Logger.LogError("Index: Online charge point status (ID={0}) could not be added to dictionary", cps.Id);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger.LogError("Index: Result of status web request is empty");
|
||||
serverError = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger.LogError("Index: Result of status web request => httpStatus={0}", response.StatusCode);
|
||||
serverError = true;
|
||||
}
|
||||
}
|
||||
|
||||
Logger.LogInformation("Index: Result of status web request => Length={0}", onlineStatusList?.Length);
|
||||
}
|
||||
catch (Exception exp)
|
||||
{
|
||||
Logger.LogError(exp, "Index: Error in status web request => {0}", exp.Message);
|
||||
serverError = true;
|
||||
}
|
||||
|
||||
if (serverError)
|
||||
{
|
||||
ViewBag.ErrorMsg = _localizer["ErrorOCPPServer"];
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
// List of charge point status (OCPP messages) with latest transaction (if one exist)
|
||||
var connectorStatusViewList = DbContext.ConnectorStatuses
|
||||
.GroupJoin(
|
||||
DbContext.Transactions,
|
||||
cs => new { cs.ChargePointId, cs.ConnectorId },
|
||||
t => new { t.ChargePointId, t.ConnectorId },
|
||||
(cs, transactions) => new { cs, transactions }
|
||||
)
|
||||
.SelectMany(
|
||||
x => x.transactions.DefaultIfEmpty(),
|
||||
(x, transaction) => new ConnectorStatusView
|
||||
{
|
||||
ChargePointId = x.cs.ChargePointId,
|
||||
ConnectorId = x.cs.ConnectorId,
|
||||
ConnectorName = x.cs.ConnectorName,
|
||||
LastStatus = x.cs.LastStatus,
|
||||
LastStatusTime = x.cs.LastStatusTime,
|
||||
LastMeter = x.cs.LastMeter,
|
||||
LastMeterTime = x.cs.LastMeterTime,
|
||||
TransactionId = (int?)transaction.TransactionId,
|
||||
StartTagId = transaction.StartTagId,
|
||||
StartTime = transaction.StartTime,
|
||||
MeterStart = transaction.MeterStart,
|
||||
StartResult = transaction.StartResult,
|
||||
StopTagId = transaction.StopTagId,
|
||||
StopTime = transaction.StopTime,
|
||||
MeterStop = transaction.MeterStop,
|
||||
StopReason = transaction.StopReason
|
||||
}
|
||||
)
|
||||
.Where(x => x.TransactionId == null ||
|
||||
x.TransactionId == DbContext.Transactions
|
||||
.Where(t => t.ChargePointId == x.ChargePointId && t.ConnectorId == x.ConnectorId)
|
||||
.Select(t => t.TransactionId)
|
||||
.Max())
|
||||
.ToList();
|
||||
|
||||
|
||||
// Count connectors for every charge point (=> naming scheme)
|
||||
Dictionary<string, int> dictConnectorCount = new Dictionary<string, int>();
|
||||
foreach (ConnectorStatusView csv in connectorStatusViewList)
|
||||
{
|
||||
if (dictConnectorCount.ContainsKey(csv.ChargePointId))
|
||||
{
|
||||
// > 1 connector
|
||||
dictConnectorCount[csv.ChargePointId] = dictConnectorCount[csv.ChargePointId] + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
// first connector
|
||||
dictConnectorCount.Add(csv.ChargePointId, 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// List of configured charge points
|
||||
List<ChargePoint> dbChargePoints = DbContext.ChargePoints.ToList<ChargePoint>();
|
||||
if (dbChargePoints != null)
|
||||
{
|
||||
// Iterate through all charge points in database
|
||||
foreach (ChargePoint cp in dbChargePoints)
|
||||
{
|
||||
ChargePointStatus cpOnlineStatus = null;
|
||||
dictOnlineStatus.TryGetValue(cp.ChargePointId, out cpOnlineStatus);
|
||||
|
||||
// Preference: Check for connectors status in database
|
||||
bool foundConnectorStatus = false;
|
||||
if (connectorStatusViewList != null)
|
||||
{
|
||||
foreach (ConnectorStatusView connStatus in connectorStatusViewList)
|
||||
{
|
||||
if (string.Equals(cp.ChargePointId, connStatus.ChargePointId, StringComparison.InvariantCultureIgnoreCase))
|
||||
{
|
||||
foundConnectorStatus = true;
|
||||
|
||||
ChargePointsOverviewViewModel cpovm = new ChargePointsOverviewViewModel();
|
||||
cpovm.ChargePointId = cp.ChargePointId;
|
||||
cpovm.ConnectorId = connStatus.ConnectorId;
|
||||
if (string.IsNullOrWhiteSpace(connStatus.ConnectorName))
|
||||
{
|
||||
// No connector name specified => use default
|
||||
if (dictConnectorCount.ContainsKey(cp.ChargePointId) &&
|
||||
dictConnectorCount[cp.ChargePointId] > 1)
|
||||
{
|
||||
// more than 1 connector => "<charge point name>:<connector no.>"
|
||||
cpovm.Name = $"{cp.Name}:{connStatus.ConnectorId}";
|
||||
}
|
||||
else
|
||||
{
|
||||
// only 1 connector => "<charge point name>"
|
||||
cpovm.Name = cp.Name;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Connector has name override name specified
|
||||
cpovm.Name = connStatus.ConnectorName;
|
||||
}
|
||||
cpovm.Online = cpOnlineStatus != null;
|
||||
cpovm.ConnectorStatus = ConnectorStatusEnum.Undefined;
|
||||
OnlineConnectorStatus onlineConnectorStatus = null;
|
||||
if (cpOnlineStatus != null &&
|
||||
cpOnlineStatus.OnlineConnectors != null &&
|
||||
cpOnlineStatus.OnlineConnectors.ContainsKey(connStatus.ConnectorId))
|
||||
{
|
||||
onlineConnectorStatus = cpOnlineStatus.OnlineConnectors[connStatus.ConnectorId];
|
||||
cpovm.ConnectorStatus = onlineConnectorStatus.Status;
|
||||
Logger.LogTrace("Index: Found online status for CP='{0}' / Connector='{1}' / Status='{2}'", cpovm.ChargePointId, cpovm.ConnectorId, cpovm.ConnectorStatus);
|
||||
}
|
||||
|
||||
if (connStatus.TransactionId.HasValue)
|
||||
{
|
||||
cpovm.MeterStart = connStatus.MeterStart.Value;
|
||||
cpovm.MeterStop = connStatus.MeterStop;
|
||||
cpovm.StartTime = connStatus.StartTime;
|
||||
cpovm.StopTime = connStatus.StopTime;
|
||||
|
||||
if (cpovm.ConnectorStatus == ConnectorStatusEnum.Undefined)
|
||||
{
|
||||
// default status: active transaction or not?
|
||||
cpovm.ConnectorStatus = (cpovm.StopTime.HasValue) ? ConnectorStatusEnum.Available : ConnectorStatusEnum.Occupied;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
cpovm.MeterStart = -1;
|
||||
cpovm.MeterStop = -1;
|
||||
cpovm.StartTime = null;
|
||||
cpovm.StopTime = null;
|
||||
|
||||
if (cpovm.ConnectorStatus == ConnectorStatusEnum.Undefined)
|
||||
{
|
||||
// default status: Available
|
||||
cpovm.ConnectorStatus = ConnectorStatusEnum.Available;
|
||||
}
|
||||
}
|
||||
|
||||
// Add current charge data to view model
|
||||
if (cpovm.ConnectorStatus == ConnectorStatusEnum.Occupied &&
|
||||
onlineConnectorStatus != null)
|
||||
{
|
||||
string currentCharge = string.Empty;
|
||||
if (onlineConnectorStatus.ChargeRateKW != null)
|
||||
{
|
||||
currentCharge = string.Format("{0:0.0}kW", onlineConnectorStatus.ChargeRateKW.Value);
|
||||
}
|
||||
if (onlineConnectorStatus.SoC != null)
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(currentCharge)) currentCharge += " | ";
|
||||
currentCharge += string.Format("{0:0}%", onlineConnectorStatus.SoC.Value);
|
||||
}
|
||||
if (!string.IsNullOrWhiteSpace(currentCharge))
|
||||
{
|
||||
cpovm.CurrentChargeData = currentCharge;
|
||||
}
|
||||
}
|
||||
|
||||
overviewModel.ChargePoints.Add(cpovm);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Fallback: assume 1 connector and show main charge point
|
||||
if (foundConnectorStatus == false)
|
||||
{
|
||||
// no connector status found in DB => show configured charge point in overview
|
||||
ChargePointsOverviewViewModel cpovm = new ChargePointsOverviewViewModel();
|
||||
cpovm.ChargePointId = cp.ChargePointId;
|
||||
cpovm.ConnectorId = 0;
|
||||
cpovm.Name = cp.Name;
|
||||
cpovm.Comment = cp.Comment;
|
||||
cpovm.Online = cpOnlineStatus != null;
|
||||
cpovm.ConnectorStatus = ConnectorStatusEnum.Undefined;
|
||||
overviewModel.ChargePoints.Add(cpovm);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Logger.LogInformation("Index: Found {0} charge points / connectors", overviewModel.ChargePoints?.Count);
|
||||
}
|
||||
catch (Exception exp)
|
||||
{
|
||||
Logger.LogError(exp, "Index: Error loading charge points from database");
|
||||
TempData["ErrMessage"] = exp.Message;
|
||||
return RedirectToAction("Error", new { Id = "" });
|
||||
}
|
||||
|
||||
return View(overviewModel);
|
||||
}
|
||||
|
||||
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
|
||||
public IActionResult Error()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
}
|
||||
}
|
||||
127
OCPP.Core.Management/Controllers/HomeController.Transactions.cs
Normal file
127
OCPP.Core.Management/Controllers/HomeController.Transactions.cs
Normal file
@@ -0,0 +1,127 @@
|
||||
/*
|
||||
* OCPP.Core - https://github.com/dallmann-consulting/OCPP.Core
|
||||
* Copyright (C) 2020-2021 dallmann consulting GmbH.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.Extensions.Localization;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using OCPP.Core.Database;
|
||||
using OCPP.Core.Management.Models;
|
||||
|
||||
namespace OCPP.Core.Management.Controllers
|
||||
{
|
||||
public partial class HomeController : BaseController
|
||||
{
|
||||
[Authorize]
|
||||
public IActionResult Transactions(string Id, string ConnectorId)
|
||||
{
|
||||
Logger.LogTrace("Transactions: Loading charge point transactions...");
|
||||
|
||||
int currentConnectorId = -1;
|
||||
int.TryParse(ConnectorId, out currentConnectorId);
|
||||
|
||||
TransactionListViewModel tlvm = new TransactionListViewModel();
|
||||
tlvm.CurrentChargePointId = Id;
|
||||
tlvm.CurrentConnectorId = currentConnectorId;
|
||||
tlvm.ConnectorStatuses = new List<ConnectorStatus>();
|
||||
tlvm.Transactions = new List<Transaction>();
|
||||
|
||||
try
|
||||
{
|
||||
string ts = Request.Query["t"];
|
||||
int days = 30;
|
||||
if (ts == "2")
|
||||
{
|
||||
// 90 days
|
||||
days = 90;
|
||||
tlvm.Timespan = 2;
|
||||
}
|
||||
else if (ts == "3")
|
||||
{
|
||||
// 365 days
|
||||
days = 365;
|
||||
tlvm.Timespan = 3;
|
||||
}
|
||||
else
|
||||
{
|
||||
// 30 days
|
||||
days = 30;
|
||||
tlvm.Timespan = 1;
|
||||
}
|
||||
|
||||
Logger.LogTrace("Transactions: Loading charge points...");
|
||||
tlvm.ChargePoints = DbContext.ChargePoints.ToList<ChargePoint>();
|
||||
|
||||
Logger.LogTrace("Transactions: Loading charge points connectors...");
|
||||
tlvm.ConnectorStatuses = DbContext.ConnectorStatuses.ToList<ConnectorStatus>();
|
||||
|
||||
// Count connectors for every charge point (=> naming scheme)
|
||||
Dictionary<string, int> dictConnectorCount = new Dictionary<string, int>();
|
||||
foreach (ConnectorStatus cs in tlvm.ConnectorStatuses)
|
||||
{
|
||||
if (dictConnectorCount.ContainsKey(cs.ChargePointId))
|
||||
{
|
||||
// > 1 connector
|
||||
dictConnectorCount[cs.ChargePointId] = dictConnectorCount[cs.ChargePointId] + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
// first connector
|
||||
dictConnectorCount.Add(cs.ChargePointId, 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// load charge tags for name resolution
|
||||
Logger.LogTrace("Transactions: Loading charge tags...");
|
||||
List<ChargeTag> chargeTags = DbContext.ChargeTags.ToList<ChargeTag>();
|
||||
tlvm.ChargeTags = new Dictionary<string, ChargeTag>();
|
||||
if (chargeTags != null)
|
||||
{
|
||||
foreach(ChargeTag tag in chargeTags)
|
||||
{
|
||||
tlvm.ChargeTags.Add(tag.TagId, tag);
|
||||
}
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(tlvm.CurrentChargePointId))
|
||||
{
|
||||
Logger.LogTrace("Transactions: Loading charge point transactions...");
|
||||
tlvm.Transactions = DbContext.Transactions
|
||||
.Where(t => t.ChargePointId == tlvm.CurrentChargePointId &&
|
||||
t.ConnectorId == tlvm.CurrentConnectorId &&
|
||||
t.StartTime >= DateTime.UtcNow.AddDays(-1 * days))
|
||||
.OrderByDescending(t => t.TransactionId)
|
||||
.ToList<Transaction>();
|
||||
}
|
||||
}
|
||||
catch (Exception exp)
|
||||
{
|
||||
Logger.LogError(exp, "Transactions: Error loading charge points from database");
|
||||
}
|
||||
|
||||
return View(tlvm);
|
||||
}
|
||||
}
|
||||
}
|
||||
107
OCPP.Core.Management/Models/ChargePointStatus.cs
Normal file
107
OCPP.Core.Management/Models/ChargePointStatus.cs
Normal file
@@ -0,0 +1,107 @@
|
||||
/*
|
||||
* OCPP.Core - https://github.com/dallmann-consulting/OCPP.Core
|
||||
* Copyright (C) 2020-2021 dallmann consulting GmbH.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
using OCPP.Core.Database;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace OCPP.Core.Management.Models
|
||||
{
|
||||
/// <summary>
|
||||
/// Encapsulates the data of a connected chargepoint in the server
|
||||
/// Attention: Identical class in OCPP.Server (shoud be external common...)
|
||||
/// </summary>
|
||||
|
||||
public class ChargePointStatus
|
||||
{
|
||||
public ChargePointStatus()
|
||||
{
|
||||
OnlineConnectors = new Dictionary<int, OnlineConnectorStatus>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// ID of chargepoint
|
||||
/// </summary>
|
||||
[Newtonsoft.Json.JsonProperty("id")]
|
||||
public string Id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Name of chargepoint
|
||||
/// </summary>
|
||||
[Newtonsoft.Json.JsonProperty("name")]
|
||||
public string Name { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// OCPP protocol version
|
||||
/// </summary>
|
||||
[Newtonsoft.Json.JsonProperty("protocol")]
|
||||
public string Protocol { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Dictionary with online connectors
|
||||
/// </summary>
|
||||
public Dictionary<int, OnlineConnectorStatus> OnlineConnectors { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Encapsulates details about online charge point connectors
|
||||
/// </summary>
|
||||
public class OnlineConnectorStatus
|
||||
{
|
||||
/// <summary>
|
||||
/// Status of charge connector
|
||||
/// </summary>
|
||||
public ConnectorStatusEnum Status { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Current charge rate in kW
|
||||
/// </summary>
|
||||
public double? ChargeRateKW { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Current meter value in kWh
|
||||
/// </summary>
|
||||
public double? MeterKWH { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// StateOfCharges in percent
|
||||
/// </summary>
|
||||
public double? SoC { get; set; }
|
||||
}
|
||||
|
||||
public enum ConnectorStatusEnum
|
||||
{
|
||||
[System.Runtime.Serialization.EnumMember(Value = @"")]
|
||||
Undefined = 0,
|
||||
|
||||
[System.Runtime.Serialization.EnumMember(Value = @"Available")]
|
||||
Available = 1,
|
||||
|
||||
[System.Runtime.Serialization.EnumMember(Value = @"Occupied")]
|
||||
Occupied = 2,
|
||||
|
||||
[System.Runtime.Serialization.EnumMember(Value = @"Unavailable")]
|
||||
Unavailable = 3,
|
||||
|
||||
[System.Runtime.Serialization.EnumMember(Value = @"Faulted")]
|
||||
Faulted = 4
|
||||
}
|
||||
}
|
||||
54
OCPP.Core.Management/Models/ChargePointViewModel.cs
Normal file
54
OCPP.Core.Management/Models/ChargePointViewModel.cs
Normal file
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
* OCPP.Core - https://github.com/dallmann-consulting/OCPP.Core
|
||||
* Copyright (C) 2020-2021 dallmann consulting GmbH.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
using OCPP.Core.Database;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace OCPP.Core.Management.Models
|
||||
{
|
||||
public class ChargePointViewModel
|
||||
{
|
||||
public List<ChargePoint> ChargePoints { get; set; }
|
||||
|
||||
public string CurrentId { get; set; }
|
||||
|
||||
|
||||
[Required, StringLength(100)]
|
||||
public string ChargePointId { get; set; }
|
||||
|
||||
[Required, StringLength(100)]
|
||||
public string Name { get; set; }
|
||||
|
||||
[StringLength(100)]
|
||||
public string Comment { get; set; }
|
||||
|
||||
[StringLength(50)]
|
||||
public string Username { get; set; }
|
||||
|
||||
[StringLength(50)]
|
||||
public string Password { get; set; }
|
||||
|
||||
[StringLength(100)]
|
||||
public string ClientCertThumb { get; set; }
|
||||
}
|
||||
}
|
||||
84
OCPP.Core.Management/Models/ChargePointsOverviewViewModel.cs
Normal file
84
OCPP.Core.Management/Models/ChargePointsOverviewViewModel.cs
Normal file
@@ -0,0 +1,84 @@
|
||||
/*
|
||||
* OCPP.Core - https://github.com/dallmann-consulting/OCPP.Core
|
||||
* Copyright (C) 2020-2021 dallmann consulting GmbH.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace OCPP.Core.Management.Models
|
||||
{
|
||||
public class ChargePointsOverviewViewModel
|
||||
{
|
||||
/// <summary>
|
||||
/// ID of this chargepoint
|
||||
/// </summary>
|
||||
public string ChargePointId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Connector-ID
|
||||
/// </summary>
|
||||
public int ConnectorId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Name of this chargepoint
|
||||
/// </summary>
|
||||
public string Name { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Comment of this chargepoint
|
||||
/// </summary>
|
||||
public string Comment { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Meter start value of last transaction
|
||||
/// </summary>
|
||||
public double MeterStart { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Meter stop value of last transaction (or null if charging)
|
||||
/// </summary>
|
||||
public double? MeterStop { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Start time of last transaction
|
||||
/// </summary>
|
||||
public DateTime? StartTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Stop time of last transaction (or null if charging)
|
||||
/// </summary>
|
||||
public DateTime? StopTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Status of chargepoint
|
||||
/// </summary>
|
||||
public ConnectorStatusEnum ConnectorStatus { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Is this chargepoint currently connected to OCPP.Server?
|
||||
/// </summary>
|
||||
public bool Online { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Details about the current charge process
|
||||
/// </summary>
|
||||
public string CurrentChargeData { get; set; }
|
||||
}
|
||||
}
|
||||
50
OCPP.Core.Management/Models/ChargeTagViewModel.cs
Normal file
50
OCPP.Core.Management/Models/ChargeTagViewModel.cs
Normal file
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
* OCPP.Core - https://github.com/dallmann-consulting/OCPP.Core
|
||||
* Copyright (C) 2020-2021 dallmann consulting GmbH.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
using OCPP.Core.Database;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace OCPP.Core.Management.Models
|
||||
{
|
||||
public class ChargeTagViewModel
|
||||
{
|
||||
public List<ChargeTag> ChargeTags { get; set; }
|
||||
|
||||
public string CurrentTagId { get; set; }
|
||||
|
||||
|
||||
[Required, StringLength(50)]
|
||||
public string TagId { get; set; }
|
||||
|
||||
[Required, StringLength(200)]
|
||||
public string TagName { get; set; }
|
||||
|
||||
[StringLength(50)]
|
||||
public string ParentTagId { get; set; }
|
||||
|
||||
[DataType(DataType.Date)]
|
||||
public DateTime? ExpiryDate { get; set; }
|
||||
|
||||
public bool Blocked { get; set; }
|
||||
}
|
||||
}
|
||||
49
OCPP.Core.Management/Models/ConnectorStatusViewModel.cs
Normal file
49
OCPP.Core.Management/Models/ConnectorStatusViewModel.cs
Normal file
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* OCPP.Core - https://github.com/dallmann-consulting/OCPP.Core
|
||||
* Copyright (C) 2020-2021 dallmann consulting GmbH.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
using OCPP.Core.Database;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace OCPP.Core.Management.Models
|
||||
{
|
||||
public class ConnectorStatusViewModel
|
||||
{
|
||||
public List<ConnectorStatus> ConnectorStatuses { get; set; }
|
||||
|
||||
public string ChargePointId { get; set; }
|
||||
|
||||
public int ConnectorId { get; set; }
|
||||
|
||||
public string LastStatus { get; set; }
|
||||
|
||||
public DateTime? LastStatusTime { get; set; }
|
||||
|
||||
public double? LastMeter { get; set; }
|
||||
|
||||
public DateTime? LastMeterTime { get; set; }
|
||||
|
||||
[StringLength(100)]
|
||||
public string ConnectorName { get; set; }
|
||||
|
||||
}
|
||||
}
|
||||
40
OCPP.Core.Management/Models/OverviewViewModel.cs
Normal file
40
OCPP.Core.Management/Models/OverviewViewModel.cs
Normal file
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* OCPP.Core - https://github.com/dallmann-consulting/OCPP.Core
|
||||
* Copyright (C) 2020-2021 dallmann consulting GmbH.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace OCPP.Core.Management.Models
|
||||
{
|
||||
public class OverviewViewModel
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// List of chargepoints with status information
|
||||
/// </summary>
|
||||
public List<ChargePointsOverviewViewModel> ChargePoints { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Does the status contain live information from the OCPP.Server?
|
||||
/// </summary>
|
||||
public bool ServerConnection { get; set; }
|
||||
}
|
||||
}
|
||||
47
OCPP.Core.Management/Models/TransactionListViewModel.cs
Normal file
47
OCPP.Core.Management/Models/TransactionListViewModel.cs
Normal file
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
* OCPP.Core - https://github.com/dallmann-consulting/OCPP.Core
|
||||
* Copyright (C) 2020-2021 dallmann consulting GmbH.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
using OCPP.Core.Database;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace OCPP.Core.Management.Models
|
||||
{
|
||||
public class TransactionListViewModel
|
||||
{
|
||||
public List<ChargePoint> ChargePoints { get; set; }
|
||||
|
||||
public List<ConnectorStatus> ConnectorStatuses { get; set; }
|
||||
|
||||
public Dictionary<string, ChargeTag> ChargeTags { get; set; }
|
||||
|
||||
public string CurrentChargePointId { get; set; }
|
||||
|
||||
public int CurrentConnectorId { get; set; }
|
||||
|
||||
//public string CurrentConnectorName { get; set; }
|
||||
|
||||
public List<Transaction> Transactions { get; set; }
|
||||
|
||||
public int Timespan { get; set; }
|
||||
|
||||
}
|
||||
}
|
||||
35
OCPP.Core.Management/Models/UserModel.cs
Normal file
35
OCPP.Core.Management/Models/UserModel.cs
Normal file
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
* OCPP.Core - https://github.com/dallmann-consulting/OCPP.Core
|
||||
* Copyright (C) 2020-2021 dallmann consulting GmbH.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace OCPP.Core.Management.Models
|
||||
{
|
||||
public class UserModel
|
||||
{
|
||||
public string Username { get; set; }
|
||||
|
||||
public string Password { get; set; }
|
||||
|
||||
public bool IsAdmin { get; set; }
|
||||
}
|
||||
}
|
||||
38
OCPP.Core.Management/OCPP.Core.Management.csproj
Normal file
38
OCPP.Core.Management/OCPP.Core.Management.csproj
Normal file
@@ -0,0 +1,38 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<Version>1.3.2</Version>
|
||||
<Company>dallmann consulting GmbH</Company>
|
||||
<Authors>Ulrich Dallmann</Authors>
|
||||
<Product>OCPP.Core</Product>
|
||||
<UserSecretsId>a94ca61f-1fd8-4cfe-a802-d69a4b48fddc</UserSecretsId>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Compile Remove="Logs\**" />
|
||||
<Content Remove="Logs\**" />
|
||||
<EmbeddedResource Remove="Logs\**" />
|
||||
<None Remove="Logs\**" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Remove="localhost.pfx" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Content Include="localhost.pfx">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Karambolo.Extensions.Logging.File" Version="3.5.0" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\OCPP.Core.Database\OCPP.Core.Database.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
52
OCPP.Core.Management/Program.cs
Normal file
52
OCPP.Core.Management/Program.cs
Normal file
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
* OCPP.Core - https://github.com/dallmann-consulting/OCPP.Core
|
||||
* Copyright (C) 2020-2021 dallmann consulting GmbH.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using Microsoft.AspNetCore.Hosting;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace OCPP.Core.Management
|
||||
{
|
||||
public class Program
|
||||
{
|
||||
public static void Main(string[] args)
|
||||
{
|
||||
CreateHostBuilder(args).Build().Run();
|
||||
}
|
||||
|
||||
public static IHostBuilder CreateHostBuilder(string[] args) =>
|
||||
Host.CreateDefaultBuilder(args)
|
||||
.ConfigureWebHostDefaults(webBuilder =>
|
||||
{
|
||||
webBuilder
|
||||
.ConfigureLogging((ctx, builder) =>
|
||||
{
|
||||
builder.AddConfiguration(ctx.Configuration.GetSection("Logging"));
|
||||
//builder.AddEventLog(o => o.LogName = "OCPP.Core");
|
||||
builder.AddFile(o => o.RootPath = ctx.HostingEnvironment.ContentRootPath);
|
||||
})
|
||||
.UseStartup<Startup>();
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
27
OCPP.Core.Management/Properties/launchSettings.json
Normal file
27
OCPP.Core.Management/Properties/launchSettings.json
Normal file
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"iisSettings": {
|
||||
"windowsAuthentication": false,
|
||||
"anonymousAuthentication": true,
|
||||
"iisExpress": {
|
||||
"applicationUrl": "http://localhost:8082",
|
||||
"sslPort": 0
|
||||
}
|
||||
},
|
||||
"profiles": {
|
||||
"IIS Express": {
|
||||
"commandName": "IISExpress",
|
||||
"launchBrowser": true,
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
},
|
||||
"OCPP.Core.Management": {
|
||||
"commandName": "Project",
|
||||
"launchBrowser": true,
|
||||
"applicationUrl": "http://localhost:8082",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
159
OCPP.Core.Management/Resources/Controllers.ApiController.de.resx
Normal file
159
OCPP.Core.Management/Resources/Controllers.ApiController.de.resx
Normal file
@@ -0,0 +1,159 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="ResetAccepted" xml:space="preserve">
|
||||
<value>Die Ladestation wird neu gestartet.</value>
|
||||
</data>
|
||||
<data name="ResetError" xml:space="preserve">
|
||||
<value>Es ist ein Fehler aufgetreten.</value>
|
||||
</data>
|
||||
<data name="ResetOffline" xml:space="preserve">
|
||||
<value>Die Ladestation ist Offline und kann nicht neu gestartet werden.</value>
|
||||
</data>
|
||||
<data name="ResetRejected" xml:space="preserve">
|
||||
<value>Die Ladestation hat die Anfrage abgelehnt.</value>
|
||||
</data>
|
||||
<data name="ResetScheduled" xml:space="preserve">
|
||||
<value>Die Ladestation wird später neu gestartet.</value>
|
||||
</data>
|
||||
<data name="ResetUnknownStatus" xml:space="preserve">
|
||||
<value>Die Ladestation lieferte ein unerwartetes Ergebnis: '{0}'</value>
|
||||
</data>
|
||||
<data name="UnknownChargepoint" xml:space="preserve">
|
||||
<value>Die Ladestation wurde nicht gefunden.</value>
|
||||
</data>
|
||||
<data name="UnlockConnectorAccepted" xml:space="preserve">
|
||||
<value>Die Ladestation wurde entsperrt.</value>
|
||||
</data>
|
||||
<data name="UnlockConnectorError" xml:space="preserve">
|
||||
<value>Es ist ein Fehler aufgetreten.</value>
|
||||
</data>
|
||||
<data name="UnlockConnectorFailed" xml:space="preserve">
|
||||
<value>Die Ladestation konnte nicht entsperrt werden.</value>
|
||||
</data>
|
||||
<data name="UnlockConnectorNotSupported" xml:space="preserve">
|
||||
<value>Die Ladestation unterstützt keine Entsperrung.</value>
|
||||
</data>
|
||||
<data name="UnlockConnectorOffline" xml:space="preserve">
|
||||
<value>Die Ladestation ist Offline und kann nicht entsperrt werden.</value>
|
||||
</data>
|
||||
<data name="UnlockConnectorUnknownStatus" xml:space="preserve">
|
||||
<value>Die Ladestation lieferte ein unerwartetes Ergebnis: '{0}'</value>
|
||||
</data>
|
||||
</root>
|
||||
159
OCPP.Core.Management/Resources/Controllers.ApiController.resx
Normal file
159
OCPP.Core.Management/Resources/Controllers.ApiController.resx
Normal file
@@ -0,0 +1,159 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="ResetAccepted" xml:space="preserve">
|
||||
<value>The charging station is being restarted.</value>
|
||||
</data>
|
||||
<data name="ResetError" xml:space="preserve">
|
||||
<value>An error has occurred.</value>
|
||||
</data>
|
||||
<data name="ResetOffline" xml:space="preserve">
|
||||
<value>The charging station is offline and cannot be restarted.</value>
|
||||
</data>
|
||||
<data name="ResetRejected" xml:space="preserve">
|
||||
<value>The charging station has rejected the request.</value>
|
||||
</data>
|
||||
<data name="ResetScheduled" xml:space="preserve">
|
||||
<value>The charging station has scheduled the restart.</value>
|
||||
</data>
|
||||
<data name="ResetUnknownStatus" xml:space="preserve">
|
||||
<value>The charging station returned an unexpected result: '{0}'</value>
|
||||
</data>
|
||||
<data name="UnknownChargepoint" xml:space="preserve">
|
||||
<value>The charging station was not found.</value>
|
||||
</data>
|
||||
<data name="UnlockConnectorAccepted" xml:space="preserve">
|
||||
<value>The charging station has been unlocked.</value>
|
||||
</data>
|
||||
<data name="UnlockConnectorError" xml:space="preserve">
|
||||
<value>An error has occurred.</value>
|
||||
</data>
|
||||
<data name="UnlockConnectorFailed" xml:space="preserve">
|
||||
<value>The charging station could NOT be unlocked.</value>
|
||||
</data>
|
||||
<data name="UnlockConnectorNotSupported" xml:space="preserve">
|
||||
<value>The charging station does not support unlocking.</value>
|
||||
</data>
|
||||
<data name="UnlockConnectorOffline" xml:space="preserve">
|
||||
<value>The charging station is offline and cannot be unlocked.</value>
|
||||
</data>
|
||||
<data name="UnlockConnectorUnknownStatus" xml:space="preserve">
|
||||
<value>The charging station returned an unexpected result: '{0}'</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -0,0 +1,162 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="ChargePointId" xml:space="preserve">
|
||||
<value>Ladestation</value>
|
||||
</data>
|
||||
<data name="ChargePointIdExists" xml:space="preserve">
|
||||
<value>Es existiert bereits eine Ladestation mit dieser Kennung.</value>
|
||||
</data>
|
||||
<data name="ChargePointIdRequired" xml:space="preserve">
|
||||
<value>Bitte geben Sie die Kennung der Ladestation an.</value>
|
||||
</data>
|
||||
<data name="ChargeSum" xml:space="preserve">
|
||||
<value>Geladen</value>
|
||||
</data>
|
||||
<data name="ChargeTagIdExists" xml:space="preserve">
|
||||
<value>Die RFID-Nummer existiert bereits.</value>
|
||||
</data>
|
||||
<data name="ChargeTagIdRequired" xml:space="preserve">
|
||||
<value>Bitte geben Sie eine RFID-Nummer an.</value>
|
||||
</data>
|
||||
<data name="Connector" xml:space="preserve">
|
||||
<value>Anschluss</value>
|
||||
</data>
|
||||
<data name="ErrorOCPPServer" xml:space="preserve">
|
||||
<value>Es konnte kein aktueller Status vom OCPP-Server abgerufen werden.</value>
|
||||
</data>
|
||||
<data name="StartMeter" xml:space="preserve">
|
||||
<value>Beginn-Zähler</value>
|
||||
</data>
|
||||
<data name="StartTag" xml:space="preserve">
|
||||
<value>Token</value>
|
||||
</data>
|
||||
<data name="StartTime" xml:space="preserve">
|
||||
<value>Beginn</value>
|
||||
</data>
|
||||
<data name="StopMeter" xml:space="preserve">
|
||||
<value>Ende-Zähler</value>
|
||||
</data>
|
||||
<data name="StopTag" xml:space="preserve">
|
||||
<value>Token</value>
|
||||
</data>
|
||||
<data name="StopTime" xml:space="preserve">
|
||||
<value>Ende</value>
|
||||
</data>
|
||||
</root>
|
||||
162
OCPP.Core.Management/Resources/Controllers.HomeController.resx
Normal file
162
OCPP.Core.Management/Resources/Controllers.HomeController.resx
Normal file
@@ -0,0 +1,162 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="ChargePointId" xml:space="preserve">
|
||||
<value>Charging station</value>
|
||||
</data>
|
||||
<data name="ChargePointIdExists" xml:space="preserve">
|
||||
<value>A charging station with that ID already exists.</value>
|
||||
</data>
|
||||
<data name="ChargePointIdRequired" xml:space="preserve">
|
||||
<value>Please enter an charging station ID.</value>
|
||||
</data>
|
||||
<data name="ChargeSum" xml:space="preserve">
|
||||
<value>Charged</value>
|
||||
</data>
|
||||
<data name="ChargeTagIdExists" xml:space="preserve">
|
||||
<value>The RFID number already exists.</value>
|
||||
</data>
|
||||
<data name="ChargeTagIdRequired" xml:space="preserve">
|
||||
<value>Please enter an RFID number.</value>
|
||||
</data>
|
||||
<data name="Connector" xml:space="preserve">
|
||||
<value>Connector</value>
|
||||
</data>
|
||||
<data name="ErrorOCPPServer" xml:space="preserve">
|
||||
<value>No current status could be retrieved from the OCPP server.</value>
|
||||
</data>
|
||||
<data name="StartMeter" xml:space="preserve">
|
||||
<value>Start-Meter</value>
|
||||
</data>
|
||||
<data name="StartTag" xml:space="preserve">
|
||||
<value>Start-Tag</value>
|
||||
</data>
|
||||
<data name="StartTime" xml:space="preserve">
|
||||
<value>Start</value>
|
||||
</data>
|
||||
<data name="StopMeter" xml:space="preserve">
|
||||
<value>Stop-Meter</value>
|
||||
</data>
|
||||
<data name="StopTag" xml:space="preserve">
|
||||
<value>Stop-Tag</value>
|
||||
</data>
|
||||
<data name="StopTime" xml:space="preserve">
|
||||
<value>Stop</value>
|
||||
</data>
|
||||
</root>
|
||||
132
OCPP.Core.Management/Resources/Views.Account.Login.de.resx
Normal file
132
OCPP.Core.Management/Resources/Views.Account.Login.de.resx
Normal file
@@ -0,0 +1,132 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="Login" xml:space="preserve">
|
||||
<value>Anmelden</value>
|
||||
</data>
|
||||
<data name="Password" xml:space="preserve">
|
||||
<value>Passwort</value>
|
||||
</data>
|
||||
<data name="Title" xml:space="preserve">
|
||||
<value>Anmeldung</value>
|
||||
</data>
|
||||
<data name="Username" xml:space="preserve">
|
||||
<value>Benutzername</value>
|
||||
</data>
|
||||
</root>
|
||||
132
OCPP.Core.Management/Resources/Views.Account.Login.resx
Normal file
132
OCPP.Core.Management/Resources/Views.Account.Login.resx
Normal file
@@ -0,0 +1,132 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="Login" xml:space="preserve">
|
||||
<value>Login</value>
|
||||
</data>
|
||||
<data name="Password" xml:space="preserve">
|
||||
<value>Password</value>
|
||||
</data>
|
||||
<data name="Title" xml:space="preserve">
|
||||
<value>Login</value>
|
||||
</data>
|
||||
<data name="Username" xml:space="preserve">
|
||||
<value>Username</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -0,0 +1,201 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="Cancel" xml:space="preserve">
|
||||
<value>Abbrechen</value>
|
||||
</data>
|
||||
<data name="ChargePointIdLabel" xml:space="preserve">
|
||||
<value>Kennung</value>
|
||||
</data>
|
||||
<data name="ChargePointIdPlaceholder" xml:space="preserve">
|
||||
<value>Kennung der Ladestation</value>
|
||||
</data>
|
||||
<data name="ClientCertThumbLabel" xml:space="preserve">
|
||||
<value>Client-Zertifikat</value>
|
||||
</data>
|
||||
<data name="ClientCertThumbPlaceholder" xml:space="preserve">
|
||||
<value>Fingerabdruck des Client-Zertifikates (Thumbprint)</value>
|
||||
</data>
|
||||
<data name="Close" xml:space="preserve">
|
||||
<value>Schließen</value>
|
||||
</data>
|
||||
<data name="CommentLabel" xml:space="preserve">
|
||||
<value>Notiz</value>
|
||||
</data>
|
||||
<data name="CommentPlaceholder" xml:space="preserve">
|
||||
<value>Anmerkung zur Ladestation</value>
|
||||
</data>
|
||||
<data name="DialogReset" xml:space="preserve">
|
||||
<value>Soll die Ladestation '{0}' wirklich neu gestartet werden?</value>
|
||||
</data>
|
||||
<data name="DialogUnlockConnector" xml:space="preserve">
|
||||
<value>Soll die Ladestation '{0}' wirklich entsperrt werden?</value>
|
||||
</data>
|
||||
<data name="EditChargePoint" xml:space="preserve">
|
||||
<value>Ladestation bearbeiten</value>
|
||||
</data>
|
||||
<data name="ErrorReset" xml:space="preserve">
|
||||
<value>Es ist ein Fehler aufgetreten.</value>
|
||||
</data>
|
||||
<data name="ErrorUnlock" xml:space="preserve">
|
||||
<value>Es ist ein Fehler aufgetreten.</value>
|
||||
</data>
|
||||
<data name="ExecuteReset" xml:space="preserve">
|
||||
<value>Neustart der Ladestation wird ausgelöst...</value>
|
||||
</data>
|
||||
<data name="ExecuteUnlock" xml:space="preserve">
|
||||
<value>Entsperrung der Ladestation wird ausgelöst...</value>
|
||||
</data>
|
||||
<data name="NameLabel" xml:space="preserve">
|
||||
<value>Bezeichnung</value>
|
||||
</data>
|
||||
<data name="NamePlaceholder" xml:space="preserve">
|
||||
<value>Bezeichnung der Ladestation</value>
|
||||
</data>
|
||||
<data name="PasswordLabel" xml:space="preserve">
|
||||
<value>Passwort</value>
|
||||
</data>
|
||||
<data name="PasswordPlaceholder" xml:space="preserve">
|
||||
<value>Passwort der Ladestation</value>
|
||||
</data>
|
||||
<data name="RequiredField" xml:space="preserve">
|
||||
<value>Pflichtfeld</value>
|
||||
</data>
|
||||
<data name="Save" xml:space="preserve">
|
||||
<value>Speichern</value>
|
||||
</data>
|
||||
<data name="SaveNew" xml:space="preserve">
|
||||
<value>Anlegen</value>
|
||||
</data>
|
||||
<data name="Title" xml:space="preserve">
|
||||
<value>Management</value>
|
||||
</data>
|
||||
<data name="TitleReset" xml:space="preserve">
|
||||
<value>Neustart</value>
|
||||
</data>
|
||||
<data name="TitleUnlockConnector" xml:space="preserve">
|
||||
<value>Entsperren</value>
|
||||
</data>
|
||||
<data name="UsernameLabel" xml:space="preserve">
|
||||
<value>Benutzername</value>
|
||||
</data>
|
||||
<data name="UsernamePlaceholder" xml:space="preserve">
|
||||
<value>Benutzername der Ladestation</value>
|
||||
</data>
|
||||
</root>
|
||||
201
OCPP.Core.Management/Resources/Views.Home.ChargePointDetail.resx
Normal file
201
OCPP.Core.Management/Resources/Views.Home.ChargePointDetail.resx
Normal file
@@ -0,0 +1,201 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="Cancel" xml:space="preserve">
|
||||
<value>Cancel</value>
|
||||
</data>
|
||||
<data name="ChargePointIdLabel" xml:space="preserve">
|
||||
<value>ID</value>
|
||||
</data>
|
||||
<data name="ChargePointIdPlaceholder" xml:space="preserve">
|
||||
<value>Charge point ID</value>
|
||||
</data>
|
||||
<data name="ClientCertThumbLabel" xml:space="preserve">
|
||||
<value>Client-Certificate</value>
|
||||
</data>
|
||||
<data name="ClientCertThumbPlaceholder" xml:space="preserve">
|
||||
<value>Client-Certificate (Thumbprint)</value>
|
||||
</data>
|
||||
<data name="Close" xml:space="preserve">
|
||||
<value>Close</value>
|
||||
</data>
|
||||
<data name="CommentLabel" xml:space="preserve">
|
||||
<value>Comment</value>
|
||||
</data>
|
||||
<data name="CommentPlaceholder" xml:space="preserve">
|
||||
<value>Charge point comment</value>
|
||||
</data>
|
||||
<data name="DialogReset" xml:space="preserve">
|
||||
<value>Should the charging station '{0}' really be restarted?</value>
|
||||
</data>
|
||||
<data name="DialogUnlockConnector" xml:space="preserve">
|
||||
<value>Should the charging station '{0}' really be unlocked?</value>
|
||||
</data>
|
||||
<data name="EditChargePoint" xml:space="preserve">
|
||||
<value>Edit charge point</value>
|
||||
</data>
|
||||
<data name="ErrorReset" xml:space="preserve">
|
||||
<value>An error occured.</value>
|
||||
</data>
|
||||
<data name="ErrorUnlock" xml:space="preserve">
|
||||
<value>An error occured.</value>
|
||||
</data>
|
||||
<data name="ExecuteReset" xml:space="preserve">
|
||||
<value>Restart of the charging station is triggered...</value>
|
||||
</data>
|
||||
<data name="ExecuteUnlock" xml:space="preserve">
|
||||
<value>Unlock of the charging station is triggered...</value>
|
||||
</data>
|
||||
<data name="NameLabel" xml:space="preserve">
|
||||
<value>Name</value>
|
||||
</data>
|
||||
<data name="NamePlaceholder" xml:space="preserve">
|
||||
<value>Charge point name</value>
|
||||
</data>
|
||||
<data name="PasswordLabel" xml:space="preserve">
|
||||
<value>Password</value>
|
||||
</data>
|
||||
<data name="PasswordPlaceholder" xml:space="preserve">
|
||||
<value>Charge point password</value>
|
||||
</data>
|
||||
<data name="RequiredField" xml:space="preserve">
|
||||
<value>Required</value>
|
||||
</data>
|
||||
<data name="Save" xml:space="preserve">
|
||||
<value>Save</value>
|
||||
</data>
|
||||
<data name="SaveNew" xml:space="preserve">
|
||||
<value>Create</value>
|
||||
</data>
|
||||
<data name="Title" xml:space="preserve">
|
||||
<value>Management</value>
|
||||
</data>
|
||||
<data name="TitleReset" xml:space="preserve">
|
||||
<value>Restart</value>
|
||||
</data>
|
||||
<data name="TitleUnlockConnector" xml:space="preserve">
|
||||
<value>Unlock</value>
|
||||
</data>
|
||||
<data name="UsernameLabel" xml:space="preserve">
|
||||
<value>Username</value>
|
||||
</data>
|
||||
<data name="UsernamePlaceholder" xml:space="preserve">
|
||||
<value>Charge point username</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -0,0 +1,135 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="AddNew" xml:space="preserve">
|
||||
<value>Neu</value>
|
||||
</data>
|
||||
<data name="ChargePointId" xml:space="preserve">
|
||||
<value>Kennung</value>
|
||||
</data>
|
||||
<data name="Comment" xml:space="preserve">
|
||||
<value>Notiz</value>
|
||||
</data>
|
||||
<data name="Name" xml:space="preserve">
|
||||
<value>Bezeichnung</value>
|
||||
</data>
|
||||
<data name="Title" xml:space="preserve">
|
||||
<value>Management</value>
|
||||
</data>
|
||||
</root>
|
||||
135
OCPP.Core.Management/Resources/Views.Home.ChargePointList.resx
Normal file
135
OCPP.Core.Management/Resources/Views.Home.ChargePointList.resx
Normal file
@@ -0,0 +1,135 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="AddNew" xml:space="preserve">
|
||||
<value>New</value>
|
||||
</data>
|
||||
<data name="ChargePointId" xml:space="preserve">
|
||||
<value>ID</value>
|
||||
</data>
|
||||
<data name="Comment" xml:space="preserve">
|
||||
<value>Comment</value>
|
||||
</data>
|
||||
<data name="Name" xml:space="preserve">
|
||||
<value>Name</value>
|
||||
</data>
|
||||
<data name="Title" xml:space="preserve">
|
||||
<value>Management</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -0,0 +1,162 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="ChargeTagBlockedLabel" xml:space="preserve">
|
||||
<value>Gesperrt</value>
|
||||
</data>
|
||||
<data name="ChargeTagExpirationLabel" xml:space="preserve">
|
||||
<value>Ablaufdatum</value>
|
||||
</data>
|
||||
<data name="ChargeTagIdLabel" xml:space="preserve">
|
||||
<value>RFID-Nummer</value>
|
||||
</data>
|
||||
<data name="ChargeTagIdPlaceholder" xml:space="preserve">
|
||||
<value>Nummer des RFID-Anhängers</value>
|
||||
</data>
|
||||
<data name="ChargeTagNameLabel" xml:space="preserve">
|
||||
<value>Bezeichnung</value>
|
||||
</data>
|
||||
<data name="ChargeTagNamePlaceholder" xml:space="preserve">
|
||||
<value>Anzeigename des RFID-Anhängers</value>
|
||||
</data>
|
||||
<data name="EditChargeTag" xml:space="preserve">
|
||||
<value>RFID-Schlüssel bearbeiten</value>
|
||||
</data>
|
||||
<data name="FieldMaxLength" xml:space="preserve">
|
||||
<value>Max. {0} Zeichen</value>
|
||||
</data>
|
||||
<data name="GroupNameLabel" xml:space="preserve">
|
||||
<value>Gruppe</value>
|
||||
</data>
|
||||
<data name="GroupNamePlaceholder" xml:space="preserve">
|
||||
<value>Teil der Gruppe</value>
|
||||
</data>
|
||||
<data name="RequiredField" xml:space="preserve">
|
||||
<value>Pflichtfeld</value>
|
||||
</data>
|
||||
<data name="Save" xml:space="preserve">
|
||||
<value>Speichern</value>
|
||||
</data>
|
||||
<data name="SaveNew" xml:space="preserve">
|
||||
<value>Anlegen</value>
|
||||
</data>
|
||||
<data name="Title" xml:space="preserve">
|
||||
<value>Management</value>
|
||||
</data>
|
||||
</root>
|
||||
162
OCPP.Core.Management/Resources/Views.Home.ChargeTagDetail.resx
Normal file
162
OCPP.Core.Management/Resources/Views.Home.ChargeTagDetail.resx
Normal file
@@ -0,0 +1,162 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="ChargeTagBlockedLabel" xml:space="preserve">
|
||||
<value>Blocked</value>
|
||||
</data>
|
||||
<data name="ChargeTagExpirationLabel" xml:space="preserve">
|
||||
<value>Expiration</value>
|
||||
</data>
|
||||
<data name="ChargeTagIdLabel" xml:space="preserve">
|
||||
<value>RFID-Number</value>
|
||||
</data>
|
||||
<data name="ChargeTagIdPlaceholder" xml:space="preserve">
|
||||
<value>ID / Number</value>
|
||||
</data>
|
||||
<data name="ChargeTagNameLabel" xml:space="preserve">
|
||||
<value>Name</value>
|
||||
</data>
|
||||
<data name="ChargeTagNamePlaceholder" xml:space="preserve">
|
||||
<value>Display name</value>
|
||||
</data>
|
||||
<data name="EditChargeTag" xml:space="preserve">
|
||||
<value>Edit RFID-Tag</value>
|
||||
</data>
|
||||
<data name="FieldMaxLength" xml:space="preserve">
|
||||
<value>Max. {0} characters</value>
|
||||
</data>
|
||||
<data name="GroupNameLabel" xml:space="preserve">
|
||||
<value>Group</value>
|
||||
</data>
|
||||
<data name="GroupNamePlaceholder" xml:space="preserve">
|
||||
<value>Member of group</value>
|
||||
</data>
|
||||
<data name="RequiredField" xml:space="preserve">
|
||||
<value>Required</value>
|
||||
</data>
|
||||
<data name="Save" xml:space="preserve">
|
||||
<value>Save</value>
|
||||
</data>
|
||||
<data name="SaveNew" xml:space="preserve">
|
||||
<value>Create</value>
|
||||
</data>
|
||||
<data name="Title" xml:space="preserve">
|
||||
<value>Management</value>
|
||||
</data>
|
||||
</root>
|
||||
141
OCPP.Core.Management/Resources/Views.Home.ChargeTagList.de.resx
Normal file
141
OCPP.Core.Management/Resources/Views.Home.ChargeTagList.de.resx
Normal file
@@ -0,0 +1,141 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="AddNew" xml:space="preserve">
|
||||
<value>Neu</value>
|
||||
</data>
|
||||
<data name="Blocked" xml:space="preserve">
|
||||
<value>Gesperrt</value>
|
||||
</data>
|
||||
<data name="ExpiryDate" xml:space="preserve">
|
||||
<value>Ablaufdatum</value>
|
||||
</data>
|
||||
<data name="GroupName" xml:space="preserve">
|
||||
<value>Gruppe</value>
|
||||
</data>
|
||||
<data name="TagId" xml:space="preserve">
|
||||
<value>RFID-Nummer</value>
|
||||
</data>
|
||||
<data name="TagName" xml:space="preserve">
|
||||
<value>Bezeichnung</value>
|
||||
</data>
|
||||
<data name="Title" xml:space="preserve">
|
||||
<value>Management</value>
|
||||
</data>
|
||||
</root>
|
||||
141
OCPP.Core.Management/Resources/Views.Home.ChargeTagList.resx
Normal file
141
OCPP.Core.Management/Resources/Views.Home.ChargeTagList.resx
Normal file
@@ -0,0 +1,141 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="AddNew" xml:space="preserve">
|
||||
<value>New</value>
|
||||
</data>
|
||||
<data name="Blocked" xml:space="preserve">
|
||||
<value>Blocked</value>
|
||||
</data>
|
||||
<data name="ExpiryDate" xml:space="preserve">
|
||||
<value>Expires</value>
|
||||
</data>
|
||||
<data name="GroupName" xml:space="preserve">
|
||||
<value>Group</value>
|
||||
</data>
|
||||
<data name="TagId" xml:space="preserve">
|
||||
<value>RFID-Key</value>
|
||||
</data>
|
||||
<data name="TagName" xml:space="preserve">
|
||||
<value>Name</value>
|
||||
</data>
|
||||
<data name="Title" xml:space="preserve">
|
||||
<value>Management</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -0,0 +1,156 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="ChargePointIdLabel" xml:space="preserve">
|
||||
<value>Kennung der Ladestation</value>
|
||||
</data>
|
||||
<data name="ConnectorIdLabel" xml:space="preserve">
|
||||
<value>Anschluss-Nr.</value>
|
||||
</data>
|
||||
<data name="ConnectorNameLabel" xml:space="preserve">
|
||||
<value>Name</value>
|
||||
</data>
|
||||
<data name="ConnectorNamePlaceholder" xml:space="preserve">
|
||||
<value>Bezeichnung (leer für Standard)</value>
|
||||
</data>
|
||||
<data name="EditConnector" xml:space="preserve">
|
||||
<value>Anschluss bearbeiten</value>
|
||||
</data>
|
||||
<data name="FieldMaxLength" xml:space="preserve">
|
||||
<value>Max. {0} Zeichen</value>
|
||||
</data>
|
||||
<data name="LastMeterLabel" xml:space="preserve">
|
||||
<value>Zählerstand</value>
|
||||
</data>
|
||||
<data name="LastMeterTimeLabel" xml:space="preserve">
|
||||
<value>Zähler Zeitpunkt</value>
|
||||
</data>
|
||||
<data name="LastStatusLabel" xml:space="preserve">
|
||||
<value>Letzter Status</value>
|
||||
</data>
|
||||
<data name="LastStatusTimeLabel" xml:space="preserve">
|
||||
<value>Status Zeitpunkt</value>
|
||||
</data>
|
||||
<data name="Save" xml:space="preserve">
|
||||
<value>Speichern</value>
|
||||
</data>
|
||||
<data name="Title" xml:space="preserve">
|
||||
<value>Management</value>
|
||||
</data>
|
||||
</root>
|
||||
156
OCPP.Core.Management/Resources/Views.Home.ConnectorDetail.resx
Normal file
156
OCPP.Core.Management/Resources/Views.Home.ConnectorDetail.resx
Normal file
@@ -0,0 +1,156 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="ChargePointIdLabel" xml:space="preserve">
|
||||
<value>Charge point ID</value>
|
||||
</data>
|
||||
<data name="ConnectorIdLabel" xml:space="preserve">
|
||||
<value>Connector No.</value>
|
||||
</data>
|
||||
<data name="ConnectorNameLabel" xml:space="preserve">
|
||||
<value>Name</value>
|
||||
</data>
|
||||
<data name="ConnectorNamePlaceholder" xml:space="preserve">
|
||||
<value>Override name (empty for default)</value>
|
||||
</data>
|
||||
<data name="EditConnector" xml:space="preserve">
|
||||
<value>Edit charge point connector</value>
|
||||
</data>
|
||||
<data name="FieldMaxLength" xml:space="preserve">
|
||||
<value>Max. {0} characters</value>
|
||||
</data>
|
||||
<data name="LastMeterLabel" xml:space="preserve">
|
||||
<value>Last meter</value>
|
||||
</data>
|
||||
<data name="LastMeterTimeLabel" xml:space="preserve">
|
||||
<value>Last meter timestamp</value>
|
||||
</data>
|
||||
<data name="LastStatusLabel" xml:space="preserve">
|
||||
<value>Last status</value>
|
||||
</data>
|
||||
<data name="LastStatusTimeLabel" xml:space="preserve">
|
||||
<value>Last status timestamp</value>
|
||||
</data>
|
||||
<data name="Save" xml:space="preserve">
|
||||
<value>Save</value>
|
||||
</data>
|
||||
<data name="Title" xml:space="preserve">
|
||||
<value>Management</value>
|
||||
</data>
|
||||
</root>
|
||||
144
OCPP.Core.Management/Resources/Views.Home.ConnectorList.de.resx
Normal file
144
OCPP.Core.Management/Resources/Views.Home.ConnectorList.de.resx
Normal file
@@ -0,0 +1,144 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="ChargePointId" xml:space="preserve">
|
||||
<value>Ladestation</value>
|
||||
</data>
|
||||
<data name="ConnectorId" xml:space="preserve">
|
||||
<value>Anschluss Nr.</value>
|
||||
</data>
|
||||
<data name="ConnectorName" xml:space="preserve">
|
||||
<value>Name</value>
|
||||
</data>
|
||||
<data name="LastMeter" xml:space="preserve">
|
||||
<value>Zählerstand</value>
|
||||
</data>
|
||||
<data name="LastMeterTime" xml:space="preserve">
|
||||
<value>Zähler Zeitpunkt</value>
|
||||
</data>
|
||||
<data name="LastStatus" xml:space="preserve">
|
||||
<value>Letzter Status</value>
|
||||
</data>
|
||||
<data name="LastStatusTime" xml:space="preserve">
|
||||
<value>Status Zeitpunkt</value>
|
||||
</data>
|
||||
<data name="Title" xml:space="preserve">
|
||||
<value>Management</value>
|
||||
</data>
|
||||
</root>
|
||||
144
OCPP.Core.Management/Resources/Views.Home.ConnectorList.resx
Normal file
144
OCPP.Core.Management/Resources/Views.Home.ConnectorList.resx
Normal file
@@ -0,0 +1,144 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="ChargePointId" xml:space="preserve">
|
||||
<value>Charge point</value>
|
||||
</data>
|
||||
<data name="ConnectorId" xml:space="preserve">
|
||||
<value>Connector</value>
|
||||
</data>
|
||||
<data name="ConnectorName" xml:space="preserve">
|
||||
<value>Name</value>
|
||||
</data>
|
||||
<data name="LastMeter" xml:space="preserve">
|
||||
<value>Last meter value</value>
|
||||
</data>
|
||||
<data name="LastMeterTime" xml:space="preserve">
|
||||
<value>Meter timestamp</value>
|
||||
</data>
|
||||
<data name="LastStatus" xml:space="preserve">
|
||||
<value>Last status</value>
|
||||
</data>
|
||||
<data name="LastStatusTime" xml:space="preserve">
|
||||
<value>Status timestamp</value>
|
||||
</data>
|
||||
<data name="Title" xml:space="preserve">
|
||||
<value>Management</value>
|
||||
</data>
|
||||
</root>
|
||||
144
OCPP.Core.Management/Resources/Views.Home.Index.de.resx
Normal file
144
OCPP.Core.Management/Resources/Views.Home.Index.de.resx
Normal file
@@ -0,0 +1,144 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="Available" xml:space="preserve">
|
||||
<value>Frei</value>
|
||||
</data>
|
||||
<data name="ChargekWh" xml:space="preserve">
|
||||
<value>{0:0.0##} kWh</value>
|
||||
</data>
|
||||
<data name="ChargePointOffline" xml:space="preserve">
|
||||
<value>Die Ladestation ist Offline</value>
|
||||
</data>
|
||||
<data name="ChargePointOnline" xml:space="preserve">
|
||||
<value>Die Ladestation ist Online</value>
|
||||
</data>
|
||||
<data name="ChargeTime" xml:space="preserve">
|
||||
<value>{0} Std. {1} Min.</value>
|
||||
</data>
|
||||
<data name="Charging" xml:space="preserve">
|
||||
<value>Ladevorgang</value>
|
||||
</data>
|
||||
<data name="Faulted" xml:space="preserve">
|
||||
<value>Defekt</value>
|
||||
</data>
|
||||
<data name="Unavailable" xml:space="preserve">
|
||||
<value>Nicht verfügbar</value>
|
||||
</data>
|
||||
</root>
|
||||
144
OCPP.Core.Management/Resources/Views.Home.Index.resx
Normal file
144
OCPP.Core.Management/Resources/Views.Home.Index.resx
Normal file
@@ -0,0 +1,144 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="Available" xml:space="preserve">
|
||||
<value>Available</value>
|
||||
</data>
|
||||
<data name="ChargekWh" xml:space="preserve">
|
||||
<value>{0:0.0##} kWh</value>
|
||||
</data>
|
||||
<data name="ChargePointOffline" xml:space="preserve">
|
||||
<value>Charge station is offline</value>
|
||||
</data>
|
||||
<data name="ChargePointOnline" xml:space="preserve">
|
||||
<value>Charge station is online</value>
|
||||
</data>
|
||||
<data name="ChargeTime" xml:space="preserve">
|
||||
<value>{0}h {1}m</value>
|
||||
</data>
|
||||
<data name="Charging" xml:space="preserve">
|
||||
<value>Charging</value>
|
||||
</data>
|
||||
<data name="Faulted" xml:space="preserve">
|
||||
<value>Faulted</value>
|
||||
</data>
|
||||
<data name="Unavailable" xml:space="preserve">
|
||||
<value>Unavailable</value>
|
||||
</data>
|
||||
</root>
|
||||
165
OCPP.Core.Management/Resources/Views.Home.Transactions.de.resx
Normal file
165
OCPP.Core.Management/Resources/Views.Home.Transactions.de.resx
Normal file
@@ -0,0 +1,165 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="ChargePointLabel" xml:space="preserve">
|
||||
<value>Ladestation:</value>
|
||||
</data>
|
||||
<data name="ChargeSum" xml:space="preserve">
|
||||
<value>Geladen</value>
|
||||
</data>
|
||||
<data name="Connector" xml:space="preserve">
|
||||
<value>Ladestation/Anschluss</value>
|
||||
</data>
|
||||
<data name="DownloadCsv" xml:space="preserve">
|
||||
<value>Als CSV herunterladen</value>
|
||||
</data>
|
||||
<data name="StartMeter" xml:space="preserve">
|
||||
<value>Beginn-Zähler</value>
|
||||
</data>
|
||||
<data name="StartTag" xml:space="preserve">
|
||||
<value>Token</value>
|
||||
</data>
|
||||
<data name="StartTime" xml:space="preserve">
|
||||
<value>Beginn</value>
|
||||
</data>
|
||||
<data name="StopMeter" xml:space="preserve">
|
||||
<value>Ende-Zähler</value>
|
||||
</data>
|
||||
<data name="StopTag" xml:space="preserve">
|
||||
<value>Token</value>
|
||||
</data>
|
||||
<data name="StopTime" xml:space="preserve">
|
||||
<value>Ende</value>
|
||||
</data>
|
||||
<data name="TimeSpan30" xml:space="preserve">
|
||||
<value>30 Tage</value>
|
||||
</data>
|
||||
<data name="TimeSpan365" xml:space="preserve">
|
||||
<value>1 Jahr</value>
|
||||
</data>
|
||||
<data name="TimeSpan90" xml:space="preserve">
|
||||
<value>90 Tage</value>
|
||||
</data>
|
||||
<data name="TimeSpanLabel" xml:space="preserve">
|
||||
<value>Zeit:</value>
|
||||
</data>
|
||||
<data name="Title" xml:space="preserve">
|
||||
<value>Management</value>
|
||||
</data>
|
||||
</root>
|
||||
165
OCPP.Core.Management/Resources/Views.Home.Transactions.resx
Normal file
165
OCPP.Core.Management/Resources/Views.Home.Transactions.resx
Normal file
@@ -0,0 +1,165 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="ChargePointLabel" xml:space="preserve">
|
||||
<value>Charge point:</value>
|
||||
</data>
|
||||
<data name="ChargeSum" xml:space="preserve">
|
||||
<value>Charged</value>
|
||||
</data>
|
||||
<data name="Connector" xml:space="preserve">
|
||||
<value>Charge point/Connector</value>
|
||||
</data>
|
||||
<data name="DownloadCsv" xml:space="preserve">
|
||||
<value>Download as CSV</value>
|
||||
</data>
|
||||
<data name="StartMeter" xml:space="preserve">
|
||||
<value>Start-Meter</value>
|
||||
</data>
|
||||
<data name="StartTag" xml:space="preserve">
|
||||
<value>Start-Tag</value>
|
||||
</data>
|
||||
<data name="StartTime" xml:space="preserve">
|
||||
<value>Start</value>
|
||||
</data>
|
||||
<data name="StopMeter" xml:space="preserve">
|
||||
<value>Stop-Meter</value>
|
||||
</data>
|
||||
<data name="StopTag" xml:space="preserve">
|
||||
<value>Stop-Tag</value>
|
||||
</data>
|
||||
<data name="StopTime" xml:space="preserve">
|
||||
<value>Stop</value>
|
||||
</data>
|
||||
<data name="TimeSpan30" xml:space="preserve">
|
||||
<value>30 days</value>
|
||||
</data>
|
||||
<data name="TimeSpan365" xml:space="preserve">
|
||||
<value>1 year</value>
|
||||
</data>
|
||||
<data name="TimeSpan90" xml:space="preserve">
|
||||
<value>90 days</value>
|
||||
</data>
|
||||
<data name="TimeSpanLabel" xml:space="preserve">
|
||||
<value>Interval:</value>
|
||||
</data>
|
||||
<data name="Title" xml:space="preserve">
|
||||
<value>Management</value>
|
||||
</data>
|
||||
</root>
|
||||
132
OCPP.Core.Management/Resources/Views.Shared.Error.de.resx
Normal file
132
OCPP.Core.Management/Resources/Views.Shared.Error.de.resx
Normal file
@@ -0,0 +1,132 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="AccessDenied" xml:space="preserve">
|
||||
<value>Zugriff verweigert. Sie sind nicht berechtigt, diese Seite aufzurufen.</value>
|
||||
</data>
|
||||
<data name="InfoError" xml:space="preserve">
|
||||
<value>Bei der Bearbeitung der Anfrage ist ein Fehler aufgetreten.</value>
|
||||
</data>
|
||||
<data name="Title" xml:space="preserve">
|
||||
<value>Fehler</value>
|
||||
</data>
|
||||
<data name="TitleDetail" xml:space="preserve">
|
||||
<value>Fehler Details:</value>
|
||||
</data>
|
||||
</root>
|
||||
132
OCPP.Core.Management/Resources/Views.Shared.Error.resx
Normal file
132
OCPP.Core.Management/Resources/Views.Shared.Error.resx
Normal file
@@ -0,0 +1,132 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="AccessDenied" xml:space="preserve">
|
||||
<value>Access denied. You don’t have permission to access this page.</value>
|
||||
</data>
|
||||
<data name="InfoError" xml:space="preserve">
|
||||
<value>An error occurred while processing your request.</value>
|
||||
</data>
|
||||
<data name="Title" xml:space="preserve">
|
||||
<value>Error</value>
|
||||
</data>
|
||||
<data name="TitleDetail" xml:space="preserve">
|
||||
<value>Error details:</value>
|
||||
</data>
|
||||
</root>
|
||||
138
OCPP.Core.Management/Resources/Views.Shared._Layout.de.resx
Normal file
138
OCPP.Core.Management/Resources/Views.Shared._Layout.de.resx
Normal file
@@ -0,0 +1,138 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="Administration" xml:space="preserve">
|
||||
<value>Administration</value>
|
||||
</data>
|
||||
<data name="ChargePoints" xml:space="preserve">
|
||||
<value>Ladestationen</value>
|
||||
</data>
|
||||
<data name="ChargeTags" xml:space="preserve">
|
||||
<value>RFID-Schlüssel</value>
|
||||
</data>
|
||||
<data name="Connectors" xml:space="preserve">
|
||||
<value>Anschlüsse</value>
|
||||
</data>
|
||||
<data name="Logout" xml:space="preserve">
|
||||
<value>Abmelden</value>
|
||||
</data>
|
||||
<data name="Overview" xml:space="preserve">
|
||||
<value>Übersicht</value>
|
||||
</data>
|
||||
</root>
|
||||
138
OCPP.Core.Management/Resources/Views.Shared._Layout.resx
Normal file
138
OCPP.Core.Management/Resources/Views.Shared._Layout.resx
Normal file
@@ -0,0 +1,138 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="Administration" xml:space="preserve">
|
||||
<value>Administration</value>
|
||||
</data>
|
||||
<data name="ChargePoints" xml:space="preserve">
|
||||
<value>Charge points</value>
|
||||
</data>
|
||||
<data name="ChargeTags" xml:space="preserve">
|
||||
<value>RFID-Tags</value>
|
||||
</data>
|
||||
<data name="Connectors" xml:space="preserve">
|
||||
<value>Connectors</value>
|
||||
</data>
|
||||
<data name="Logout" xml:space="preserve">
|
||||
<value>Logout</value>
|
||||
</data>
|
||||
<data name="Overview" xml:space="preserve">
|
||||
<value>Overview</value>
|
||||
</data>
|
||||
</root>
|
||||
115
OCPP.Core.Management/Startup.cs
Normal file
115
OCPP.Core.Management/Startup.cs
Normal file
@@ -0,0 +1,115 @@
|
||||
/*
|
||||
* OCPP.Core - https://github.com/dallmann-consulting/OCPP.Core
|
||||
* Copyright (C) 2020-2021 dallmann consulting GmbH.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Authentication.Cookies;
|
||||
using Microsoft.AspNetCore.Builder;
|
||||
using Microsoft.AspNetCore.Hosting;
|
||||
using Microsoft.AspNetCore.Identity;
|
||||
using Microsoft.AspNetCore.Localization;
|
||||
using Microsoft.AspNetCore.Mvc.Razor;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using OCPP.Core.Database;
|
||||
|
||||
namespace OCPP.Core.Management
|
||||
{
|
||||
public class Startup
|
||||
{
|
||||
public Startup(IConfiguration configuration)
|
||||
{
|
||||
Configuration = configuration;
|
||||
}
|
||||
|
||||
public IConfiguration Configuration { get; }
|
||||
|
||||
// This method gets called by the runtime. Use this method to add services to the container.
|
||||
public void ConfigureServices(IServiceCollection services)
|
||||
{
|
||||
services.AddOCPPDbContext(Configuration);
|
||||
|
||||
services.AddControllersWithViews();
|
||||
|
||||
services.AddAuthentication(
|
||||
CookieAuthenticationDefaults.AuthenticationScheme)
|
||||
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme,
|
||||
options =>
|
||||
{
|
||||
options.LoginPath = "/Account/Login";
|
||||
options.LogoutPath = "/Account/Logout";
|
||||
});
|
||||
|
||||
services.AddLocalization(opts => { opts.ResourcesPath = "Resources"; });
|
||||
services.AddMvc()
|
||||
.AddViewLocalization(
|
||||
LanguageViewLocationExpanderFormat.Suffix,
|
||||
opts => { opts.ResourcesPath = "Resources"; })
|
||||
.AddDataAnnotationsLocalization();
|
||||
|
||||
// authentication
|
||||
services.AddAuthentication(options =>
|
||||
{
|
||||
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
|
||||
});
|
||||
|
||||
services.AddTransient(
|
||||
m => new UserManager(Configuration)
|
||||
);
|
||||
services.AddDistributedMemoryCache();
|
||||
}
|
||||
|
||||
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
|
||||
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
|
||||
{
|
||||
if (env.IsDevelopment())
|
||||
{
|
||||
app.UseDeveloperExceptionPage();
|
||||
}
|
||||
else
|
||||
{
|
||||
app.UseExceptionHandler("/Home/Error");
|
||||
}
|
||||
|
||||
app.UseStaticFiles();
|
||||
|
||||
app.UseAuthentication();
|
||||
app.UseRouting();
|
||||
app.UseAuthorization();
|
||||
|
||||
var supportedCultures = new[] { "en", "de" };
|
||||
var localizationOptions = new RequestLocalizationOptions().SetDefaultCulture(supportedCultures[0])
|
||||
.AddSupportedCultures(supportedCultures)
|
||||
.AddSupportedUICultures(supportedCultures);
|
||||
app.UseRequestLocalization(localizationOptions);
|
||||
|
||||
app.UseEndpoints(endpoints =>
|
||||
{
|
||||
endpoints.MapControllerRoute(
|
||||
name: "default",
|
||||
pattern: "{controller=Home}/{action=Index}/{id?}/{connectorId?}/");
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
97
OCPP.Core.Management/UserManager.cs
Normal file
97
OCPP.Core.Management/UserManager.cs
Normal file
@@ -0,0 +1,97 @@
|
||||
/*
|
||||
* OCPP.Core - https://github.com/dallmann-consulting/OCPP.Core
|
||||
* Copyright (C) 2020-2021 dallmann consulting GmbH.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
using Microsoft.AspNetCore.Authentication;
|
||||
using Microsoft.AspNetCore.Authentication.Cookies;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Security.Claims;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using OCPP.Core.Management.Models;
|
||||
|
||||
namespace OCPP.Core.Management
|
||||
{
|
||||
public class UserManager
|
||||
{
|
||||
private IConfiguration Configuration;
|
||||
|
||||
public UserManager(IConfiguration configuration)
|
||||
{
|
||||
Configuration = configuration;
|
||||
}
|
||||
|
||||
public async Task SignIn(HttpContext httpContext, UserModel user, bool isPersistent = false)
|
||||
{
|
||||
try
|
||||
{
|
||||
IEnumerable cfgUsers = Configuration.GetSection("Users").GetChildren();
|
||||
|
||||
foreach (ConfigurationSection cfgUser in cfgUsers)
|
||||
{
|
||||
if (cfgUser.GetValue<string>("Username") == user.Username &&
|
||||
cfgUser.GetValue<string>("Password") == user.Password)
|
||||
{
|
||||
user.IsAdmin = cfgUser.GetValue<bool>(Constants.AdminRoleName);
|
||||
ClaimsIdentity identity = new ClaimsIdentity(this.GetUserClaims(user), CookieAuthenticationDefaults.AuthenticationScheme);
|
||||
ClaimsPrincipal principal = new ClaimsPrincipal(identity);
|
||||
|
||||
await httpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
catch //(Exception exp)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
public async Task SignOut(HttpContext httpContext)
|
||||
{
|
||||
await httpContext.SignOutAsync();
|
||||
}
|
||||
|
||||
private IEnumerable<Claim> GetUserClaims(UserModel user)
|
||||
{
|
||||
List<Claim> claims = new List<Claim>();
|
||||
|
||||
claims.Add(new Claim(ClaimTypes.NameIdentifier, user.Username));
|
||||
claims.Add(new Claim(ClaimTypes.Name , user.Username));
|
||||
claims.AddRange(this.GetUserRoleClaims(user));
|
||||
return claims;
|
||||
}
|
||||
|
||||
private IEnumerable<Claim> GetUserRoleClaims(UserModel user)
|
||||
{
|
||||
List<Claim> claims = new List<Claim>();
|
||||
|
||||
claims.Add(new Claim(ClaimTypes.NameIdentifier, user.Username));
|
||||
if (user.IsAdmin)
|
||||
{
|
||||
claims.Add(new Claim(ClaimTypes.Role, Constants.AdminRoleName));
|
||||
}
|
||||
return claims;
|
||||
}
|
||||
}
|
||||
}
|
||||
44
OCPP.Core.Management/Views/Account/Login.cshtml
Normal file
44
OCPP.Core.Management/Views/Account/Login.cshtml
Normal file
@@ -0,0 +1,44 @@
|
||||
@using System.Collections.Generic
|
||||
@using Microsoft.AspNetCore.Authentication
|
||||
@using Microsoft.AspNetCore.Http
|
||||
@using Microsoft.AspNetCore.Mvc.Localization
|
||||
@model UserModel
|
||||
@inject IViewLocalizer Localizer
|
||||
@{
|
||||
ViewData["Title"] = @Localizer["Title"];
|
||||
}
|
||||
|
||||
<h1><i class="fas fa-user"></i> @ViewData["Title"]</h1>
|
||||
<div class="row">
|
||||
<div class="col-md-8">
|
||||
<section>
|
||||
<form asp-controller="Account" asp-action="Login" asp-route-returnurl="@ViewData["ReturnUrl"]" method="post" class="form-horizontal" role="form">
|
||||
<hr />
|
||||
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
|
||||
<div class="form-group">
|
||||
<label asp-for="Username" class="col-md-2 control-label">@Localizer["Username"]</label>
|
||||
<div class="col-md-10">
|
||||
<input asp-for="Username" class="form-control" />
|
||||
<span asp-validation-for="Username" class="text-danger"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label asp-for="Password" class="col-md-2 control-label">@Localizer["Password"]</label>
|
||||
<div class="col-md-10">
|
||||
<input asp-for="Password" type="password" class="form-control" />
|
||||
<span asp-validation-for="Password" class="text-danger"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-md-offset-2 col-md-10">
|
||||
<button type="submit" class="btn btn-primary">@Localizer["Login"]</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@section Scripts {
|
||||
@{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
|
||||
}
|
||||
264
OCPP.Core.Management/Views/Home/ChargePointDetail.cshtml
Normal file
264
OCPP.Core.Management/Views/Home/ChargePointDetail.cshtml
Normal file
@@ -0,0 +1,264 @@
|
||||
@using Microsoft.AspNetCore.Mvc.Localization
|
||||
@model ChargePointViewModel
|
||||
@inject IViewLocalizer Localizer
|
||||
@{
|
||||
ViewData["Title"] = @Localizer["Title"];
|
||||
}
|
||||
<br />
|
||||
|
||||
@if (Model != null)
|
||||
{
|
||||
@using (Html.BeginForm())
|
||||
{
|
||||
@Html.AntiForgeryToken()
|
||||
|
||||
<h4>@Localizer["EditChargePoint"]</h4>
|
||||
<br />
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-sm-2 align-self-center">
|
||||
<div class="form-group">
|
||||
<label class="inline-label" for="ChargePointId">@Localizer["ChargePointIdLabel"]</label>
|
||||
</div>
|
||||
</div>
|
||||
@if (Model.CurrentId == "@")
|
||||
{
|
||||
<div class="col-sm-6">
|
||||
<div class="form-group">
|
||||
<input type="text" class="form-control" data-val="true" data-val-length="@string.Format(Localizer["FieldMaxLength"].Value, 100)" data-val-length-max="100" data-val-required="@Localizer["RequiredField"]" id="ChargePointId" maxlength="100" name="ChargePointId" placeholder="@Localizer["ChargePointIdPlaceholder"]" value="@Model.ChargePointId">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-2">
|
||||
<span class="field-validation-valid text-danger" data-valmsg-for="ChargePointId" data-valmsg-replace="true"></span>
|
||||
</div>
|
||||
}
|
||||
else
|
||||
{
|
||||
<div class="col-sm-6">
|
||||
<div class="form-group">
|
||||
<input type="text" readonly class="form-control" id="ChargePointId" name="ChargePointId" placeholder="@Localizer["ChargePointIdPlaceholder"]" value="@Model.ChargePointId">
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-sm-2 align-self-center">
|
||||
<div class="form-group">
|
||||
<label class="inline-label" for="Name">@Localizer["NameLabel"]</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<div class="form-group">
|
||||
<input class="form-control" data-val="true" data-val-length="@string.Format(Localizer["FieldMaxLength"].Value, 100)" data-val-length-max="100" data-val-required="@Localizer["RequiredField"]" id="Name" maxlength="100" name="Name" placeholder="@Localizer["NamePlaceholder"]" type="text" value="@Model.Name" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-2">
|
||||
<span class="field-validation-valid text-danger" data-valmsg-for="Name" data-valmsg-replace="true"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-sm-2 align-self-center">
|
||||
<div class="form-group">
|
||||
<label class="inline-label" for="Comment">@Localizer["CommentLabel"]</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<div class="form-group">
|
||||
<input class="form-control" data-val="true" data-val-length="@string.Format(Localizer["FieldMaxLength"].Value, 200)" data-val-length-max="200" id="Comment" maxlength="200" name="Comment" placeholder="@Localizer["CommentPlaceholder"]" type="text" value="@Model.Comment" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-2">
|
||||
<span class="field-validation-valid text-danger" data-valmsg-for="Comment" data-valmsg-replace="true"></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="row">
|
||||
<div class="col-sm-2 align-self-center">
|
||||
<div class="form-group">
|
||||
<label class="inline-label" for="Username">@Localizer["UsernameLabel"]</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<div class="form-group">
|
||||
<input class="form-control" data-val="true" data-val-length="@string.Format(Localizer["FieldMaxLength"].Value, 50)" data-val-length-max="50" id="Username" maxlength="50" name="Username" placeholder="@Localizer["UsernamePlaceholder"]" type="text" value="@Model.Username" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-2">
|
||||
<span class="field-validation-valid text-danger" data-valmsg-for="Username" data-valmsg-replace="true"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-sm-2 align-self-center">
|
||||
<div class="form-group">
|
||||
<label class="inline-label" for="Password">@Localizer["PasswordLabel"]</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<div class="form-group">
|
||||
<input class="form-control" data-val="true" data-val-length="@string.Format(Localizer["FieldMaxLength"].Value, 50)" data-val-length-max="50" id="Password" maxlength="50" name="Password" placeholder="@Localizer["PasswordPlaceholder"]" type="text" value="@Model.Password" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-2">
|
||||
<span class="field-validation-valid text-danger" data-valmsg-for="Password" data-valmsg-replace="true"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-sm-2 align-self-center">
|
||||
<div class="form-group">
|
||||
<label class="inline-label" for="ClientCertThumb">@Localizer["ClientCertThumbLabel"]</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<div class="form-group">
|
||||
<input class="form-control" data-val="true" data-val-length="@string.Format(Localizer["FieldMaxLength"].Value, 100)" data-val-length-max="100" id="ClientCertThumb" maxlength="100" name="ClientCertThumb" placeholder="@Localizer["ClientCertThumbPlaceholder"]" type="text" value="@Model.ClientCertThumb" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-2">
|
||||
<span class="field-validation-valid text-danger" data-valmsg-for="ClientCertThumb" data-valmsg-replace="true"></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-sm-12 text-danger">
|
||||
@ViewBag.ErrorMsg
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-sm-1">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-sm-2">
|
||||
<button type="submit" class="btn btn-primary">@Localizer[(Model.CurrentId == "@") ? "SaveNew" : "Save"].Value</button>
|
||||
</div>
|
||||
</div>
|
||||
@if (!string.IsNullOrWhiteSpace(Model.ChargePointId))
|
||||
{
|
||||
<div class="row">
|
||||
<div class="col-sm-1">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-sm-1">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-sm-2">
|
||||
<button type="button" class="btn btn-info" id="btnReset" title="@Localizer["TitleReset"]" onclick="ResetChargepoint()"><i class="fas fa-redo"></i> @Localizer["TitleReset"]</button>
|
||||
</div>
|
||||
<div class="col-sm-2">
|
||||
<button type="button" class="btn btn-info" id="btnUnlock" title="@Localizer["TitleUnlockConnector"]" onclick="UnlockConnector()"><i class="fas fa-lock-open"></i> @Localizer["TitleUnlockConnector"]</button>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
}
|
||||
|
||||
|
||||
@section scripts {
|
||||
@if (!string.IsNullOrWhiteSpace(Model.ChargePointId))
|
||||
{
|
||||
<script>
|
||||
function ResetChargepoint() {
|
||||
var dialog = new BootstrapDialog({
|
||||
title: '@Localizer["TitleReset"]',
|
||||
message: '@string.Format(Localizer["DialogReset"].Value, Model.Name)',
|
||||
spinicon: 'fa fa-spinner fa-fw',
|
||||
buttons: [{
|
||||
id: 'btnDialogReset',
|
||||
label: '@Localizer["TitleReset"]',
|
||||
icon: 'fas fa-redo',
|
||||
autospin: true,
|
||||
action: function (dialogRef) {
|
||||
dialogRef.enableButtons(false);
|
||||
dialogRef.setClosable(false);
|
||||
dialogRef.getModalBody().html('@Localizer["ExecuteReset"]');
|
||||
|
||||
var xmlhttp = new XMLHttpRequest();
|
||||
xmlhttp.onreadystatechange = function () {
|
||||
if (xmlhttp.readyState == XMLHttpRequest.DONE) {
|
||||
if (xmlhttp.status == 200) {
|
||||
dialogRef.getModalBody().html(xmlhttp.responseText);
|
||||
}
|
||||
else {
|
||||
dialogRef.getModalBody().html('@Localizer["ErrorReset"]');
|
||||
}
|
||||
|
||||
dialogRef.setClosable(true);
|
||||
dialogRef.enableButtons(true);
|
||||
var $resetButton = dialog.getButton('btnDialogReset');
|
||||
$resetButton.hide();
|
||||
var $cancelButton = dialog.getButton('btnDialogCancel');
|
||||
$cancelButton.text('@Localizer["Close"]');
|
||||
|
||||
}
|
||||
};
|
||||
xmlhttp.open("GET", "@Html.Raw(Url.Content("~/API/Reset/" + Uri.EscapeDataString(Model.ChargePointId)))", true);
|
||||
xmlhttp.send();
|
||||
}
|
||||
}, {
|
||||
id: 'btnDialogCancel',
|
||||
label: '@Localizer["Cancel"]',
|
||||
action: function (dialogRef) {
|
||||
dialogRef.close();
|
||||
}
|
||||
}]
|
||||
});
|
||||
dialog.open();
|
||||
}
|
||||
|
||||
function UnlockConnector() {
|
||||
var dialog = new BootstrapDialog({
|
||||
title: '@Localizer["TitleUnlockConnector"]',
|
||||
message: '@string.Format(Localizer["DialogUnlockConnector"].Value, Model.Name)',
|
||||
spinicon: 'fa fa-spinner fa-fw',
|
||||
buttons: [{
|
||||
id: 'btnUnlock',
|
||||
label: '@Localizer["TitleUnlockConnector"]',
|
||||
icon: 'fas fa-lock-open',
|
||||
autospin: true,
|
||||
action: function (dialogRef) {
|
||||
dialogRef.enableButtons(false);
|
||||
dialogRef.setClosable(false);
|
||||
dialogRef.getModalBody().html('@Localizer["ExecuteUnlock"]');
|
||||
|
||||
var xmlhttp = new XMLHttpRequest();
|
||||
xmlhttp.onreadystatechange = function () {
|
||||
if (xmlhttp.readyState == XMLHttpRequest.DONE) {
|
||||
if (xmlhttp.status == 200) {
|
||||
dialogRef.getModalBody().html(xmlhttp.responseText);
|
||||
}
|
||||
else {
|
||||
dialogRef.getModalBody().html('@Localizer["ErrorUnlock"]');
|
||||
}
|
||||
|
||||
dialogRef.setClosable(true);
|
||||
dialogRef.enableButtons(true);
|
||||
var $resetButton = dialog.getButton('btnUnlock');
|
||||
$resetButton.hide();
|
||||
var $cancelButton = dialog.getButton('btnDialogCancel');
|
||||
$cancelButton.text('@Localizer["Close"]');
|
||||
|
||||
}
|
||||
};
|
||||
xmlhttp.open("GET", "@Html.Raw(Url.Content("~/API/UnlockConnector/" + Uri.EscapeDataString(Model.ChargePointId)))", true);
|
||||
xmlhttp.send();
|
||||
}
|
||||
}, {
|
||||
id: 'btnDialogCancel',
|
||||
label: '@Localizer["Cancel"]',
|
||||
action: function (dialogRef) {
|
||||
dialogRef.close();
|
||||
}
|
||||
}]
|
||||
});
|
||||
dialog.open();
|
||||
}
|
||||
</script>
|
||||
}
|
||||
}
|
||||
}
|
||||
37
OCPP.Core.Management/Views/Home/ChargePointList.cshtml
Normal file
37
OCPP.Core.Management/Views/Home/ChargePointList.cshtml
Normal file
@@ -0,0 +1,37 @@
|
||||
@using Microsoft.AspNetCore.Mvc.Localization
|
||||
@model ChargePointViewModel
|
||||
@inject IViewLocalizer Localizer
|
||||
@{
|
||||
ViewData["Title"] = @Localizer["Title"];
|
||||
}
|
||||
<br />
|
||||
|
||||
@if (Model != null)
|
||||
{
|
||||
<table id="dtChargeTags" class="table table-striped table-bordered table-sm table-hover" cellspacing="0" width="100%">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="th-sm">@Localizer["ChargePointId"]</th>
|
||||
<th class="th-sm">@Localizer["Name"]</th>
|
||||
<th class="th-sm">@Localizer["Comment"]</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@if (Model.ChargePoints != null)
|
||||
{
|
||||
foreach (ChargePoint cp in Model.ChargePoints)
|
||||
{
|
||||
<tr class="table-row" data-href='@Url.Action("ChargePoint", Constants.HomeController, new { id = cp.ChargePointId })'>
|
||||
<td>@cp.ChargePointId</td>
|
||||
<td>@cp.Name</td>
|
||||
<td>@cp.Comment</td>
|
||||
</tr>
|
||||
}
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<br />
|
||||
<a class="btn btn-secondary" href="~/Home/ChargePoint/@@">@Localizer["AddNew"]</a>
|
||||
}
|
||||
|
||||
129
OCPP.Core.Management/Views/Home/ChargeTagDetail.cshtml
Normal file
129
OCPP.Core.Management/Views/Home/ChargeTagDetail.cshtml
Normal file
@@ -0,0 +1,129 @@
|
||||
@using Microsoft.AspNetCore.Mvc.Localization
|
||||
@model ChargeTagViewModel
|
||||
@inject IViewLocalizer Localizer
|
||||
@{
|
||||
ViewData["Title"] = @Localizer["Title"];
|
||||
}
|
||||
<br />
|
||||
|
||||
@if (Model != null)
|
||||
{
|
||||
@using (Html.BeginForm())
|
||||
{
|
||||
@Html.AntiForgeryToken()
|
||||
|
||||
<h4>@Localizer["EditChargeTag"]</h4>
|
||||
<br />
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-sm-2 align-self-center">
|
||||
<div class="form-group">
|
||||
<label class="inline-label" for="TagId">@Localizer["ChargeTagIdLabel"]</label>
|
||||
</div>
|
||||
</div>
|
||||
@if (Model.CurrentTagId == "@")
|
||||
{
|
||||
<div class="col-sm-6">
|
||||
<div class="form-group">
|
||||
<input type="text" class="form-control" data-val="true" data-val-length="@string.Format(Localizer["FieldMaxLength"].Value, 50)" data-val-length-max="50" data-val-required="@Localizer["RequiredField"]" id="TagId" maxlength="50" name="TagId" placeholder="@Localizer["ChargeTagIdPlaceholder"]" value="@Model.TagId">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-2">
|
||||
<span class="field-validation-valid text-danger" data-valmsg-for="TagId" data-valmsg-replace="true"></span>
|
||||
</div>
|
||||
}
|
||||
else
|
||||
{
|
||||
<div class="col-sm-6">
|
||||
<div class="form-group">
|
||||
<input type="text" readonly class="form-control" id="TagId" name="TagId" placeholder="@Localizer["ChargeTagIdPlaceholder"]" value="@Model.TagId">
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-sm-2 align-self-center">
|
||||
<div class="form-group">
|
||||
<label class="inline-label" for="TagName">@Localizer["ChargeTagNameLabel"]</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<div class="form-group">
|
||||
<input class="form-control" data-val="true" data-val-length="@string.Format(Localizer["FieldMaxLength"].Value, 200)" data-val-length-max="200" data-val-required="@Localizer["RequiredField"]" id="TagName" maxlength="200" name="TagName" placeholder="@Localizer["ChargeTagNamePlaceholder"]" type="text" value="@Model.TagName" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-2">
|
||||
<span class="field-validation-valid text-danger" data-valmsg-for="TagName" data-valmsg-replace="true"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-sm-2 align-self-center">
|
||||
<div class="form-group">
|
||||
<label class="inline-label" for="TagName">@Localizer["GroupNameLabel"]</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<div class="form-group">
|
||||
<input class="form-control" data-val="true" data-val-length="@string.Format(Localizer["FieldMaxLength"].Value, 50)" data-val-length-max="50" id="ParentTagId" maxlength="50" name="ParentTagId" placeholder="@Localizer["GroupNamePlaceholder"]" type="text" value="@Model.ParentTagId" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-2">
|
||||
<span class="field-validation-valid text-danger" data-valmsg-for="ParentTagId" data-valmsg-replace="true"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-sm-2 align-self-center">
|
||||
<div class="form-group">
|
||||
<label class="inline-label" for="expiryDatetimepicker">@Localizer["ChargeTagExpirationLabel"]</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<div class="form-group">
|
||||
<div class="input-group date" id="expiryDatetimepicker" style="max-width: 180px">
|
||||
<input type="text" class="form-control" id="ExpiryDate" name="ExpiryDate" value="@Model.ExpiryDate?.ToString(ViewBag.DatePattern)">
|
||||
<span class="input-group-append"><i class="input-group-text fa fa-calendar" style="padding-top: 10px;"></i></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-sm-2 align-self-center">
|
||||
<label class="form-check-label inline-label" for="Blocked">@Localizer["ChargeTagBlockedLabel"]</label>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<div class="form-check">
|
||||
@Html.CheckBoxFor(m => m.Blocked, new { @class = "form-check-input checkbox-lg" })
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-sm-12 text-danger">
|
||||
@ViewBag.ErrorMsg
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-sm-1">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-sm-2">
|
||||
<button type="submit" class="btn btn-primary">@Localizer[(Model.CurrentTagId == "@") ? "SaveNew" : "Save"].Value</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
|
||||
@section scripts {
|
||||
<script>
|
||||
$(function () {
|
||||
$('#expiryDatetimepicker').datepicker({
|
||||
weekStart: 1,
|
||||
todayBtn: true,
|
||||
language: "@ViewBag.Language",
|
||||
todayHighlight: true
|
||||
});
|
||||
});
|
||||
</script>
|
||||
}
|
||||
}
|
||||
41
OCPP.Core.Management/Views/Home/ChargeTagList.cshtml
Normal file
41
OCPP.Core.Management/Views/Home/ChargeTagList.cshtml
Normal file
@@ -0,0 +1,41 @@
|
||||
@using Microsoft.AspNetCore.Mvc.Localization
|
||||
@model ChargeTagViewModel
|
||||
@inject IViewLocalizer Localizer
|
||||
@{
|
||||
ViewData["Title"] = @Localizer["Title"];
|
||||
}
|
||||
<br />
|
||||
|
||||
@if (Model != null)
|
||||
{
|
||||
<table id="dtChargeTags" class="table table-striped table-bordered table-sm table-hover" cellspacing="0" width="100%">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="th-sm">@Localizer["TagId"]</th>
|
||||
<th class="th-sm">@Localizer["TagName"]</th>
|
||||
<th class="th-sm">@Localizer["GroupName"]</th>
|
||||
<th class="th-sm">@Localizer["ExpiryDate"]</th>
|
||||
<th class="th-sm">@Localizer["Blocked"]</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@if (Model.ChargeTags != null)
|
||||
{
|
||||
foreach (ChargeTag tag in Model.ChargeTags)
|
||||
{
|
||||
<tr class="table-row" data-href='@Url.Action("ChargeTag", Constants.HomeController, new { id = tag.TagId })'>
|
||||
<td>@tag.TagId</td>
|
||||
<td>@tag.TagName</td>
|
||||
<td>@tag.ParentTagId</td>
|
||||
<td>@((tag.ExpiryDate != null) ? tag.ExpiryDate.Value.ToString(ViewBag.DatePattern) : "-")</td>
|
||||
<td>@((tag.Blocked == true) ? "1" : "0")</td>
|
||||
</tr>
|
||||
}
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<br />
|
||||
<a class="btn btn-secondary" href="~/Home/ChargeTag/@@">@Localizer["AddNew"]</a>
|
||||
}
|
||||
|
||||
123
OCPP.Core.Management/Views/Home/ConnectorDetail.cshtml
Normal file
123
OCPP.Core.Management/Views/Home/ConnectorDetail.cshtml
Normal file
@@ -0,0 +1,123 @@
|
||||
@using Microsoft.AspNetCore.Mvc.Localization
|
||||
@model ConnectorStatusViewModel
|
||||
@inject IViewLocalizer Localizer
|
||||
@{
|
||||
ViewData["Title"] = @Localizer["Title"];
|
||||
}
|
||||
<br />
|
||||
|
||||
@if (Model != null)
|
||||
{
|
||||
@using (Html.BeginForm())
|
||||
{
|
||||
@Html.AntiForgeryToken()
|
||||
|
||||
<h4>@Localizer["EditConnector"]</h4>
|
||||
<br />
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-sm-2 align-self-center">
|
||||
<div class="form-group">
|
||||
<label class="inline-label" for="ChargePointIdRO">@Localizer["ChargePointIdLabel"]</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<div class="form-group">
|
||||
<input type="text" readonly class="form-control" id="ChargePointIdRO" name="ChargePointIdRO" value="@Model.ChargePointId">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-sm-2 align-self-center">
|
||||
<div class="form-group">
|
||||
<label class="inline-label" for="ConnectorIdRO">@Localizer["ConnectorIdLabel"]</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<div class="form-group">
|
||||
<input type="text" readonly class="form-control" id="ConnectorIdRO" name="ConnectorIdRO" value="@Model.ConnectorId">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-sm-2 align-self-center">
|
||||
<div class="form-group">
|
||||
<label class="inline-label" for="ConnectorName">@Localizer["ConnectorNameLabel"]</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<div class="form-group">
|
||||
<input class="form-control" data-val="true" data-val-length="@string.Format(Localizer["FieldMaxLength"].Value, 200)" data-val-length-max="200" id="ConnectorName" maxlength="200" name="ConnectorName" placeholder="@Localizer["ConnectorNamePlaceholder"]" type="text" value="@Model.ConnectorName" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-2">
|
||||
<span class="field-validation-valid text-danger" data-valmsg-for="ConnectorName" data-valmsg-replace="true"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-sm-2 align-self-center">
|
||||
<div class="form-group">
|
||||
<label class="inline-label" for="LastStatusRO">@Localizer["LastStatusLabel"]</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<div class="form-group">
|
||||
<input type="text" readonly class="form-control" id="LastStatusRO" name="LastStatusRO" value="@Model.LastStatus">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-sm-2 align-self-center">
|
||||
<div class="form-group">
|
||||
<label class="inline-label" for="LastStatusTimeRO">@Localizer["LastStatusTimeLabel"]</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<div class="form-group">
|
||||
<input type="text" readonly class="form-control" id="LastStatusTimeRO" name="LastStatusTimeRO" value="@((Model.LastStatusTime.HasValue) ? string.Format("{0:G}", Model.LastStatusTime.Value.ToLocalTime()) : "-")">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-sm-2 align-self-center">
|
||||
<div class="form-group">
|
||||
<label class="inline-label" for="LastMeterRO">@Localizer["LastMeterLabel"]</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<div class="form-group">
|
||||
<input type="text" readonly class="form-control" id="LastMeterRO" name="LastMeterRO" value="@((Model.LastMeter.HasValue) ? string.Format("{0:0.0## kWh}", Model.LastMeter.Value) : "-" )">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-sm-2 align-self-center">
|
||||
<div class="form-group">
|
||||
<label class="inline-label" for="LastMeterTimeRO">@Localizer["LastMeterTimeLabel"]</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<div class="form-group">
|
||||
<input type="text" readonly class="form-control" id="LastMeterTimeRO" name="LastMeterTimeRO" value="@((Model.LastMeterTime.HasValue) ? string.Format("{0:G}", Model.LastMeterTime.Value.ToLocalTime()) : "-")">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-sm-12 text-danger">
|
||||
@ViewBag.ErrorMsg
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-sm-1">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-sm-2">
|
||||
<button type="submit" class="btn btn-primary">@Localizer["Save"]</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
}
|
||||
42
OCPP.Core.Management/Views/Home/ConnectorList.cshtml
Normal file
42
OCPP.Core.Management/Views/Home/ConnectorList.cshtml
Normal file
@@ -0,0 +1,42 @@
|
||||
@using Microsoft.AspNetCore.Mvc.Localization
|
||||
@model ConnectorStatusViewModel
|
||||
@inject IViewLocalizer Localizer
|
||||
@{
|
||||
ViewData["Title"] = @Localizer["Title"];
|
||||
}
|
||||
<br />
|
||||
|
||||
@if (Model != null)
|
||||
{
|
||||
<table id="dtChargeTags" class="table table-striped table-bordered table-sm table-hover" cellspacing="0" width="100%">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="th-sm">@Localizer["ChargePointId"]</th>
|
||||
<th class="th-sm">@Localizer["ConnectorId"]</th>
|
||||
<th class="th-sm">@Localizer["ConnectorName"]</th>
|
||||
<th class="th-sm">@Localizer["LastStatus"]</th>
|
||||
<th class="th-sm">@Localizer["LastStatusTime"]</th>
|
||||
<th class="th-sm">@Localizer["LastMeter"]</th>
|
||||
<th class="th-sm">@Localizer["LastMeterTime"]</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@if (Model.ConnectorStatuses != null)
|
||||
{
|
||||
foreach (ConnectorStatus cs in Model.ConnectorStatuses)
|
||||
{
|
||||
<tr class="table-row" data-href='@Url.Action("Connector", Constants.HomeController, new { id = cs.ChargePointId, connectorId = cs.ConnectorId.ToString() })'>
|
||||
<td>@cs.ChargePointId</td>
|
||||
<td>@cs.ConnectorId</td>
|
||||
<td>@cs.ConnectorName</td>
|
||||
<td>@((!string.IsNullOrEmpty(cs.LastStatus)) ? cs.LastStatus : "-")</td>
|
||||
<td>@((cs.LastStatusTime.HasValue) ? string.Format("{0:G}", cs.LastStatusTime.Value.ToLocalTime()) : "-")</td>
|
||||
<td>@((cs.LastMeter.HasValue) ? string.Format("{0:0.0##}", cs.LastMeter.Value) : "-" )</td>
|
||||
<td>@((cs.LastMeterTime.HasValue) ? string.Format("{0:G}", cs.LastMeterTime.Value.ToLocalTime()): "-")</td>
|
||||
</tr>
|
||||
}
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
}
|
||||
|
||||
91
OCPP.Core.Management/Views/Home/Index.cshtml
Normal file
91
OCPP.Core.Management/Views/Home/Index.cshtml
Normal file
@@ -0,0 +1,91 @@
|
||||
@using Microsoft.AspNetCore.Mvc.Localization
|
||||
@model OverviewViewModel
|
||||
@inject IViewLocalizer Localizer
|
||||
@{
|
||||
ViewData["Title"] = @Localizer["Title"];
|
||||
}
|
||||
<br />
|
||||
@if (Model != null)
|
||||
{
|
||||
<div class="tilegrid">
|
||||
@foreach (ChargePointsOverviewViewModel cpvm in Model.ChargePoints)
|
||||
{
|
||||
|
||||
string chargePointName = string.IsNullOrWhiteSpace(cpvm.Name) ? $"{cpvm.ChargePointId}:{cpvm.ConnectorId}" : cpvm.Name;
|
||||
string lastCharge = (cpvm.MeterStart >= 0 && cpvm.MeterStop != null) ? string.Format(Localizer["ChargekWh"].Value, (cpvm.MeterStop - cpvm.MeterStart)) : null;
|
||||
string chargeTime = null;
|
||||
if (cpvm.StartTime != null && cpvm.StopTime == null)
|
||||
{
|
||||
TimeSpan timeSpan = DateTime.UtcNow.Subtract(cpvm.StartTime.Value);
|
||||
chargeTime = string.Format(Localizer["ChargeTime"].Value, (timeSpan.Days*24 + timeSpan.Hours), timeSpan.Minutes);
|
||||
}
|
||||
|
||||
string cpIcon = "fa-plug";
|
||||
string cpColor = "successColor";
|
||||
string cpTitle = Localizer["Available"].Value;
|
||||
switch (cpvm.ConnectorStatus)
|
||||
{
|
||||
case ConnectorStatusEnum.Occupied:
|
||||
cpIcon = "fa-bolt"; //"fa-car";
|
||||
cpColor = "errorColor";
|
||||
cpTitle = Localizer["Charging"].Value;
|
||||
break;
|
||||
case ConnectorStatusEnum.Faulted:
|
||||
cpIcon = "fa-times-circle";
|
||||
cpColor = "unavailableColor";
|
||||
cpTitle = Localizer["Faulted"].Value;
|
||||
break;
|
||||
case ConnectorStatusEnum.Unavailable:
|
||||
cpIcon = "fa-ban";
|
||||
cpColor = "unavailableColor";
|
||||
cpTitle = Localizer["Unavailable"].Value;
|
||||
break;
|
||||
}
|
||||
|
||||
<div class="card border-secondary" style="max-width: 18rem;">
|
||||
<a href="~/Home/Transactions/@Uri.EscapeDataString(cpvm.ChargePointId)/@cpvm.ConnectorId" class="text-decoration-none">
|
||||
<div class="card-header @cpColor">
|
||||
<i class="fas @cpIcon fa-2x"></i> @chargePointName
|
||||
</div>
|
||||
<div class="card-body text-secondary">
|
||||
<h5 class="card-title">@cpTitle</h5>
|
||||
@if (!string.IsNullOrEmpty(chargeTime))
|
||||
{
|
||||
<p class="card-text">@chargeTime</p>
|
||||
}
|
||||
else if (!string.IsNullOrEmpty(lastCharge))
|
||||
{
|
||||
<p class="card-text">@lastCharge</p>
|
||||
}
|
||||
else
|
||||
{
|
||||
<p class="card-text"> </p>
|
||||
}
|
||||
</div>
|
||||
@if (Model.ServerConnection)
|
||||
{
|
||||
<div class="card-footer text-muted d-flex justify-content-between">
|
||||
<div>@cpvm.CurrentChargeData</div>
|
||||
@if (cpvm.Online)
|
||||
{
|
||||
<div><i class="fas fa-link" title="@Localizer["ChargePointOnline"]"></i></div>
|
||||
}
|
||||
else
|
||||
{
|
||||
<div><i class="fas fa-unlink" title="@Localizer["ChargePointOffline"]"></i></div>
|
||||
}
|
||||
</div>
|
||||
}
|
||||
</a>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
@if (!string.IsNullOrEmpty(ViewBag.ErrorMsg))
|
||||
{
|
||||
<br/>
|
||||
<div class="alert alert-danger" role="alert">
|
||||
@ViewBag.ErrorMsg
|
||||
</div>
|
||||
}
|
||||
}
|
||||
|
||||
169
OCPP.Core.Management/Views/Home/Transactions.cshtml
Normal file
169
OCPP.Core.Management/Views/Home/Transactions.cshtml
Normal file
@@ -0,0 +1,169 @@
|
||||
@using Microsoft.AspNetCore.Mvc.Localization
|
||||
@model TransactionListViewModel
|
||||
@inject IViewLocalizer Localizer
|
||||
@{
|
||||
ViewData["Title"] = @Localizer["Title"];
|
||||
}
|
||||
<br />
|
||||
@{
|
||||
string timespan = (Model.Timespan == 2) ? "?t=2" : ((Model.Timespan == 3) ? "?t=3" : string.Empty);
|
||||
|
||||
List<ConnectorStatusViewModel> connectorStatusViewModels = new List<ConnectorStatusViewModel>();
|
||||
|
||||
// Copy CP-Names in dictionary for name resolution and
|
||||
Dictionary<string, string> chargePointNames = new Dictionary<string, string>();
|
||||
if (Model.ChargePoints != null)
|
||||
{
|
||||
foreach (ChargePoint cp in Model.ChargePoints)
|
||||
{
|
||||
chargePointNames.Add(cp.ChargePointId, cp.Name);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Count connectors for every charge point (=> naming scheme)
|
||||
Dictionary<string, int> dictConnectorCount = new Dictionary<string, int>();
|
||||
string currentConnectorName = string.Empty;
|
||||
foreach (ConnectorStatus cs in Model.ConnectorStatuses)
|
||||
{
|
||||
if (dictConnectorCount.ContainsKey(cs.ChargePointId))
|
||||
{
|
||||
// > 1 connector
|
||||
dictConnectorCount[cs.ChargePointId] = dictConnectorCount[cs.ChargePointId] + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
// first connector
|
||||
dictConnectorCount.Add(cs.ChargePointId, 1);
|
||||
}
|
||||
|
||||
ConnectorStatusViewModel csvm = new ConnectorStatusViewModel();
|
||||
csvm.ChargePointId = cs.ChargePointId;
|
||||
csvm.ConnectorId = cs.ConnectorId;
|
||||
|
||||
string connectorName = cs.ConnectorName;
|
||||
if (string.IsNullOrEmpty(connectorName))
|
||||
{
|
||||
// Default: use charge point name
|
||||
chargePointNames.TryGetValue(cs.ChargePointId, out connectorName);
|
||||
if (string.IsNullOrEmpty(connectorName))
|
||||
{
|
||||
// Fallback: use charge point ID
|
||||
connectorName = cs.ChargePointId;
|
||||
}
|
||||
connectorName = $"{connectorName}:{cs.ConnectorId}";
|
||||
}
|
||||
csvm.ConnectorName = connectorName;
|
||||
connectorStatusViewModels.Add(csvm);
|
||||
|
||||
if (cs.ChargePointId == Model.CurrentChargePointId && cs.ConnectorId == Model.CurrentConnectorId)
|
||||
{
|
||||
currentConnectorName = connectorName;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
<div class="container fill">
|
||||
<div class="row">
|
||||
<div class="col-md-auto align-self-center">
|
||||
@Localizer["ChargePointLabel"]
|
||||
</div>
|
||||
<div class="col-md-auto align-self-center">
|
||||
<div class="dropdown">
|
||||
<button class="btn btn-secondary dropdown-toggle" type="button" id="ddbChargePoint" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||
@currentConnectorName
|
||||
</button>
|
||||
<div class="dropdown-menu" aria-labelledby="ddbChargePoint">
|
||||
@foreach (ConnectorStatusViewModel csvm in connectorStatusViewModels)
|
||||
{
|
||||
<a class="dropdown-item" href="~/Home/Transactions/@Uri.EscapeDataString(csvm.ChargePointId)/@csvm.ConnectorId@timespan">@csvm.ConnectorName</a>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-1">
|
||||
</div>
|
||||
<div class="col-md-auto align-self-center">
|
||||
@Localizer["TimeSpanLabel"]
|
||||
</div>
|
||||
<div class="col-md-auto align-self-center">
|
||||
<div class="dropdown">
|
||||
<button class="btn btn-secondary dropdown-toggle" type="button" id="ddbTimespan" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||
@if (Model.Timespan == 2)
|
||||
{
|
||||
@Localizer["TimeSpan90"];
|
||||
}
|
||||
else if (Model.Timespan == 3)
|
||||
{
|
||||
@Localizer["TimeSpan365"];
|
||||
}
|
||||
else
|
||||
{
|
||||
@Localizer["TimeSpan30"];
|
||||
}
|
||||
</button>
|
||||
<div class="dropdown-menu" aria-labelledby="ddbTimespan">
|
||||
<a class="dropdown-item" href="~/Home/Transactions/@Uri.EscapeDataString(Model.CurrentChargePointId)/@Model.CurrentConnectorId">@Localizer["TimeSpan30"]</a>
|
||||
<a class="dropdown-item" href="~/Home/Transactions/@Uri.EscapeDataString(Model.CurrentChargePointId)/@Model.CurrentConnectorId?t=2">@Localizer["TimeSpan90"]</a>
|
||||
<a class="dropdown-item" href="~/Home/Transactions/@Uri.EscapeDataString(Model.CurrentChargePointId)/@Model.CurrentConnectorId?t=3">@Localizer["TimeSpan365"]</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-3">
|
||||
</div>
|
||||
<div class="col-md-auto align-self-center">
|
||||
<a href="~/Home/Export/@Uri.EscapeDataString(Model.CurrentChargePointId)/@Model.CurrentConnectorId@timespan" data-toggle="tooltip" data-placement="top" title="@Localizer["DownloadCsv"]">
|
||||
<i class="fas fa-file-csv fa-2x"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<br />
|
||||
|
||||
@if (Model != null)
|
||||
{
|
||||
<table id="dtTransactions" class="table table-striped table-bordered table-sm" cellspacing="0" width="100%">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="th-sm">@Localizer["Connector"]</th>
|
||||
<th class="th-sm">@Localizer["StartTime"]</th>
|
||||
<th class="th-sm">@Localizer["StartTag"]</th>
|
||||
<th class="th-sm">@Localizer["StartMeter"]</th>
|
||||
<th class="th-sm">@Localizer["StopTime"]</th>
|
||||
<th class="th-sm">@Localizer["StopTag"]</th>
|
||||
<th class="th-sm">@Localizer["StopMeter"]</th>
|
||||
<th class="th-sm">@Localizer["ChargeSum"]</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@if (Model.Transactions != null)
|
||||
{
|
||||
foreach (Transaction t in Model.Transactions)
|
||||
{
|
||||
string startTag = t.StartTagId;
|
||||
string stopTag = t.StopTagId;
|
||||
if (!string.IsNullOrEmpty(t.StartTagId) && Model.ChargeTags != null && Model.ChargeTags.ContainsKey(t.StartTagId))
|
||||
{
|
||||
startTag = Model.ChargeTags[t.StartTagId]?.TagName;
|
||||
}
|
||||
if (!string.IsNullOrEmpty(t.StopTagId) && Model.ChargeTags != null && Model.ChargeTags.ContainsKey(t.StopTagId))
|
||||
{
|
||||
stopTag = Model.ChargeTags[t.StopTagId]?.TagName;
|
||||
}
|
||||
<tr>
|
||||
<td>@currentConnectorName</td>
|
||||
<td>@string.Format("{0} {1}", t.StartTime.ToLocalTime().ToShortDateString(), t.StartTime.ToLocalTime().ToShortTimeString())</td>
|
||||
<td>@startTag</td>
|
||||
<td>@string.Format("{0:0.0##}", t.MeterStart)</td>
|
||||
<td>@((t.StopTime != null) ? string.Format("{0} {1}", t.StopTime.Value.ToLocalTime().ToShortDateString(), t.StopTime.Value.ToLocalTime().ToShortTimeString()) : string.Empty)</td>
|
||||
<td>@stopTag</td>
|
||||
<td>@((t.MeterStop != null) ? string.Format("{0:0.0##}", t.MeterStop) : string.Empty)</td>
|
||||
<td>@((t.MeterStop != null) ? string.Format("{0:0.0##}", (t.MeterStop - t.MeterStart)) : string.Empty)</td>
|
||||
</tr>
|
||||
}
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
}
|
||||
|
||||
34
OCPP.Core.Management/Views/Shared/Error.cshtml
Normal file
34
OCPP.Core.Management/Views/Shared/Error.cshtml
Normal file
@@ -0,0 +1,34 @@
|
||||
@using Microsoft.AspNetCore.Mvc.Localization
|
||||
@model List<ChargePointsOverviewViewModel>
|
||||
@inject IViewLocalizer Localizer
|
||||
@{
|
||||
ViewData["Title"] = @Localizer["Title"];
|
||||
}
|
||||
|
||||
<br />
|
||||
<h2 class="text-danger">@Localizer["InfoError"]</h2>
|
||||
|
||||
@if (!string.IsNullOrEmpty((string)TempData["ErrMessage"]))
|
||||
{
|
||||
<br />
|
||||
<br />
|
||||
<p>
|
||||
<strong>@Localizer["TitleDetail"]</strong>
|
||||
</p>
|
||||
<p>
|
||||
@((string)TempData["ErrMessage"])
|
||||
</p>
|
||||
|
||||
}
|
||||
else if (!string.IsNullOrEmpty((string)TempData["ErrMsgKey"]))
|
||||
{
|
||||
<br />
|
||||
<br />
|
||||
<p>
|
||||
<strong>@Localizer["TitleDetail"]</strong>
|
||||
</p>
|
||||
<p>
|
||||
@Localizer[(string)TempData["ErrMsgKey"]]
|
||||
</p>
|
||||
|
||||
}
|
||||
88
OCPP.Core.Management/Views/Shared/_Layout.cshtml
Normal file
88
OCPP.Core.Management/Views/Shared/_Layout.cshtml
Normal file
@@ -0,0 +1,88 @@
|
||||
@using Microsoft.AspNetCore.Mvc.Localization
|
||||
@inject IViewLocalizer Localizer
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta name="google" content="notranslate" />
|
||||
<title>OCPP.Core - @ViewData["Title"]</title>
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css">
|
||||
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.15.1/css/all.css">
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.9.0/css/bootstrap-datepicker.min.css">
|
||||
<link rel="stylesheet" href="~/lib/bootstrap-dialog/bootstrap-dialog.min.css" />
|
||||
<link rel="stylesheet" href="~/css/site.css" />
|
||||
</head>
|
||||
<body>
|
||||
<header>
|
||||
<nav class="navbar navbar-expand-lg navbar-light bg-light">
|
||||
<a class="navbar-brand" asp-area="" asp-controller="@Constants.HomeController" asp-action="Index"><i class="fas fa-charging-station"></i> OCPP.Core</a>
|
||||
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
|
||||
<div class="collapse navbar-collapse" id="navbarSupportedContent">
|
||||
<ul class="navbar-nav mr-auto">
|
||||
@if (this.User != null && this.User.Identity != null && this.User.Identity.IsAuthenticated)
|
||||
{
|
||||
<li class="nav-item active">
|
||||
<a class="nav-link" href="~/">@Localizer["Overview"] <span class="sr-only">(current)</span></a>
|
||||
</li>
|
||||
@if (this.User.IsInRole(Constants.AdminRoleName))
|
||||
{
|
||||
<li class="nav-item dropdown">
|
||||
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||
@Localizer["Administration"]
|
||||
</a>
|
||||
<div class="dropdown-menu" aria-labelledby="navbarDropdown">
|
||||
<a class="dropdown-item" href="~/Home/ChargeTag">@Localizer["ChargeTags"]</a>
|
||||
<a class="dropdown-item" href="~/Home/ChargePoint">@Localizer["ChargePoints"]</a>
|
||||
<a class="dropdown-item" href="~/Home/Connector">@Localizer["Connectors"]</a>
|
||||
</div>
|
||||
</li>
|
||||
}
|
||||
}
|
||||
</ul>
|
||||
@{
|
||||
if (this.User != null && this.User.Identity != null && this.User.Identity.IsAuthenticated)
|
||||
{
|
||||
<ul class="navbar-nav ml-auto nav-flex-icons">
|
||||
<li class="nav-item dropdown">
|
||||
<a class="nav-link dropdown-toggle" id="navbarDropdownMenuLink-333" data-toggle="dropdown"
|
||||
aria-haspopup="true" aria-expanded="false">
|
||||
@this.User.Identity.Name <i class="fas fa-user"></i>
|
||||
</a>
|
||||
<div class="dropdown-menu dropdown-menu-right dropdown-default"
|
||||
aria-labelledby="navbarDropdownMenuLink-333">
|
||||
<a class="dropdown-item" href="~/Account/Logout">@Localizer["Logout"]</a>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
}
|
||||
}
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
</header>
|
||||
<div class="container">
|
||||
<main role="main" class="pb-3">
|
||||
@RenderBody()
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<footer class="border-top footer text-muted">
|
||||
<div class="container">
|
||||
OCPP.Core Management @string.Format("V{0}", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(3))
|
||||
</div>
|
||||
</footer>
|
||||
<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.19.1/jquery.validate.min.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validation-unobtrusive/3.2.11/jquery.validate.unobtrusive.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/js/bootstrap.bundle.min.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.9.0/js/bootstrap-datepicker.min.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.9.0/locales/bootstrap-datepicker.de.min.js"></script>
|
||||
<script src="~/lib/bootstrap-dialog/bootstrap-dialog.min.js"></script>
|
||||
<script src="~/js/site.js" asp-append-version="true"></script>
|
||||
@RenderSection("Scripts", required: false)
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,2 @@
|
||||
<script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script>
|
||||
<script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script>
|
||||
5
OCPP.Core.Management/Views/_ViewImports.cshtml
Normal file
5
OCPP.Core.Management/Views/_ViewImports.cshtml
Normal file
@@ -0,0 +1,5 @@
|
||||
@using OCPP.Core.Database
|
||||
@using OCPP.Core.Management
|
||||
@using OCPP.Core.Management.Models
|
||||
@using System.Collections.Generic
|
||||
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
|
||||
3
OCPP.Core.Management/Views/_ViewStart.cshtml
Normal file
3
OCPP.Core.Management/Views/_ViewStart.cshtml
Normal file
@@ -0,0 +1,3 @@
|
||||
@{
|
||||
Layout = "_Layout";
|
||||
}
|
||||
9
OCPP.Core.Management/appsettings.Development.json
Normal file
9
OCPP.Core.Management/appsettings.Development.json
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft": "Warning",
|
||||
"Microsoft.Hosting.Lifetime": "Information"
|
||||
}
|
||||
}
|
||||
}
|
||||
67
OCPP.Core.Management/appsettings.json
Normal file
67
OCPP.Core.Management/appsettings.json
Normal file
@@ -0,0 +1,67 @@
|
||||
{
|
||||
"Logging": {
|
||||
"File": {
|
||||
"BasePath": "Logs",
|
||||
"FileAccessMode": "KeepOpenAndAutoFlush",
|
||||
"FileEncodingName": "utf-8",
|
||||
"DateFormat": "yyyyMMdd",
|
||||
"CounterFormat": "000",
|
||||
"MaxFileSize": 1048576,
|
||||
"LogLevel": {
|
||||
"OCPP": "Trace",
|
||||
"Microsoft": "Warning",
|
||||
"Default": "Debug"
|
||||
},
|
||||
"IncludeScopes": false,
|
||||
"MaxQueueSize": 10,
|
||||
"Files": [
|
||||
{
|
||||
"Path": "OCPP.Core.Management-<counter>.log",
|
||||
"CounterFormat": "00"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
|
||||
"LogLevel": {
|
||||
"Default": "Information"
|
||||
},
|
||||
|
||||
"AllowedHosts": "*",
|
||||
|
||||
"ConnectionStrings": {
|
||||
//"SQLite": "Filename=.\\..\\SQLite\\OCPP.Core.sqlite;"
|
||||
"SqlServer": "Server=.;Database=OCPP.Core;Trusted_Connection=True;Encrypt=false;TrustServerCertificate=false"
|
||||
},
|
||||
|
||||
"ServerApiUrl": "http://localhost:8081/API",
|
||||
"ApiKey": "36029A5F-B736-4DA9-AE46-D66847C9062C",
|
||||
|
||||
"Users": [
|
||||
{
|
||||
"Username": "admin",
|
||||
"Password": "t3st",
|
||||
"Administrator": true
|
||||
},
|
||||
{
|
||||
"Username": "user",
|
||||
"Password": "t3st",
|
||||
"Administrator": false
|
||||
}
|
||||
],
|
||||
|
||||
"Kestrel": {
|
||||
"Endpoints": {
|
||||
"Http": {
|
||||
"Url": "http://localhost:8082"
|
||||
},
|
||||
"HttpsInlineCertFile": {
|
||||
"Url": "https://localhost:8092",
|
||||
"Certificate": {
|
||||
"Path": "localhost.pfx",
|
||||
"Password": "OCPP.Core"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
BIN
OCPP.Core.Management/localhost.pfx
Normal file
BIN
OCPP.Core.Management/localhost.pfx
Normal file
Binary file not shown.
118
OCPP.Core.Management/wwwroot/css/site.css
Normal file
118
OCPP.Core.Management/wwwroot/css/site.css
Normal file
@@ -0,0 +1,118 @@
|
||||
/* Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification
|
||||
for details on configuring this project to bundle and minify static web assets. */
|
||||
|
||||
a.navbar-brand {
|
||||
white-space: normal;
|
||||
text-align: center;
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
/* Provide sufficient contrast against white background */
|
||||
a {
|
||||
color: #0366d6;
|
||||
}
|
||||
|
||||
.btn-primary {
|
||||
color: #fff;
|
||||
background-color: #1b6ec2;
|
||||
border-color: #1861ac;
|
||||
}
|
||||
|
||||
.nav-pills .nav-link.active, .nav-pills .show > .nav-link {
|
||||
color: #fff;
|
||||
background-color: #1b6ec2;
|
||||
border-color: #1861ac;
|
||||
}
|
||||
|
||||
/* Sticky footer styles
|
||||
-------------------------------------------------- */
|
||||
html {
|
||||
font-size: 14px;
|
||||
}
|
||||
@media (min-width: 768px) {
|
||||
html {
|
||||
font-size: 16px;
|
||||
}
|
||||
}
|
||||
|
||||
.border-top {
|
||||
border-top: 1px solid #e5e5e5;
|
||||
}
|
||||
.border-bottom {
|
||||
border-bottom: 1px solid #e5e5e5;
|
||||
}
|
||||
|
||||
.box-shadow {
|
||||
box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05);
|
||||
}
|
||||
|
||||
button.accept-policy {
|
||||
font-size: 1rem;
|
||||
line-height: inherit;
|
||||
}
|
||||
|
||||
/* Sticky footer styles
|
||||
-------------------------------------------------- */
|
||||
html {
|
||||
position: relative;
|
||||
min-height: 100%;
|
||||
}
|
||||
|
||||
body {
|
||||
/* Margin bottom by footer height */
|
||||
margin-bottom: 60px;
|
||||
}
|
||||
.footer {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
white-space: nowrap;
|
||||
line-height: 60px; /* Vertically center the text there */
|
||||
}
|
||||
|
||||
|
||||
.tilegrid {
|
||||
display: grid;
|
||||
grid-gap: 15px;
|
||||
overflow: hidden;
|
||||
/* grid-template-columns: repeat(auto-fill, 200px); */
|
||||
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
|
||||
/* grid-template-columns: repeat(auto-fit, minmax(300px, 1fr) 150px); */
|
||||
grid-auto-flow: dense;
|
||||
}
|
||||
|
||||
.successColor {
|
||||
background-color: #90EE90;
|
||||
}
|
||||
|
||||
.errorColor {
|
||||
background-color: #FFB6C1;
|
||||
}
|
||||
|
||||
.unavailableColor {
|
||||
background-color: #B0B0B0;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #000;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: #000;
|
||||
}
|
||||
|
||||
.table-row {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.checkbox-lg {
|
||||
-ms-transform: scale(1.5); /* IE */
|
||||
-moz-transform: scale(1.5); /* FF */
|
||||
-webkit-transform: scale(1.5); /* Safari and Chrome */
|
||||
-o-transform: scale(1.5); /* Opera */
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
.inline-label {
|
||||
display: inline !important;
|
||||
}
|
||||
BIN
OCPP.Core.Management/wwwroot/favicon.ico
Normal file
BIN
OCPP.Core.Management/wwwroot/favicon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 8.2 KiB |
9
OCPP.Core.Management/wwwroot/js/site.js
Normal file
9
OCPP.Core.Management/wwwroot/js/site.js
Normal file
@@ -0,0 +1,9 @@
|
||||
// Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification
|
||||
// for details on configuring this project to bundle and minify static web assets.
|
||||
|
||||
// Write your JavaScript code.
|
||||
$(document).ready(function ($) {
|
||||
$(".table-row").click(function () {
|
||||
window.document.location = $(this).data("href");
|
||||
});
|
||||
});
|
||||
1
OCPP.Core.Management/wwwroot/lib/bootstrap-dialog/bootstrap-dialog.min.css
vendored
Normal file
1
OCPP.Core.Management/wwwroot/lib/bootstrap-dialog/bootstrap-dialog.min.css
vendored
Normal file
@@ -0,0 +1 @@
|
||||
.bootstrap-dialog .modal-header{border-top-left-radius:4px;border-top-right-radius:4px}.bootstrap-dialog .bootstrap-dialog-title{color:#fff;display:inline-block;font-size:16px}.bootstrap-dialog .bootstrap-dialog-message{font-size:14px}.bootstrap-dialog .bootstrap-dialog-button-icon{margin-right:3px}.bootstrap-dialog .bootstrap-dialog-close-button{font-size:20px;float:right;opacity:.9;filter:alpha(opacity=90)}.bootstrap-dialog .bootstrap-dialog-close-button:hover{cursor:pointer;opacity:1;filter:alpha(opacity=100)}@media(min-width:1172px){.bootstrap-dialog .modal-xl{max-width:95%}}.bootstrap-dialog .modal-lg .bootstrap4-dialog-button:first-child{margin-top:8px}.bootstrap-dialog.type-default .modal-header{background-color:#fff}.bootstrap-dialog.type-default .bootstrap-dialog-title{color:#333}.bootstrap-dialog.type-info .modal-header{background-color:#17a2b8}.bootstrap-dialog.type-primary .modal-header{background-color:#007bff}.bootstrap-dialog.type-secondary .modal-header{background-color:#6c757d}.bootstrap-dialog.type-success .modal-header{background-color:#28a745}.bootstrap-dialog.type-warning .modal-header{background-color:#ffc107}.bootstrap-dialog.type-danger .modal-header{background-color:#dc3545}.bootstrap-dialog.type-light .modal-header{background-color:#f8f9fa}.bootstrap-dialog.type-dark .modal-header{background-color:#343a40}.bootstrap-dialog.size-large .bootstrap-dialog-title{font-size:24px}.bootstrap-dialog.size-large .bootstrap-dialog-close-button{font-size:30px}.bootstrap-dialog.size-large .bootstrap-dialog-message{font-size:18px}.bootstrap-dialog .icon-spin{display:inline-block;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;-webkit-animation:spin 2s infinite linear;animation:spin 2s infinite linear}.bootstrap-dialog-footer-buttons{display:flex}@-moz-keyframes spin{0{-moz-transform:rotate(0)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0{-o-transform:rotate(0)}100%{-o-transform:rotate(359deg)}}@-ms-keyframes spin{0{-ms-transform:rotate(0)}100%{-ms-transform:rotate(359deg)}}@keyframes spin{0{transform:rotate(0)}100%{transform:rotate(359deg)}}.bootstrap-dialog-header{display:contents}
|
||||
1
OCPP.Core.Management/wwwroot/lib/bootstrap-dialog/bootstrap-dialog.min.js
vendored
Normal file
1
OCPP.Core.Management/wwwroot/lib/bootstrap-dialog/bootstrap-dialog.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -0,0 +1,12 @@
|
||||
Copyright (c) .NET Foundation. All rights reserved.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
|
||||
these files except in compliance with the License. You may obtain a copy of the
|
||||
License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software distributed
|
||||
under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
|
||||
CONDITIONS OF ANY KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations under the License.
|
||||
432
OCPP.Core.Management/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
vendored
Normal file
432
OCPP.Core.Management/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
vendored
Normal file
@@ -0,0 +1,432 @@
|
||||
// Unobtrusive validation support library for jQuery and jQuery Validate
|
||||
// Copyright (c) .NET Foundation. All rights reserved.
|
||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||
// @version v3.2.11
|
||||
|
||||
/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */
|
||||
/*global document: false, jQuery: false */
|
||||
|
||||
(function (factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD. Register as an anonymous module.
|
||||
define("jquery.validate.unobtrusive", ['jquery-validation'], factory);
|
||||
} else if (typeof module === 'object' && module.exports) {
|
||||
// CommonJS-like environments that support module.exports
|
||||
module.exports = factory(require('jquery-validation'));
|
||||
} else {
|
||||
// Browser global
|
||||
jQuery.validator.unobtrusive = factory(jQuery);
|
||||
}
|
||||
}(function ($) {
|
||||
var $jQval = $.validator,
|
||||
adapters,
|
||||
data_validation = "unobtrusiveValidation";
|
||||
|
||||
function setValidationValues(options, ruleName, value) {
|
||||
options.rules[ruleName] = value;
|
||||
if (options.message) {
|
||||
options.messages[ruleName] = options.message;
|
||||
}
|
||||
}
|
||||
|
||||
function splitAndTrim(value) {
|
||||
return value.replace(/^\s+|\s+$/g, "").split(/\s*,\s*/g);
|
||||
}
|
||||
|
||||
function escapeAttributeValue(value) {
|
||||
// As mentioned on http://api.jquery.com/category/selectors/
|
||||
return value.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g, "\\$1");
|
||||
}
|
||||
|
||||
function getModelPrefix(fieldName) {
|
||||
return fieldName.substr(0, fieldName.lastIndexOf(".") + 1);
|
||||
}
|
||||
|
||||
function appendModelPrefix(value, prefix) {
|
||||
if (value.indexOf("*.") === 0) {
|
||||
value = value.replace("*.", prefix);
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
function onError(error, inputElement) { // 'this' is the form element
|
||||
var container = $(this).find("[data-valmsg-for='" + escapeAttributeValue(inputElement[0].name) + "']"),
|
||||
replaceAttrValue = container.attr("data-valmsg-replace"),
|
||||
replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) !== false : null;
|
||||
|
||||
container.removeClass("field-validation-valid").addClass("field-validation-error");
|
||||
error.data("unobtrusiveContainer", container);
|
||||
|
||||
if (replace) {
|
||||
container.empty();
|
||||
error.removeClass("input-validation-error").appendTo(container);
|
||||
}
|
||||
else {
|
||||
error.hide();
|
||||
}
|
||||
}
|
||||
|
||||
function onErrors(event, validator) { // 'this' is the form element
|
||||
var container = $(this).find("[data-valmsg-summary=true]"),
|
||||
list = container.find("ul");
|
||||
|
||||
if (list && list.length && validator.errorList.length) {
|
||||
list.empty();
|
||||
container.addClass("validation-summary-errors").removeClass("validation-summary-valid");
|
||||
|
||||
$.each(validator.errorList, function () {
|
||||
$("<li />").html(this.message).appendTo(list);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function onSuccess(error) { // 'this' is the form element
|
||||
var container = error.data("unobtrusiveContainer");
|
||||
|
||||
if (container) {
|
||||
var replaceAttrValue = container.attr("data-valmsg-replace"),
|
||||
replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) : null;
|
||||
|
||||
container.addClass("field-validation-valid").removeClass("field-validation-error");
|
||||
error.removeData("unobtrusiveContainer");
|
||||
|
||||
if (replace) {
|
||||
container.empty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function onReset(event) { // 'this' is the form element
|
||||
var $form = $(this),
|
||||
key = '__jquery_unobtrusive_validation_form_reset';
|
||||
if ($form.data(key)) {
|
||||
return;
|
||||
}
|
||||
// Set a flag that indicates we're currently resetting the form.
|
||||
$form.data(key, true);
|
||||
try {
|
||||
$form.data("validator").resetForm();
|
||||
} finally {
|
||||
$form.removeData(key);
|
||||
}
|
||||
|
||||
$form.find(".validation-summary-errors")
|
||||
.addClass("validation-summary-valid")
|
||||
.removeClass("validation-summary-errors");
|
||||
$form.find(".field-validation-error")
|
||||
.addClass("field-validation-valid")
|
||||
.removeClass("field-validation-error")
|
||||
.removeData("unobtrusiveContainer")
|
||||
.find(">*") // If we were using valmsg-replace, get the underlying error
|
||||
.removeData("unobtrusiveContainer");
|
||||
}
|
||||
|
||||
function validationInfo(form) {
|
||||
var $form = $(form),
|
||||
result = $form.data(data_validation),
|
||||
onResetProxy = $.proxy(onReset, form),
|
||||
defaultOptions = $jQval.unobtrusive.options || {},
|
||||
execInContext = function (name, args) {
|
||||
var func = defaultOptions[name];
|
||||
func && $.isFunction(func) && func.apply(form, args);
|
||||
};
|
||||
|
||||
if (!result) {
|
||||
result = {
|
||||
options: { // options structure passed to jQuery Validate's validate() method
|
||||
errorClass: defaultOptions.errorClass || "input-validation-error",
|
||||
errorElement: defaultOptions.errorElement || "span",
|
||||
errorPlacement: function () {
|
||||
onError.apply(form, arguments);
|
||||
execInContext("errorPlacement", arguments);
|
||||
},
|
||||
invalidHandler: function () {
|
||||
onErrors.apply(form, arguments);
|
||||
execInContext("invalidHandler", arguments);
|
||||
},
|
||||
messages: {},
|
||||
rules: {},
|
||||
success: function () {
|
||||
onSuccess.apply(form, arguments);
|
||||
execInContext("success", arguments);
|
||||
}
|
||||
},
|
||||
attachValidation: function () {
|
||||
$form
|
||||
.off("reset." + data_validation, onResetProxy)
|
||||
.on("reset." + data_validation, onResetProxy)
|
||||
.validate(this.options);
|
||||
},
|
||||
validate: function () { // a validation function that is called by unobtrusive Ajax
|
||||
$form.validate();
|
||||
return $form.valid();
|
||||
}
|
||||
};
|
||||
$form.data(data_validation, result);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
$jQval.unobtrusive = {
|
||||
adapters: [],
|
||||
|
||||
parseElement: function (element, skipAttach) {
|
||||
/// <summary>
|
||||
/// Parses a single HTML element for unobtrusive validation attributes.
|
||||
/// </summary>
|
||||
/// <param name="element" domElement="true">The HTML element to be parsed.</param>
|
||||
/// <param name="skipAttach" type="Boolean">[Optional] true to skip attaching the
|
||||
/// validation to the form. If parsing just this single element, you should specify true.
|
||||
/// If parsing several elements, you should specify false, and manually attach the validation
|
||||
/// to the form when you are finished. The default is false.</param>
|
||||
var $element = $(element),
|
||||
form = $element.parents("form")[0],
|
||||
valInfo, rules, messages;
|
||||
|
||||
if (!form) { // Cannot do client-side validation without a form
|
||||
return;
|
||||
}
|
||||
|
||||
valInfo = validationInfo(form);
|
||||
valInfo.options.rules[element.name] = rules = {};
|
||||
valInfo.options.messages[element.name] = messages = {};
|
||||
|
||||
$.each(this.adapters, function () {
|
||||
var prefix = "data-val-" + this.name,
|
||||
message = $element.attr(prefix),
|
||||
paramValues = {};
|
||||
|
||||
if (message !== undefined) { // Compare against undefined, because an empty message is legal (and falsy)
|
||||
prefix += "-";
|
||||
|
||||
$.each(this.params, function () {
|
||||
paramValues[this] = $element.attr(prefix + this);
|
||||
});
|
||||
|
||||
this.adapt({
|
||||
element: element,
|
||||
form: form,
|
||||
message: message,
|
||||
params: paramValues,
|
||||
rules: rules,
|
||||
messages: messages
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
$.extend(rules, { "__dummy__": true });
|
||||
|
||||
if (!skipAttach) {
|
||||
valInfo.attachValidation();
|
||||
}
|
||||
},
|
||||
|
||||
parse: function (selector) {
|
||||
/// <summary>
|
||||
/// Parses all the HTML elements in the specified selector. It looks for input elements decorated
|
||||
/// with the [data-val=true] attribute value and enables validation according to the data-val-*
|
||||
/// attribute values.
|
||||
/// </summary>
|
||||
/// <param name="selector" type="String">Any valid jQuery selector.</param>
|
||||
|
||||
// $forms includes all forms in selector's DOM hierarchy (parent, children and self) that have at least one
|
||||
// element with data-val=true
|
||||
var $selector = $(selector),
|
||||
$forms = $selector.parents()
|
||||
.addBack()
|
||||
.filter("form")
|
||||
.add($selector.find("form"))
|
||||
.has("[data-val=true]");
|
||||
|
||||
$selector.find("[data-val=true]").each(function () {
|
||||
$jQval.unobtrusive.parseElement(this, true);
|
||||
});
|
||||
|
||||
$forms.each(function () {
|
||||
var info = validationInfo(this);
|
||||
if (info) {
|
||||
info.attachValidation();
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
adapters = $jQval.unobtrusive.adapters;
|
||||
|
||||
adapters.add = function (adapterName, params, fn) {
|
||||
/// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation.</summary>
|
||||
/// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
|
||||
/// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>
|
||||
/// <param name="params" type="Array" optional="true">[Optional] An array of parameter names (strings) that will
|
||||
/// be extracted from the data-val-nnnn-mmmm HTML attributes (where nnnn is the adapter name, and
|
||||
/// mmmm is the parameter name).</param>
|
||||
/// <param name="fn" type="Function">The function to call, which adapts the values from the HTML
|
||||
/// attributes into jQuery Validate rules and/or messages.</param>
|
||||
/// <returns type="jQuery.validator.unobtrusive.adapters" />
|
||||
if (!fn) { // Called with no params, just a function
|
||||
fn = params;
|
||||
params = [];
|
||||
}
|
||||
this.push({ name: adapterName, params: params, adapt: fn });
|
||||
return this;
|
||||
};
|
||||
|
||||
adapters.addBool = function (adapterName, ruleName) {
|
||||
/// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where
|
||||
/// the jQuery Validate validation rule has no parameter values.</summary>
|
||||
/// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
|
||||
/// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>
|
||||
/// <param name="ruleName" type="String" optional="true">[Optional] The name of the jQuery Validate rule. If not provided, the value
|
||||
/// of adapterName will be used instead.</param>
|
||||
/// <returns type="jQuery.validator.unobtrusive.adapters" />
|
||||
return this.add(adapterName, function (options) {
|
||||
setValidationValues(options, ruleName || adapterName, true);
|
||||
});
|
||||
};
|
||||
|
||||
adapters.addMinMax = function (adapterName, minRuleName, maxRuleName, minMaxRuleName, minAttribute, maxAttribute) {
|
||||
/// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where
|
||||
/// the jQuery Validate validation has three potential rules (one for min-only, one for max-only, and
|
||||
/// one for min-and-max). The HTML parameters are expected to be named -min and -max.</summary>
|
||||
/// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
|
||||
/// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>
|
||||
/// <param name="minRuleName" type="String">The name of the jQuery Validate rule to be used when you only
|
||||
/// have a minimum value.</param>
|
||||
/// <param name="maxRuleName" type="String">The name of the jQuery Validate rule to be used when you only
|
||||
/// have a maximum value.</param>
|
||||
/// <param name="minMaxRuleName" type="String">The name of the jQuery Validate rule to be used when you
|
||||
/// have both a minimum and maximum value.</param>
|
||||
/// <param name="minAttribute" type="String" optional="true">[Optional] The name of the HTML attribute that
|
||||
/// contains the minimum value. The default is "min".</param>
|
||||
/// <param name="maxAttribute" type="String" optional="true">[Optional] The name of the HTML attribute that
|
||||
/// contains the maximum value. The default is "max".</param>
|
||||
/// <returns type="jQuery.validator.unobtrusive.adapters" />
|
||||
return this.add(adapterName, [minAttribute || "min", maxAttribute || "max"], function (options) {
|
||||
var min = options.params.min,
|
||||
max = options.params.max;
|
||||
|
||||
if (min && max) {
|
||||
setValidationValues(options, minMaxRuleName, [min, max]);
|
||||
}
|
||||
else if (min) {
|
||||
setValidationValues(options, minRuleName, min);
|
||||
}
|
||||
else if (max) {
|
||||
setValidationValues(options, maxRuleName, max);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
adapters.addSingleVal = function (adapterName, attribute, ruleName) {
|
||||
/// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where
|
||||
/// the jQuery Validate validation rule has a single value.</summary>
|
||||
/// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
|
||||
/// in the data-val-nnnn HTML attribute(where nnnn is the adapter name).</param>
|
||||
/// <param name="attribute" type="String">[Optional] The name of the HTML attribute that contains the value.
|
||||
/// The default is "val".</param>
|
||||
/// <param name="ruleName" type="String" optional="true">[Optional] The name of the jQuery Validate rule. If not provided, the value
|
||||
/// of adapterName will be used instead.</param>
|
||||
/// <returns type="jQuery.validator.unobtrusive.adapters" />
|
||||
return this.add(adapterName, [attribute || "val"], function (options) {
|
||||
setValidationValues(options, ruleName || adapterName, options.params[attribute]);
|
||||
});
|
||||
};
|
||||
|
||||
$jQval.addMethod("__dummy__", function (value, element, params) {
|
||||
return true;
|
||||
});
|
||||
|
||||
$jQval.addMethod("regex", function (value, element, params) {
|
||||
var match;
|
||||
if (this.optional(element)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
match = new RegExp(params).exec(value);
|
||||
return (match && (match.index === 0) && (match[0].length === value.length));
|
||||
});
|
||||
|
||||
$jQval.addMethod("nonalphamin", function (value, element, nonalphamin) {
|
||||
var match;
|
||||
if (nonalphamin) {
|
||||
match = value.match(/\W/g);
|
||||
match = match && match.length >= nonalphamin;
|
||||
}
|
||||
return match;
|
||||
});
|
||||
|
||||
if ($jQval.methods.extension) {
|
||||
adapters.addSingleVal("accept", "mimtype");
|
||||
adapters.addSingleVal("extension", "extension");
|
||||
} else {
|
||||
// for backward compatibility, when the 'extension' validation method does not exist, such as with versions
|
||||
// of JQuery Validation plugin prior to 1.10, we should use the 'accept' method for
|
||||
// validating the extension, and ignore mime-type validations as they are not supported.
|
||||
adapters.addSingleVal("extension", "extension", "accept");
|
||||
}
|
||||
|
||||
adapters.addSingleVal("regex", "pattern");
|
||||
adapters.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url");
|
||||
adapters.addMinMax("length", "minlength", "maxlength", "rangelength").addMinMax("range", "min", "max", "range");
|
||||
adapters.addMinMax("minlength", "minlength").addMinMax("maxlength", "minlength", "maxlength");
|
||||
adapters.add("equalto", ["other"], function (options) {
|
||||
var prefix = getModelPrefix(options.element.name),
|
||||
other = options.params.other,
|
||||
fullOtherName = appendModelPrefix(other, prefix),
|
||||
element = $(options.form).find(":input").filter("[name='" + escapeAttributeValue(fullOtherName) + "']")[0];
|
||||
|
||||
setValidationValues(options, "equalTo", element);
|
||||
});
|
||||
adapters.add("required", function (options) {
|
||||
// jQuery Validate equates "required" with "mandatory" for checkbox elements
|
||||
if (options.element.tagName.toUpperCase() !== "INPUT" || options.element.type.toUpperCase() !== "CHECKBOX") {
|
||||
setValidationValues(options, "required", true);
|
||||
}
|
||||
});
|
||||
adapters.add("remote", ["url", "type", "additionalfields"], function (options) {
|
||||
var value = {
|
||||
url: options.params.url,
|
||||
type: options.params.type || "GET",
|
||||
data: {}
|
||||
},
|
||||
prefix = getModelPrefix(options.element.name);
|
||||
|
||||
$.each(splitAndTrim(options.params.additionalfields || options.element.name), function (i, fieldName) {
|
||||
var paramName = appendModelPrefix(fieldName, prefix);
|
||||
value.data[paramName] = function () {
|
||||
var field = $(options.form).find(":input").filter("[name='" + escapeAttributeValue(paramName) + "']");
|
||||
// For checkboxes and radio buttons, only pick up values from checked fields.
|
||||
if (field.is(":checkbox")) {
|
||||
return field.filter(":checked").val() || field.filter(":hidden").val() || '';
|
||||
}
|
||||
else if (field.is(":radio")) {
|
||||
return field.filter(":checked").val() || '';
|
||||
}
|
||||
return field.val();
|
||||
};
|
||||
});
|
||||
|
||||
setValidationValues(options, "remote", value);
|
||||
});
|
||||
adapters.add("password", ["min", "nonalphamin", "regex"], function (options) {
|
||||
if (options.params.min) {
|
||||
setValidationValues(options, "minlength", options.params.min);
|
||||
}
|
||||
if (options.params.nonalphamin) {
|
||||
setValidationValues(options, "nonalphamin", options.params.nonalphamin);
|
||||
}
|
||||
if (options.params.regex) {
|
||||
setValidationValues(options, "regex", options.params.regex);
|
||||
}
|
||||
});
|
||||
adapters.add("fileextensions", ["extensions"], function (options) {
|
||||
setValidationValues(options, "extension", options.params.extensions);
|
||||
});
|
||||
|
||||
$(function () {
|
||||
$jQval.unobtrusive.parse(document);
|
||||
});
|
||||
|
||||
return $jQval.unobtrusive;
|
||||
}));
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,22 @@
|
||||
The MIT License (MIT)
|
||||
=====================
|
||||
|
||||
Copyright Jörn Zaefferer
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
1158
OCPP.Core.Management/wwwroot/lib/jquery-validation/dist/additional-methods.js
vendored
Normal file
1158
OCPP.Core.Management/wwwroot/lib/jquery-validation/dist/additional-methods.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
4
OCPP.Core.Management/wwwroot/lib/jquery-validation/dist/additional-methods.min.js
vendored
Normal file
4
OCPP.Core.Management/wwwroot/lib/jquery-validation/dist/additional-methods.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1601
OCPP.Core.Management/wwwroot/lib/jquery-validation/dist/jquery.validate.js
vendored
Normal file
1601
OCPP.Core.Management/wwwroot/lib/jquery-validation/dist/jquery.validate.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
4
OCPP.Core.Management/wwwroot/lib/jquery-validation/dist/jquery.validate.min.js
vendored
Normal file
4
OCPP.Core.Management/wwwroot/lib/jquery-validation/dist/jquery.validate.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
36
OCPP.Core.Management/wwwroot/lib/jquery/LICENSE.txt
Normal file
36
OCPP.Core.Management/wwwroot/lib/jquery/LICENSE.txt
Normal file
@@ -0,0 +1,36 @@
|
||||
Copyright JS Foundation and other contributors, https://js.foundation/
|
||||
|
||||
This software consists of voluntary contributions made by many
|
||||
individuals. For exact contribution history, see the revision history
|
||||
available at https://github.com/jquery/jquery
|
||||
|
||||
The following license applies to all parts of this software except as
|
||||
documented below:
|
||||
|
||||
====
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
====
|
||||
|
||||
All files located in the node_modules and external directories are
|
||||
externally maintained libraries used by this software which have their
|
||||
own licenses; we recommend you read them, as their terms may differ from
|
||||
the terms above.
|
||||
10872
OCPP.Core.Management/wwwroot/lib/jquery/dist/jquery.js
vendored
Normal file
10872
OCPP.Core.Management/wwwroot/lib/jquery/dist/jquery.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
2
OCPP.Core.Management/wwwroot/lib/jquery/dist/jquery.min.js
vendored
Normal file
2
OCPP.Core.Management/wwwroot/lib/jquery/dist/jquery.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
OCPP.Core.Management/wwwroot/lib/jquery/dist/jquery.min.map
vendored
Normal file
1
OCPP.Core.Management/wwwroot/lib/jquery/dist/jquery.min.map
vendored
Normal file
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user