From d631ad02237fbdca632c8cc6b0945708dbb8dcf1 Mon Sep 17 00:00:00 2001 From: Andy Howard Date: Mon, 23 May 2022 21:16:36 +0100 Subject: [PATCH] v1.2.6.3 --- .../OrganisationController-Ajax.cs | 120 ++++++++------- .../Controllers/RegionController-Ajax.cs | 27 ++-- .../Admin/Controllers/SportController-Ajax.cs | 20 +-- .../Admin/Models/ModelData_Address.cs | 13 +- .../Admin/Models/Model_Organisation.cs | 6 +- .../Localisation/SaxAdminProperties.resx | 15 ++ .../Views/Common/Controls-ItemAddress.cshtml | 99 ++++++++++++ .../Views/Organisation/Index.cshtml | 145 +++++++++--------- .../Panel-OrganisationAddressDialog.cshtml | 36 +++++ .../Views/Region/Panel-RegionDialog.cshtml | 2 +- SaxoniteCoreWebAdmin/wwwroot/css/sax-data.css | 10 ++ .../wwwroot/img/action/image-16.png | Bin 0 -> 542 bytes .../wwwroot/img/action/image-24.png | Bin 0 -> 794 bytes .../wwwroot/img/action/image-32.png | Bin 0 -> 1001 bytes .../wwwroot/img/action/location-16.png | Bin 0 -> 811 bytes .../wwwroot/img/action/location-24.png | Bin 0 -> 1116 bytes .../wwwroot/img/action/location-32.png | Bin 0 -> 1511 bytes SaxoniteCoreWebAdmin/wwwroot/js/sax-main.js | 11 +- SaxoniteCoreWebAdmin/wwwroot/js/sax-org.js | 105 +++++++++---- SaxoniteCoreWebAdmin/wwwroot/js/sax-rgn.js | 1 - .../Localisation/SaxOnlineProperties.resx | 2 +- .../AccountController-Ajax-Organisations.cs | 106 +++++++------ .../Online/Models/ModelData_Address.cs | 13 +- .../Account/Profile-SportExperiences.cshtml | 2 +- .../OrganisationControls-Address.cshtml | 7 +- .../OrganisationControls-Contact.cshtml | 2 +- .../Common/OrganisationControls-Core.cshtml | 3 +- .../wwwroot/css/sax-data.css | 15 ++ .../wwwroot/img/action/image-16.png | Bin 0 -> 542 bytes .../wwwroot/img/action/image-24.png | Bin 0 -> 794 bytes .../wwwroot/img/action/image-32.png | Bin 0 -> 1001 bytes .../wwwroot/img/action/location-16.png | Bin 0 -> 811 bytes .../wwwroot/img/action/location-24.png | Bin 0 -> 1116 bytes .../wwwroot/img/action/location-32.png | Bin 0 -> 1511 bytes SaxoniteCoreWebOnline/wwwroot/js/sax-main.js | 9 +- .../wwwroot/js/sax-usr-org.js | 2 +- .../wwwroot/js/sax-usr-spt-exp.js | 1 + .../wwwroot/js/sax-usr-spt.js | 12 +- SaxoniteStandardBase/Base/App/Sax-Version.cs | 5 +- .../Base/Mgr/SaxItemDataMgr-ItemAddress.cs | 9 +- .../Mgr/SaxItemDataMgr_Dbas-ItemAddress.cs | 2 + 41 files changed, 544 insertions(+), 256 deletions(-) create mode 100644 SaxoniteCoreWebAdmin/Views/Common/Controls-ItemAddress.cshtml create mode 100644 SaxoniteCoreWebAdmin/Views/Organisation/Panel-OrganisationAddressDialog.cshtml create mode 100644 SaxoniteCoreWebAdmin/wwwroot/img/action/image-16.png create mode 100644 SaxoniteCoreWebAdmin/wwwroot/img/action/image-24.png create mode 100644 SaxoniteCoreWebAdmin/wwwroot/img/action/image-32.png create mode 100644 SaxoniteCoreWebAdmin/wwwroot/img/action/location-16.png create mode 100644 SaxoniteCoreWebAdmin/wwwroot/img/action/location-24.png create mode 100644 SaxoniteCoreWebAdmin/wwwroot/img/action/location-32.png create mode 100644 SaxoniteCoreWebOnline/wwwroot/img/action/image-16.png create mode 100644 SaxoniteCoreWebOnline/wwwroot/img/action/image-24.png create mode 100644 SaxoniteCoreWebOnline/wwwroot/img/action/image-32.png create mode 100644 SaxoniteCoreWebOnline/wwwroot/img/action/location-16.png create mode 100644 SaxoniteCoreWebOnline/wwwroot/img/action/location-24.png create mode 100644 SaxoniteCoreWebOnline/wwwroot/img/action/location-32.png 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 0000000000000000000000000000000000000000..4c13bd6136e73da532c811631c62408258848be7 GIT binary patch literal 542 zcmV+(0^$9MP)WdKcYZXhxf6VzBb?;Z^wm z-#>{VBzLvc>acw z;peaa3?KjSqsn2^@b2Pq21X`k20>jjFrPgG10y3NgP^`80|N-70TeHMd-jmw#rf$B{ANN7{1!qC&reQa`2Ok{ zSnk)S_Y5x&Z)f=b|37vEe!hRh@OXb8gP@%t*ha9e4gw61c6Kv-fBBT*!NzumA57aA zo@`r)VhGrPKi|GEJlN97An3>g^gAP562umCjRe=zCC<+ gfa0V~jy~!F07dnS%MZMpH~;_u07*qoM6N<$f^HGxX#fBK literal 0 HcmV?d00001 diff --git a/SaxoniteCoreWebAdmin/wwwroot/img/action/image-24.png b/SaxoniteCoreWebAdmin/wwwroot/img/action/image-24.png new file mode 100644 index 0000000000000000000000000000000000000000..1bbf42ef7f3a6fecac3570e3f0bae8b62e4bd26d GIT binary patch literal 794 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 literal 0 HcmV?d00001 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;