v1.2.11.0

This commit is contained in:
2023-07-06 18:36:52 +01:00
parent a4da299248
commit fbac433f63
19 changed files with 526 additions and 109 deletions
@@ -297,6 +297,9 @@
<data name="label.article" xml:space="preserve">
<value>Article</value>
</data>
<data name="label.associations" xml:space="preserve">
<value>Associations</value>
</data>
<data name="label.at" xml:space="preserve">
<value>At</value>
</data>
@@ -16,6 +16,8 @@ using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Dbas;
using Saxonite.Net.Standard.Base.App;
using Saxonite.Net.Core.Web.Online.Helpers;
using Org.BouncyCastle.Security;
using static Saxonite.Net.Standard.Base.App.Sax;
namespace Saxonite.Net.Core.Web.Online.Controllers
{
@@ -135,6 +137,35 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
//-------------------------------------------------------------------
// Account - Get Organisation.
//-------------------------------------------------------------------
/// <summary>
/// Associations are grouped by type and direction (parent->child).
/// <br>The organisation specified in each case is the 'other' organisation (not the current 'target' organisation).</br>
/// </summary>
private class AssociationTypeData
{
public String Caption { get; set; }
public List<AssociationOrganisationData> Organisations { get; } = new List<AssociationOrganisationData>();
}
/// <summary>
/// Association Organisation - the one that is not the current 'target' organisation.
/// <br>Region and Sport are only populate if different from the 'target' organisation.</br>
/// </summary>
private class AssociationOrganisationData
{
public String Name { get; set; }
public String Display
{
get
{
String display = Name;
if (!StringUtil.IsBlank(Sport) || !StringUtil.IsBlank(Region))
display += " (" + String.Join(", ", new List<String> { Sport, Region }.Where(item => !StringUtil.IsBlank(item))) + ")";
return display;
}
}
public String Region { get; set; }
public String Sport { get; set; }
}
private class OrganisationItemData : OrganisationListData
{
public String TypeDesc { get; set; }
@@ -143,6 +174,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
public List<AjaxResponse_Data.ItemLabelValue> Contacts { get; set; }
public String Address { get; set; }
public String PostalCode { get; set; }
public List<AssociationTypeData> Associations { get; } = new List<AssociationTypeData>();
}
private class AjaxResponse_Search_Organisation : AjaxResponse_Data
{
@@ -228,6 +260,83 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
organisationData.Address = (new List<String>() { addressLines, addressTownProvince }).Concat("\n", "", "", true, true);
organisationData.PostalCode = address.PostalCode;
}
// Associations.
Dictionary<SaxItemAssociation.TypeOptionData, List<AssociationOrganisationData>> associationTypeGroups = new Dictionary<SaxItemAssociation.TypeOptionData, List<AssociationOrganisationData>>();
ColumnDfn colId = ItemDataMgr.GetItemAssociationColumnDfn(SaxItemAssociation.Column.Id);
ColumnDfn colAssociationType = ItemDataMgr.GetItemAssociationColumnDfn(SaxItemAssociation.Column.AssociationType);
ColumnDfn colItemTypeFrom = ItemDataMgr.GetItemAssociationColumnDfn(SaxItemAssociation.Column.ItemTypeFrom);
ColumnDfn colItemIdFrom = ItemDataMgr.GetItemAssociationColumnDfn(SaxItemAssociation.Column.ItemIdFrom);
ColumnDfn colOrganisationFrom_Name = ItemDataMgr.GetItemAssociationColumnDfn(SaxItemAssociation.Column.OrganisationFrom_Name);
ColumnDfn colOrganisationFrom_SportIdPrimary = ItemDataMgr.GetItemAssociationColumnDfn(SaxItemAssociation.Column.OrganisationFrom_SportIdPrimary);
ColumnDfn colOrganisationFrom_RegionIdPrimary = ItemDataMgr.GetItemAssociationColumnDfn(SaxItemAssociation.Column.OrganisationFrom_RegionIdPrimary);
ColumnDfn colItemTypeTo = ItemDataMgr.GetItemAssociationColumnDfn(SaxItemAssociation.Column.ItemTypeTo);
ColumnDfn colItemIdTo = ItemDataMgr.GetItemAssociationColumnDfn(SaxItemAssociation.Column.ItemIdTo);
ColumnDfn colOrganisationTo_Name = ItemDataMgr.GetItemAssociationColumnDfn(SaxItemAssociation.Column.OrganisationTo_Name);
ColumnDfn colOrganisationTo_SportIdPrimary = ItemDataMgr.GetItemAssociationColumnDfn(SaxItemAssociation.Column.OrganisationTo_SportIdPrimary);
ColumnDfn colOrganisationTo_RegionIdPrimary = ItemDataMgr.GetItemAssociationColumnDfn(SaxItemAssociation.Column.OrganisationTo_RegionIdPrimary);
List<ColumnDfn> associationCols = new List<ColumnDfn>()
{
colId, colAssociationType,
colItemTypeFrom, colItemIdFrom, colOrganisationFrom_Name, colOrganisationFrom_SportIdPrimary, colOrganisationFrom_RegionIdPrimary,
colItemTypeTo, colItemIdTo, colOrganisationTo_Name, colOrganisationTo_SportIdPrimary, colOrganisationTo_RegionIdPrimary
};
SaxItemAssociation.Params prmAssociations = new SaxItemAssociation.Params();
prmAssociations.ItemIdsIncluded.Add(organisation.GetItemId());
prmAssociations.StatusCat = SaxItemAssociation.StatusCat.ActiveOnly;
using (DbResultSet resultSet = ItemDataMgr.ExecuteItemAssociationQuery(associationCols, prmAssociations))
{
while (resultSet != null && resultSet.HasRows && resultSet.NextRecord())
{
NamedValue.Map values = resultSet.GetRecordValues();
SysId associationId = new SysId(values.GetLong(colId.DataName));
Sax.AssociationType associationType = (Sax.AssociationType)values.GetLong(colAssociationType.DataName);
ItemId itemIdFrom = new ItemId((short)values.GetLong(colItemTypeFrom.DataName), new SysId(values.GetLong(colItemIdFrom.DataName)));
ItemId itemIdTo = new ItemId((short)values.GetLong(colItemTypeTo.DataName), new SysId(values.GetLong(colItemIdTo.DataName)));
bool associationTypeDirectionReversed = associationType == Sax.AssociationType.Affiliate && itemIdTo.Id.Equals(organisation.Id);
// Determine association type group.
SaxItemAssociation.TypeOptionData assocTypeOption = new SaxItemAssociation.TypeOptionData(associationType, associationTypeDirectionReversed, GetAssociationTypeOptionCaption(associationType, associationTypeDirectionReversed));
List<AssociationOrganisationData> organisations = associationTypeGroups.GetValue(assocTypeOption, null);
if (organisations == null)
associationTypeGroups.Add(assocTypeOption, organisations = new List<AssociationOrganisationData>());
// Populate organisation properties.
SysId orgSportIdFrom = new SysId(values.GetLong(colOrganisationFrom_SportIdPrimary.DataName));
SysId orgRegionIdFrom = new SysId(values.GetLong(colOrganisationFrom_RegionIdPrimary.DataName));
SysId orgSportIdTo = new SysId(values.GetLong(colOrganisationTo_SportIdPrimary.DataName));
SysId orgRegionIdTo = new SysId(values.GetLong(colOrganisationTo_RegionIdPrimary.DataName));
if (itemIdTo.Id.Equals(organisation.Id))
{
// 'From' item is the 'Other' organisation.
AssociationOrganisationData assocOrgData = new AssociationOrganisationData();
assocOrgData.Name = values.GetString(colOrganisationFrom_Name.DataName);
if (!orgSportIdFrom.Equals(orgSportIdTo))
assocOrgData.Sport = model.GetSportCaption(orgSportIdFrom);
if (!orgRegionIdFrom.Equals(orgRegionIdTo))
assocOrgData.Region = model.GetRegionCaption(orgRegionIdFrom);
organisations.Add(assocOrgData);
}
else
{
// 'To' item is the 'Other' organisation.
AssociationOrganisationData assocOrgData = new AssociationOrganisationData();
assocOrgData.Name = values.GetString(colOrganisationTo_Name.DataName);
if (!orgSportIdFrom.Equals(orgSportIdTo))
assocOrgData.Sport = model.GetSportCaption(orgSportIdTo);
if (!orgRegionIdFrom.Equals(orgRegionIdTo))
assocOrgData.Region = model.GetRegionCaption(orgRegionIdTo);
organisations.Add(assocOrgData);
}
}
}
// Populate associations to response.
foreach (SaxItemAssociation.TypeOptionData associationTypeGroup in associationTypeGroups.Keys.OrderBy(item => (int)item.TypeOption))
{
AssociationTypeData associationTypeData = new AssociationTypeData();
associationTypeData.Caption = associationTypeGroup.Caption;
associationTypeData.Organisations.AddRange(associationTypeGroups.GetValue(associationTypeGroup, new List<AssociationOrganisationData>()).OrderBy(item => item.Name).ToList());
responseData.Organisation.Associations.Add(associationTypeData);
}
}
// Complete response.
@@ -235,6 +344,21 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
return Json(responseData);
}
//-------------------------------------------------------------------
/// <summary>
/// Caption to display above list of corresponding associated organisation for the 'target' organisation.
/// </summary>
private String GetAssociationTypeOptionCaption(Sax.AssociationType associationType, bool reversed)
{
switch (SaxItemAssociation.GetAssociationTypeOption(associationType, reversed))
{
case AssociationTypeOption.AffiliateParent: return "Affiliated to";
case AssociationTypeOption.AffiliateChild: return "Affiliates";
case AssociationTypeOption.Partner: return "Partners";
}
return "Unknown relationship";
}
//-------------------------------------------------------------------
}
//=======================================================================
@@ -9,16 +9,28 @@
{
margin-right: 8px;
}
#dlgOrganisation .OrganisationAbout .sax-value, #dlgOrganisation .OrganisationFacilities .sax-value
#dlgOrganisation .OrganisationAssociations .sax-value, #dlgOrganisation .OrganisationAbout .sax-value, #dlgOrganisation .OrganisationFacilities .sax-value
{
min-height: 40px;
max-height: 170px;
padding:2px 4px;
padding: 2px 4px;
border: 1px solid #a0a0a0;
border-top-left-radius: 4px;
border-bottom-left-radius: 4px;
overflow-y: scroll;
}
#dlgOrganisation .OrganisationAssociations .sax-value .sax-assoc-type
{
font-weight: bold;
text-decoration: underline;
}
#dlgOrganisation .OrganisationAssociations .sax-value .sax-assoc-org
{
padding-left: 12px;
}
</style>
<script type="text/javascript">
</script>
@@ -63,6 +75,10 @@
<div class="col-sm-3"><div class="sax-label text-sm-right">@Localiser["label.postal.code"]</div></div>
<div class="col-sm"><div class="sax-value"></div></div>
</div>
<div class="row OrganisationAssociations">
<div class="col-sm-3"><div class="sax-label text-sm-right">@Localiser["label.associations"]</div></div>
<div class="col-sm"><div class="sax-value"></div></div>
</div>
<div class="spacer"></div>
@@ -139,6 +139,14 @@
$('.OrganisationLocation', dlg).toggle(!!item.regionName).find('.sax-value').text(item.regionName);
$('.OrganisationAbout', dlg).toggle(!!item.about).find('.sax-value').html((item.about || '').replace('\n', '<br/>'));
$('.OrganisationFacilities', dlg).toggle(!!item.facilities).find('.sax-value').html((item.facilities || '').replace('\n', '<br/>'));
let $assocs = $('.OrganisationAssociations .sax-value', dlg).empty();
for (const assoc of item.associations)
{
$assocs.append($("<div class='sax-assoc-type'>").text(assoc.caption));
for (const org of assoc.organisations)
$assocs.append($("<div class='sax-assoc-org'>").text(org.display));
}
$('.OrganisationAssociations', dlg).toggle(item.associations.length>0);
let contact = [];
for (let cnt of item.contacts || [])
contact.push(cnt.value);