Files
Cloud-CMS/modules/templates/dataset-static.xml

3687 lines
128 KiB
XML
Raw Permalink Normal View History

2025-12-02 10:32:59 -05:00
<!--
~ Copyright (C) 2024 Xibo Signage Ltd
~
~ Xibo - Digital Signage - https://xibosignage.com
~
~ This file is part of Xibo.
~
~ Xibo is free software: you can redistribute it and/or modify
~ it under the terms of the GNU Affero General Public License as published by
~ the Free Software Foundation, either version 3 of the License, or
~ any later version.
~
~ Xibo is distributed in the hope that it will be useful,
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
~ GNU Affero General Public License for more details.
~
~ You should have received a copy of the GNU Affero General Public License
~ along with Xibo. If not, see <http://www.gnu.org/licenses/>.
-->
<templates>
<template>
<id>dataset_table_custom_html</id>
<type>static</type>
<dataType>dataset</dataType>
<showIn>none</showIn>
<properties>
<property id="styleSheet" type="code" allowLibraryRefs="true" variant="css">
<title>Optional Stylesheet Template</title>
</property>
<property id="javaScript" type="code" allowLibraryRefs="true" variant="javascript">
<title>Optional JavaScript</title>
<helpText>Add JavaScript to be included immediately before the closing body tag. Do not use [] array notation as this is reserved for library references. Do not include script tags.</helpText>
</property>
<property type="message">
<title>Select a dataset to display appearance options.</title>
<visibility>
<test>
<condition field="dataSetId" type="eq"></condition>
</test>
</visibility>
</property>
<property type="message">
<title>Below you can select the columns to be shown in the table - drag and drop to reorder and to move between lists.</title>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="columns" type="datasetColumnSelector">
<dependsOn>dataSetId</dependsOn>
<title>Item Template</title>
<helpText>Enter text in the box below, used to display each article.</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="noDataMessage" type="richText" allowLibraryRefs="true" variant="html">
<title>No data message</title>
<helpText>A message to display when no data is returned from the source</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="dateFormat" type="text" variant="dateFormat">
<title>Date Format</title>
<helpText>The format to apply to all dates returned by the Widget.</helpText>
<default>#DATE_FORMAT#</default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="showHeadings" type="checkbox">
<title>Show the table headings?</title>
<helpText>Should the Table headings be shown?</helpText>
<default>1</default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="rowsPerPage" type="number">
<title>Rows per page</title>
<helpText>Please enter the number of rows per page. 0 for no pages.</helpText>
<default>0</default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="fontFamily" type="fontSelector">
<title>Font</title>
<helpText>Select a custom font - leave empty to use the default font.</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="fontSize" type="number">
<title>Font Size</title>
<helpText>Set the font size</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property type="header" variant="main">
<title>Colours</title>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="backgroundColor" type="color">
<title>Background Colour</title>
<helpText>Use the colour picker to select the background colour</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="borderColor" type="color">
<title>Border Colour</title>
<helpText>Use the colour picker to select the border colour</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="fontColor" type="color">
<title>Font Colour</title>
<helpText>Use the colour picker to select the font colour</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
</properties>
<stencil>
<twig><![CDATA[
{% if javaScript %}<script type="text/javascript">{{javaScript|raw}}</script>{% endif %}
<div id="DataSetTableContainer"></div>
]]></twig>
<style><![CDATA[
{{styleSheet|raw}}
]]></style>
</stencil>
<onTemplateRender><![CDATA[
// Show no data message
if (items.length <= 0 && properties.noDataMessage && properties.noDataMessage !== '') {
$(target).html(properties.noDataMessage);
// Scale the layout
$(target).xiboLayoutScaler(properties);
// Image render
$(target).find('img').xiboImageRender(properties);
// Don't render the rest
return;
}
// Columns to be shown in the table
var columnIndex = JSON.parse(properties.columns);
var columns = [];
if (meta && meta.mapping) {
meta.mapping.forEach((column) => {
if (column.dataSetColumnId !== '' && columnIndex.indexOf(column.dataSetColumnId) !== -1) {
columns[columnIndex.indexOf(column.dataSetColumnId)] = column;
}
});
}
// Get table element
var $datasetTableContainer = $(target).find('#DataSetTableContainer');
// Clear the table container
$datasetTableContainer.empty();
// Calculate number of pages
var totalPages = (properties.rowsPerPage > 0) ? Math.ceil(items.length / properties.rowsPerPage) : 1;
// Set the number of pages to the table
$datasetTableContainer.data('totalPages', totalPages);
// Create a table for each page
for (var i = 0; i < totalPages; i++) {
// Create a new table
var $newTable = properties.rowsPerPage > 0 ?
$('<table class="DataSetTable" data-page="' + i + '">') :
$('<table class="DataSetTable">');
// Show the table headings if required
if (properties.showHeadings == 1) {
// Build the headings
var headings = columns.map(function (column, colIdx) {
return '<th class="DataSetColumnHeaderCell">' + column.heading + '</th>';
});
// Add the headings to the table
$newTable.append(
$('<thead>')
.append(
$('<tr class="HeaderRow">')
.append(headings)
)
);
}
// Append table body
$newTable.append(
$('<tbody>')
);
// Add the table to the container
$datasetTableContainer.append($newTable);
}
// Add rows to the tables per page
for (var i = 0; i < items.length; i++) {
// Get the table for this row
var $table = (properties.rowsPerPage > 0) ?
$datasetTableContainer.find('.DataSetTable[data-page="' + Math.floor(i / properties.rowsPerPage) + '"]') :
$datasetTableContainer.find('.DataSetTable');
// Build the row content based on the columns
var rowContent = columns.map(function (column, colIdx) {
var value = items[i][column.heading];
// If it's a date and we have date format
if (column.dataTypeId === 3 && properties.dateFormat) {
value = moment(value).format(properties.dateFormat);
}
// If this is an image column, wrap it in an image tag
if (column.dataTypeId === 4 || column.dataTypeId === 5) {
value = value ? '<img src="' + value + '" />' : '';
}
// Empty string if value is null
if (value === null) {
value = '';
}
return '<td class="DataSetColumn DataSetColumn_' + colIdx + '" id="column_' + (colIdx + 1) + '"><span class="DataSetCellSpan DataSetCellSpan_' + i + '_' + colIdx + '" id="span_' + i + '_' + (colIdx + 1) + '">' + value + '</span></td>';
}).join('');
// Add the row to the table's body
$table.find('tbody').append(
'<tr class="DataSetRow DataSetRow' + ((i % 2) ? 'Odd' : 'Even') + '" id="row_' + i + '">' +
rowContent +
'</tr>'
);
}
// Move table container into content
$datasetTableContainer.appendTo($(target).find('#content'));
// Scale the layout
$(target).xiboLayoutScaler(properties);
// Call render
$datasetTableContainer.dataSetRender(properties);
// Image render
$datasetTableContainer.find('img').xiboImageRender(properties);
]]></onTemplateRender>
<assets>
<asset id="empty" type="path" mimeType="image/png" cmsOnly="true" path="/modules/assets/template-thumbnails/dataset/0-empty.png" />
</assets>
</template>
<template>
<id>dataset_custom_html</id>
<type>static</type>
<dataType>dataset</dataType>
<showIn>none</showIn>
<title>Dataset Custom HTML</title>
<properties>
<property type="message">
<title>Select a dataset to display appearance options.</title>
<visibility>
<test>
<condition field="dataSetId" type="eq"></condition>
</test>
</visibility>
</property>
<property id="template" type="code" allowLibraryRefs="true" variant="html">
<title>Item Template</title>
<helpText>Enter text in the box below, used to display each article.</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="dataSetSnippets" type="snippet" mode="dataSet" target="template">
<title>Snippets</title>
<helpText>Choose data set snippet</helpText>
<dependsOn>dataSetId</dependsOn>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="styleSheet" type="code" allowLibraryRefs="true" variant="css">
<title>Optional Stylesheet Template</title>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="javaScript" type="code" allowLibraryRefs="true" variant="javascript">
<title>Optional JavaScript</title>
<helpText>Add JavaScript to be included immediately before the closing body tag. Do not use [] array notation as this is reserved for library references. Do not include script tags.</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="itemsSideBySide" type="checkbox">
<title>Show items side by side?</title>
<helpText>Should items be shown side by side?</helpText>
<default>0</default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="backgroundColor" type="color">
<title>Background Colour</title>
<helpText>The selected effect works best with a background colour. Optionally add one here.</helpText>
<default></default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="effect" type="effectSelector" variant="all">
<title>Effect</title>
<helpText>Please select the effect that will be used to transition between items.</helpText>
<default>noTransition</default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="speed" type="number">
<title>Speed</title>
<helpText>The transition speed of the selected effect in milliseconds (normal = 1000) or the Marquee Speed in a low to high scale (normal = 1)</helpText>
<default>1000</default>
<visibility>
<test type="and">
<condition field="effect" type="neq">none</condition>
<condition field="effect" type="neq">noTransition</condition>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="itemsPerPage" type="number">
<title>Items per page</title>
<helpText>If an effect has been selected, how many pages should we split the items across? If you don't enter anything here 1 item will be put on each page.</helpText>
<default>1</default>
<visibility>
<test type="and">
<condition field="effect" type="neq">none</condition>
<condition field="effect" type="neq">marqueeLeft</condition>
<condition field="effect" type="neq">marqueeRight</condition>
<condition field="effect" type="neq">marqueeUp</condition>
<condition field="effect" type="neq">marqueeDown</condition>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="noDataMessage" type="richText" allowLibraryRefs="true" variant="html">
<title>No data message</title>
<helpText>A message to display when no data is returned from the source</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
</properties>
<preview></preview>
<stencil>
<twig><![CDATA[
{% if javaScript %}
<script type="text/javascript">
{{javaScript|raw}}
</script>
{% endif %}
]]></twig>
<style><![CDATA[
{% if itemsSideBySide %}
.item, .page {
float: left;
}
{% endif %}
{% if backgroundColor != '' %}
body {
background-color: {{ backgroundColor }} !important;
}
{% endif %}
{{styleSheet|raw}}
]]></style>
</stencil>
<onTemplateRender><![CDATA[
// Module renderer options
// id: The id of the widget
// target: The target element to render
// items: The items to render
// properties: The properties for the widget
// Show no data message
if (items.length <= 0 && properties.noDataMessage && properties.noDataMessage !== '') {
$(target).html(properties.noDataMessage);
// Scale the layout
$(target).xiboLayoutScaler(properties);
// Image render
$(target).find('img').xiboImageRender(properties);
// Don't render the rest
return;
}
// Clear the content container
$(target).find('#content').empty();
// If we don't have metadata, we can't render anything
if (!meta || !meta.mapping) {
return;
}
// Get dataset columns from meta.mapping
var columnTypes = {};
for (var i = 0; i < meta.mapping.length; i++) {
var column = meta.mapping[i];
columnTypes[column.dataSetColumnId] = {
type: column.dataTypeId
};
}
// Add content for each item
// make replacements
// and wrap it in a div with the item class
for (var i = 0; i < items.length; i++) {
var item = items[i];
// Replace the template with the item content
var content = properties.template.replace(/\[(.*?)\]/g, function (match, column) {
var itemId = column.split('|')[0];
var itemCol = column.split('|')[1];
var itemType = (itemCol) ? columnTypes[itemCol].type : '';
var itemValue = item[itemId];
// If this is an image column, wrap it in an image tag
if (itemType === 4 || itemType === 5) {
itemValue = itemValue ? '<img src="' + itemValue + '" />' : '';
}
return itemValue ? itemValue : '';
});
// Add the content to the target
$(target).find('#content').append(
$('<div>')
.addClass('item')
.append(content)
);
}
// Scale the layout
$('body').xiboLayoutScaler(properties);
$(target).xiboTextRender(Object.assign(properties, globalOptions), $(target).find('#content > *'));
// Image render
$(target).find('img').xiboImageRender(properties);
]]></onTemplateRender>
<onTemplateVisible><![CDATA[
// Start effects for this template
$(target).xiboLayoutAnimate(properties);
]]></onTemplateVisible>
</template>
<template>
<id>dataset_table_1</id>
<type>static</type>
<dataType>dataset</dataType>
<title>Plain Table (Customisable)</title>
<thumbnail>empty</thumbnail>
<startWidth>600</startWidth>
<startHeight>350</startHeight>
<properties>
<property type="message">
<title>Select a dataset to display appearance options.</title>
<visibility>
<test>
<condition field="dataSetId" type="eq"></condition>
</test>
</visibility>
</property>
<property type="message">
<title>Below you can select the columns to be shown in the table - drag and drop to reorder and to move between lists.</title>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="columns" type="datasetColumnSelector">
<dependsOn>dataSetId</dependsOn>
<title>Item Template</title>
<helpText>Enter text in the box below, used to display each article.</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="noDataMessage" type="richText" allowLibraryRefs="true" variant="html">
<title>No data message</title>
<helpText>A message to display when no data is returned from the source</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="dateFormat" type="text" variant="dateFormat">
<title>Date Format</title>
<helpText>The format to apply to all dates returned by the Widget.</helpText>
<default>#DATE_FORMAT#</default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="showHeadings" type="checkbox">
<title>Show the table headings?</title>
<helpText>Should the Table headings be shown?</helpText>
<default>1</default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="rowsPerPage" type="number">
<title>Rows per page</title>
<helpText>Please enter the number of rows per page. 0 for no pages.</helpText>
<default>0</default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="fontFamily" type="fontSelector">
<title>Font</title>
<helpText>Select a custom font - leave empty to use the default font.</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="fontSize" type="number">
<title>Font Size</title>
<helpText>Set the font size</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property type="header" variant="main">
<title>Colours</title>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="fontColor" type="color">
<title>Font Colour</title>
<helpText>Use the colour picker to select the font colour</helpText>
<default>#111</default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="backgroundColor" type="color">
<title>Background Colour</title>
<helpText>Use the colour picker to select the background colour</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="borderColor" type="color">
<title>Border Colour</title>
<helpText>Use the colour picker to select the border colour</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="headerFontColor" type="color">
<title>Header Font Colour</title>
<helpText>Use the colour picker to select the header font colour</helpText>
<default>#111</default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="headerBackgroundColor" type="color">
<title>Header Background Colour</title>
<helpText>Use the colour picker to select the header background colour</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
</properties>
<stencil>
<twig><![CDATA[
<div class="DataSetTableContainer"></div>
]]></twig>
<style><![CDATA[
/* Template Styles */
table.DataSetTable {
width: 100%;
font-size: 14px;
table-layout: fixed;
border-collapse: collapse;
}
td.DataSetColumn img {
height: 80px;
}
/* Constructed Styles */
{% if backgroundColor %}
table.DataSetTable {
background-color: {{backgroundColor}};
}
{% endif %}
{% if borderColor %}
table.DataSetTable, table.DataSetTable tr, table.DataSetTable th, table.DataSetTable td {
border: 1px solid {{borderColor}};
}
{% endif %}
{% if fontColor %}
table.DataSetTable {
color: {{fontColor}};
}
{% endif %}
{% if headerFontColor %}
table.DataSetTable .HeaderRow {
color: {{headerFontColor}};
}
{% endif %}
{% if headerBackgroundColor %}
table.DataSetTable .HeaderRow {
background-color: {{headerBackgroundColor}};
}
{% endif %}
{% if fontFamily %}
table.DataSetTable {
font-family: {{fontFamily}};
}
{% endif %}
{% if fontSize %}
table.DataSetTable {
font-size: {{fontSize}}px;
}
{% endif %}
/* Table display CSS fix */
table.DataSetTable.cycle-slide {
display: table !important;
}
/* If we are going to cycle between pages, make sure we hide all of the tables initially */
{% if rowsPerPage > 0 %}
table.DataSetTable {visibility:hidden;}
{% endif %}
]]></style>
</stencil>
<onTemplateRender><![CDATA[
// Show no data message
if (items.length <= 0 && properties.noDataMessage && properties.noDataMessage !== '') {
$(target).html(properties.noDataMessage);
// Scale the layout
$(target).xiboLayoutScaler(properties);
// Image render
$(target).find('img').xiboImageRender(properties);
// Don't render the rest
return;
}
// Columns to be shown in the table
var columnIndex = JSON.parse(properties.columns);
var columns = [];
if (meta && meta.mapping) {
meta.mapping.forEach((column) => {
if (column.dataSetColumnId !== '' && columnIndex.indexOf(column.dataSetColumnId) !== -1) {
columns[columnIndex.indexOf(column.dataSetColumnId)] = column;
}
});
}
// Get table element
var $datasetTableContainer = $(target).find('.DataSetTableContainer');
// Clear the table container
$datasetTableContainer.empty();
// Calculate number of pages
var totalPages = (properties.rowsPerPage > 0) ? Math.ceil(items.length / properties.rowsPerPage) : 1;
// Set the number of pages to the table
$datasetTableContainer.data('totalPages', totalPages);
// Create a table for each page
for (var i = 0; i < totalPages; i++) {
// Create a new table
var $newTable = properties.rowsPerPage > 0 ?
$('<table class="DataSetTable" data-page="' + i + '">') :
$('<table class="DataSetTable">');
// Show the table headings if required
if (properties.showHeadings === 1) {
// Build the headings
var headings = columns.map(function (column, colIdx) {
return '<th class="DataSetColumnHeaderCell">' + column.heading + '</th>';
});
// Add the headings to the table
$newTable.append(
$('<thead>')
.append(
$('<tr class="HeaderRow">')
.append(headings)
)
);
}
// Append table body
$newTable.append(
$('<tbody>')
);
// Add the table to the container
$datasetTableContainer.append($newTable);
}
// Add rows to the tables per page
for (var i = 0; i < items.length; i++) {
// Get the table for this row
var $table = (properties.rowsPerPage > 0) ?
$datasetTableContainer.find('.DataSetTable[data-page="' + Math.floor(i / properties.rowsPerPage) + '"]') :
$datasetTableContainer.find('.DataSetTable');
// Build the row content based on the columns
var rowContent = columns.map(function (column, colIdx) {
var value = items[i][column.heading];
// If it's a date and we have date format
if (column.dataTypeId === 3 && properties.dateFormat) {
value = moment(value).format(properties.dateFormat);
}
// If this is an image column, wrap it in an image tag
if (column.dataTypeId === 4 || column.dataTypeId === 5) {
value = value ? '<img src="' + value + '" />' : '';
}
// Empty string if value is null
if (value === null) {
value = '';
}
return '<td class="DataSetColumn DataSetColumn_' + colIdx + '" id="column_' + (colIdx + 1) + '"><span class="DataSetCellSpan DataSetCellSpan_' + i + '_' + colIdx + '" id="span_' + i + '_' + (colIdx + 1) + '">' + value + '</span></td>';
}).join('');
// Add the row to the table's body
$table.find('tbody').append(
'<tr class="DataSetRow DataSetRow' + ((i % 2) ? 'Odd' : 'Even') + '" id="row_' + i + '">' +
rowContent +
'</tr>'
);
}
// Move table container into content
$datasetTableContainer.appendTo($(target).find('#content'));
// Scale the layout
$(target).xiboLayoutScaler(properties);
// Call render
$datasetTableContainer.dataSetRender(properties);
// Image render
$datasetTableContainer.find('img').xiboImageRender(properties);
]]></onTemplateRender>
<assets>
<asset id="empty" type="path" mimeType="image/png" cmsOnly="true" path="/modules/assets/template-thumbnails/dataset/0-empty.png" />
</assets>
</template>
<template>
<id>dataset_table_2</id>
<type>static</type>
<dataType>dataset</dataType>
<title>A light green background with darker green borders. White heading text.</title>
<thumbnail>light-green</thumbnail>
<startWidth>600</startWidth>
<startHeight>350</startHeight>
<properties>
<property type="message">
<title>Select a dataset to display appearance options.</title>
<visibility>
<test>
<condition field="dataSetId" type="eq"></condition>
</test>
</visibility>
</property>
<property type="message">
<title>Below you can select the columns to be shown in the table - drag and drop to reorder and to move between lists.</title>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="columns" type="datasetColumnSelector">
<dependsOn>dataSetId</dependsOn>
<title>Item Template</title>
<helpText>Enter text in the box below, used to display each article.</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="noDataMessage" type="richText" allowLibraryRefs="true" variant="html">
<title>No data message</title>
<helpText>A message to display when no data is returned from the source</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="dateFormat" type="text" variant="dateFormat">
<title>Date Format</title>
<helpText>The format to apply to all dates returned by the Widget.</helpText>
<default>#DATE_FORMAT#</default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="showHeadings" type="checkbox">
<title>Show the table headings?</title>
<helpText>Should the Table headings be shown?</helpText>
<default>1</default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="rowsPerPage" type="number">
<title>Rows per page</title>
<helpText>Please enter the number of rows per page. 0 for no pages.</helpText>
<default>0</default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="fontFamily" type="fontSelector">
<title>Font</title>
<helpText>Select a custom font - leave empty to use the default font.</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="fontSize" type="number">
<title>Font Size</title>
<helpText>Set the font size</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
</properties>
<stencil>
<twig><![CDATA[
<div class="DataSetTableContainer"></div>
]]></twig>
<style><![CDATA[
/* Template Styles */
table.DataSetTable {
font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
font-size: 14px;
width: 100%;
border-collapse: collapse;
table-layout: fixed;
}
tr.HeaderRow {
font-size: 1.1em;
text-align: center;
padding-top: 5px;
padding-bottom: 4px;
background-color: #A7C942;
color: #ffffff;
}
tr#row_1 {
color: #000000;
background-color: #EAF2D3;
}
td#col_1 {
color: #000000;
background-color: #EAF2D3;
}
td.DataSetColumn {
color: #000000;
background-color: #EAF2D3;
border: 1px solid #98bf21
}
td.DataSetColumn img {
max-width: 100%;
max-height: 50px;
display: block;
margin-left: auto;
margin-right: auto;
}
tr.DataSetRow {
text-align: center;
color: #000000;
background-color: #EAF2D3;
border: 1px solid #98bf21 padding-top:5px;
padding-bottom: 4px;
}
th.DataSetColumnHeaderCell {
font-size: 1em;
border: 1px solid #98bf21;
padding: 3px 7px 2px 7px;
}
/* Constructed Styles */
{% if fontFamily %}
table.DataSetTable {
font-family: {{fontFamily}};
}
{% endif %}
{% if fontSize %}
table.DataSetTable {
font-size: {{fontSize}}px;
}
{% endif %}
/* Table display CSS fix */
table.DataSetTable.cycle-slide {
display: table !important;
}
/* If we are going to cycle between pages, make sure we hide all of the tables initially */
{% if rowsPerPage > 0 %}
table.DataSetTable {visibility:hidden;}
{% endif %}
]]></style>
</stencil>
<onTemplateRender><![CDATA[
// Show no data message
if (items.length <= 0 && properties.noDataMessage && properties.noDataMessage !== '') {
$(target).html(properties.noDataMessage);
// Scale the layout
$(target).xiboLayoutScaler(properties);
// Image render
$(target).find('img').xiboImageRender(properties);
// Don't render the rest
return;
}
// Columns to be shown in the table
var columnIndex = JSON.parse(properties.columns);
var columns = [];
if (meta && meta.mapping) {
meta.mapping.forEach((column) => {
if (column.dataSetColumnId !== '' && columnIndex.indexOf(column.dataSetColumnId) !== -1) {
columns[columnIndex.indexOf(column.dataSetColumnId)] = column;
}
});
}
// Get table element
var $datasetTableContainer = $(target).find('.DataSetTableContainer');
// Clear the table container
$datasetTableContainer.empty();
// Calculate number of pages
var totalPages = (properties.rowsPerPage > 0) ? Math.ceil(items.length / properties.rowsPerPage) : 1;
// Set the number of pages to the table
$datasetTableContainer.data('totalPages', totalPages);
// Create a table for each page
for (var i = 0; i < totalPages; i++) {
// Create a new table
var $newTable = properties.rowsPerPage > 0 ?
$('<table class="DataSetTable" data-page="' + i + '">') :
$('<table class="DataSetTable">');
// Show the table headings if required
if (properties.showHeadings === 1) {
// Build the headings
var headings = columns.map(function (column, colIdx) {
return '<th class="DataSetColumnHeaderCell">' + column.heading + '</th>';
});
// Add the headings to the table
$newTable.append(
$('<thead>')
.append(
$('<tr class="HeaderRow">')
.append(headings)
)
);
}
// Append table body
$newTable.append(
$('<tbody>')
);
// Add the table to the container
$datasetTableContainer.append($newTable);
}
// Add rows to the tables per page
for (var i = 0; i < items.length; i++) {
// Get the table for this row
var $table = (properties.rowsPerPage > 0) ?
$datasetTableContainer.find('.DataSetTable[data-page="' + Math.floor(i / properties.rowsPerPage) + '"]') :
$datasetTableContainer.find('.DataSetTable');
// Build the row content based on the columns
var rowContent = columns.map(function (column, colIdx) {
var value = items[i][column.heading];
// If it's a date and we have date format
if (column.dataTypeId === 3 && properties.dateFormat) {
value = moment(value).format(properties.dateFormat);
}
// If this is an image column, wrap it in an image tag
if (column.dataTypeId === 4 || column.dataTypeId === 5) {
value = value ? '<img src="' + value + '" />' : '';
}
// Empty string if value is null
if (value === null) {
value = '';
}
return '<td class="DataSetColumn DataSetColumn_' + colIdx + '" id="column_' + (colIdx + 1) + '"><span class="DataSetCellSpan DataSetCellSpan_' + i + '_' + colIdx + '" id="span_' + i + '_' + (colIdx + 1) + '">' + value + '</span></td>';
}).join('');
// Add the row to the table's body
$table.find('tbody').append(
'<tr class="DataSetRow DataSetRow' + ((i % 2) ? 'Odd' : 'Even') + '" id="row_' + i + '">' +
rowContent +
'</tr>'
);
}
// Move table container into content
$datasetTableContainer.appendTo($(target).find('#content'));
// Scale the layout
$(target).xiboLayoutScaler(properties);
// Call render
$datasetTableContainer.dataSetRender(properties);
// Image render
$datasetTableContainer.find('img').xiboImageRender(properties);
]]></onTemplateRender>
<assets>
<asset id="light-green" type="path" mimeType="image/png" cmsOnly="true" path="/modules/assets/template-thumbnails/dataset/1-light-green.png" />
</assets>
</template>
<template>
<id>dataset_table_3</id>
<type>static</type>
<dataType>dataset</dataType>
<title>Simple white table with rounded rows.</title>
<thumbnail>simple-round-table</thumbnail>
<startWidth>600</startWidth>
<startHeight>350</startHeight>
<properties>
<property type="message">
<title>Select a dataset to display appearance options.</title>
<visibility>
<test>
<condition field="dataSetId" type="eq"></condition>
</test>
</visibility>
</property>
<property type="message">
<title>Below you can select the columns to be shown in the table - drag and drop to reorder and to move between lists.</title>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="columns" type="datasetColumnSelector">
<dependsOn>dataSetId</dependsOn>
<title>Item Template</title>
<helpText>Enter text in the box below, used to display each article.</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="noDataMessage" type="richText" allowLibraryRefs="true" variant="html">
<title>No data message</title>
<helpText>A message to display when no data is returned from the source</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="dateFormat" type="text" variant="dateFormat">
<title>Date Format</title>
<helpText>The format to apply to all dates returned by the Widget.</helpText>
<default>#DATE_FORMAT#</default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="showHeadings" type="checkbox">
<title>Show the table headings?</title>
<helpText>Should the Table headings be shown?</helpText>
<default>1</default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="rowsPerPage" type="number">
<title>Rows per page</title>
<helpText>Please enter the number of rows per page. 0 for no pages.</helpText>
<default>0</default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="fontFamily" type="fontSelector">
<title>Font</title>
<helpText>Select a custom font - leave empty to use the default font.</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="fontSize" type="number">
<title>Font Size</title>
<helpText>Set the font size</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
</properties>
<stencil>
<twig><![CDATA[
<div class="DataSetTableContainer"></div>
]]></twig>
<style><![CDATA[
/* Template Styles */
table.DataSetTable {
font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
width: 100%;
border-collapse: collapse;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
table-layout: fixed;
font-size: 14px;
color: #3b3b3b;
}
tr.HeaderRow {
font-size: 1.1em;
font-weight: 900;
color: #5e5e5e;
text-align: left;
}
td.DataSetColumn {
padding: 8px;
}
td.DataSetColumn:first-child {
border-radius: 8px 0 0 8px;
}
td.DataSetColumn:last-child {
border-radius: 0 8px 8px 0;
}
td.DataSetColumn img {
max-width: 100%;
max-height: 50px;
display: block;
margin-left: auto;
margin-right: auto;
}
tr.DataSetRow {
background-color: #f6f6f6;
border-top: 2px solid #d3d3d3;
}
th.DataSetColumnHeaderCell {
padding: 8px 8px 0px 8px;
}
/* Constructed Styles */
{% if fontFamily %}
table.DataSetTable {
font-family: {{fontFamily}};
}
{% endif %}
{% if fontSize %}
table.DataSetTable {
font-size: {{fontSize}}px;
}
{% endif %}
/* Table display CSS fix */
table.DataSetTable.cycle-slide {
display: table !important;
}
/* If we are going to cycle between pages, make sure we hide all of the tables initially */
{% if rowsPerPage > 0 %}
table.DataSetTable {visibility:hidden;}
{% endif %}
]]></style>
</stencil>
<onTemplateRender><![CDATA[
// Show no data message
if (items.length <= 0 && properties.noDataMessage && properties.noDataMessage !== '') {
$(target).html(properties.noDataMessage);
// Scale the layout
$(target).xiboLayoutScaler(properties);
// Image render
$(target).find('img').xiboImageRender(properties);
// Don't render the rest
return;
}
// Columns to be shown in the table
var columnIndex = JSON.parse(properties.columns);
var columns = [];
if (meta && meta.mapping) {
meta.mapping.forEach((column) => {
if (column.dataSetColumnId !== '' && columnIndex.indexOf(column.dataSetColumnId) !== -1) {
columns[columnIndex.indexOf(column.dataSetColumnId)] = column;
}
});
}
// Get table element
var $datasetTableContainer = $(target).find('.DataSetTableContainer');
// Clear the table container
$datasetTableContainer.empty();
// Calculate number of pages
var totalPages = (properties.rowsPerPage > 0) ? Math.ceil(items.length / properties.rowsPerPage) : 1;
// Set the number of pages to the table
$datasetTableContainer.data('totalPages', totalPages);
// Create a table for each page
for (var i = 0; i < totalPages; i++) {
// Create a new table
var $newTable = properties.rowsPerPage > 0 ?
$('<table class="DataSetTable" data-page="' + i + '">') :
$('<table class="DataSetTable">');
// Show the table headings if required
if (properties.showHeadings === 1) {
// Build the headings
var headings = columns.map(function (column, colIdx) {
return '<th class="DataSetColumnHeaderCell">' + column.heading + '</th>';
});
// Add the headings to the table
$newTable.append(
$('<thead>')
.append(
$('<tr class="HeaderRow">')
.append(headings)
)
);
}
// Append table body
$newTable.append(
$('<tbody>')
);
// Add the table to the container
$datasetTableContainer.append($newTable);
}
// Add rows to the tables per page
for (var i = 0; i < items.length; i++) {
// Get the table for this row
var $table = (properties.rowsPerPage > 0) ?
$datasetTableContainer.find('.DataSetTable[data-page="' + Math.floor(i / properties.rowsPerPage) + '"]') :
$datasetTableContainer.find('.DataSetTable');
// Build the row content based on the columns
var rowContent = columns.map(function (column, colIdx) {
var value = items[i][column.heading];
// If it's a date and we have date format
if (column.dataTypeId === 3 && properties.dateFormat) {
value = moment(value).format(properties.dateFormat);
}
// If this is an image column, wrap it in an image tag
if (column.dataTypeId === 4 || column.dataTypeId === 5) {
value = value ? '<img src="' + value + '" />' : '';
}
// Empty string if value is null
if (value === null) {
value = '';
}
return '<td class="DataSetColumn DataSetColumn_' + colIdx + '" id="column_' + (colIdx + 1) + '"><span class="DataSetCellSpan DataSetCellSpan_' + i + '_' + colIdx + '" id="span_' + i + '_' + (colIdx + 1) + '">' + value + '</span></td>';
}).join('');
// Add the row to the table's body
$table.find('tbody').append(
'<tr class="DataSetRow DataSetRow' + ((i % 2) ? 'Odd' : 'Even') + '" id="row_' + i + '">' +
rowContent +
'</tr>'
);
}
// Move table container into content
$datasetTableContainer.appendTo($(target).find('#content'));
// Scale the layout
$(target).xiboLayoutScaler(properties);
// Call render
$datasetTableContainer.dataSetRender(properties);
// Image render
$datasetTableContainer.find('img').xiboImageRender(properties);
]]></onTemplateRender>
<assets>
<asset id="simple-round-table" type="path" mimeType="image/png" cmsOnly="true" path="/modules/assets/template-thumbnails/dataset/2-simple-round-table.png" />
</assets>
</template>
<template>
<id>dataset_table_4</id>
<type>static</type>
<dataType>dataset</dataType>
<title>Striped blue table with darker blue header.</title>
<thumbnail>transparent-blue</thumbnail>
<startWidth>600</startWidth>
<startHeight>350</startHeight>
<properties>
<property type="message">
<title>Select a dataset to display appearance options.</title>
<visibility>
<test>
<condition field="dataSetId" type="eq"></condition>
</test>
</visibility>
</property>
<property type="message">
<title>Below you can select the columns to be shown in the table - drag and drop to reorder and to move between lists.</title>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="columns" type="datasetColumnSelector">
<dependsOn>dataSetId</dependsOn>
<title>Item Template</title>
<helpText>Enter text in the box below, used to display each article.</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="noDataMessage" type="richText" allowLibraryRefs="true" variant="html">
<title>No data message</title>
<helpText>A message to display when no data is returned from the source</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="dateFormat" type="text" variant="dateFormat">
<title>Date Format</title>
<helpText>The format to apply to all dates returned by the Widget.</helpText>
<default>#DATE_FORMAT#</default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="showHeadings" type="checkbox">
<title>Show the table headings?</title>
<helpText>Should the Table headings be shown?</helpText>
<default>1</default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="rowsPerPage" type="number">
<title>Rows per page</title>
<helpText>Please enter the number of rows per page. 0 for no pages.</helpText>
<default>0</default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="fontFamily" type="fontSelector">
<title>Font</title>
<helpText>Select a custom font - leave empty to use the default font.</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="fontSize" type="number">
<title>Font Size</title>
<helpText>Set the font size</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
</properties>
<stencil>
<twig><![CDATA[
<div class="DataSetTableContainer"></div>
]]></twig>
<style><![CDATA[
/* Template Styles */
table.DataSetTable {
font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
width: 100%;
border-collapse: collapse;
table-layout: fixed;
font-size: 14px;
}
tr.HeaderRow {
font-size: 1.1em;
text-align: center;
background-color: #30426a;
color: #f9f9f9;
}
td.DataSetColumn {
padding: 6px;
}
td.DataSetColumn img {
max-width: 100%;
max-height: 50px;
display: block;
margin-left: auto;
margin-right: auto;
}
tr.DataSetRow {
text-align: center;
color: #000000;
background-color: #96acde;
background-color: #96acde8e;
}
tr.DataSetRow:nth-child(even) {
background-color: #758cc1;
background-color: #758cc18e;
}
th.DataSetColumnHeaderCell {
padding-top: 8px;
padding-bottom: 6px;
}
/* Constructed Styles */
{% if fontFamily %}
table.DataSetTable {
font-family: {{fontFamily}};
}
{% endif %}
{% if fontSize %}
table.DataSetTable {
font-size: {{fontSize}}px;
}
{% endif %}
/* Table display CSS fix */
table.DataSetTable.cycle-slide {
display: table !important;
}
/* If we are going to cycle between pages, make sure we hide all of the tables initially */
{% if rowsPerPage > 0 %}
table.DataSetTable {visibility:hidden;}
{% endif %}
]]></style>
</stencil>
<onTemplateRender><![CDATA[
// Show no data message
if (items.length <= 0 && properties.noDataMessage && properties.noDataMessage !== '') {
$(target).html(properties.noDataMessage);
// Scale the layout
$(target).xiboLayoutScaler(properties);
// Image render
$(target).find('img').xiboImageRender(properties);
// Don't render the rest
return;
}
// Columns to be shown in the table
var columnIndex = JSON.parse(properties.columns);
var columns = [];
if (meta && meta.mapping) {
meta.mapping.forEach((column) => {
if (column.dataSetColumnId !== '' && columnIndex.indexOf(column.dataSetColumnId) !== -1) {
columns[columnIndex.indexOf(column.dataSetColumnId)] = column;
}
});
}
// Get table element
var $datasetTableContainer = $(target).find('.DataSetTableContainer');
// Clear the table container
$datasetTableContainer.empty();
// Calculate number of pages
var totalPages = (properties.rowsPerPage > 0) ? Math.ceil(items.length / properties.rowsPerPage) : 1;
// Set the number of pages to the table
$datasetTableContainer.data('totalPages', totalPages);
// Create a table for each page
for (var i = 0; i < totalPages; i++) {
// Create a new table
var $newTable = properties.rowsPerPage > 0 ?
$('<table class="DataSetTable" data-page="' + i + '">') :
$('<table class="DataSetTable">');
// Show the table headings if required
if (properties.showHeadings === 1) {
// Build the headings
var headings = columns.map(function (column, colIdx) {
return '<th class="DataSetColumnHeaderCell">' + column.heading + '</th>';
});
// Add the headings to the table
$newTable.append(
$('<thead>')
.append(
$('<tr class="HeaderRow">')
.append(headings)
)
);
}
// Append table body
$newTable.append(
$('<tbody>')
);
// Add the table to the container
$datasetTableContainer.append($newTable);
}
// Add rows to the tables per page
for (var i = 0; i < items.length; i++) {
// Get the table for this row
var $table = (properties.rowsPerPage > 0) ?
$datasetTableContainer.find('.DataSetTable[data-page="' + Math.floor(i / properties.rowsPerPage) + '"]') :
$datasetTableContainer.find('.DataSetTable');
// Build the row content based on the columns
var rowContent = columns.map(function (column, colIdx) {
var value = items[i][column.heading];
// If it's a date and we have date format
if (column.dataTypeId === 3 && properties.dateFormat) {
value = moment(value).format(properties.dateFormat);
}
// If this is an image column, wrap it in an image tag
if (column.dataTypeId === 4 || column.dataTypeId === 5) {
value = value ? '<img src="' + value + '" />' : '';
}
// Empty string if value is null
if (value === null) {
value = '';
}
return '<td class="DataSetColumn DataSetColumn_' + colIdx + '" id="column_' + (colIdx + 1) + '"><span class="DataSetCellSpan DataSetCellSpan_' + i + '_' + colIdx + '" id="span_' + i + '_' + (colIdx + 1) + '">' + value + '</span></td>';
}).join('');
// Add the row to the table's body
$table.find('tbody').append(
'<tr class="DataSetRow DataSetRow' + ((i % 2) ? 'Odd' : 'Even') + '" id="row_' + i + '">' +
rowContent +
'</tr>'
);
}
// Move table container into content
$datasetTableContainer.appendTo($(target).find('#content'));
// Scale the layout
$(target).xiboLayoutScaler(properties);
// Call render
$datasetTableContainer.dataSetRender(properties);
// Image render
$datasetTableContainer.find('img').xiboImageRender(properties);
]]></onTemplateRender>
<assets>
<asset id="transparent-blue" type="path" mimeType="image/png" cmsOnly="true" path="/modules/assets/template-thumbnails/dataset/3-transparent-blue.png" />
</assets>
</template>
<template>
<id>dataset_table_5</id>
<type>static</type>
<dataType>dataset</dataType>
<title>White striped table with orange header.</title>
<thumbnail>orange-grey-striped</thumbnail>
<startWidth>600</startWidth>
<startHeight>350</startHeight>
<properties>
<property type="message">
<title>Select a dataset to display appearance options.</title>
<visibility>
<test>
<condition field="dataSetId" type="eq"></condition>
</test>
</visibility>
</property>
<property type="message">
<title>Below you can select the columns to be shown in the table - drag and drop to reorder and to move between lists.</title>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="columns" type="datasetColumnSelector">
<dependsOn>dataSetId</dependsOn>
<title>Item Template</title>
<helpText>Enter text in the box below, used to display each article.</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="noDataMessage" type="richText" allowLibraryRefs="true" variant="html">
<title>No data message</title>
<helpText>A message to display when no data is returned from the source</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="dateFormat" type="text" variant="dateFormat">
<title>Date Format</title>
<helpText>The format to apply to all dates returned by the Widget.</helpText>
<default>#DATE_FORMAT#</default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="showHeadings" type="checkbox">
<title>Show the table headings?</title>
<helpText>Should the Table headings be shown?</helpText>
<default>1</default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="rowsPerPage" type="number">
<title>Rows per page</title>
<helpText>Please enter the number of rows per page. 0 for no pages.</helpText>
<default>0</default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="fontFamily" type="fontSelector">
<title>Font</title>
<helpText>Select a custom font - leave empty to use the default font.</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="fontSize" type="number">
<title>Font Size</title>
<helpText>Set the font size</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
</properties>
<stencil>
<twig><![CDATA[
<div class="DataSetTableContainer"></div>
]]></twig>
<style><![CDATA[
/* Template Styles */
table.DataSetTable {
font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
width: 100%;
border-collapse: collapse;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
table-layout: fixed;
font-size: 14px;
color: #3b3b3b;
}
tr.HeaderRow {
font-size: 1.1em;
font-weight: 900;
background-color: #ea6153;
color: #fff;
}
td.DataSetColumn {
padding: 6px;
}
td.DataSetColumn img {
max-width: 100%;
max-height: 50px;
display: block;
margin-left: auto;
margin-right: auto;
}
tr.DataSetRow {
background-color: #f6f6f6;
}
tr.DataSetRow:nth-child(even) {
background-color: #e9e9e9;
}
th.DataSetColumnHeaderCell {
padding-top: 8px;
padding-bottom: 6px;
}
/* Constructed Styles */
{% if fontFamily %}
table.DataSetTable {
font-family: {{fontFamily}};
}
{% endif %}
{% if fontSize %}
table.DataSetTable {
font-size: {{fontSize}}px;
}
{% endif %}
/* Table display CSS fix */
table.DataSetTable.cycle-slide {
display: table !important;
}
/* If we are going to cycle between pages, make sure we hide all of the tables initially */
{% if rowsPerPage > 0 %}
table.DataSetTable {visibility:hidden;}
{% endif %}
]]></style>
</stencil>
<onTemplateRender><![CDATA[
// Show no data message
if (items.length <= 0 && properties.noDataMessage && properties.noDataMessage !== '') {
$(target).html(properties.noDataMessage);
// Scale the layout
$(target).xiboLayoutScaler(properties);
// Image render
$(target).find('img').xiboImageRender(properties);
// Don't render the rest
return;
}
// Columns to be shown in the table
var columnIndex = JSON.parse(properties.columns);
var columns = [];
if (meta && meta.mapping) {
meta.mapping.forEach((column) => {
if (column.dataSetColumnId !== '' && columnIndex.indexOf(column.dataSetColumnId) !== -1) {
columns[columnIndex.indexOf(column.dataSetColumnId)] = column;
}
});
}
// Get table element
var $datasetTableContainer = $(target).find('.DataSetTableContainer');
// Clear the table container
$datasetTableContainer.empty();
// Calculate number of pages
var totalPages = (properties.rowsPerPage > 0) ? Math.ceil(items.length / properties.rowsPerPage) : 1;
// Set the number of pages to the table
$datasetTableContainer.data('totalPages', totalPages);
// Create a table for each page
for (var i = 0; i < totalPages; i++) {
// Create a new table
var $newTable = properties.rowsPerPage > 0 ?
$('<table class="DataSetTable" data-page="' + i + '">') :
$('<table class="DataSetTable">');
// Show the table headings if required
if (properties.showHeadings === 1) {
// Build the headings
var headings = columns.map(function (column, colIdx) {
return '<th class="DataSetColumnHeaderCell">' + column.heading + '</th>';
});
// Add the headings to the table
$newTable.append(
$('<thead>')
.append(
$('<tr class="HeaderRow">')
.append(headings)
)
);
}
// Append table body
$newTable.append(
$('<tbody>')
);
// Add the table to the container
$datasetTableContainer.append($newTable);
}
// Add rows to the tables per page
for (var i = 0; i < items.length; i++) {
// Get the table for this row
var $table = (properties.rowsPerPage > 0) ?
$datasetTableContainer.find('.DataSetTable[data-page="' + Math.floor(i / properties.rowsPerPage) + '"]') :
$datasetTableContainer.find('.DataSetTable');
// Build the row content based on the columns
var rowContent = columns.map(function (column, colIdx) {
var value = items[i][column.heading];
// If it's a date and we have date format
if (column.dataTypeId === 3 && properties.dateFormat) {
value = moment(value).format(properties.dateFormat);
}
// If this is an image column, wrap it in an image tag
if (column.dataTypeId === 4 || column.dataTypeId === 5) {
value = value ? '<img src="' + value + '" />' : '';
}
// Empty string if value is null
if (value === null) {
value = '';
}
return '<td class="DataSetColumn DataSetColumn_' + colIdx + '" id="column_' + (colIdx + 1) + '"><span class="DataSetCellSpan DataSetCellSpan_' + i + '_' + colIdx + '" id="span_' + i + '_' + (colIdx + 1) + '">' + value + '</span></td>';
}).join('');
// Add the row to the table's body
$table.find('tbody').append(
'<tr class="DataSetRow DataSetRow' + ((i % 2) ? 'Odd' : 'Even') + '" id="row_' + i + '">' +
rowContent +
'</tr>'
);
}
// Move table container into content
$datasetTableContainer.appendTo($(target).find('#content'));
// Scale the layout
$(target).xiboLayoutScaler(properties);
// Call render
$datasetTableContainer.dataSetRender(properties);
// Image render
$datasetTableContainer.find('img').xiboImageRender(properties);
]]></onTemplateRender>
<assets>
<asset id="orange-grey-striped" type="path" mimeType="image/png" cmsOnly="true" path="/modules/assets/template-thumbnails/dataset/4-orange-grey-striped.png" />
</assets>
</template>
<template>
<id>dataset_table_6</id>
<type>static</type>
<dataType>dataset</dataType>
<title>White and grey table with split rows.</title>
<thumbnail>split-rows-</thumbnail>
<startWidth>600</startWidth>
<startHeight>350</startHeight>
<properties>
<property type="message">
<title>Select a dataset to display appearance options.</title>
<visibility>
<test>
<condition field="dataSetId" type="eq"></condition>
</test>
</visibility>
</property>
<property type="message">
<title>Below you can select the columns to be shown in the table - drag and drop to reorder and to move between lists.</title>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="columns" type="datasetColumnSelector">
<dependsOn>dataSetId</dependsOn>
<title>Item Template</title>
<helpText>Enter text in the box below, used to display each article.</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="noDataMessage" type="richText" allowLibraryRefs="true" variant="html">
<title>No data message</title>
<helpText>A message to display when no data is returned from the source</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="dateFormat" type="text" variant="dateFormat">
<title>Date Format</title>
<helpText>The format to apply to all dates returned by the Widget.</helpText>
<default>#DATE_FORMAT#</default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="showHeadings" type="checkbox">
<title>Show the table headings?</title>
<helpText>Should the Table headings be shown?</helpText>
<default>1</default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="rowsPerPage" type="number">
<title>Rows per page</title>
<helpText>Please enter the number of rows per page. 0 for no pages.</helpText>
<default>0</default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="fontFamily" type="fontSelector">
<title>Font</title>
<helpText>Select a custom font - leave empty to use the default font.</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="fontSize" type="number">
<title>Font Size</title>
<helpText>Set the font size</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
</properties>
<stencil>
<twig><![CDATA[
<div class="DataSetTableContainer"></div>
]]></twig>
<style><![CDATA[
/* Template Styles */
table.DataSetTable {
font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
width: 100%;
border-collapse: collapse;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
table-layout: fixed;
font-size: 14px;
color: #3b3b3b;
}
tr.HeaderRow {
font-size: 1.1em;
font-weight: 900;
background-color: #95A5A6;
color: #222;
text-align: left;
}
td.DataSetColumn {
padding: 8px;
}
td.DataSetColumn img {
max-width: 100%;
max-height: 50px;
display: block;
margin-left: auto;
margin-right: auto;
}
tr.DataSetRow {
background-color: #f6f6f6;
border-bottom: 6px solid #95a5a6;
}
th.DataSetColumnHeaderCell {
padding: 8px;
padding-top: 8px;
}
/* Constructed Styles */
{% if fontFamily %}
table.DataSetTable {
font-family: {{fontFamily}};
}
{% endif %}
{% if fontSize %}
table.DataSetTable {
font-size: {{fontSize}}px;
}
{% endif %}
/* Table display CSS fix */
table.DataSetTable.cycle-slide {
display: table !important;
}
/* If we are going to cycle between pages, make sure we hide all of the tables initially */
{% if rowsPerPage > 0 %}
table.DataSetTable {visibility:hidden;}
{% endif %}
]]></style>
</stencil>
<onTemplateRender><![CDATA[
// Show no data message
if (items.length <= 0 && properties.noDataMessage && properties.noDataMessage !== '') {
$(target).html(properties.noDataMessage);
// Scale the layout
$(target).xiboLayoutScaler(properties);
// Image render
$(target).find('img').xiboImageRender(properties);
// Don't render the rest
return;
}
// Columns to be shown in the table
var columnIndex = JSON.parse(properties.columns);
var columns = [];
if (meta && meta.mapping) {
meta.mapping.forEach((column) => {
if (column.dataSetColumnId !== '' && columnIndex.indexOf(column.dataSetColumnId) !== -1) {
columns[columnIndex.indexOf(column.dataSetColumnId)] = column;
}
});
}
// Get table element
var $datasetTableContainer = $(target).find('.DataSetTableContainer');
// Clear the table container
$datasetTableContainer.empty();
// Calculate number of pages
var totalPages = (properties.rowsPerPage > 0) ? Math.ceil(items.length / properties.rowsPerPage) : 1;
// Set the number of pages to the table
$datasetTableContainer.data('totalPages', totalPages);
// Create a table for each page
for (var i = 0; i < totalPages; i++) {
// Create a new table
var $newTable = properties.rowsPerPage > 0 ?
$('<table class="DataSetTable" data-page="' + i + '">') :
$('<table class="DataSetTable">');
// Show the table headings if required
if (properties.showHeadings === 1) {
// Build the headings
var headings = columns.map(function (column, colIdx) {
return '<th class="DataSetColumnHeaderCell">' + column.heading + '</th>';
});
// Add the headings to the table
$newTable.append(
$('<thead>')
.append(
$('<tr class="HeaderRow">')
.append(headings)
)
);
}
// Append table body
$newTable.append(
$('<tbody>')
);
// Add the table to the container
$datasetTableContainer.append($newTable);
}
// Add rows to the tables per page
for (var i = 0; i < items.length; i++) {
// Get the table for this row
var $table = (properties.rowsPerPage > 0) ?
$datasetTableContainer.find('.DataSetTable[data-page="' + Math.floor(i / properties.rowsPerPage) + '"]') :
$datasetTableContainer.find('.DataSetTable');
// Build the row content based on the columns
var rowContent = columns.map(function (column, colIdx) {
var value = items[i][column.heading];
// If it's a date and we have date format
if (column.dataTypeId === 3 && properties.dateFormat) {
value = moment(value).format(properties.dateFormat);
}
// If this is an image column, wrap it in an image tag
if (column.dataTypeId === 4 || column.dataTypeId === 5) {
value = value ? '<img src="' + value + '" />' : '';
}
// Empty string if value is null
if (value === null) {
value = '';
}
return '<td class="DataSetColumn DataSetColumn_' + colIdx + '" id="column_' + (colIdx + 1) + '"><span class="DataSetCellSpan DataSetCellSpan_' + i + '_' + colIdx + '" id="span_' + i + '_' + (colIdx + 1) + '">' + value + '</span></td>';
}).join('');
// Add the row to the table's body
$table.find('tbody').append(
'<tr class="DataSetRow DataSetRow' + ((i % 2) ? 'Odd' : 'Even') + '" id="row_' + i + '">' +
rowContent +
'</tr>'
);
}
// Move table container into content
$datasetTableContainer.appendTo($(target).find('#content'));
// Scale the layout
$(target).xiboLayoutScaler(properties);
// Call render
$datasetTableContainer.dataSetRender(properties);
// Image render
$datasetTableContainer.find('img').xiboImageRender(properties);
]]></onTemplateRender>
<assets>
<asset id="split-rows-" type="path" mimeType="image/png" cmsOnly="true" path="/modules/assets/template-thumbnails/dataset/5-split-rows-.png" />
</assets>
</template>
<template>
<id>dataset_table_7</id>
<type>static</type>
<dataType>dataset</dataType>
<title>A dark table with round borders and yellow heading text.</title>
<thumbnail>dark-round</thumbnail>
<startWidth>600</startWidth>
<startHeight>350</startHeight>
<properties>
<property type="message">
<title>Select a dataset to display appearance options.</title>
<visibility>
<test>
<condition field="dataSetId" type="eq"></condition>
</test>
</visibility>
</property>
<property type="message">
<title>Below you can select the columns to be shown in the table - drag and drop to reorder and to move between lists.</title>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="columns" type="datasetColumnSelector">
<dependsOn>dataSetId</dependsOn>
<title>Item Template</title>
<helpText>Enter text in the box below, used to display each article.</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="noDataMessage" type="richText" allowLibraryRefs="true" variant="html">
<title>No data message</title>
<helpText>A message to display when no data is returned from the source</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="dateFormat" type="text" variant="dateFormat">
<title>Date Format</title>
<helpText>The format to apply to all dates returned by the Widget.</helpText>
<default>#DATE_FORMAT#</default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="showHeadings" type="checkbox">
<title>Show the table headings?</title>
<helpText>Should the Table headings be shown?</helpText>
<default>1</default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="rowsPerPage" type="number">
<title>Rows per page</title>
<helpText>Please enter the number of rows per page. 0 for no pages.</helpText>
<default>0</default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="fontFamily" type="fontSelector">
<title>Font</title>
<helpText>Select a custom font - leave empty to use the default font.</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="fontSize" type="number">
<title>Font Size</title>
<helpText>Set the font size</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
</properties>
<stencil>
<twig><![CDATA[
<div class="DataSetTableContainer"></div>
]]></twig>
<style><![CDATA[
/* Template Styles */
table.DataSetTable {
font-family: Montserrat, sans-serif;
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
font-size: 14px;
width: 100%;
table-layout: fixed;
border-radius: 12px;
background-color: #333333;
padding: 8px;
overflow: hidden;
opacity: 0.85;
}
tr.HeaderRow {
font-size: 1.1em;
text-align: left;
color: #dd5;
}
td.DataSetColumn {
padding: 6px !important;
color: #f9f9f9;
}
td.DataSetColumn img {
max-width: 100%;
max-height: 50px;
display: block;
}
th.DataSetColumnHeaderCell {
padding: 4px 6px !important;
}
/* Constructed Styles */
{% if fontFamily %}
table.DataSetTable {
font-family: {{fontFamily}};
}
{% endif %}
{% if fontSize %}
table.DataSetTable {
font-size: {{fontSize}}px;
}
{% endif %}
/* Table display CSS fix */
table.DataSetTable.cycle-slide {
display: table !important;
}
/* If we are going to cycle between pages, make sure we hide all of the tables initially */
{% if rowsPerPage > 0 %}
table.DataSetTable {visibility:hidden;}
{% endif %}
]]></style>
</stencil>
<onTemplateRender><![CDATA[
// Show no data message
if (items.length <= 0 && properties.noDataMessage && properties.noDataMessage !== '') {
$(target).html(properties.noDataMessage);
// Scale the layout
$(target).xiboLayoutScaler(properties);
// Image render
$(target).find('img').xiboImageRender(properties);
// Don't render the rest
return;
}
// Columns to be shown in the table
var columnIndex = JSON.parse(properties.columns);
var columns = [];
if (meta && meta.mapping) {
meta.mapping.forEach((column) => {
if (column.dataSetColumnId !== '' && columnIndex.indexOf(column.dataSetColumnId) !== -1) {
columns[columnIndex.indexOf(column.dataSetColumnId)] = column;
}
});
}
// Get table element
var $datasetTableContainer = $(target).find('.DataSetTableContainer');
// Clear the table container
$datasetTableContainer.empty();
// Calculate number of pages
var totalPages = (properties.rowsPerPage > 0) ? Math.ceil(items.length / properties.rowsPerPage) : 1;
// Set the number of pages to the table
$datasetTableContainer.data('totalPages', totalPages);
// Create a table for each page
for (var i = 0; i < totalPages; i++) {
// Create a new table
var $newTable = properties.rowsPerPage > 0 ?
$('<table class="DataSetTable" data-page="' + i + '">') :
$('<table class="DataSetTable">');
// Show the table headings if required
if (properties.showHeadings === 1) {
// Build the headings
var headings = columns.map(function (column, colIdx) {
return '<th class="DataSetColumnHeaderCell">' + column.heading + '</th>';
});
// Add the headings to the table
$newTable.append(
$('<thead>')
.append(
$('<tr class="HeaderRow">')
.append(headings)
)
);
}
// Append table body
$newTable.append(
$('<tbody>')
);
// Add the table to the container
$datasetTableContainer.append($newTable);
}
// Add rows to the tables per page
for (var i = 0; i < items.length; i++) {
// Get the table for this row
var $table = (properties.rowsPerPage > 0) ?
$datasetTableContainer.find('.DataSetTable[data-page="' + Math.floor(i / properties.rowsPerPage) + '"]') :
$datasetTableContainer.find('.DataSetTable');
// Build the row content based on the columns
var rowContent = columns.map(function (column, colIdx) {
var value = items[i][column.heading];
// If it's a date and we have date format
if (column.dataTypeId === 3 && properties.dateFormat) {
value = moment(value).format(properties.dateFormat);
}
// If this is an image column, wrap it in an image tag
if (column.dataTypeId === 4 || column.dataTypeId === 5) {
value = value ? '<img src="' + value + '" />' : '';
}
// Empty string if value is null
if (value === null) {
value = '';
}
return '<td class="DataSetColumn DataSetColumn_' + colIdx + '" id="column_' + (colIdx + 1) + '"><span class="DataSetCellSpan DataSetCellSpan_' + i + '_' + colIdx + '" id="span_' + i + '_' + (colIdx + 1) + '">' + value + '</span></td>';
}).join('');
// Add the row to the table's body
$table.find('tbody').append(
'<tr class="DataSetRow DataSetRow' + ((i % 2) ? 'Odd' : 'Even') + '" id="row_' + i + '">' +
rowContent +
'</tr>'
);
}
// Move table container into content
$datasetTableContainer.appendTo($(target).find('#content'));
// Scale the layout
$(target).xiboLayoutScaler(properties);
// Call render
$datasetTableContainer.dataSetRender(properties);
// Image render
$datasetTableContainer.find('img').xiboImageRender(properties);
]]></onTemplateRender>
<assets>
<asset id="dark-round" type="path" mimeType="image/png" cmsOnly="true" path="/modules/assets/template-thumbnails/dataset/6-dark-round.png" />
</assets>
</template>
<template>
<id>dataset_table_8</id>
<type>static</type>
<dataType>dataset</dataType>
<title>Round cells with multi colours and a full coloured header.</title>
<thumbnail>pill-colored</thumbnail>
<startWidth>600</startWidth>
<startHeight>350</startHeight>
<properties>
<property type="message">
<title>Select a dataset to display appearance options.</title>
<visibility>
<test>
<condition field="dataSetId" type="eq"></condition>
</test>
</visibility>
</property>
<property type="message">
<title>Below you can select the columns to be shown in the table - drag and drop to reorder and to move between lists.</title>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="columns" type="datasetColumnSelector">
<dependsOn>dataSetId</dependsOn>
<title>Item Template</title>
<helpText>Enter text in the box below, used to display each article.</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="noDataMessage" type="richText" allowLibraryRefs="true" variant="html">
<title>No data message</title>
<helpText>A message to display when no data is returned from the source</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="dateFormat" type="text" variant="dateFormat">
<title>Date Format</title>
<helpText>The format to apply to all dates returned by the Widget.</helpText>
<default>#DATE_FORMAT#</default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="showHeadings" type="checkbox">
<title>Show the table headings?</title>
<helpText>Should the Table headings be shown?</helpText>
<default>1</default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="rowsPerPage" type="number">
<title>Rows per page</title>
<helpText>Please enter the number of rows per page. 0 for no pages.</helpText>
<default>0</default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="fontFamily" type="fontSelector">
<title>Font</title>
<helpText>Select a custom font - leave empty to use the default font.</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="fontSize" type="number">
<title>Font Size</title>
<helpText>Set the font size</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
</properties>
<stencil>
<twig><![CDATA[
<div class="DataSetTableContainer"></div>
]]></twig>
<style><![CDATA[
/* Template Styles */
table.DataSetTable {
font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
width: 100%;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
table-layout: fixed;
font-size: 14px;
color: #3b3b3b;
text-align: center;
}
tr.HeaderRow {
font-size: 1.1em;
font-weight: 900;
color: #222;
}
td.DataSetColumn {
padding: 6px;
border-radius: 8px;
border-width: 2px;
border-style: solid;
}
td.DataSetColumn:nth-child(4n) {
border-color: #ee6c6c;
}
td.DataSetColumn:nth-child(4n+1) {
border-color: #9b99f3;
}
td.DataSetColumn:nth-child(4n+2) {
border-color: #5be280;
}
td.DataSetColumn:nth-child(4n+3) {
border-color: #fbdc61;
}
td.DataSetColumn img {
max-width: 100%;
max-height: 50px;
display: block;
margin-left: auto;
margin-right: auto;
}
tr.DataSetRow {
background-color: #f6f6f6;
border-bottom: 6px solid #95a5a6;
}
th.DataSetColumnHeaderCell {
padding: 6px;
border-radius: 8px;
border-width: 2px;
border-style: solid;
border-color: transparent;
}
th.DataSetColumnHeaderCell:nth-child(4n) {
background-color: #ee6c6c;
}
th.DataSetColumnHeaderCell:nth-child(4n+1) {
background-color: #9b99f3;
}
th.DataSetColumnHeaderCell:nth-child(4n+2) {
background-color: #5be280;
}
th.DataSetColumnHeaderCell:nth-child(4n+3) {
background-color: #fbdc61;
}
/* Constructed Styles */
{% if fontFamily %}
table.DataSetTable {
font-family: {{fontFamily}};
}
{% endif %}
{% if fontSize %}
table.DataSetTable {
font-size: {{fontSize}}px;
}
{% endif %}
/* Table display CSS fix */
table.DataSetTable.cycle-slide {
display: table !important;
}
/* If we are going to cycle between pages, make sure we hide all of the tables initially */
{% if rowsPerPage > 0 %}
table.DataSetTable {visibility:hidden;}
{% endif %}
]]></style>
</stencil>
<onTemplateRender><![CDATA[
// Show no data message
if (items.length <= 0 && properties.noDataMessage && properties.noDataMessage !== '') {
$(target).html(properties.noDataMessage);
// Scale the layout
$(target).xiboLayoutScaler(properties);
// Image render
$(target).find('img').xiboImageRender(properties);
// Don't render the rest
return;
}
// Columns to be shown in the table
var columnIndex = JSON.parse(properties.columns);
var columns = [];
if (meta && meta.mapping) {
meta.mapping.forEach((column) => {
if (column.dataSetColumnId !== '' && columnIndex.indexOf(column.dataSetColumnId) !== -1) {
columns[columnIndex.indexOf(column.dataSetColumnId)] = column;
}
});
}
// Get table element
var $datasetTableContainer = $(target).find('.DataSetTableContainer');
// Clear the table container
$datasetTableContainer.empty();
// Calculate number of pages
var totalPages = (properties.rowsPerPage > 0) ? Math.ceil(items.length / properties.rowsPerPage) : 1;
// Set the number of pages to the table
$datasetTableContainer.data('totalPages', totalPages);
// Create a table for each page
for (var i = 0; i < totalPages; i++) {
// Create a new table
var $newTable = properties.rowsPerPage > 0 ?
$('<table class="DataSetTable" data-page="' + i + '">') :
$('<table class="DataSetTable">');
// Show the table headings if required
if (properties.showHeadings === 1) {
// Build the headings
var headings = columns.map(function (column, colIdx) {
return '<th class="DataSetColumnHeaderCell">' + column.heading + '</th>';
});
// Add the headings to the table
$newTable.append(
$('<thead>')
.append(
$('<tr class="HeaderRow">')
.append(headings)
)
);
}
// Append table body
$newTable.append(
$('<tbody>')
);
// Add the table to the container
$datasetTableContainer.append($newTable);
}
// Add rows to the tables per page
for (var i = 0; i < items.length; i++) {
// Get the table for this row
var $table = (properties.rowsPerPage > 0) ?
$datasetTableContainer.find('.DataSetTable[data-page="' + Math.floor(i / properties.rowsPerPage) + '"]') :
$datasetTableContainer.find('.DataSetTable');
// Build the row content based on the columns
var rowContent = columns.map(function (column, colIdx) {
var value = items[i][column.heading];
// If it's a date and we have date format
if (column.dataTypeId === 3 && properties.dateFormat) {
value = moment(value).format(properties.dateFormat);
}
// If this is an image column, wrap it in an image tag
if (column.dataTypeId === 4 || column.dataTypeId === 5) {
value = value ? '<img src="' + value + '" />' : '';
}
// Empty string if value is null
if (value === null) {
value = '';
}
return '<td class="DataSetColumn DataSetColumn_' + colIdx + '" id="column_' + (colIdx + 1) + '"><span class="DataSetCellSpan DataSetCellSpan_' + i + '_' + colIdx + '" id="span_' + i + '_' + (colIdx + 1) + '">' + value + '</span></td>';
}).join('');
// Add the row to the table's body
$table.find('tbody').append(
'<tr class="DataSetRow DataSetRow' + ((i % 2) ? 'Odd' : 'Even') + '" id="row_' + i + '">' +
rowContent +
'</tr>'
);
}
// Move table container into content
$datasetTableContainer.appendTo($(target).find('#content'));
// Scale the layout
$(target).xiboLayoutScaler(properties);
// Call render
$datasetTableContainer.dataSetRender(properties);
// Image render
$datasetTableContainer.find('img').xiboImageRender(properties);
]]></onTemplateRender>
<assets>
<asset id="pill-colored" type="path" mimeType="image/png" cmsOnly="true" path="/modules/assets/template-thumbnails/dataset/7-pill-colored.png" />
</assets>
</template>
<template>
<id>dataset_slideshow</id>
<type>static</type>
<dataType>dataset</dataType>
<showIn>playlist</showIn>
<icon>fas fa-film</icon>
<title>Image Slideshow</title>
<properties>
<property id="dataTypeId" type="hidden">
<default>4,5</default>
</property>
<property type="message">
<title>Select a dataset to display appearance options.</title>
<visibility>
<test>
<condition field="dataSetId" type="eq"></condition>
</test>
</visibility>
</property>
<property type="message">
<title>No image field is available for the selected DataSet.</title>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
<condition field="datasetField" type="eq"></condition>
</test>
</visibility>
</property>
<property id="datasetField" type="datasetField">
<dependsOn>dataSetId</dependsOn>
<title>Select DataSet Field</title>
<helpText>Please choose a DataSet field for this element.</helpText>
<default></default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="effect" type="effectSelector" variant="showPaged">
<title>Effect</title>
<helpText>Please select the effect that will be used to transition between items.</helpText>
<default>tileBlind</default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="speed" type="number">
<title>Speed</title>
<helpText>The transition speed of the selected effect in milliseconds (normal = 1000)</helpText>
<default>1000</default>
<visibility>
<test type="and">
<condition field="effect" type="neq">noTransition</condition>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
</properties>
<preview></preview>
<stencil>
<style><![CDATA[
img {
height: 100%;
width: 100%;
object-fit: contain;
}
]]></style>
</stencil>
<onTemplateRender><![CDATA[
// Module renderer options
// id: The id of the widget
// target: The target element to render
// items: The items to render
// properties: The properties for the widget
// Clear the content container
$(target).find('#content').empty();
// If we don't have metadata, we can't render anything
if (!meta || !meta.mapping) {
return;
}
// Get dataset columns from meta.mapping
var columnTypes = {};
for (var i = 0; i < meta.mapping.length; i++) {
var column = meta.mapping[i];
columnTypes[column.dataSetColumnId] = {
type: column.dataTypeId
};
}
// Add content for each item
// make replacements
// and wrap it in a div with the item class
for (var i = 0; i < items.length; i++) {
var item = items[i];
var itemValue = item[properties.datasetField];
// Only add item if we have a value for it
if(itemValue) {
var content = '<img src="' + itemValue + '" />';
// Add the content to the target
$(target).find('#content').append(
$('<div>')
.addClass('item')
.append(content)
);
}
}
// Scale the layout
$('body').xiboLayoutScaler(properties);
$(target).xiboTextRender(Object.assign(properties, globalOptions), $(target).find('#content > *'));
// Image render
$(target).find('img').xiboImageRender(properties);
]]></onTemplateRender>
<onTemplateVisible><![CDATA[
// Start effects for this template
$(target).xiboLayoutAnimate(properties);
]]></onTemplateVisible>
</template>
<template>
<id>dataset_string_template</id>
<type>static</type>
<dataType>dataset</dataType>
<showIn>playlist</showIn>
<icon>fa fa-font</icon>
<title>String template with placeholders</title>
<properties>
<property type="message">
<title>Select a dataset to display appearance options.</title>
<visibility>
<test>
<condition field="dataSetId" type="eq"></condition>
</test>
</visibility>
</property>
<property id="template" type="richText" allowLibraryRefs="true" variant="html">
<title>Item Template</title>
<helpText>Enter text in the box below, used to display each article.</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="dataSetSnippets" type="snippet" mode="dataSet" target="template">
<title>Snippets</title>
<helpText>Choose data set snippet</helpText>
<dependsOn>dataSetId</dependsOn>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="itemsSideBySide" type="checkbox">
<title>Show items side by side?</title>
<helpText>Should items be shown side by side?</helpText>
<default>0</default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="backgroundColor" type="color">
<title>Background Colour</title>
<helpText>The selected effect works best with a background colour. Optionally add one here.</helpText>
<default></default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="effect" type="effectSelector" variant="all">
<title>Effect</title>
<helpText>Please select the effect that will be used to transition between items.</helpText>
<default>noTransition</default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="speed" type="number">
<title>Speed</title>
<helpText>The transition speed of the selected effect in milliseconds (normal = 1000) or the Marquee Speed in a low to high scale (normal = 1)</helpText>
<default>1000</default>
<visibility>
<test type="and">
<condition field="effect" type="neq">none</condition>
<condition field="effect" type="neq">noTransition</condition>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="itemsPerPage" type="number">
<title>Items per page</title>
<helpText>If an effect has been selected, how many pages should we split the items across? If you don't enter anything here 1 item will be put on each page.</helpText>
<default>1</default>
<visibility>
<test type="and">
<condition field="effect" type="neq">none</condition>
<condition field="effect" type="neq">marqueeLeft</condition>
<condition field="effect" type="neq">marqueeRight</condition>
<condition field="effect" type="neq">marqueeUp</condition>
<condition field="effect" type="neq">marqueeDown</condition>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="noDataMessage" type="richText" allowLibraryRefs="true" variant="html">
<title>No data message</title>
<helpText>A message to display when no data is returned from the source</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
</properties>
<preview></preview>
<stencil>
<style><![CDATA[
{% if itemsSideBySide %}
.item, .page {
float: left;
}
{% endif %}
{% if backgroundColor != '' %}
body {
background-color: {{ backgroundColor }} !important;
}
{% endif %}
]]></style>
</stencil>
<onTemplateRender><![CDATA[
// Module renderer options
// id: The id of the widget
// target: The target element to render
// items: The items to render
// properties: The properties for the widget
// Show no data message
if (items.length <= 0 && properties.noDataMessage && properties.noDataMessage !== '') {
$(target).html(properties.noDataMessage);
// Scale the layout
$(target).xiboLayoutScaler(properties);
// Image render
$(target).find('img').xiboImageRender(properties);
// Don't render the rest
return;
}
// Clear the content container
$(target).find('#content').empty();
// If we don't have metadata, we can't render anything
if (!meta || !meta.mapping) {
return;
}
// Get dataset columns from meta.mapping
var columnTypes = {};
for (var i = 0; i < meta.mapping.length; i++) {
var column = meta.mapping[i];
columnTypes[column.dataSetColumnId] = {
type: column.dataTypeId
};
}
// Add content for each item
// make replacements
// and wrap it in a div with the item class
for (var i = 0; i < items.length; i++) {
var item = items[i];
// Replace the template with the item content
var content = properties.template.replace(/\[(.*?)\]/g, function (match, column) {
var itemId = column.split('|')[0];
var itemCol = column.split('|')[1];
var itemType = (itemCol) ? columnTypes[itemCol].type : '';
var itemValue = item[itemId];
// If this is an image column, wrap it in an image tag
if (itemType === 4 || itemType === 5) {
itemValue = itemValue ? '<img src="' + itemValue + '" />' : '';
}
return itemValue ? itemValue : '';
});
// Add the content to the target
$(target).find('#content').append(
$('<div>')
.addClass('item')
.append(content)
);
}
// Scale the layout
$('body').xiboLayoutScaler(properties);
$(target).xiboTextRender(Object.assign(properties, globalOptions), $(target).find('#content > *'));
// Image render
$(target).find('img').xiboImageRender(properties);
]]></onTemplateRender>
<onTemplateVisible><![CDATA[
// Start effects for this template
$(target).xiboLayoutAnimate(properties);
]]></onTemplateVisible>
</template>
<template>
<id>dataset_marquee</id>
<type>static</type>
<dataType>dataset</dataType>
<title>Dataset shown in a marquee</title>
<startWidth>1200</startWidth>
<startHeight>80</startHeight>
<properties>
<property type="message">
<title>Select a dataset to display appearance options.</title>
<visibility>
<test>
<condition field="dataSetId" type="eq"></condition>
</test>
</visibility>
</property>
<property type="message">
<title>Below you can select the columns to be shown in the table - drag and drop to reorder and to move between lists.</title>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="selectedColumns" type="datasetColStyleSelector">
<dependsOn>dataSetId</dependsOn>
<title>Item Template</title>
<helpText>Enter text in the box below, used to display each article.</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="effect" type="effectSelector" variant="showAll">
<title>Effect</title>
<helpText>Please select the effect that will be used to transition between items.</helpText>
<default>marqueeLeft</default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="speed" type="number">
<title>Speed</title>
<helpText>Marquee Speed in a low to high scale (normal = 1)</helpText>
<default>1</default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="dateFormat" type="text" variant="dateFormat">
<title>Date Format</title>
<helpText>The format to apply to all dates returned by the Widget.</helpText>
<default>#DATE_FORMAT#</default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="gapTags" type="number">
<title>Gap between tags</title>
<helpText>Value (in pixels) to set a gap between each item's tags.</helpText>
<default>6</default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="gapItems" type="number">
<title>Gap between items</title>
<helpText>Value (in pixels) to set a gap between each item.</helpText>
<default>6</default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="backgroundColor" type="color">
<title>Background Colour</title>
<helpText>The selected effect works best with a background colour. Optionally add one here.</helpText>
<default></default>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="textDirection" type="dropdown" mode="single">
<title>Text direction</title>
<helpText>Which direction does the text in the feed use?</helpText>
<default>ltr</default>
<options>
<option name="ltr">Left to Right (LTR)</option>
<option name="rtl">Right to Left (RTL)</option>
</options>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="showSeparator" type="checkbox">
<title>Show a separator between items?</title>
<default>0</default>
<visibility>
<test type="and">
<condition field="effect" type="neq">none</condition>
<condition field="effect" type="neq">noTransition</condition>
<condition field="effect" type="neq">fade</condition>
<condition field="effect" type="neq">fadeout</condition>
<condition field="effect" type="neq">scrollHorz</condition>
<condition field="effect" type="neq">scrollVert</condition>
<condition field="effect" type="neq">flipHorz</condition>
<condition field="effect" type="neq">flipVert</condition>
<condition field="effect" type="neq">shuffle</condition>
<condition field="effect" type="neq">tileSlide</condition>
<condition field="effect" type="neq">tileBlind</condition>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="separator" type="richText" allowLibraryRefs="false" variant="html">
<title>Separator</title>
<helpText>A separator to show between marquee items</helpText>
<default>
<![CDATA[
<p><span style="font-size: 16px;">/</span></p>
]]></default>
<visibility>
<test type="and">
<condition field="effect" type="neq">none</condition>
<condition field="effect" type="neq">noTransition</condition>
<condition field="effect" type="neq">fade</condition>
<condition field="effect" type="neq">fadeout</condition>
<condition field="effect" type="neq">scrollHorz</condition>
<condition field="effect" type="neq">scrollVert</condition>
<condition field="effect" type="neq">flipHorz</condition>
<condition field="effect" type="neq">flipVert</condition>
<condition field="effect" type="neq">shuffle</condition>
<condition field="effect" type="neq">tileSlide</condition>
<condition field="effect" type="neq">tileBlind</condition>
<condition field="showSeparator" type="eq">1</condition>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="copyright" type="text">
<title>Copyright</title>
<helpText>Copyright information to display as the last item in this feed.</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="copyrightFontFamily" type="fontSelector">
<title>Copyright Font Family</title>
<helpText>Select a custom font - leave empty to use the default font.</helpText>
<visibility>
<test type="and">
<condition field="copyright" type="neq"></condition>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="copyrightFontColor" type="color">
<title>Copyright Font Colour</title>
<default></default>
<visibility>
<test type="and">
<condition field="copyright" type="neq"></condition>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="copyrightFontSize" type="number">
<title>Copyright Font Size</title>
<default></default>
<visibility>
<test type="and">
<condition field="copyright" type="neq"></condition>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="copyrightBold" type="checkbox">
<title>Bold</title>
<helpText>Should the copyright text be bold?</helpText>
<default>0</default>
<visibility>
<test type="and">
<condition field="copyright" type="neq"></condition>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="copyrightItalics" type="checkbox">
<title>Italics</title>
<helpText>Should the copyright text be italicised?</helpText>
<default>0</default>
<visibility>
<test type="and">
<condition field="copyright" type="neq"></condition>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="copyrightUnderline" type="checkbox">
<title>Underline</title>
<helpText>Should the copyright text be underlined?</helpText>
<default>0</default>
<visibility>
<test type="and">
<condition field="copyright" type="neq"></condition>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
<property id="noDataMessage" type="richText" allowLibraryRefs="true" variant="html">
<title>No data message</title>
<helpText>A message to display when no data is returned from the source</helpText>
<visibility>
<test>
<condition field="dataSetId" type="neq"></condition>
</test>
</visibility>
</property>
</properties>
<stencil>
<twig><![CDATA[
{% if javaScript %}<script type="text/javascript">{{javaScript|raw}}</script>{% endif %}
]]></twig>
<style><![CDATA[
{% if textDirection == "rtl" %}#content { direction: rtl; }{% endif %}
{% if backgroundColor %}body { background-color: {{backgroundColor}} !important; }{% endif %}
{% if (effect == "marqueeLeft") or (effect == "marqueeRight") %}
{% if gapTags %}.marquee-item { margin-right: {{gapTags}}px; }{% endif %}
{% if gapItems %}.item.text-render-item, .separator { margin-right: {{gapItems}}px; }{% endif %}
.is-media-item { display: inline-block; }
.marquee-item { vertical-align: middle; }
{% endif %}
{% if (effect == "marqueeUp") or (effect == "marqueeDown") %}
{% if gapTags %}.marquee-item { margin-bottom: {{gapTags}}px; }{% endif %}
{% if gapItems %}.item.text-render-item, .separator { margin-bottom: {{gapItems}}px; }{% endif %}
.marquee-item { display: block; }
{% endif %}
]]></style>
</stencil>
<onTemplateRender><![CDATA[
// id: The id of the widget
// target: The target element to render
// items: The items to render
// properties: The properties for the widget
// -------------------------------------------
// Get selected columns
var selectedColumns = (properties.selectedColumns) ? JSON.parse(properties.selectedColumns) : [];
// Convert to array and sort by play order
selectedColumns = Object.values(selectedColumns);
selectedColumns.sort(function(a, b) {return a.playOrder - b.playOrder;});
// Get dataset columns from meta.mapping
var columnInfo = {};
if (meta) {
for (var i = 0; i < meta.mapping.length; i++) {
var column = meta.mapping[i];
columnInfo[column.dataSetColumnId] = {
name: column.heading,
type: column.dataTypeId
};
}
}
// Generate template from chosen fields
properties.template = '';
for (var col in selectedColumns) {
var column = selectedColumns[col];
var isMedia = (columnInfo[column.colId].type == 5 || columnInfo[column.colId].type === 4);
properties.template += '<span class="marquee-item marquee-' + column.colId;
if (isMedia) {
properties.template += ' is-media-item';
}
properties.template += '" style="';
for (var style in selectedColumns[col]) {
if (style === 'fontSize' && selectedColumns[col][style]) {
properties.template += 'font-size:' + selectedColumns[col][style] + 'px;';
}
if (style === 'fontColor' && selectedColumns[col][style]) {
properties.template += 'color:' + selectedColumns[col][style] + ';';
}
if (style === 'fontFamily' && selectedColumns[col][style]) {
properties.template += 'font-family:' + selectedColumns[col][style] + ';';
}
if (style === 'bold' && selectedColumns[col][style]) {
properties.template += 'font-weight: bold;';
}
if (style === 'italics' && selectedColumns[col][style]) {
properties.template += 'font-style: italic;';
}
if (style === 'underline' && selectedColumns[col][style]) {
properties.template += 'text-decoration: underline;';
}
if (style === 'width' && selectedColumns[col][style]) {
properties.template += 'width:' + selectedColumns[col][style] + 'px;';
}
if (style === 'height' && selectedColumns[col][style]) {
properties.template += 'height:' + selectedColumns[col][style] + 'px;';
}
if (style === 'opacity' && selectedColumns[col][style]) {
properties.template += 'opacity:' + selectedColumns[col][style] + ';';
}
}
properties.template += '">[' + columnInfo[column.colId].name + '|' + column.colId + ']</span>';
}
// Clear containers
$(target).find('#content').empty();
$(target).find('.no-data-message').remove();
var hasAddedItems = false;
if (items.length <= 0 && properties.noDataMessage && properties.noDataMessage !== '') {
// No data message
// Add message to the target content
$(target).find('#content').after(
$('<div>')
.addClass('no-data-message')
.append(properties.noDataMessage)
);
} else {
// Add items to container
for (var i = 0; i < items.length; i++) {
var item = items[i];
// Replace the template with the item content
var content = properties.template.replace(/\[(.*?)\]/g, function(match, column) {
var itemId = column.split('|')[0];
var itemCol = column.split('|')[1];
var itemType = (itemCol) ? columnInfo[itemCol].type : '';
var itemValue = item[itemId];
// If it's a date and we have date format
if (itemType === 3 && properties.dateFormat) {
itemValue = moment(itemValue).format(properties.dateFormat);
}
// If this is an image column, wrap it in an image tag
if (itemType === 4 || itemType === 5) {
itemValue = itemValue ? '<img style="width: 100%; height: 100%;" src="' + itemValue + '" />' : '';
}
return itemValue ? itemValue : '';
});
// Add the content to the target
if(content != "") {
hasAddedItems = true;
$(target).find('#content').append(
$('<div>')
.addClass('item')
.append(content)
);
}
}
}
// Copyright
if (hasAddedItems && properties.copyright) {
var copyrightTemplate = '<span class="marquee-item marquee-copyright" style="';
if (properties.copyrightFontFamily) {
copyrightTemplate += 'font-family:' + properties.copyrightFontFamily + ';';
}
if (properties.copyrightFontColor) {
copyrightTemplate += 'color:' + properties.copyrightFontColor + ';';
}
if (properties.copyrightFontSize) {
copyrightTemplate += 'font-size:' + properties.copyrightFontSize + 'px;';
}
if (properties.copyrightBold) {
copyrightTemplate += 'font-weight: bold;';
}
if (properties.copyrightItalics) {
copyrightTemplate += 'font-style: italic;';
}
if (properties.copyrightUnderline) {
copyrightTemplate += 'text-decoration: underline;';
}
copyrightTemplate += '">' + properties.copyright + '</span>';
$(target).find('#content').append(
$('<div>')
.addClass('item')
.append(copyrightTemplate)
);
}
// Add separator
if (
(
properties.effect == 'marqueeLeft' ||
properties.effect == 'marqueeRight' ||
properties.effect == 'marqueeUp' ||
properties.effect == 'marqueeDown'
) && properties.showSeparator == 1 &&
properties.separator != ''
) {
var $separator = $(properties.separator);
$separator.addClass('separator');
$(target).find('.item').after($separator);
}
// Render
$(target).xiboLayoutScaler(properties);
$(target).xiboTextRender(properties, $(target).find('#content > *'));
$(target).find('img').xiboImageRender(properties);
]]></onTemplateRender>
<onTemplateVisible><![CDATA[
// Start effects for this template
$(target).xiboLayoutAnimate(properties);
]]></onTemplateVisible>
</template>
</templates>