diff --git a/src/core/js/ext_xls_download.js b/src/core/js/ext_xls_download.js index ebeb2ac94ca7bd84cc41ffef7bf3d1abc1982875..d80bf4efa539f483811ca1d3b7f85b817489a572 100644 --- a/src/core/js/ext_xls_download.js +++ b/src/core/js/ext_xls_download.js @@ -83,7 +83,7 @@ var caosdb_table_export = new function () { const table = $('.caosdb-select-table'); return table.find("th").toArray() .map(e => caosdb_table_export._clean_cell(e.textContent)) - .filter(e => e.length > 0); + .filter(e => e.length > 0 && e.toLowerCase() != "id" && e.toLowerCase() != "version"); } /** @@ -124,7 +124,7 @@ var caosdb_table_export = new function () { */ this._create_tsv_string = function (entities, columns, raw) { logger.trace("enter _create_tsv_string ", entities, columns); - var header = "ID\t" + columns.join("\t") + "\n" + var header = "ID\tVersion\t" + columns.join("\t") + "\n" var rows = []; for (const table_row of entities) { rows.push(caosdb_table_export._get_entity_row(table_row, columns, raw).join("\t")); @@ -146,7 +146,7 @@ var caosdb_table_export = new function () { * @return {string[]} */ this._get_entity_row = function (entity, columns, raw) { - var cells = [getEntityID(entity)]; + var cells = [getEntityID(entity), getEntityVersion(entity)]; var properties = getProperties(entity); for (const column of columns) { diff --git a/src/core/xsl/query.xsl b/src/core/xsl/query.xsl index ca1884aea16d59c7df92de304d3154698dc471bf..44d1c1bd6cff8f4b22138c1287af15713069ed79 100644 --- a/src/core/xsl/query.xsl +++ b/src/core/xsl/query.xsl @@ -149,7 +149,7 @@ <thead> <tr> <th></th> - <xsl:for-each select="Selector[@name!='id']"> + <xsl:for-each select="Selector"> <th> <xsl:value-of select="@name"/> </th> @@ -160,6 +160,8 @@ <xsl:for-each select="/Response/*[@id]"> <xsl:call-template name="select-table-row"> <xsl:with-param name="entity-id" select="@id"/> + <xsl:with-param name="version-id" select="Version/@id"/> + <xsl:with-param name="ishead" select="Version/@head"/> </xsl:call-template> </xsl:for-each> </tbody> @@ -170,9 +172,14 @@ </xsl:template> <xsl:template name="entity-link"> <xsl:param name="entity-id"/> + <xsl:param name="version-id"/> + <xsl:param name="ishead"/> <a class="btn btn-default btn-sm caosdb-select-id"> <xsl:attribute name="href"> <xsl:value-of select="concat($entitypath, $entity-id)"/> + <xsl:if test="$version-id and not($ishead)"> + <xsl:value-of select="concat('@', $version-id)"/> + </xsl:if> </xsl:attribute> <!-- <xsl:value-of select="$entity-id" /> --> <span class="caosdb-select-id-target"> @@ -183,18 +190,26 @@ <xsl:template name="select-table-row"> <xsl:param name="entity-id"/> + <xsl:param name="version-id"/> + <xsl:param name="ishead"/> <tr> <xsl:attribute name="data-entity-id"> <xsl:value-of select="$entity-id"/> </xsl:attribute> + <xsl:attribute name="data-version-id"> + <xsl:value-of select="$version-id"/> + </xsl:attribute> <td> <xsl:call-template name="entity-link"> <xsl:with-param name="entity-id" select="$entity-id"/> + <xsl:with-param name="version-id" select="$version-id"/> + <xsl:with-param name="ishead" select="$ishead"/> </xsl:call-template> </td> <xsl:for-each select="/Response/Query/Selection/Selector"> <xsl:call-template name="select-table-cell"> <xsl:with-param name="entity-id" select="$entity-id"/> + <xsl:with-param name="version-id" select="$version-id"/> <xsl:with-param name="field-name" select="translate(@name, $uppercase, $lowercase)"/> </xsl:call-template> </xsl:for-each> @@ -203,13 +218,15 @@ <xsl:template name="select-table-cell"> <xsl:param name="entity-id"/> + <xsl:param name="version-id"/> <xsl:param name="field-name"/> <td class="caosdb-f-entity-property"> <xsl:attribute name="data-property-name"> <xsl:value-of select="$field-name"/> </xsl:attribute> <div class="caosdb-f-property-value caosdb-v-property-value"> - <xsl:apply-templates select="/Response/*[@id=$entity-id]" mode="walk-select-segments"> + <xsl:apply-templates select="/Response/*[@id=$entity-id and Version/@id=$version-id]" mode="walk-select-segments"> + <!--<xsl:apply-templates select="/Response/*[@id=$entity-id]" mode="walk-select-segments">--> <xsl:with-param name="first-segment"> <xsl:value-of select="substring-before(concat($field-name, '.'), '.')"/> </xsl:with-param> @@ -223,9 +240,28 @@ <xsl:template match="Property" mode="walk-select-segments"> <!-- handle properties --> + <xsl:param name="first-segment"/> <xsl:param name="next-segments"/> <xsl:choose> + <xsl:when test="@*[translate($first-segment, $uppercase, $lowercase)=name()]"> + <!--handle attributes--> + <xsl:call-template name="single-value"> + <xsl:with-param name="value"> + <xsl:value-of select="@*[translate(name(), $uppercase, $lowercase)=$first-segment]"/> + </xsl:with-param> + </xsl:call-template> + </xsl:when> + + <xsl:when test="translate($first-segment, $uppercase, $lowercase)='version'"> + <!--handle version--> + <xsl:call-template name="single-value"> + <xsl:with-param name="value"> + <xsl:value-of select="Version/@id"/> + </xsl:with-param> + </xsl:call-template> + </xsl:when> + <xsl:when test="$next-segments='value'"> <!--handle value--> <xsl:apply-templates mode="property-value" select="."/> @@ -274,6 +310,15 @@ </xsl:call-template> </xsl:when> + <xsl:when test="translate($first-segment, $uppercase, $lowercase)='version'"> + <!--handle version--> + <xsl:call-template name="single-value"> + <xsl:with-param name="value"> + <xsl:value-of select="Version/@id"/> + </xsl:with-param> + </xsl:call-template> + </xsl:when> + <xsl:when test="$next-segments"> <!-- when there is a next-segmenst --> <xsl:apply-templates select="Property[translate(@name, $uppercase, $lowercase)=$first-segment]" mode="walk-select-segments"> diff --git a/test/core/js/modules/ext_xls_download.js.js b/test/core/js/modules/ext_xls_download.js.js index 997a89ec21d4a22f49746cbda1c46bb56268f80d..2a5c3ff1fab7ab92bfd2de24bdc83151a2a5823b 100644 --- a/test/core/js/modules/ext_xls_download.js.js +++ b/test/core/js/modules/ext_xls_download.js.js @@ -115,17 +115,17 @@ QUnit.test("_get_property_value", function(assert) { QUnit.test("_get_tsv_string", function(assert) { const table = this.test_case_1; const entities = $(table).find("tbody tr").toArray(); - assert.equal(entities.length, 2, "two example entities"); + assert.equal(entities.length, 3, "three example entities"); - var f = caosdb_table_export._create_tsv_string + var f = caosdb_table_export._create_tsv_string var tsv_string = f(entities, ["Bag", "Number"], true); var prefix = "data:text/csv;charset=utf-8," assert.equal(tsv_string, - "ID\tBag\tNumber\n242\t6366, 6406, 6407, 6408, 6409, 6410, 6411, 6412, 6413\t02 8 4aaa a\n2112\t\t1101", "tsv generated"); + "ID\tBag\tNumber\n242\t6366, 6406, 6407, 6408, 6409, 6410, 6411, 6412, 6413\t02 8 4aaa a\n2112\t\t1101\n2112\t\t1102", "tsv generated"); tsv_string = caosdb_table_export._encode_tsv_string(tsv_string); assert.equal(tsv_string.slice(0,prefix.length), prefix); - assert.equal(decodeURIComponent(tsv_string.slice(prefix.length, tsv_string.length)), - "ID\tBag\tNumber\n242\t6366, 6406, 6407, 6408, 6409, 6410, 6411, 6412, 6413\t02 8 4aaa a\n2112\t\t1101", "tsv generated"); + assert.equal(decodeURIComponent(tsv_string.slice(prefix.length, tsv_string.length)), + "ID\tBag\tNumber\n242\t6366, 6406, 6407, 6408, 6409, 6410, 6411, 6412, 6413\t02 8 4aaa a\n2112\t\t1101\n2112\t\t1102", "tsv generated"); }); QUnit.test("_get_property_value", function (assert) { diff --git a/test/core/xml/table_export/test_case_select_table_1.xml b/test/core/xml/table_export/test_case_select_table_1.xml index ae0a856f106557be3712f303b06a99f6220ef827..be07fd42df8bc1275ab16802c0e82c19ece417ad 100644 --- a/test/core/xml/table_export/test_case_select_table_1.xml +++ b/test/core/xml/table_export/test_case_select_table_1.xml @@ -9,6 +9,7 @@ </Selection> </Query> <Record id="242"> + <Version id="abc123" head="true"/> <Property id="117" name="Number" datatype="TEXT" importance="FIX"> 02	8


4aaa	a </Property> @@ -35,10 +36,19 @@ </Property> </Record> <Record id="2112"> + <Version id="abc124" head="true"/> <Property id="117" name="Number" datatype="TEXT" importance="FIX"> 1101 </Property> <Property id="104" name="Bag" datatype="LIST<Bag>" importance="FIX"> </Property> </Record> + <Record id="2112"> + <Version id="abc125" head="true"/> + <Property id="117" name="Number" datatype="TEXT" importance="FIX"> + 1102 + </Property> + <Property id="104" name="Bag" datatype="LIST<Bag>" importance="FIX"> + </Property> + </Record> </Response>