Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
5d7ad00
paginate substation images
nbeatty-gpa May 11, 2026
5f053a0
reset to first page on sort
nbeatty-gpa May 19, 2026
48548ef
reset to first page on sort
nbeatty-gpa May 19, 2026
2e0f3b6
reset to first page on sort
nbeatty-gpa May 19, 2026
7ffabc4
reset to first page on sort
nbeatty-gpa May 19, 2026
547f6bb
reset to first page on sort
nbeatty-gpa May 19, 2026
be7fa98
fix styling for paging
nbeatty-gpa May 22, 2026
b3e9e37
paginate value list group item
nbeatty-gpa May 26, 2026
ce2a90b
page asset ConnectedChannels endpoint
nbeatty-gpa May 27, 2026
d073813
page Asset Channels table
nbeatty-gpa May 27, 2026
5ea261c
paginate tables tab of external db
nbeatty-gpa May 28, 2026
49b25b4
Fix error filtering users by additional fields
nbeatty-gpa Jun 5, 2026
9c8d49e
Refactor byUser page from slices to local state with Generic Controller
nbeatty-gpa Jun 5, 2026
7824d30
clean up byUser
nbeatty-gpa Jun 5, 2026
017f36a
move ByUserGroup from GenericSlice to GenericController
nbeatty-gpa Jun 5, 2026
87e7fe3
paginate GroupUsers
nbeatty-gpa Jun 8, 2026
e3e32ae
paginate ExternalDBTableFields
nbeatty-gpa Jun 8, 2026
e97da43
paginate byAssetGroup
nbeatty-gpa Jun 9, 2026
ffec1da
paginate assetGroupSubGroups
nbeatty-gpa Jun 9, 2026
178ebf4
paginate assetGroupsAssets
nbeatty-gpa Jun 9, 2026
c2afd21
paginate assetGroupMeters
nbeatty-gpa Jun 9, 2026
b094435
paginate assetSubstations
nbeatty-gpa Jun 9, 2026
18c9c58
paginate assetMeters
nbeatty-gpa Jun 9, 2026
d0d14c4
paginate assetConnections
nbeatty-gpa Jun 9, 2026
6b9f342
paginate customerMeter
nbeatty-gpa Jun 9, 2026
f90d779
paginate customerAsset
nbeatty-gpa Jun 9, 2026
4478c2c
paginate MeterTrendChannel
nbeatty-gpa Jun 9, 2026
b4941ad
remove accidental comment
nbeatty-gpa Jun 9, 2026
e0427ab
paginate meterChannelScaling table
nbeatty-gpa Jun 9, 2026
80d6259
paginate meterEventChannels
nbeatty-gpa Jun 10, 2026
54a84ce
Paginate remoteXDA assets
nbeatty-gpa Jun 10, 2026
03a0e25
Paginate remoteXDA meters
nbeatty-gpa Jun 10, 2026
e2fea5c
simplify settings sort
nbeatty-gpa Jun 10, 2026
654dbed
clean up user and userGroup
nbeatty-gpa Jun 10, 2026
8344930
fix generic controller typing
nbeatty-gpa Jun 10, 2026
fefd5d4
fix dependency array
nbeatty-gpa Jun 10, 2026
c25fe92
use stricter typing in EventChannelSlice
nbeatty-gpa Jun 10, 2026
c8f1cb4
changes to store typing
nbeatty-gpa Jun 10, 2026
0029600
cleanup import
nbeatty-gpa Jun 10, 2026
843404e
fix typing
nbeatty-gpa Jun 10, 2026
7666d19
refresh on changed
nbeatty-gpa Jun 10, 2026
db44f0c
fix broken Additional Field selector in ExternalDBTable
nbeatty-gpa Jun 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -33,15 +33,14 @@
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Net.Http;
using System.Transactions;
using System.Reflection;
using System.Web.Http;
using GSF.Data;
using GSF.Data.Model;
using GSF.Web.Model;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using openXDA.Model;
using SystemCenter.Model;

namespace SystemCenter.Controllers.OpenXDA
{
Expand Down Expand Up @@ -105,6 +104,71 @@ GROUP BY
return Unauthorized();
}

[HttpPost, Route("{assetGroupID:int}/Assets/{page:int}")]
public IHttpActionResult GetAssetsPaged([FromBody] PostData postData, [FromUri] int assetGroupID, [FromUri] int page)
{

if (!GetAuthCheck())
return Unauthorized();

int recordsPerPage = Take ?? 50;

PagedResults results = new PagedResults();
results.RecordsPerPage = recordsPerPage;

using (AdoDataConnection connection = new AdoDataConnection(Connection))
{
string sql = $@"SELECT
DISTINCT
Asset.ID,
AssetAssetGroup.AssetGroupID,
Asset.AssetKey,
Asset.AssetName,
Asset.VoltageKV,
AssetType.Name as AssetType,
COUNT(DISTINCT Meter.ID) as Meters,
COUNT(DISTINCT Location.ID) as Locations
FROM
Asset Join
AssetType ON Asset.AssetTypeID = AssetType.ID LEFT JOIN
MeterAsset ON MeterAsset.AssetID = Asset.ID LEFT JOIN
Meter ON MeterAsset.MeterID = Meter.ID LEFT JOIN
AssetLocation ON AssetLocation.AssetID = Asset.ID LEFT JOIN
Location ON AssetLocation.LocationID = Location.ID LEFT JOIN
AssetAssetGroup ON Asset.ID = AssetAssetGroup.AssetID
GROUP BY
Asset.ID,
Asset.AssetKey,
Asset.AssetName,
Asset.VoltageKV,
AssetType.Name,
AssetAssetGroup.AssetGroupID
HAVING AssetAssetGroup.AssetGroupID = {{0}}
ORDER BY {postData.OrderBy} {(postData.Ascending ? "ASC" : "DESC")}
";

DataTable records = connection.RetrieveData(sql, assetGroupID);

int totalRecords = records.Rows.Count;

DataRow[] rows = records.AsEnumerable()
.Skip((page) * recordsPerPage)
.Take(recordsPerPage)
.ToArray();

DataTable pagedTable = records.Clone();

foreach (DataRow row in rows)
pagedTable.ImportRow(row);

results.TotalRecords = totalRecords;
results.NumberOfPages = (totalRecords + recordsPerPage - 1) / recordsPerPage;
results.Data = JsonConvert.SerializeObject(pagedTable);
}

return Ok(results);
}

[HttpPost, Route("{assetGroupID:int}/AddAssets")]
public IHttpActionResult AddAssets(int assetGroupID, [FromBody] IEnumerable<int> assets)
{
Expand Down Expand Up @@ -205,6 +269,68 @@ GROUP BY
return Unauthorized();
}

[HttpPost, Route("{assetGroupID:int}/Meters/{page:int}")]
public IHttpActionResult GetMetersPaged([FromBody] PostData postData, [FromUri] int assetGroupID, [FromUri] int page)
{
if (!GetAuthCheck())
return Unauthorized();

int recordsPerPage = Take ?? 50;

PagedResults results = new PagedResults();
results.RecordsPerPage = recordsPerPage;

using (AdoDataConnection connection = new AdoDataConnection(Connection))
{
string sql = $@"SELECT DISTINCT
Meter.ID,
MeterAssetGroup.AssetGroupID,
Meter.AssetKey,
Meter.Name,
Meter.Make,
Meter.Model,
Location.Name as Location,
COUNT(DISTINCT MeterAsset.AssetID) as MappedAssets
FROM
Meter LEFT JOIN
Location ON Meter.LocationID = Location.ID LEFT JOIN
MeterAsset ON Meter.ID = MeterAsset.MeterID LEFT JOIN
Asset ON MeterAsset.AssetID = Asset.ID LEFT JOIN
MeterAssetGroup ON Meter.ID = MeterAssetGroup.MeterID
GROUP BY
Meter.ID,
Meter.AssetKey,
Meter.Name,
Meter.Make,
Meter.Model,
Location.Name,
MeterAssetGroup.AssetGroupID
HAVING MeterAssetGroup.AssetGroupID = {{0}}
ORDER BY {postData.OrderBy} {(postData.Ascending ? "ASC" : "DESC")}
";

DataTable records = connection.RetrieveData(sql, assetGroupID);

int totalRecords = records.Rows.Count;

DataRow[] rows = records.AsEnumerable()
.Skip((page) * recordsPerPage)
.Take(recordsPerPage)
.ToArray();

DataTable pagedTable = records.Clone();

foreach (DataRow row in rows)
pagedTable.ImportRow(row);

results.TotalRecords = totalRecords;
results.NumberOfPages = (totalRecords + recordsPerPage - 1) / recordsPerPage;
results.Data = JsonConvert.SerializeObject(pagedTable);
}

return Ok(results);
}

[HttpPost, Route("{assetGroupID:int}/AddMeters")]
public IHttpActionResult AddMeters(int assetGroupID, [FromBody] IEnumerable<int> meters)
{
Expand Down Expand Up @@ -293,7 +419,6 @@ public IHttpActionResult GetSubGroups(int assetGroupID)
try
{
IEnumerable<AssetGroupView> records = new TableOperations<AssetGroupView>(connection).QueryRecordsWhere("ID in (SELECT ChildAssetGroupID FROM AssetGroupAssetGroupView WHERE ParentAssetGroupID = {0})", assetGroupID);

return Ok(records);
}
catch (Exception ex)
Expand All @@ -306,6 +431,33 @@ public IHttpActionResult GetSubGroups(int assetGroupID)
return Unauthorized();
}

[HttpPost, Route("{assetGroupID:int}/AssetGroups/{page:int}")]
public IHttpActionResult GetSubGroupsPaged([FromBody] PostData postData, [FromUri] int assetGroupID, [FromUri] int page)
{
if (!GetAuthCheck())
return Unauthorized();

int recordsPerPage = Take ?? 50;

PagedResults results = new PagedResults();
results.RecordsPerPage = recordsPerPage;

using (AdoDataConnection connection = new AdoDataConnection(Connection))
{
IEnumerable<AssetGroupView> records = new TableOperations<AssetGroupView>(connection).QueryRecordsWhere("ID in (SELECT ChildAssetGroupID FROM AssetGroupAssetGroupView WHERE ParentAssetGroupID = {0})", assetGroupID);
if (postData.Ascending)
records = records.OrderBy(record => record.GetType().GetProperty(postData.OrderBy).GetValue(record));
else
records = records.OrderByDescending(record => record.GetType().GetProperty(postData.OrderBy).GetValue(record));

results.TotalRecords = records.Count();
results.NumberOfPages = (records.Count() + recordsPerPage - 1) / recordsPerPage;
results.Data = JsonConvert.SerializeObject(records.Skip(page * recordsPerPage).Take(recordsPerPage));
}

return Ok(results);
}

[HttpPost, Route("{assetGroupID:int}/AddAssetGroups")]
public IHttpActionResult AddSubgroups(int assetGroupID, [FromBody] IEnumerable<int> subGroups)
{
Expand Down
Loading