multiple updates and new files to support multiple foaf person profile pages
This commit is contained in:
parent
3b051ecffd
commit
9cde935cc7
50 changed files with 2005 additions and 249 deletions
|
@ -5,7 +5,7 @@
|
|||
<#-- Do not show the link for temporal visualization unless it's enabled -->
|
||||
<#if temporalVisualizationEnabled>
|
||||
<#assign classSpecificExtension>
|
||||
<section id="visualization" role="region">
|
||||
<section id="right-hand-column" role="region">
|
||||
<#include "individual-visualizationTemporalGraph.ftl">
|
||||
<#include "individual-visualizationMapOfScience.ftl">
|
||||
</section> <!-- #visualization -->
|
||||
|
|
|
@ -0,0 +1,174 @@
|
|||
<#-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
|
||||
|
||||
<#-- Individual profile page template for foaf:Person individuals -->
|
||||
<!--[if IE 7]>
|
||||
<link rel="stylesheet" href="${urls.base}/css/individual/ie7-standard-view.css" />
|
||||
<![endif]-->
|
||||
<#-- <#include "individual-setup.ftl"> -->
|
||||
<#import "individual-qrCodeGenerator.ftl" as qr>
|
||||
<#import "lib-vivo-properties.ftl" as vp>
|
||||
<#if !labelCount??>
|
||||
<#assign labelCount = 0 >
|
||||
</#if>
|
||||
<section id="individual-intro" class="vcard person" role="region">
|
||||
<section id="share-contact" role="region">
|
||||
<#-- Image -->
|
||||
<#assign individualImage>
|
||||
<@p.image individual=individual
|
||||
propertyGroups=propertyGroups
|
||||
namespaces=namespaces
|
||||
editable=editable
|
||||
showPlaceholder="always" />
|
||||
</#assign>
|
||||
|
||||
<#if ( individualImage?contains('<img class="individual-photo"') )>
|
||||
<#assign infoClass = 'class="withThumb"'/>
|
||||
</#if>
|
||||
|
||||
<div id="photo-wrapper" >${individualImage}</div>
|
||||
|
||||
<#include "individual-visualizationFoafPerson.ftl">
|
||||
</section> <!-- end share-contact -->
|
||||
<section id="individual-info" ${infoClass!} role="region">
|
||||
<#include "individual-adminPanel.ftl">
|
||||
<header>
|
||||
<#if relatedSubject??>
|
||||
<h2>${relatedSubject.relatingPredicateDomainPublic} for ${relatedSubject.name}</h2>
|
||||
<p><a href="${relatedSubject.url}" title="return to">← return to ${relatedSubject.name}</a></p>
|
||||
<#else>
|
||||
<h1 class="vcard foaf-person fn" <#if !editable>style="float:left;border-right:1px solid #A6B1B0;"</#if>>
|
||||
<#-- Label -->
|
||||
<@p.label individual editable labelCount/>
|
||||
</h1>
|
||||
<#-- Display preferredTitle if it exists; otherwise mostSpecificTypes -->
|
||||
<#assign title = propertyGroups.pullProperty("${core}preferredTitle")!>
|
||||
<#if title?has_content> <#-- true when the property is in the list, even if not populated (when editing) -->
|
||||
<@p.addLinkWithLabel title editable />
|
||||
<#list title.statements as statement>
|
||||
<#if !editable >
|
||||
<div id="titleContainer"><span class="display-title-not-editable">${statement.value}</span></div>
|
||||
<#else>
|
||||
<span class="display-title-editable">${statement.value}</span>
|
||||
<@p.editingLinks "${title.name}" statement editable />
|
||||
</#if>
|
||||
</#list>
|
||||
</#if>
|
||||
<#-- If preferredTitle is unpopulated, display mostSpecificTypes -->
|
||||
<#if ! (title.statements)?has_content>
|
||||
<@p.mostSpecificTypesPerson individual editable/>
|
||||
</#if>
|
||||
</#if>
|
||||
<span class="<#if editable>iconControlsEditable<#else>iconControlsNotEditable</#if>">
|
||||
<#include "individual-iconControls.ftl">
|
||||
</span>
|
||||
<#if editable && profilePageTypesEnabled >
|
||||
<div id="profileTypeContainer">
|
||||
<h2>Profile type</h2>
|
||||
<select id="profilePageType">
|
||||
<option value="standard" <#if profileType == "standard" || profileType == "none">selected</#if> >Standard profile view</option>
|
||||
<option value="quickView" <#if profileType == "quickView">selected</#if> >Quick profile view</option>
|
||||
</select>
|
||||
</div>
|
||||
</#if>
|
||||
</header>
|
||||
<!-- Positions -->
|
||||
<#include "individual-positions.ftl">
|
||||
|
||||
<!-- Overview -->
|
||||
<#if !editable>
|
||||
<p></p>
|
||||
</#if>
|
||||
<#include "individual-overview.ftl">
|
||||
|
||||
<!-- Research Areas -->
|
||||
<#include "individual-researchAreas.ftl">
|
||||
|
||||
<!-- Contact and Webpages -->
|
||||
<!-- VIVO Cornell does not use the contacts properties, so that include has been removed. -->
|
||||
<div id="contactsWebpages">
|
||||
<div id="contactContainer" >
|
||||
<#include "individual-contactInfo-2column.ftl">
|
||||
</div> <!-- contactContainer -->
|
||||
<div id="webpagesContainer">
|
||||
<#assign webpage = propertyGroups.pullProperty("${core}webpage")!>
|
||||
<#if webpage?has_content> <#-- true when the property is in the list, even if not populated (when editing) -->
|
||||
<h2 id="webpage" class="mainPropGroup">Websites <@p.addLink webpage editable ""/></h2>
|
||||
<@p.verboseDisplay webpage />
|
||||
<#assign localName = webpage.localName>
|
||||
<ul id="individual-${localName}" role="list">
|
||||
<@p.objectProperty webpage editable />
|
||||
</ul>
|
||||
</#if>
|
||||
</div> <!-- webpagesContainer -->
|
||||
</div> <!-- contactsWebpages -->
|
||||
<#include "individual-openSocial.ftl">
|
||||
</section> <!-- end individual-info -->
|
||||
</section> <!-- end individual-intro -->
|
||||
|
||||
<#assign nameForOtherGroup = "other"> <#-- individual-properties.ftl -->
|
||||
<#-- Ontology properties -->
|
||||
<#if !editable>
|
||||
<#-- We don't want to see the first name and last name unless we might edit them. -->
|
||||
<#assign skipThis = propertyGroups.pullProperty("http://xmlns.com/foaf/0.1/firstName")!>
|
||||
<#assign skipThis = propertyGroups.pullProperty("http://xmlns.com/foaf/0.1/lastName")!>
|
||||
</#if>
|
||||
|
||||
<#include "individual-property-group-tabs.ftl">
|
||||
|
||||
<#if targetedView?has_content || user.loggedIn >
|
||||
<span id="quickViewLink" >
|
||||
<a href="${urls.base}/display/${individual.localName}?destination=quickView" >
|
||||
<img id="quickViewIcon" src="${urls.images}/individual/quickViewIcon.png" alt="full view icon"/>
|
||||
</a>
|
||||
</span>
|
||||
</#if>
|
||||
<#if !editable>
|
||||
<script>
|
||||
var title = $('div#titleContainer').width();
|
||||
var name = $('h1.vcard').width();
|
||||
var total = parseInt(title,10) + parseInt(name,10);
|
||||
if ( name < 280 && total > 600 ) {
|
||||
var diff = total - 600;
|
||||
$('div#titleContainer').width(title - diff);
|
||||
}
|
||||
else if ( name > 279 && name + title > 600 ) {
|
||||
$('div#titleContainer').width('620');
|
||||
}
|
||||
</script>
|
||||
</#if>
|
||||
<script>
|
||||
var individualLocalName = "${individual.localName}";
|
||||
var imagesPath = '${urls.images}';
|
||||
</script>
|
||||
<#assign rdfUrl = individual.rdfUrl>
|
||||
|
||||
<#if rdfUrl??>
|
||||
<script>
|
||||
var individualRdfUrl = '${rdfUrl}';
|
||||
</script>
|
||||
</#if>
|
||||
<script type="text/javascript">
|
||||
var profileTypeData = {
|
||||
processingUrl: '${urls.base}/edit/primitiveRdfEdit',
|
||||
individualUri: '${individual.uri!}',
|
||||
defaultProfileType: '${profileType!}'
|
||||
};
|
||||
</script>
|
||||
|
||||
${stylesheets.add('<link rel="stylesheet" href="${urls.base}/css/individual/individual.css" />',
|
||||
'<link rel="stylesheet" href="${urls.base}/css/individual/individual-vivo.css" />',
|
||||
'<link rel="stylesheet" href="${urls.base}/css/individual/individual-2column-view.css" />',
|
||||
'<link rel="stylesheet" href="${urls.base}/js/jquery-ui/css/smoothness/jquery-ui-1.8.9.custom.css" />')}
|
||||
|
||||
${headScripts.add('<script type="text/javascript" src="${urls.base}/js/tiny_mce/tiny_mce.js"></script>',
|
||||
'<script type="text/javascript" src="${urls.base}/js/jquery_plugins/qtip/jquery.qtip-1.0.0-rc3.min.js"></script>',
|
||||
'<script type="text/javascript" src="${urls.base}/js/amplify/amplify.store.min.js"></script>',
|
||||
'<script type="text/javascript" src="${urls.base}/js/json2.js"></script>',
|
||||
'<script type="text/javascript" src="${urls.base}/js/jquery_plugins/jquery.truncator.js"></script>')}
|
||||
|
||||
${scripts.add('<script type="text/javascript" src="${urls.base}/js/individual/individualUriRdf.js"></script>',
|
||||
'<script type="text/javascript" src="${urls.base}/js/individual/individualQtipBubble.js"></script>',
|
||||
'<script type="text/javascript" src="${urls.base}/js/jquery-ui/js/jquery-ui-1.8.9.custom.min.js"></script>',
|
||||
'<script type="text/javascript" src="${urls.base}/js/individual/individualUtils.js?vers=1.5.1"></script>',
|
||||
'<script type="text/javascript" src="${urls.base}/js/individual/individualProfilePageType.js"></script>',
|
||||
'<script type="text/javascript" src="${urls.base}/js/imageUpload/imageUploadUtils.js"></script>')}
|
|
@ -0,0 +1,232 @@
|
|||
<#-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
|
||||
|
||||
<#-- The "quick view" individual profile page template for foaf:Person individuals -->
|
||||
<!--[if IE 7]>
|
||||
<link rel="stylesheet" href="${urls.base}/css/individual/ie7-quick-view.css" />
|
||||
<![endif]-->
|
||||
|
||||
<#-- <#include "individual-setup.ftl"> -->
|
||||
<#import "individual-qrCodeGenerator.ftl" as qr>
|
||||
<#import "lib-vivo-properties.ftl" as vp>
|
||||
|
||||
<#if !labelCount??>
|
||||
<#assign labelCount = 0 >
|
||||
</#if>
|
||||
|
||||
<#assign individualImage>
|
||||
<@p.image individual=individual
|
||||
propertyGroups=propertyGroups
|
||||
namespaces=namespaces
|
||||
editable=editable
|
||||
showPlaceholder="always"/>
|
||||
</#assign>
|
||||
|
||||
<#--
|
||||
the display in this template is driven by whether the individual has a web page,
|
||||
so set this variable now
|
||||
-->
|
||||
<#assign hasWebpage = false>
|
||||
<#assign web = individual.propertyList.getProperty("${core}webpage")!>
|
||||
<#if editable >
|
||||
<#if web.first()?? >
|
||||
<#assign hasWebpage = true>
|
||||
<#else>
|
||||
<#assign hasWebpage = false>
|
||||
</#if>
|
||||
<#else>
|
||||
<#if (web?size > 0) >
|
||||
<#assign hasWebpage = true>
|
||||
<#else>
|
||||
<#assign hasWebpage = false>
|
||||
</#if>
|
||||
</#if>
|
||||
|
||||
<section id="individual-intro" class="vcard person" role="region">
|
||||
<section id="label-title" <#if editable>style="width:45%"</#if> >
|
||||
<header>
|
||||
<#if relatedSubject??>
|
||||
<h2>${relatedSubject.relatingPredicateDomainPublic} for ${relatedSubject.name}</h2>
|
||||
<p><a href="${relatedSubject.url}" title="return to">← return to ${relatedSubject.name}</a></p>
|
||||
<#else>
|
||||
<#-- Image -->
|
||||
<div id="photo-wrapper">${individualImage}</div>
|
||||
<h1 class="vcard foaf-person fn" <#if !editable>style="float:left;border-right:1px solid #A6B1B0;"</#if>>
|
||||
<#-- Label -->
|
||||
<@p.label individual editable labelCount/>
|
||||
</h1>
|
||||
<#-- Display preferredTitle if it exists; otherwise mostSpecificTypes -->
|
||||
<#assign title = propertyGroups.pullProperty("${core}preferredTitle")!>
|
||||
<#if title?has_content> <#-- true when the property is in the list, even if not populated (when editing) -->
|
||||
<@p.addLinkWithLabel title editable />
|
||||
<#list title.statements as statement>
|
||||
<#if !editable >
|
||||
<div id="titleContainer"><span class="display-title-not-editable">${statement.value}</span></div>
|
||||
<#else>
|
||||
<span class="display-title-editable">${statement.value}</span>
|
||||
<@p.editingLinks "${title.name}" statement editable />
|
||||
</#if>
|
||||
</#list>
|
||||
</#if>
|
||||
<#-- If preferredTitle is unpopulated, display mostSpecificTypes -->
|
||||
<#if ! (title.statements)?has_content>
|
||||
<@p.mostSpecificTypesPerson individual editable />
|
||||
</#if>
|
||||
</#if>
|
||||
</header>
|
||||
</section> <!-- end label-title -->
|
||||
<#include "individual-adminPanel.ftl">
|
||||
|
||||
<span class="<#if editable >iconControlsEditable<#else>iconControlsNotEditable</#if>">
|
||||
<#include "individual-iconControls.ftl">
|
||||
</span>
|
||||
<#if editable && profilePageTypesEnabled >
|
||||
<div id="profileTypeContainer" <#if editable>style="margin-top:22px"</#if>>
|
||||
<h2>Profile type</h2>
|
||||
<select id="profilePageType">
|
||||
<option value="standard" <#if profileType == "standard" || profileType == "none">selected</#if> >Standard profile view</option>
|
||||
<option value="quickView" <#if profileType == "quickView">selected</#if> >Quick profile view</option>
|
||||
</select>
|
||||
</div>
|
||||
</#if>
|
||||
|
||||
<#--
|
||||
If this individual has a web page or pages, then we highlight them on the left-hand side
|
||||
of the profile page against a shaded background. If not, all the right-hand content shifts
|
||||
left and displays across the full width of the page.
|
||||
-->
|
||||
<#if hasWebpage >
|
||||
<section id="qv-share-contact" class="share-contact" role="region" <#if !editable>style="padding-top:12px"</#if>>
|
||||
<img id="webpage-popout-top" src="${urls.images}/individual/webpage-popout-top.png" alt="background top"/>
|
||||
<div id="webpage-wrapper" >
|
||||
<#assign webpage = propertyGroups.pullProperty("${core}webpage")!>
|
||||
<#if webpage?has_content> <#-- true when the property is in the list, even if not populated (when editing) -->
|
||||
<#if editable>
|
||||
<h2 class="websites" >Websites <@p.addLink webpage editable ""/></h2>
|
||||
</#if>
|
||||
<@p.verboseDisplay webpage />
|
||||
<#assign localName = webpage.localName>
|
||||
<ul id="individual-${localName}" class="individual-webpage" role="list">
|
||||
<@p.objectProperty webpage editable "propStatement-webpage-quickview.ftl"/>
|
||||
</ul>
|
||||
</#if>
|
||||
</div>
|
||||
<img id="webpage-popout-bottom" src="${urls.images}/individual/webpage-popout-bottom.png" alt="background top" <#if editable>style="margin-top:16px"</#if>/>
|
||||
</section> <!-- end share-contact -->
|
||||
</#if>
|
||||
<section id="individual-info" class="qv-individual-info" role="region" style=" <#if !editable>padding-top:12px;</#if><#if hasWebpage>width:53%<#else>width:100%;clear:left</#if>;">
|
||||
<!-- Positions -->
|
||||
<#include "individual-positions.ftl">
|
||||
|
||||
<!-- Research Areas -->
|
||||
<#include "individual-researchAreas.ftl">
|
||||
|
||||
<!-- Geographic Focus -->
|
||||
<#assign geographicFocus = propertyGroups.pullProperty("${core}geographicFocus")!>
|
||||
<#if geographicFocus?has_content> <#-- true when the property is in the list, even if not populated (when editing) -->
|
||||
<h2 id="geoFocus" class="mainPropGroup">Geographic Focus <@p.addLink geographicFocus editable ""/></h2>
|
||||
<@p.verboseDisplay geographicFocus />
|
||||
<#assign localName = geographicFocus.localName>
|
||||
|
||||
<#if geographicFocus.subclasses?has_content >
|
||||
<#assign subclasses = geographicFocus.subclasses>
|
||||
<#list subclasses as subclass>
|
||||
<#assign subclassName = subclass.name!>
|
||||
<ul id="individual-${localName}" role="list">
|
||||
<@p.objectPropertyList geographicFocus editable subclass.statements geographicFocus.template/>
|
||||
</ul>
|
||||
</#list>
|
||||
<#else>
|
||||
<ul id="individual-${localName}" role="list">
|
||||
<@p.objectProperty geographicFocus editable />
|
||||
</ul>
|
||||
</#if>
|
||||
</#if>
|
||||
|
||||
<#-- If the individual does not have webpages and we're in edit mode, provide the opportunity to add webpages -->
|
||||
<#if editable && !hasWebpage >
|
||||
<!-- Webpages -->
|
||||
<#assign webpage = propertyGroups.pullProperty("${core}webpage")!>
|
||||
<#if webpage?has_content>
|
||||
<h2 id="webpage" class="mainPropGroup">Websites <@p.addLink webpage editable ""/></h2>
|
||||
<@p.verboseDisplay webpage />
|
||||
<#assign localName = webpage.localName>
|
||||
<ul id="individual-${localName}" role="list">
|
||||
<@p.objectProperty webpage editable />
|
||||
</ul>
|
||||
</#if>
|
||||
</#if>
|
||||
<#include "individual-visualizationQuickView.ftl">
|
||||
|
||||
<#include "individual-openSocial.ftl">
|
||||
</section> <!-- end individual-info -->
|
||||
</section> <!-- end end individual-intro -->
|
||||
<!-- we need these 3 lines of html to provide proper spacing and alignment -->
|
||||
<p style="clear:both">
|
||||
<br />
|
||||
</p>
|
||||
<span id="fullViewLink">
|
||||
<a href="${urls.base}/display/${individual.localName}?destination=standardView" >
|
||||
<img id="fullViewIcon" src="${urls.images}/individual/fullViewIcon.png" alt="full view icon"/>
|
||||
</a>
|
||||
</span>
|
||||
<#if !editable>
|
||||
<script type="text/javascript">
|
||||
var title = $('div#titleContainer').width();
|
||||
var name = $('h1.vcard').width();
|
||||
var total = parseInt(title,10) + parseInt(name,10);
|
||||
if ( name < 400 && total > 730 ) {
|
||||
var diff = total - 730;
|
||||
$('div#titleContainer').width(title - diff);
|
||||
}
|
||||
else if ( name > 399 && name + title > 730 ) {
|
||||
$('div#titleContainer').width('720');
|
||||
}
|
||||
</script>
|
||||
</#if>
|
||||
<script>
|
||||
var individualLocalName = "${individual.localName}";
|
||||
var imagesPath = '${urls.images}';
|
||||
</script>
|
||||
<#assign rdfUrl = individual.rdfUrl>
|
||||
|
||||
<#if rdfUrl??>
|
||||
<script>
|
||||
var individualRdfUrl = '${rdfUrl}';
|
||||
</script>
|
||||
</#if>
|
||||
<script type="text/javascript">
|
||||
var profileTypeData = {
|
||||
processingUrl: '${urls.base}/edit/primitiveRdfEdit',
|
||||
individualUri: '${individual.uri!}',
|
||||
defaultProfileType: '${profileType!}'
|
||||
};
|
||||
</script>
|
||||
<#if editable>
|
||||
<script>
|
||||
// until the web service is implemented, the bottom portion of the web page "insert"
|
||||
// will not align correctly. This fixes that issue.
|
||||
$('ul#individual-webpage li').children('a').each( function() {
|
||||
if ( $(this).attr('title') == "link text" ) {
|
||||
$('img#webpage-popout-bottom').css("margin-top","8px");
|
||||
return false;
|
||||
}
|
||||
});
|
||||
</script>
|
||||
</#if>
|
||||
${stylesheets.add('<link rel="stylesheet" href="${urls.base}/css/individual/individual.css" />',
|
||||
'<link rel="stylesheet" href="${urls.base}/css/individual/individual-vivo.css" />',
|
||||
'<link rel="stylesheet" href="${urls.base}/css/individual/individual-quick-view.css" />',
|
||||
'<link rel="stylesheet" href="${urls.base}/js/jquery-ui/css/smoothness/jquery-ui-1.8.9.custom.css" />')}
|
||||
|
||||
${headScripts.add('<script type="text/javascript" src="${urls.base}/js/tiny_mce/tiny_mce.js"></script>',
|
||||
'<script type="text/javascript" src="${urls.base}/js/jquery_plugins/qtip/jquery.qtip-1.0.0-rc3.min.js"></script>',
|
||||
'<script type="text/javascript" src="${urls.base}/js/amplify/amplify.store.min.js"></script>',
|
||||
'<script type="text/javascript" src="${urls.base}/js/json2.js"></script>',
|
||||
'<script type="text/javascript" src="${urls.base}/js/jquery_plugins/jquery.truncator.js"></script>')}
|
||||
|
||||
${scripts.add('<script type="text/javascript" src="${urls.base}/js/individual/individualUriRdf.js"></script>',
|
||||
'<script type="text/javascript" src="${urls.base}/js/individual/individualQtipBubble.js"></script>',
|
||||
'<script type="text/javascript" src="${urls.base}/js/jquery-ui/js/jquery-ui-1.8.9.custom.min.js"></script>',
|
||||
'<script type="text/javascript" src="${urls.base}/js/individual/individualUtils.js"></script>',
|
||||
'<script type="text/javascript" src="${urls.base}/js/individual/individualProfilePageType.js"></script>',
|
||||
'<script type="text/javascript" src="${urls.base}/js/imageUpload/imageUploadUtils.js"></script>')}
|
|
@ -1,152 +1,48 @@
|
|||
<#-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
|
||||
|
||||
<#-- Individual profile page template for foaf:Person individuals -->
|
||||
<#--
|
||||
|
||||
This version of individual--foaf-person.ftl is a "router" template. The original VIVO
|
||||
version of this template now resides in the /themes/wilma/templates directory.
|
||||
|
||||
This version of the template is used when the profile page types feature is enabled.
|
||||
This template serves to "rout" the user to the correct template based (1) the
|
||||
profile page type of the foaf person being displayed or (2) the targeted view that
|
||||
the user wants to see. For example, when a user is routed to a quick view template,
|
||||
the user has the option of displaying the full view. If the user chooses that option,
|
||||
the targetedView variable gets set.
|
||||
|
||||
This template could also be used to load just the "individual--foaf-person-2column.ftl"
|
||||
without enabling profile page types.
|
||||
|
||||
-->
|
||||
|
||||
<#include "individual-setup.ftl">
|
||||
<#import "individual-qrCodeGenerator.ftl" as qr>
|
||||
<#import "lib-vivo-properties.ftl" as vp>
|
||||
<#if !labelCount??>
|
||||
<#assign labelCount = 0 >
|
||||
</#if>
|
||||
<section id="individual-intro" class="vcard person" role="region">
|
||||
|
||||
<section id="share-contact" role="region">
|
||||
<#-- Image -->
|
||||
<#assign individualImage>
|
||||
<@p.image individual=individual
|
||||
propertyGroups=propertyGroups
|
||||
namespaces=namespaces
|
||||
editable=editable
|
||||
showPlaceholder="always" />
|
||||
</#assign>
|
||||
<#--
|
||||
First, check to see if profile page types are enabled. If not, get the 2 column template:
|
||||
"individual--foaf-person-2column.ftl".
|
||||
|
||||
<#if ( individualImage?contains('<img class="individual-photo"') )>
|
||||
<#assign infoClass = 'class="withThumb"'/>
|
||||
</#if>
|
||||
|
||||
<div id="photo-wrapper">${individualImage}</div>
|
||||
|
||||
<nav role="navigation">
|
||||
|
||||
<ul id ="individual-tools-people" role="list">
|
||||
<li role="listitem"><img id="uriIcon" title="${individual.uri}" class="middle" src="${urls.images}/individual/uriIcon.gif" alt="uri icon"/></li>
|
||||
|
||||
<@qr.renderCode />
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<#include "individual-contactInfo.ftl">
|
||||
|
||||
<#-- Links -->
|
||||
<@vp.webpages propertyGroups editable "individual-urls-people" />
|
||||
</section>
|
||||
|
||||
<section id="individual-info" ${infoClass!} role="region">
|
||||
<#include "individual-visualizationFoafPerson.ftl">
|
||||
|
||||
<#include "individual-adminPanel.ftl">
|
||||
|
||||
<header>
|
||||
<#if relatedSubject??>
|
||||
<h2>${relatedSubject.relatingPredicateDomainPublic} for ${relatedSubject.name}</h2>
|
||||
<p><a href="${relatedSubject.url}" title="return to">← return to ${relatedSubject.name}</a></p>
|
||||
<#else>
|
||||
<h1 class="vcard foaf-person">
|
||||
<#-- Label -->
|
||||
<span class="fn"><@p.label individual editable labelCount/></span>
|
||||
|
||||
<#-- Display preferredTitle if it exists; otherwise mostSpecificTypes -->
|
||||
<#assign title = propertyGroups.pullProperty("${core}preferredTitle")!>
|
||||
<#if title?has_content> <#-- true when the property is in the list, even if not populated (when editing) -->
|
||||
<@p.addLinkWithLabel title editable />
|
||||
<#list title.statements as statement>
|
||||
<span class="display-title">${statement.value}</span>
|
||||
<@p.editingLinks "${title.name}" statement editable />
|
||||
</#list>
|
||||
</#if>
|
||||
<#-- If preferredTitle is unpopulated, display mostSpecificTypes -->
|
||||
<#if ! (title.statements)?has_content>
|
||||
<@p.mostSpecificTypes individual />
|
||||
</#if>
|
||||
</h1>
|
||||
</#if>
|
||||
|
||||
<#-- Positions -->
|
||||
<#assign positions = propertyGroups.pullProperty("${core}personInPosition")!>
|
||||
<#if positions?has_content> <#-- true when the property is in the list, even if not populated (when editing) -->
|
||||
<@p.objectPropertyListing positions editable />
|
||||
</#if>
|
||||
</header>
|
||||
|
||||
<#-- Overview -->
|
||||
<#include "individual-overview.ftl">
|
||||
|
||||
<#-- Research Areas -->
|
||||
<#assign researchAreas = propertyGroups.pullProperty("${core}hasResearchArea")!>
|
||||
<#if researchAreas?has_content> <#-- true when the property is in the list, even if not populated (when editing) -->
|
||||
<@p.objectPropertyListing researchAreas editable />
|
||||
</#if>
|
||||
|
||||
<#-- VIVO OpenSocial Extension by UCSF -->
|
||||
<#if openSocial??>
|
||||
<#if openSocial.visible>
|
||||
<div id="openSocial">
|
||||
<h2>OpenSocial</h2>
|
||||
<#-- It would likely make sense to remove the #if logic as it is safe and -->
|
||||
<#-- arguably better to just have both divs in all conditions -->
|
||||
<#if editable>
|
||||
<div id="gadgets-edit" class="gadgets-gadget-parent"></div>
|
||||
<#else>
|
||||
<div id="gadgets-view" class="gadgets-gadget-parent" ></div>
|
||||
</#if>
|
||||
</div>
|
||||
</#if>
|
||||
</#if>
|
||||
</section>
|
||||
|
||||
</section>
|
||||
|
||||
<#assign nameForOtherGroup = "other"> <#-- used by both individual-propertyGroupMenu.ftl and individual-properties.ftl -->
|
||||
|
||||
<#-- Property group menu -->
|
||||
<#-- With release 1.6 the property group is no longer used. The include statement
|
||||
remains in the event a particular VIVO site still wants to use it with the new
|
||||
collapsible groups.
|
||||
|
||||
<#include "individual-propertyGroupMenu.ftl">
|
||||
NOTE: the assumption here is that if this template is being loaded, rather than the
|
||||
individual--foaf-person.ftl template that resides in the theme directory, than the site
|
||||
administrator wants to use 2 column template by itself or with the quick view template.
|
||||
-->
|
||||
<#-- Ontology properties -->
|
||||
<#if !editable>
|
||||
<#-- We don't want to see the first name and last name unless we might edit them. -->
|
||||
<#assign skipThis = propertyGroups.pullProperty("http://xmlns.com/foaf/0.1/firstName")!>
|
||||
<#assign skipThis = propertyGroups.pullProperty("http://xmlns.com/foaf/0.1/lastName")!>
|
||||
|
||||
<#assign selectedTemplate = "individual--foaf-person-2column.ftl" >
|
||||
|
||||
|
||||
<#if profilePageTypesEnabled >
|
||||
<#assign profilePageType = profileType >
|
||||
|
||||
<#-- targetedView takes precedence over the profilePageType. -->
|
||||
|
||||
<#if targetedView?has_content>
|
||||
<#if targetedView != "standardView">
|
||||
<#assign selectedTemplate = "individual--foaf-person-quickview.ftl" >
|
||||
</#if>
|
||||
<#elseif profilePageType == "quickView" >
|
||||
<#assign selectedTemplate = "individual--foaf-person-quickview.ftl" >
|
||||
</#if>
|
||||
</#if>
|
||||
<#include selectedTemplate >
|
||||
|
||||
<#include "individual-properties.ftl">
|
||||
|
||||
<#assign rdfUrl = individual.rdfUrl>
|
||||
|
||||
<#if rdfUrl??>
|
||||
<script>
|
||||
var individualRdfUrl = '${rdfUrl}';
|
||||
</script>
|
||||
</#if>
|
||||
<script>
|
||||
var individualLocalName = "${individual.localName}";
|
||||
</script>
|
||||
|
||||
${stylesheets.add('<link rel="stylesheet" href="${urls.base}/css/individual/individual.css" />',
|
||||
'<link rel="stylesheet" href="${urls.base}/css/individual/individual-vivo.css" />',
|
||||
'<link rel="stylesheet" href="${urls.base}/css/individual/individual-property-groups.css" />',
|
||||
'<link rel="stylesheet" href="${urls.base}/js/jquery-ui/css/smoothness/jquery-ui-1.8.9.custom.css" />')}
|
||||
|
||||
${headScripts.add('<script type="text/javascript" src="${urls.base}/js/tiny_mce/tiny_mce.js"></script>',
|
||||
'<script type="text/javascript" src="${urls.base}/js/jquery_plugins/qtip/jquery.qtip-1.0.0-rc3.min.js"></script>',
|
||||
'<script type="text/javascript" src="${urls.base}/js/amplify/amplify.store.min.js"></script>',
|
||||
'<script type="text/javascript" src="${urls.base}/js/jquery_plugins/jquery.truncator.js"></script>')}
|
||||
|
||||
${scripts.add('<script type="text/javascript" src="${urls.base}/js/individual/individualUtils.js"></script>',
|
||||
'<script type="text/javascript" src="${urls.base}/js/individual/propertyGroupControls.js"></script>',
|
||||
'<script type="text/javascript" src="${urls.base}/js/individual/individualUriRdf.js"></script>',
|
||||
'<script type="text/javascript" src="${urls.base}/js/jquery-ui/js/jquery-ui-1.8.9.custom.min.js"></script>',
|
||||
'<script type="text/javascript" src="${urls.base}/js/imageUpload/imageUploadUtils.js"></script>')}
|
||||
|
||||
|
|
|
@ -8,8 +8,8 @@
|
|||
<#assign individualProductExtension>
|
||||
<#-- Include for any class specific template additions -->
|
||||
${classSpecificExtension!}
|
||||
<@vp.webpages propertyGroups editable />
|
||||
<!--PREINDIVIDUAL OVERVIEW.FTL-->
|
||||
<#include "individual-webpage.ftl">
|
||||
<#include "individual-overview.ftl">
|
||||
</section> <!-- #individual-info -->
|
||||
</section> <!-- #individual-intro -->
|
||||
|
@ -18,9 +18,7 @@
|
|||
|
||||
<#include "individual-vitro.ftl">
|
||||
|
||||
${stylesheets.add('<link rel="stylesheet" href="${urls.base}/css/individual/individual-vivo.css" />',
|
||||
'<link rel="stylesheet" href="${urls.base}/css/individual/individual-property-groups.css" />')}
|
||||
${stylesheets.add('<link rel="stylesheet" href="${urls.base}/css/individual/individual-vivo.css" />')}
|
||||
|
||||
${headScripts.add('<script type="text/javascript" src="${urls.base}/js/jquery_plugins/jquery.truncator.js"></script>')}
|
||||
${scripts.add('<script type="text/javascript" src="${urls.base}/js/individual/individualUtils.js"></script>',
|
||||
'<script type="text/javascript" src="${urls.base}/js/individual/propertyGroupControls.js"></script>')}
|
||||
${scripts.add('<script type="text/javascript" src="${urls.base}/js/individual/individualUtils.js"></script>')}
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
<#-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
|
||||
|
||||
<#-- Template for admin panel on individual profile page -->
|
||||
|
||||
<#import "lib-form.ftl" as form>
|
||||
|
||||
<#if individual.showAdminPanel>
|
||||
<section id="admin">
|
||||
<h3 id="adminPanel">Admin Panel</h3><a class="edit-individual" href="${individual.controlPanelUrl()}" title="edit this individual">Edit this individual</a>
|
||||
|
||||
<section id = "verbose-mode">
|
||||
<#if verbosePropertySwitch?has_content>
|
||||
<#assign anchorId = "verbosePropertySwitch">
|
||||
<#assign currentValue = verbosePropertySwitch.currentValue?string("on", "off")>
|
||||
<#assign newValue = verbosePropertySwitch.currentValue?string("off", "on")>
|
||||
<span>Verbose property display is <b>${currentValue}</b> | </span>
|
||||
<a id="${anchorId}" class="verbose-toggle small" href="${verbosePropertySwitch.url}#${anchorId}" title="verbose control">Turn ${newValue}</a>
|
||||
</#if>
|
||||
</section>
|
||||
|
||||
<p class="uri-link">Resource URI: <a href="${individual.uri}" target="_blank" title="resource uri">${individual.uri}</a></p>
|
||||
</section>
|
||||
</#if>
|
|
@ -0,0 +1,75 @@
|
|||
<#-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
|
||||
|
||||
<#-- Contact info on individual profile page -->
|
||||
<#assign phone = propertyGroups.pullProperty("${core}phoneNumber")!>
|
||||
<#assign pEmail = propertyGroups.pullProperty("${core}primaryEmail")!>
|
||||
<#assign email = propertyGroups.pullProperty("${core}email")!>
|
||||
|
||||
<#if editable || ( phone?has_content || pEmail?has_content || email?has_content ) >
|
||||
<h2 id="contactHeading" class="mainPropGroup">Contact</h2>
|
||||
</#if>
|
||||
|
||||
<#-- the layout is different in edit mode -->
|
||||
<#if !editable>
|
||||
<div id="contactOuterDiv">
|
||||
<div id="contactEmailDiv">
|
||||
</#if>
|
||||
<#-- Primary Email -->
|
||||
<@emailLinks "${core}primaryEmail" pEmail />
|
||||
|
||||
<#-- Additional Emails -->
|
||||
<@emailLinks "${core}email" email />
|
||||
<#if !editable>
|
||||
</div> <!-- contactEmailDiv -->
|
||||
<div id="contactPhoneDiv">
|
||||
</#if>
|
||||
<#-- Phone -->
|
||||
<@phoneLinks phone />
|
||||
<#if !editable>
|
||||
</div> <!-- contactPhoneDiv -->
|
||||
</div> <!-- contactOuterDiv -->
|
||||
</#if>
|
||||
<#macro phoneLinks phone>
|
||||
<#if phone?has_content> <#-- true when the property is in the list, even if not populated (when editing) -->
|
||||
<#if editable>
|
||||
<h3 id="contact">phone<@p.addLink phone editable /> </h3>
|
||||
<@p.verboseDisplay phone />
|
||||
</#if>
|
||||
<#if phone.statements?has_content> <#-- if there are any statements -->
|
||||
<ul id="phone-list" role="list">
|
||||
<#list phone.statements as statement>
|
||||
<li role="listitem" <#if editable>style="padding-left:10px;"</#if>>
|
||||
${statement.value}
|
||||
<@p.editingLinks "${phone.localName}" statement editable />
|
||||
</li>
|
||||
</#list>
|
||||
</ul>
|
||||
</#if>
|
||||
</#if>
|
||||
</#macro>
|
||||
<#macro emailLinks property email>
|
||||
<#if property == "${core}primaryEmail">
|
||||
<#local listId = "primary-email">
|
||||
<#local label = "primary email">
|
||||
<#else>
|
||||
<#local listId = "additional-emails">
|
||||
<#local label = "additional emails">
|
||||
</#if>
|
||||
<#if email?has_content> <#-- true when the property is in the list, even if not populated (when editing) -->
|
||||
<#if editable>
|
||||
<h3 id="contact" class="${listId}">${label}<@p.addLink email editable label/></h3>
|
||||
<@p.verboseDisplay email />
|
||||
</#if>
|
||||
<#if email.statements?has_content> <#-- if there are any statements -->
|
||||
<ul id="${listId}" role="list">
|
||||
<#list email.statements as statement>
|
||||
<li role="listitem" <#if editable>style="padding-left:10px;"</#if>>
|
||||
|
||||
<a class="email" href="mailto:${statement.value}" title="email">${statement.value}</a>
|
||||
<@p.editingLinks "${email.localName}" statement editable />
|
||||
</li>
|
||||
</#list>
|
||||
</ul>
|
||||
</#if>
|
||||
</#if>
|
||||
</#macro>
|
|
@ -2,21 +2,29 @@
|
|||
|
||||
<#-- Contact info on individual profile page -->
|
||||
|
||||
<#assign phone = propertyGroups.pullProperty("${core}phoneNumber")!>
|
||||
<#assign primaryEmail = propertyGroups.pullProperty("${core}primaryEmail")!>
|
||||
<#assign addlEmail = propertyGroups.pullProperty("${core}email")!>
|
||||
|
||||
<#if !editable && (phone?has_content || primaryEmail?has_content || addlEmail?has_content) >
|
||||
<ul style="font-size:0.9em;padding-bottom:4px"><li><strong>Contact Info</strong></li></ul>
|
||||
</#if>
|
||||
|
||||
<#-- Primary Email -->
|
||||
<@emailLinks "${core}primaryEmail" />
|
||||
<@emailLinks "${core}primaryEmail" primaryEmail />
|
||||
|
||||
<#-- Additional Emails -->
|
||||
<@emailLinks "${core}email" />
|
||||
<@emailLinks "${core}email" addlEmail />
|
||||
|
||||
<#-- Phone -->
|
||||
<#assign phone = propertyGroups.pullProperty("${core}phoneNumber")!>
|
||||
|
||||
<#if phone?has_content> <#-- true when the property is in the list, even if not populated (when editing) -->
|
||||
<@p.addLinkWithLabel phone editable />
|
||||
<#if phone.statements?has_content> <#-- if there are any statements -->
|
||||
<ul id="individual-phone" role="list">
|
||||
<#list phone.statements as statement>
|
||||
<li role="listitem">
|
||||
<img class ="icon-phone middle" src="${urls.images}/individual/phoneIcon.gif" alt="phone icon" />${statement.value}
|
||||
<#-- <img class ="icon-phone middle" src="${urls.images}/individual/phoneIcon.gif" alt="phone icon"/> -->${statement.value}
|
||||
<@p.editingLinks "${phone.localName}" statement editable />
|
||||
</li>
|
||||
</#list>
|
||||
|
@ -24,8 +32,7 @@
|
|||
</#if>
|
||||
</#if>
|
||||
|
||||
<#macro emailLinks property>
|
||||
<#assign email = propertyGroups.pullProperty(property)!>
|
||||
<#macro emailLinks property email>
|
||||
<#if property == "${core}primaryEmail">
|
||||
<#local listId = "primary-email">
|
||||
<#local label = "Primary Email">
|
||||
|
@ -39,7 +46,7 @@
|
|||
<ul id="${listId}" class="individual-emails" role="list">
|
||||
<#list email.statements as statement>
|
||||
<li role="listitem">
|
||||
<img class ="icon-email middle" src="${urls.images}/individual/emailIcon.gif" alt="email icon" />
|
||||
<#-- <img class ="icon-email middle" src="${urls.images}/individual/emailIcon.gif" alt="email icon"/> -->
|
||||
<a class="email" href="mailto:${statement.value}" title="email">${statement.value}</a>
|
||||
<@p.editingLinks "${email.localName}" statement editable />
|
||||
</li>
|
||||
|
@ -47,4 +54,4 @@
|
|||
</ul>
|
||||
</#if>
|
||||
</#if>
|
||||
</#macro>
|
||||
</#macro>
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
<#-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
|
||||
|
||||
<#-- Icon controls displayed in upper-right corner -->
|
||||
<#-- CU directory link -->
|
||||
<#assign netid = individual.selfEditingId()!>
|
||||
<img id="uriIcon" title="${individual.uri}" src="${urls.images}/individual/share-uri-icon.png" alt="share the uri" />
|
||||
<@qr.renderCode />
|
||||
|
||||
<#--
|
||||
|
||||
Some contact information is displayed on the profile page by default; e.g., phone numbes and email addresses. If an institution
|
||||
has an additional location for contact info, such as a university directory, a third "contact" icon is available that can be used
|
||||
to direct users to that directory. The <a> tag below shows an example using Cornell University's directory.
|
||||
|
||||
<#if netid?has_content>
|
||||
<a href="http://www.cornell.edu/search/?tab=people&netid=${netid}" title="Cornell University directory entry for ${netid}" target="_blank">
|
||||
<img src="${urls.images}/individual/contact-info-icon.png" title="view additional contact information" alt="contact info" />
|
||||
</a>
|
||||
</#if>
|
||||
|
||||
-->
|
|
@ -0,0 +1,11 @@
|
|||
<#-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
|
||||
|
||||
<#-- List of positions for the individual -->
|
||||
<#assign positions = propertyGroups.pullProperty("${core}personInPosition")!>
|
||||
<#if positions?has_content> <#-- true when the property is in the list, even if not populated (when editing) -->
|
||||
<#assign localName = positions.localName>
|
||||
<h2 id="${localName}" class="mainPropGroup">${positions.name?capitalize} <@p.addLink positions editable /> <@p.verboseDisplay positions /></h2>
|
||||
<ul id="individual-${localName}" role="list">
|
||||
<@p.objectProperty positions editable />
|
||||
</ul>
|
||||
</#if>
|
|
@ -0,0 +1,40 @@
|
|||
<#-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
|
||||
|
||||
<#-- Template for property listing on individual profile page -->
|
||||
|
||||
<#list group.properties as property>
|
||||
<article class="property" role="article">
|
||||
<#-- Property display name -->
|
||||
<#if property.localName == "authorInAuthorship" && editable >
|
||||
<h3 id="${property.localName}">${property.name} <@p.addLink property editable /> <@p.verboseDisplay property />
|
||||
<a id="managePubLink" class="manageLinks" href="${urls.base}/managePublications?subjectUri=${subjectUri[1]!}" title="manage publications" <#if verbose>style="padding-top:10px"</#if> >
|
||||
manage publications
|
||||
</a>
|
||||
</h3>
|
||||
<#elseif property.localName == "hasResearcherRole" && editable >
|
||||
<h3 id="${property.localName}">${property.name} <@p.addLink property editable /> <@p.verboseDisplay property />
|
||||
<a id="manageGrantLink" class="manageLinks" href="${urls.base}/manageGrants?subjectUri=${subjectUri[1]!}" title="manage grants & projects" <#if verbose>style="padding-top:10px"</#if> >
|
||||
manage grants & projects
|
||||
</a>
|
||||
</h3>
|
||||
<#elseif property.localName == "organizationForPosition" && editable >
|
||||
<h3 id="${property.localName}">${property.name} <@p.addLink property editable /> <@p.verboseDisplay property />
|
||||
<a id="managePeopleLink" class="manageLinks" href="${urls.base}/managePeople?subjectUri=${subjectUri[1]!}" title="manage people" <#if verbose>style="padding-top:10px"</#if> >
|
||||
manage affiliated people
|
||||
</a>
|
||||
</h3>
|
||||
<#else>
|
||||
<h3 id="${property.localName}">${property.name} <@p.addLink property editable /> <@p.verboseDisplay property /> </h3>
|
||||
</#if>
|
||||
<#-- List the statements for each property -->
|
||||
<ul class="property-list" role="list" id="${property.localName}List">
|
||||
<#-- data property -->
|
||||
<#if property.type == "data">
|
||||
<@p.dataPropertyList property editable />
|
||||
<#-- object property -->
|
||||
<#else>
|
||||
<@p.objectProperty property editable />
|
||||
</#if>
|
||||
</ul>
|
||||
</article> <!-- end property -->
|
||||
</#list>
|
|
@ -34,10 +34,10 @@
|
|||
<h5 class="qrCode">vCard QR</h5>
|
||||
${qrCodeLinkedImage}
|
||||
<#elseif (display == "icon")>
|
||||
<li role="listitem">
|
||||
<a id="qrIcon" title="vCard QR Code" href="${qrData.exportQrCodeUrl}" title="QR Code"><img class="middle" src="${urls.images}/individual/qr_icon.png" alt="qr icon" /></a>
|
||||
<#-- <li role="listitem"> -->
|
||||
<a id="qrIcon" title="vCard QR Code" href="${qrData.exportQrCodeUrl}" title="QR Code"><img src="${urls.images}/individual/qr-code-icon.png<#-- qr_icon.png -->" alt="qr icon" /></a>
|
||||
<span id="qrCodeImage" class="hidden">${qrCodeLinkedImage} <a class="qrCloseLink" href="#" title="QR Code">Close</a></span>
|
||||
</li>
|
||||
<#-- </li> -->
|
||||
<#else>
|
||||
<p class="notice">You have passed an invalid value for the qrCode display parameter.</p>
|
||||
</#if>
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
<#-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
|
||||
|
||||
<#-- List of research areas for the individual -->
|
||||
<#assign researchAreas = propertyGroups.pullProperty("${core}hasResearchArea")!>
|
||||
<#if researchAreas?has_content> <#-- true when the property is in the list, even if not populated (when editing) -->
|
||||
<#assign localName = researchAreas.localName>
|
||||
<h2 id="${localName}" class="mainPropGroup">
|
||||
${researchAreas.name?capitalize}
|
||||
<img id="researchAreaIcon" src="${urls.images}/individual/research-group-icon.png" alt="research areas" />
|
||||
<@p.addLink researchAreas editable /> <@p.verboseDisplay researchAreas />
|
||||
</h2>
|
||||
<ul id="individual-${localName}" role="list" >
|
||||
<@p.objectProperty researchAreas editable />
|
||||
</ul>
|
||||
</#if>
|
|
@ -14,8 +14,7 @@
|
|||
|
||||
${stylesheets.add('<link rel="stylesheet" href="${urls.base}/css/visualization/visualization.css" />')}
|
||||
<#assign standardVisualizationURLRoot ="/visualization">
|
||||
|
||||
<section id="visualization" role="region">
|
||||
|
||||
<#if isAuthor>
|
||||
<#assign coAuthorIcon = "${urls.images}/visualization/coauthorship/co_author_icon.png">
|
||||
<#assign mapOfScienceIcon = "${urls.images}/visualization/mapofscience/scimap_icon.png">
|
||||
|
@ -32,7 +31,7 @@
|
|||
|
||||
<div id="coauthorship_link_container" class="collaboratorship-link-container">
|
||||
<div class="collaboratorship-icon">
|
||||
<a href="${coAuthorVisUrl}" title="co-author"><img src="${coAuthorIcon}" alt="Co-author network icon" width="30px" height="30px" /></a>
|
||||
<a href="${coAuthorVisUrl}" title="co-author"><img src="${coAuthorIcon}" alt="Co-author network icon" width="25px" height="25px" /></a>
|
||||
</div>
|
||||
<div class="collaboratorship-link"><a href="${coAuthorVisUrl}" title="co-author network">Co-Author Network</a></div>
|
||||
</div>
|
||||
|
@ -41,7 +40,7 @@
|
|||
|
||||
<div id="mapofscience_link_container" class="collaboratorship-link-container">
|
||||
<div class="collaboratorship-icon">
|
||||
<a href="${mapOfScienceVisUrl}" title="map of science"><img src="${mapOfScienceIcon}" alt="Map Of Science icon" width="30px" height="30px" /></a>
|
||||
<a href="${mapOfScienceVisUrl}" title="map of science"><img src="${mapOfScienceIcon}" alt="Map Of Science icon" width="25px" height="25px" /></a>
|
||||
</div>
|
||||
<div class="collaboratorship-link"><a href="${mapOfScienceVisUrl}" title="map of science">Map Of Science</a></div>
|
||||
</div>
|
||||
|
@ -66,10 +65,9 @@
|
|||
|
||||
<div id="coinvestigator_link_container" class="collaboratorship-link-container">
|
||||
<div class="collaboratorship-icon">
|
||||
<a href="${coInvestigatorVisUrl}" title="co-investigator network"><img src="${coInvestigatorIcon}" alt="Co-investigator network icon" width="30px" height="30px" /></a>
|
||||
<a href="${coInvestigatorVisUrl}" title="co-investigator network"><img src="${coInvestigatorIcon}" alt="Co-investigator network icon" width="25px" height="25px" /></a>
|
||||
</div>
|
||||
<div class="collaboratorship-link"><a href="${coInvestigatorVisUrl}" title="co-investigator network">Co-Investigator Network</a></div>
|
||||
</div>
|
||||
</#if>
|
||||
</section>
|
||||
</#if>
|
|
@ -3,5 +3,5 @@
|
|||
<#-- Map Of Science visualization -->
|
||||
|
||||
<div id="map-of-science">
|
||||
<h3><img src="${urls.images}/visualization/mapofscience/scimap_icon.png" width="25px" height="25px" /><a href="${individual.mapOfScienceUrl()}" title="map of science">Map of Science</a></h3>
|
||||
<h3><img src="${urls.images}/visualization/mapofscience/scimap_icon.png" width="25" height="25"/><a href="${individual.mapOfScienceUrl()}" title="map of science">Map of Science</a></h3>
|
||||
</div>
|
|
@ -0,0 +1,46 @@
|
|||
<#-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
|
||||
|
||||
<#-- Template for sparkline visualization on individual profile page -->
|
||||
|
||||
<#-- Determine whether this person is an author -->
|
||||
<#assign isAuthor = p.hasStatements(propertyGroups, "${core}authorInAuthorship") />
|
||||
|
||||
<#-- Determine whether this person is involved in any grants -->
|
||||
<#assign isInvestigator = ( p.hasStatements(propertyGroups, "${core}hasInvestigatorRole") ||
|
||||
p.hasStatements(propertyGroups, "${core}hasPrincipalInvestigatorRole") ||
|
||||
p.hasStatements(propertyGroups, "${core}hasCo-PrincipalInvestigatorRole") ) >
|
||||
|
||||
<#if (isAuthor || isInvestigator)>
|
||||
|
||||
<#assign standardVisualizationURLRoot ="/visualization">
|
||||
<#assign coauthor = "">
|
||||
<#assign coinvestigator = "">
|
||||
<#assign mapofscience = "">
|
||||
<h2 class="mainPropGroup">Networks</h2>
|
||||
<#if isAuthor>
|
||||
<#assign coAuthorIcon = "${urls.images}/visualization/coauthorship/co_author_icon.png">
|
||||
<#assign mapOfScienceIcon = "${urls.images}/visualization/mapofscience/scimap_icon.png">
|
||||
<#assign coAuthorVisUrl = individual.coAuthorVisUrl()>
|
||||
<#assign mapOfScienceVisUrl = individual.mapOfScienceUrl()>
|
||||
|
||||
<#assign coauthor = "<li><a href='${coAuthorVisUrl}' title='co-author' style='vertical-align:top;'><img src='${coAuthorIcon}' alt='Co-author network icon' width='20px' height='20px' style='padding-right:8px'/></a><a href='${coAuthorVisUrl}' title='co-author network'>Co-Authors</a></li>" >
|
||||
|
||||
<#assign mapofscience = "<li><a href='${mapOfScienceVisUrl}' title='map of science' style='vertical-align:top;'><img src='${mapOfScienceIcon} ' alt='Map Of Science icon' width='20px' height='20px' style='padding-right:8px'/></a><a href='${mapOfScienceVisUrl}' title='map of science'>Map Of Science</a></li>" >
|
||||
|
||||
</#if>
|
||||
<#if isInvestigator>
|
||||
<#assign coInvestigatorVisUrl = individual.coInvestigatorVisUrl()>
|
||||
<#assign coInvestigatorIcon = "${urls.images}/visualization/coauthorship/co_investigator_icon.png">
|
||||
<#assign coinvestigator = "<li><a href='${coInvestigatorVisUrl}' title='co-investigator network' style='vertical-align:top;'><img src='${coInvestigatorIcon}' alt='Co-investigator network icon' width='20px' height='20px' style='padding-right:8px'/></a><a href='${coInvestigatorVisUrl}' title='co-investigator network'>Co-Investigators</a></li>">
|
||||
</#if>
|
||||
<ul id="individual-visualization">
|
||||
${coauthor}
|
||||
${coinvestigator}
|
||||
${mapofscience}
|
||||
</ul>
|
||||
<script type="text/javascript">
|
||||
var visualizationUrl = '${urls.base}/visualizationAjax?uri=${individual.uri?url}';
|
||||
var infoIconSrc = '${urls.images}/iconInfo.png';
|
||||
</script>
|
||||
|
||||
</#if>
|
|
@ -0,0 +1,22 @@
|
|||
<#-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
|
||||
|
||||
<#-- This snippet will be included in lib-vivo-properties.ftl, so users will be able to have a
|
||||
different view when extending wilma theme
|
||||
|
||||
<#assign webpage = propertyGroups.pullProperty("${core}webpage")!>
|
||||
<@p.objectPropertyListing webpage editable />
|
||||
|
||||
|
||||
-->
|
||||
<#assign webpage = propertyGroups.pullProperty("${core}webpage")!>
|
||||
<#if webpage?has_content> <#-- true when the property is in the list, even if not populated (when editing) -->
|
||||
<#if !editable && individual.person() >
|
||||
<ul style="font-size:0.9em;padding-bottom:4px"><li><strong>Websites</strong></li></ul>
|
||||
</#if>
|
||||
<@p.addLinkWithLabel webpage editable "Websites"/>
|
||||
<#assign localName = webpage.localName>
|
||||
<ul id="individual-${localName}" class="individual-urls" role="list" <#if individual.organization() && !editable>style="font-size:1.15em"</#if>>
|
||||
<@p.objectProperty webpage editable />
|
||||
</ul>
|
||||
</#if>
|
||||
|
|
@ -0,0 +1,80 @@
|
|||
<#-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
|
||||
|
||||
<#-- "Quick view" template for core:webpage
|
||||
|
||||
This template must be self-contained and not rely on other variables set for the individual page, because it
|
||||
is also used to generate the property statement during a deletion.
|
||||
-->
|
||||
|
||||
<#-- *** Use of the quick view template requires that a web service provide snap shots of the web sites that ***
|
||||
*** are defined on a foaf:Person individual's profile page. The web service can be one that you develop ***
|
||||
*** or implement, or it can be a paid service. The service is called in the src attribute of the image ***
|
||||
*** element that contains the web page snap shot, as shown below in the template. Note that this code is ***
|
||||
*** currently commented out and a placeholder is displayed instead. ***
|
||||
-->
|
||||
|
||||
<#assign count = property.statements?size!>
|
||||
|
||||
<#assign identifier>
|
||||
<#if statement.url?has_content>
|
||||
${statement.url?replace(":","")?replace("/","")?replace(".","-")?replace("&","")?replace("%","")?replace("?","")?replace("=","")}<#t>
|
||||
<#else>
|
||||
"noUrl"<#t>
|
||||
</#if>
|
||||
</#assign>
|
||||
|
||||
|
||||
<@showWebpage statement count identifier/>
|
||||
|
||||
<#macro showWebpage statement count identifier>
|
||||
<#local linkText>
|
||||
<#if statement.anchor?has_content>${statement.anchor}<#t>
|
||||
<#elseif statement.url?has_content>${statement.url}<#t>
|
||||
</#if>
|
||||
</#local>
|
||||
<#local imgSize = "&thumbnail=true" >
|
||||
|
||||
<#if (statement.rank?? && statement.rank == "1") || ( count == 1 ) >
|
||||
<#local imgSize = "" >
|
||||
</#if>
|
||||
<#if statement.url?has_content>
|
||||
|
||||
<#-- This section commented out until the web service for the web page snapshot is implemented.
|
||||
The assumption is made that the service will require the url of the web page and possibly
|
||||
an image size as well.
|
||||
|
||||
<span id="span-${identifier}" class="webpage-indicator-qv">Loading website image. . . <img src="${urls.images}/indicatorWhite.gif"></span>
|
||||
<a title="Click to view the ${linkText} web page" href="${statement.url}">
|
||||
<img id="img-${identifier}" class="org-webThumbnail" src="http://your.web.service/getsTheImage?url=${statement.url}${imgSize}" alt="screenshot of webpage ${statement.url}" style="display:none"/>
|
||||
|
||||
</a>
|
||||
<#if imgSize == "" >
|
||||
</li>
|
||||
<li class="weblinkLarge">
|
||||
<a title="Click to view the ${linkText} web page" href="${statement.url}">
|
||||
<img id="icon-${identifier}" src="${urls.images}/individual/weblinkIconLarge.png" alt="click webpage icon" style="display:none"/>
|
||||
</a>
|
||||
<#else>
|
||||
</li>
|
||||
<li class="weblinkSmall">
|
||||
<a title="Click to view the ${linkText} web page" href="${statement.url}">
|
||||
<img id="icon-${identifier}" src="${urls.images}/individual/weblinkIconSmall.png" alt="click webpage icon" style="display:none"/>
|
||||
</a>
|
||||
</#if>
|
||||
-->
|
||||
<#-- Here is the placeholder link -->
|
||||
<a href="${statement.url}" title="link text">${linkText}</a><script>$("a[title='link text']").parent('li').css("float","none");</script>
|
||||
<#else>
|
||||
<a href="${profileUrl(statement.uri("link"))}" title="link name">${statement.linkName}</a> (no url provided for link)
|
||||
</#if>
|
||||
|
||||
</#macro>
|
||||
|
||||
<script>
|
||||
|
||||
$('img#img-${identifier}').load(function(){
|
||||
$('span#span-${identifier}').hide();
|
||||
$('img#img-${identifier}').fadeIn();
|
||||
$('img#icon-${identifier}').fadeIn();
|
||||
});
|
||||
</script>
|
|
@ -25,10 +25,10 @@
|
|||
|
||||
<#if webpage?has_content> <#-- true when the property is in the list, even if not populated (when editing) -->
|
||||
<nav role="navigation">
|
||||
<#local label = "Web Pages">
|
||||
<#local label = "Websites">
|
||||
<@p.addLinkWithLabel webpage editable label />
|
||||
<#if webpage.statements?has_content> <#-- if there are any statements -->
|
||||
<#include "lib-vivo-property-webpage.ftl">
|
||||
<#include "individual-webpage.ftl" >
|
||||
</#if>
|
||||
</nav>
|
||||
</#if>
|
||||
|
|
|
@ -1,9 +0,0 @@
|
|||
<#-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
|
||||
|
||||
<#-- This snippet will be included in lib-vivo-properties.ftl, so users will be able to have a
|
||||
different view when extending wilma theme
|
||||
-->
|
||||
|
||||
<ul class="${linkListClass}" id="webpages" role="list">
|
||||
<@p.objectPropertyList webpage editable />
|
||||
</ul>
|
|
@ -1,5 +1,19 @@
|
|||
<#-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
|
||||
|
||||
<#--
|
||||
|
||||
There are two templates for displaying publication information on foaf person pages.
|
||||
|
||||
- personPublicationSparklineContent.ftl
|
||||
- personPublicationCountNoSparkline.ftl
|
||||
|
||||
The first is the template use with the Wilma theme and the individual--foaf-person.ftl
|
||||
template. The second is used with the individual--foaf-person-2column.ftl template.
|
||||
|
||||
Update the include statement below to use the correct "sparkline" template for your
|
||||
foaf person template.
|
||||
|
||||
-->
|
||||
<#if shouldVIVOrenderVis>
|
||||
<#include "personPublicationSparklineContent.ftl">
|
||||
<#include "personPublicationCountNoSparkline.ftl">
|
||||
</#if>
|
||||
|
|
|
@ -0,0 +1,121 @@
|
|||
<#-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
|
||||
<#assign visContainerID = '${sparklineVO.visContainerDivID}'>
|
||||
|
||||
<#if sparklineVO.shortVisMode>
|
||||
<#assign sparklineContainerID = 'pub_count_short_sparkline_vis'>
|
||||
<#else>
|
||||
<#assign sparklineContainerID = 'pub_count_full_sparkline_vis'>
|
||||
</#if>
|
||||
|
||||
<#-- This is used to prevent collision between sparkline & visualization conatiner div ids. -->
|
||||
<#if visContainerID?upper_case == sparklineContainerID?upper_case>
|
||||
<#assign sparklineContainerID = visContainerID + "_spark">
|
||||
</#if>
|
||||
<div class="staticPageBackground">
|
||||
<div id="${visContainerID}">
|
||||
<script type="text/javascript">
|
||||
|
||||
function drawPubCountVisualization() {
|
||||
var unknownYearPublicationCounts = ${sparklineVO.unknownYearPublications};
|
||||
var onlyUnknownYearPublications = false;
|
||||
|
||||
var data = new google.visualization.DataTable();
|
||||
data.addColumn('string', 'Year');
|
||||
data.addColumn('number', 'Publications');
|
||||
data.addRows(${sparklineVO.yearToEntityCountDataTable?size});
|
||||
|
||||
var knownYearPublicationCounts = 0;
|
||||
|
||||
<#list sparklineVO.yearToEntityCountDataTable as yearToPublicationCountDataElement>
|
||||
data.setValue(${yearToPublicationCountDataElement.yearToEntityCounter}, 0, '${yearToPublicationCountDataElement.year}');
|
||||
data.setValue(${yearToPublicationCountDataElement.yearToEntityCounter}, 1, ${yearToPublicationCountDataElement.currentEntitiesCount});
|
||||
knownYearPublicationCounts += ${yearToPublicationCountDataElement.currentEntitiesCount};
|
||||
</#list>
|
||||
|
||||
<#-- Create a view of the data containing only the column pertaining to publication count. -->
|
||||
var sparklineDataView = new google.visualization.DataView(data);
|
||||
sparklineDataView.setColumns([1]);
|
||||
|
||||
/*
|
||||
This means that all the publications have unknown years & we do not need to display
|
||||
the sparkline.
|
||||
*/
|
||||
if (unknownYearPublicationCounts > 0 && knownYearPublicationCounts < 1) {
|
||||
|
||||
onlyUnknownYearPublications = true;
|
||||
|
||||
}
|
||||
|
||||
var unknownYearPublicationCounts = ${sparklineVO.unknownYearPublications};
|
||||
var totalPublicationCount = knownYearPublicationCounts + unknownYearPublicationCounts;
|
||||
|
||||
var shortSparkRows = sparklineDataView.getViewRows();
|
||||
var renderedShortSparks = 0;
|
||||
$.each(shortSparkRows, function(index, value) {
|
||||
renderedShortSparks += data.getValue(value, 1);
|
||||
});
|
||||
|
||||
var tenYearCount = onlyUnknownYearPublications ? unknownYearPublicationCounts : renderedShortSparks;
|
||||
|
||||
var td1Text = totalPublicationCount;
|
||||
var td2Text = "";
|
||||
var infoImgText = "<img class='infoIcon' src='" + infoIconSrc + "' height='14px' width='14px' alt='information icon' title='These numbers are based solely on publications that have been loaded into this VIVO application. If this is your profile, you can enter additional publications below.' />";
|
||||
|
||||
if ( !onlyUnknownYearPublications ) {
|
||||
if ( td1Text == tenYearCount ) {
|
||||
td2Text += "in the last 10 full years " ;
|
||||
}
|
||||
else {
|
||||
td2Text += "<strong>" + tenYearCount + "</strong> in the last 10 full years " ;
|
||||
}
|
||||
|
||||
if ( tenYearCount < 100 ) {
|
||||
td2Text += infoImgText;
|
||||
}
|
||||
}
|
||||
else {
|
||||
td2Text += "total <img class='infoIcon' src='" + infoIconSrc + "' height='14px' width='14px' alt='information icon' title='These numbers are based solely on publications that have been loaded into this VIVO application. If this is your profile, you can enter additional publications below.' />";
|
||||
}
|
||||
|
||||
$('#${sparklineContainerID} td#totalPubs').html(td1Text);
|
||||
$('#${sparklineContainerID} td#tenYearCount').html(td2Text);
|
||||
|
||||
if ( td1Text > 99 && td1Text < 1000 ) {
|
||||
$('#${sparklineContainerID} td#totalPubs').attr('style','font-size:1.25em');
|
||||
}
|
||||
else if ( td1Text > 999 ) {
|
||||
$('#${sparklineContainerID} td#totalPubs').attr('style','font-size:1.1em');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$(document).ready(function() {
|
||||
var sparklineImgTD;
|
||||
|
||||
|
||||
if ($('#${sparklineContainerID}').length === 0) {
|
||||
|
||||
$('<div/>', {
|
||||
'id': '${sparklineContainerID}',
|
||||
}).prependTo('#${visContainerID}');
|
||||
$('#${sparklineContainerID}').css('margin-top','4px').css('height','48px');
|
||||
var table = $('<table>');
|
||||
var row = $('<tr>');
|
||||
var totalPubs = $('<td>');
|
||||
totalPubs.attr('id', 'totalPubs');
|
||||
totalPubs.attr('id', 'totalPubs');
|
||||
var tenYearCount = $('<td>');
|
||||
tenYearCount.attr('id', 'tenYearCount');
|
||||
row.append(totalPubs);
|
||||
row.append(tenYearCount);
|
||||
table.append(row);
|
||||
table.prependTo('#${sparklineContainerID}');
|
||||
}
|
||||
|
||||
drawPubCountVisualization();
|
||||
});
|
||||
</script>
|
||||
|
||||
</div> <!-- Sparkline Viz -->
|
||||
|
||||
</div>
|
|
@ -144,17 +144,26 @@
|
|||
which would not be mentioned in the other case because the renderedShortSparks only hold counts
|
||||
of publications which have any date associated with it.
|
||||
*/
|
||||
|
||||
var totalPubs = onlyUnknownYearPublications ? unknownYearPublicationCounts : renderedShortSparks;
|
||||
|
||||
$('#${sparklineContainerID} td.sparkline_number').text(totalPubs + " in the last 10 full").css("font-weight", "bold").css("font-size",".85em").attr("class", "grey");
|
||||
|
||||
var sparksText = "years";
|
||||
|
||||
if (totalPubs !== totalPublicationCount) {
|
||||
sparksText += ' (' + totalPublicationCount + ' total)' ;
|
||||
}
|
||||
var sparksText = "";
|
||||
if ( !onlyUnknownYearPublications ) {
|
||||
|
||||
sparksText += " <img class='infoIcon' src='" + infoIconSrc + "' height='16px' width='16px' alt='information icon' title='These numbers are based solely on publications that have been loaded into this VIVO application. If this is your profile, you can enter additional publications below.' />" ;
|
||||
$('#${sparklineContainerID} td.sparkline_number').text(totalPubs + " in the last 10 full").attr("class", "grey-text");
|
||||
|
||||
sparksText += "years";
|
||||
|
||||
if (totalPubs !== totalPublicationCount) {
|
||||
sparksText += ' (' + totalPublicationCount + ' total)' ;
|
||||
}
|
||||
sparksText += " <img class='infoIcon' src='" + infoIconSrc + "' height='16px' width='16px' alt='information icon' title='These numbers are based solely on publications that have been loaded into this VIVO application. If this is your profile, you can enter additional publications below.' />" ;
|
||||
|
||||
}
|
||||
else {
|
||||
var totalPubs = onlyUnknownYearPublications ? unknownYearPublicationCounts : renderedSparks;
|
||||
|
||||
$('#${sparklineContainerID} td.sparkline_number').html(totalPubs + " total <img class='infoIcon' src='" + infoIconSrc + "' height='16px' width='16px' alt='information icon' title='These numbers are based solely on publications that have been loaded into this VIVO application. If this is your profile, you can enter additional publications below.' />").attr("class", "grey-text");
|
||||
}
|
||||
|
||||
<#else>
|
||||
|
||||
|
@ -177,7 +186,7 @@
|
|||
var pubDisplay = "publications";
|
||||
}
|
||||
|
||||
$('#${sparklineContainerID} td.sparkline_number').text(totalPubs).css("font-weight", "bold").attr("class", "grey").append("<span style='color: #2485AE;'> "+ pubDisplay +"<br/></span>");
|
||||
$('#${sparklineContainerID} td.sparkline_number').text(totalPubs).attr("class", "grey-text").append("<span style='color: #2485AE;'> "+ pubDisplay +"<br/></span>");
|
||||
|
||||
var sparksText = ' from <span class="sparkline_range">${sparklineVO.earliestYearConsidered?c}'
|
||||
+ ' to ${sparklineVO.latestRenderedPublicationYear?c}</span>';
|
||||
|
@ -189,12 +198,12 @@
|
|||
if (totalPublicationCount) {
|
||||
sparksText += ' <br /><a href="${sparklineVO.downloadDataLink}" title="csv file">(.CSV File)</a> ';
|
||||
}
|
||||
|
||||
|
||||
</#if>
|
||||
|
||||
if (!onlyUnknownYearPublications) {
|
||||
$('#${sparklineContainerID} td.sparkline_text').html(sparksText);
|
||||
}
|
||||
$('#${sparklineContainerID} td.sparkline_text').html(sparksText);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
@ -258,33 +267,33 @@
|
|||
});
|
||||
</script>
|
||||
|
||||
</div><!-- Sparkline Viz -->
|
||||
</div> <!-- Sparkline Viz -->
|
||||
|
||||
<#if sparklineVO.shortVisMode>
|
||||
|
||||
<#-- Shifted the link to co-author to the individual-sparkline.ftl instead. -->
|
||||
|
||||
<#else>
|
||||
<!-- For Full Sparkline - Print the Table of Publication Counts per Year -->
|
||||
|
||||
<#if displayTable?? && displayTable>
|
||||
|
||||
<p>
|
||||
<#assign tableID = "publications_sparkline_data_table" />
|
||||
<#assign tableCaption = "Publications per year " />
|
||||
<#assign tableActivityColumnName = "Publications" />
|
||||
<#assign tableContent = sparklineVO.yearToActivityCount />
|
||||
<#assign fileDownloadLink = sparklineVO.downloadDataLink />
|
||||
|
||||
<#include "yearToActivityCountTable.ftl">
|
||||
|
||||
Download data as <a href="${sparklineVO.downloadDataLink}" title="csv download link">.csv</a> file.
|
||||
<br />
|
||||
</p>
|
||||
|
||||
|
||||
</#if>
|
||||
|
||||
<#if sparklineVO.shortVisMode>
|
||||
|
||||
</#if>
|
||||
</div>
|
||||
<#-- Shifted the link to co-author to the individual-sparkline.ftl instead. -->
|
||||
|
||||
<#else>
|
||||
<!-- For Full Sparkline - Print the Table of Publication Counts per Year -->
|
||||
|
||||
<#if displayTable?? && displayTable>
|
||||
|
||||
<p>
|
||||
<#assign tableID = "publications_sparkline_data_table" />
|
||||
<#assign tableCaption = "Publications per year " />
|
||||
<#assign tableActivityColumnName = "Publications" />
|
||||
<#assign tableContent = sparklineVO.yearToActivityCount />
|
||||
<#assign fileDownloadLink = sparklineVO.downloadDataLink />
|
||||
|
||||
<#include "yearToActivityCountTable.ftl">
|
||||
|
||||
Download data as <a href="${sparklineVO.downloadDataLink}" title="csv download link">.csv</a> file.
|
||||
<br />
|
||||
</p>
|
||||
|
||||
|
||||
</#if>
|
||||
|
||||
|
||||
</#if>
|
||||
</div>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue