Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 1 addition & 9 deletions ckanext/dataexplorer/public/recline_view.js
Original file line number Diff line number Diff line change
Expand Up @@ -207,21 +207,13 @@ this.ckan.module('recline_view', function (jQuery, _) {
view: new recline.View.SlickGrid({
model: dataset
})
}
/** NOT IN USE
,{
},{
id: 'graph',
label: _('Graph').fetch(),
view: new recline.View.Graph({
model: dataset
})
},
{
id: 'map',
label: _('Map').fetch(),
view: new recline.View.Map(this._reclineMapViewOptions(dataset, map_config))
}
**/
];

views = views.filter(function(view) {
Expand Down
143 changes: 142 additions & 1 deletion ckanext/dataexplorer/public/recline_view.min.js
Original file line number Diff line number Diff line change
@@ -1 +1,142 @@
this.ckan.module("recline_view",function(e,i){return{options:{site_url:"",controlsClassName:"controls"},initialize:function(){var i,t,o,a,r=function(){e.proxyAll(this,/_on/),this.options.resource=JSON.parse(this.options.resource),this.options.resourceView=JSON.parse(this.options.resourceView),this.el.ready(this._onReady),L.Icon.Default.imagePath=this.options.site_url+"vendor/leaflet/0.7.7/images"}.bind(this);i="/vendor/recline/recline.js",t=r,o=document.getElementsByTagName("head")[0],(a=document.createElement("script")).type="text/javascript",a.src=i,a.onreadystatechange=t,a.onload=t,o.appendChild(a)},_onReady:function(){var e=this.options.resource,i=this.options.resourceView;this.loadView(e,i)},loadView:function(t,o){var a,r,n=this;if(""===t.formatNormalized){var l=t.url.split("/"),s=(l=(l=(l=l[l.length-1]).split("?"))[0]).split(".");s.length>1&&(t.formatNormalized=s[s.length-1])}t.backend="ckan",t.endpoint=e("body").data("site-root")+"api",r=new recline.Model.Dataset(t),this.options.map_config;var c=new recline.Model.Query;c.set({size:o.limit||100}),c.set({from:o.offset||0});var d={};try{window.parent.ckan.views&&window.parent.ckan.views.filters&&(d=window.parent.ckan.views.filters.get())}catch(e){}var p=o.filters||{},w=e.extend({},p,d);e.each(w,function(e,i){c.addFilter({type:"term",field:e,term:i})}),r.queryState.set(c.toJSON(),{silent:!0}),a=i("Could not load view").fetch()+": ","ckan"==t.backend?a+=i("DataStore returned an error").fetch():"dataproxy"==t.backend&&(a+=i("DataProxy returned an error").fetch()),r.fetch().done(function(e){n.initializeView(e,o)}).fail(function(e){var i;e.message&&(a+=" ("+e.message+")"),i=(i=a)||n._("error loading view").fetch(),window.parent.ckan.pubsub.publish("data-viewer-error",i)})},initializeView:function(i,t){var o,a,r=[];if("recline_graph_view"===t.view_type?(a={graphType:t.graph_type,group:t.group,series:[t.series]},o=new recline.View.Graph({model:i,state:a})):"recline_map_view"===t.view_type?(a={geomField:null,latField:null,lonField:null,autoZoom:Boolean(t.auto_zoom),cluster:Boolean(t.cluster_markers)},"geojson"===t.map_field_type?a.geomField=t.geojson_field:(a.latField=t.latitude_field,a.lonField=t.longitude_field),o=new recline.View.Map(this._reclineMapViewOptions(i,this.options.map_config))):"recline_view"===t.view_type||"dataexplorer"===t.view_type?o=this._newDataExplorer(i,this.options.map_config,t):(o=new recline.View.SlickGrid({model:i}),r=[new recline.View.Pager({model:o.model}),new recline.View.RecordCount({model:i}),new recline.View.QueryEditor({model:o.model.queryState})]),"recline_view"!==t.view_type&&"dataexplorer"!==t.view_type){var n=e("<div />");this._renderControls(n,r,this.options.controlsClassName),n.append(o.el),e(this.el).html(n),o.visible=!0,o.render()}"recline_graph_view"===t.view_type&&o.redraw()},_reclineMapViewOptions:function(e,i){var t,o,a;if(t=o=a="","mapbox"==i.type){if(!i["mapbox.map_id"]||!i["mapbox.access_token"])throw"[CKAN Map Widgets] You need to provide a map ID ([account].[handle]) and an access token when using a MapBox layer. See http://www.mapbox.com/developers/api-overview/ for details";t="//{s}.tiles.mapbox.com/v4/"+i["mapbox.map_id"]+"/{z}/{x}/{y}.png?access_token="+i["mapbox.access_token"],handle=i["mapbox.map_id"],a=i.subdomains||"abcd",o=i.attribution||'Data: <a href="http://osm.org/copyright" target="_blank">OpenStreetMap</a>, Design: <a href="http://mapbox.com/about/maps" target="_blank">MapBox</a>'}else if("custom"==i.type&&(t=i["custom.url"]||"",o=i.attribution||"",a=i.subdomains||"",i["custom.tms"]))i["custom.tms"];return{model:e,mapTilesURL:t,mapTilesAttribution:o,mapTilesSubdomains:a}},_newDataExplorer:function(e,t,o){var a=[{id:"grid",label:i("Grid").fetch(),view:new recline.View.SlickGrid({model:e})}];a=a.filter(function(e){return"show"===o[e.id+"_tab"]});var r=[{id:"valueFilter",label:i("Filters").fetch(),view:new recline.View.ValueFilter({model:e})},{id:"extractor",label:i("Extract").fetch(),view:new recline.View.Extractor({model:e,site_url:this.options.site_url})}];return new recline.View.MultiView({el:this.el,model:e,views:a,sidebarViews:r,config:{readOnly:!0}})},_renderControls:function(i,t,o){for(var a=e('<div class="clearfix '+o+'" />'),r=0;r<t.length;r++)a.append(t[r].el);e(i).append(a)}}});
this.ckan.module("recline_view", function(e, i) {
return {
options: {
site_url: "",
controlsClassName: "controls"
},
initialize: function() {
var i, t, o, a, r = function() {
e.proxyAll(this, /_on/), this.options.resource = JSON.parse(this.options.resource), this.options.resourceView = JSON.parse(this.options.resourceView), this.el.ready(this._onReady), L.Icon.Default.imagePath = this.options.site_url + "vendor/leaflet/0.7.7/images"
}.bind(this);
i = "/vendor/recline/recline.js", t = r, o = document.getElementsByTagName("head")[0], (a = document.createElement("script")).type = "text/javascript", a.src = i, a.onreadystatechange = t, a.onload = t, o.appendChild(a)
},
_onReady: function() {
var e = this.options.resource,
i = this.options.resourceView;
this.loadView(e, i)
},
loadView: function(t, o) {
var a, r, n = this;
if ("" === t.formatNormalized) {
var l = t.url.split("/"),
s = (l = (l = (l = l[l.length - 1]).split("?"))[0]).split(".");
s.length > 1 && (t.formatNormalized = s[s.length - 1])
}
t.backend = "ckan", t.endpoint = e("body").data("site-root") + "api", r = new recline.Model.Dataset(t), this.options.map_config;
var c = new recline.Model.Query;
c.set({
size: o.limit || 100
}), c.set({
from: o.offset || 0
});
var d = {};
try {
window.parent.ckan.views && window.parent.ckan.views.filters && (d = window.parent.ckan.views.filters.get())
} catch (e) {}
var p = o.filters || {},
w = e.extend({}, p, d);
e.each(w, function(e, i) {
c.addFilter({
type: "term",
field: e,
term: i
})
}), r.queryState.set(c.toJSON(), {
silent: !0
}), a = i("Could not load view").fetch() + ": ", "ckan" == t.backend ? a += i("DataStore returned an error").fetch() : "dataproxy" == t.backend && (a += i("DataProxy returned an error").fetch()), r.fetch().done(function(e) {
n.initializeView(e, o)
}).fail(function(e) {
var i;
e.message && (a += " (" + e.message + ")"), i = (i = a) || n._("error loading view").fetch(), window.parent.ckan.pubsub.publish("data-viewer-error", i)
})
},
initializeView: function(i, t) {
var o, a, r = [];
if ("recline_graph_view" === t.view_type ? (a = {
graphType: t.graph_type,
group: t.group,
series: [t.series]
}, o = new recline.View.Graph({
model: i,
state: a
})) : "recline_map_view" === t.view_type ? (a = {
geomField: null,
latField: null,
lonField: null,
autoZoom: Boolean(t.auto_zoom),
cluster: Boolean(t.cluster_markers)
}, "geojson" === t.map_field_type ? a.geomField = t.geojson_field : (a.latField = t.latitude_field, a.lonField = t.longitude_field), o = new recline.View.Map(this._reclineMapViewOptions(i, this.options.map_config))) : "recline_view" === t.view_type || "dataexplorer" === t.view_type ? o = this._newDataExplorer(i, this.options.map_config, t) : (o = new recline.View.SlickGrid({
model: i
}), r = [new recline.View.Pager({
model: o.model
}), new recline.View.RecordCount({
model: i
}), new recline.View.QueryEditor({
model: o.model.queryState
})]), "recline_view" !== t.view_type && "dataexplorer" !== t.view_type) {
var n = e("<div />");
this._renderControls(n, r, this.options.controlsClassName), n.append(o.el), e(this.el).html(n), o.visible = !0, o.render()
}
"recline_graph_view" === t.view_type && o.redraw()
},
_reclineMapViewOptions: function(e, i) {
var t, o, a;
if (t = o = a = "", "mapbox" == i.type) {
if (!i["mapbox.map_id"] || !i["mapbox.access_token"]) throw "[CKAN Map Widgets] You need to provide a map ID ([account].[handle]) and an access token when using a MapBox layer. See http://www.mapbox.com/developers/api-overview/ for details";
t = "//{s}.tiles.mapbox.com/v4/" + i["mapbox.map_id"] + "/{z}/{x}/{y}.png?access_token=" + i["mapbox.access_token"], handle = i["mapbox.map_id"], a = i.subdomains || "abcd", o = i.attribution || 'Data: <a href="http://osm.org/copyright" target="_blank">OpenStreetMap</a>, Design: <a href="http://mapbox.com/about/maps" target="_blank">MapBox</a>'
} else if ("custom" == i.type && (t = i["custom.url"] || "", o = i.attribution || "", a = i.subdomains || "", i["custom.tms"])) i["custom.tms"];
return {
model: e,
mapTilesURL: t,
mapTilesAttribution: o,
mapTilesSubdomains: a
}
},
_newDataExplorer: function(e, t, o) {
var a = [{
id: "grid",
label: i("Grid").fetch(),
view: new recline.View.SlickGrid({
model: e
})
},
{
id: "graph",
label: i("Graph").fetch(),
view: new recline.View.Graph({
model: e
})
}];
a = a.filter(function(e) {
return "show" === o[e.id + "_tab"]
});
var r = [{
id: "valueFilter",
label: i("Filters").fetch(),
view: new recline.View.ValueFilter({
model: e
})
}, {
id: "extractor",
label: i("Extract").fetch(),
view: new recline.View.Extractor({
model: e,
site_url: this.options.site_url
})
}];
return new recline.View.MultiView({
el: this.el,
model: e,
views: a,
sidebarViews: r,
config: {
readOnly: !0
}
})
},
_renderControls: function(i, t, o) {
for (var a = e('<div class="clearfix ' + o + '" />'), r = 0; r < t.length; r++) a.append(t[r].el);
e(i).append(a)
}
}
});
4 changes: 4 additions & 0 deletions ckanext/dataexplorer/public/vendor/ckan.js/ckan.js
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,10 @@ if (isNodeModule) {
offset: queryObj.from || 0,
api_call_type: 'browser-data-explorer'
};
if(queryObj?.filters?.length > 0){
actualQuery.api_call_type = 'browser-data-explorer-filter'
}


if (queryObj.sort && queryObj.sort.length > 0) {
var _tmp = _.map(queryObj.sort, function(sortObj) {
Expand Down
21 changes: 15 additions & 6 deletions ckanext/dataexplorer/public/vendor/recline/recline.js
Original file line number Diff line number Diff line change
Expand Up @@ -4787,10 +4787,19 @@ this.recline.View = this.recline.View || {};
this.render();
//Timeout of 2 seconds ensures that the form has been rendered before the select element is accessed
setTimeout(() => {
document.getElementById("download-format").innerHTML =
DATASTORE_SEARCH_ROWS_MAX <= self.model.recordCount
? '<option value="compressed-csv">Compressed CSV</option>'
: '<option value="csv">CSV</option><option value="compressed-csv">Compressed CSV</option><option value="json">JSON</option>';
const downloadFormatElement = document.getElementById("download-format");
const compressedOptions = `
<option value="compressed-csv">Compressed CSV (GZIP)</option>
`;
const regularOptions = `
<option value="csv">CSV</option>
<option value="compressed-csv">Compressed CSV (ZIP)</option>
<option value="json">JSON</option>
`;

downloadFormatElement.innerHTML = DATASTORE_SEARCH_ROWS_MAX <= self.model.recordCount
? compressedOptions
: regularOptions;
}, 2000);

//Pre-Load helper libraries JSZip for zipping files
Expand Down Expand Up @@ -4830,7 +4839,7 @@ this.recline.View = this.recline.View || {};
},
extractFile: function (self, sql_query, format, query={}) {
var base_path = self.model.attributes.endpoint || self.options.site_url;
var endpoint = `${base_path}/3/action/datastore_search_sql?sql=${escape(sql_query)}&resource_id=${query.resource_id}`; // USE BASE_PATH IN PRODUCTION
var endpoint = `${base_path}/3/action/datastore_search_sql?sql=${escape(sql_query)}&resource_id=${query.resource_id}&format=${format}`; // USE BASE_PATH IN PRODUCTION
self.progress();

fetch(endpoint)
Expand Down Expand Up @@ -4938,7 +4947,7 @@ this.recline.View = this.recline.View || {};
<div class="modal" style="display: flex;">
<div class="row">
<div class="modal-content">
<p>An error occurred while extracting your requested data. If this error persists, please, send a report to nhsbsa.help@nhs.net</p>
<p>An error occurred while extracting your requested data. If this error persists, please, send a report to dataservicessupport@nhsbsa.nhs.uk</p>
<button class="btn extract-button modal-btn" id="cancel-btn">Cancel</button>
</div>
</div>
Expand Down