init
This commit is contained in:
commit
e124a47765
19374 changed files with 9806149 additions and 0 deletions
|
@ -0,0 +1,23 @@
|
|||
using System.Web.Mvc;
|
||||
using Kreta.BusinessLogic.HelperClasses;
|
||||
using Kreta.BusinessLogic.Helpers;
|
||||
using Kreta.Web.Areas.Feljegyzes.Models;
|
||||
using Kreta.Web.Helpers;
|
||||
using Kreta.Web.Security;
|
||||
|
||||
namespace Kreta.Web.Areas.Feljegyzes.Controllers
|
||||
{
|
||||
public abstract class AbstractFeljegyzesekController : Controller
|
||||
{
|
||||
protected FeljegyzesekModel GetFeljegyzesekModel()
|
||||
{
|
||||
FeljegyzesHelperCo feljegyzesHelperCo = new FeljegyzesHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType()).GetFeljegyzesHelperCo();
|
||||
var model = new FeljegyzesekModel
|
||||
{
|
||||
ElsoTanitasiNap = feljegyzesHelperCo.ElsoTanitasiNap,
|
||||
DefaultEsemenyDatuma = feljegyzesHelperCo.DefaultEsemenyDatuma
|
||||
};
|
||||
return model;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
using System.Web.Http;
|
||||
using System.Web.Mvc;
|
||||
using Kreta.BusinessLogic.Security;
|
||||
using Kreta.Web.Areas.Feljegyzes.Models;
|
||||
using Kreta.Web.Areas.Hianyzas.Logic;
|
||||
using Kreta.Web.Security;
|
||||
|
||||
namespace Kreta.Web.Areas.Feljegyzes.Controllers
|
||||
{
|
||||
[MvcRoleClaimsAuthorize(true)]
|
||||
[MvcRolePackageDenyAuthorize(KretaClaimPackages.IsOnlyAlkalmozott.ClaimValue, KretaClaimPackages.IsSzirIntezmeny.ClaimValue)]
|
||||
[MvcRolePackageAuthorize(KretaClaimPackages.Adminisztrator.ClaimValue)]
|
||||
public class AdminTanuloKozossegiSzolgalataiController : Controller
|
||||
{
|
||||
// GET: Feljegyzes/AdminTanuloKozossegiSzolgalatai
|
||||
public ActionResult Index()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
|
||||
#region Export
|
||||
public ActionResult ExportKozossegiSzolgalat([FromUri] AdminKozossegiSzolgalatokSearchModel data)
|
||||
{
|
||||
return AdminTanuloKozossegiSzolgalataiLLogic.ExportKozossegiSzolgalat(data);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
122
KretaWeb/Areas/Feljegyzes/Controllers/BaseBeirasokController.cs
Normal file
122
KretaWeb/Areas/Feljegyzes/Controllers/BaseBeirasokController.cs
Normal file
|
@ -0,0 +1,122 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Web.Mvc;
|
||||
using Kreta.BusinessLogic.HelperClasses;
|
||||
using Kreta.BusinessLogic.Helpers;
|
||||
using Kreta.BusinessLogic.Helpers.SystemSettings;
|
||||
using Kreta.BusinessLogic.Security;
|
||||
using Kreta.Core;
|
||||
using Kreta.Enums;
|
||||
using Kreta.Framework.Util;
|
||||
using Kreta.Resources;
|
||||
using Kreta.Web.Areas.Feljegyzes.Models;
|
||||
using Kreta.Web.Helpers;
|
||||
using Kreta.Web.Models.EditorTemplates;
|
||||
using Kreta.Web.Security;
|
||||
|
||||
namespace Kreta.Web.Areas.Feljegyzes.Controllers
|
||||
{
|
||||
[MvcRoleClaimsAuthorize(true)]
|
||||
[MvcRolePackageDenyAuthorize(KretaClaimPackages.IsOnlyAlkalmozott.ClaimValue, KretaClaimPackages.IsPortas.ClaimValue)]
|
||||
[MvcRolePackageAuthorize(KretaClaimPackages.Tanar.ClaimValue, KretaClaimPackages.Osztalyfonok.ClaimValue, KretaClaimPackages.SzuperOsztalyfonok.ClaimValue, KretaClaimPackages.Naplo.ClaimValue)]
|
||||
public class BaseBeirasokController : AbstractFeljegyzesekController
|
||||
{
|
||||
#region Properties
|
||||
|
||||
public static string StartPopupFormName => "BeirasokStartPopupForm";
|
||||
public static string StartPopupId => "BeirasokStartWindow";
|
||||
|
||||
public static string GridName => "BeirasokGrid";
|
||||
|
||||
public static string NewModifyPopupName => "New_Modify_Popup";
|
||||
public static string NewModifyFormName => "BeirasNewModifyForm";
|
||||
|
||||
protected IKretaAuthorization Authorization { get; }
|
||||
|
||||
#endregion Properties
|
||||
|
||||
public BaseBeirasokController(IKretaAuthorization authorization)
|
||||
{
|
||||
Authorization = authorization ?? throw new ArgumentNullException(nameof(authorization));
|
||||
}
|
||||
|
||||
// Sitemap-ben letiltásra került, NE töröld ki!
|
||||
//[MvcRolePackageAuthorize(KretaClaimPackages.Osztalyfonok.ClaimValue, KretaClaimPackages.SzuperOsztalyfonok.ClaimValue)]
|
||||
//public ActionResult IndexOsztalyfonoki()
|
||||
//{
|
||||
// return View("Index");
|
||||
//}
|
||||
|
||||
#region Popup actions
|
||||
|
||||
[HttpPost]
|
||||
[MvcValidateAjaxAntiForgeryToken]
|
||||
public ActionResult OpenNewModifyPopup(int? id, int tanuloId, int? osztalyCsoportId)
|
||||
{
|
||||
bool isModify = id.IsEntityId();
|
||||
BeirasModel beirasModel;
|
||||
var helper = new FeljegyzesHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());
|
||||
|
||||
FeljegyzesHelperCo feljegyzesHelperCo = helper.GetFeljegyzesHelperCo();
|
||||
if (isModify)
|
||||
{
|
||||
//NOTE: Az id az IdEntityId vizsgálat miatt nem lehet null!
|
||||
FeljegyzesCo co = helper.GetFeljegyzesById(id.Value);
|
||||
beirasModel = new BeirasModel(co, tanuloId);
|
||||
}
|
||||
else
|
||||
{
|
||||
beirasModel = new BeirasModel
|
||||
{
|
||||
TanuloId = tanuloId,
|
||||
FeljegyzoId = ClaimData.FelhasznaloId,
|
||||
FeljegyzoNev = ClaimData.FelhasznaloNev,
|
||||
EsemenyDatuma = feljegyzesHelperCo.DefaultEsemenyDatuma,
|
||||
OsztalyCsoportId = osztalyCsoportId
|
||||
};
|
||||
}
|
||||
|
||||
beirasModel.MinimumErvenyessegKezdete = feljegyzesHelperCo.MinimumErvenyessegKezdete;
|
||||
beirasModel.MaximumErvenyessegKezdete = feljegyzesHelperCo.MaximumErvenyessegKezdete;
|
||||
|
||||
beirasModel.TipusList = GetTipusList();
|
||||
|
||||
var systemSettingsHelper = new SystemSettingsHelper(ConnectionTypeExtensions.GetSessionConnectionType());
|
||||
|
||||
beirasModel.NemzetiDokumentumNyelvek = systemSettingsHelper.GetSystemSettingValue<List<int>>(RendszerBeallitasTipusEnum.Nemzeti_Nyelvi_Dokumentum_Nyelvek);
|
||||
beirasModel.NyelvesitendoEsemenyTipuslist = Core.Constants.NyelvesitendoEsemenyTipuslist;
|
||||
|
||||
var popupModel = new PopUpModel(beirasModel, $"~/Areas/Feljegyzes/Views/Beirasok/{NewModifyPopupName}.cshtml");
|
||||
popupModel.AddBtn(popupModel, "BtnCancel_" + NewModifyFormName, CommonResource.Megse, "BeirasokHelper.newModifyPopupCancel");
|
||||
popupModel.AddOkBtn(popupModel, "BeirasokHelper.newModifyPopupSave");
|
||||
if (isModify)
|
||||
{
|
||||
popupModel.AddDeleteBtn(popupModel, "BeirasokHelper.newModifyPopupDelete");
|
||||
}
|
||||
|
||||
return PartialView(Constants.General.PopupView, popupModel);
|
||||
}
|
||||
|
||||
[NonAction]
|
||||
public ActionResult OpenStartPopup(bool isFromSzervezet)
|
||||
{
|
||||
var model = GetFeljegyzesekModel();
|
||||
model.IsDualisKepzohelyiCsoport = isFromSzervezet;
|
||||
return PartialView("~/Areas/Feljegyzes/Views/Beirasok/Start_Popup.cshtml", model);
|
||||
}
|
||||
|
||||
#endregion Popup actions
|
||||
|
||||
[NonAction]
|
||||
public ActionResult BeirasokReszletekGrid(BeirasokGridModel model)
|
||||
{
|
||||
return PartialView("~/Areas/Feljegyzes/Views/Beirasok/DetailGrid.cshtml", model);
|
||||
}
|
||||
|
||||
private static List<SelectListItem> GetTipusList()
|
||||
{
|
||||
var result = FrameworkEnumExtensions.EnumToList((int)GeneratedAdatszotarTipusEnum.EsemenyTipus, ClaimData.SelectedTanevID.Value).ToSelectListItemList(new List<string> { ((int)EsemenyTipusEnum.ElektronikusUzenet).ToString(), ((int)EsemenyTipusEnum.FaliujsagBejegyzes).ToString() });
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,137 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Web.Mvc;
|
||||
using Kreta.BusinessLogic.HelperClasses;
|
||||
using Kreta.BusinessLogic.Helpers;
|
||||
using Kreta.BusinessLogic.Security;
|
||||
using Kreta.Enums.ManualEnums;
|
||||
using Kreta.Resources;
|
||||
using Kreta.Web.Areas.Feljegyzes.Models;
|
||||
using Kreta.Web.Helpers;
|
||||
using Kreta.Web.Helpers.TabStrip;
|
||||
using Kreta.Web.Models.EditorTemplates;
|
||||
using Kreta.Web.Security;
|
||||
|
||||
namespace Kreta.Web.Areas.Feljegyzes.Controllers
|
||||
{
|
||||
[MvcRoleClaimsAuthorize(true)]
|
||||
[MvcRolePackageDenyAuthorize(KretaClaimPackages.IsOnlyAlkalmozott.ClaimValue)]
|
||||
[MvcRolePackageAuthorize(KretaClaimPackages.Tanar.ClaimValue, KretaClaimPackages.Osztalyfonok.ClaimValue, KretaClaimPackages.SzuperOsztalyfonok.ClaimValue)]
|
||||
public class BaseElektronikusUzenetekController : AbstractFeljegyzesekController
|
||||
{
|
||||
#region Properties
|
||||
|
||||
public static string TabStripId => "ElektronikusUzenetekTabStrip";
|
||||
|
||||
public static string StartPopupFormName => "ElektronikusUzenetekStartPopupForm";
|
||||
public static string StartPopupId => "ElektronikusUzenetekStartWindow";
|
||||
|
||||
public static string GridNameNaploNezet => "ElektronikusUzenetNaploNezetGrid";
|
||||
public static string GridNameListaNezet => "ElektronikusUzenetListaNezetGrid";
|
||||
|
||||
public static string NewFormName => "ElektronikusUzenetNewForm";
|
||||
|
||||
public static string ModifyPopupName => "Modify_Popup";
|
||||
public static string ModifyFormName => "ElektronikusUzenetModifyForm";
|
||||
public static string ModifyPopupGridName => "ElektronikusUzenetModifyPopupGrid";
|
||||
|
||||
protected IKretaAuthorization Authorization { get; set; }
|
||||
#endregion Properties
|
||||
|
||||
public BaseElektronikusUzenetekController(IKretaAuthorization authorization)
|
||||
{
|
||||
Authorization = authorization ?? throw new ArgumentNullException(nameof(authorization));
|
||||
}
|
||||
|
||||
[NonAction]
|
||||
public ActionResult GetNaploNezetTab(string controllerName, string apiControllerName)
|
||||
{
|
||||
var feljegyzesHelperCo = new FeljegyzesHelper(ConnectionTypeExtensions.GetSessionConnectionType()).GetFeljegyzesHelperCo();
|
||||
var model = new ElektronikusUzenetSearchModel
|
||||
{
|
||||
IsFaliujsagMegjelenes = true,
|
||||
IsMindenkinek = true,
|
||||
EsemenyDatuma = feljegyzesHelperCo.DefaultEsemenyDatuma,
|
||||
MinimumErvenyessegKezdete = feljegyzesHelperCo.MinimumErvenyessegKezdete,
|
||||
MaximumErvenyessegKezdete = feljegyzesHelperCo.MaximumErvenyessegKezdete,
|
||||
MinimumErvenyessegVege = feljegyzesHelperCo.MinimumErvenyessegVege,
|
||||
MaximumErvenyessegVege = feljegyzesHelperCo.MaximumErvenyessegVege,
|
||||
ApiControllerName = apiControllerName,
|
||||
ControllerName = controllerName,
|
||||
};
|
||||
return PartialView("~/Areas/Feljegyzes/Views/ElektronikusUzenetek/NaploNezet_Tab.cshtml", model);
|
||||
}
|
||||
|
||||
[NonAction]
|
||||
public ActionResult GetListaNezetTab(FeljegyzesekModel model)
|
||||
{
|
||||
return PartialView("~/Areas/Feljegyzes/Views/ElektronikusUzenetek/ListaNezet_Tab.cshtml", model);
|
||||
}
|
||||
|
||||
[NonAction]
|
||||
public ActionResult NaploNezetReszletekGrid(ElektronikusUzenetekNaploNezetGridModel model)
|
||||
{
|
||||
return PartialView("~/Areas/Feljegyzes/Views/ElektronikusUzenetek/DetailGrid.cshtml", model);
|
||||
}
|
||||
|
||||
protected List<TabStripItemModel> GetTabs(string controllerName)
|
||||
{
|
||||
var list = new List<TabStripItemModel>
|
||||
{
|
||||
new TabStripItemModel
|
||||
{
|
||||
ItemId = "0",
|
||||
ItemName = FeljegyzesekResource.NaploNezet,
|
||||
Area = "Feljegyzes",
|
||||
Controller = controllerName,
|
||||
Action = "GetNaploNezetTab"
|
||||
},
|
||||
new TabStripItemModel
|
||||
{
|
||||
ItemId = "1",
|
||||
ItemName = FeljegyzesekResource.ListaNezet,
|
||||
Area = "Feljegyzes",
|
||||
Controller = controllerName,
|
||||
Action = "GetListaNezetTab"
|
||||
}
|
||||
};
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
#region Popup actions
|
||||
|
||||
[NonAction]
|
||||
public ActionResult OpenModifyPopup(int? id, int ocsID, string apiControllerName)
|
||||
{
|
||||
var helper = new FeljegyzesHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());
|
||||
|
||||
var co = helper.GetFeljegyzesById(id.Value);
|
||||
var feljegyzesHelperCo = helper.GetFeljegyzesHelperCo();
|
||||
var model = new ElektronikusUzenetPopupModel(co, ocsID)
|
||||
{
|
||||
MinimumErvenyessegKezdetePopup = feljegyzesHelperCo.MinimumErvenyessegKezdete,
|
||||
MaximumErvenyessegKezdetePopup = feljegyzesHelperCo.MaximumErvenyessegKezdete,
|
||||
MinimumErvenyessegVegePopup = feljegyzesHelperCo.MinimumErvenyessegVege,
|
||||
MaximumErvenyessegVegePopup = feljegyzesHelperCo.MaximumErvenyessegVege,
|
||||
ApiControllerName = apiControllerName,
|
||||
};
|
||||
|
||||
var popupModel = new PopUpModel(model, $"~/Areas/Feljegyzes/Views/ElektronikusUzenetek/{ModifyPopupName}.cshtml");
|
||||
popupModel.AddCancelBtn(popupModel, "ElektronikusUzenetekHelper.modifyPopupCancel");
|
||||
popupModel.AddOkBtn(popupModel, "ModifyPopupHelper.saveElektronikusUzenetPopup");
|
||||
popupModel.AddDeleteBtn(popupModel, "ElektronikusUzenetekHelper.modifyPopupDelete");
|
||||
|
||||
return PartialView(Constants.General.PopupView, popupModel);
|
||||
}
|
||||
|
||||
[NonAction]
|
||||
public ActionResult OpenStartPopup(bool isFromSzervezet)
|
||||
{
|
||||
var model = GetFeljegyzesekModel();
|
||||
model.IsDualisKepzohelyiCsoport = isFromSzervezet;
|
||||
return PartialView($"~/Areas/Feljegyzes/Views/ElektronikusUzenetek/Start_Popup.cshtml", model);
|
||||
}
|
||||
#endregion Popup actions
|
||||
}
|
||||
}
|
42
KretaWeb/Areas/Feljegyzes/Controllers/BeirasokController.cs
Normal file
42
KretaWeb/Areas/Feljegyzes/Controllers/BeirasokController.cs
Normal file
|
@ -0,0 +1,42 @@
|
|||
using System.Web.Mvc;
|
||||
using Kreta.Web.Areas.Feljegyzes.Models;
|
||||
using Kreta.Web.Security;
|
||||
|
||||
namespace Kreta.Web.Areas.Feljegyzes.Controllers
|
||||
{
|
||||
public class BeirasokController : BaseBeirasokController
|
||||
{
|
||||
public BeirasokController(IKretaAuthorization authorization) : base(authorization)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public ActionResult Index()
|
||||
{
|
||||
if (Authorization.IsValidDualisBeirasok())
|
||||
{
|
||||
return Redirect(Url.Action("AccessDenied", "ErrorHandler", new { area = string.Empty }));
|
||||
}
|
||||
var model = new FeljegyzesekSearchModel
|
||||
{
|
||||
ControllerName = Constants.Controllers.Beirasok,
|
||||
ApiControllerName = Constants.ApiControllers.BeirasokApi,
|
||||
};
|
||||
return View("Index", model);
|
||||
}
|
||||
|
||||
public new ActionResult BeirasokReszletekGrid(BeirasokGridModel model)
|
||||
{
|
||||
model.ApiControllerName = Constants.ApiControllers.BeirasokApi;
|
||||
return base.BeirasokReszletekGrid(model);
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
[MvcValidateAjaxAntiForgeryToken]
|
||||
public ActionResult OpenStartPopup()
|
||||
{
|
||||
return OpenStartPopup(false);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,43 @@
|
|||
using System.Web.Mvc;
|
||||
using Kreta.Web.Areas.Feljegyzes.Models;
|
||||
using Kreta.Web.Attributes;
|
||||
using Kreta.Web.Security;
|
||||
|
||||
namespace Kreta.Web.Areas.Feljegyzes.Controllers
|
||||
{
|
||||
[KretaGlobalLanguageChangeActionFilter(LanguageCode = "hu-Dualis")]
|
||||
public class DualisBeirasokController : BaseBeirasokController
|
||||
{
|
||||
public DualisBeirasokController(IKretaAuthorization authorization) : base(authorization)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public ActionResult Index()
|
||||
{
|
||||
if (!Authorization.IsValidDualisBeirasok())
|
||||
{
|
||||
return Redirect(Url.Action("AccessDenied", "ErrorHandler", new { area = string.Empty }));
|
||||
}
|
||||
var model = new FeljegyzesekSearchModel
|
||||
{
|
||||
ControllerName = Constants.Controllers.DualisBeirasok,
|
||||
ApiControllerName = Constants.ApiControllers.DualisBeirasokApi,
|
||||
};
|
||||
return View("~/Areas/Feljegyzes/Views/Beirasok/Index.cshtml", model);
|
||||
}
|
||||
|
||||
public new ActionResult BeirasokReszletekGrid(BeirasokGridModel model)
|
||||
{
|
||||
model.ApiControllerName = Constants.ApiControllers.DualisBeirasokApi;
|
||||
return base.BeirasokReszletekGrid(model);
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
[MvcValidateAjaxAntiForgeryToken]
|
||||
public ActionResult OpenStartPopup()
|
||||
{
|
||||
return OpenStartPopup(true);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,74 @@
|
|||
using System.Web.Mvc;
|
||||
using Kreta.Web.Areas.Feljegyzes.Models;
|
||||
using Kreta.Web.Attributes;
|
||||
using Kreta.Web.Security;
|
||||
|
||||
namespace Kreta.Web.Areas.Feljegyzes.Controllers
|
||||
{
|
||||
[KretaGlobalLanguageChangeActionFilter(LanguageCode = "hu-Dualis")]
|
||||
public class DualisElektronikusUzenetekController : BaseElektronikusUzenetekController
|
||||
{
|
||||
public DualisElektronikusUzenetekController(IKretaAuthorization authorization) : base(authorization)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public ActionResult Index()
|
||||
{
|
||||
if (!Authorization.IsValidDualisElektronikusUzenetek())
|
||||
{
|
||||
return Redirect(Url.Action("AccessDenied", "ErrorHandler", new
|
||||
{
|
||||
area = string.Empty
|
||||
}));
|
||||
}
|
||||
|
||||
var model = new FeljegyzesekModel
|
||||
{
|
||||
TabList = GetTabs(Constants.Controllers.DualisElektronikusUzenetek),
|
||||
ControllerName = Constants.Controllers.DualisElektronikusUzenetek,
|
||||
ApiControllerName = Constants.ApiControllers.DualisElektronikusUzenetekApi,
|
||||
IsDualisKepzohelyiCsoport = true,
|
||||
};
|
||||
return View("~/Areas/Feljegyzes/Views/ElektronikusUzenetek/Index.cshtml", model);
|
||||
}
|
||||
|
||||
public ActionResult GetNaploNezetTab()
|
||||
{
|
||||
return GetNaploNezetTab(Constants.Controllers.DualisElektronikusUzenetek, Constants.ApiControllers.DualisElektronikusUzenetekApi);
|
||||
}
|
||||
|
||||
public ActionResult GetListaNezetTab()
|
||||
{
|
||||
var model = new FeljegyzesekModel
|
||||
{
|
||||
ApiControllerName = Constants.ApiControllers.DualisElektronikusUzenetekApi,
|
||||
};
|
||||
return GetListaNezetTab(model);
|
||||
}
|
||||
|
||||
public new ActionResult NaploNezetReszletekGrid(ElektronikusUzenetekNaploNezetGridModel model)
|
||||
{
|
||||
model.ApiControllerName = Constants.ApiControllers.DualisElektronikusUzenetekApi;
|
||||
return base.NaploNezetReszletekGrid(model);
|
||||
}
|
||||
|
||||
#region Popup actions
|
||||
|
||||
[HttpPost]
|
||||
[MvcValidateAjaxAntiForgeryToken]
|
||||
public ActionResult OpenStartPopup()
|
||||
{
|
||||
return OpenStartPopup(true);
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
[MvcValidateAjaxAntiForgeryToken]
|
||||
public ActionResult OpenModifyPopup(int? id, int ocsID)
|
||||
{
|
||||
return OpenModifyPopup(id, ocsID, Constants.ApiControllers.DualisElektronikusUzenetekApi);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -0,0 +1,94 @@
|
|||
using System.Web.Mvc;
|
||||
using Kreta.BusinessLogic.Security;
|
||||
using Kreta.Web.Areas.Feljegyzes.Models;
|
||||
using Kreta.Web.Security;
|
||||
|
||||
namespace Kreta.Web.Areas.Feljegyzes.Controllers
|
||||
{
|
||||
[MvcRoleClaimsAuthorize(true)]
|
||||
[MvcRolePackageDenyAuthorize(KretaClaimPackages.IsOnlyAlkalmozott.ClaimValue)]
|
||||
[MvcRolePackageAuthorize(KretaClaimPackages.Tanar.ClaimValue, KretaClaimPackages.Osztalyfonok.ClaimValue, KretaClaimPackages.SzuperOsztalyfonok.ClaimValue)]
|
||||
public class ElektronikusUzenetekController : BaseElektronikusUzenetekController
|
||||
{
|
||||
#region Properties
|
||||
|
||||
public static string TabStripId => "ElektronikusUzenetekTabStrip";
|
||||
|
||||
public static string StartPopupFormName => "ElektronikusUzenetekStartPopupForm";
|
||||
public static string StartPopupId => "ElektronikusUzenetekStartWindow";
|
||||
|
||||
public static string GridNameNaploNezet => "ElektronikusUzenetNaploNezetGrid";
|
||||
public static string GridNameListaNezet => "ElektronikusUzenetListaNezetGrid";
|
||||
|
||||
public static string NewFormName => "ElektronikusUzenetNewForm";
|
||||
|
||||
public static string ModifyPopupName => "Modify_Popup";
|
||||
public static string ModifyFormName => "ElektronikusUzenetModifyForm";
|
||||
public static string ModifyPopupGridName => "ElektronikusUzenetModifyPopupGrid";
|
||||
|
||||
#endregion Properties
|
||||
|
||||
public ElektronikusUzenetekController(IKretaAuthorization authorization) : base(authorization)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public ActionResult Index()
|
||||
{
|
||||
if (Authorization.IsValidDualisElektronikusUzenetek())
|
||||
{
|
||||
return Redirect(Url.Action("AccessDenied", "ErrorHandler", new
|
||||
{
|
||||
area = string.Empty
|
||||
}));
|
||||
}
|
||||
|
||||
var model = new FeljegyzesekModel
|
||||
{
|
||||
TabList = GetTabs(Constants.Controllers.ElektronikusUzenetek),
|
||||
ControllerName = Constants.Controllers.ElektronikusUzenetek,
|
||||
ApiControllerName = Constants.ApiControllers.ElektronikusUzenetekApi,
|
||||
IsDualisKepzohelyiCsoport = false,
|
||||
};
|
||||
return View("Index", model);
|
||||
}
|
||||
|
||||
public ActionResult GetNaploNezetTab()
|
||||
{
|
||||
return GetNaploNezetTab(Constants.Controllers.ElektronikusUzenetek, Constants.ApiControllers.ElektronikusUzenetekApi);
|
||||
}
|
||||
|
||||
public ActionResult GetListaNezetTab()
|
||||
{
|
||||
var model = new FeljegyzesekModel
|
||||
{
|
||||
ApiControllerName = Constants.ApiControllers.ElektronikusUzenetekApi,
|
||||
};
|
||||
return GetListaNezetTab(model);
|
||||
}
|
||||
|
||||
public new ActionResult NaploNezetReszletekGrid(ElektronikusUzenetekNaploNezetGridModel model)
|
||||
{
|
||||
model.ApiControllerName = Constants.ApiControllers.ElektronikusUzenetekApi;
|
||||
return base.NaploNezetReszletekGrid(model);
|
||||
}
|
||||
|
||||
#region Popup actions
|
||||
|
||||
[HttpPost]
|
||||
[MvcValidateAjaxAntiForgeryToken]
|
||||
public ActionResult OpenStartPopup()
|
||||
{
|
||||
return OpenStartPopup(false);
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
[MvcValidateAjaxAntiForgeryToken]
|
||||
public ActionResult OpenModifyPopup(int? id, int ocsID)
|
||||
{
|
||||
return OpenModifyPopup(id, ocsID, Constants.ApiControllers.ElektronikusUzenetekApi);
|
||||
}
|
||||
|
||||
#endregion Popup actions
|
||||
}
|
||||
}
|
|
@ -0,0 +1,81 @@
|
|||
using System.Web.Mvc;
|
||||
using Kreta.BusinessLogic.HelperClasses;
|
||||
using Kreta.BusinessLogic.Helpers;
|
||||
using Kreta.BusinessLogic.Security;
|
||||
using Kreta.Core;
|
||||
using Kreta.Web.Areas.Feljegyzes.Models;
|
||||
using Kreta.Web.Helpers;
|
||||
using Kreta.Web.Models.EditorTemplates;
|
||||
using Kreta.Web.Security;
|
||||
|
||||
namespace Kreta.Web.Areas.Feljegyzes.Controllers
|
||||
{
|
||||
[MvcRoleClaimsAuthorize(true)]
|
||||
[MvcRolePackageDenyAuthorize(KretaClaimPackages.IsOnlyAlkalmozott.ClaimValue)]
|
||||
[MvcRolePackageAuthorize(KretaClaimPackages.Tanar.ClaimValue, KretaClaimPackages.Osztalyfonok.ClaimValue, KretaClaimPackages.SzuperOsztalyfonok.ClaimValue)]
|
||||
public class FaliujsagBejegyzesekController : AbstractFeljegyzesekController
|
||||
{
|
||||
public static string GridName => "FaliujsagBejegyzesekGrid";
|
||||
|
||||
public static string NewModifyPopupName => "New_Modify_Popup";
|
||||
public static string NewModifyFormName => "FaliujsagBejegyzesekNewModifyForm";
|
||||
public static string NewModifyPopupGridName => "FaliujsagBejegyzesekNewModifyPopupGrid";
|
||||
|
||||
public ActionResult Index()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
|
||||
#region Popup actions
|
||||
|
||||
[HttpPost]
|
||||
[MvcValidateAjaxAntiForgeryToken]
|
||||
[MvcRolePackageDenyAuthorize(KretaClaimPackages.Szuperadmin.ClaimValue)]
|
||||
[MvcRolePackageAuthorize(KretaClaimPackages.Adminisztrator.ClaimValue, KretaClaimPackages.Tanar.ClaimValue, KretaClaimPackages.Osztalyfonok.ClaimValue, KretaClaimPackages.SzuperOsztalyfonok.ClaimValue)]
|
||||
public ActionResult OpenNewModifyPopup(int? id)
|
||||
{
|
||||
bool isModify = id.IsEntityId();
|
||||
FaliujsagBejegyzesModel faliujsagModel;
|
||||
var helper = new FeljegyzesHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());
|
||||
var hasAdminJogosultsag = ClaimManager.HasPackage(KretaClaimPackages.Adminisztrator.ClaimValue);
|
||||
FeljegyzesHelperCo feljegyzesHelperCo = helper.GetFeljegyzesHelperCo();
|
||||
if (isModify)
|
||||
{
|
||||
//NOTE: Az id az IdEntityId vizsgálat miatt nem lehet null!
|
||||
FeljegyzesCo co = helper.GetFeljegyzesById(id.Value);
|
||||
co.HasAdminJogosultsag = hasAdminJogosultsag;
|
||||
faliujsagModel = new FaliujsagBejegyzesModel(co);
|
||||
}
|
||||
else
|
||||
{
|
||||
faliujsagModel = new FaliujsagBejegyzesModel
|
||||
{
|
||||
IsMindenkinek = true,
|
||||
FeljegyzoId = ClaimData.FelhasznaloId,
|
||||
FeljegyzoNev = ClaimData.FelhasznaloNev,
|
||||
HasAdminJogosultsag = hasAdminJogosultsag,
|
||||
EsemenyDatuma = feljegyzesHelperCo.DefaultEsemenyDatuma
|
||||
};
|
||||
}
|
||||
|
||||
faliujsagModel.MinimumErvenyessegKezdete = feljegyzesHelperCo.MinimumErvenyessegKezdete;
|
||||
faliujsagModel.MaximumErvenyessegKezdete = feljegyzesHelperCo.MaximumErvenyessegKezdete;
|
||||
faliujsagModel.MinimumErvenyessegVege = feljegyzesHelperCo.MinimumErvenyessegVege;
|
||||
faliujsagModel.MaximumErvenyessegVege = feljegyzesHelperCo.MaximumErvenyessegVege;
|
||||
|
||||
var javascriptHelper = hasAdminJogosultsag ? "FeljegyzesKeresoHelper" : "FaliujsagBejegyzesekHelper";
|
||||
|
||||
var popupModel = new PopUpModel(faliujsagModel, NewModifyPopupName);
|
||||
popupModel.AddCancelBtn(popupModel, $"{javascriptHelper}.newModifyPopupCancel");
|
||||
popupModel.AddOkBtn(popupModel, "ModifyPopupHelper.saveFaliujsagPopup");
|
||||
if (isModify)
|
||||
{
|
||||
popupModel.AddDeleteBtn(popupModel, $"{javascriptHelper}.newModifyPopupDelete");
|
||||
}
|
||||
|
||||
return PartialView(Constants.General.PopupView, popupModel);
|
||||
}
|
||||
|
||||
#endregion Popup actions
|
||||
}
|
||||
}
|
|
@ -0,0 +1,185 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using System.Web.Mvc;
|
||||
using Kreta.BusinessLogic.Classes.ExcelHelpers;
|
||||
using Kreta.BusinessLogic.HelperClasses;
|
||||
using Kreta.BusinessLogic.Helpers;
|
||||
using Kreta.BusinessLogic.Helpers.SystemSettings;
|
||||
using Kreta.BusinessLogic.Security;
|
||||
using Kreta.Core;
|
||||
using Kreta.Enums;
|
||||
using Kreta.Framework.Util;
|
||||
using Kreta.Resources;
|
||||
using Kreta.Web.Areas.Feljegyzes.Models;
|
||||
using Kreta.Web.Areas.Nyomtatvanyok.Logic;
|
||||
using Kreta.Web.Helpers;
|
||||
using Kreta.Web.Models.EditorTemplates;
|
||||
using Kreta.Web.Security;
|
||||
|
||||
namespace Kreta.Web.Areas.Feljegyzes.Controllers
|
||||
{
|
||||
[MvcRoleClaimsAuthorize(true)]
|
||||
[MvcRolePackageDenyAuthorize(KretaClaimPackages.IsOnlyAlkalmozott.ClaimValue)]
|
||||
[MvcRolePackageAuthorize(
|
||||
KretaClaimPackages.IsKozossegiSzolgalatKezelo.ClaimValue,
|
||||
KretaClaimPackages.Osztalyfonok.ClaimValue,
|
||||
KretaClaimPackages.SzuperOsztalyfonok.ClaimValue
|
||||
)]
|
||||
public class KozossegiSzolgalatokController : Controller
|
||||
{
|
||||
|
||||
#region Properties
|
||||
|
||||
public static string StartPopupFormName => "KozossegiSzolgalatokStartPopupForm";
|
||||
public static string StartPopupId => "KozossegiSzolgalatokStartWindow";
|
||||
|
||||
public static string GridName => "KozossegiSzolgalatokGrid";
|
||||
public static string DetailGridNamePrefix => "KozossegiSzolgalatokReszletekGrid_";
|
||||
|
||||
public static string NewModifyPopupName => "New_Modify_Popup";
|
||||
public static string NewModifyFormName => "KozossegiSzolgalatNewModifyForm";
|
||||
|
||||
#endregion Properties
|
||||
|
||||
public ActionResult Index()
|
||||
{
|
||||
var helper = new OsztalyCsoportHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());
|
||||
var model = new KozossegiSzolgalatokSearchModel();
|
||||
List<SelectListItem> osztalyList = new List<SelectListItem>();
|
||||
if (ClaimManager.HasPackage(
|
||||
KretaClaimPackages.Adminisztrator.ClaimValue
|
||||
, KretaClaimPackages.SzuperOsztalyfonok.ClaimValue
|
||||
, KretaClaimPackages.IsKozossegiSzolgalatKezelo.ClaimValue))
|
||||
{
|
||||
osztalyList = new OsztalyHelper(ConnectionTypeExtensions.GetSessionConnectionType()).GetOsztalyokForDDL().ToSelectListItemList();
|
||||
}
|
||||
else
|
||||
{
|
||||
osztalyList = new OsztalyHelper(ConnectionTypeExtensions.GetSessionConnectionType()).GetOsztalyokForDDL("", ClaimData.FelhasznaloId).ToSelectListItemList();
|
||||
}
|
||||
model.OsztalyCsoportList = osztalyList;
|
||||
if (osztalyList.Count == 1)
|
||||
{
|
||||
var csoportId = Convert.ToInt32(osztalyList.Single().Value);
|
||||
model.CsoportIdSearch = csoportId;
|
||||
model.OsztalyCsoportId = csoportId;
|
||||
model.OsztalyCsoportNev = osztalyList.Single().Text;
|
||||
}
|
||||
else
|
||||
{
|
||||
model.OsztalyCsoportId = null;
|
||||
model.OsztalyCsoportNev = string.Empty;
|
||||
}
|
||||
return View(model);
|
||||
}
|
||||
|
||||
#region Popup actions
|
||||
|
||||
[HttpPost]
|
||||
[MvcValidateAjaxAntiForgeryToken]
|
||||
public ActionResult OpenStartPopup()
|
||||
{
|
||||
var model = new KozossegiSzolgalatokModel();
|
||||
return PartialView("Start_Popup", model);
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
[MvcValidateAjaxAntiForgeryToken]
|
||||
[MvcRolePackageAuthorize(Enums.ManualEnums.TanevEnum.Mind,
|
||||
KretaClaimPackages.IsKozossegiSzolgalatKezelo.ClaimValue,
|
||||
KretaClaimPackages.Osztalyfonok.ClaimValue,
|
||||
KretaClaimPackages.SzuperOsztalyfonok.ClaimValue,
|
||||
KretaClaimPackages.Adminisztrator.ClaimValue,
|
||||
KretaClaimPackages.IsSzirIntezmeny.ClaimValue
|
||||
)]
|
||||
public ActionResult OpenNewModifyPopup(int? id, int tanuloId)
|
||||
{
|
||||
bool isModify = id.IsEntityId();
|
||||
KozossegiSzolgalatModel kozossegiSzolgalatModel;
|
||||
|
||||
if (isModify)
|
||||
{
|
||||
//NOTE: Az id az IdEntityId vizsgálat miatt nem lehet null!
|
||||
KozossegiSzolgalatCo co = new FeljegyzesHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType()).GetKozossegiSzolgalatById(id.Value);
|
||||
kozossegiSzolgalatModel = new KozossegiSzolgalatModel(co);
|
||||
}
|
||||
else
|
||||
{
|
||||
kozossegiSzolgalatModel = new KozossegiSzolgalatModel
|
||||
{
|
||||
TanuloId = tanuloId,
|
||||
IntervallumKezdete = DateTime.Today,
|
||||
IntervallumVege = DateTime.Today,
|
||||
RogzitesDatuma = DateTime.Today,
|
||||
Oraszam = 1
|
||||
};
|
||||
}
|
||||
|
||||
var systemSettingsHelper = new SystemSettingsHelper(ConnectionTypeExtensions.GetSessionConnectionType());
|
||||
|
||||
kozossegiSzolgalatModel.NemzetiDokumentumNyelvek = systemSettingsHelper.GetSystemSettingValue<List<int>>(RendszerBeallitasTipusEnum.Nemzeti_Nyelvi_Dokumentum_Nyelvek);
|
||||
kozossegiSzolgalatModel.KozossegiSzolgalatTipusList = GetKozossegiSzolgalatTipusList();
|
||||
|
||||
var popupModel = new PopUpModel(kozossegiSzolgalatModel, NewModifyPopupName);
|
||||
popupModel.AddBtn(popupModel, "KozsossegiSzolgalatBtnCancel", CommonResource.Megse, "KozossegiSzolgalatokHelper.newModifyPopupCancel", "BtnCancel");
|
||||
popupModel.AddBtn(popupModel, "KozsossegiSzolgalatBtnOk", CommonResource.Mentes, "KozossegiSzolgalatokHelper.newModifyPopupSave", "BtnOk");
|
||||
if (isModify)
|
||||
{
|
||||
popupModel.AddBtn(popupModel, "KozsossegiSzolgalatBtnDelete", CommonResource.Torles, "KozossegiSzolgalatokHelper.newModifyPopupDelete", "BtnDelete");
|
||||
}
|
||||
|
||||
return PartialView(Constants.General.PopupView, popupModel);
|
||||
}
|
||||
|
||||
#endregion Popup actions
|
||||
|
||||
[MvcRolePackageAuthorize(
|
||||
KretaClaimPackages.IsKozossegiSzolgalatKezelo.ClaimValue,
|
||||
KretaClaimPackages.Osztalyfonok.ClaimValue,
|
||||
KretaClaimPackages.SzuperOsztalyfonok.ClaimValue,
|
||||
KretaClaimPackages.Adminisztrator.ClaimValue
|
||||
)]
|
||||
public ActionResult KozossegiSzolgalatokReszletekGrid(KozossegiSzolgalatokGridModel model)
|
||||
{
|
||||
return PartialView("DetailGrid", model);
|
||||
}
|
||||
|
||||
private static List<SelectListItem> GetKozossegiSzolgalatTipusList()
|
||||
{
|
||||
//NOTE: Az Na a korábban migrált és/vagy létrehozott közösségi szolgálatokhoz kell, mivel korábban még nem lehetett kiválasztani közösségi szolgálat típust/tevékenységet.
|
||||
var result = FrameworkEnumExtensions.EnumToList((int)GeneratedAdatszotarTipusEnum.KozossegiSzolgalatTipus, ClaimData.SelectedTanevID.Value).ToSelectListItemList(new List<string> { ((int)KozossegiSzolgalatTipusEnum.Na).ToString() });
|
||||
return result;
|
||||
}
|
||||
|
||||
public ActionResult KozossegiSzolgalatokExportGrid([System.Web.Http.FromUri] KozossegiSzolgalatokSearchModel kozossegiSzolgalatokSearchModel)
|
||||
{
|
||||
try
|
||||
{
|
||||
var helper = new NyomtatvanyokHelper(ConnectionTypeExtensions.GetSessionConnectionType());
|
||||
|
||||
KozossegiSzolgalatokSearchCo co = new KozossegiSzolgalatokSearchCo();
|
||||
co.OsztalyCsoportIdList = kozossegiSzolgalatokSearchModel.CsoportIdSearch.HasValue ? new List<int> { kozossegiSzolgalatokSearchModel.CsoportIdSearch.Value } : null;
|
||||
co.TanuloIdList = new List<int>();
|
||||
co.TanuloNev = kozossegiSzolgalatokSearchModel.TanuloNeve;
|
||||
co.IntervallumKezdete = kozossegiSzolgalatokSearchModel.IdoszakKezdete;
|
||||
co.IntervallumVege = kozossegiSzolgalatokSearchModel.IdoszakVege;
|
||||
co.OsszesOraszamKezdete = kozossegiSzolgalatokSearchModel.OsszesOraszamKezdete;
|
||||
co.OsszesOraszamVege = kozossegiSzolgalatokSearchModel.OsszesOraszamVege;
|
||||
co.AnyjaNeve = kozossegiSzolgalatokSearchModel.AnyjaNeve;
|
||||
|
||||
DataSet dataSet = helper.GetKozossegiSzolgalatokExcelExport(co);
|
||||
var data = FeljegyzesHelper.GetExcelData(dataSet);
|
||||
var excel = new ExcelExportManager();
|
||||
var stream = excel.CreateExcelExport(data, fejlec: false);
|
||||
|
||||
return File(stream, Kreta.Core.Constants.ContentTypes.Xlsx, $"{FeljegyzesekResource.KozossegiSzolgalatokExportFileName}.xlsx");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw NyomtatvanyokLogic.NyomtatvanyError(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,62 @@
|
|||
using System.IO;
|
||||
using System.Web.Mvc;
|
||||
using Kreta.BusinessLogic.Helpers;
|
||||
using Kreta.BusinessLogic.Security;
|
||||
using Kreta.Resources;
|
||||
using Kreta.Web.Areas.Feljegyzes.Models;
|
||||
using Kreta.Web.Areas.TanuloErtekeles.Controllers;
|
||||
using Kreta.Web.Helpers;
|
||||
using Kreta.Web.Security;
|
||||
|
||||
namespace Kreta.Web.Areas.Feljegyzes.Controllers
|
||||
{
|
||||
[MvcRoleClaimsAuthorize(true)]
|
||||
[MvcRolePackageDenyAuthorize(KretaClaimPackages.IsOnlyAlkalmozott.ClaimValue)]
|
||||
[MvcRolePackageAuthorize(KretaClaimPackages.Tanar.ClaimValue, KretaClaimPackages.Osztalyfonok.ClaimValue, KretaClaimPackages.SzuperOsztalyfonok.ClaimValue)]
|
||||
public class OsszefuggoSzakGyakController : Controller
|
||||
{
|
||||
public static string StartPopupFormName => "OsszefuggoSzakGyakStartPopupForm";
|
||||
public static string StartPopupId => "OsszefuggoSzakGyakStartWindow";
|
||||
public static string StartPopupTitle => ClaimData.IsSelectedTanev20_21OrLater ? FeljegyzesekResource.EgybefuggoSzakmaiGyakorlat : FeljegyzesekResource.OsszefuggoSzakmaiGyakorlat;
|
||||
public static string GridName => "OsszefuggoSzakGyakGrid";
|
||||
private IKretaAuthorization Authorization { get; }
|
||||
|
||||
public OsszefuggoSzakGyakController(IKretaAuthorization authorization)
|
||||
{
|
||||
Authorization = authorization;
|
||||
}
|
||||
|
||||
public ActionResult Index()
|
||||
{
|
||||
var model = new OsszefuggoSzakGyakSearchModel
|
||||
{
|
||||
OsztalyzatList = new ErtekelesController(Authorization).GetOsztalyzatList(true)
|
||||
};
|
||||
|
||||
return View("Index", model);
|
||||
}
|
||||
|
||||
public ActionResult EgybefuggoSzakGyakIndex() => Index();
|
||||
|
||||
[HttpPost]
|
||||
[MvcValidateAjaxAntiForgeryToken]
|
||||
public ActionResult OpenStartPopup()
|
||||
{
|
||||
var model = new OsszefuggoSzakGyakModel
|
||||
{
|
||||
OsztalyzatList = new ErtekelesController(Authorization).GetOsztalyzatList(true)
|
||||
};
|
||||
|
||||
return PartialView("Start_Popup", model);
|
||||
}
|
||||
|
||||
public ActionResult Export(int csoportId, int tantargyId)
|
||||
{
|
||||
var helper = new OsszefuggoSzakGyakHelper(ConnectionTypeExtensions.GetSessionConnectionType());
|
||||
MemoryStream memoryStream = helper.Export(csoportId, tantargyId);
|
||||
|
||||
var fileStreamResult = new FileStreamResult(memoryStream, Core.Constants.ContentTypes.Xlsx) { FileDownloadName = FeljegyzesekResource.OsszefuggoSzakmaiGyakorlatExport };
|
||||
return fileStreamResult;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
using System.Web.Mvc;
|
||||
using Kreta.BusinessLogic.Security;
|
||||
using Kreta.Web.Security;
|
||||
|
||||
namespace Kreta.Web.Areas.Feljegyzes.Controllers
|
||||
{
|
||||
[MvcRoleClaimsAuthorize(true)]
|
||||
[MvcRolePackageDenyAuthorize(KretaClaimPackages.IsOnlyAlkalmozott.ClaimValue)]
|
||||
[MvcRolePackageAuthorize(KretaClaimPackages.Ellenorzo.ClaimValue)]
|
||||
public class TanuloKozossegiSzolgalataiController : Controller
|
||||
{
|
||||
// GET: Feljegyzes/TanuloKozossegiSzolgalatai
|
||||
public ActionResult Index()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue