Skip to content

Commit 057c3ee

Browse files
authored
Merge pull request #11412 from GlobalDataverseCommunityConsortium/WidgetFix
Widget fix
2 parents 595c159 + c44f2b7 commit 057c3ee

File tree

3 files changed

+115
-60
lines changed

3 files changed

+115
-60
lines changed

src/main/webapp/dataset-widgets.xhtml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@
128128
<p class="help-block">#{bundle['dataset.widgets.citation.tip']}</p>
129129
</div>
130130
<div>
131-
<textarea rows="3" cols="54" class="form-control">&lt;script src=&quot;#{systemConfig.dataverseSiteUrl}/resources/js/widgets.js?persistentId=#{dataset.globalId}&amp;amp;dvUrl=#{systemConfig.dataverseSiteUrl}&amp;amp;widget=citation&amp;amp;heightPx=150&quot;&gt;&lt;/script&gt;</textarea>
131+
<textarea rows="3" cols="54" class="form-control">&lt;script id=&quot;dataverse-widget-js&quot; src=&quot;#{systemConfig.dataverseSiteUrl}/resources/js/widgets.js?persistentId=#{dataset.globalId}&amp;amp;dvUrl=#{systemConfig.dataverseSiteUrl}&amp;amp;widget=citation&amp;amp;heightPx=150&quot;&gt;&lt;/script&gt;</textarea>
132132
</div>
133133
<div>
134134
<h5>
@@ -137,7 +137,7 @@
137137
<p class="help-block">#{bundle['dataset.widgets.datasetFull.tip']}</p>
138138
</div>
139139
<div>
140-
<textarea rows="3" cols="54" class="form-control">&lt;script src=&quot;#{systemConfig.dataverseSiteUrl}/resources/js/widgets.js?persistentId=#{dataset.globalId}&amp;amp;dvUrl=#{systemConfig.dataverseSiteUrl}&amp;amp;widget=iframe&amp;amp;heightPx=500&quot;&gt;&lt;/script&gt;</textarea>
140+
<textarea rows="3" cols="54" class="form-control">&lt;script id=&quot;dataverse-widget-js&quot; src=&quot;#{systemConfig.dataverseSiteUrl}/resources/js/widgets.js?persistentId=#{dataset.globalId}&amp;amp;dvUrl=#{systemConfig.dataverseSiteUrl}&amp;amp;widget=iframe&amp;amp;heightPx=500&quot;&gt;&lt;/script&gt;</textarea>
141141
</div>
142142
</ui:fragment>
143143
<div class="button-block">
Lines changed: 111 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,66 +1,121 @@
1-
/*
2-
* Javascript to create the necessary HTML, CSS and JS for our widgets
3-
*/
1+
document.addEventListener('DOMContentLoaded', function() {
2+
// Function to find the script source
3+
function findScriptSource() {
4+
const widgetScript = document.getElementById('dataverse-widget-js');
5+
if (widgetScript && widgetScript.src) {
6+
return widgetScript.src;
7+
}
8+
9+
const scripts = document.getElementsByTagName('script');
10+
for (const script of scripts) {
11+
if (script.src && script.src.includes('widgets.js')) {
12+
return script.src;
13+
}
14+
}
15+
16+
console.error('Could not find the widgets.js script source');
17+
return null;
18+
}
419

5-
var scriptSource = (function() {
6-
var scripts = document.getElementsByTagName('script');
7-
return scripts[scripts.length - 1].src;
8-
}());
20+
// Function to parse query string
21+
function parseQueryString(queryString) {
22+
const params = {};
23+
if (queryString) {
24+
const keyValues = queryString.split('&');
25+
for (const keyValue of keyValues) {
26+
const [key, value] = keyValue.split('=');
27+
params[key] = decodeURIComponent(value.replace(/\+/g, " "));
28+
}
29+
}
30+
return params;
31+
}
932

10-
var params = parseQueryString(scriptSource.split('?')[1]);
33+
// Function to create and append elements
34+
function appendElement(tag, attributes = {}, textContent = '') {
35+
const element = document.createElement(tag);
36+
Object.assign(element, attributes);
37+
if (textContent) element.textContent = textContent;
38+
scriptTag.parentNode.insertBefore(element, scriptTag.nextSibling);
39+
return element;
40+
}
1141

12-
params.widget; // Widget type
13-
params.alias; // Dataverse Alias
14-
params.persistentId; // persistentId
15-
params.dvUrl; // Dataverse Installation URL
16-
params.heightPx; // iframe height in pixels
17-
params.text; // search input placeholder text
42+
// Find the script source
43+
const scriptSource = findScriptSource();
44+
if (!scriptSource) return;
1845

19-
// Utility function to convert "a=b&c=d" into { a:'b', c:'d' }
20-
function parseQueryString(queryString) {
21-
var params = {};
22-
var pl = /\+/g;
23-
if (queryString) {
24-
var keyValues = queryString.split('&');
25-
for (var i=0; i < keyValues.length; i++) {
26-
var pair = keyValues[i].split('=');
27-
params[pair[0]] = pair[1].replace(pl, " ");
28-
// OpenScholar is encoding ":" as "%3A". See https://github.com/IQSS/dataverse/issues/6381
29-
params[pair[0]] = pair[1].replace("%3A", ":");
30-
}
46+
// Find the script tag in the document
47+
const scriptTag = Array.from(document.getElementsByTagName('script'))
48+
.find(script => script.src === scriptSource);
49+
if (!scriptTag) {
50+
console.error('Could not find the widgets.js script tag in the document');
51+
return;
3152
}
32-
return params;
33-
};
3453

35-
if (!window.jQuery) {
36-
// Path to jquery.js file, eg. Google hosted version
37-
document.write('<script src="https://code.jquery.com/jquery-3.5.1.min.js" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>');
38-
}
54+
// Parse parameters
55+
const params = parseQueryString(scriptSource.split('?')[1]);
3956

40-
if(params.widget === 'search') {
41-
/*
42-
* Dataverse Search Box
43-
*/
44-
document.write('<input type="text" placeholder="' + params.text + '..." onkeydown="if (event.keyCode == 13) document.getElementById(\'btnDataverseSearch\').click()" style="background:#fff; border:1px solid #ccc; border-radius:3px; box-shadow:0 1px 1px rgba(0, 0, 0, 0.075) inset; padding:4px; min-width:180px;"/>&#160;<input id="btnDataverseSearch" value="Find" type="button" onclick="window.open(&#39;' + params.dvUrl + '/dataverse.xhtml?alias=' + params.alias + '&amp;q=&#39; + this.previousSibling.previousSibling.value + &#39;&#39;, &#39;_blank&#39;);" style="-moz-border-bottom-colors:none; -moz-border-left-colors:none; -moz-border-right-colors:none; -moz-border-top-colors:none; background-color:#f5f5f5; background-image:-moz-linear-gradient(center top , #ffffff, #e6e6e6); background-repeat:repeat-x; border:1px solid #ccc; border-color:#e6e6e6 #e6e6e6 #b3b3b3; border-image:none; border-radius:4px; box-shadow:0 1px 0 rgba(255, 255, 255, 0.2) inset, 0 1px 2px rgba(0, 0, 0, 0.05); color:#333; cursor:pointer; text-shadow:0 1px 1px rgba(255, 255, 255, 0.75); padding:0.3em 1em; line-height:1.4;" />');
45-
}
57+
// Load jQuery if not present
58+
if (!window.jQuery) {
59+
const jqueryScript = appendElement('script', {
60+
src: "https://code.jquery.com/jquery-3.6.0.min.js",
61+
integrity: "sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=",
62+
crossOrigin: "anonymous"
63+
});
64+
jqueryScript.onload = initializeWidget;
65+
} else {
66+
initializeWidget();
67+
}
68+
69+
function initializeWidget() {
70+
if (params.widget === 'search') {
71+
const input = appendElement('input', {
72+
type: "text",
73+
placeholder: params.text + "...",
74+
style: "background:#fff; border:1px solid #ccc; border-radius:3px; box-shadow:0 1px 1px rgba(0, 0, 0, 0.075) inset; padding:4px; min-width:180px;"
75+
});
76+
input.addEventListener('keydown', function(event) {
77+
if (event.keyCode === 13) {
78+
document.getElementById('btnDataverseSearch').click();
79+
}
80+
});
81+
82+
appendElement('span', {}, ' ');
4683

47-
if(params.widget === 'iframe' && params.alias) {
48-
/*
49-
* Dataverse Listing iFrame
50-
*/
51-
document.write('<iframe id="dataverse-widget" src="' + params.dvUrl + '/dataverse/' + params.alias + '?widget=dataverse@' + params.alias + '" width="100%" height="' + params.heightPx + '" style="border:0; background:url(' + params.dvUrl + '/resources/images/ajax-loading.gif) no-repeat 50% 50%;"></iframe><script>var widgetScope = "' + params.alias + '"; var dvUrl = "' + params.dvUrl + '";</script><script src="' + params.dvUrl + '/resources/js/widgets-host.js"></script>');
52-
}
84+
const button = appendElement('input', {
85+
id: "btnDataverseSearch",
86+
type: "button",
87+
value: "Find",
88+
style: "-moz-border-bottom-colors:none; -moz-border-left-colors:none; -moz-border-right-colors:none; -moz-border-top-colors:none; background-color:#f5f5f5; background-image:-moz-linear-gradient(center top , #ffffff, #e6e6e6); background-repeat:repeat-x; border:1px solid #ccc; border-color:#e6e6e6 #e6e6e6 #b3b3b3; border-image:none; border-radius:4px; box-shadow:0 1px 0 rgba(255, 255, 255, 0.2) inset, 0 1px 2px rgba(0, 0, 0, 0.05); color:#333333; cursor:pointer; display:inline-block; font-size:14px; line-height:20px; margin-bottom:0; padding:4px 12px; text-align:center; text-shadow:0 1px 1px rgba(255, 255, 255, 0.75); vertical-align:middle;"
89+
});
90+
button.addEventListener('click', function() {
91+
window.open(params.dvUrl + '/dataverse.xhtml?alias=' + params.alias + '&q=' + input.value, '_blank');
92+
});
93+
} else if (params.widget === 'iframe') {
94+
const iframeUrl = params.persistentId
95+
? params.dvUrl + '/dataset.xhtml?persistentId=' + params.persistentId + '&widget=dataset@' + params.persistentId
96+
: params.dvUrl + '/dataverse/' + params.alias + '?widget=dataverse@' + params.alias;
5397

54-
if(params.widget === 'iframe' && params.persistentId) {
55-
/*
56-
* Dataset 'Full' iFrame
57-
*/
58-
document.write('<iframe id="dataset-widget" src="' + params.dvUrl + '/dataset.xhtml?persistentId=' + params.persistentId + '&widget=dataset@' + params.persistentId + '" width="100%" height="' + params.heightPx + '" style="border:0; background:url(' + params.dvUrl + '/resources/images/ajax-loading.gif) no-repeat 50% 50%;"></iframe><script>var widgetScope = "' + params.alias + '"; var dvUrl = "' + params.dvUrl + '";</script><script src="' + params.dvUrl + '/resources/js/widgets-host.js"></script>');
59-
}
98+
appendElement('iframe', {
99+
id: params.persistentId ? "dataset-widget" : "dataverse-widget",
100+
src: iframeUrl,
101+
width: "100%",
102+
height: params.heightPx,
103+
style: "border:0; background:url(" + params.dvUrl + "/resources/images/ajax-loading.gif) no-repeat 50% 50%;"
104+
});
60105

61-
if(params.widget === 'citation') {
62-
/*
63-
* Dataset Citation iFrame
64-
*/
65-
document.write('<iframe id="citation-widget" src="' + params.dvUrl + '/iframe.xhtml?persistentId=' + params.persistentId + '" width="100%" height="' + params.heightPx + '" style="border:0; background:url(' + params.dvUrl + '/resources/images/ajax-loading.gif) no-repeat 50% 50%;"></iframe><script>var widgetScope = "' + params.persistentId + '"; var dvUrl = "' + params.dvUrl + '";</script><script src="' + params.dvUrl + '/resources/js/widgets-host.js"></script>');
66-
}
106+
appendElement('script', {}, 'var widgetScope = "' + (params.persistentId || params.alias) + '"; var dvUrl = "' + params.dvUrl + '";');
107+
appendElement('script', { src: params.dvUrl + '/resources/js/widgets-host.js' });
108+
} else if (params.widget === 'citation') {
109+
appendElement('iframe', {
110+
id: "citation-widget",
111+
src: params.dvUrl + '/iframe.xhtml?persistentId=' + params.persistentId,
112+
width: "100%",
113+
height: params.heightPx,
114+
style: "border:0; background:url(" + params.dvUrl + "/resources/images/ajax-loading.gif) no-repeat 50% 50%;"
115+
});
116+
117+
appendElement('script', {}, 'var widgetScope = "' + params.persistentId + '"; var dvUrl = "' + params.dvUrl + '";');
118+
appendElement('script', { src: params.dvUrl + '/resources/js/widgets-host.js' });
119+
}
120+
}
121+
});

src/main/webapp/themeAndWidgetsFragment.xhtml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,7 @@
314314
<p class="help-block">#{bundle['dataverse.widgets.searchBox.tip']}</p>
315315
</div>
316316
<div>
317-
<textarea rows="3" cols="54" class="form-control">&lt;script src=&quot;#{systemConfig.dataverseSiteUrl}/resources/js/widgets.js?alias=#{themeWidgetFragment.editDv.alias}&amp;amp;dvUrl=#{systemConfig.dataverseSiteUrl}&amp;amp;widget=search&amp;amp;text=Search&#43;my&#43;dataverse&quot;&gt;&lt;/script&gt;</textarea>
317+
<textarea rows="3" cols="54" class="form-control">&lt;script id=&quot;dataverse-widget-js&quot; src=&quot;#{systemConfig.dataverseSiteUrl}/resources/js/widgets.js?alias=#{themeWidgetFragment.editDv.alias}&amp;amp;dvUrl=#{systemConfig.dataverseSiteUrl}&amp;amp;widget=search&amp;amp;text=Search&#43;my&#43;dataverse&quot;&gt;&lt;/script&gt;</textarea>
318318
</div>
319319
<div>
320320
<h5>
@@ -323,7 +323,7 @@
323323
<p class="help-block">#{bundle['dataverse.widgets.dataverseListing.tip']}</p>
324324
</div>
325325
<div>
326-
<textarea rows="3" cols="54" class="form-control">&lt;script src=&quot;#{systemConfig.dataverseSiteUrl}/resources/js/widgets.js?alias=#{themeWidgetFragment.editDv.alias}&amp;amp;dvUrl=#{systemConfig.dataverseSiteUrl}&amp;amp;widgetScope=#{themeWidgetFragment.editDv.alias}&amp;amp;widget=iframe&amp;amp;heightPx=500&quot;&gt;&lt;/script&gt;</textarea>
326+
<textarea rows="3" cols="54" class="form-control">&lt;script id=&quot;dataverse-widget-js&quot; src=&quot;#{systemConfig.dataverseSiteUrl}/resources/js/widgets.js?alias=#{themeWidgetFragment.editDv.alias}&amp;amp;dvUrl=#{systemConfig.dataverseSiteUrl}&amp;amp;widgetScope=#{themeWidgetFragment.editDv.alias}&amp;amp;widget=iframe&amp;amp;heightPx=500&quot;&gt;&lt;/script&gt;</textarea>
327327
</div>
328328
<div class="button-block">
329329
<p:commandButton id="widgetsDone" class="btn btn-default" value="#{bundle.done}" action="#{themeWidgetFragment.cancel()}" immediate="true"/>

0 commit comments

Comments
 (0)