diff --git a/SaxoniteCoreWebAdmin/Admin/Models/Model_Organisation.cs b/SaxoniteCoreWebAdmin/Admin/Models/Model_Organisation.cs index 6e34229..d78ceae 100644 --- a/SaxoniteCoreWebAdmin/Admin/Models/Model_Organisation.cs +++ b/SaxoniteCoreWebAdmin/Admin/Models/Model_Organisation.cs @@ -202,7 +202,7 @@ namespace Saxonite.Net.Core.Web.Admin.Models { String methodValue = ContactMethod[idx]; String value = ContactValue[idx]; - if (methodValue == null & value == null) continue; + if (methodValue == null && value == null) continue; Sax.ContactMethod method = EnumUtil.ParseEnum(methodValue, Sax.ContactMethod.Unknown); if (method > 0 && !value.IsEmpty() && SaxContactMethodHelper.IsValidContactMethodValue(method, value)) ContactData.SetContactMethodValue(method, value); diff --git a/SaxoniteCoreWebAdmin/appsettings.Machine.Sarand601.json b/SaxoniteCoreWebAdmin/appsettings.Machine.Sarand601.json index db0cc17..8985fc5 100644 --- a/SaxoniteCoreWebAdmin/appsettings.Machine.Sarand601.json +++ b/SaxoniteCoreWebAdmin/appsettings.Machine.Sarand601.json @@ -13,6 +13,11 @@ "Location": "MsSql:.\\SQLExpress2012.Saxonite_Core_Demo", "User": "sax-demo-user", "Password": "sax-demo-202105" + }, + "Support": { + "Location": "MsSql:.\\SQLExpress2012.Saxonite_Support_Demo", + "User": "sax-demo-user", + "Password": "sax-demo-202105" } }, "Security": { diff --git a/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Sports.cs b/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Sports.cs index cc48714..7b4bb91 100644 --- a/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Sports.cs +++ b/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Sports.cs @@ -15,6 +15,8 @@ using Sarand.Net.Standard.Base.Utils; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Dbas; using Saxonite.Net.Standard.Base.App; +using static Saxonite.Net.Standard.Base.App.Sax.Config; +using static Saxonite.Net.Standard.Base.Bus.SaxArticle; namespace Saxonite.Net.Core.Web.Online.Controllers { @@ -37,10 +39,21 @@ namespace Saxonite.Net.Core.Web.Online.Controllers private class ProfileSportResponseItemData : ProfileSportResponseListData { public String SportAbout { get; set; } + public List Contacts { get; set; } public String SportParticipatingCode { get; set; } public String SportPreparingCode { get; set; } public String SportOfficiatingCode { get; set; } } + public class SportContactData + { + public String ContactType { get; set; } + public String ContactTypeDesc { get; set; } + public String Title { get; set; } + public String FirstName { get; set; } + public String LastName { get; set; } + public String EmailAddress { get; set; } + public String Phone { get; set; } + } private void PopulateProfileSportResponseListData(Model_Account model, SaxUserSport userSport, SaxSport sport, ProfileSportResponseListData data) { data.Id = model.EncryptId(userSport.Id); @@ -55,6 +68,24 @@ namespace Saxonite.Net.Core.Web.Online.Controllers { PopulateProfileSportResponseListData(model, userSport, sport, data); data.SportAbout = userSport.About; + // Sport Contacts. + SaxSportContactsData sportContacts = new SaxSportContactsData(userSport.ContactsData); + foreach (Sax.SportContactType contactType in sportContacts.ContactTypes) + { + if (data.Contacts == null) data.Contacts = new List(); + SportContactData sportContact = + new SportContactData() + { + ContactType = SportContactTypeCodes.GetCodeForType(contactType), + ContactTypeDesc = Localiser.GetSportContactTypeCaption(contactType), + Title = sportContacts.GetContactTitle(contactType), + FirstName = sportContacts.GetContactFirstName(contactType), + LastName = sportContacts.GetContactLastName(contactType), + EmailAddress = sportContacts.GetContactEmailAddress(contactType), + Phone = sportContacts.GetContactPhone(contactType), + }; + data.Contacts.Add(sportContact); + } data.SportParticipatingCode = SportParticipatingCodes.GetCodeForType(userSport.Participating); data.SportPreparingCode = SportPreparingCodes.GetCodeForType(userSport.Preparing); data.SportOfficiatingCode = SportOfficiatingCodes.GetCodeForType(userSport.Officiating); @@ -352,6 +383,8 @@ namespace Saxonite.Net.Core.Web.Online.Controllers // Populate item properties. if (model.ProfileSportAbout != null) userSport.About = model.ProfileSportAbout; + if (model.Contacts.ContactsData != null) + userSport.ContactsData = model.Contacts.ContactsData.ToXml(); if (model.ProfileSportParticipatingCode != null) userSport.Participating = model.ProfileSportParticipating; if (model.ProfileSportPreparingCode != null) diff --git a/SaxoniteCoreWebOnline/Online/Models/ModelData_Organisation.cs b/SaxoniteCoreWebOnline/Online/Models/ModelData_Organisation.cs index d9a7017..bfa3da2 100644 --- a/SaxoniteCoreWebOnline/Online/Models/ModelData_Organisation.cs +++ b/SaxoniteCoreWebOnline/Online/Models/ModelData_Organisation.cs @@ -117,7 +117,7 @@ namespace Saxonite.Net.Core.Web.Online.Models { String methodValue = ContactMethod[idx]; String value = ContactValue[idx]; - if (methodValue == null & value == null) continue; + if (methodValue == null && value == null) continue; Sax.ContactMethod method = EnumUtil.ParseEnum(methodValue, Sax.ContactMethod.Unknown); if (method > 0 && !value.IsEmpty() && SaxContactMethodHelper.IsValidContactMethodValue(method, value)) ContactData.SetContactMethodValue(method, value); diff --git a/SaxoniteCoreWebOnline/Online/Models/Model_Account.cs b/SaxoniteCoreWebOnline/Online/Models/Model_Account.cs index 7e78cc4..31b891b 100644 --- a/SaxoniteCoreWebOnline/Online/Models/Model_Account.cs +++ b/SaxoniteCoreWebOnline/Online/Models/Model_Account.cs @@ -1,4 +1,5 @@ using Microsoft.AspNetCore.Http; +using Sarand.Net.Standard.Base.App; using Sarand.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Utils; @@ -8,10 +9,13 @@ using Saxonite.Net.Core.Web.Base.Controllers; using Saxonite.Net.Core.Web.Base.Models; using Saxonite.Net.Standard.Base.App; using Saxonite.Net.Standard.Base.Bus; +using Saxonite.Net.Standard.Base.Helpers; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using static Saxonite.Net.Standard.Base.App.Sax; +using static Saxonite.Net.Standard.Base.Bus.SaxArticle; namespace Saxonite.Net.Core.Web.Online.Models { @@ -87,11 +91,13 @@ namespace Saxonite.Net.Core.Web.Online.Models public String Count { get; set; } public String[] ContactType { get; set; } public String[] UserAccountId { get; set; } - public String[] ContactName { get; set; } - public String[] ContactPhone { get; set; } - public String[] ContactEmail { get; set; } + public String[] Title { get; set; } + public String[] FirstName { get; set; } + public String[] LastName { get; set; } + public String[] EmailAddress { get; set; } + public String[] Phone { get; set; } /// Sport Contacts to be populated during validation. - public SaxSportContactsData SportContactsData { get; set; } + public SaxSportContactsData ContactsData { get; set; } } public SportsContactsData Contacts {get; } = new SportsContactsData(); @@ -197,6 +203,8 @@ namespace Saxonite.Net.Core.Web.Online.Models // Validate Sport data. public bool ValidateProfileSportData(SaxController_Base.AjaxResponse_Data responseData) { + String fn = GetType().Name + ".ValidateProfileSportData"; + // Sport. if (ProfileSportId != null) { @@ -216,6 +224,40 @@ namespace Saxonite.Net.Core.Web.Online.Models } } + // Sport Contacts. + if (Contacts != null) + { + Contacts.ContactsData = new SaxSportContactsData(""); + Contacts.ContactType= Contacts.ContactType ?? new String[0]; + Contacts.Title= Contacts.Title ?? new String[0]; + Contacts.FirstName = Contacts.FirstName ?? new String[0]; + Contacts.LastName = Contacts.LastName ?? new String[0]; + Contacts.EmailAddress = Contacts.EmailAddress ?? new String[0]; + for (int idx = 0; idx < Contacts.ContactType.Length; idx++) + { + String contactTypeValue = Contacts.ContactType[idx]; + String title = idx < Contacts.Title.Length ? Contacts.Title[idx] : null; + String firstName = idx < Contacts.FirstName.Length ? Contacts.FirstName[idx] : null; + String lastName = idx < Contacts.LastName.Length ? Contacts.LastName[idx] : null; + String emailAddress = idx < Contacts.EmailAddress.Length ? Contacts.EmailAddress[idx] : null; + String phone = idx < Contacts.Phone.Length ? Contacts.Phone[idx] : null; + if (StringUtil.IsBlank(contactTypeValue) && StringUtil.IsBlank(lastName)) continue; + Sax.SportContactType contactType= (Sax.SportContactType)SportContactTypeCodes.GetTypeForCode(contactTypeValue); + if (contactType > 0) + { + Contacts.ContactsData.SetContactName(contactType, title, firstName, lastName); + Contacts.ContactsData.SetContactEmailAddress(contactType, emailAddress); + Contacts.ContactsData.SetContactPhone(contactType, phone); + } + else SaLogger.Warn(fn + " Invalid Sport Contact data. Type: " + contactTypeValue + ". Last name: " + lastName); + } + if (Contacts.ContactsData.ContactTypes.Count != Contacts.Count.ToInt()) + { + SaLogger.Warn(fn + " Inconsistent Contact Methods received. Expected: " + Contacts.Count + ". Received: " + Contacts.ContactsData.ContactTypes.Count); + responseData.SetMessage("caption.contact.method", "System error"); + } + } + return !responseData.HasControlErrors(); } diff --git a/SaxoniteCoreWebOnline/Views/Common/SportControls-Contacts.cshtml b/SaxoniteCoreWebOnline/Views/Common/SportControls-Contacts.cshtml index ab121f2..3a90745 100644 --- a/SaxoniteCoreWebOnline/Views/Common/SportControls-Contacts.cshtml +++ b/SaxoniteCoreWebOnline/Views/Common/SportControls-Contacts.cshtml @@ -31,7 +31,7 @@ @* Sport Contacts *@
- +
@@ -56,13 +56,15 @@ - - + +
- - - + + + + +
@(Localiser[
@(Localiser[
diff --git a/SaxoniteCoreWebOnline/appsettings.Machine.Sarand601.json b/SaxoniteCoreWebOnline/appsettings.Machine.Sarand601.json index 34b4207..6c5a369 100644 --- a/SaxoniteCoreWebOnline/appsettings.Machine.Sarand601.json +++ b/SaxoniteCoreWebOnline/appsettings.Machine.Sarand601.json @@ -8,6 +8,11 @@ "Location": "MsSql:.\\SQLExpress2012.Saxonite_Core_Demo", "User": "sax-demo-user", "Password": "sax-demo-202105" + }, + "Support": { + "Location": "MsSql:.\\SQLExpress2012.Saxonite_Support_Demo", + "User": "sax-demo-user", + "Password": "sax-demo-202105" } }, "Security": { diff --git a/SaxoniteCoreWebOnline/wwwroot/favicon.ico b/SaxoniteCoreWebOnline/wwwroot/favicon.ico index a3a7999..9b17c60 100644 Binary files a/SaxoniteCoreWebOnline/wwwroot/favicon.ico and b/SaxoniteCoreWebOnline/wwwroot/favicon.ico differ diff --git a/SaxoniteCoreWebOnline/wwwroot/js/sax-pro-org.js b/SaxoniteCoreWebOnline/wwwroot/js/sax-pro-org.js index 3ad136c..1f58575 100644 --- a/SaxoniteCoreWebOnline/wwwroot/js/sax-pro-org.js +++ b/SaxoniteCoreWebOnline/wwwroot/js/sax-pro-org.js @@ -174,8 +174,7 @@ //-------------------------------------------------------------- po.getConMthCfg = function (usedMths, mth, val) { - let cfg = { fnCallback: po.applyConMth, methods: po.data.contactMethods, methodsUsed: usedMths, method: mth, value: val }; - return cfg; + return { fnCallback: po.applyConMth, methods: po.data.contactMethods, methodsUsed: usedMths, method: mth, value: val }; } po.getUsedMths = function () { diff --git a/SaxoniteCoreWebOnline/wwwroot/js/sax-pro-spt.js b/SaxoniteCoreWebOnline/wwwroot/js/sax-pro-spt.js index 5395318..caab6b0 100644 --- a/SaxoniteCoreWebOnline/wwwroot/js/sax-pro-spt.js +++ b/SaxoniteCoreWebOnline/wwwroot/js/sax-pro-spt.js @@ -5,7 +5,7 @@ { //-------------------------------------------------------------- "use strict"; - let ps = sax.mdl.profileSports = { ajax: {}, data: {}, $pnl: {}, $dlg: {}, $frm: {} }; + let ps = sax.mdl.profileSports = { ajax: {}, data: {}, $pnl: {}, $tmpl: {}, $dlg: {}, $frm: {} }; let $pnl = ps.$pnl, $dlg = ps.$dlg, $frm = ps.$frm; //-------------------------------------------------------------- sax.refreshProfileSportsInfo = function (delay) @@ -78,6 +78,7 @@ let dlg = $dlg.spt; $('.UserSportId,.ProfileSportExists,#ifProfileSportId,input.sax-input,textarea.sax-textarea,select.sax-select', dlg).val(''); $('.SelectSport', dlg).show(); + $pnl.sptConTbl.empty(); sax.clearControlErrors(dlg); } ps.updateProfileSport = function (item) @@ -99,6 +100,13 @@ $('#ifProfileSportId', frm).val(item.sportId); $('#ifProfileSport', frm).val(item.sportName); $('#ifProfileSportAbout', frm).val(item.sportAbout); + let contacts = item.contacts || []; + for (let idx = 0; idx < contacts.length; idx++) + { + let contact = contacts[idx]; + $pnl.sptConTbl.append(ps.populateSportContact(ps.$tmpl.sptCon.clone(), contact)); + } + ps.sortSptCons(); $('#cbProfileSportParticipating', frm).val(item.sportParticipatingCode); $('#cbProfileSportPreparing', frm).val(item.sportPreparingCode); $('#cbProfileSportOfficiating', frm).val(item.sportOfficiatingCode); @@ -121,34 +129,60 @@ //-------------------------------------------------------------- ps.getSportContactCfg = function (contact) { - let cfg = { fnCallback: ps.applySportContact, contactTypes: ps.data.contactTypes, titles: ps.data.titles, typesUsed: ps.getUsedContactTypes(), contact: contact}; - return cfg; + return { fnCallback: ps.applySportContact, contactTypes: ps.data.contactTypes, titles: ps.data.titles, contactTypesUsed: !contact ? ps.getUsedContactTypes() : [], contact: contact }; } ps.getUsedContactTypes = function () { - return $('input[name="Contacts.ContactTypes"]', $frm.org).map(function () { return $(this).val(); }).get(); + return $('.SportContacts input[name="Contacts.ContactType"]', $frm.org).map(function () { return $(this).val(); }).get(); } ps.addSportContact = function () { - //sax.debug('addSportContact'); - ps.showSportContact(ps.getSportContactCfg()); + ps.editSportContact(); } - ps.editSportContact= function (contact) + ps.editSportContact = function (contact) { - //sax.debug('editSportContact'); - ps.showSportContact(ps.getSportContactCfg(contact)); + sax.mdl.sportContact.showSportContact(ps.getSportContactCfg(contact)); } - ps.showSportContact=function(cfg) + ps.clearSportContact = function (contact) { - sax.mdl.sportContact.showSportContact(cfg); + $('#' + po.getSptConId(contact), $pnl.sptConTbl).remove(); + po.sortSptCons(); } - ps.getConId = function (contact) + ps.getSptConId = function (contact) { - return 'SptCon_' + contact.type; + return 'SptCon_' + contact.contactType; } ps.applySportContact = function (contact) { //sax.debug('applySportContact', contact); + let $sptCon = $('#' + ps.getSptConId(contact)); + if (!$sptCon.length) $pnl.sptConTbl.append($sptCon = ps.$tmpl.sptCon.clone()); + ps.populateSportContact($sptCon, contact); + ps.sortSptCons(); + } + ps.populateSportContact = function ($sptCon, contact) + { + $sptCon.prop('id', ps.getSptConId(contact)); + $('.sax-label', $sptCon).text(contact.contactTypeDesc); + $('.sax-value.Name', $sptCon).text((contact.title + " " + contact.firstName + " " + contact.lastName).trim()); + $('.sax-value.Details', $sptCon).text(contact.emailAddress); + $('input[name="Contacts.ContactType"]', $sptCon).val(contact.contactType); + $('input[name="Contacts.Title"]', $sptCon).val(contact.title); + $('input[name="Contacts.FirstName"]', $sptCon).val(contact.firstName); + $('input[name="Contacts.LastName"]', $sptCon).val(contact.lastName); + $('input[name="Contacts.EmailAddress"]', $sptCon).val(contact.emailAddress); + $('input[name="Contacts.Phone"]', $sptCon).val(contact.phone); + $sptCon.on('click', '.sax-action.sax-edit', function () { ps.editSportContact(contact); }); + $sptCon.on('click', '.sax-action.sax-remove', function () { ps.clearSportContact(contact); }); + return $sptCon; + } + ps.sortSptCons = function () + { + let $rows = $pnl.sptConTbl.find('tr').detach().sort(function (a, b) + { + return $('.sax-label', a).text().localeCompare($('.sax-label', b).text()); + }).appendTo($pnl.sptConTbl); + $('input[name="Contacts.Count"]', $pnl.sptCons).val($rows.length); } //-------------------------------------------------------------- ps.storeProfileSport = function () @@ -179,6 +213,9 @@ $frm.spt.on('dblclick', '.ProfileSport.sax-input', ps.selectUserSport); $frm.spt.on('click', '.SelectSport.sax-button', ps.selectUserSport); $frm.spt.on('click', '.SportContacts .sax-action.sax-add', ps.addSportContact); + $pnl.sptCons = $('.SportContacts', $dlg.spt); + $pnl.sptConTbl = $('.Contacts table.sax-data', $pnl.sptCons); + ps.$tmpl.sptCon = $('.sax-panel-item-template .Contact', $pnl.sptCons).detach(); }); //-------------------------------------------------------------- }(window, window.document)); diff --git a/SaxoniteCoreWebOnline/wwwroot/js/sax-spt-cnt.js b/SaxoniteCoreWebOnline/wwwroot/js/sax-spt-cnt.js index e44b0a3..6dfcc36 100644 --- a/SaxoniteCoreWebOnline/wwwroot/js/sax-spt-cnt.js +++ b/SaxoniteCoreWebOnline/wwwroot/js/sax-spt-cnt.js @@ -22,17 +22,18 @@ { //sax.debug('showSportContact', cfg); sc.fn.cleanUp(); + cfg.contact = cfg.contact || {}; sc.data.cfg = cfg; sc.populateContactTypes(cfg); sc.populateTitles(cfg); - sc.fn.displaySportContact(cfg.contact || {}); + sc.fn.displaySportContact(cfg.contact); sax.clearControlErrors(sc.$dlg.sptCnt); sax.openDialog(sc.$dlg.sptCnt.dialog('option', { title: sc.data.cfg.caption || 'Sport Contact' }), sc.data.cfg.width || 640, sc.data.cfg.height || 320); } //-------------------------------------------------------------- sc.populateContactTypes = function (cfg) { - let contact = cfg.contact || {}; + let contact = cfg.contact; sc.$ctrl.contactType.empty(); if (!contact.contactType) sc.$ctrl.contactType.append($('