diff --git a/SaxoniteCoreWeb/Base/App/SaxLocaliser.cs b/SaxoniteCoreWeb/Base/App/SaxLocaliser.cs index b1d429d..3c6b2f5 100644 --- a/SaxoniteCoreWeb/Base/App/SaxLocaliser.cs +++ b/SaxoniteCoreWeb/Base/App/SaxLocaliser.cs @@ -248,7 +248,7 @@ namespace Saxonite.Net.Core.Web.Base.App //------------------------------------------------------------------- // Region. - public String GetRegionName(SaxRegion region) + public String GetRegionName(SaxRegion.Data region) { if (region == null) return ""; // ToDo Region name localisation. @@ -262,7 +262,7 @@ namespace Saxonite.Net.Core.Web.Base.App //------------------------------------------------------------------- // Sport. - public String GetSportName(SaxSport sport) + public String GetSportName(SaxSport.Data sport) { if (sport == null) return ""; // ToDo Sport name localisation. diff --git a/SaxoniteCoreWeb/Base/Consoles/SaxDataCacheConsole_Web.cs b/SaxoniteCoreWeb/Base/Consoles/SaxDataCacheConsole_Web.cs index fbda304..3a5fddf 100644 --- a/SaxoniteCoreWeb/Base/Consoles/SaxDataCacheConsole_Web.cs +++ b/SaxoniteCoreWeb/Base/Consoles/SaxDataCacheConsole_Web.cs @@ -68,20 +68,30 @@ namespace Saxonite.Net.Core.Web.Base.Consoles public List activeRegionDataList = null; } private readonly RegionsData regionsData = new RegionsData(); - public override List GetActiveRegions() + public override List GetAllRegions() { String fn = GetType().Name + ".ActiveRegions"; if (!RegionsSupported) throw new NotSupportedException(fn + " Regions not supported."); - List activeRegions = new List(); - List activeRegionDataList = new List(); + List activeRegions = new List(); if (regionsData.regionDataMap == null) ForceRefresh(); lock (regionsData) { if (regionsData.regionDataMap == null) throw new NotSupportedException(fn + " Regions not populated."); - activeRegionDataList.AddRange(regionsData.activeRegionDataList); + activeRegions.AddRange(regionsData.regionDataMap.Values); + } + return activeRegions; + } + public override List GetActiveRegions() + { + String fn = GetType().Name + ".ActiveRegions"; + if (!RegionsSupported) throw new NotSupportedException(fn + " Regions not supported."); + List activeRegions = new List(); + if (regionsData.regionDataMap == null) ForceRefresh(); + lock (regionsData) + { + if (regionsData.regionDataMap == null) throw new NotSupportedException(fn + " Regions not populated."); + activeRegions.AddRange(regionsData.activeRegionDataList); } - foreach (SaxRegion.Data regionData in activeRegionDataList) - activeRegions.Add(GetRegion(regionData)); return activeRegions; } protected void RefreshRegions() @@ -120,7 +130,7 @@ namespace Saxonite.Net.Core.Web.Base.Consoles regionsData.regionDataMap = newRegionDataMap; regionsData.activeRegionDataList = newActiveRegionDataList; } - SaLogger.Info(fn + " END. Regions found: " + regionsData.regionDataMap.Count + ". Elapsed: " + DateUtil.FormatNumberOfSeconds((DateTime.Now - startedAt).TotalSeconds), true); + SaLogger.Info(fn + " END. Regions found: " + regionsData.regionDataMap.Count + ". Elapsed: " + DateUtil.FormatNumberOfSeconds((DateTime.Now - startedAt).TotalSeconds)); } private static bool IsRegionActive(Dictionary regionDataMap, SaxRegion.Data regionData) { @@ -147,20 +157,30 @@ namespace Saxonite.Net.Core.Web.Base.Consoles public List activeSportDataList = null; } private readonly SportsData sportsData = new SportsData(); - public override List GetActiveSports() + public override List GetAllSports() { - String fn = GetType().Name + ".ActiveSports"; + String fn = GetType().Name + ".GetAllSports"; if (!SportsSupported) throw new NotSupportedException(fn + " Sports not supported."); - List activeSports = new List(); - List activeSportDataList = new List(); + List sports = new List(); if (sportsData.sportDataMap == null) ForceRefresh(); lock (sportsData) { if (sportsData.sportDataMap == null) throw new NotSupportedException(fn + " Sports not populated."); - activeSportDataList.AddRange(sportsData.activeSportDataList); + sports.AddRange(sportsData.sportDataMap.Values); + } + return sports; + } + public override List GetActiveSports() + { + String fn = GetType().Name + ".GetActiveSports"; + if (!SportsSupported) throw new NotSupportedException(fn + " Sports not supported."); + List activeSports = new List(); + if (sportsData.sportDataMap == null) ForceRefresh(); + lock (sportsData) + { + if (sportsData.sportDataMap == null) throw new NotSupportedException(fn + " Sports not populated."); + activeSports.AddRange(sportsData.activeSportDataList); } - foreach (SaxSport.Data sportData in activeSportDataList) - activeSports.Add(GetSport(sportData)); return activeSports; } protected void RefreshSports() @@ -199,7 +219,7 @@ namespace Saxonite.Net.Core.Web.Base.Consoles sportsData.sportDataMap = newSportDataMap; sportsData.activeSportDataList = newActiveSportDataList; } - SaLogger.Info(fn + " END. Sports found: " + sportsData.sportDataMap.Count + ". Elapsed: " + DateUtil.FormatNumberOfSeconds((DateTime.Now - startedAt).TotalSeconds), true); + SaLogger.Info(fn + " END. Sports found: " + sportsData.sportDataMap.Count + ". Elapsed: " + DateUtil.FormatNumberOfSeconds((DateTime.Now - startedAt).TotalSeconds)); } private static bool IsSportActive(Dictionary sportDataMap, SaxSport.Data sportData) { diff --git a/SaxoniteCoreWeb/Base/Controllers/SaxController_Base.cs b/SaxoniteCoreWeb/Base/Controllers/SaxController_Base.cs index 400c740..5bd4688 100644 --- a/SaxoniteCoreWeb/Base/Controllers/SaxController_Base.cs +++ b/SaxoniteCoreWeb/Base/Controllers/SaxController_Base.cs @@ -110,6 +110,7 @@ namespace Saxonite.Net.Core.Web.Base.Controllers public SaxItemDataMgr ItemDataMgr { get { return Internals.ItemDataMgr; } } // System codes. public List DataItemTypeCodes { get { return Internals.DataItemTypeCodes; } } + public List SportSpecialityLabelCodes { get { return Internals.SportSpecialityLabelCodes; } } public List SportParticipationCodes { get { return Internals.SportParticipationCodes; } } public List SportOfficiatingCodes { get { return Internals.SportOfficiatingCodes; } } public List RegionTypeCodes { get { return Internals.RegionTypeCodes; } } diff --git a/SaxoniteCoreWeb/Base/Models/SaxModel_Base.cs b/SaxoniteCoreWeb/Base/Models/SaxModel_Base.cs index 481faaf..a2b2981 100644 --- a/SaxoniteCoreWeb/Base/Models/SaxModel_Base.cs +++ b/SaxoniteCoreWeb/Base/Models/SaxModel_Base.cs @@ -71,6 +71,7 @@ namespace Saxonite.Net.Core.Web.Base.Models protected SaxItemDataMgr ItemDataMgr { get { return Internals.ItemDataMgr; } } // System codes. public List DataItemTypeCodes { get { return Internals.DataItemTypeCodes; } } + public List SportSpecialityLabelCodes { get { return Internals.SportSpecialityLabelCodes; } } public List SportParticipationCodes { get { return Internals.SportParticipationCodes; } } public List SportOfficiatingCodes { get { return Internals.SportOfficiatingCodes; } } public List RegionTypeCodes { get { return Internals.RegionTypeCodes; } } @@ -220,6 +221,18 @@ namespace Saxonite.Net.Core.Web.Base.Models get { return new SelectList(SaxSystem.GetCodesOfType(Sax.CodeType.YesNo), "Code", "Desc"); } } + /// List of Sport Participation options for dropdown. + public IEnumerable SportSpecialityLabelCodesForSelect + { + get + { + List codes = new List(); + codes.Add(new SelectListItem("Default", "")); + codes.AddRange(new SelectList(SportSpecialityLabelCodes, "Code", "Desc")); + return codes; + } + } + /// List of Sport Participation options for dropdown. public IEnumerable SportParticipationCodesForSelect { diff --git a/SaxoniteCoreWebAdmin/Admin/Controllers/SportController-Ajax.cs b/SaxoniteCoreWebAdmin/Admin/Controllers/SportController-Ajax.cs index 30e5ca2..63cdf52 100644 --- a/SaxoniteCoreWebAdmin/Admin/Controllers/SportController-Ajax.cs +++ b/SaxoniteCoreWebAdmin/Admin/Controllers/SportController-Ajax.cs @@ -19,12 +19,11 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers { //------------------------------------------------------------------- // Sport data. - private class SportData_List + private class SportData_List : AjaxResponse_Data.ItemData_Base { - public String Id { get; set; } public String Name { get; set; } - public String StatusCode { get; set; } - public String StatusDesc { get; set; } + public String SpecialityLabelCode { get; set; } + public String SpecialityLabelDesc { get; set; } } private class SportData_Full : SportData_List { @@ -33,6 +32,8 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers { data.Id = SysId.ToString(sport.Id); data.Name = sport.Name; + data.SpecialityLabelCode = SportSpecialityLabelCodes.GetCodeForType(sport.SpecialityLabel); + data.SpecialityLabelDesc = SportSpecialityLabelCodes.GetDescForType(sport.SpecialityLabel); data.StatusCode = sport.StatusCode; data.StatusDesc = sport.StatusDesc; } @@ -82,11 +83,12 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers // Item columns. ColumnDfn colId = ReferenceMgr.GetSportColumnDfn(SaxSport.Column.Id); ColumnDfn colName = ReferenceMgr.GetSportColumnDfn(SaxSport.Column.Name); + ColumnDfn colSpecialityLabel = ReferenceMgr.GetSportColumnDfn(SaxSport.Column.SpecialityLabel); ColumnDfn colStatus = ReferenceMgr.GetSportColumnDfn(SaxSport.Column.Status); List columns = new List() { colId, - colName, + colName, colSpecialityLabel, colStatus }; @@ -99,10 +101,13 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers while (resultSet != null && resultSet.HasRows && resultSet.NextRecord()) { NamedValue.Map values = resultSet.GetRecordValues(); + Sax.SportSpecialityLabel specialityLabel = (Sax.SportSpecialityLabel)values.GetLong(colSpecialityLabel.DataName); SportData_List sportData = new SportData_List() { Id = values.GetString(colId.DataName), Name = values.GetString(colName.DataName), + SpecialityLabelCode = SportSpecialityLabelCodes.GetCodeForType(specialityLabel), + SpecialityLabelDesc = SportSpecialityLabelCodes.GetDescForType(specialityLabel), StatusCode = values.GetString(colStatus.DataName), StatusDesc = SacsSystem.GetStatusDescForCode(values.GetString(colStatus.DataName)) }; @@ -199,6 +204,8 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers // Populate item properties. if (model.SportName != null) sport.Name = model.SportName; + if (model.SportSpecialityLabelCode != null) + sport.SpecialityLabel = model.SportSpecialityLabel; if (model.SportStatusCode != null) sport.Status = model.SportStatus; diff --git a/SaxoniteCoreWebAdmin/Admin/Models/Model_Sport.cs b/SaxoniteCoreWebAdmin/Admin/Models/Model_Sport.cs index 39c9a64..c7401d7 100644 --- a/SaxoniteCoreWebAdmin/Admin/Models/Model_Sport.cs +++ b/SaxoniteCoreWebAdmin/Admin/Models/Model_Sport.cs @@ -38,6 +38,8 @@ namespace Saxonite.Net.Core.Web.Admin.Models // Sport properties. public String SportId { get; set; } public String SportName { get; set; } + public String SportSpecialityLabelCode { get; set; } + public Sax.SportSpecialityLabel SportSpecialityLabel { get { return (Sax.SportSpecialityLabel)SportSpecialityLabelCodes.GetTypeForCode(SportSpecialityLabelCode); } } public String SportStatusCode { get; set; } public SaStatus SportStatus { get { return SacsSystem.GetStatusForCode(SportStatusCode); } } @@ -69,6 +71,16 @@ namespace Saxonite.Net.Core.Web.Admin.Models } } + // Sport Speciality Label. + if (SportSpecialityLabelCode != null) + { + if (!StringUtil.IsEmpty(SportSpecialityLabelCode)) + { + if (SportSpecialityLabel <= 0) + responseData.SetControlError(nameof(SportSpecialityLabel), Localiser["msg.validation.invalid.value"]); + } + } + // Sport status. if (SportStatusCode != null) { diff --git a/SaxoniteCoreWebAdmin/Localisation/SaxAdminProperties.resx b/SaxoniteCoreWebAdmin/Localisation/SaxAdminProperties.resx index c938e0c..c7645c3 100644 --- a/SaxoniteCoreWebAdmin/Localisation/SaxAdminProperties.resx +++ b/SaxoniteCoreWebAdmin/Localisation/SaxAdminProperties.resx @@ -192,6 +192,9 @@ Database table + + Default + Delete @@ -318,6 +321,12 @@ none selected + + Speciality + + + Speciality label + Sport diff --git a/SaxoniteCoreWebAdmin/Views/Sport/Index.cshtml b/SaxoniteCoreWebAdmin/Views/Sport/Index.cshtml index aedfb04..08d076b 100644 --- a/SaxoniteCoreWebAdmin/Views/Sport/Index.cshtml +++ b/SaxoniteCoreWebAdmin/Views/Sport/Index.cshtml @@ -5,19 +5,36 @@ ViewData["Title"] = "Sports"; } -
+
+ + + @* Filter Form *@ @using (@Html.BeginForm(FormMethod.Post, new { @id = "frmSportFilter", @class = "sax-form", @onSubmit = "return false;" })) { + + @* Filter Panel *@
+ @* Header - Page caption, paging controls, actions. *@
@Localiser["sport.caption.sports"]
-
+
-
@(Localiser[
-
@(Localiser[
+
+ @* Burger menu *@ + +
@@ -26,27 +43,47 @@
@Html.TextBoxFor(model => model.Filter.Sport, new { @id = "ifFilterSport", @class = "FilterSport", @maxlength = "32" })
+ + @* Filter element templates *@ +
+ @* Burger dropdown item template - ul is ignored *@ +
    +
  • XXX
  • +
+
+
} + @* Results Panel *@
+ + @* Element templates *@
+ + @* Sport item template *@
-
Sport name
+
Sport name
-
@(Localiser[
+ @* Burger menu *@ +
-
-
-
+
@Localiser["label.speciality"]: 
+
+
@@ -54,10 +91,16 @@
+ + @* Burger dropdown item template - ul is ignored *@ +
    +
  • XXX
  • +
+
+ +
- - diff --git a/SaxoniteCoreWebAdmin/Views/Sport/Panel-SportDialog.cshtml b/SaxoniteCoreWebAdmin/Views/Sport/Panel-SportDialog.cshtml index c381218..5a50b66 100644 --- a/SaxoniteCoreWebAdmin/Views/Sport/Panel-SportDialog.cshtml +++ b/SaxoniteCoreWebAdmin/Views/Sport/Panel-SportDialog.cshtml @@ -14,32 +14,63 @@ }
+
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmSport", @class = "sax-form", @onSubmit = "return false;" })) { @Html.HiddenFor(model => model.SportId, new { @class = "SportId" }) - @* Sport name *@ + @* Sport Name *@
-
- +
+
+
+ +
+
+
+
+ @Html.TextBoxFor(model => model.SportName, new { @id = "ifSportName", @class = "SportName sax-input", @maxlength = @Model.GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.Sport_Name) }) +
+
+
-
- @Html.TextBoxFor(model => model.SportName, new { @id = "ifSportName", @class = "SportName sax-input", @maxlength = @Model.GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.Sport_Name) }) -
-
- @* Sport status *@ + @* Sport Speciality Label *@ +
+
+
+
+ +
+
+
+
+ @Html.DropDownListFor(model => model.SportSpecialityLabelCode, Model.SportSpecialityLabelCodesForSelect, new { @id = "cbSportSpecialityLabel", @class = "SportSpecialityLabel sax-select" }) +
+
+
+
+
+ + @* Sport Status *@
-
- +
+
+
+ +
+
+
+
+ +
+
+
-
- -
-
} +
diff --git a/SaxoniteCoreWebAdmin/Views/User/Index.cshtml b/SaxoniteCoreWebAdmin/Views/User/Index.cshtml index 5daa135..ba0c6bb 100644 --- a/SaxoniteCoreWebAdmin/Views/User/Index.cshtml +++ b/SaxoniteCoreWebAdmin/Views/User/Index.cshtml @@ -69,7 +69,7 @@
@* User email *@ -
+
@* Burger menu *@ @@ -102,7 +102,7 @@
+ +
- - diff --git a/SaxoniteCoreWebAdmin/wwwroot/js/sax-sport.js b/SaxoniteCoreWebAdmin/wwwroot/js/sax-sport.js index 46e382f..68c4a7b 100644 --- a/SaxoniteCoreWebAdmin/wwwroot/js/sax-sport.js +++ b/SaxoniteCoreWebAdmin/wwwroot/js/sax-sport.js @@ -5,16 +5,17 @@ (function (win, doc, undef) { "use strict"; + let $pnl = sax.$pnl, $frm = sax.$frm, $dlg = sax.$dlg; sax.itemIdPrefix = 'Itm_'; //-------------------------------------------------------------- sax.refreshResults = function (delay) { - var $results = $('.sax-panel-results'); if (!sax.awaitingRefreshResponse) { - var $items = $('.sax-panel-item-list', $results).fadeOut(200).empty(); - var $msgs = $('.sax-panel-messages', $results).hide().empty().append($('
' + sax.msg.dataQuerying + '
')).fadeIn(200); + $('.sax-burger', $pnl.filter).hide(); + var $items = $('.sax-panel-item-list', $pnl.results).fadeOut(200).empty(); + var $msgs = $('.sax-panel-messages', $pnl.results).hide().empty().append($('
' + sax.msg.dataQuerying + '
')).fadeIn(200); } sax.ajax.refreshResults = sax.ajax.refreshResults || { url: sax.url.base + 'Sport/Ajax/GetList', formId: 'frmSportFilter', callbackFn: sax.doRefreshResults }; sax.doAjaxRequest(sax.ajax.refreshResults, delay || 50); @@ -25,27 +26,26 @@ //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(); - var $tmpl = $('.sax-panel-item-template .sax-panel-item.Sport', $results); + var $msgs = $('.sax-panel-messages', $pnl.results).hide().empty(); + var $items = $('.sax-panel-item-list', $pnl.results).hide().empty(); sax.refreshPaging(response, '#frmSportFilter', sax.refreshResults); if (!response.success) return; // Reference data - Statuses. if (response.defaultStatusCode) sax.data.defaultStatusCode = response.defaultStatusCode; if (response.statuses) sax.populateSelectCodeDesc('#cbSportStatus', response.statuses); + // Menu. + var $bgr = $('.sax-burger', $pnl.filter).hide(); + var $mnu = $('ul.sax-dropdown-menu', $bgr).empty(); + $mnu.append(sax.getFilterMenuOption(sax.lbl.refresh, function () { sax.refreshResults(); })); + $mnu.append(sax.getFilterMenuOption(sax.lbl.create, function () { sax.createItem(); })); + $bgr.toggle(!!$('.sax-dropdown-item', $mnu).length); // Items. var items = response.sports; if (!items.length) return $msgs.append($('
' + sax.msg.dataNoneFound + '
')).fadeIn(500); for (let itemIdx = 0; itemIdx < items.length; itemIdx++) - { - let item = items[itemIdx]; - let $item = $tmpl.clone(); - sax.populateItem($item, item); - $items.append($item); - } + $items.append(sax.populateItem(sax.getItemTemplate(), items[itemIdx])); $items.fadeIn(50); } sax.populateItem = function ($item, item) @@ -53,51 +53,80 @@ if (!item) return; $item.prop('id', sax.itemIdPrefix + item.id); $('.SportName', $item).text(item.name); + $('.SportSpecialityLabel', $item).text(item.specialityLabelDesc); + $('.SportSpeciality', $item).toggle(!!item.specialityLabelCode); $('.StatusDesc', $item).text(item.statusDesc); - $('.sax-caption .sax-action, .sax-actions .sax-action.sax-item-update', $item).off('click').on('click', function () { sax.updateItem(item.id) }) - $item.off('dblclick').on('dblclick', function () { sax.updateItem(item.id) }) - $('.sax-panel-results .sax-panel-messages').hide().empty(); + $('.sax-caption .sax-action').toggleClass('sax-action', !item.deleted); + let $mnu = $('ul.sax-dropdown-menu', $item); + if (!item.deleted) + { + $mnu.append(sax.getItemMenuOption(sax.lbl.edit, function () { sax.updateItem(item) })); + $('.sax-header .sax-action.sax-item-update', $item).off('click').on('click', function () { sax.updateItem(item) }); + $item.off('dblclick').on('dblclick', function () { sax.updateItem(item) }); + } + $('.sax-burger', $item).toggle(!!$('.sax-dropdown-item', $mnu).length); + $('.sax-panel-messages', $pnl.results).hide().empty(); + return $item; + } + + //-------------------------------------------------------------- + sax.getFilterDropdownTemplate = function () + { + return $('.sax-panel-item-template .sax-dropdown-menu.SportFilter li.sax-dropdown-item', $pnl.filter).clone(); + } + sax.getItemTemplate = function () + { + return $('.sax-panel-item-template .sax-panel-item.Sport', $pnl.results).clone(); + } + sax.getItemDropdownTemplate = function () + { + return $('.sax-panel-item-template .sax-dropdown-menu.Sport li.sax-dropdown-item', $pnl.results).clone(); + } + sax.getFilterMenuOption = function (lbl, fn) + { + return sax.getMenuOption(sax.getFilterDropdownTemplate(), lbl, fn); + } + sax.getItemMenuOption = function (lbl, fn) + { + return sax.getMenuOption(sax.getItemDropdownTemplate(), lbl, fn); + } + sax.getMenuOption = function ($opt, lbl, fn) + { + return $opt.find('div.sax-label').text(lbl).end().on('click', fn); } //-------------------------------------------------------------- sax.createItem = function () { - let $frm = sax.$frm.sport; - $('.SportId,input[type="text"],textarea,select', $frm).val(''); - $('.SportStatus', $frm).val(sax.data.defaultStatusCode); + let frm = $frm.sport; + $('.SportId,input[type="text"],textarea,select', frm).val(''); + $('.SportStatus', frm).val(sax.data.defaultStatusCode); sax.clearControlErrors(); - sax.$dlg.sport.dialog('option', 'title', sax.dlg.title.createSport); - sax.openDialog(sax.$dlg.sport, 600, 600); - } - sax.doCreateItem = function () - { - sax.storeItem(); + $dlg.sport.dialog('option', 'title', sax.dlg.title.createSport); + sax.openDialog($dlg.sport, 600, 600); } //-------------------------------------------------------------- - sax.updateItem = function (id) + sax.updateItem = function (item) { - $('.SportId', sax.$frm.sportId).val(id); + $('.SportId', $frm.sportId).val(item.id); sax.ajax.updateItem = sax.ajax.updateItem || { url: sax.url.base + 'Sport/Ajax/GetItem', formId: 'frmSportId', callbackFn: sax.onUpdateItem }; sax.doAjaxRequest(sax.ajax.updateItem, 50); } sax.onUpdateItem = function (response) { //sax.debug('onUpdateItem', response); - let $frm = sax.$frm.sport; - $('.SportId,input[type="text"],textarea,select', $frm).val(''); + let frm = $frm.sport; + $('.SportId,input[type="text"],textarea,select', frm).val(''); if (!response.success) return; let item = response.sport; - $('.SportId', $frm).val(item.id); - $('.SportName', $frm).val(item.name); - $('.SportStatus', $frm).val(item.statusCode); + $('.SportId', frm).val(item.id); + $('.SportName', frm).val(item.name); + $('.SportSpecialityLabel', frm).val(item.specialityLabelCode); + $('.SportStatus', frm).val(item.statusCode); sax.clearControlErrors(); - sax.$dlg.sport.dialog('option', 'title', sax.dlg.title.updateSport); - sax.openDialog(sax.$dlg.sport, 600, 600); - } - sax.doUpdateItem = function () - { - sax.storeItem(); + $dlg.sport.dialog('option', 'title', sax.dlg.title.updateSport); + sax.openDialog($dlg.sport, 600, 600); } //-------------------------------------------------------------- @@ -111,15 +140,14 @@ //sax.debug('onStoreItem', response); sax.refreshControlValues(response.controlValues); if (!response.success) return; - sax.$dlg.sport.dialog('close'); + $dlg.sport.dialog('close'); var item = response.sport; var $item = $('#' + sax.itemIdPrefix + item.id); if (!$item.length) { - var $results = $('.sax-panel-results'); - $item = $('.sax-panel-item-template .sax-panel-item.Sport', $results).clone(); - $('.sax-panel-item-list', $results).prepend($item).show(); + $item = sax.getItemTemplate(); + $('.sax-panel-item-list', $pnl.results).prepend($item).show(); } sax.populateItem($item, item) } @@ -127,19 +155,21 @@ //-------------------------------------------------------------- $(function () { - $('.sax-action.sax-item-create').on('click', function () { sax.createItem(); }); - $('.sax-action.sax-results-refresh').on('click', function () { sax.refreshResults(); }); - $('.sax-input').on('input', function () { sax.clearControlError(this); }); + $pnl.sports = $('.sax-panel.Sports'); + $pnl.filter = $('.sax-panel-filter', $pnl.sports); + $pnl.results = $('.sax-panel-results', $pnl.sports); sax.$frm.filter = $('#frmSportFilter'); $('.FilterSport', sax.$frm.filter).on('input', function () { sax.refreshResults(250); }); sax.$frm.sportId = $('#frmSportId'); sax.$frm.sport = $('#frmSport'); + $('.sax-input', sax.$frm.sport).on('input', function () { sax.clearControlError(this); }); + $('.sax-select', sax.$frm.sport).on('change', function () { sax.clearControlError(this); }); var opt = sax.dlgOpts(); - opt.buttons[sax.dlg.btn.ok] = function () { sax.doCreateItem(); }; + opt.buttons[sax.dlg.btn.ok] = function () { sax.storeItem(); }; opt.buttons[sax.dlg.btn.cancel] = function () { $(this).dialog('close'); }; - sax.$dlg.sport = $('#dlgSport').dialog(opt); + $dlg.sport = $('#dlgSport').dialog(opt); setTimeout(sax.refreshResults, 250); }); diff --git a/SaxoniteCoreWebAdmin/wwwroot/js/sax-user.js b/SaxoniteCoreWebAdmin/wwwroot/js/sax-user.js index c57d236..1e6539e 100644 --- a/SaxoniteCoreWebAdmin/wwwroot/js/sax-user.js +++ b/SaxoniteCoreWebAdmin/wwwroot/js/sax-user.js @@ -222,8 +222,9 @@ //-------------------------------------------------------------- $(function () { - $pnl.filter = $('.sax-panel-filter'); - $pnl.results = $('.sax-panel-results'); + $pnl.users = $('.sax-panel.Users'); + $pnl.filter = $('.sax-panel-filter', $pnl.users); + $pnl.results = $('.sax-panel-results', $pnl.users); $frm.filter = $('#frmUserFilter'); $('.FilterUser', $frm.filter).on('input', function () { sax.refreshResults(250); }); diff --git a/SaxoniteCoreWebOnline/Localisation/SaxOnlineProperties.resx b/SaxoniteCoreWebOnline/Localisation/SaxOnlineProperties.resx index b53558f..b31dcad 100644 --- a/SaxoniteCoreWebOnline/Localisation/SaxOnlineProperties.resx +++ b/SaxoniteCoreWebOnline/Localisation/SaxOnlineProperties.resx @@ -213,6 +213,9 @@ Sign-up now with a few details and we'll let you know when you can login and get going. + + About + My Account @@ -225,6 +228,9 @@ Address + + Alternatively + Article @@ -276,6 +282,12 @@ Discipline + + Download + + + Drag your image here. + Edit @@ -483,6 +495,9 @@ Update + + Upload + Very Good diff --git a/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Contact.cs b/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Contact.cs index fb3809c..31322c7 100644 --- a/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Contact.cs +++ b/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Contact.cs @@ -35,11 +35,12 @@ namespace Saxonite.Net.Core.Web.Online.Controllers public String Title { get; set; } public String FirstName { get; set; } public String LastName { get; set; } + public String About { get; set; } public byte Gender { get; set; } - public String GenderCaption{ get; set; } + public String GenderCaption { get; set; } public byte DobDay { get; set; } - public byte DobMonth{ get; set; } - public short DobYear{ get; set; } + public byte DobMonth { get; set; } + public short DobYear { get; set; } // Regions. public int RegionIdCountry { get; set; } public String RegionCaptionCountry { get; set; } @@ -54,22 +55,19 @@ namespace Saxonite.Net.Core.Web.Online.Controllers data.Title = userAccount.Title; data.FirstName = userAccount.FirstName; data.LastName = userAccount.LastName; + data.About = userAccount.About; data.Gender = (byte)userAccount.Gender; data.GenderCaption = Localiser.GetGenderCaption(userAccount.Gender); - data.DobDay= (byte)userAccount.DateOfBirthDay; + data.DobDay = (byte)userAccount.DateOfBirthDay; data.DobMonth = (byte)userAccount.DateOfBirthMonth; data.DobYear = (short)userAccount.DateOfBirthYear; // Regions. data.RegionIdCountry = SysId.ToInt(userAccount.RegionIdCountry); data.RegionIdProvince = SysId.ToInt(userAccount.RegionIdProvince); - using (SaxRegion regionCountry = Internals.GetRegion(userAccount.RegionIdCountry)) - using (SaxRegion regionProvince = Internals.GetRegion(userAccount.RegionIdProvince)) - { - data.RegionCaptionCountry = Localiser.GetRegionName(regionCountry); - data.RegionCaptionProvince = Localiser.GetRegionName(regionProvince); - List locations = new List() { data.RegionCaptionProvince, data.RegionCaptionCountry }; - data.LocationCaption = locations.Concat(", ", "", "", true, true); - } + data.RegionCaptionCountry = Localiser.GetRegionName(Internals.GetRegion(userAccount.RegionIdCountry)); + data.RegionCaptionProvince = Localiser.GetRegionName(Internals.GetRegion(userAccount.RegionIdProvince)); + List locations = new List() { data.RegionCaptionProvince, data.RegionCaptionCountry }; + data.LocationCaption = locations.Concat(", ", "", "", true, true); } //------------------------------------------------------------------- @@ -112,7 +110,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers responseData.Genders.Add(gender.Type.ToString(), Localiser.GetGenderCaption((Sax.Gender)gender.Type)); // Reference data - Months. - for (int month= 1; month <= 12; month++) + for (int month = 1; month <= 12; month++) responseData.Months.Add(month.ToString(), DateUtil.Format(new DateTime(DateTime.Today.Year, month, 1), "MMMM", SessionCulture)); // Retrieve user details. @@ -280,6 +278,8 @@ namespace Saxonite.Net.Core.Web.Online.Controllers userAccount.FirstName = model.AccountFirstName; if (model.AccountLastName != null) userAccount.LastName = model.AccountLastName; + if (model.AccountAbout != null) + userAccount.About = model.AccountAbout; if (model.AccountGender != null) userAccount.Gender = model.GetAccountGender(); // Date of birth. @@ -299,7 +299,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers else { userAccount.DateOfBirthMonth = 0; - userAccount.DateOfBirthDay= 0; + userAccount.DateOfBirthDay = 0; } // Regions. if (model.AccountRegionIdCountry != null) diff --git a/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Sports.cs b/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Sports.cs index d108bae..dcc97c7 100644 --- a/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Sports.cs +++ b/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Sports.cs @@ -25,27 +25,25 @@ namespace Saxonite.Net.Core.Web.Online.Controllers { //------------------------------------------------------------------- // Data definitions. - private class ProfileSportResponseData_List + private class ProfileSportResponseData_List : AjaxResponse_Data.ItemData_Base { - public long Id { get; set; } - public long SportId { get; set; } + public String SportId { get; set; } public String SportName { get; set; } + public String SportSpecialityLabel { get; set; } public String SportParticipation { get; set; } public String SportOfficiating { get; set; } - public String StatusCode { get; set; } - public String StatusDesc { get; set; } } private class ProfileSportResponseData_Item : ProfileSportResponseData_List { public String SportParticipationCode { get; set; } public String SportOfficiatingCode { get; set; } - public String CreatedOnFmt { get; set; } } private void PopulateProfileSportResponseData(Model_Account model, SaxUserSport userSport, SaxSport sport, ProfileSportResponseData_Item data) { - data.Id = SysId.ToLong(userSport.Id); - data.SportId = SysId.ToLong(userSport.SportId); + data.Id = SysId.ToString(userSport.Id); + data.SportId = SysId.ToString(userSport.SportId); data.SportName = sport.Name; + data.SportSpecialityLabel = model.GetSportSpecialityLabel(userSport.SportId); data.SportParticipationCode = SportParticipationCodes.GetCodeForType(userSport.Participation); data.SportParticipation = Localiser.GetSportParticipationTypeCaption(userSport.Participation); data.SportOfficiatingCode = SportOfficiatingCodes.GetCodeForType(userSport.Officiating); @@ -110,11 +108,13 @@ namespace Saxonite.Net.Core.Web.Online.Controllers while (resultSet != null && resultSet.HasRows && resultSet.NextRecord()) { NamedValue.Map values = resultSet.GetRecordValues(); + SysId sportId = new SysId(values.GetLong(colSportId.DataName)); ProfileSportResponseData_List userSportData = new ProfileSportResponseData_List() { - Id = values.GetLong(colId.DataName), - SportId = values.GetLong(colSportId.DataName), + Id = values.GetLong(colId.DataName).ToString(), + SportId = sportId.ToString(), SportName = values.GetString(colSportName.DataName), + SportSpecialityLabel = model.GetSportSpecialityLabel(sportId), SportParticipation = Localiser.GetSportParticipationTypeCaption((Sax.SportParticipation)values.GetLong(colParticipation.DataName)), SportOfficiating = Localiser.GetSportOfficiatingTypeCaption((Sax.SportOfficiating)values.GetLong(colOfficiating.DataName)), StatusCode = values.GetString(colStatus.DataName), diff --git a/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-UserSportExperience.cs b/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-UserSportExperience.cs index 9e3971e..5e28cf5 100644 --- a/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-UserSportExperience.cs +++ b/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-UserSportExperience.cs @@ -54,7 +54,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers public String RegionIdNation { get; set; } public String RegionIdProvince { get; set; } } - private void PopulateSportExperienceResponseData(Model_UserSportExperience model, SportExperienceResponseData_Detail data, SaxUserSportExperience userSportExperience) + private void PopulateSportExperienceResponseData(Model_UserSportExperience model, SportExperienceResponseData_Detail data, SaxUserSport userSport, SaxUserSportExperience userSportExperience) { data.Id = model.EncryptId(userSportExperience.Id); data.UserSportId = model.EncryptId(userSportExperience.UserSportId); @@ -72,14 +72,10 @@ namespace Saxonite.Net.Core.Web.Online.Controllers // Regions. data.RegionIdNation = model.EncryptId(userSportExperience.RegionIdNation); data.RegionIdProvince = model.EncryptId(userSportExperience.RegionIdProvince); - using (SaxRegion regionNation = Internals.GetRegion(userSportExperience.RegionIdNation)) - using (SaxRegion regionProvince = Internals.GetRegion(userSportExperience.RegionIdProvince)) - { - data.RegionCaptionNation = Localiser.GetRegionName(regionNation); - data.RegionCaptionProvince = Localiser.GetRegionName(regionProvince); - List locations = new List() { data.RegionCaptionProvince, data.RegionCaptionNation }; - data.RegionRepresentation = locations.Concat(", ", "", "", true, true); - } + data.RegionCaptionNation = Localiser.GetRegionName(Internals.GetRegion(userSportExperience.RegionIdNation)); + data.RegionCaptionProvince = Localiser.GetRegionName(Internals.GetRegion(userSportExperience.RegionIdProvince)); + List locations = new List() { data.RegionCaptionProvince, data.RegionCaptionNation }; + data.RegionRepresentation = locations.Concat(", ", "", "", true, true); } //------------------------------------------------------------------- @@ -94,6 +90,17 @@ namespace Saxonite.Net.Core.Web.Online.Controllers public AjaxResponse_UserSportExperienceList(SaxModel_Online model) : base(model) { } // Contact details. public List Experiences { get; } = new List(); + // Sport details. + public class SportData + { + public class SpecialityData + { + public bool? NotRelevant { get; set; } = null; + public String Label { get; set; } + } + public SpecialityData Speciality { get; } = new SpecialityData(); + } + public SportData Sport { get; } = new SportData(); } // Ajax request. [HttpPost] @@ -119,6 +126,10 @@ namespace Saxonite.Net.Core.Web.Online.Controllers if (userSport == null || !userSport.UserAccountId.Equals(SessionData.User.UserAccountId)) return Json(responseData.SetGoHome(messageTitle, Localiser["msg.something.gone.wrong"])); + // Sport details. + if (model.SportSpecialityNotRelevant(userSport.SportId)) responseData.Sport.Speciality.NotRelevant = true; + responseData.Sport.Speciality.Label = model.GetSportSpecialityLabel(userSport.SportId); + // Columns. ColumnDfn colId = AccountMgr.GetUserSportExperienceColumnDfn(SaxUserSportExperience.Column.Id); ColumnDfn colUserSportId = AccountMgr.GetUserSportExperienceColumnDfn(SaxUserSportExperience.Column.UserSportId); @@ -214,7 +225,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers // Populate data to response. responseData.Experience = new SportExperienceResponseData_Detail(); - PopulateSportExperienceResponseData(model, responseData.Experience, userSportExperience); + PopulateSportExperienceResponseData(model, responseData.Experience, userSport, userSportExperience); } // Complete response. @@ -337,7 +348,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers // Populate data to response. responseData.Experience = new SportExperienceResponseData_Detail(); - PopulateSportExperienceResponseData(model, responseData.Experience, userSportExperience); + PopulateSportExperienceResponseData(model, responseData.Experience, userSport, userSportExperience); } // Complete response. diff --git a/SaxoniteCoreWebOnline/Online/Controllers/ActivityController-Ajax.cs b/SaxoniteCoreWebOnline/Online/Controllers/ActivityController-Ajax.cs index e3d3412..42281a9 100644 --- a/SaxoniteCoreWebOnline/Online/Controllers/ActivityController-Ajax.cs +++ b/SaxoniteCoreWebOnline/Online/Controllers/ActivityController-Ajax.cs @@ -50,8 +50,9 @@ namespace Saxonite.Net.Core.Web.Online.Controllers /// Article activity info. private class ActivityResponseData_Article { - public ActivityResponseData_Article(SaxController_Online controller, SaxModel_Online model, SaxArticle article) + public ActivityResponseData_Article(SaxController_Online controller, SaxModel_Online model, SaxArticle article, SaxOrganisation organisation) { + Organisation = organisation?.Name ?? null; Author = model.GetUserAccountDisplayName(article.UserAccountIdAuthor); Headline = article.Headline; Summary = article.Summary; @@ -218,44 +219,53 @@ namespace Saxonite.Net.Core.Web.Online.Controllers RefreshModel(model); SaxSessionData_Online sessionData = SessionData_Online; - // Identify activity. - Sax.DataItemType itemType = (Sax.DataItemType)StringUtil.ToShort(model.ActivityType); - SysId itemId = model.ExtractSysId(model.ActivityIdx); - if (itemType <= 0 || !SysId.IsValid(itemId)) + // Record disposable items as they are created so all can be disposed when needed. + using (DisposableCollection disposableItems = new DisposableCollection()) { - SaLogger.Warn(fn + " Activity type/Id inncorrectly specified." + GetLogSuffix()); - return Json(responseData); - } - // Retrieve activity details. - if (itemType == Sax.DataItemType.Article) - { - // Article. - SaxArticle article = ActivityMgr.GetArticleById(itemId); - if (article == null) + // Identify activity. + Sax.DataItemType itemType = (Sax.DataItemType)StringUtil.ToShort(model.ActivityType); + SysId itemId = model.ExtractSysId(model.ActivityIdx); + if (itemType <= 0 || !SysId.IsValid(itemId)) { - SaLogger.Warn(fn + " Article not found for Activity Id: " + itemId.ToString() + "." + GetLogSuffix()); + SaLogger.Warn(fn + " Activity type/Id inncorrectly specified." + GetLogSuffix()); return Json(responseData); } - responseData.Article = new ActivityResponseData_Article(this, model, article); - } - else if (itemType == Sax.DataItemType.OrganisationOpportunity) - { - // Organisation Opportunity. - SaxOrganisationOpportunity opportunity = ActivityMgr.GetOrganisationOpportunityById(itemId); - if (opportunity == null) + + // Retrieve activity details. + if (itemType == Sax.DataItemType.Article) { - SaLogger.Warn(fn + " Opportunity not found for Activity Id: " + itemId.ToString() + "." + GetLogSuffix()); + // Article. + SaxArticle article = ActivityMgr.GetArticleById(itemId); + disposableItems.Add(article); + if (article == null) + { + SaLogger.Warn(fn + " Article not found for Activity Id: " + itemId.ToString() + "." + GetLogSuffix()); + return Json(responseData); + } + SaxOrganisation organisation = AccountMgr.GetOrganisationById(article.OrganisationId); + disposableItems.Add(organisation); + responseData.Article = new ActivityResponseData_Article(this, model, article, organisation); + } + else if (itemType == Sax.DataItemType.OrganisationOpportunity) + { + // Organisation Opportunity. + SaxOrganisationOpportunity opportunity = ActivityMgr.GetOrganisationOpportunityById(itemId); + disposableItems.Add(opportunity); + if (opportunity == null) + { + SaLogger.Warn(fn + " Opportunity not found for Activity Id: " + itemId.ToString() + "." + GetLogSuffix()); + return Json(responseData); + } + responseData.Opportunity = new ActivityResponseData_Opportunity(model, opportunity); + } + + // Record activty viewing. + if (!ActivityConsole.RecordUserActivityViewed(SessionData.User.UserAccountId, new ItemId((short)itemType, itemId), DbUpdateInfo)) + { + SaLogger.Warn(fn + " Failed to record Activity Viewing: " + ActivityConsole.ErrorStateMessage + "." + GetLogSuffix()); return Json(responseData); } - responseData.Opportunity = new ActivityResponseData_Opportunity(model, opportunity); - } - - // Record activty viewing. - if (!ActivityConsole.RecordUserActivityViewed(SessionData.User.UserAccountId, new ItemId((short)itemType, itemId), DbUpdateInfo)) - { - SaLogger.Warn(fn + " Failed to record Activity Viewing: " + ActivityConsole.ErrorStateMessage + "." + GetLogSuffix()); - return Json(responseData); } // Complete response. diff --git a/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Opportunities.cs b/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Opportunities.cs index bb9b1f6..5104e0c 100644 --- a/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Opportunities.cs +++ b/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Opportunities.cs @@ -78,6 +78,17 @@ namespace Saxonite.Net.Core.Web.Online.Controllers public bool CanManage { get; set; } } public UserData User { get; } = new UserData(); + // Organisation. + public class OrganisationData + { + public String Id { get; set; } + public String Name { get; set; } + public String SportId { get; set; } + public String SportName { get; set; } + public String RegionId { get; set; } + public String RegionName { get; set; } + } + public OrganisationData Organisation { get; } = new OrganisationData(); // Reference data. public List OpportunityTypes { get; } = new List(); } @@ -95,11 +106,16 @@ namespace Saxonite.Net.Core.Web.Online.Controllers if (!ValidReferer) return Forbid(); if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData); RefreshModel(model); + SysId userAccountId = SessionData.User.UserAccountId; - // Organisation. - SysId organisationId = model.ExtractSysId(model.Filter.OrganisationId); - using (SaxOrganisation organisation = AccountMgr.GetOrganisationById(organisationId)) + // Record disposable items as they are created so all can be disposed when needed. + using (DisposableCollection disposableItems = new DisposableCollection()) { + + // Organisation. + SysId organisationId = model.ExtractSysId(model.Filter.OrganisationId); + SaxOrganisation organisation = AccountMgr.GetOrganisationById(organisationId); + disposableItems.Add(organisation); if (organisation == null || !organisation.IsStatusActive) { SaLogger.Warn(fn + " " + (organisation == null ? "Invalid" : "Inactive") + " organisation for Opportunity list. OrganisationId: '" + model.Filter.OrganisationId + "'"); @@ -117,73 +133,85 @@ namespace Saxonite.Net.Core.Web.Online.Controllers // User organisation. SaxUserOrganisation.Params prmUserOrganisation = new SaxUserOrganisation.Params(); - prmUserOrganisation.UserAccountIdsIncluded.Add(SessionData.User.UserAccountId); + prmUserOrganisation.UserAccountIdsIncluded.Add(userAccountId); prmUserOrganisation.OrganisationIdsIncluded.Add(organisationId); prmUserOrganisation.UserAccountStatusCat = SaxUserAccount.StatusCat.ActiveOnly; prmUserOrganisation.StatusCat = SaxUserOrganisation.StatusCat.ActiveOnly; - using (SaxUserOrganisation userOrganisation = AccountMgr.GetUserOrganisation(prmUserOrganisation)) + SaxUserOrganisation userOrganisation = AccountMgr.GetUserOrganisation(prmUserOrganisation); + disposableItems.Add(userOrganisation); + if (userOrganisation == null) { + SaLogger.Warn(fn + " Invalid/inactive user organisation for Opportunity list. UserAccountId: " + SysId.ToString(userAccountId) + ". OrganisationId: " + model.Filter.OrganisationId + "."); + return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.system"])); + } - // User details. - responseData.User.CanManage = userOrganisation?.HasOrganisationRole(Sax.OrganisationRole.OpportunityAdmin) ?? false; + // Organisation. + responseData.Organisation.Id = SysId.ToString(organisation.Id); + responseData.Organisation.Name = organisation.Name; + responseData.Organisation.SportId = SysId.ToString(organisation.SportIdPrimary); + responseData.Organisation.SportName = model.GetSportCaption(organisation.SportIdPrimary); + responseData.Organisation.RegionId = SysId.ToString(organisation.RegionIdPrimary); + responseData.Organisation.RegionName = model.GetRegionCaption(organisation.RegionIdPrimary); - // Item filter. - SaxOrganisationOpportunity.Params prmOpportunity = new SaxOrganisationOpportunity.Params(); - prmOpportunity.UserAccountIdsIncluded.Add(SessionData.User.UserAccountId); - prmOpportunity.OrganisationIdsIncluded.Add(organisationId); - prmOpportunity.OpportunityFilter = model.Filter.Opportunity; - prmOpportunity.StatusCat = SaxOrganisationOpportunity.StatusCat.NotDeleted; - model.Paging.ItemTotal = (ulong)ActivityMgr.GetOrganisationOpportunityCount(prmOpportunity); - model.PopulatePagingTo(prmOpportunity.ResultsPaging); + // User details. + responseData.User.CanManage = userOrganisation?.HasOrganisationRole(Sax.OrganisationRole.OpportunityAdmin) ?? false; - // Item columns. - ColumnDfn colId = ActivityMgr.GetOrganisationOpportunityColumnDfn(SaxOrganisationOpportunity.Column.Id); - ColumnDfn colOpportunityTypeCode = ActivityMgr.GetOrganisationOpportunityColumnDfn(SaxOrganisationOpportunity.Column.OpportunityTypeCode); - ColumnDfn colPosition = ActivityMgr.GetOrganisationOpportunityColumnDfn(SaxOrganisationOpportunity.Column.Position); - ColumnDfn colOutline = ActivityMgr.GetOrganisationOpportunityColumnDfn(SaxOrganisationOpportunity.Column.Outline); - ColumnDfn colRegionId = ActivityMgr.GetOrganisationOpportunityColumnDfn(SaxOrganisationOpportunity.Column.RegionIdPrimary); - ColumnDfn colRegionName = ActivityMgr.GetOrganisationOpportunityColumnDfn(SaxOrganisationOpportunity.Column.Region_Name); - ColumnDfn colSportId = ActivityMgr.GetOrganisationOpportunityColumnDfn(SaxOrganisationOpportunity.Column.SportIdPrimary); - ColumnDfn colSportName = ActivityMgr.GetOrganisationOpportunityColumnDfn(SaxOrganisationOpportunity.Column.Sport_Name); - ColumnDfn colPublishedOn = ActivityMgr.GetOrganisationOpportunityColumnDfn(SaxOrganisationOpportunity.Column.PublishedAt_Date); - ColumnDfn colExpiresOn = ActivityMgr.GetOrganisationOpportunityColumnDfn(SaxOrganisationOpportunity.Column.ExpiresAt_Date); - ColumnDfn colStatus = ActivityMgr.GetOrganisationOpportunityColumnDfn(SaxOrganisationOpportunity.Column.Status); - ColumnDfn colCreatedOn = ActivityMgr.GetOrganisationOpportunityColumnDfn(SaxOrganisationOpportunity.Column.CreateOn_Date); - List columns = new List() + // Item filter. + SaxOrganisationOpportunity.Params prmOpportunity = new SaxOrganisationOpportunity.Params(); + prmOpportunity.UserAccountIdsIncluded.Add(userAccountId); + prmOpportunity.OrganisationIdsIncluded.Add(organisationId); + prmOpportunity.OpportunityFilter = model.Filter.Opportunity; + prmOpportunity.StatusCat = SaxOrganisationOpportunity.StatusCat.NotDeleted; + model.Paging.ItemTotal = (ulong)ActivityMgr.GetOrganisationOpportunityCount(prmOpportunity); + model.PopulatePagingTo(prmOpportunity.ResultsPaging); + + // Item columns. + ColumnDfn colId = ActivityMgr.GetOrganisationOpportunityColumnDfn(SaxOrganisationOpportunity.Column.Id); + ColumnDfn colOpportunityTypeCode = ActivityMgr.GetOrganisationOpportunityColumnDfn(SaxOrganisationOpportunity.Column.OpportunityTypeCode); + ColumnDfn colPosition = ActivityMgr.GetOrganisationOpportunityColumnDfn(SaxOrganisationOpportunity.Column.Position); + ColumnDfn colOutline = ActivityMgr.GetOrganisationOpportunityColumnDfn(SaxOrganisationOpportunity.Column.Outline); + ColumnDfn colRegionId = ActivityMgr.GetOrganisationOpportunityColumnDfn(SaxOrganisationOpportunity.Column.RegionIdPrimary); + ColumnDfn colRegionName = ActivityMgr.GetOrganisationOpportunityColumnDfn(SaxOrganisationOpportunity.Column.Region_Name); + ColumnDfn colSportId = ActivityMgr.GetOrganisationOpportunityColumnDfn(SaxOrganisationOpportunity.Column.SportIdPrimary); + ColumnDfn colSportName = ActivityMgr.GetOrganisationOpportunityColumnDfn(SaxOrganisationOpportunity.Column.Sport_Name); + ColumnDfn colPublishedOn = ActivityMgr.GetOrganisationOpportunityColumnDfn(SaxOrganisationOpportunity.Column.PublishedAt_Date); + ColumnDfn colExpiresOn = ActivityMgr.GetOrganisationOpportunityColumnDfn(SaxOrganisationOpportunity.Column.ExpiresAt_Date); + ColumnDfn colStatus = ActivityMgr.GetOrganisationOpportunityColumnDfn(SaxOrganisationOpportunity.Column.Status); + ColumnDfn colCreatedOn = ActivityMgr.GetOrganisationOpportunityColumnDfn(SaxOrganisationOpportunity.Column.CreateOn_Date); + List columns = new List() + { + colId, colOpportunityTypeCode, colPosition, colOutline, + colRegionId, colRegionName, colSportId, colSportName, + colPublishedOn, colExpiresOn, + colStatus, colCreatedOn + }; + + // Sort columns. + colCreatedOn.SortAscending = false; + prmOpportunity.SortColumns.Add(colCreatedOn); + + // Query items. + using (DbResultSet resultSet = ActivityMgr.ExecuteOrganisationOpportunityQuery(columns, prmOpportunity)) + { + while (resultSet != null && resultSet.HasRows && resultSet.NextRecord()) { - colId, colOpportunityTypeCode, colPosition, colOutline, - colRegionId, colRegionName, colSportId, colSportName, - colPublishedOn, colExpiresOn, - colStatus, colCreatedOn - }; - - // Sort columns. - colCreatedOn.SortAscending = false; - prmOpportunity.SortColumns.Add(colCreatedOn); - - // Query items. - using (DbResultSet resultSet = ActivityMgr.ExecuteOrganisationOpportunityQuery(columns, prmOpportunity)) - { - while (resultSet != null && resultSet.HasRows && resultSet.NextRecord()) + NamedValue.Map values = resultSet.GetRecordValues(); + OpportunityData_List opportunityData = new OpportunityData_List() { - NamedValue.Map values = resultSet.GetRecordValues(); - OpportunityData_List opportunityData = new OpportunityData_List() - { - Id = values.GetLong(colId.DataName).ToString(), - TypeCode = values.GetString(colOpportunityTypeCode.DataName), - TypeDesc = Localiser.GetOpportunityTypeCaption((Sax.OpportunityType)OpportunityTypeCodes.GetTypeForCode(values.GetString(colOpportunityTypeCode.DataName))), - Position = values.GetString(colPosition.DataName), - Outline = values.GetString(colOutline.DataName), - RegionCaption = model.GetRegionCaption(values.GetString(colRegionId.DataName).ToSysId()), - SportCaption = model.GetSportCaption(values.GetString(colSportId.DataName).ToSysId()), - CreatedOnFmt = Localiser.FormatDate(values.GetDateTime(colCreatedOn.DataName)), - PublishedOnFmt = Localiser.FormatDate(values.GetDateTime(colPublishedOn.DataName)), - ExpiresOnFmt = Localiser.FormatDate(values.GetDateTime(colExpiresOn.DataName)), - StatusCode = values.GetString(colStatus.DataName), - StatusDesc = SacsSystem.GetStatusDescForCode(values.GetString(colStatus.DataName)) - }; - responseData.Opportunities.Add(opportunityData); - } + Id = values.GetLong(colId.DataName).ToString(), + TypeCode = values.GetString(colOpportunityTypeCode.DataName), + TypeDesc = Localiser.GetOpportunityTypeCaption((Sax.OpportunityType)OpportunityTypeCodes.GetTypeForCode(values.GetString(colOpportunityTypeCode.DataName))), + Position = values.GetString(colPosition.DataName), + Outline = values.GetString(colOutline.DataName), + RegionCaption = model.GetRegionCaption(values.GetString(colRegionId.DataName).ToSysId()), + SportCaption = model.GetSportCaption(values.GetString(colSportId.DataName).ToSysId()), + CreatedOnFmt = Localiser.FormatDate(values.GetDateTime(colCreatedOn.DataName)), + PublishedOnFmt = Localiser.FormatDate(values.GetDateTime(colPublishedOn.DataName)), + ExpiresOnFmt = Localiser.FormatDate(values.GetDateTime(colExpiresOn.DataName)), + StatusCode = values.GetString(colStatus.DataName), + StatusDesc = SacsSystem.GetStatusDescForCode(values.GetString(colStatus.DataName)) + }; + responseData.Opportunities.Add(opportunityData); } } } diff --git a/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Request.cs b/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Request.cs index 509e6cf..f2b4050 100644 --- a/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Request.cs +++ b/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Request.cs @@ -49,14 +49,14 @@ namespace Saxonite.Net.Core.Web.Online.Controllers // Check Regions. SysId regionIdCountry = model.ExtractSysId(model.OrganisationRegionIdCountry); - SaxRegion regionCountry = Internals.GetRegion(regionIdCountry); + SaxRegion.Data regionCountry = Internals.GetRegion(regionIdCountry); if (SysId.IsValid(regionIdCountry) && regionCountry == null) { SaLogger.Warn(fn + " Country region not found. Id: " + model.OrganisationRegionIdCountry + ". " + GetLogSuffix()); return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"])); } SysId regionIdAddressProvince= model.ExtractSysId(model.OrganisationAddressRegionIdProvince); - SaxRegion regionProvince = Internals.GetRegion(regionIdAddressProvince); + SaxRegion.Data regionProvince = Internals.GetRegion(regionIdAddressProvince); if (SysId.IsValid(regionIdAddressProvince) && regionProvince == null) { SaLogger.Warn(fn + " Province region not found. Id: " + model.OrganisationAddressRegionIdProvince + ". " + GetLogSuffix()); diff --git a/SaxoniteCoreWebOnline/Online/Models/Model_Account.cs b/SaxoniteCoreWebOnline/Online/Models/Model_Account.cs index 2ea9cac..1df728e 100644 --- a/SaxoniteCoreWebOnline/Online/Models/Model_Account.cs +++ b/SaxoniteCoreWebOnline/Online/Models/Model_Account.cs @@ -37,6 +37,7 @@ namespace Saxonite.Net.Core.Web.Online.Models public String AccountTitle { get; set; } public String AccountFirstName { get; set; } public String AccountLastName { get; set; } + public String AccountAbout { get; set; } public String AccountGender { get; set; } public Sax.Gender GetAccountGender() { @@ -106,6 +107,17 @@ namespace Saxonite.Net.Core.Web.Online.Models responseData.SetControlError(nameof(AccountLastName), Localiser["msg.validation.maximum.length", GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.UserAccount_LastName)]); } + // About. + if (AccountAbout != null) + { + responseData.SetControlValue(nameof(AccountAbout), AccountAbout); + if (!StringUtil.IsEmpty(AccountAbout)) + { + if (StringUtil.GetLength(AccountAbout) > GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.UserAccount_About)) + responseData.SetControlError(nameof(AccountAbout), Localiser["msg.validation.maximum.length", GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.UserAccount_About)]); + } + } + //--------------------------------------------------------------- // Date of birth. if (AccountDobYear != null) @@ -135,7 +147,7 @@ namespace Saxonite.Net.Core.Web.Online.Models SysId regionIdCountry = ExtractSysId(AccountRegionIdCountry); if (AccountRegionIdCountry != null && SysId.IsValid(regionIdCountry)) { - SaxRegion regionCountry = Internals.GetRegion(regionIdCountry); + SaxRegion.Data regionCountry = Internals.GetRegion(regionIdCountry); if (regionCountry == null) responseData.SetControlError(nameof(AccountRegionIdCountry), Localiser["msg.validation.invalid.value"]); } @@ -144,7 +156,7 @@ namespace Saxonite.Net.Core.Web.Online.Models if (AccountRegionIdProvince != null) { SysId regionIdProvince = ExtractSysId(AccountRegionIdProvince); - SaxRegion regionProvince = Internals.GetRegion(regionIdProvince); + SaxRegion.Data regionProvince = Internals.GetRegion(regionIdProvince); if (regionProvince == null) responseData.SetControlError(nameof(AccountRegionIdProvince), Localiser["msg.validation.invalid.value"]); } diff --git a/SaxoniteCoreWebOnline/Online/Models/SaxModel_Online.cs b/SaxoniteCoreWebOnline/Online/Models/SaxModel_Online.cs index d8f611e..8d4a4da 100644 --- a/SaxoniteCoreWebOnline/Online/Models/SaxModel_Online.cs +++ b/SaxoniteCoreWebOnline/Online/Models/SaxModel_Online.cs @@ -46,7 +46,7 @@ namespace Saxonite.Net.Core.Web.Online.Models { get { - if (userCanManageOrganisationMembers == null && ValidUserSession) + if (userCanManageOrganisationMembers == null && ValidUserSession) { SaxUserOrganisation.Params prmUserOrganisation = new SaxUserOrganisation.Params(); prmUserOrganisation.UserAccountIdsIncluded.Add(SessionData.User.UserAccountId); @@ -158,7 +158,7 @@ namespace Saxonite.Net.Core.Web.Online.Models public List GetRegionDataList_Active() { List regions = new List(); - foreach (SaxRegion region in DataCacheConsole.GetActiveRegions()) + foreach (SaxRegion.Data region in DataCacheConsole.GetActiveRegions()) { RegionData regionData = new RegionData() { @@ -177,10 +177,10 @@ namespace Saxonite.Net.Core.Web.Online.Models } public String GetRegionCaption(SysId regionId) { - SaxRegion region = DataCacheConsole.GetActiveRegions().Find(item => item.Id.Equals(regionId)); + SaxRegion.Data region = DataCacheConsole.GetAllRegions().Find(item => item.Id.Equals(regionId)); return Localiser.GetRegionName(region); } - public String GetRegionCaption(SaxRegion region) + public String GetRegionCaption(SaxRegion.Data region) { return Localiser.GetRegionName(region); } @@ -197,7 +197,7 @@ namespace Saxonite.Net.Core.Web.Online.Models public List GetSportDataList_Active() { List sports = new List(); - foreach (SaxSport sport in DataCacheConsole.GetActiveSports()) + foreach (SaxSport.Data sport in DataCacheConsole.GetActiveSports()) { SportData sportData = new SportData() { @@ -210,14 +210,45 @@ namespace Saxonite.Net.Core.Web.Online.Models } return sports; } + // Sport caption. public String GetSportCaption(SysId sportId) { - SaxSport sport = DataCacheConsole.GetActiveSports().Find(item => item.Id.Equals(sportId)); + SaxSport.Data sport = DataCacheConsole.GetAllSports().Find(item => item.Id.Equals(sportId)); + return GetSportCaption(sport); + } + public String GetSportCaption(SaxSport.Data sport) + { + if (sport == null) return ""; return Localiser.GetSportName(sport); } - public String GetSportCaption(SaxSport sport) + // Speciality type. + public bool SportSpecialityNotRelevant(SysId sportId) { - return Localiser.GetSportName(sport); + SaxSport.Data sport = DataCacheConsole.GetAllSports().Find(item => item.Id.Equals(sportId)); + return SportSpecialityNotRelevant(sport); + } + public bool SportSpecialityNotRelevant(SaxSport.Data sport) + { + if (sport == null) return true; + return sport.SpecialityLabel == Sax.SportSpecialityLabel.NotRelevant; + } + // Speciality label. + public String GetSportSpecialityLabel(SysId sportId) + { + SaxSport.Data sport = DataCacheConsole.GetAllSports().Find(item => item.Id.Equals(sportId)); + return GetSportSpecialityLabel(sport); + } + public String GetSportSpecialityLabel(SaxSport.Data sport) + { + if (sport == null) return ""; + switch (sport.SpecialityLabel) + { + case Sax.SportSpecialityLabel.Positon: + return Localiser["label.position"]; + case Sax.SportSpecialityLabel.Discipline: + return Localiser["label.discipline"]; + } + return Localiser["label.speciality"]; } //------------------------------------------------------------------- diff --git a/SaxoniteCoreWebOnline/Views/Account/Profile-Contact.cshtml b/SaxoniteCoreWebOnline/Views/Account/Profile-Contact.cshtml index 83bac52..5d9608c 100644 --- a/SaxoniteCoreWebOnline/Views/Account/Profile-Contact.cshtml +++ b/SaxoniteCoreWebOnline/Views/Account/Profile-Contact.cshtml @@ -68,8 +68,10 @@
+ @* User Contact Details form *@
+ @* User Contact Details form - Header *@
@Localiser["account.caption.profile.contact"]
@@ -78,74 +80,110 @@
+ @* User Contact Details form - Content *@
+
+ @using (@Html.BeginForm(FormMethod.Post, new { @id = "frmProfileContact", @class = "sax-form", @onSubmit = "return false;" })) { @* User email *@
-
- +
+
+
+ +
+
+
+
+ @Html.TextBoxFor(model => model.AccountEmailAddress, new { @id = "ifAccountEmailAddress", @class = "AccountEmailAddress sax-input", @readonly = "readonly", @maxlength = @Model.GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.UserAccount_EmailAddress) }) +
+
+
-
- @Html.TextBoxFor(model => model.AccountEmailAddress, new { @id = "ifAccountEmailAddress", @class = "AccountEmailAddress sax-input", @readonly = "readonly", @maxlength = @Model.GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.UserAccount_EmailAddress) }) -
-
+ @* User Name *@
-
- @* User first Title *@ -
-
- +
+
+ +
+
+ +
+ +
+ @* User first Title *@ +
+
+ +
+
+ @Html.DropDownListFor(model => model.AccountTitle, Model.TitlesForSelect, Localiser["label.select"], new { @id = "cbAccountTitle", @class = "AccountTitle sax-select" }) +
+
+
+ +
+ @* User first name *@ +
+
+ +
+
+ @Html.TextBoxFor(model => model.AccountFirstName, new { @id = "ifAccountFirstName", @class = "AccountFirstName sax-input", @maxlength = @Model.GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.UserAccount_FirstName) }) +
+
+
+
+ +
+ @* User last name *@ +
+
+ +
+
+ @Html.TextBoxFor(model => model.AccountLastName, new { @id = "ifAccountLastName", @class = "AccountLastName sax-input", @maxlength = @Model.GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.UserAccount_LastName) }) +
+
+
+
+ +
+
+ + @* About *@ +
+
+
+
+ +
+
+
- @Html.DropDownListFor(model => model.AccountTitle, Model.TitlesForSelect, Localiser["label.select"], new { @id = "cbAccountTitle", @class = "AccountTitle sax-select" }) + @Html.TextAreaFor(model => model.AccountAbout, new { @id = "ifAccountAbout", @class = "AccountAbout sax-input", @rows = 4, @maxlength = @Model.GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.UserAccount_About) })
- -
- @* User first name *@ -
-
- -
-
- @Html.TextBoxFor(model => model.AccountFirstName, new { @id = "ifAccountFirstName", @class = "AccountFirstName sax-input", @maxlength = @Model.GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.UserAccount_FirstName) }) -
-
-
-
- -
- @* User last name *@ -
-
- -
-
- @Html.TextBoxFor(model => model.AccountLastName, new { @id = "ifAccountLastName", @class = "AccountLastName sax-input", @maxlength = @Model.GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.UserAccount_LastName) }) -
-
-
-
-
@* Gender *@
-
+
-
+
@@ -157,7 +195,7 @@ @* Date of birth *@
-
+
@@ -165,17 +203,17 @@
-
+
- @* DOB Day *@ + @* DOB Year *@
-
+
- +
- +
@@ -194,14 +232,14 @@
- @* DOB Year *@ + @* DOB Day *@
-
+
- +
- +
@@ -216,12 +254,12 @@ @* Country Region *@
-
+
-
+
@Html.HiddenFor(model => model.AccountRegionIdCountry, new { @id = "ifAccountRegionIdCountry", @class = "AccountRegionIdCountry" })
@@ -234,27 +272,34 @@ @* Account image *@
-
- -
-
-
-
-
-
-
- Drag your image here. -
-
-
- -
-
- +
+
+
+
+
+
+
+
+
+
+
+ @Localiser["label.drag.image.here"] +
+
+
+ @Localiser["label.alternatively"]:  + +
+
+ +
+
+
+
+
-
@* Action buttons *@ @@ -266,6 +311,8 @@ } +
+
@@ -288,8 +335,6 @@ }
-
-
diff --git a/SaxoniteCoreWebOnline/Views/Account/Profile-Organisations.cshtml b/SaxoniteCoreWebOnline/Views/Account/Profile-Organisations.cshtml index 6014d8e..113fc2e 100644 --- a/SaxoniteCoreWebOnline/Views/Account/Profile-Organisations.cshtml +++ b/SaxoniteCoreWebOnline/Views/Account/Profile-Organisations.cshtml @@ -13,7 +13,7 @@ diff --git a/SaxoniteCoreWebOnline/Views/Account/Profile-SportExperiences.cshtml b/SaxoniteCoreWebOnline/Views/Account/Profile-SportExperiences.cshtml index 446a01c..1bf90a8 100644 --- a/SaxoniteCoreWebOnline/Views/Account/Profile-SportExperiences.cshtml +++ b/SaxoniteCoreWebOnline/Views/Account/Profile-SportExperiences.cshtml @@ -1,8 +1,13 @@ @model SaxModel_Online @inject SaxLocaliser Localiser + @* Sport Experience panel - list experience for sport *@