diff --git a/SaxoniteCoreWebAdmin/Admin/Controllers/OrganisationController-Ajax.cs b/SaxoniteCoreWebAdmin/Admin/Controllers/OrganisationController-Ajax.cs index 5c0cd4f..de9038c 100644 --- a/SaxoniteCoreWebAdmin/Admin/Controllers/OrganisationController-Ajax.cs +++ b/SaxoniteCoreWebAdmin/Admin/Controllers/OrganisationController-Ajax.cs @@ -79,7 +79,7 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers data.ContactMethods.Add(new AjaxResponse_Data.ContactMethodData() { Method = method.ToString(), MethodCaption = Localiser.GetContactMethodCaption(method), Value = contactData.GetContactMethodValue(method) }); } // Address. - if (address != null) + if (address != null && !address.IsStatusDeleted) { data.Address = new AjaxResponse_Data.AddressData(); data.Address.Id = address.Id.ToString(); @@ -352,64 +352,80 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers if (model.Address.IsSpecified()) { - // Organisation regions. - SaxRegion.Data regionCountry = Internals.GetRegion(organisation.RegionIdPrimary); - if (regionCountry != null && regionCountry.RegionType != Sax.RegionType.Country) - regionCountry = null; - SaxRegion.Data regionProvince = null; + // The form includes address fields. + if (model.Address.IsPopulated()) + { + // Organisation regions. + SaxRegion.Data regionCountry = Internals.GetRegion(organisation.RegionIdPrimary); + if (regionCountry != null && regionCountry.RegionType != Sax.RegionType.Country) + regionCountry = null; + SaxRegion.Data regionProvince = null; - // Create Organisation address if required. - if (organisationAddress == null) - { - organisationAddress = ItemDataMgr.CreateItemAddress(organisation.GetItemId(), SaxItemAddress.DefaultOrganisationAddressType); - disposableItems.Add(organisationAddress); - } - - // Store address. - if (model.Address.Line1 != null) - organisationAddress.Line1 = model.Address.Line1; - if (model.Address.Line2 != null) - organisationAddress.Line2 = model.Address.Line2; - if (model.Address.Line3 != null) - organisationAddress.Line3 = model.Address.Line3; - if (model.Address.Town != null) - organisationAddress.Town = model.Address.Town; - if (regionProvince != null) - { - organisationAddress.Province = regionProvince.Name; - organisationAddress.RegionIdProvince = regionProvince.Id; - } - else - { - if (model.Address.Province != null) - organisationAddress.Province = model.Address.Province; - } - if (regionCountry != null) - { - organisationAddress.Country = regionCountry.Name; - organisationAddress.RegionIdCountry = regionCountry.Id; - } - else - { - if (model.Address.Country != null) - organisationAddress.Country = model.Address.Country; - } - organisationAddress.PostalCode = model.Address.PostalCode; - if (!SysId.IsValid(organisationAddress.Id)) - { - // Create new address. - if (!ItemDataMgr.InsertItemAddress(organisationAddress, DbUpdateInfo)) + // Create Organisation address if required. + if (organisationAddress == null) { - SaLogger.Warn(fn + " Failed to insert organisation address - " + ItemDataMgr.ErrorStateMessage); - return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"])); + organisationAddress = ItemDataMgr.CreateItemAddress(organisation.GetItemId(), SaxItemAddress.DefaultOrganisationAddressType); + disposableItems.Add(organisationAddress); + } + + // Store address. + if (model.Address.Line1 != null) + organisationAddress.Line1 = model.Address.Line1; + if (model.Address.Line2 != null) + organisationAddress.Line2 = model.Address.Line2; + if (model.Address.Line3 != null) + organisationAddress.Line3 = model.Address.Line3; + if (model.Address.Town != null) + organisationAddress.Town = model.Address.Town; + if (regionProvince != null) + { + organisationAddress.Province = regionProvince.Name; + organisationAddress.RegionIdProvince = regionProvince.Id; + } + else + { + if (model.Address.Province != null) + organisationAddress.Province = model.Address.Province; + } + if (regionCountry != null) + { + organisationAddress.Country = regionCountry.Name; + organisationAddress.RegionIdCountry = regionCountry.Id; + } + else + { + if (model.Address.Country != null) + organisationAddress.Country = model.Address.Country; + } + organisationAddress.PostalCode = model.Address.PostalCode; + organisationAddress.Status = SaxItemAddress.DefaultStatus; + + // Store address. + if (!SysId.IsValid(organisationAddress.Id)) + { + // Create new address. + if (!ItemDataMgr.InsertItemAddress(organisationAddress, DbUpdateInfo)) + { + SaLogger.Warn(fn + " Failed to insert organisation address - " + ItemDataMgr.ErrorStateMessage); + return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"])); + } + } + else + { + // Update existing address. + if (!ItemDataMgr.UpdateItemAddress(organisationAddress, DbUpdateInfo)) + { + SaLogger.Warn(fn + " Failed to update organisation address - " + ItemDataMgr.ErrorStateMessage); + return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"])); + } } } else { - // Update existing address. - if (!ItemDataMgr.UpdateItemAddress(organisationAddress, DbUpdateInfo)) + // Address not populated - delete it. + if (!ItemDataMgr.DeleteItemAddress(organisationAddress, DbUpdateInfo)) { - SaLogger.Warn(fn + " Failed to update organisation address - " + ItemDataMgr.ErrorStateMessage); + SaLogger.Warn(fn + " Failed to delete organisation address - " + ItemDataMgr.ErrorStateMessage); return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"])); } } diff --git a/SaxoniteCoreWebAdmin/Admin/Controllers/RegionController-Ajax.cs b/SaxoniteCoreWebAdmin/Admin/Controllers/RegionController-Ajax.cs index f7bef73..ccf36fd 100644 --- a/SaxoniteCoreWebAdmin/Admin/Controllers/RegionController-Ajax.cs +++ b/SaxoniteCoreWebAdmin/Admin/Controllers/RegionController-Ajax.cs @@ -19,22 +19,19 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers { //------------------------------------------------------------------- // Region data. - private class RegionData_List + private class RegionListData : AjaxResponse_Data.ItemData_Base { - public String Id { get; set; } public String RegionTypeCode { get; set; } public String RegionTypeDesc { get; set; } public String CountryIso2Code { get; set; } public String Name { get; set; } public String ParentName { get; set; } - public String StatusCode { get; set; } - public String StatusDesc { get; set; } } - private class RegionData_Full : RegionData_List + private class RegionItemData : RegionListData { - public int RegionIdParent { get; set; } + public String RegionIdParent { get; set; } } - private void PopulateRegionResponseData(SaxRegion region, RegionData_List data) + private void PopulateRegionResponseListData(SaxRegion region, RegionListData data) { data.Id = SysId.ToString(region.Id); data.RegionTypeCode = RegionTypeCodes.GetCodeForType(region.RegionType); @@ -48,10 +45,10 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers data.StatusCode = region.StatusCode; data.StatusDesc = region.StatusDesc; } - private void PopulateRegionResponseData(SaxRegion region, RegionData_Full data) + private void PopulateRegionResponseItemData(SaxRegion region, RegionItemData data) { - PopulateRegionResponseData(region, data as RegionData_List); - data.RegionIdParent = SysId.ToInt(region.RegionIdParent); + PopulateRegionResponseListData(region, data); + data.RegionIdParent = SysId.ToString(region.RegionIdParent); } //------------------------------------------------------------------- @@ -62,7 +59,7 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers // Construction. public AjaxResponse_RegionList(SaxModel_Admin model) : base(model) { } // Region list. - public List Regions { get; } = new List(); + public List Regions { get; } = new List(); // Reference data. public List Statuses { get; } = new List(); public String DefaultStatusCode { get; set; } @@ -121,7 +118,7 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers { NamedValue.Map values = resultSet.GetRecordValues(); Sax.RegionType regionType = (Sax.RegionType)values.GetLong(colType.DataName); - RegionData_List regionData = new RegionData_List() + RegionListData regionData = new RegionListData() { Id = values.GetString(colId.DataName), RegionTypeCode = RegionTypeCodes.GetCodeForType(regionType), @@ -152,7 +149,7 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers // Construction. public AjaxResponse_Region(SaxModel_Admin model) : base(model) { } // Region details. - public RegionData_Full region { get; } = new RegionData_Full(); + public RegionItemData region { get; } = new RegionItemData(); } //------------------------------------------------------------------- [HttpPost] @@ -186,7 +183,7 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers } // Construct response. - PopulateRegionResponseData(region, responseData.region); + PopulateRegionResponseItemData(region, responseData.region); } // Complete response. @@ -267,7 +264,7 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers } // Construct response. - PopulateRegionResponseData(region, responseData.region); + PopulateRegionResponseItemData(region, responseData.region); } // Complete response. diff --git a/SaxoniteCoreWebAdmin/Admin/Controllers/SportController-Ajax.cs b/SaxoniteCoreWebAdmin/Admin/Controllers/SportController-Ajax.cs index 2c2f4fd..163aae2 100644 --- a/SaxoniteCoreWebAdmin/Admin/Controllers/SportController-Ajax.cs +++ b/SaxoniteCoreWebAdmin/Admin/Controllers/SportController-Ajax.cs @@ -19,7 +19,7 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers { //------------------------------------------------------------------- // Sport data. - private class SportData_List : AjaxResponse_Data.ItemData_Base + private class SportListData : AjaxResponse_Data.ItemData_Base { public String Name { get; set; } public String SportIdParent { get; set; } @@ -27,10 +27,10 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers public String SpecialityLabelCode { get; set; } public String SpecialityLabelDesc { get; set; } } - private class SportData_Full : SportData_List + private class SportItemData : SportListData { } - private void PopulateSportResponseData(SaxSport sport, SaxSport parentSport, SportData_List data) + private void PopulateSportResponseListData(SaxSport sport, SaxSport parentSport, SportListData data) { data.Id = SysId.ToString(sport.Id); data.SportNameParent = parentSport?.Name ?? null; @@ -41,9 +41,9 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers data.StatusCode = sport.StatusCode; data.StatusDesc = sport.StatusDesc; } - private void PopulateSportResponseData(SaxSport sport, SaxSport parentSport, SportData_Full data) + private void PopulateSportResponseItemData(SaxSport sport, SaxSport parentSport, SportItemData data) { - PopulateSportResponseData(sport, parentSport, data as SportData_List); + PopulateSportResponseListData(sport, parentSport, data); } //------------------------------------------------------------------- @@ -54,7 +54,7 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers // Construction. public AjaxResponse_SportList(SaxModel_Admin model) : base(model) { } // Sport list. - public List Sports { get; } = new List(); + public List Sports { get; } = new List(); // Reference data. public List Statuses { get; } = new List(); public String DefaultStatusCode { get; set; } @@ -107,7 +107,7 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers { NamedValue.Map values = resultSet.GetRecordValues(); Sax.SportSpecialityLabel specialityLabel = (Sax.SportSpecialityLabel)values.GetLong(colSpecialityLabel.DataName); - SportData_List sportData = new SportData_List() + SportListData sportData = new SportListData() { Id = values.GetString(colId.DataName), SportIdParent = values.GetString(colParentId.DataName), @@ -138,7 +138,7 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers // Construction. public AjaxResponse_Sport(SaxModel_Admin model) : base(model) { } // Sport details. - public SportData_Full sport { get; } = new SportData_Full(); + public SportItemData sport { get; } = new SportItemData(); } //------------------------------------------------------------------- [HttpPost] @@ -176,7 +176,7 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers disposableItems.Add(parentSport); // Construct response. - PopulateSportResponseData(sport, parentSport, responseData.sport); + PopulateSportResponseItemData(sport, parentSport, responseData.sport); } // Complete response. @@ -259,7 +259,7 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers disposableItems.Add(parentSport); // Construct response. - PopulateSportResponseData(sport, parentSport, responseData.sport); + PopulateSportResponseItemData(sport, parentSport, responseData.sport); } // Complete response. diff --git a/SaxoniteCoreWebAdmin/Admin/Models/ModelData_Address.cs b/SaxoniteCoreWebAdmin/Admin/Models/ModelData_Address.cs index 6c46bcc..3c6636c 100644 --- a/SaxoniteCoreWebAdmin/Admin/Models/ModelData_Address.cs +++ b/SaxoniteCoreWebAdmin/Admin/Models/ModelData_Address.cs @@ -51,6 +51,13 @@ namespace Saxonite.Net.Core.Web.Admin.Models return true; return false; } + /// Have any address values been populated on the form. + public bool IsPopulated() + { + if (SysId.IsValid(Id.ToSysId()) || !StringUtil.IsEmpty(Line1) || !StringUtil.IsEmpty(Town) || !StringUtil.IsEmpty(Province) || !StringUtil.IsEmpty(Country) || !StringUtil.IsEmpty(PostalCode)) + return true; + return false; + } //------------------------------------------------------------------- // Validation. @@ -58,6 +65,8 @@ namespace Saxonite.Net.Core.Web.Admin.Models // Address. public bool ValidateAddressData(SaxController_Base.AjaxResponse_Data responseData) { + // Are any properties populated. + bool populated = IsPopulated(); // Address Line 1 - optional. if (Line1 != null) @@ -89,11 +98,11 @@ namespace Saxonite.Net.Core.Web.Admin.Models } } - // Address Town - mandatory. + // Address Town - mandatory if any value populated. if (Town != null) { responseData.SetControlValue(ControlNameSuffix + "Town", Town); - if (StringUtil.IsEmpty(Town)) + if (StringUtil.IsEmpty(Town) && populated) responseData.SetControlError(ControlNameSuffix + "Town", Model.Localiser["msg.validation.mandatory.value"]); else if (StringUtil.GetLength(Town) > Model.GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.ItemAddress_Town)) responseData.SetControlError(ControlNameSuffix + "Town", Model.Localiser["msg.validation.maximum.length", Model.GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.ItemAddress_Town)]); diff --git a/SaxoniteCoreWebAdmin/Admin/Models/Model_Organisation.cs b/SaxoniteCoreWebAdmin/Admin/Models/Model_Organisation.cs index 446bbf5..8683e31 100644 --- a/SaxoniteCoreWebAdmin/Admin/Models/Model_Organisation.cs +++ b/SaxoniteCoreWebAdmin/Admin/Models/Model_Organisation.cs @@ -23,7 +23,7 @@ namespace Saxonite.Net.Core.Web.Admin.Models base(localiser) { AdditionalFiles_JS.Add("js/sax-org.js"); - Address = new ModelData_Address(this, "Address"); + Address = new ModelData_Address(this, ""); } //------------------------------------------------------------------- @@ -224,6 +224,10 @@ namespace Saxonite.Net.Core.Web.Admin.Models responseData.SetControlError(nameof(OrganisationStatus), Localiser["msg.validation.invalid.value"]); } + // Validate address fields. + if (Address != null) + Address.ValidateAddressData(responseData); + return !responseData.HasControlErrors(); } diff --git a/SaxoniteCoreWebAdmin/Localisation/SaxAdminProperties.resx b/SaxoniteCoreWebAdmin/Localisation/SaxAdminProperties.resx index 720ff5b..59083d7 100644 --- a/SaxoniteCoreWebAdmin/Localisation/SaxAdminProperties.resx +++ b/SaxoniteCoreWebAdmin/Localisation/SaxAdminProperties.resx @@ -120,6 +120,9 @@ Contact Method + + Organisation Address + Sportierre @@ -255,6 +258,9 @@ Forgotten password? + + Images + Index @@ -282,6 +288,9 @@ Last name + + Location + Logs @@ -348,6 +357,9 @@ Current password + + Postcode + Previous @@ -420,6 +432,9 @@ Title + + Town + Type diff --git a/SaxoniteCoreWebAdmin/Views/Common/Controls-ItemAddress.cshtml b/SaxoniteCoreWebAdmin/Views/Common/Controls-ItemAddress.cshtml new file mode 100644 index 0000000..73ed2cc --- /dev/null +++ b/SaxoniteCoreWebAdmin/Views/Common/Controls-ItemAddress.cshtml @@ -0,0 +1,99 @@ +@* Controls - Item Address *@ +@model SaxModel_Admin +@inject SaxLocaliser Localiser + +@if (!Model.RegisterView("Views/Common/Controls-ItemAddress")) return; + +@* Item address - Line 1 *@ +
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +@* Item address - Line 2 *@ +
+
+
+
+
+
+
+
+
+
+
+ +@* Item address - Line 3 *@ +
+
+
+
+
+
+
+
+
+
+
+ +@* Item address - Town *@ +
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +@* Item address - Province *@ +
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +@* Item address - PostalCode *@ +
+
+
+
+ +
+
+
+
+
+
+
+
+
+
diff --git a/SaxoniteCoreWebAdmin/Views/Organisation/Index.cshtml b/SaxoniteCoreWebAdmin/Views/Organisation/Index.cshtml index 06082ae..8de757e 100644 --- a/SaxoniteCoreWebAdmin/Views/Organisation/Index.cshtml +++ b/SaxoniteCoreWebAdmin/Views/Organisation/Index.cshtml @@ -11,6 +11,8 @@ sax.lbl.refresh = '@(Localiser.GetJavascriptText("label.refresh"))'; sax.lbl.create = '@(Localiser.GetJavascriptText("label.create"))'; sax.lbl.edit = '@(Localiser.GetJavascriptText("label.edit"))'; + sax.lbl.location = '@(Localiser.GetJavascriptText("label.location"))'; + sax.lbl.images = '@(Localiser.GetJavascriptText("label.images"))'; sax.lbl.activate = '@(Localiser.GetJavascriptText("label.activate"))'; @@ -23,88 +25,88 @@ @* Filter Panel *@ @using (@Html.BeginForm(FormMethod.Post, new { @id = "frmOrganisationFilter", @class = "sax-form", @onSubmit = "return false;" })) { -
- @* Header - Page caption, paging controls, actions. *@ -
-
-
@Localiser["organisation.caption.organisations"]
-
-
- -
-
- @* Burger menu *@ - -
-
-
-
-
- @* Organisation filter - name etc. *@ -
-
@Localiser["label.search"]
-
- @Html.TextBoxFor(model => model.Filter.Organisation, new { @id = "", @class = "FilterOrganisation", @maxlength = "32" }) -
-
- @* Organisation Category *@ -
-
@Localiser["label.category"]
-
- @Html.DropDownListFor(model => model.Filter.OrganisationCategoryCode, Model.AdminOrganisationCategoriesForSelect, Localiser["label.any"], new { @id = "", @class = "FilterOrganisationCategory sax-select" }) -
-
- @* Organisation sport *@ -
-
@Localiser["label.sport"]
-
-
- @Html.HiddenFor(model => model.Filter.OrganisationSportId, new { @id = "", @class = "FilterOrganisationSportId" }) -
-
-
@(Localiser[
-
@(Localiser[
+
+ @* Header - Page caption, paging controls, actions. *@ +
+
+
@Localiser["organisation.caption.organisations"]
+
+
+ +
+
+ @* Burger menu *@ +
- @* Organisation region *@ -
-
@Localiser["label.region"]
-
-
- @Html.HiddenFor(model => model.Filter.OrganisationRegionId, new { @id = "", @class = "FilterOrganisationRegionId" }) -
-
-
@(Localiser[
-
@(Localiser[
+
+ @* Organisation filter - name etc. *@ +
+
@Localiser["label.search"]
+
+ @Html.TextBoxFor(model => model.Filter.Organisation, new { @id = "", @class = "FilterOrganisation", @maxlength = "32" }) +
+
+ @* Organisation Category *@ +
+
@Localiser["label.category"]
+
+ @Html.DropDownListFor(model => model.Filter.OrganisationCategoryCode, Model.AdminOrganisationCategoriesForSelect, Localiser["label.any"], new { @id = "", @class = "FilterOrganisationCategory sax-select" }) +
+
+ @* Organisation sport *@ +
+
@Localiser["label.sport"]
+
+
+ @Html.HiddenFor(model => model.Filter.OrganisationSportId, new { @id = "", @class = "FilterOrganisationSportId" }) +
+
+
@(Localiser[
+
@(Localiser[
+
-
- @* Organisation Status *@ -
-
@Localiser["label.status"]
-
- @Html.DropDownListFor(model => model.Filter.OrganisationStatusCategoryCode, Model.OrganisationFilterStatusCategoriesForSelect, new { @id = "", @class = "FilterOrganisationStatusCategory sax-select" }) + @* Organisation region *@ +
+
@Localiser["label.region"]
+
+
+ @Html.HiddenFor(model => model.Filter.OrganisationRegionId, new { @id = "", @class = "FilterOrganisationRegionId" }) +
+
+
@(Localiser[
+
@(Localiser[
+
+
+
+
+ @* Organisation Status *@ +
+
@Localiser["label.status"]
+
+ @Html.DropDownListFor(model => model.Filter.OrganisationStatusCategoryCode, Model.OrganisationFilterStatusCategoriesForSelect, new { @id = "", @class = "FilterOrganisationStatusCategory sax-select" }) +
-
- @* Filter element templates *@ -
- @* Burger dropdown item template - ul is ignored *@ -
    -
  • XXX
  • -
-
+ @* Filter element templates *@ +
+ @* Burger dropdown item template - ul is ignored *@ +
    +
  • XXX
  • +
+
-
+
}
@@ -163,5 +165,6 @@
+ diff --git a/SaxoniteCoreWebAdmin/Views/Organisation/Panel-OrganisationAddressDialog.cshtml b/SaxoniteCoreWebAdmin/Views/Organisation/Panel-OrganisationAddressDialog.cshtml new file mode 100644 index 0000000..f2279b8 --- /dev/null +++ b/SaxoniteCoreWebAdmin/Views/Organisation/Panel-OrganisationAddressDialog.cshtml @@ -0,0 +1,36 @@ +@model Model_Organisation +@inject SaxLocaliser Localiser +@{ + /* Organisations - Organisation Address dialog panel */ +} + +
+ +
+ @using (@Html.BeginForm(FormMethod.Post, new { @id = "frmOrganisationAddress", @class = "sax-form", @onSubmit = "return false;" })) + { + @Html.HiddenFor(model => model.OrganisationId, new { @id = "", @class = "OrganisationId" }) + + @* Organisation name *@ +
+
+
+
+ +
+
+
+
+ @Html.TextBoxFor(model => model.OrganisationName, new { @id = "ifOrganisationName", @class = "OrganisationName sax-input", @maxlength = @Model.GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.Organisation_Name), disabled = true }) +
+
+
+
+
+ + + + } +
+
+ diff --git a/SaxoniteCoreWebAdmin/Views/Region/Panel-RegionDialog.cshtml b/SaxoniteCoreWebAdmin/Views/Region/Panel-RegionDialog.cshtml index 2450e1d..3a7ccab 100644 --- a/SaxoniteCoreWebAdmin/Views/Region/Panel-RegionDialog.cshtml +++ b/SaxoniteCoreWebAdmin/Views/Region/Panel-RegionDialog.cshtml @@ -19,7 +19,7 @@ @Html.HiddenFor(model => model.RegionId, new { @id = "", @class = "RegionId" }) @* Region type *@ -
+
diff --git a/SaxoniteCoreWebAdmin/wwwroot/css/sax-data.css b/SaxoniteCoreWebAdmin/wwwroot/css/sax-data.css index 90c75b4..80eb7b8 100644 --- a/SaxoniteCoreWebAdmin/wwwroot/css/sax-data.css +++ b/SaxoniteCoreWebAdmin/wwwroot/css/sax-data.css @@ -161,6 +161,16 @@ background-image: url('../img/action/mail24.png'); } +.sax-header ul.nav.sax-burger ul.sax-dropdown-menu li.sax-action.sax-dropdown-item.sax-location +{ + background-image: url('../img/action/location-24.png'); +} + +.sax-header ul.nav.sax-burger ul.sax-dropdown-menu li.sax-action.sax-dropdown-item.sax-image +{ + background-image: url('../img/action/image-24.png'); +} + .sax-header ul.nav.sax-burger ul.sax-dropdown-menu li.sax-action.sax-dropdown-item.sax-process { background-image: url('../img/action/process24.png'); diff --git a/SaxoniteCoreWebAdmin/wwwroot/img/action/image-16.png b/SaxoniteCoreWebAdmin/wwwroot/img/action/image-16.png new file mode 100644 index 0000000..4c13bd6 Binary files /dev/null and b/SaxoniteCoreWebAdmin/wwwroot/img/action/image-16.png differ diff --git a/SaxoniteCoreWebAdmin/wwwroot/img/action/image-24.png b/SaxoniteCoreWebAdmin/wwwroot/img/action/image-24.png new file mode 100644 index 0000000..1bbf42e Binary files /dev/null and b/SaxoniteCoreWebAdmin/wwwroot/img/action/image-24.png differ diff --git a/SaxoniteCoreWebAdmin/wwwroot/img/action/image-32.png b/SaxoniteCoreWebAdmin/wwwroot/img/action/image-32.png new file mode 100644 index 0000000..cde8c30 Binary files /dev/null and b/SaxoniteCoreWebAdmin/wwwroot/img/action/image-32.png differ diff --git a/SaxoniteCoreWebAdmin/wwwroot/img/action/location-16.png b/SaxoniteCoreWebAdmin/wwwroot/img/action/location-16.png new file mode 100644 index 0000000..5ad3958 Binary files /dev/null and b/SaxoniteCoreWebAdmin/wwwroot/img/action/location-16.png differ diff --git a/SaxoniteCoreWebAdmin/wwwroot/img/action/location-24.png b/SaxoniteCoreWebAdmin/wwwroot/img/action/location-24.png new file mode 100644 index 0000000..2c40e3a Binary files /dev/null and b/SaxoniteCoreWebAdmin/wwwroot/img/action/location-24.png differ diff --git a/SaxoniteCoreWebAdmin/wwwroot/img/action/location-32.png b/SaxoniteCoreWebAdmin/wwwroot/img/action/location-32.png new file mode 100644 index 0000000..6eb3ebc Binary files /dev/null and b/SaxoniteCoreWebAdmin/wwwroot/img/action/location-32.png differ diff --git a/SaxoniteCoreWebAdmin/wwwroot/js/sax-main.js b/SaxoniteCoreWebAdmin/wwwroot/js/sax-main.js index 1c59221..4b17fc9 100644 --- a/SaxoniteCoreWebAdmin/wwwroot/js/sax-main.js +++ b/SaxoniteCoreWebAdmin/wwwroot/js/sax-main.js @@ -420,17 +420,14 @@ { var $frmCtrls = $('.sax-form-control', $(context || doc.body)).removeClass('sax-error'); sax.clearControlErrors(context); - var values = (controlValues || []); - var valuesLen = values.length; - for (var valIdx = 0; valIdx < (controlValues || []).length; valIdx++) + for (let ctrlValue of controlValues || []) { - let ctrlValue = controlValues[valIdx]; $frmCtrls.each(function (idx, frmCtrl) { var $frmCtrl = $(frmCtrl); - var $ctrl = $('input,textarea,select', $frmCtrl); - if ($ctrl.prop('name') != ctrlValue.controlName) return; - if (ctrlValue.value) + if (!$frmCtrl.hasClass(ctrlValue.controlName)) return; + var $ctrl = $('sax-input,sax-textarea,sax-select', $frmCtrl); + if ($ctrl.length && sax.isDef(ctrlValue.value)) $ctrl.val(ctrlValue.value); if (ctrlValue.error) $frmCtrl.addClass('sax-error').find('.sax-message').text(ctrlValue.error); diff --git a/SaxoniteCoreWebAdmin/wwwroot/js/sax-org.js b/SaxoniteCoreWebAdmin/wwwroot/js/sax-org.js index 3dbb0e3..2de99fb 100644 --- a/SaxoniteCoreWebAdmin/wwwroot/js/sax-org.js +++ b/SaxoniteCoreWebAdmin/wwwroot/js/sax-org.js @@ -25,16 +25,14 @@ { //sax.debug('doRefreshResults', response); delete op.awaitingRefreshResponse; - sax.refreshControlValues(response.controlValues); var $msgs = $('.sax-panel-messages', $pnl.results).hide().empty(); var $items = $('.sax-panel-item-list', $pnl.results).hide().empty(); - sax.refreshPaging(response, '#frmOrganisationFilter', op.refreshResults); if (!response.success) return; + sax.refreshPaging(response, '#frmOrganisationFilter', op.refreshResults); // Reference data. op.data.contactMethods = response.contactMethods; - if (response.defaultStatusCode) op.data.defaultStatusCode = response.defaultStatusCode; - if (response.statuses) - sax.populateSelectCodeDesc('#cbOrganisationStatus', response.statuses); + op.data.defaultStatusCode = response.defaultStatusCode; + sax.populateSelectCodeDesc('#cbOrganisationStatus', response.statuses); // Menu. var $bgr = $('.sax-burger', $pnl.filter).hide(); var $mnu = $('ul.sax-dropdown-menu', $bgr).empty(); @@ -65,10 +63,12 @@ if (!item.deleted) { let fnUpdItm = function () { op.updateItem(item, $item) }; + $item.on('click', '.sax-header .sax-action.sax-item-update', fnUpdItm).on('dblclick', fnUpdItm); $mnu.append(op.getItemMenuOption(sax.lbl.edit, fnUpdItm, 'sax-edit')); if (item.awaiting) $mnu.append(op.getItemMenuOption(sax.lbl.activate, function () { op.activateItem(item) }, 'sax-unlock')); - $item.on('click', '.sax-header .sax-action.sax-item-update', fnUpdItm).on('dblclick', fnUpdItm); + $mnu.append(op.getItemMenuOption(sax.lbl.images, function () { op.updateItemImages(item, $item) }, 'sax-image')); + $mnu.append(op.getItemMenuOption(sax.lbl.location, function () { op.updateItemAddress(item, $item) }, 'sax-location')); } $('.sax-burger', $item).toggle(!!$('.sax-dropdown-item', $mnu).length); $('.sax-panel-messages', $pnl.results).hide().empty(); @@ -101,6 +101,16 @@ return $opt.find('div.sax-label').text(lbl).end().on('click', fn).addClass(cls); } + //-------------------------------------------------------------- + op.onClickMemberCount = function (id) + { + if (!(id * 1)) return; + sax.doPleaseWait(); + let frm = $('#frmOrganisationId'); + $('.OrganisationId', frm).val(id); + frm.prop('action', sax.url.base + 'Organisation/Members').submit(); + } + //-------------------------------------------------------------- op.getFilterSport = function () { @@ -242,6 +252,7 @@ { let frm = $frm.org; $('.OrganisationId,.OrganisationSportId,.OrganisationRegionIdCountry,input[type="text"],textarea,select', frm).val(''); + $pnl.tblconMths.empty(); $('.OrganisationStatus', frm).val(op.data.defaultStatusCode); sax.clearControlErrors(); } @@ -289,17 +300,7 @@ $pnl.tblconMths.append(op.getConMthEl(conMth.method, conMth.methodCaption, conMth.value)); } op.sortConMths(); - // Address. - let address = item.address || {}; - $('input.OrganisationAddressId', $frm.org).val(address.id); - $('input.OrganisationAddressLine1', $frm.org).val(address.line1); - $('input.OrganisationAddressLine2', $frm.org).val(address.line2); - $('input.OrganisationAddressLine3', $frm.org).val(address.line3); - $('input.OrganisationAddressTown', $frm.org).val(address.town); - $('input.OrganisationAddressProvince', $frm.org).val(address.province); - $('input.OrganisationAddressCountry', $frm.org).val(address.country); - $('input.OrganisationAddressPostalCode', $frm.org).val(address.postalCode); - sax.clearControlErrors(); + sax.clearControlErrors(frm); $dlg.organisation.dialog('option', 'title', sax.dlg.title.updateOrganisation); sax.openOrgDialog(); } @@ -312,7 +313,7 @@ } op.getUsedMths = function () { - return $('input[name="Organisation.ContactMethod"]', $frm.org).map(function () { return $(this).val(); }).get(); + return $('input[name="ContactMethod"]', $frm.org).map(function () { return $(this).val(); }).get(); } op.addConMth = function () { @@ -366,7 +367,7 @@ op.onStoreItem = function (response) { //sax.debug('onStoreItem', response); - sax.refreshControlValues(response.controlValues); + sax.refreshControlValues(response.controlValues, $frm.org); if (!response.success) return; $dlg.organisation.dialog('close'); op.refreshItem(response.organisation); @@ -437,13 +438,53 @@ } //-------------------------------------------------------------- - op.onClickMemberCount = function (id) + op.updateItemImages = function (item, $item) { - if (!(id * 1)) return; - sax.doPleaseWait(); - let frm = $('#frmOrganisationId'); - $('.OrganisationId', frm).val(id); - frm.prop('action', sax.url.base + 'Organisation/Members').submit(); + sax.debug('updateItemImages'); + } + + //-------------------------------------------------------------- + op.updateItemAddress = function (item, $item) + { + sax.debug('updateItemAddress'); + $('.OrganisationId', $frm.orgId).val(item.id); + op.ajax.updateItemAddr = op.ajax.updateItemAddr || { url: sax.url.base + 'Organisation/Ajax/GetItem', formId: 'frmOrganisationId', callbackFn: op.onUpdateItemAddress }; + sax.doAjaxRequest(op.ajax.updateItemAddr, 50); + } + op.onUpdateItemAddress = function (response) + { + sax.debug('onUpdateItemAddress', response); + if (!response.success) return; + // Address. + let item = response.organisation; + let address = item.address || {}; + let frm = $frm.orgAddr; + $('input.OrganisationId', frm).val(item.id); + $('.OrganisationName', frm).val(item.name); + $('input.AddressId', frm).val(address.id); + $('input.AddressLine1', frm).val(address.line1); + $('input.AddressLine2', frm).val(address.line2); + $('input.AddressLine3', frm).val(address.line3); + $('input.AddressTown', frm).val(address.town); + $('input.AddressProvince', frm).val(address.province); + $('input.AddressCountry', frm).val(address.country); + $('input.AddressPostalCode', frm).val(address.postalCode); + sax.clearControlErrors(frm); + sax.openDialog($dlg.orgAddr, 640, 480); + } + op.storeItemAddress = function () + { + sax.debug('storeItemAddress'); + op.ajax.storeItemAddr = op.ajax.storeItemAddr || { url: sax.url.base + 'Organisation/Ajax/StoreItem', formId: 'frmOrganisationAddress', callbackFn: op.onStoreItemAddress }; + sax.doAjaxRequest(op.ajax.storeItemAddr, 50); + } + op.onStoreItemAddress = function (response) + { + sax.debug('onStoreItemAddress', response); + sax.refreshControlValues(response.controlValues, $frm.orgAddr); + if (!response.success) return; + $dlg.orgAddr.dialog('close'); + op.refreshItem(response.organisation); } //-------------------------------------------------------------- @@ -459,13 +500,15 @@ $frm.filter.on('dblclick', '.FilterOrganisationSportCaption', op.selectFilterSport).on('click', '.FilterSportSelect', op.selectFilterSport).on('click', '.FilterSportClear', op.clearFilterSport); $frm.filter.on('dblclick', '.FilterOrganisationRegionCaption', op.selectFilterRegion).on('click', '.FilterRegionSelect', op.selectFilterRegion).on('click', '.FilterRegionClear', op.clearFilterRegion); + $frm.orgId = $('#frmOrganisationId'); + + // Organisation dialog and form. var opt = sax.dlgOpts(); opt.open = sax.onOpenOrgDialog; opt.buttons[sax.dlg.btn.ok] = function () { op.storeItem(); }; opt.buttons[sax.dlg.btn.cancel] = function () { $(this).dialog('close'); }; $dlg.organisation = $('#dlgOrganisation').dialog(opt); - $frm.orgId = $('#frmOrganisationId'); $frm.org = $('#frmOrganisation'); $frm.org.on('input', '.sax-input, .sax-textarea', function () { sax.clearControlError(this); }).on('change', '.sax-select', function () { sax.clearControlError(this); }); $frm.org.on('dblclick', '.OrganisationSportCaption', op.selectOrgSport).on('click', '#pbSelectSport', op.selectOrgSport).on('click', '.OrganisationSportClear', op.clearOrgSport); @@ -474,11 +517,21 @@ $pnl.conMths = $('.ItemContactMethods', $frm.org); $pnl.tblconMths = $('table.sax-data', $pnl.conMths); + // Activate Organisation dialog. var opt = sax.dlgOpts(); opt.buttons[sax.dlg.btn.ok] = function () { op.activateOrganisation(); }; opt.buttons[sax.dlg.btn.cancel] = function () { $(this).dialog('close'); }; $dlg.activate = $('#dlgOrganisationActivation').dialog(opt); + // Activate Organisation Address dialog and form. + var opt = sax.dlgOpts(); + opt.buttons[sax.dlg.btn.ok] = function () { op.storeItemAddress(); }; + opt.buttons[sax.dlg.btn.cancel] = function () { $(this).dialog('close'); }; + $dlg.orgAddr = $('#dlgOrganisationAddress').dialog(opt); + + $frm.orgAddr = $('#frmOrganisationAddress'); + $frm.orgAddr.on('input', '.sax-input, .sax-textarea', function () { sax.clearControlError(this); }).on('change', '.sax-select', function () { sax.clearControlError(this); }); + setTimeout(op.refreshResults, 250); }); diff --git a/SaxoniteCoreWebAdmin/wwwroot/js/sax-rgn.js b/SaxoniteCoreWebAdmin/wwwroot/js/sax-rgn.js index a4c8ba4..1d2b4ad 100644 --- a/SaxoniteCoreWebAdmin/wwwroot/js/sax-rgn.js +++ b/SaxoniteCoreWebAdmin/wwwroot/js/sax-rgn.js @@ -24,7 +24,6 @@ { //sax.debug('doRefreshResults', response); delete sax.awaitingRefreshResponse; - sax.refreshControlValues(response.controlValues); var $results = $('.sax-panel-results'); var $msgs = $('.sax-panel-messages', $results).hide().empty(); var $items = $('.sax-panel-item-list', $results).hide().empty(); diff --git a/SaxoniteCoreWebOnline/Localisation/SaxOnlineProperties.resx b/SaxoniteCoreWebOnline/Localisation/SaxOnlineProperties.resx index 4601ecc..439484f 100644 --- a/SaxoniteCoreWebOnline/Localisation/SaxOnlineProperties.resx +++ b/SaxoniteCoreWebOnline/Localisation/SaxOnlineProperties.resx @@ -486,7 +486,7 @@ Position - + Postal code diff --git a/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Organisations.cs b/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Organisations.cs index 4177da9..19524b0 100644 --- a/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Organisations.cs +++ b/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Organisations.cs @@ -99,7 +99,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers data.ContactMethods.Add(new AjaxResponse_Data.ContactMethodData() { Method = method.ToString(), MethodCaption = Localiser.GetContactMethodCaption(method), Value = contactData.GetContactMethodValue(method) }); } // Address. - if (address != null) + if (address != null && !address.IsStatusDeleted) { data.Address = new AjaxResponse_Data.AddressData(); data.Address.Id = model.EncryptId(address.Id); @@ -384,7 +384,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers organisationAddress = ItemDataMgr.CreateItemAddress(organisation.GetItemId(), SaxItemAddress.DefaultOrganisationAddressType); disposableItems.Add(organisationAddress); } - else + else if (!organisationAddress.IsStatusDeleted) { SaLogger.Warn(fn + " Organisation Address Id not supplied but no address found for Organisation. Id: " + organisationAddress.Id + ". " + GetLogSuffix()); return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"])); @@ -450,51 +450,71 @@ namespace Saxonite.Net.Core.Web.Online.Controllers } // Store address. - if (model.Organisation.Address.Line1 != null) - organisationAddress.Line1 = model.Organisation.Address.Line1; - if (model.Organisation.Address.Line2 != null) - organisationAddress.Line2 = model.Organisation.Address.Line2; - if (model.Organisation.Address.Line3 != null) - organisationAddress.Line3 = model.Organisation.Address.Line3; - if (model.Organisation.Address.Town != null) - organisationAddress.Town = model.Organisation.Address.Town; - if (regionProvince != null) + if (model.Organisation.Address.IsSpecified()) { - organisationAddress.Province = regionProvince.Name; - organisationAddress.RegionIdProvince = regionProvince.Id; - } - else - { - if (model.Organisation.Address.Province != null) - organisationAddress.Province = model.Organisation.Address.Province; - } - if (regionCountry != null) - { - organisationAddress.Country = regionCountry.Name; - organisationAddress.RegionIdCountry = regionCountry.Id; - } - else - { - if (model.Organisation.Address.Country != null) - organisationAddress.Country = model.Organisation.Address.Country; - } - organisationAddress.PostalCode = model.Organisation.Address.PostalCode; - if (!SysId.IsValid(organisationAddress.Id)) - { - // Create new address. - if (!ItemDataMgr.InsertItemAddress(organisationAddress, DbUpdateInfo)) + // The form includes address fields. + if (model.Organisation.Address.IsPopulated()) { - SaLogger.Warn(fn + " Failed to insert organisation address - " + ItemDataMgr.ErrorStateMessage); - return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"])); + // At least one address field has been populated. + if (model.Organisation.Address.Line1 != null) + organisationAddress.Line1 = model.Organisation.Address.Line1; + if (model.Organisation.Address.Line2 != null) + organisationAddress.Line2 = model.Organisation.Address.Line2; + if (model.Organisation.Address.Line3 != null) + organisationAddress.Line3 = model.Organisation.Address.Line3; + if (model.Organisation.Address.Town != null) + organisationAddress.Town = model.Organisation.Address.Town; + if (regionProvince != null) + { + organisationAddress.Province = regionProvince.Name; + organisationAddress.RegionIdProvince = regionProvince.Id; + } + else + { + if (model.Organisation.Address.Province != null) + organisationAddress.Province = model.Organisation.Address.Province; + } + if (regionCountry != null) + { + organisationAddress.Country = regionCountry.Name; + organisationAddress.RegionIdCountry = regionCountry.Id; + } + else + { + if (model.Organisation.Address.Country != null) + organisationAddress.Country = model.Organisation.Address.Country; + } + organisationAddress.PostalCode = model.Organisation.Address.PostalCode; + organisationAddress.Status = SaxItemAddress.DefaultStatus; + + // Store address. + if (!SysId.IsValid(organisationAddress.Id)) + { + // Create new address. + if (!ItemDataMgr.InsertItemAddress(organisationAddress, DbUpdateInfo)) + { + SaLogger.Warn(fn + " Failed to insert organisation address - " + ItemDataMgr.ErrorStateMessage); + return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"])); + } + } + else + { + // Update existing address. + if (!ItemDataMgr.UpdateItemAddress(organisationAddress, DbUpdateInfo)) + { + SaLogger.Warn(fn + " Failed to update organisation address - " + ItemDataMgr.ErrorStateMessage); + return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"])); + } + } } - } - else - { - // Update existing address. - if (!ItemDataMgr.UpdateItemAddress(organisationAddress, DbUpdateInfo)) + else { - SaLogger.Warn(fn + " Failed to update organisation address - " + ItemDataMgr.ErrorStateMessage); - return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"])); + // Address not specified - delete it. + if (!ItemDataMgr.DeleteItemAddress(organisationAddress, DbUpdateInfo)) + { + SaLogger.Warn(fn + " Failed to delete organisation address - " + ItemDataMgr.ErrorStateMessage); + return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"])); + } } } diff --git a/SaxoniteCoreWebOnline/Online/Models/ModelData_Address.cs b/SaxoniteCoreWebOnline/Online/Models/ModelData_Address.cs index baa2c73..f1cd7ff 100644 --- a/SaxoniteCoreWebOnline/Online/Models/ModelData_Address.cs +++ b/SaxoniteCoreWebOnline/Online/Models/ModelData_Address.cs @@ -51,6 +51,13 @@ namespace Saxonite.Net.Core.Web.Online.Models return true; return false; } + /// Have any address values been populated on the form. + public bool IsPopulated() + { + if (SysId.IsValid(Id.ToSysId()) || !StringUtil.IsEmpty(Line1) || !StringUtil.IsEmpty(Town) || !StringUtil.IsEmpty(Province) || !StringUtil.IsEmpty(Country) || !StringUtil.IsEmpty(PostalCode)) + return true; + return false; + } //------------------------------------------------------------------- // Validation. @@ -58,6 +65,8 @@ namespace Saxonite.Net.Core.Web.Online.Models // Address. public bool ValidateAddressData(SaxController_Base.AjaxResponse_Data responseData) { + // Are any properties populated. + bool populated = IsPopulated(); // Address Line 1 - optional. if (Line1 != null) @@ -89,11 +98,11 @@ namespace Saxonite.Net.Core.Web.Online.Models } } - // Address Town - mandatory. + // Address Town - mandatory if any value populated. if (Town != null) { responseData.SetControlValue(ControlNameSuffix + "Town", Town); - if (StringUtil.IsEmpty(Town)) + if (StringUtil.IsEmpty(Town) && populated) responseData.SetControlError(ControlNameSuffix + "Town", Model.Localiser["msg.validation.mandatory.value"]); else if (StringUtil.GetLength(Town) > Model.GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.ItemAddress_Town)) responseData.SetControlError(ControlNameSuffix + "Town", Model.Localiser["msg.validation.maximum.length", Model.GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.ItemAddress_Town)]); diff --git a/SaxoniteCoreWebOnline/Views/Account/Profile-SportExperiences.cshtml b/SaxoniteCoreWebOnline/Views/Account/Profile-SportExperiences.cshtml index 2c4556f..6f15902 100644 --- a/SaxoniteCoreWebOnline/Views/Account/Profile-SportExperiences.cshtml +++ b/SaxoniteCoreWebOnline/Views/Account/Profile-SportExperiences.cshtml @@ -75,7 +75,7 @@ @* Action buttons *@
-
+
diff --git a/SaxoniteCoreWebOnline/Views/Common/OrganisationControls-Address.cshtml b/SaxoniteCoreWebOnline/Views/Common/OrganisationControls-Address.cshtml index b9fd5d9..6284943 100644 --- a/SaxoniteCoreWebOnline/Views/Common/OrganisationControls-Address.cshtml +++ b/SaxoniteCoreWebOnline/Views/Common/OrganisationControls-Address.cshtml @@ -1,8 +1,7 @@ @* Organisation controls - Address *@ @model SaxModel_Online @inject SaxLocaliser Localiser - -@if (!Model.RegisterView("Views/Common/OrganisationControls-Address")) return; +@* NB Organisation address controls may be present more than once on a page, eg. Profile Organisation. *@ @* Organisation address - Line 1 *@
@@ -52,7 +51,7 @@
- +
@@ -86,7 +85,7 @@
- +
diff --git a/SaxoniteCoreWebOnline/Views/Common/OrganisationControls-Contact.cshtml b/SaxoniteCoreWebOnline/Views/Common/OrganisationControls-Contact.cshtml index 56994f4..15e3835 100644 --- a/SaxoniteCoreWebOnline/Views/Common/OrganisationControls-Contact.cshtml +++ b/SaxoniteCoreWebOnline/Views/Common/OrganisationControls-Contact.cshtml @@ -1,8 +1,8 @@ @* Organisation controls - Contact *@ @model SaxModel_Online @inject SaxLocaliser Localiser +@* NB Organisation contact controls may be present more than once on a page, eg. Profile Organisation. *@ -@if (!Model.RegisterView("Views/Common/OrganisationControls-Contact")) return;