Skip to content
Open
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
4 changes: 2 additions & 2 deletions backend/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,13 @@ class BackendAdmin(ImportExportModelAdmin):
'fields': ('ntFilePath',),
}),
('UI Suggestions', {
'fields': ('maxDefault', 'fillPrefixes', 'filterEntities', 'filteredLanguage', 'supportedKeywords', 'supportedFunctions', 'suggestPrefixnamesForPredicates', 'supportedPredicateSuggestions'),
'fields': ('maxDefault', 'fillPrefixes', 'filterEntities', 'filteredLanguage', 'supportedKeywords', 'supportedFunctions', 'suggestPrefixnamesForPredicates', 'suggestSubjectsInEmptyLine', 'supportedPredicateSuggestions'),
}),
('Backend Suggestions', {
'fields': ('suggestSubjects', 'suggestPredicates', 'suggestObjects', 'dynamicSuggestions', 'replacePredicates'),
}),
('Showing names', {
'fields': ('subjectName', 'alternativeSubjectName', 'predicateName', 'alternativePredicateName', 'objectName', 'alternativeObjectName'),
'fields': ('subjectName', 'predicateName', 'objectName'),
}),
)

Expand Down
19 changes: 19 additions & 0 deletions backend/migrations/0056_backend_suggestsubjectsinemptyline.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Generated by Django 3.0.2 on 2020-05-22 09:23

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('backend', '0055_merge_20200425_1057'),
]

operations = [
migrations.AddField(
model_name='backend',
name='suggestSubjectsInEmptyLine',
field=models.BooleanField(
default=False, help_text='Suggest subjects when no character has been typed yet.', verbose_name='Suggest subject in empty lines.'),
),
]
30 changes: 30 additions & 0 deletions backend/migrations/0057_auto_20200522_1134.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Generated by Django 3.0.2 on 2020-05-22 09:34

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('backend', '0056_backend_suggestsubjectsinemptyline'),
]

operations = [
migrations.RemoveField(
model_name='backend',
name='alternativeObjectName',
),
migrations.RemoveField(
model_name='backend',
name='alternativePredicateName',
),
migrations.RemoveField(
model_name='backend',
name='alternativeSubjectName',
),
migrations.AlterField(
model_name='backend',
name='suggestSubjectsInEmptyLine',
field=models.BooleanField(default=False, help_text='Suggest subjects when no character has been typed yet.', verbose_name='Suggest subjects in empty lines.'),
),
]
27 changes: 7 additions & 20 deletions backend/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,36 +75,18 @@ class Backend(models.Model):
help_text="<a href=\"javascript:void(0)\" onclick=\"django.jQuery('.helpSubjectName').slideToggle();\">Need help?</a><div class=\"helpSubjectName\" style=\"display: none;\">Clause that tells QLever UI the name of a subject (without prefixes). Qlever UI expects the following variables to be used:<br>&nbsp;&nbsp;- &nbsp;?qleverui_entity: The subject that we want to get the name of<br>&nbsp;&nbsp;- &nbsp;?qleverui_name: The variable that will hold the subject's name<br>Your clause should end in a dot '.' or closing bracket '}'<br>Your clause will be used as following:<br>SELECT ?qleverui_name WHERE {<br>&nbsp;&nbsp;&nbsp;&nbsp;?qleverui_entity &lt;predicate&gt; &lt;object&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;OPTIONAL {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><em>subject name clause</em></b><br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}</div>",
verbose_name="Subject name clause")

alternativeSubjectName = models.TextField(
default='',
blank=True,
help_text="<a href=\"javascript:void(0)\" onclick=\"django.jQuery('.helpAlternativeSubjectName').slideToggle();\">Need help?</a><div class=\"helpAlternativeSubjectName\" style=\"display: none;\">Clause that tells QLever UI the alternative name of a subject (without prefixes). Qlever UI expects the following variables to be used:<br>&nbsp;&nbsp;- &nbsp;?qleverui_entity: The subject that we want to get the name of<br>&nbsp;&nbsp;- &nbsp;?qleverui_altname: The variable that will hold the subject's alternative name<br>Your clause should end in a dot '.' or closing bracket '}'<br>Your clause will be used as following:<br>SELECT ?qleverui_altname WHERE {<br>&nbsp;&nbsp;&nbsp;&nbsp;?qleverui_entity &lt;predicate&gt; &lt;object&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;OPTIONAL {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><em>alternative subject name clause</em></b><br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}</div>",
verbose_name="Alternative subject name clause")

predicateName = models.TextField(
default='',
blank=True,
help_text="<a href=\"javascript:void(0)\" onclick=\"django.jQuery('.helpPredicateName').slideToggle();\">Need help?</a><div class=\"helpPredicateName\" style=\"display: none;\">Clause that tells QLever UI the name of a predicate (without prefixes). Qlever UI expects the following variables to be used:<br>&nbsp;&nbsp;- &nbsp;?qleverui_entity: The predicate that we want to get the name of<br>&nbsp;&nbsp;- &nbsp;?qleverui_name: The variable that will hold the predicate's name<br>Your clause should end in a dot '.' or closing bracket '}'<br>Your clause will be used as following:<br>SELECT ?qleverui_name WHERE {<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;subject&gt; ?qleverui_entity &lt;object&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;OPTIONAL {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><em>predicate name clause</em></b><br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}</div>",
verbose_name="Predicate name clause")

alternativePredicateName = models.TextField(
default='',
blank=True,
help_text="<a href=\"javascript:void(0)\" onclick=\"django.jQuery('.helpAlternativePredicateName').slideToggle();\">Need help?</a><div class=\"helpAlternativePredicateName\" style=\"display: none;\">Clause that tells QLever UI the alternative name of a predicate (without prefixes). Qlever UI expects the following variables to be used:<br>&nbsp;&nbsp;- &nbsp;?qleverui_entity: The predicate that we want to get the name of<br>&nbsp;&nbsp;- &nbsp;?qleverui_altname: The variable that will hold the predicate's alternative name<br>Your clause should end in a dot '.' or closing bracket '}'<br>Your clause will be used as following:<br>SELECT ?qleverui_altname WHERE {<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;subject&gt; ?qleverui_entity &lt;object&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;OPTIONAL {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><em>alternative predicate name clause</em></b><br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}</div>",
verbose_name="Alternative predicate name clause")

objectName = models.TextField(
default='',
blank=True,
help_text="<a href=\"javascript:void(0)\" onclick=\"django.jQuery('.helpObjectName').slideToggle();\">Need help?</a><div class=\"helpObjectName\" style=\"display: none;\">Clause that tells QLever UI the name of an object (without prefixes). Qlever UI expects the following variables to be used:<br>&nbsp;&nbsp;- &nbsp;?qleverui_entity: The object that we want to get the name of<br>&nbsp;&nbsp;- &nbsp;?qleverui_name: The variable that will hold the object's name<br>Your clause should end in a dot '.' or closing bracket '}'<br>Your clause will be used as following:<br>SELECT ?qleverui_name WHERE {<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;subject&gt; &lt;predicate&gt; ?qleverui_entity<br>&nbsp;&nbsp;&nbsp;&nbsp;OPTIONAL {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><em>object name clause</em></b><br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}</div>",
verbose_name="Object name clause")

alternativeObjectName = models.TextField(
default='',
blank=True,
help_text="<a href=\"javascript:void(0)\" onclick=\"django.jQuery('.helpAlternativeObjectName').slideToggle();\">Need help?</a><div class=\"helpAlternativeObjectName\" style=\"display: none;\">Clause that tells QLever UI the alternativename of an object (without prefixes). Qlever UI expects the following variables to be used:<br>&nbsp;&nbsp;- &nbsp;?qleverui_entity: The object that we want to get the name of<br>&nbsp;&nbsp;- &nbsp;?qleverui_altname: The variable that will hold the object's alternative name<br>Your clause should end in a dot '.' or closing bracket '}'<br>Your clause will be used as following:<br>SELECT ?qleverui_altname WHERE {<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;subject&gt; &lt;predicate&gt; ?qleverui_entity<br>&nbsp;&nbsp;&nbsp;&nbsp;OPTIONAL {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><em>alternative object name clause</em></b><br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}</div>",
verbose_name="Alternative object name clause")

replacePredicates = models.TextField(
default='',
blank=True,
Expand Down Expand Up @@ -142,6 +124,11 @@ class Backend(models.Model):
help_text="Suggest Prefix names without a particular entity when autocompleting predicates.",
verbose_name="Suggest prefix names for predicates.")

suggestSubjectsInEmptyLine = models.BooleanField(
default=False,
help_text="Suggest subjects when no character has been typed yet.",
verbose_name="Suggest subjects in empty lines.")

fillPrefixes = models.BooleanField(
default=True,
help_text="Replace prefixes in suggestions even if they are not yet declared in the query. Add prefix declarations if a suggestion with not yet declared prefix is picked.",
Expand All @@ -154,7 +141,7 @@ class Backend(models.Model):

def save(self, *args, **kwargs):
# We need to replace \r because QLever can't handle them very well
for field in ('subjectName', 'predicateName', 'objectName', 'suggestSubjects', 'suggestPredicates', 'suggestObjects', 'alternativeSubjectName', 'alternativePredicateName', 'alternativeObjectName'):
for field in ('subjectName', 'predicateName', 'objectName', 'suggestSubjects', 'suggestPredicates', 'suggestObjects'):
setattr(self, field, str(getattr(self, field)).replace(
"\r\n", "\n").replace("\r", "\n"))
super(Backend, self).save(*args, **kwargs)
Expand Down Expand Up @@ -201,7 +188,7 @@ def predicateSuggestions(self):

def entityNameQueries(self):
data = {}
for field in ('subjectName', 'predicateName', 'objectName', 'suggestSubjects', 'suggestPredicates', 'suggestObjects', 'alternativeSubjectName', 'alternativePredicateName', 'alternativeObjectName'):
for field in ('subjectName', 'predicateName', 'objectName', 'suggestSubjects', 'suggestPredicates', 'suggestObjects'):
data[field.upper()] = getattr(self, field)
return json.dumps(data)

Expand Down
11 changes: 8 additions & 3 deletions backend/static/css/codemirror.css
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,14 @@
border-right: none;
width: 0;
}

/* Can style cursor different in overwrite (non-insert) mode */
.CodeMirror-overwrite .CodeMirror-cursor {
width: auto;
border: 0 !important;
background: rgba(73, 182, 255, 0.329);
}

/* Shown when moving in bi-directional text */
.CodeMirror div.CodeMirror-secondarycursor {
border-left: 1px solid silver;
Expand Down Expand Up @@ -83,9 +91,6 @@
100% {}
}

/* Can style cursor different in overwrite (non-insert) mode */
.CodeMirror-overwrite .CodeMirror-cursor {}

.cm-tab { display: inline-block; text-decoration: inherit; }

.CodeMirror-rulers {
Expand Down
3 changes: 0 additions & 3 deletions backend/static/css/style.css
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,6 @@ Custom Elements
}
}


[data-toggle="tooltip"] { cursor: pointer; }

.tooltip .tooltip-inner { background-color: #82B36F; max-width: 600px; word-wrap: break-word; }
.tooltip .tooltip-arrow { border-top-color: #82B36F !important; }

Expand Down
4 changes: 3 additions & 1 deletion backend/static/js/codemirror/modes/sparql/sparql-hint.js
Original file line number Diff line number Diff line change
Expand Up @@ -417,12 +417,13 @@ function getDynamicSuggestions(context) {
if (words.length == 1) {
suggestVariables = "both";
appendToSuggestions = " ";
if (SUGGESTSUBJECTS.length > 0) {
if (SUGGESTSUBJECTS.length > 0 && (word.length > 0 || SUGGEST_SUBJECTS_IN_EMPTY_LINE)) {
completionQuery = SUGGESTSUBJECTS;
nameList = subjectNames;
} else {
sendSparql = false;
}

} else if (words.length == 2) {
suggestVariables = word.startsWith('?') ? "normal" : false;
appendToSuggestions = " ";
Expand Down Expand Up @@ -530,6 +531,7 @@ function getDynamicSuggestions(context) {
}

function replaceQueryPlaceholders(completionQuery, word, prefixes, lines, words) {
word = escapeRegExp(word);
var word_with_bracket = ((word.startsWith("<") || word.startsWith('"')) ? "" : "<") + word.replace(/'/g, "\\'");
sparqlLines = completionQuery.replace(/%<CURRENT_WORD%/g, word_with_bracket).replace(/%CURRENT_WORD%/g, word);
sparqlLines = sparqlLines.replace(/%PREFIXES%/g, prefixes);
Expand Down
Loading