Skip to content

Commit 3270499

Browse files
committed
Added a get and set table function, updated index.js, and various other functions to accomodate tables into the header and footer pages
1 parent 9aea24a commit 3270499

7 files changed

Lines changed: 99 additions & 50 deletions

File tree

fixtures/tables_test.xlsx

115 Bytes
Binary file not shown.

lib/importer/nunjucks/importer/macros/table_selector.njk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@
6565
Table '{{ table.name }}' is empty
6666
</div>
6767
{% else %}
68-
{% set caption = importerGetTableCaption2(data, "First", 10, sheet.name, table.name) %}
68+
{% set caption = importerGetTableCaption(data, "First", 10, sheet.name, table.name) %}
6969
{{ tableView({
7070
caption: caption,
7171
showHeaders: true,

lib/importer/src/dudk/backend.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,11 @@ exports.SessionGetSheets = (sid) => {
7979
return session.sheetNames
8080
};
8181

82+
exports.SessionGetTables = (sid, sheetName) => {
83+
let session = sessionStore.get(sid);
84+
return session.tables[sheetName]
85+
};
86+
8287
exports.SessionSetHeaderRange = (sid, range) => {
8388
assert(range != null, "Null range passed to SessionSetHeaderRange");
8489
assert(range.sheet != null, "Range with null sheet passed to SessionSetHeaderRange");

lib/importer/src/dudk/sheets.js

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,8 @@ exports.GetRows = (sid, sheet, start = 0, count = 10) => {
266266

267267
// Try to provide rows from start to start+count-1, but limit ourselves to
268268
// the rows in the sheet.
269-
const rowRange = {
269+
270+
rowRange = {
270271
sheet: sheet,
271272
start: { row: start, column: 0 },
272273
end: { row: Math.min(start + count, sheetDimensions.rows), column: sheetDimensions.columns - 1 }
@@ -277,7 +278,32 @@ exports.GetRows = (sid, sheet, start = 0, count = 10) => {
277278
return processMergedCells(rowRange.end.column - rowRange.start.column + 1, preview);
278279
};
279280

280-
exports.GetRowRangeFromEnd = (sid, sheet, count = 10) => {
281+
exports.GetRowsTable = (sid, sheet, start = 0, count = 10, table=null) => {
282+
const tableRangeContainer = backend.SessionGetInputTableRanges(sid, sheet).get(table);
283+
assert(tableRangeContainer, `Table Range ${table} not found in ${sheet}` )
284+
rowRange = {
285+
sheet: sheet,
286+
start: tableRangeContainer.range.start,
287+
end: { row: Math.min(tableRangeContainer.range.start.row + count, tableRangeContainer.range.end.row), column: tableRangeContainer.range.end.column }
288+
}
289+
const wantedRows = rowRange.end.row - rowRange.start.row
290+
const preview = backend.SessionGetInputSampleRows(sid, rowRange, wantedRows, 0, 0)[0];
291+
292+
return processMergedCells(rowRange.end.column - rowRange.start.column + 1, preview);
293+
};
294+
295+
exports.GetRowRangeFromEnd = (sid, sheet, count = 10, table = null) => {
296+
if (table) {
297+
const tableRangeContainer = backend.SessionGetInputTableRanges(sid, sheet).get(table);
298+
const tableRange = tableRangeContainer.range
299+
console.debug('Table range:', tableRange)
300+
return {
301+
sheet: sheet,
302+
start: { row: Math.max(tableRange.end.row - count, tableRange.start.row), column: tableRange.start.column},
303+
end: tableRange.end
304+
}
305+
}
306+
281307
const sheetDimensions = backend.SessionGetInputDimensions(sid)
282308
.sheetDimensions.get(sheet);
283309

@@ -286,6 +312,7 @@ exports.GetRowRangeFromEnd = (sid, sheet, count = 10) => {
286312
const hRange = backend.SessionGetHeaderRange(sid, sheet)
287313

288314
const end = sheetDimensions.rows - 1;
315+
289316
return {
290317
sheet: sheet,
291318
start: { row: Math.max(end - count, hRange.start.row + 1), column: hRange.start.column },
@@ -296,7 +323,15 @@ exports.GetRowRangeFromEnd = (sid, sheet, count = 10) => {
296323
// Given a session id and a sheet returns up to count rows.
297324
exports.GetTrailingRows = (sid, sheet, count = 10) => {
298325
const hRange = backend.SessionGetHeaderRange(sid, sheet);
299-
const rowRange = exports.GetRowRangeFromEnd(sid, sheet, count)
326+
const rowRange = exports.GetRowRangeFromEnd(sid, sheet, count);
327+
const wantedRows = Math.min(count, rowRange.end.row - hRange.end.row);
328+
return backend.SessionGetInputSampleRows(sid, rowRange, 0, 0, wantedRows)[2];
329+
};
330+
331+
// Given a session id, a sheet and a table returns up to count rows.
332+
exports.GetTrailingRowsTable = (sid, sheet, table, count = 10) => {
333+
const hRange = backend.SessionGetHeaderRange(sid, sheet);
334+
const rowRange = exports.GetRowRangeFromEnd(sid, sheet, count, table);
300335
const wantedRows = Math.min(count, rowRange.end.row - hRange.end.row);
301336
return backend.SessionGetInputSampleRows(sid, rowRange, 0, 0, wantedRows)[2];
302337
};

lib/importer/src/functions.js

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@ const importerErrorMappingData = (error, key) => {
7777
const importerGetRows = (data, start, count) => {
7878
const session_data = data[IMPORTER_SESSION_KEY];
7979
const session = new session_lib.Session(session_data)
80+
if (session.table & session.table != null) {
81+
return sheets_lib.GetRowsTable(session.backendSid, session.sheet, start, count, session.table)
82+
}
8083
return sheets_lib.GetRows(session.backendSid, session.sheet, start, count);
8184
}
8285

@@ -87,6 +90,9 @@ const importerGetRows = (data, start, count) => {
8790
const importerGetTrailingRows = (data, count) => {
8891
const session_data = data[IMPORTER_SESSION_KEY];
8992
const session = new session_lib.Session(session_data)
93+
if (session.table & session.table != null) {
94+
return sheets_lib.GetTrailingRowsTable(session.backendSid, session.sheet, session.table, count);
95+
}
9096
return sheets_lib.GetTrailingRows(session.backendSid, session.sheet, count);
9197
}
9298

@@ -99,35 +105,38 @@ const importerGetTrailingRows = (data, count) => {
99105
// "All {n} rows of {sheet}"
100106
//--------------------------------------------------------------------
101107
const importerGetTableCaption =
102-
(data, prefix, rowsAskedFor, sheetName = null) => {
108+
(data, prefix, rowsAskedFor=10, sheetName = null, tableName = null) => {
109+
console.debug("Table Name:", tableName)
103110
const session_data = data[IMPORTER_SESSION_KEY];
104111
const session = new session_lib.Session(session_data)
112+
console.debug(session.sheet)
113+
console.debug(session.table)
114+
console.debug(session.headerRange)
105115

106116
const sheet = (sheetName ??= session.sheet);
117+
const table = (tableName ??= session.table);
118+
console.debug(table)
119+
120+
if (table) {
121+
console.debug('There is a table')
122+
const rowCount = sheets_lib.GetTableRows(session.backendSid, sheet, table)
123+
124+
if (rowCount > rowsAskedFor) {
125+
return `${prefix} ${rowsAskedFor} rows of '${tableName}'`;
126+
}
127+
128+
return `All ${rowCount} rows of '${tableName}'`;
129+
}
107130
const rowCount = sheets_lib.GetTotalRows(session.backendSid, sheet);
108131

109132
if (rowCount > rowsAskedFor) {
110133
return `${prefix} ${rowsAskedFor} rows of '${sheet}'`;
111134
}
112135

136+
console.debug(`All rows of '${sheet}'`)
113137
return `All rows of '${sheet}'`;
114138
}
115-
116-
const importerGetTableCaption2 =
117-
(data, prefix, rowsAskedFor, sheetName = null, tableName = null) => {
118-
const session_data = data[IMPORTER_SESSION_KEY];
119-
const session = new session_lib.Session(session_data)
120-
121-
const sheet = (sheetName ??= session.sheet)
122-
const table = (tableName ??= sheet["!tables"].table.tableName)
123-
const rowCount = sheets_lib.GetTableRows(session.backendSid, sheet, table)
124-
125-
if (rowCount > rowsAskedFor) {
126-
return `${prefix} ${rowsAskedFor} rows of '${tableName}'`;
127-
}
128-
129-
return `All ${numberRows} rows of '${tableName}'`;
130-
}
139+
131140
//--------------------------------------------------------------------
132141
// In the absence of a step to choose headers, we will instead provide
133142
// a function that will allow the system to get the headers for the
@@ -286,7 +295,6 @@ module.exports = {
286295
importerGetHeaders,
287296
importerGetTrailingRows,
288297
importerGetTableCaption,
289-
importerGetTableCaption2,
290298
importerMappedData,
291299
importerHeaderRowDisplay,
292300
data_sum,

lib/importer/src/index.js

Lines changed: 24 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -270,40 +270,36 @@ exports.Initialise = (config, router, prototypeKit) => {
270270

271271
if (request.body.table == "no_table") {
272272
console.debug("No table")
273-
redirectOnwards(request, response); //if no table is selected we don't need to persist one
274-
return;
273+
session.table = null
274+
//redirectOnwards(request, response); //if no table is selected we don't need to persist one
275+
//return;
276+
} else {
277+
session.table = request.body.table;
278+
let check = sheets_lib.GetTablePreview(session.backendSid, session.sheet, session.table);
279+
if (check == null) {
280+
request.session.data[IMPORTER_ERROR_KEY] =
281+
"Please select a non-empty table";
282+
response.redirect(request.get("Referrer"));
283+
return;
284+
}
285+
// Get header range, for tables this will check the column names against the first row of the table.
286+
// If they match that first row will be designated as the headerRange, otherwise it will be null.
287+
headerRange = sheets_lib.GetTableHeader(session.backendSid, session.sheet, session.table)
288+
console.debug(headerRange)
289+
if (headerRange != null) {
290+
session.headerRange = headerRange //overwrite assumed header range with table header range
291+
}
275292
}
276-
277-
console.debug(session.footerRange)
278-
279-
session.table = request.body.table;
280293

281-
let check = sheets_lib.GetTablePreview(session.backendSid, session.sheet, session.table);
282-
if (check == null) {
283-
request.session.data[IMPORTER_ERROR_KEY] =
284-
"Please select a non-empty table";
285-
response.redirect(request.get("Referrer"));
286-
return;
287-
}
288-
289-
// In some cases, the user will next select a header row which tells us where
290-
// the headers are. Sometimes, this will not be part of the flow, and so we
291-
// should default to the first row in the sheet.
292-
headerRange = sheets_lib.GetTableHeader(session.backendSid, session.sheet, session.table)
293-
console.debug("header range", headerRange);
294-
if (headerRange == null) {
295-
request.session.data[IMPORTER_ERROR_KEY] =
296-
"Column names for table are not in the first row";
297-
response.redirect(request.get("Referrer"));
298-
return;
299-
}
300-
301-
session.headerRange = headerRange //overwrite assumed header range with table header range
302-
303294
// The user
304295

305296
// Ensure the session is persisted. Currently in session, eventually another way
306297
request.session.data[IMPORTER_SESSION_KEY] = session;
298+
299+
if (headerRange == null) {
300+
redirectOnwards(request, response);
301+
return;
302+
}
307303

308304
if ("other" in request.query) {
309305
const otherPage = decodeURIComponent(request.query.other)

lib/importer/src/session.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,17 @@ class Session {
1616

1717
this.fields = p.fields;
1818
this.sheet = p.sheet ?? "";
19+
this.table = p.table ?? "";
1920
}
2021

2122
get sheets() {
2223
return backend.SessionGetSheets(this.backendSid)
2324
}
2425

26+
get tables() {
27+
return backend.SessionGetTables(this.backendSid, this.sheet)
28+
}
29+
2530
get headerRange() {
2631
return backend.SessionGetHeaderRange(this.backendSid, this.sheet)
2732
}

0 commit comments

Comments
 (0)