From 3f0f02e519fdaaf69741fe8c438d2d6a96769e9e Mon Sep 17 00:00:00 2001 From: Zoltan Szabo Date: Mon, 28 Jan 2013 15:14:34 +0200 Subject: [PATCH 1/6] Refs #9424; Added data persistence and versioning for eea.sparql --- docs/HISTORY.txt | 6 ++ eea/sparql/browser/sparql.py | 3 +- eea/sparql/browser/view.pt | 3 +- eea/sparql/cache/browser.py | 11 ++-- eea/sparql/cache/caching.pt | 5 +- eea/sparql/content/sparql.py | 108 ++++++++++++++++++++++++++++++++--- 6 files changed, 119 insertions(+), 17 deletions(-) diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index 40f98c9..c5c5f22 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -3,6 +3,12 @@ Changelog 2.4-dev - (unreleased) ---------------------- +* Upgrade step: + ZMI > portal_setup > profile "EEA Sparql" > import Diff tool & CMFEditions Repository Tool +* Feature: Data persistence and versioning + - Added versioning for sparql results + - Possibility to select static & live queries + [szabozo0 refs #9424] 2.3 - (2013-01-18) ------------------ diff --git a/eea/sparql/browser/sparql.py b/eea/sparql/browser/sparql.py index 8071870..920a528 100644 --- a/eea/sparql/browser/sparql.py +++ b/eea/sparql/browser/sparql.py @@ -163,11 +163,10 @@ def sparql2csv(self, dialect='excel'): header = '%s:%s' % (col, data['properties'][col]['valueType']) row.append(header) writter.writerow(row) - for item in data['items']: row = [] for col in headers: - row.append(unicode(item[col])) + row.append(unicode(item[col]).encode('utf')) writter.writerow(row) return '' diff --git a/eea/sparql/browser/view.pt b/eea/sparql/browser/view.pt index ac6b8eb..5b31cd3 100644 --- a/eea/sparql/browser/view.pt +++ b/eea/sparql/browser/view.pt @@ -36,7 +36,8 @@

Dataset preview

- +

(Static Query)

+

(Live Query)

diff --git a/eea/sparql/cache/browser.py b/eea/sparql/cache/browser.py index 398cc3a..3b16fc7 100644 --- a/eea/sparql/cache/browser.py +++ b/eea/sparql/cache/browser.py @@ -24,11 +24,14 @@ class CacheView(BrowserView): """ Caching for sparql query results """ def __call__(self): - if not "submit" in self.request.form: - return self.index() + if "invalidate_cache" in self.request.form: + event.notify(ObjectModifiedEvent(self.context)) + IStatusMessage(self.request).addStatusMessage("Cache invalidated") + if "invalidate_last_working_results" in self.request.form: + self.context.invalidateWorkingResult() + message = "Last working results invalidated" + IStatusMessage(self.request).addStatusMessage(message) - event.notify(ObjectModifiedEvent(self.context)) - IStatusMessage(self.request).addStatusMessage("Cache invalidated") return self.index() def purgeRelatedItems(obj, evt): diff --git a/eea/sparql/cache/caching.pt b/eea/sparql/cache/caching.pt index 03d29fc..dfa94c2 100644 --- a/eea/sparql/cache/caching.pt +++ b/eea/sparql/cache/caching.pt @@ -12,7 +12,10 @@
- +
+
diff --git a/eea/sparql/content/sparql.py b/eea/sparql/content/sparql.py index 19988d1..fe7867a 100644 --- a/eea/sparql/content/sparql.py +++ b/eea/sparql/content/sparql.py @@ -9,13 +9,14 @@ from Products.Archetypes.atapi import IntegerField from Products.Archetypes.atapi import SelectionWidget from Products.Archetypes.atapi import Schema -from Products.Archetypes.atapi import StringField, StringWidget +from Products.Archetypes.atapi import StringField, StringWidget, \ + BooleanWidget, BooleanField from Products.Archetypes.atapi import TextField, TextAreaWidget from Products.ZSPARQLMethod.Method import ZSPARQLMethod, \ interpolate_query, \ run_with_timeout, \ - query_and_get_result, \ parse_arg_spec, \ + query_and_get_result, \ map_arg_values from AccessControl.Permissions import view from eea.sparql.cache import ramcache, cacheSparqlKey @@ -26,6 +27,14 @@ from zope.interface import implements +from Products.CMFCore.utils import getToolByName +from Products.CMFEditions.interfaces.IModifier import FileTooLargeToVersionError + +from AccessControl import SpecialUsers +from AccessControl import getSecurityManager +from AccessControl.SecurityManagement import newSecurityManager, \ + setSecurityManager + SparqlBaseSchema = atapi.Schema(( StringField( name='endpoint_url', @@ -63,6 +72,24 @@ ), required=1 ), + BooleanField( + name='sparql_static', + widget=BooleanWidget( + label='Static query', + description='The data will be fetched only once', + ), + default=False, + required=0 + ), + TextField( + name='sparql_results', + widget=TextAreaWidget( + label="Results", + visible={'edit': 'invisible', 'view': 'invisible' } + ), + required=0, + + ), )) SparqlSchema = getattr(base.ATCTContent, 'schema', Schema(())).copy() + \ @@ -77,6 +104,8 @@ SparqlBaseSchema.copy() SparqlBookmarksFolderSchema['sparql_query'].widget.description = \ 'The query should return label, bookmark url, query' +SparqlBookmarksFolderSchema['sparql_static'].widget.visible['edit'] = \ + 'invisible' class Sparql(base.ATCTContent, ZSPARQLMethod): """Sparql""" @@ -127,25 +156,86 @@ def setTimeout(self, value): except Exception: self.timeout = 10 + security.declareProtected(view, 'invalidateWorkingResult') + def invalidateWorkingResult(self): + """ invalidate working results""" + self.cached_result = {} + self.setSparql_results("") + pr = getToolByName(self, 'portal_repository') + comment = "Invalidated last working result" + comment = comment.encode('utf') + try: + pr.save(obj=self, comment=comment) + except FileTooLargeToVersionError: + commands = view.getCommandSet('plone') + commands.issuePortalMessage( + """Changes Saved. Versioning for this file + has been disabled because it is too large.""", + msgtype="warn") + security.declareProtected(view, 'execute') def execute(self, **arg_values): """ Override execute from ZSPARQLMethod in order to have a default timeout """ + cached_result = getattr(self, 'cached_result', {}) cooked_query = interpolate_query(self.query, arg_values) - cache_key = {'query': cooked_query} - result = self.ZCacheable_get(keywords=cache_key) - if result is None: + force_requery = False + + if not self.getSparql_static(): + force_requery = True + + if cached_result == {}: + force_requery = True + + if force_requery: args = (self.endpoint_url, cooked_query) - result = run_with_timeout( + new_result = run_with_timeout( max(getattr(self, 'timeout', 10), 10), query_and_get_result, *args) - self.ZCacheable_set(result, keywords=cache_key) - - return result + force_save = False + + if new_result.get("result", {}) != {}: + if new_result != cached_result: + if len(new_result.get("result", {}).get("rows", {})) > 0: + force_save = True + else: + if len(cached_result.get('result', {}).\ + get('rows', {})) == 0: + force_save = True + + if force_save: + self.cached_result = new_result + new_sparql_results = u"" + for row in self.cached_result.get('result', {}).get('rows', {}): + for val in row: + new_sparql_results = new_sparql_results + \ + unicode(val) + " | " + new_sparql_results = new_sparql_results[0:-3] + "\n" + self.setSparql_results(new_sparql_results) + pr = getToolByName(self, 'portal_repository') + + comment = "Result changed" + comment = comment.encode('utf') + + oldSecurityManager = getSecurityManager() + newSecurityManager(self.REQUEST, SpecialUsers.system) + try: + pr.save(obj=self, comment=comment) + except FileTooLargeToVersionError: + commands = view.getCommandSet('plone') + commands.issuePortalMessage( + """Changes Saved. Versioning for this file + has been disabled because it is too large.""", + msgtype="warn") + setSecurityManager(oldSecurityManager) + + if new_result.get('exception', None): + self.cached_result['exception'] = new_result['exception'] + return self.cached_result class SparqlBookmarksFolder(ATFolder, Sparql): """Sparql Bookmarks Folder""" From a4b8afe9e8baaf1614b6bfdfe01ee7e28c73e1e0 Mon Sep 17 00:00:00 2001 From: Zoltan Szabo Date: Mon, 28 Jan 2013 15:16:08 +0200 Subject: [PATCH 2/6] Refs #9424; Added profile xmls --- eea/sparql/profiles/default/diff_tool.xml | 8 ++++++++ eea/sparql/profiles/default/repositorytool.xml | 9 +++++++++ 2 files changed, 17 insertions(+) create mode 100644 eea/sparql/profiles/default/diff_tool.xml create mode 100644 eea/sparql/profiles/default/repositorytool.xml diff --git a/eea/sparql/profiles/default/diff_tool.xml b/eea/sparql/profiles/default/diff_tool.xml new file mode 100644 index 0000000..4221bd4 --- /dev/null +++ b/eea/sparql/profiles/default/diff_tool.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/eea/sparql/profiles/default/repositorytool.xml b/eea/sparql/profiles/default/repositorytool.xml new file mode 100644 index 0000000..b623ac2 --- /dev/null +++ b/eea/sparql/profiles/default/repositorytool.xml @@ -0,0 +1,9 @@ + + + + + + + + + From da83388dfb51cbde9b2f1854b0959bd5991cbfb5 Mon Sep 17 00:00:00 2001 From: Zoltan Szabo Date: Wed, 30 Jan 2013 11:50:26 +0200 Subject: [PATCH 3/6] Refs #9424 #9608; Added quick preview for sparql queries; improved sparql edit for versioning --- docs/HISTORY.txt | 4 +- eea/sparql/browser/configure.zcml | 16 ++ eea/sparql/browser/sparql.py | 68 ++++++++ eea/sparql/configure.zcml | 1 + eea/sparql/content/sparql.py | 33 ++-- eea/sparql/profiles/default/skins.xml | 10 ++ eea/sparql/skins.zcml | 7 + .../sparql_textfield_with_preview.css | 12 ++ .../sparql_textfield_with_preview.js | 91 ++++++++++ .../sparql_textfield_with_preview.pt | 159 ++++++++++++++++++ jslint.log | 6 + 11 files changed, 391 insertions(+), 16 deletions(-) create mode 100644 eea/sparql/profiles/default/skins.xml create mode 100644 eea/sparql/skins.zcml create mode 100644 eea/sparql/skins/sparql_templates/sparql_textfield_with_preview.css create mode 100644 eea/sparql/skins/sparql_templates/sparql_textfield_with_preview.js create mode 100644 eea/sparql/skins/sparql_templates/sparql_textfield_with_preview.pt create mode 100644 jslint.log diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index c5c5f22..654b8ae 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -4,7 +4,9 @@ Changelog 2.4-dev - (unreleased) ---------------------- * Upgrade step: - ZMI > portal_setup > profile "EEA Sparql" > import Diff tool & CMFEditions Repository Tool + ZMI > portal_setup > profile "EEA Sparql" > import Skins & Diff tool & CMFEditions Repository Tool +* Feature: Added quick preview for sparql queries + [szabozo0 refs #9608] * Feature: Data persistence and versioning - Added versioning for sparql results - Possibility to select static & live queries diff --git a/eea/sparql/browser/configure.zcml b/eea/sparql/browser/configure.zcml index 645e51a..b6dd4a9 100644 --- a/eea/sparql/browser/configure.zcml +++ b/eea/sparql/browser/configure.zcml @@ -151,4 +151,20 @@ permission="cmf.ModifyPortalContent" /> + + + + diff --git a/eea/sparql/browser/sparql.py b/eea/sparql/browser/sparql.py index 920a528..6ffdbb1 100644 --- a/eea/sparql/browser/sparql.py +++ b/eea/sparql/browser/sparql.py @@ -6,6 +6,10 @@ from Products.ZSPARQLMethod.Method import interpolate_query_html from Products.ZSPARQLMethod.Method import map_arg_values from Products.ZSPARQLMethod.Method import parse_arg_spec +from Products.ZSPARQLMethod.Method import interpolate_query +from Products.ZSPARQLMethod.Method import run_with_timeout +from Products.ZSPARQLMethod.Method import query_and_get_result + from eea.sparql.converter.sparql2json import sparql2json from eea.sparql.converter.sparql2json import sortProperties from eea.versions import versions @@ -14,6 +18,7 @@ import json import urllib2 import contextlib +import cgi logger = logging.getLogger('eea.sparql') @@ -239,6 +244,11 @@ def isDavizInstalled(self): return has_daviz + def relatedItems(self): + """ Items what are back related to this query + """ + return json.dumps([[x.title, x.absolute_url()] + for x in self.context.getBRefs()]) class SparqlBookmarksFolder(Sparql): """SparqlBookmarksFolder view""" @@ -311,3 +321,61 @@ def __call__(self): except Exception, err: logger.exception(err) return "Sync done" + +class QuickPreview(BrowserView): + """ Quick Preview For Query + """ + + def preview(self): + """preview""" + tmp_query = self.request.get("sparql_query", "") + tmp_arg_spec = self.request.get("arg_spec", "") + tmp_endpoint = self.request.get("endpoint", "") + tmp_timeout = int(self.request.get("timeout", "0")) + + arg_spec = parse_arg_spec(tmp_arg_spec) + missing, arg_values = map_arg_values(arg_spec, self.request.form) + error = None + if missing: + error = "" + for missing_arg in missing: + error = error + "
Argument '%s' missing
" % missing_arg + else: + result = {} + data = [] + error = None + cooked_query = interpolate_query(tmp_query, arg_values) + args = (tmp_endpoint, cooked_query) + try: + result, error = {}, None + result = run_with_timeout(tmp_timeout, + query_and_get_result, + *args) + data = result.get('result') + error = error or result.get('exception') + except Exception: + import traceback + error = traceback.format_exc() + + if error: + return "
%s
" % error + + result = [] + result.append(u"") + result.append(u"") + result.append(u"") + for var_name in data.get('var_names', []): + result.append(u"" %var_name) + result.append(u"") + result.append(u"") + result.append(u"") + for row in data.get('rows', []): + result.append(u"") + for value in row: + result.append(u"" %cgi.escape(value.n3())) + result.append(u"") + result.append(u"") + result.append(u"
%s
%s
") + return "\n".join(result) + + diff --git a/eea/sparql/configure.zcml b/eea/sparql/configure.zcml index 07d63b4..43652fd 100644 --- a/eea/sparql/configure.zcml +++ b/eea/sparql/configure.zcml @@ -6,6 +6,7 @@ + diff --git a/eea/sparql/content/sparql.py b/eea/sparql/content/sparql.py index fe7867a..5d6d169 100644 --- a/eea/sparql/content/sparql.py +++ b/eea/sparql/content/sparql.py @@ -68,6 +68,9 @@ allowable_content_types = ('text/plain',), widget=TextAreaWidget( + macro="sparql_textfield_with_preview", + helper_js=("sparql_textfield_with_preview.js",), + helper_css=("sparql_textfield_with_preview.css",), label="Query", ), required=1 @@ -217,21 +220,21 @@ def execute(self, **arg_values): new_sparql_results = new_sparql_results[0:-3] + "\n" self.setSparql_results(new_sparql_results) pr = getToolByName(self, 'portal_repository') - - comment = "Result changed" - comment = comment.encode('utf') - - oldSecurityManager = getSecurityManager() - newSecurityManager(self.REQUEST, SpecialUsers.system) - try: - pr.save(obj=self, comment=comment) - except FileTooLargeToVersionError: - commands = view.getCommandSet('plone') - commands.issuePortalMessage( - """Changes Saved. Versioning for this file - has been disabled because it is too large.""", - msgtype="warn") - setSecurityManager(oldSecurityManager) + if self.portal_type in pr.getVersionableContentTypes(): + comment = "Result changed" + comment = comment.encode('utf') + + oldSecurityManager = getSecurityManager() + newSecurityManager(self.REQUEST, SpecialUsers.system) + try: + pr.save(obj=self, comment=comment) + except FileTooLargeToVersionError: + commands = view.getCommandSet('plone') + commands.issuePortalMessage( + """Changes Saved. Versioning for this file + has been disabled because it is too large.""", + msgtype="warn") + setSecurityManager(oldSecurityManager) if new_result.get('exception', None): self.cached_result['exception'] = new_result['exception'] diff --git a/eea/sparql/profiles/default/skins.xml b/eea/sparql/profiles/default/skins.xml new file mode 100644 index 0000000..30ddbe5 --- /dev/null +++ b/eea/sparql/profiles/default/skins.xml @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/eea/sparql/skins.zcml b/eea/sparql/skins.zcml new file mode 100644 index 0000000..9572803 --- /dev/null +++ b/eea/sparql/skins.zcml @@ -0,0 +1,7 @@ + + + + + diff --git a/eea/sparql/skins/sparql_templates/sparql_textfield_with_preview.css b/eea/sparql/skins/sparql_templates/sparql_textfield_with_preview.css new file mode 100644 index 0000000..715863d --- /dev/null +++ b/eea/sparql/skins/sparql_templates/sparql_textfield_with_preview.css @@ -0,0 +1,12 @@ +.sparql-preview-div { + background-color:#DDD; + float:left; +} + +.sparql-preview-label { + font-size:14px; +} + +.sparql-readonly-field { + background-color:#DDD; +} \ No newline at end of file diff --git a/eea/sparql/skins/sparql_templates/sparql_textfield_with_preview.js b/eea/sparql/skins/sparql_templates/sparql_textfield_with_preview.js new file mode 100644 index 0000000..c36f984 --- /dev/null +++ b/eea/sparql/skins/sparql_templates/sparql_textfield_with_preview.js @@ -0,0 +1,91 @@ +function preview_sparql(){ + var ajax_data = { + "endpoint" : jQuery("#endpoint_url").attr("value"), + "timeout" : jQuery("#timeout").attr("value"), + "arg_spec" : jQuery("#arg_spec").attr("value"), + "sparql_query" : jQuery("#sparql_query").attr("value") + }; + var preview_arguments = jQuery(".sparql-preview-arguments").attr("value"); + var args_list = preview_arguments.split("&"); + jQuery.each(args_list, function(idx, arg){ + ajax_data[arg.split("=")[0]] = arg.split("=")[1]; + }); + jQuery.ajax({ + url:portal_url + "/sparql.quick_preview", + type:"POST", + data: ajax_data, + success:function(data){ + var sparql_preview = jQuery("
"); + jQuery(data).appendTo(sparql_preview); + sparql_preview.dialog({ + title:"Preview for " + jQuery("#title").attr("value"), + modal:true, + width:'auto', + create: function() { + $(this).css("maxHeight", 600); + $(this).css("maxWidth", 800); + } + }); + } + }); +} + +function sparql_setstatic(){ + if (jQuery("#sparql_static").attr("checked")){ + jQuery("#endpoint_url").attr("readonly", true); + jQuery("#timeout").attr("disabled", true); + jQuery("#arg_spec").attr("readonly", true); + jQuery("#sparql_query").attr("readonly", true); + + jQuery("#endpoint_url").addClass("sparql-readonly-field"); + jQuery("#arg_spec").addClass("sparql-readonly-field"); + jQuery("#sparql_query").addClass("sparql-readonly-field"); + } + else{ + jQuery("#endpoint_url").attr("readonly", false); + jQuery("#timeout").attr("disabled", false); + jQuery("#arg_spec").attr("readonly", false); + jQuery("#sparql_query").attr("readonly", false); + jQuery(".sparql-readonly-field").removeClass("sparql-readonly-field"); + } +} + +function check_relations(){ + if (window.location.href.indexOf("portal_factory") !== -1){ + return; + } + jQuery.ajax({ + url:absolute_url + "/sparql.related_items", + type:"GET", + success:function(data){ + var back_rels = JSON.parse(data); + if (back_rels.length !== 0){ + var warningMessage = jQuery( + '
'+ + '
Warning
'+ + '
' + + 'The result of this query is used by:' + + '
    ' + + 'Modifying the query may cause problems in them.' + + ''+ + '
    '); + jQuery("#sparql-base-edit").prepend(warningMessage); + jQuery.each(back_rels, function(idx, rel){ + var rel_msg = jQuery( + '
  • '+rel[0]+'
  • ' + ); + rel_msg.appendTo(".sparql-back-relations"); + }); + } + } + }); + +// jQuery("
    XXX
    ").after(".documentFirstHeading"); +} +jQuery(document).ready(function($) { + jQuery(".sparql-query-results-preview").click(preview_sparql); + jQuery("#sparql_static").click(sparql_setstatic); + sparql_setstatic(); + check_relations(); +}); diff --git a/eea/sparql/skins/sparql_templates/sparql_textfield_with_preview.pt b/eea/sparql/skins/sparql_templates/sparql_textfield_with_preview.pt new file mode 100644 index 0000000..b7af971 --- /dev/null +++ b/eea/sparql/skins/sparql_templates/sparql_textfield_with_preview.pt @@ -0,0 +1,159 @@ + + + + + + + + + + + textarea + + + + + + + + +
    + + characters remaining +
    + +
    + + label + + content + +
    + +
    +
    + + + + + +
    + + +
    +
    + + + +
    +
    + + + + + + + + +
    + + +
    +
    + Arguments for preview should look like: arg1=value1&arg2=value2
    +
    + +
    +
    + + + + + + + + + + + + + diff --git a/jslint.log b/jslint.log new file mode 100644 index 0000000..b6d7b62 --- /dev/null +++ b/jslint.log @@ -0,0 +1,6 @@ + + + + + + From 2cb6cc58eb6c0fe2878ffc15c66406aa6288c168 Mon Sep 17 00:00:00 2001 From: Zoltan Szabo Date: Wed, 30 Jan 2013 11:51:46 +0200 Subject: [PATCH 4/6] Removed jslint.log --- jslint.log | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 jslint.log diff --git a/jslint.log b/jslint.log deleted file mode 100644 index b6d7b62..0000000 --- a/jslint.log +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - From ebb332d221a242f0942a904043b523d566d9be2d Mon Sep 17 00:00:00 2001 From: Zoltan Szabo Date: Thu, 31 Jan 2013 10:55:56 +0200 Subject: [PATCH 5/6] Updated upgrade step --- docs/HISTORY.txt | 4 ++-- eea/sparql/profiles/default/metadata.xml | 2 +- eea/sparql/upgrades/configure.zcml | 12 ++++++++++++ 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index 654b8ae..71485fc 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -3,8 +3,8 @@ Changelog 2.4-dev - (unreleased) ---------------------- -* Upgrade step: - ZMI > portal_setup > profile "EEA Sparql" > import Skins & Diff tool & CMFEditions Repository Tool +* Upgrade step: Within "Plone > Site setup > Add-ons" click on + upgrade button available for eea.sparql. * Feature: Added quick preview for sparql queries [szabozo0 refs #9608] * Feature: Data persistence and versioning diff --git a/eea/sparql/profiles/default/metadata.xml b/eea/sparql/profiles/default/metadata.xml index 024a426..3a96a49 100644 --- a/eea/sparql/profiles/default/metadata.xml +++ b/eea/sparql/profiles/default/metadata.xml @@ -1,6 +1,6 @@ - 1001 + 2400 profile-eea.versions:default diff --git a/eea/sparql/upgrades/configure.zcml b/eea/sparql/upgrades/configure.zcml index 21ec305..a857057 100644 --- a/eea/sparql/upgrades/configure.zcml +++ b/eea/sparql/upgrades/configure.zcml @@ -14,4 +14,16 @@ + + + + + + From 9957afe74417488b182d5a4f620edde9b3a24dbc Mon Sep 17 00:00:00 2001 From: Zoltan Szabo Date: Thu, 31 Jan 2013 13:24:46 +0200 Subject: [PATCH 6/6] Refs #9608; Display a message while the quick preview is executed --- .../sparql_textfield_with_preview.css | 16 ++++++++++++++++ .../sparql_textfield_with_preview.js | 4 ++++ 2 files changed, 20 insertions(+) diff --git a/eea/sparql/skins/sparql_templates/sparql_textfield_with_preview.css b/eea/sparql/skins/sparql_templates/sparql_textfield_with_preview.css index 715863d..04bbb26 100644 --- a/eea/sparql/skins/sparql_templates/sparql_textfield_with_preview.css +++ b/eea/sparql/skins/sparql_templates/sparql_textfield_with_preview.css @@ -9,4 +9,20 @@ .sparql-readonly-field { background-color:#DDD; +} + +.sparql-preview-loading { + margin:auto; + width:100%; + top:40%; + text-align:center; + position:fixed; + z-index:9999; + font-size: 22px; + font-weight: bold; +} +.sparql-preview-loading > div { + background-color:gray; + width:300px; + margin:auto; } \ No newline at end of file diff --git a/eea/sparql/skins/sparql_templates/sparql_textfield_with_preview.js b/eea/sparql/skins/sparql_templates/sparql_textfield_with_preview.js index c36f984..7b62ab3 100644 --- a/eea/sparql/skins/sparql_templates/sparql_textfield_with_preview.js +++ b/eea/sparql/skins/sparql_templates/sparql_textfield_with_preview.js @@ -10,11 +10,15 @@ function preview_sparql(){ jQuery.each(args_list, function(idx, arg){ ajax_data[arg.split("=")[0]] = arg.split("=")[1]; }); + + var loading_msg = jQuery("
    Executing query...
    "); + jQuery(loading_msg).appendTo("body"); jQuery.ajax({ url:portal_url + "/sparql.quick_preview", type:"POST", data: ajax_data, success:function(data){ + jQuery(".sparql-preview-loading").remove(); var sparql_preview = jQuery("
    "); jQuery(data).appendTo(sparql_preview); sparql_preview.dialog({