Skip to content

Commit ac284e4

Browse files
author
Austin T Schaffer
authored
Version 2.0 Release Candidate (#3)
* Added location mapping, displaying, and importing * Added support for mapping resource-level instances when the current AO has no instances * Added a setting to allow grouping by the Volume column * Added support for importing digital object instance information
1 parent 0a82739 commit ac284e4

4 files changed

Lines changed: 157 additions & 54 deletions

File tree

Aeon-ArchivesSpace-Addon/Aeon-ArchivesSpace.lua

Lines changed: 116 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ settings.ApiBaseURL = GetSetting("ArchivesSpaceBackendURL");
2020
settings.Username = GetSetting("AS_Username");
2121
settings.Password = GetSetting("AS_Password");
2222
settings.AutoSearchPriority = GetSetting("AutoSearchPriority");
23+
settings.AutoGroupResults = GetSetting("AutoGroupResults");
2324

2425
local types = {};
2526

@@ -38,7 +39,9 @@ types["System.Drawing.Size"] = luanet.import_type("System.Drawing.Size");
3839
luanet.load_assembly("System.Data");
3940
types["System.Data.DataTable"] = luanet.import_type("System.Data.DataTable");
4041

41-
local currentResourceUri = "";
42+
local currentRecordUri = "";
43+
44+
local gridColumns = {};
4245

4346
local archiveSpaceAddonScript = [[
4447
function buildObjectUrl(currentTreeId) {
@@ -61,7 +64,7 @@ local archiveSpaceAddonScript = [[
6164
var archivesSpaceAddonInitialized = true;
6265
var currentRepositoryPath = /\/repositories\/(\d+)/.exec($(".repo-container > .btn-group > a[href*='/repositories/']")[0].href)[0];
6366
64-
//Sets the currentResourceUri
67+
//Sets the currentRecordUri
6568
if (currentRepositoryPath) {
6669
// There is an information tree
6770
if (window.AjaxTree) {
@@ -198,6 +201,7 @@ function BuildItemsGrid()
198201
gridColumn.Visible = true;
199202
gridColumn.OptionsColumn.ReadOnly = true;
200203
gridColumn.Width = 50;
204+
gridColumns["Title"] = gridColumn;
201205

202206
gridColumn = gridView.Columns:Add();
203207
gridColumn.Caption = "SubTitle";
@@ -206,6 +210,7 @@ function BuildItemsGrid()
206210
gridColumn.Visible = true;
207211
gridColumn.OptionsColumn.ReadOnly = true;
208212
gridColumn.Width = 50;
213+
gridColumns["SubTitle"] = gridColumn;
209214

210215
gridColumn = gridView.Columns:Add();
211216
gridColumn.Caption = "Call Number";
@@ -214,6 +219,7 @@ function BuildItemsGrid()
214219
gridColumn.Visible = true;
215220
gridColumn.OptionsColumn.ReadOnly = true;
216221
gridColumn.Width = 50;
222+
gridColumns["Call Number"] = gridColumn;
217223

218224
gridColumn = gridView.Columns:Add();
219225
gridColumn.Caption = "Author";
@@ -222,6 +228,7 @@ function BuildItemsGrid()
222228
gridColumn.Visible = true;
223229
gridColumn.OptionsColumn.ReadOnly = true;
224230
gridColumn.Width = 50;
231+
gridColumns["Author"] = gridColumn;
225232

226233
gridColumn = gridView.Columns:Add();
227234
gridColumn.Caption = "Volume";
@@ -230,6 +237,7 @@ function BuildItemsGrid()
230237
gridColumn.Visible = true;
231238
gridColumn.OptionsColumn.ReadOnly = true;
232239
gridColumn.Width = 50;
240+
gridColumns["Volume"] = gridColumn;
233241

234242
gridColumn = gridView.Columns:Add();
235243
gridColumn.Caption = "Barcode";
@@ -238,6 +246,16 @@ function BuildItemsGrid()
238246
gridColumn.Visible = true;
239247
gridColumn.OptionsColumn.ReadOnly = true;
240248
gridColumn.Width = 50;
249+
gridColumns["Barcode"] = gridColumn;
250+
251+
gridColumn = gridView.Columns:Add();
252+
gridColumn.Caption = "Location";
253+
gridColumn.FieldName = "Location";
254+
gridColumn.Name = "gridColumnLocation";
255+
gridColumn.Visible = true;
256+
gridColumn.OptionsColumn.ReadOnly = true;
257+
gridColumn.Width = 50;
258+
gridColumns["Location"] = gridColumn;
241259

242260
catalogSearchForm.Grid.GridControl.DataSource = CreateItemsTable();
243261

@@ -254,6 +272,7 @@ function CreateItemsTable()
254272
itemsTable.Columns:Add("Author");
255273
itemsTable.Columns:Add("Volume");
256274
itemsTable.Columns:Add("Barcode");
275+
itemsTable.Columns:Add("Location");
257276

258277
return itemsTable;
259278
end
@@ -330,17 +349,17 @@ end
330349

331350
function NodeChanged(currentRepositoryPath, selectedResourcePath)
332351
ResetDataGrid();
333-
currentResourceUri = PathCombine(currentRepositoryPath, selectedResourcePath);
334-
LogDebug('currentResourceUri = ' .. currentResourceUri);
352+
currentRecordUri = PathCombine(currentRepositoryPath, selectedResourcePath);
353+
LogDebug('currentRecordUri = ' .. currentRecordUri);
335354

336355
SetImportButtonsDisabled();
337356
end
338357

339358
function SetCitationImportButtonsEnabled()
340359
if(
341-
string.match(currentResourceUri, HostAppInfo.PageUri["Resource"]) or
342-
string.match(currentResourceUri, HostAppInfo.PageUri["Accession"]) or
343-
string.match(currentResourceUri, HostAppInfo.PageUri["DigitalObject"])
360+
string.match(currentRecordUri, HostAppInfo.PageUri["Resource"]) or
361+
string.match(currentRecordUri, HostAppInfo.PageUri["Accession"]) or
362+
string.match(currentRecordUri, HostAppInfo.PageUri["DigitalObject"])
344363
) then
345364
LogDebug("Resource- Setting Import Citation to True");
346365
catalogSearchForm.ImportCitationButton.BarButton.Enabled = true;
@@ -369,47 +388,87 @@ function ResetDataGrid()
369388
end
370389

371390
function PopulateDataGrid()
372-
local itemsDataTable = CreateItemsTable();
373-
LogDebug("Current Resource URI: " .. currentResourceUri);
374-
if(string.match(currentResourceUri, HostAppInfo.PageUri["ArchivalObject"])) then
391+
LogDebug("Current Record URI: " .. currentRecordUri);
392+
393+
if (string.match(currentRecordUri, HostAppInfo.PageUri["ArchivalObject"])) then
394+
375395
local sessionId = GetSessionId();
376-
local archivalObject = GetArchivalObject(sessionId, currentResourceUri);
377-
378-
if (archivalObject) and (archivalObject.instances ~= nil and archivalObject.instances ~= JsonParser.NIL) then
379-
LogDebug("Is an instance of archival object");
380-
local collectionUri = ExtractSubproperty(archivalObject, "resource", "ref");
381-
local collection = ArchivesSpaceGetRequest(sessionId, collectionUri);
382-
383-
local mapping = HostAppInfo.InstanceDataImport;
384-
local availableData = {};
385-
availableData["ArchivalObjectTitle"] = ExtractProperty(archivalObject, "title");
386-
availableData["ResourceTitle"] = ExtractProperty(collection, "title");
387-
availableData["EadId"] = ExtractProperty(collection,"ead_id");
388-
availableData["Creators"] = ExtractCreators(sessionId, collection);
389-
390-
catalogSearchForm.Grid.GridControl:BeginUpdate();
391-
392-
for _, v in ipairs(archivalObject.instances) do
393-
local itemRow = itemsDataTable:NewRow();
394-
local topContainer = GetTopContainerFromAPI(sessionId, v)
395-
availableData["ArchivalObjectContainer"] = ExtractArchivalObjectContainer(v, topContainer);
396-
availableData["ArchivalObjectContainerBarcode"] = ExtractArchivalObjectContainerBarcode(topContainer);
397-
itemRow:set_item(mapping["Title"].ItemGridColumn, availableData[mapping["Title"].AspaceData]);
398-
itemRow:set_item(mapping["SubTitle"].ItemGridColumn, availableData[mapping["SubTitle"].AspaceData]);
399-
itemRow:set_item(mapping["CallNumber"].ItemGridColumn, availableData[mapping["CallNumber"].AspaceData]);
400-
itemRow:set_item(mapping["Author"].ItemGridColumn, availableData[mapping["Author"].AspaceData]);
401-
itemRow:set_item(mapping["Volume"].ItemGridColumn, availableData[mapping["Volume"].AspaceData]);
402-
itemRow:set_item(mapping["Barcode"].ItemGridColumn, availableData[mapping["Barcode"].AspaceData]);
403-
itemsDataTable.Rows:Add(itemRow);
396+
local archivalObject = GetArchivalObject(sessionId, currentRecordUri);
397+
local collectionUri = ExtractSubproperty(archivalObject, "resource", "ref");
398+
local collection = ArchivesSpaceGetRequest(sessionId, collectionUri);
399+
400+
if archivalObject and archivalObject.instances and (archivalObject.instances ~= JsonParser.NIL) and (#archivalObject.instances > 0) then
401+
LogDebug("Mapping Archival Object instances");
402+
instances = archivalObject.instances;
403+
elseif collection and collection.instances and (collection.instances ~= JsonParser.NIL) and (#collection.instances > 0) then
404+
LogDebug("Archival Object has no instances. Mapping Resource instances.");
405+
instances = collection.instances;
406+
else
407+
LogDebug("Neither the current Archival Object nor the current Resource have any instances.");
408+
return;
409+
end
410+
411+
local availableData = {};
412+
availableData["ArchivalObjectTitle"] = ExtractProperty(archivalObject, "title");
413+
availableData["ResourceTitle"] = ExtractProperty(collection, "title");
414+
availableData["EadId"] = ExtractProperty(collection,"ead_id");
415+
availableData["Creators"] = ExtractCreators(sessionId, collection);
416+
417+
local itemsDataTable = CreateItemsTable();
418+
419+
catalogSearchForm.Grid.GridControl:BeginUpdate();
420+
421+
for _, archivalObjectInstance in ipairs(instances) do
422+
423+
local topContainer = GetTopContainerFromAPI(sessionId, archivalObjectInstance);
424+
local digitalObject = GetDigitalObjectFromAPI(sessionId, archivalObjectInstance);
425+
426+
availableData["ArchivalObjectInstance"] = ExtractArchivalObjectInstanceTitle(archivalObjectInstance, topContainer, digitalObject);
427+
availableData["ArchivalObjectInstanceBarcode"] = ExtractArchivalObjectInstanceBarcode(topContainer, digitalObject);
428+
429+
topContainerHasContainerLocations = (
430+
topContainer and
431+
topContainer.container_locations and
432+
topContainer.container_locations ~= JsonParser.NIL and
433+
(#topContainer.container_locations > 0)
434+
)
435+
436+
if topContainerHasContainerLocations then
437+
for _, containerLocation in ipairs(topContainer.container_locations) do
438+
location = ArchivesSpaceGetRequest(sessionId, containerLocation.ref);
439+
availableData["ArchivalObjectContainerLocation"] = location.title;
440+
AddRowToItemsTable(itemsDataTable, availableData);
441+
end
442+
else
443+
availableData["ArchivalObjectContainerLocation"] = "";
444+
AddRowToItemsTable(itemsDataTable, availableData);
404445
end
446+
end
405447

406-
catalogSearchForm.Grid.GridControl.DataSource = itemsDataTable;
407-
catalogSearchForm.Grid.GridControl:EndUpdate();
448+
catalogSearchForm.Grid.GridControl.DataSource = itemsDataTable;
449+
catalogSearchForm.Grid.GridControl:EndUpdate();
408450

451+
catalogSearchForm.Grid.GridControl.Enabled = true;
452+
if settings.AutoGroupResults then
453+
gridColumns["Volume"]:Group();
409454
end
410455
end
411456
end
412457

458+
function AddRowToItemsTable(itemsDataTable, availableData)
459+
local itemRow = itemsDataTable:NewRow();
460+
461+
itemRow:set_item(HostAppInfo.InstanceDataImport["Title"].ItemGridColumn, availableData[HostAppInfo.InstanceDataImport["Title"].AspaceData]);
462+
itemRow:set_item(HostAppInfo.InstanceDataImport["SubTitle"].ItemGridColumn, availableData[HostAppInfo.InstanceDataImport["SubTitle"].AspaceData]);
463+
itemRow:set_item(HostAppInfo.InstanceDataImport["CallNumber"].ItemGridColumn, availableData[HostAppInfo.InstanceDataImport["CallNumber"].AspaceData]);
464+
itemRow:set_item(HostAppInfo.InstanceDataImport["Author"].ItemGridColumn, availableData[HostAppInfo.InstanceDataImport["Author"].AspaceData]);
465+
itemRow:set_item(HostAppInfo.InstanceDataImport["Volume"].ItemGridColumn, availableData[HostAppInfo.InstanceDataImport["Volume"].AspaceData]);
466+
itemRow:set_item(HostAppInfo.InstanceDataImport["Barcode"].ItemGridColumn, availableData[HostAppInfo.InstanceDataImport["Barcode"].AspaceData]);
467+
itemRow:set_item(HostAppInfo.InstanceDataImport["Location"].ItemGridColumn, availableData[HostAppInfo.InstanceDataImport["Location"].AspaceData]);
468+
469+
itemsDataTable.Rows:Add(itemRow);
470+
end
471+
413472
function ImportInstance_Clicked()
414473
local importRow = catalogSearchForm.Grid.GridControl.MainView:GetFocusedRow();
415474

@@ -433,7 +492,7 @@ function ImportCitation_Clicked()
433492
SetImportButtonsDisabled();
434493

435494
local sessionId = GetSessionId();
436-
local collection = ArchivesSpaceGetRequest(sessionId, currentResourceUri);
495+
local collection = ArchivesSpaceGetRequest(sessionId, currentRecordUri);
437496
local jsonModelType = ExtractProperty(collection, "jsonmodel_type");
438497
LogDebug("Json Model Type: ".. jsonModelType);
439498
local availableData = {};
@@ -516,7 +575,17 @@ function GetTopContainerFromAPI(sessionId, archivalObjectInstance)
516575
return nil
517576
end
518577

519-
function ExtractArchivalObjectContainer(archivalObjectInstance, topContainer)
578+
function GetDigitalObjectFromAPI(sessionId, archivalObjectInstance)
579+
if (archivalObjectInstance.digital_object ~= nil and archivalObjectInstance.digital_object ~= JsonParser.NIL) then
580+
local digitalObjectUri = archivalObjectInstance.digital_object.ref;
581+
local digitalObject = ArchivesSpaceGetRequest(sessionId, digitalObjectUri);
582+
return digitalObject
583+
end
584+
585+
return nil
586+
end
587+
588+
function ExtractArchivalObjectInstanceTitle(archivalObjectInstance, topContainer, digitalObject)
520589
local container = "";
521590

522591
if (archivalObjectInstance.container ~= nil and archivalObjectInstance.container ~= JsonParser.NIL) then
@@ -529,16 +598,20 @@ function ExtractArchivalObjectContainer(archivalObjectInstance, topContainer)
529598
end
530599
elseif (topContainer) then
531600
container = topContainer.long_display_string;
601+
elseif (digitalObject) then
602+
container = digitalObject.title;
532603
end
533604

534605
return container;
535606
end
536607

537-
function ExtractArchivalObjectContainerBarcode(topContainer)
608+
function ExtractArchivalObjectInstanceBarcode(topContainer, digitalObject)
538609
local barcode = "";
539610

540611
if topContainer and topContainer.barcode then
541612
barcode = topContainer.barcode;
613+
elseif digitalObject and digitalObject.digital_object_id then
614+
barcode = digitalObject.digital_object_id;
542615
end
543616

544617
return barcode;

Aeon-ArchivesSpace-Addon/Config.xml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<Configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
33
<Name>ArchivesSpace Interface</Name>
44
<Author>Atlas Systems, Inc.</Author>
5-
<Version>1.3.0</Version>
5+
<Version>2.0.0</Version>
66
<Active>True</Active>
77
<Type>Addon</Type>
88
<Description>This addon performs searches in ArchivesSpace using the staff interface. This addon supports ArchivesSpace versions v2.0.0 and later.</Description>
@@ -28,6 +28,9 @@
2828
<Setting name="AutoSearchPriority" value="Title, Author, CallNumber" type="string">
2929
<Description>A comma-separated list of searches to be performed in order.</Description>
3030
</Setting>
31+
<Setting name="AutoGroupResults" value="false" type="boolean">
32+
<Description>Specifies whether the results grid should be grouped automatically. The table will be grouped by the "Volume" column, which refers to either the instance's top container display string or digital object title.</Description>
33+
</Setting>
3134
</Settings>
3235
<Files>
3336
<File>Aeon-ArchivesSpace.lua</File>

Aeon-ArchivesSpace-Addon/DataMapping.lua

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,17 @@ HostAppInfo.InstanceDataImport["Author"] =
6262

6363
HostAppInfo.InstanceDataImport["Volume"] =
6464
{
65-
AeonField = "ItemVolume", AspaceData = "ArchivalObjectContainer", FieldLength = 255, ItemGridColumn = "Volume"
65+
AeonField = "ItemVolume", AspaceData = "ArchivalObjectInstance", FieldLength = 255, ItemGridColumn = "Volume"
6666
}
6767

6868
HostAppInfo.InstanceDataImport["Barcode"] =
6969
{
70-
AeonField = "ItemNumber", AspaceData = "ArchivalObjectContainerBarcode", FieldLength = 50, ItemGridColumn = "Barcode"
70+
AeonField = "ItemNumber", AspaceData = "ArchivalObjectInstanceBarcode", FieldLength = 50, ItemGridColumn = "Barcode"
71+
}
72+
73+
HostAppInfo.InstanceDataImport["Location"] =
74+
{
75+
AeonField = "Location", AspaceData = "ArchivalObjectContainerLocation", FieldLength = 255, ItemGridColumn = "Location"
7176
}
7277

7378
-- Resource Citation Import Mapping

0 commit comments

Comments
 (0)