aboutsummaryrefslogtreecommitdiff
path: root/javascript/app
diff options
context:
space:
mode:
Diffstat (limited to 'javascript/app')
-rw-r--r--javascript/app/app.js2
-rw-r--r--javascript/app/components/bottom-panel.js6
-rw-r--r--javascript/app/components/file-tree.js30
-rw-r--r--javascript/app/components/haskell-module.js136
-rw-r--r--javascript/app/components/identifier-info.js16
-rw-r--r--javascript/app/components/identifier-name.js4
-rw-r--r--javascript/app/components/infinite-list.js14
-rw-r--r--javascript/app/components/info-window.js30
-rw-r--r--javascript/app/components/input-with-autocomplete.js14
-rw-r--r--javascript/app/components/instance-info.js2
-rw-r--r--javascript/app/components/paginated-list.js10
-rw-r--r--javascript/app/components/resizable-panel.js4
-rw-r--r--javascript/app/components/text-file.js6
-rw-r--r--javascript/app/components/type-signature-text.js2
-rw-r--r--javascript/app/components/type-signature.js8
-rw-r--r--javascript/app/controllers/package.js4
-rw-r--r--javascript/app/controllers/package/index.js2
-rw-r--r--javascript/app/controllers/package/search.js2
-rw-r--r--javascript/app/controllers/packages.js4
-rw-r--r--javascript/app/controllers/search.js2
-rw-r--r--javascript/app/router.js4
-rw-r--r--javascript/app/routes/package.js2
-rw-r--r--javascript/app/routes/package/index.js6
-rw-r--r--javascript/app/routes/package/search.js4
-rw-r--r--javascript/app/routes/package/show/file.js16
-rw-r--r--javascript/app/routes/package/show/index.js6
-rw-r--r--javascript/app/routes/search.js8
-rw-r--r--javascript/app/services/settings.js2
-rw-r--r--javascript/app/services/store.js28
-rw-r--r--javascript/app/styles/app.scss54
-rw-r--r--javascript/app/templates/bad-url.hbs2
-rw-r--r--javascript/app/templates/components/haskell-module.hbs6
-rw-r--r--javascript/app/templates/components/identifier-name.hbs2
-rw-r--r--javascript/app/templates/components/paginated-list.hbs6
-rw-r--r--javascript/app/templates/package.hbs8
-rw-r--r--javascript/app/templates/package/index.hbs6
-rw-r--r--javascript/app/templates/package/show/file.hbs4
-rw-r--r--javascript/app/templates/search.hbs2
-rw-r--r--javascript/app/utils/api-urls.js4
-rw-r--r--javascript/app/utils/color-themes.js26
-rw-r--r--javascript/app/utils/go-to-definition.js14
-rw-r--r--javascript/app/utils/language-extensions.js10
-rw-r--r--javascript/app/utils/line-selection.js20
43 files changed, 269 insertions, 269 deletions
diff --git a/javascript/app/app.js b/javascript/app/app.js
index 9b24136..4f3fd63 100644
--- a/javascript/app/app.js
+++ b/javascript/app/app.js
@@ -6,7 +6,7 @@ import config from './config/environment';
var App;
App = Ember.Application.extend({
- modulePrefix: config.modulePrefix,
+ modulePrefix: config.modulePrefix,
Resolver: Resolver
});
diff --git a/javascript/app/components/bottom-panel.js b/javascript/app/components/bottom-panel.js
index 5d8b5bc..6415d0e 100644
--- a/javascript/app/components/bottom-panel.js
+++ b/javascript/app/components/bottom-panel.js
@@ -1,6 +1,6 @@
import Ember from 'ember';
-function show(component) {
+function show(component) {
const height = Math.floor(component.$containerElement.height() /2);
component.$().css({
"display":"block",
@@ -40,13 +40,13 @@ export default Ember.Component.extend({
}
});
});
- },
+ },
visibilityObserver : Ember.observer('visible',function () {
this.get('visible') ? show(this) : hide(this);
}),
actions : {
close () {
- this.set('visible',false);
+ this.set('visible',false);
}
}
});
diff --git a/javascript/app/components/file-tree.js b/javascript/app/components/file-tree.js
index d255229..7c5e112 100644
--- a/javascript/app/components/file-tree.js
+++ b/javascript/app/components/file-tree.js
@@ -10,7 +10,7 @@ const directoryTreeToJsTree = function (packageId,directoryTree) {
jsTreeNode.a_attr = {href:"/package/" + packageId + "/show/" + node.path};
}
if(node.tag === "Dir") {
- jsTreeNode.children = directoryTreeToJsTree(packageId,node);
+ jsTreeNode.children = directoryTreeToJsTree(packageId,node);
jsTreeNode.state = {"opened" : containsHaskellModule(node)};
} else {
if(node.isHaskellModule) {
@@ -25,8 +25,8 @@ const directoryTreeToJsTree = function (packageId,directoryTree) {
});
};
-const containsHaskellModule = function(node) {
- return node.contents.some((n) => {
+const containsHaskellModule = function(node) {
+ return node.contents.some((n) => {
if(n.tag === "File") {
return n.isHaskellModule;
} else {
@@ -35,9 +35,9 @@ const containsHaskellModule = function(node) {
});
}
-const fileExtension = function (filename) {
- const idx = filename.lastIndexOf('.');
- return (idx < 1) ? "" : filename.substr(idx + 1);
+const fileExtension = function (filename) {
+ const idx = filename.lastIndexOf('.');
+ return (idx < 1) ? "" : filename.substr(idx + 1);
}
export default Ember.Component.extend({
@@ -49,10 +49,10 @@ export default Ember.Component.extend({
});
}),
didInsertElement : function () {
- this._super(...arguments);
+ this._super(...arguments);
const element = this.element.getElementsByClassName('file-tree')[0];
const component = this;
-
+
const jstreeElement = Ember.$(element).jstree({
'core' : {
'data' : directoryTreeToJsTree(this.get('packageId'),this.get('directoryTree'))
@@ -69,16 +69,16 @@ export default Ember.Component.extend({
'sort' : function (a,b) {
const node1 = this.get_node(a).data;
const node2 = this.get_node(b).data;
- if(component.get("sortType") === "alphabetical") {
+ if(component.get("sortType") === "alphabetical") {
return node1.name > node2.name;
- } else {
+ } else {
const extendedName1 = (node1.tag === "Dir" ? "0" : "1") + fileExtension(node1.name) + node1.name;
- const extendedName2 = (node2.tag === "Dir" ? "0" : "1") + fileExtension(node2.name) + node2.name;
+ const extendedName2 = (node2.tag === "Dir" ? "0" : "1") + fileExtension(node2.name) + node2.name;
return extendedName1 > extendedName2;
}
}
});
-
+
jstreeElement.on("select_node.jstree",(event,data) => {
const file = data.node.data;
if(file.tag != "Dir") {
@@ -86,8 +86,8 @@ export default Ember.Component.extend({
}
});
- const jstree = jstreeElement.jstree(true);
-
+ const jstree = jstreeElement.jstree(true);
+
if(this.get('currentFile')) {
jstree.select_node(this.get('currentFile'));
const node = jstree.get_node(this.get('currentFile'),true)[0];
@@ -111,7 +111,7 @@ export default Ember.Component.extend({
}
}),
actions : {
- hide() {
+ hide() {
this.get('hide')();
}
}
diff --git a/javascript/app/components/haskell-module.js b/javascript/app/components/haskell-module.js
index 7084510..187e6c5 100644
--- a/javascript/app/components/haskell-module.js
+++ b/javascript/app/components/haskell-module.js
@@ -19,17 +19,17 @@ function compareLocations (p1,p2) {
}
}
-function buildSrcSpan(sourceCodeLines,start,end) {
+function buildSrcSpan(sourceCodeLines,start,end) {
if(sourceCodeLines[start.line] && sourceCodeLines[end.line]) {
if(start.line === end.line) {
return sourceCodeLines[start.line].slice(start.column-1,end.column-1);
- } else {
+ } else {
const firstLine = sourceCodeLines[start.line];
let middleLines = [];
- for(let i = start.line + 1; i < end.line;i ++) {
+ for(let i = start.line + 1; i < end.line;i ++) {
middleLines.push(sourceCodeLines[i]);
}
- const lastLine = sourceCodeLines[end.line];
+ const lastLine = sourceCodeLines[end.line];
const minOffset = Math.min(start.column,
(middleLines.concat([lastLine]))
.map((line) => line.search(/\S/))
@@ -52,7 +52,7 @@ function modifyClass(element,on) {
}
function highlightIdentifiers(parentElement,identifierElement,on) {
- if(identifierElement.id) {
+ if(identifierElement.id) {
const identifiers = Array.prototype.slice.call(parentElement.querySelectorAll("span[id='"+identifierElement.id+"']"));
identifiers.forEach((identifier) => {
modifyClass(identifier,on);
@@ -63,7 +63,7 @@ function highlightIdentifiers(parentElement,identifierElement,on) {
}
//divident is a string
-//divident may have any number of digits
+//divident may have any number of digits
function modulo(divident, divisor) {
return Array.from(divident).map(c => parseInt(c))
.reduce((acc, value) => {
@@ -82,12 +82,12 @@ function identifierStyle(identifierElement,
occurrences,
path,
colorTheme,
- moduleName) {
+ moduleName) {
const idOcc = occurrences[identifierElement.dataset.occurrence];
-
+
let color = colorTheme.defaultColor;
- let fontWeight;
-
+ let fontWeight;
+
if(idOcc) {
if(idOcc.sort.tag === 'TypeId') {
color = colorTheme.typeColor;
@@ -102,7 +102,7 @@ function identifierStyle(identifierElement,
const idInfo = identifiers[identifierElement.dataset.identifier];
if(idInfo) {
if(isDefinedInCurrentModule(moduleName,path,idInfo)) {
- color = colorTheme.topLevelIdFromCurrentModule;
+ color = colorTheme.topLevelIdFromCurrentModule;
} else if(idInfo.sort === "Internal" && idInfo.locationInfo.tag === "ExactLocation") {
const colorNumber = modulo(identifierElement.id,colorTheme.localIdentifierColor.length);
color = colorTheme.localIdentifierColor[colorNumber];
@@ -111,7 +111,7 @@ function identifierStyle(identifierElement,
}
}
}
-
+
return "color:"+color+";"
+(fontWeight ? "font-weight:" + fontWeight : "")+";"
+(idOcc.isBinder ? "text-decoration:underline;" : "");
@@ -122,16 +122,16 @@ function initializeIdentifiers (sourceCodeContainerElement,component) {
if(identifierElements.length > 0) {
const timeout = 250;//milliseconds
let timer = null;
-
+
identifierElements.forEach((identifierElement) => {
-
+
const cssText = identifierStyle(identifierElement,
component.get('identifiers'),
- component.get('occurrences'),
+ component.get('occurrences'),
component.get('path'),
component.get('colorTheme'),
component.get('name'));
-
+
identifierElement.style.cssText = cssText;
//go to definition
@@ -139,31 +139,31 @@ function initializeIdentifiers (sourceCodeContainerElement,component) {
if(timer) {
clearTimeout(timer);
}
-
+
if(!window.getSelection().isCollapsed) {
return;
}
- const identifierInfo = component.get('identifiers')[identifierElement.dataset.identifier];
+ const identifierInfo = component.get('identifiers')[identifierElement.dataset.identifier];
const idOccurrenceInfo = component.get('occurrences')[identifierElement.dataset.occurrence];
const currentLineNumber = parseInt(identifierElement.parentNode.dataset.line);
-
+
if(idOccurrenceInfo.sort.tag === "ModuleId") {
goToDefinition(component.get('store'),
idOccurrenceInfo.sort.contents,
event.which,
currentLineNumber);
}
- else {
- if(identifierInfo && (event.which === 1 || event.which === 2)) {
+ else {
+ if(identifierInfo && (event.which === 1 || event.which === 2)) {
if(!idOccurrenceInfo.isBinder) {
goToDefinition(component.get('store'),
identifierInfo.locationInfo,
event.which,
currentLineNumber);
} else {
- if(identifierInfo.sort === "External") {
+ if(identifierInfo.sort === "External") {
component.get('findReferences')(component.get('packageId'),
identifierInfo.externalId,
identifierInfo.demangledOccName,
@@ -173,7 +173,7 @@ function initializeIdentifiers (sourceCodeContainerElement,component) {
}
}
}
- }
+ }
identifierElement.onmouseover = () => {
highlightIdentifiers(sourceCodeContainerElement,identifierElement,true);
if(timer) {
@@ -185,27 +185,27 @@ function initializeIdentifiers (sourceCodeContainerElement,component) {
const identifierOccurrence = component.get('occurrences')[identifierElement.dataset.occurrence];
console.log(identifierOccurrence);
console.log(identifierInfo);
-
+
component.set('selectedIdentifier',identifierElement);
component.set('currentLineNumber',parseInt(identifierElement.parentNode.dataset.line) || 1);
component.set('identifierInfo',identifierInfo);
component.set('identifierOccurrence',identifierOccurrence);
component.set('hasSelectedExpression',false);
component.set('isHoveredOverIdentifier',true);
-
+
});
},timeout);
};
-
+
identifierElement.onmouseout = () => {
highlightIdentifiers(sourceCodeContainerElement,identifierElement,false);
-
+
if(timer) {
clearTimeout(timer);
}
-
+
timer = setTimeout (() => {
- Ember.run.next(component,() => {
+ Ember.run.next(component,() => {
component.set('isHoveredOverIdentifier',false);
});
},timeout);
@@ -224,19 +224,19 @@ function contains (node, other) {
function initializeExpressionInfo(sourceCodeContainerElement,component) {
const lineElements = Array.prototype.slice.call(sourceCodeContainerElement.querySelectorAll("td.line-content"));
if(lineElements.length > 0) {
-
+
//Line numbers start with 1
let sourceCodeLines = [""];
-
+
lineElements.forEach((el) => {
sourceCodeLines.push(el.textContent);
});
-
- const allowedNodeNames = ["#text","SPAN","TD"];
+
+ const allowedNodeNames = ["#text","SPAN","TD"];
let isLoading = false;
let shouldWait = false;
const timeout = 400;//milliseconds
-
+
const onmouseup = function() {
Ember.run.next(() => {
if(isLoading || shouldWait) {
@@ -244,14 +244,14 @@ function initializeExpressionInfo(sourceCodeContainerElement,component) {
}
shouldWait = true;
setTimeout(() => {shouldWait = false;},timeout);
-
+
component.set('hasSelectedExpression',false);
-
- const selection = window.getSelection();
-
+
+ const selection = window.getSelection();
+
//Selection of multiple lines inside a table doesn't work in Firefox
//https://bugzilla.mozilla.org/show_bug.cgi?id=365900
-
+
if(!(selection.anchorNode && selection.focusNode)
|| !contains(sourceCodeContainerElement,selection.anchorNode)
|| !contains(sourceCodeContainerElement,selection.focusNode)
@@ -259,16 +259,16 @@ function initializeExpressionInfo(sourceCodeContainerElement,component) {
|| (allowedNodeNames.indexOf(selection.focusNode.nodeName) === -1)
|| selection.isCollapsed) {
return;
- }
-
+ }
+
// Detects whether the selection is backwards
const detectionRange = document.createRange();
detectionRange.setStart(selection.anchorNode, selection.anchorOffset);
detectionRange.setEnd(selection.focusNode, selection.focusOffset);
const isBackward = detectionRange.collapsed;
-
+
let startNode,startNodeOffset,endNode,endNodeOffset;
-
+
if(isBackward) {
startNode = selection.focusNode;
startNodeOffset = selection.focusOffset;
@@ -283,8 +283,8 @@ function initializeExpressionInfo(sourceCodeContainerElement,component) {
let lineStart,columnStart,lineEnd,columnEnd;
let infoWindowTargetElement;
-
-
+
+
//HTML inside source code container :
//<tr><td><span data-start="1" date-end="3">abc</span><span>...</span></td></tr>
//<tr>...</tr>
@@ -292,17 +292,17 @@ function initializeExpressionInfo(sourceCodeContainerElement,component) {
const parent = startNode.parentNode;//<span>
columnStart = parseInt(parent.dataset.start) + startNodeOffset;
lineStart = parseInt(parent.parentNode.dataset.line);
-
+
if(startNodeOffset === startNode.textContent.length && parent.nextSibling === null) {
const tr = startNode.parentNode.parentNode.parentNode;// span -> td -> tr
-
+
//Skipping empty lines
- let nextLine = tr.nextSibling;
+ let nextLine = tr.nextSibling;
while(nextLine.children[1].textContent === "") {
nextLine = nextLine.nextSibling;
}
infoWindowTargetElement = nextLine.children[1].children[0];
-
+
} else {
if(!(startNodeOffset === 0) && (parent.nextSibling)) {
infoWindowTargetElement = parent.nextSibling;
@@ -320,7 +320,7 @@ function initializeExpressionInfo(sourceCodeContainerElement,component) {
nextLine = nextLine.nextSibling;
}
infoWindowTargetElement = nextLine.children[1].children[0];
-
+
} else if(startNode.nodeName === "TD") {
if(startNodeOffset > 0) {
const child = startNode.children[startNodeOffset-1];
@@ -330,10 +330,10 @@ function initializeExpressionInfo(sourceCodeContainerElement,component) {
}
lineStart = parseInt(startNode.id.slice(2));
infoWindowTargetElement = startNode.children[0];
- }
-
+ }
+
if(endNode.nodeName === "#text") {
- columnEnd = parseInt(endNode.parentNode.dataset.start) + endNodeOffset;
+ columnEnd = parseInt(endNode.parentNode.dataset.start) + endNodeOffset;
lineEnd = parseInt(endNode.parentNode.parentNode.dataset.line);
} else if(endNode.nodeName === "SPAN") {
columnEnd = 1;
@@ -341,22 +341,22 @@ function initializeExpressionInfo(sourceCodeContainerElement,component) {
} else if(endNode.nodeName === "TD"){
if(endNodeOffset > 0) {
const child = endNode.children[endNodeOffset-1];
- columnEnd = parseInt(child.dataset.start);
+ columnEnd = parseInt(child.dataset.start);
} else {
columnEnd = 1;
}
lineEnd = parseInt(endNode.id.slice(2));
- }
-
+ }
+
const loadExprPromise = component.get('store').loadExpressions(
component.get('packageId'),
- component.get('path'),
+ component.get('path'),
lineStart,
columnStart,
lineEnd,
columnEnd);
isLoading = true;
-
+
loadExprPromise.then((expressions) => {
Ember.run.next(() => {
if(expressions && expressions.length > 0) {
@@ -368,7 +368,7 @@ function initializeExpressionInfo(sourceCodeContainerElement,component) {
return 1;
}
});
-
+
const expressionsWithSourceCode = expressions.reduce((result,expression) => {
const object = Ember.copy(expression);
const srcSpan = buildSrcSpan(sourceCodeLines,
@@ -387,15 +387,15 @@ function initializeExpressionInfo(sourceCodeContainerElement,component) {
component.set('expressions',expressionsWithSourceCode);
component.set('currentLineNumber',parseInt(infoWindowTargetElement.parentNode.dataset.line) || 1);
component.set('hasSelectedExpression',true);
-
+
}
}
isLoading = false;
});
- });
+ });
});
};
-
+
sourceCodeContainerElement.addEventListener('mouseup',onmouseup);
component._onmouseup = onmouseup;
}
@@ -418,10 +418,10 @@ export default Ember.Component.extend({
this.set('filteredDeclarations',filteredDeclarations);
});
}, 300);
- }),
+ }),
identifierLocationInfo : Ember.computed('identifierInfo','identifierOccurrence',function() {
const idOcc = this.get('identifierOccurrence');
- const idInfo = this.get('identifierInfo');
+ const idInfo = this.get('identifierInfo');
if(idOcc) {
if(idOcc.sort.tag === "ModuleId") {
return idOcc.sort.contents;
@@ -470,10 +470,10 @@ export default Ember.Component.extend({
didReceiveAttrs() {
this.set('filteredDeclarations',this.get('declarations'));
},
- didInsertElement() {
+ didInsertElement() {
this._super(...arguments);
const sourceCodeContainerElement = this.element.querySelector('.source-code-container');
- sourceCodeContainerElement.innerHTML = this.get('html');
+ sourceCodeContainerElement.innerHTML = this.get('html');
this.sourceCodeContainerElement = sourceCodeContainerElement;
// Add links to Haskell language extensions docs
@@ -493,7 +493,7 @@ export default Ember.Component.extend({
}
i = i + 1;
}
-
+
this.element.parentNode.scrollTop = 0;
const declarations = this.element.querySelector('.declarations-content');
this.set('query','');
@@ -510,7 +510,7 @@ export default Ember.Component.extend({
this.cleanup();
},
actions : {
- goToLine(lineNumber) {
+ goToLine(lineNumber) {
window.location.hash = "L"+lineNumber;
},
toggleShowDeclarations() {
diff --git a/javascript/app/components/identifier-info.js b/javascript/app/components/identifier-info.js
index 0e870a2..79c35c6 100644
--- a/javascript/app/components/identifier-info.js
+++ b/javascript/app/components/identifier-info.js
@@ -1,7 +1,7 @@
import Ember from 'ember';
import {goToDefinition} from '../utils/go-to-definition';
-export default Ember.Component.extend({
+export default Ember.Component.extend({
store : Ember.inject.service('store'),
downloadedDocumentation : null,
didInsertElement () {
@@ -26,25 +26,25 @@ export default Ember.Component.extend({
this.element.removeEventListener('mouseup',this._onmouseup);
}
},
- //Naughty record selectors :
+ //Naughty record selectors :
//https://github.com/ghc/ghc/blob/ced2cb5e8fbf4493488d1c336da7b00d174923ce/compiler/typecheck/TcTyDecls.hs#L940-L961
isNaughtyRecSel : Ember.computed('identifierInfo',function () {
const idInfo = this.get('identifierInfo');
- return idInfo ? (idInfo.details === "RecSelIdNaughty") : false;
+ return idInfo ? (idInfo.details === "RecSelIdNaughty") : false;
}),
isExternalIdentifier : Ember.computed('identifierInfo',function () {
const idInfo = this.get('identifierInfo');
- return idInfo ? (idInfo.sort === "External") : false;
+ return idInfo ? (idInfo.sort === "External") : false;
}),
identifierObserver : Ember.observer('identifierInfo',function () {
this.set("downloadedDocumentation","");
const idInfo = this.get('identifierInfo');
- if(idInfo) {
+ if(idInfo) {
const locationInfo = idInfo.locationInfo;
if(locationInfo.tag === "ApproximateLocation") {
const packageId = locationInfo.packageId.name + "-" + locationInfo.packageId.version;
const currentIdentifier = idInfo;
-
+
this.get('store').loadDefinitionSite(packageId,
locationInfo.moduleName,
locationInfo.componentId,
@@ -52,10 +52,10 @@ export default Ember.Component.extend({
locationInfo.name)
.then((definitionSite) => {
Ember.run.next(this,() => {
- if(currentIdentifier === this.get('identifierInfo')) {
+ if(currentIdentifier === this.get('identifierInfo')) {
this.set('downloadedDocumentation',definitionSite.documentation);
}})
- }).catch(() => {
+ }).catch(() => {
this.get('store').loadHoogleDocs(packageId,
locationInfo.moduleName,
locationInfo.entity,
diff --git a/javascript/app/components/identifier-name.js b/javascript/app/components/identifier-name.js
index e0f8c3c..4b01b03 100644
--- a/javascript/app/components/identifier-name.js
+++ b/javascript/app/components/identifier-name.js
@@ -11,7 +11,7 @@ export default Ember.Component.extend({
}),
style : Ember.computed('identifierElement',function() {
const element = this.get('identifierElement');
- if(element) {
+ if(element) {
return new Ember.String.htmlSafe("color:"+element.style.color);
}
}),
@@ -44,7 +44,7 @@ export default Ember.Component.extend({
return (this.get('identifierInfo.sort') === "External");
}),
actions : {
- goToDefinition (event) {
+ goToDefinition (event) {
goToDefinition(this.get('store'),
this.get('locationInfo'),
event.which,
diff --git a/javascript/app/components/infinite-list.js b/javascript/app/components/infinite-list.js
index b73b6d4..02e1943 100644
--- a/javascript/app/components/infinite-list.js
+++ b/javascript/app/components/infinite-list.js
@@ -10,34 +10,34 @@ function initialize(component) {
pageNumber = 1;
}
-export default Component.extend({
+export default Component.extend({
renderedElements : [],
init() {
this._super(...arguments);
initialize(this);
},
- elementsObserver : observer('elements',function() {
+ elementsObserver : observer('elements',function() {
initialize(this);
const containerElement = document.getElementById(this.get('containerElementId'));
- if(containerElement) {
+ if(containerElement) {
containerElement.scrollTop = 0;
}
}),
didInsertElement() {
const containerElement = document.getElementById(this.get('containerElementId'));
if(containerElement) {
- const component = this;
+ const component = this;
containerElement.onscroll = function() {
const perPage = component.get('perPage');
const elements = component.get('elements');
-
+
if(!updating &&
(pageNumber * perPage < elements.length) &&
(containerElement.scrollTop + containerElement.offsetHeight
> component.element.offsetHeight - 100)) {
-
+
updating = true;
- run.next(component,() => {
+ run.next(component,() => {
const newElements = elements.slice(pageNumber * perPage,(pageNumber + 1) * perPage);
component.get('renderedElements').pushObjects(newElements);
pageNumber ++;
diff --git a/javascript/app/components/info-window.js b/javascript/app/components/info-window.js
index a011f99..da669f1 100644
--- a/javascript/app/components/info-window.js
+++ b/javascript/app/components/info-window.js
@@ -8,27 +8,27 @@ function updatePosition(component) {
if(targetElement) {
const infoWindowHeight = component.element.offsetHeight;
const targetElementHeight = targetElement.offsetHeight;
-
- const parent = targetElement.parentNode;//<td> element
- const containerElement = document.querySelector("#" + component.get('containerElementId'));
+
+ const parent = targetElement.parentNode;//<td> element
+ const containerElement = document.querySelector("#" + component.get('containerElementId'));
//getBoundingClientRect() returns the smallest rectangle which contains
//the entire element, with read-only left, top, right, bottom, x, y, width,
//and height properties describing the overall border-box in pixels. Properties
//other than width and height are relative to the top-left of the *viewport*.
const targetTopViewport = targetElement.getBoundingClientRect().top;
-
+
let containerTopViewport;
if (containerElement) {
containerTopViewport = containerElement.getBoundingClientRect().top;
} else {
containerTopViewport = 0;
}
-
+
let infoWindowTop;
if(targetTopViewport < infoWindowHeight + containerTopViewport) {
//offsetTop is the number of pixels from the top of the closest relatively
- //positioned parent element.
+ //positioned parent element.
infoWindowTop = targetElement.offsetTop + parent.offsetTop
+ targetElementHeight + 10 + "px";
} else {
@@ -37,7 +37,7 @@ function updatePosition(component) {
}
const infoWindowLeft = targetElement.offsetLeft + parent.offsetLeft + "px";
-
+
component.$().css({
top:infoWindowTop,
left:infoWindowLeft
@@ -54,16 +54,16 @@ export default Ember.Component.extend({
isFocused: false,
didInsertElement () {
const component = this;
-
+
const $headerElement = Ember.$(component.element.querySelector(".info-window-header"));
const $contentElement = Ember.$(component.element.querySelector(".info-window-content"));
const $infoWindowElement = Ember.$(component.element.querySelector(".info-window"));
const $infoWindowContainerElement = Ember.$(component.element);
-
+
this.$headerElement = $headerElement;
- this.$contentElement = $contentElement;
+ this.$contentElement = $contentElement;
- this.$().resizable({
+ this.$().resizable({
handles: "n,w",
minHeight: 80,
minWidth: 400,
@@ -74,10 +74,10 @@ export default Ember.Component.extend({
resizing = false;
},
resize : function() {
- const containerHeight = $infoWindowContainerElement.height();
+ const containerHeight = $infoWindowContainerElement.height();
$infoWindowElement.css({
"height": containerHeight + 2 + "px"
- });
+ });
$contentElement.css({
"max-height":(containerHeight - $headerElement.outerHeight(true)) + "px"
});
@@ -104,7 +104,7 @@ export default Ember.Component.extend({
const element = document.elementFromPoint(event.clientX,event.clientY);
if(element && element.classList.contains('link')) {
return;
- }
+ }
if(!resizing
&& !dragging
&& !this.get('isPinned')
@@ -122,7 +122,7 @@ export default Ember.Component.extend({
if (this.get('isPinned')
|| this.get('isFocused')
|| this.get('isHoveredOverIdentifier')
- || this.get('hasSelectedExpression')) {
+ || this.get('hasSelectedExpression')) {
return false;
} else {
return true;
diff --git a/javascript/app/components/input-with-autocomplete.js b/javascript/app/components/input-with-autocomplete.js
index 34abe7a..5960c46 100644
--- a/javascript/app/components/input-with-autocomplete.js
+++ b/javascript/app/components/input-with-autocomplete.js
@@ -1,14 +1,14 @@
import Ember from 'ember';
export default Ember.Component.extend({
- store : Ember.inject.service('store'),
+ store : Ember.inject.service('store'),
highlightedItemIndex: -1,
items : [],
query: null,
didInsertElement() {
const $input = Ember.$(this.element).find(".search-input");
- const $autocompleteContainer = Ember.$(this.element).find(".autocomplete-container");
- this.$input = $input;
- this.$autocompleteContainer = $autocompleteContainer;
+ const $autocompleteContainer = Ember.$(this.element).find(".autocomplete-container");
+ this.$input = $input;
+ this.$autocompleteContainer = $autocompleteContainer;
const width = $input.width() + 300;
$autocompleteContainer.css({
"width" : width+"px",
@@ -23,9 +23,9 @@ export default Ember.Component.extend({
this.onDown();
} else if(e.which === 38) {
this.onUp();
- }
+ }
});
- $input.focusin(() => {
+ $input.focusin(() => {
this.showAutocompleteList();
});
$input.focusout(() => {
@@ -105,7 +105,7 @@ export default Ember.Component.extend({
},
searchUrlObserver : Ember.observer('createSearchUrlFunction',function() {
this.notifyPropertyChange('query');
- }),
+ }),
queryObserver : Ember.observer("query",function() {
if(this.get('query')) {
const perPage = this.get('maxItems') ? this.get('maxItems') : 10;
diff --git a/javascript/app/components/instance-info.js b/javascript/app/components/instance-info.js
index a0e04ed..339d415 100644
--- a/javascript/app/components/instance-info.js
+++ b/javascript/app/components/instance-info.js
@@ -10,7 +10,7 @@ export default Ember.Component.extend({
return this.get('nestedLevel') + 1;
}),
actions : {
- goToDefinition (event) {
+ goToDefinition (event) {
goToDefinition(this.get('store'),
this.get('instance.location'),
event.which,
diff --git a/javascript/app/components/paginated-list.js b/javascript/app/components/paginated-list.js
index 9d85610..d4b6609 100644
--- a/javascript/app/components/paginated-list.js
+++ b/javascript/app/components/paginated-list.js
@@ -8,10 +8,10 @@ function loadItems(store,component,url) {
component.set('next',result.linkHeader.next);
component.set('prev',result.linkHeader.prev);
component.set('last',result.linkHeader.last);
-
+
const pageMatch = url.match(/(&|\?)page=(\d+)/);
const perPageMatch = url.match(/(&|\?)per_page=(\d+)/);
-
+
const page = pageMatch ? pageMatch[2] : 1;
const perPage = perPageMatch ? perPageMatch[2] : 20;
@@ -36,11 +36,11 @@ export default Ember.Component.extend({
}
},
urlObserver : Ember.observer('url',function () {
- loadItems(this.get('store'),this,this.get('url'));
- this.element.querySelector(".paginated-list-content").scrollTop = 0;
+ loadItems(this.get('store'),this,this.get('url'));
+ this.element.querySelector(".paginated-list-content").scrollTop = 0;
}),
actions : {
- update(url) {
+ update(url) {
this.element.querySelector(".paginated-list-content").scrollTop = 0;
loadItems(this.get('store'),this,url);
}
diff --git a/javascript/app/components/resizable-panel.js b/javascript/app/components/resizable-panel.js
index 20d781b..fe51ade 100644
--- a/javascript/app/components/resizable-panel.js
+++ b/javascript/app/components/resizable-panel.js
@@ -24,7 +24,7 @@ export default Ember.Component.extend({
hidden:false,
hiddenByUser:false,
didInsertElement : function () {
- this._super(...arguments);
+ this._super(...arguments);
Ember.run.next(this,() => {
const onresize = () => {
if(!this.get('hiddenByUser')) {
@@ -50,7 +50,7 @@ export default Ember.Component.extend({
}
});
this.$alsoResizeElement = $alsoResizeElement;
- if(window.innerWidth < 700) {
+ if(window.innerWidth < 700) {
this.set('hidden',true);
hide(this,false);
}
diff --git a/javascript/app/components/text-file.js b/javascript/app/components/text-file.js
index 05be31a..2239571 100644
--- a/javascript/app/components/text-file.js
+++ b/javascript/app/components/text-file.js
@@ -37,7 +37,7 @@ export default Ember.Component.extend({
}),
init() {
this._super(...arguments);
- this.markdownConverter = new showdown.Converter();
+ this.markdownConverter = new showdown.Converter();
},
didInsertElement() {
const sourceCodeContainerElement = this.element.querySelector('.source-code-container');
@@ -48,7 +48,7 @@ export default Ember.Component.extend({
this.cleanup();
},
cleanup() {
- if(this._onhashchange) {
+ if(this._onhashchange) {
window.removeEventListener('hashchange',this._onhashchange);
}
if(this._onkeydown) {
@@ -61,7 +61,7 @@ export default Ember.Component.extend({
pathObserver : Ember.observer('path',function() {
Ember.run.next(this,() => {
this.cleanup();
- this.didInsertElement();
+ this.didInsertElement();
});
})
});
diff --git a/javascript/app/components/type-signature-text.js b/javascript/app/components/type-signature-text.js
index e4eb200..ce33607 100644
--- a/javascript/app/components/type-signature-text.js
+++ b/javascript/app/components/type-signature-text.js
@@ -1,4 +1,4 @@
import Ember from 'ember';
export default Ember.Component.extend({
- tagName : "span"
+ tagName : "span"
});
diff --git a/javascript/app/components/type-signature.js b/javascript/app/components/type-signature.js
index ed1849c..8e7545f 100644
--- a/javascript/app/components/type-signature.js
+++ b/javascript/app/components/type-signature.js
@@ -1,11 +1,11 @@
import Ember from 'ember';
export default Ember.Component.extend({
- tagName : "span",
- expandTypeSynonyms: false,
+ tagName : "span",
+ expandTypeSynonyms: false,
expandTypeSynonymsLabel : Ember.computed('expandTypeSynonyms',function() {
return this.get('expandTypeSynonyms') ? "Show type synonyms" : "Expand type synonyms";
}),
- components : Ember.computed('type','expandTypeSynonyms',function() {
+ components : Ember.computed('type','expandTypeSynonyms',function() {
if(this.get('expandTypeSynonyms') && this.get('type.componentsExpanded')) {
return this.get('type.componentsExpanded');
} else {
@@ -14,7 +14,7 @@ export default Ember.Component.extend({
}),
typeObserver : Ember.observer('type',function() {
this.set('expandTypeSynonyms',false);
- }),
+ }),
actions : {
toggleExpandTypeSynonyms () {
this.toggleProperty('expandTypeSynonyms');
diff --git a/javascript/app/controllers/package.js b/javascript/app/controllers/package.js
index 666cacf..d986835 100644
--- a/javascript/app/controllers/package.js
+++ b/javascript/app/controllers/package.js
@@ -8,8 +8,8 @@ export default Ember.Controller.extend({
loadItemsFunction : null,
query : null,
searchMode : "currentPackage",
- createSearchUrlFunction : Ember.computed("searchMode","model",function() {
- const packageId = this.get('model.id');
+ createSearchUrlFunction : Ember.computed("searchMode","model",function() {
+ const packageId = this.get('model.id');
if(this.get('searchMode') === "currentPackage") {
return (query) => urls.identifierSearchUrl(packageId,query);
} else {
diff --git a/javascript/app/controllers/package/index.js b/javascript/app/controllers/package/index.js
index cd02416..dabb196 100644
--- a/javascript/app/controllers/package/index.js
+++ b/javascript/app/controllers/package/index.js
@@ -2,7 +2,7 @@ import Ember from 'ember';
export default Ember.Controller.extend({
modulesFiltered : Ember.computed('model','query',function () {
const query = this.get('query');
- const modules = Object.keys(this.get('model.modules')).sort();
+ const modules = Object.keys(this.get('model.modules')).sort();
if(query) {
const regExp = new RegExp(query,"i");
return modules.filter((p) => p.search(regExp) != -1);
diff --git a/javascript/app/controllers/package/search.js b/javascript/app/controllers/package/search.js
index 46f2efd..159b79a 100644
--- a/javascript/app/controllers/package/search.js
+++ b/javascript/app/controllers/package/search.js
@@ -4,7 +4,7 @@ import {goToDefinition} from '../../utils/go-to-definition';
export default Ember.Controller.extend({
store : Ember.inject.service('store'),
actions : {
- goToDefinition (locationInfo,event) {
+ goToDefinition (locationInfo,event) {
goToDefinition(this.get('store'),
locationInfo,
event.which,
diff --git a/javascript/app/controllers/packages.js b/javascript/app/controllers/packages.js
index 4bb10fc..5c34eb2 100644
--- a/javascript/app/controllers/packages.js
+++ b/javascript/app/controllers/packages.js
@@ -3,10 +3,10 @@ import {goToDefinition} from '../utils/go-to-definition';
export default Ember.Controller.extend({
store : Ember.inject.service('store'),
- queryObserver : Ember.observer("query",function() {
+ queryObserver : Ember.observer("query",function() {
Ember.run.debounce(this, () => {
const regExp = new RegExp(this.get('query'),"i");
- const packages = this.get('model').filter((p) => p.name.search(regExp) != -1);
+ const packages = this.get('model').filter((p) => p.name.search(regExp) != -1);
Ember.run.next(() => {
this.set('packages',packages);
});
diff --git a/javascript/app/controllers/search.js b/javascript/app/controllers/search.js
index 5d77770..7ba7d92 100644
--- a/javascript/app/controllers/search.js
+++ b/javascript/app/controllers/search.js
@@ -4,7 +4,7 @@ import {goToDefinition} from '../utils/go-to-definition';
export default Ember.Controller.extend({
store : Ember.inject.service('store'),
actions : {
- goToDefinition (locationInfo,event) {
+ goToDefinition (locationInfo,event) {
goToDefinition(this.get('store'),
locationInfo,
event.which,
diff --git a/javascript/app/router.js b/javascript/app/router.js
index 7fce17a..7b8df63 100644
--- a/javascript/app/router.js
+++ b/javascript/app/router.js
@@ -14,8 +14,8 @@ Router.map(function() {
});
});
this.route('search',{path:'/search/:query'});
- });
- this.route('bad-url', { path: '/*badurl' });
+ });
+ this.route('bad-url', { path: '/*badurl' });
});
export default Router;
diff --git a/javascript/app/routes/package.js b/javascript/app/routes/package.js
index e908ca4..6abc603 100644
--- a/javascript/app/routes/package.js
+++ b/javascript/app/routes/package.js
@@ -8,7 +8,7 @@ export default Ember.Route.extend({
.catch((e) => {console.log(e);this.transitionTo("/package-not-found");});
},
setupController(controller, model) {
- this._super(controller, model);
+ this._super(controller, model);
controller.set('bottomPanelVisible',false);
},
actions : {
diff --git a/javascript/app/routes/package/index.js b/javascript/app/routes/package/index.js
index e36abd5..15ff8a5 100644
--- a/javascript/app/routes/package/index.js
+++ b/javascript/app/routes/package/index.js
@@ -1,7 +1,7 @@
import Ember from 'ember';
-export default Ember.Route.extend({
- afterModel : function (model,transition) {
- transition.send("fileOpened",null);
+export default Ember.Route.extend({
+ afterModel : function (model,transition) {
+ transition.send("fileOpened",null);
}
});
diff --git a/javascript/app/routes/package/search.js b/javascript/app/routes/package/search.js
index 7bc711b..058f9ec 100644
--- a/javascript/app/routes/package/search.js
+++ b/javascript/app/routes/package/search.js
@@ -10,7 +10,7 @@ export default Ember.Route.extend({
url: urls.identifierSearchUrl(this.modelFor('package').id,params.query)+"?per_page=20"
};
},
- afterModel () {
+ afterModel () {
const onmouseup = (event) => {
// This makes links in documentation clickable
if(event.target.dataset.location) {
@@ -26,7 +26,7 @@ export default Ember.Route.extend({
}
};
this._onmouseup = onmouseup;
- document.addEventListener('mouseup',onmouseup);
+ document.addEventListener('mouseup',onmouseup);
},
deactivate() {
if(this._onmouseup) {
diff --git a/javascript/app/routes/package/show/file.js b/javascript/app/routes/package/show/file.js
index ead6ee8..568d288 100644
--- a/javascript/app/routes/package/show/file.js
+++ b/javascript/app/routes/package/show/file.js
@@ -3,25 +3,25 @@ import Ember from 'ember';
export default Ember.Route.extend({
store : Ember.inject.service(),
model : function (params) {
- const packageInfo = this.modelFor('package');
- if(packageInfo.modules[params.filePath]) {
+ const packageInfo = this.modelFor('package');
+ if(packageInfo.modules[params.filePath]) {
return this.get('store').loadHaskellModule(packageInfo.id,params.filePath)
- .catch((e) => {console.log(e);this.transitionTo("/not-found");});
+ .catch((e) => {console.log(e);this.transitionTo("/not-found");});
} else {
return this.get('store').loadFile(packageInfo.id,params.filePath)
- .then((result) => {
+ .then((result) => {
document.title = packageInfo.id;
return result;
})
.catch((e) => {console.log(e);this.transitionTo("/not-found");});
}
},
- afterModel (model) {
+ afterModel (model) {
document.title = model.id + " - " + this.modelFor('package').id;
},
actions : {
- didTransition : function () {
- this.send("fileOpened",this.currentModel.id);
- }
+ didTransition : function () {
+ this.send("fileOpened",this.currentModel.id);
+ }
}
});
diff --git a/javascript/app/routes/package/show/index.js b/javascript/app/routes/package/show/index.js
index e36abd5..15ff8a5 100644
--- a/javascript/app/routes/package/show/index.js
+++ b/javascript/app/routes/package/show/index.js
@@ -1,7 +1,7 @@
import Ember from 'ember';
-export default Ember.Route.extend({
- afterModel : function (model,transition) {
- transition.send("fileOpened",null);
+export default Ember.Route.extend({
+ afterModel : function (model,transition) {
+ transition.send("fileOpened",null);
}
});
diff --git a/javascript/app/routes/search.js b/javascript/app/routes/search.js
index c181c2f..3ad8905 100644
--- a/javascript/app/routes/search.js
+++ b/javascript/app/routes/search.js
@@ -11,12 +11,12 @@ export default Ember.Route.extend({
};
},
setupController(controller, model) {
- this._super(controller, model);
+ this._super(controller, model);
controller.set('createSearchUrlFunction',(query) => {
return urls.globalIdentifiersUrl(query);
});
},
- afterModel () {
+ afterModel () {
const onmouseup = (event) => {
// This makes links in documentation clickable
if(event.target.dataset.location) {
@@ -32,11 +32,11 @@ export default Ember.Route.extend({
}
};
this._onmouseup = onmouseup;
- document.addEventListener('mouseup',onmouseup);
+ document.addEventListener('mouseup',onmouseup);
},
deactivate() {
if(this._onmouseup) {
document.removeEventListener('mouseup',this._onmouseup);
}
- }
+ }
});
diff --git a/javascript/app/services/settings.js b/javascript/app/services/settings.js
index a79779a..8080890 100644
--- a/javascript/app/services/settings.js
+++ b/javascript/app/services/settings.js
@@ -14,7 +14,7 @@ export default Ember.Service.extend({
},
colorTheme : themes["darkTheme"],
settingsObserver : Ember.observer("colorTheme",function() {
- if(localStorage) {
+ if(localStorage) {
localStorage.setItem("colorThemeId",this.get('colorTheme').id);
}
})
diff --git a/javascript/app/services/store.js b/javascript/app/services/store.js
index 650ddcf..39a6f74 100644
--- a/javascript/app/services/store.js
+++ b/javascript/app/services/store.js
@@ -44,7 +44,7 @@ function parseLinkHeader(header) {
export default Ember.Service.extend({
- init() {
+ init() {
this.packages = {};
this.files = {};
this.haskellModules = {};
@@ -69,12 +69,12 @@ export default Ember.Service.extend({
},
loadFile(packageId,filePath) {
const fileId = packageId + "/" + filePath;
- const file = this.files[fileId];
+ const file = this.files[fileId];
if(file) {
return new RSVP.Promise((resolve) => {resolve(file);});
} else {
- const url = urls.fileUrl(packageId,filePath);
- return Ember.$.get({url:url,dataType:"text"}).then((text) => {
+ const url = urls.fileUrl(packageId,filePath);
+ return Ember.$.get({url:url,dataType:"text"}).then((text) => {
const file = {};
file.text = text;
file.packageId = packageId;
@@ -85,7 +85,7 @@ export default Ember.Service.extend({
});
}
},
- loadHaskellModule(packageId,filePath) {
+ loadHaskellModule(packageId,filePath) {
const moduleId = packageId + "/" + filePath ;
const module = this.haskellModules[moduleId];
if(module) {
@@ -93,7 +93,7 @@ export default Ember.Service.extend({
} else {
const url = urls.haskellModuleUrl(packageId,filePath);
return Ember.$.getJSON(url).then((module) => {
- module.packageId = packageId;
+ module.packageId = packageId;
module.isHaskellModule = true;
this.haskellModules[moduleId] = module;
return module;
@@ -112,23 +112,23 @@ export default Ember.Service.extend({
return definitionSite;
});
}
- },
+ },
loadExpressions(packageId,modulePath,lineStart,columnStart,lineEnd,columnEnd) {
const id = packageId + "/" + encodeURIComponent(modulePath)
+ "/" + lineStart + "/" + columnStart + "/" + lineEnd + "/" + columnEnd;
const exprs = this.expressions[id];
if(exprs) {
- return new RSVP.Promise((resolve)=>{resolve(exprs);});
+ return new RSVP.Promise((resolve)=>{resolve(exprs);});
} else {
- const url = urls.expressionsUrl(packageId,modulePath,lineStart,columnStart,lineEnd,columnEnd);
- return Ember.$.getJSON(url).then((exprs) => {
+ const url = urls.expressionsUrl(packageId,modulePath,lineStart,columnStart,lineEnd,columnEnd);
+ return Ember.$.getJSON(url).then((exprs) => {
this.expressions[id] = exprs;
return exprs;
- });
+ });
}
},
- loadFromUrlPaginated(url) {
- return Ember.$.getJSON(url).then((items,textStatus,jqXHR) => {
+ loadFromUrlPaginated(url) {
+ return Ember.$.getJSON(url).then((items,textStatus,jqXHR) => {
const linkHeaderText = jqXHR.getResponseHeader('Link');
const totalCountHeaderText = jqXHR.getResponseHeader('x-total-count');
const linkHeader = parseLinkHeader(linkHeaderText);
@@ -141,7 +141,7 @@ export default Ember.Service.extend({
});
},
loadGlobalReferences(externalId) {
- const globalReferences = this.globalReferences[externalId];
+ const globalReferences = this.globalReferences[externalId];
if(globalReferences) {
return new RSVP.Promise((resolve) => {resolve(globalReferences);});
} else {
diff --git a/javascript/app/styles/app.scss b/javascript/app/styles/app.scss
index b87c0d8..68fbe2a 100644
--- a/javascript/app/styles/app.scss
+++ b/javascript/app/styles/app.scss
@@ -45,14 +45,14 @@ li {
.documentation {
margin-top:10px;
li {
- list-style: disc outside none;
+ list-style: disc outside none;
}
ul {
padding-left:15px;
}
ol {
padding-left:15px;
- }
+ }
}
.flex-container {
@@ -73,7 +73,7 @@ li {
.header {
flex: none;
padding:5px;
- img {
+ img {
float:left;
}
}
@@ -140,7 +140,7 @@ li {
margin-top:20px;
}
-.package-header-filename {
+.package-header-filename {
white-space: nowrap;
margin-left: 35px;
}
@@ -184,13 +184,13 @@ ul.modules {
position:absolute;
top:0px;
right:-20px;
- z-index:2;
+ z-index:2;
width:20px;
- height:20px;
+ height:20px;
text-align:center;
vertical-align:middle;
a {
- text-decoration:none;
+ text-decoration:none;
}
opacity:0.6;
display:none;
@@ -218,10 +218,10 @@ ul.modules {
right : 0;
left : 300px;
overflow-x: auto;
- overflow-y: auto;
+ overflow-y: auto;
}
-.file-tree-container {
+.file-tree-container {
overflow-x: hidden;
overflow-y: auto;
position: absolute;
@@ -238,7 +238,7 @@ ul.modules {
right : 0;
left : 0;
overflow-x: auto;
- overflow-y: auto;
+ overflow-y: auto;
}
.bottom-panel {
@@ -248,7 +248,7 @@ ul.modules {
right : 0;
left : 0;
overflow-x: auto;
- overflow-y: auto;
+ overflow-y: auto;
z-index:4;
}
@@ -258,7 +258,7 @@ ul.modules {
right : 0;
left : 0;
height: 35px;
- padding: 5px;
+ padding: 5px;
}
.bottom-panel-content {
@@ -268,7 +268,7 @@ ul.modules {
right : 0;
left : 0;
overflow-x: auto;
- overflow-y: auto;
+ overflow-y: auto;
}
.bottom-panel-header-options {
@@ -279,9 +279,9 @@ ul.modules {
white-space:nowrap;
}
-.highlighted-identifier {
+.highlighted-identifier {
border-radius: 3px;
- box-shadow: 0 0 0 1px #B4B4B4;
+ box-shadow: 0 0 0 1px #B4B4B4;
}
.identifier {
@@ -312,7 +312,7 @@ td.line-content {
$source-code-font:Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif;
-.source-code {
+.source-code {
font-family: $source-code-font;
white-space:pre;
line-height:1.25;
@@ -332,12 +332,12 @@ code,pre {
}
.source-code-font {
- font-family: $source-code-font;
+ font-family: $source-code-font;
line-height:1.25;
}
.source-code-snippet {
- padding: 4px;
+ padding: 4px;
text-decoration:none !important;
display:block;
}
@@ -360,7 +360,7 @@ code,pre {
position:fixed;
top:150px;
right:15px;
- width: 450px;
+ width: 450px;
z-index:1;
div {
margin : 5px;
@@ -369,7 +369,7 @@ code,pre {
.declarations-header {
opacity:0.9;
- height:50px;
+ height:50px;
}
.declarations-content {
@@ -380,7 +380,7 @@ code,pre {
right:0px;
max-height:500px;
overflow-y:auto;
- overflow-x:hidden;
+ overflow-x:hidden;
}
@media screen and (max-width: 1500px) {
@@ -395,28 +395,28 @@ code,pre {
z-index:10;
}
-.info-window-header {
+.info-window-header {
margin:5px;
width: 100%;
cursor: move;
cursor: grab;
cursor: -moz-grab;
- cursor: -webkit-grab;
+ cursor: -webkit-grab;
}
-.info-window-content {
+.info-window-content {
max-height:200px;
overflow-x:auto;
- overflow-y:auto;
+ overflow-y:auto;
}
.info-window-options {
margin-right:10px;
margin-left:10px;
- float:right;
+ float:right;
}
-
+
.ui-draggable-dragging .info-window-header {
cursor: grabbing;
cursor: -moz-grabbing;
diff --git a/javascript/app/templates/bad-url.hbs b/javascript/app/templates/bad-url.hbs
index 6b36386..b7df9c5 100644
--- a/javascript/app/templates/bad-url.hbs
+++ b/javascript/app/templates/bad-url.hbs
@@ -1,4 +1,4 @@
-<div class="container">
+<div class="container">
<div style="margin-top:10px">
<h1>Not found</h1>
<div><a href="/">Main page</a></div>
diff --git a/javascript/app/templates/components/haskell-module.hbs b/javascript/app/templates/components/haskell-module.hbs
index 77b9df7..6f1d0f5 100644
--- a/javascript/app/templates/components/haskell-module.hbs
+++ b/javascript/app/templates/components/haskell-module.hbs
@@ -1,14 +1,14 @@
<div class="source-code-container"></div>
{{#if declarations}}
<div class="declarations">
- <div class="declarations-header">
+ <div class="declarations-header">
<div class="input-group">
{{input class="form-control" value=query placeholder="Identifier"}}<a class="hide-declarations" href="#" {{action "toggleShowDeclarations"}}>{{showDeclarationsLabel}}</a>
</div>
</div>
{{#if showDeclarations}}
- <div id="declarations-content" class="declarations-content">
- <ul>
+ <div id="declarations-content" class="declarations-content">
+ <ul>
{{#infinite-list containerElementId="declarations-content" elements=filteredDeclarations perPage=30 as |declaration|}}
<li class="declaration">
<div class="declaration">
diff --git a/javascript/app/templates/components/identifier-name.hbs b/javascript/app/templates/components/identifier-name.hbs
index ca16e23..4f7b764 100644
--- a/javascript/app/templates/components/identifier-name.hbs
+++ b/javascript/app/templates/components/identifier-name.hbs
@@ -2,7 +2,7 @@
<span class="source-code-font break-word identifier-menu-item" style={{style}}>{{#if identifierInfo.demangledOccName}}{{identifierInfo.demangledOccName}}{{else}}{{name}}{{/if}}</span>
{{#unless isBinder}}
{{#if location}}
- <span class="identifier-menu-item">{{location}}</span>
+ <span class="identifier-menu-item">{{location}}</span>
<span class="link identifier-menu-item" onmouseup={{action "goToDefinition"}}>Go to definition</span>
{{/if}}
{{/unless}}
diff --git a/javascript/app/templates/components/paginated-list.hbs b/javascript/app/templates/components/paginated-list.hbs
index 82d4eee..5184e07 100644
--- a/javascript/app/templates/components/paginated-list.hbs
+++ b/javascript/app/templates/components/paginated-list.hbs
@@ -1,4 +1,4 @@
-<div class="paginated-list-header">
+<div class="paginated-list-header">
<span>Found {{total}} {{{foundWhere}}}</span>
{{#if (or next prev)}}
&nbsp;
@@ -10,8 +10,8 @@
{{#if next}}<button button class="btn btn-outline-secondary btn-sm" {{action "update" next.href}}>&gt;</button>{{/if}}
{{#if last}}<button button class="btn btn-outline-secondary btn-sm" {{action "update" last.href}}>&gt;&gt;</button>{{/if}}
</span>
- {{/if}}
+ {{/if}}
</div>
<div class="paginated-list-content">
- {{yield items}}
+ {{yield items}}
</div>
diff --git a/javascript/app/templates/package.hbs b/javascript/app/templates/package.hbs
index 95dca05..d26ce34 100644
--- a/javascript/app/templates/package.hbs
+++ b/javascript/app/templates/package.hbs
@@ -1,6 +1,6 @@
<div class="flex-container">
<div class="package-header">
- <span class="package-header-package-name">{{#link-to 'package' model}}{{model.id}}{{/link-to}}</span>
+ <span class="package-header-package-name">{{#link-to 'package' model}}{{model.id}}{{/link-to}}</span>
<span class="package-header-input">
{{#input-with-autocomplete
onSubmit=(action 'searchIdentifier')
@@ -11,7 +11,7 @@
placeholder="Identifier" as |identifier|}}
<span class="source-code-font">{{identifier.demangledOccName}} :: {{type-signature-text components=identifier.idType.components}}</span>
<div class="module-name">
- <b>{{identifier.locationInfo.packageId.name}}-{{identifier.locationInfo.packageId.version}}</b>
+ <b>{{identifier.locationInfo.packageId.name}}-{{identifier.locationInfo.packageId.version}}</b>
{{#if identifier.locationInfo.modulePath}}
{{identifier.locationInfo.modulePath}}
{{else}}
@@ -29,7 +29,7 @@
value="allPackages"
groupValue=searchMode}}
<span>in all packages</span>
- {{/radio-button}}
+ {{/radio-button}}
{{#if currentFile}}
<span class="package-header-filename">
{{currentFile}}
@@ -66,7 +66,7 @@
</span>
{{/if}}
</div>
- <div class="references">
+ <div class="references">
{{#paginated-list url=referencesUrl foundWhere=(concat "in <b>" packageId "</b>") as |files|}}
<ul>
{{#each files as |file|}}
diff --git a/javascript/app/templates/package/index.hbs b/javascript/app/templates/package/index.hbs
index e9bc592..06ccd0d 100644
--- a/javascript/app/templates/package/index.hbs
+++ b/javascript/app/templates/package/index.hbs
@@ -1,12 +1,12 @@
<div class="package-modules">
<div class="module-search-input">
- {{input class="form-control" type="text" value=query placeholder="Module name"}}
- </div>
+ {{input class="form-control" type="text" value=query placeholder="Module name"}}
+ </div>
<ul class="modules">
{{#each modulesFiltered as |module|}}
<li>
<a href="/package/{{model.id}}/show/{{module}}">{{module}}</a>
</li>
{{/each}}
- </ul>
+ </ul>
</div>
diff --git a/javascript/app/templates/package/show/file.hbs b/javascript/app/templates/package/show/file.hbs
index b127fd7..0d356e5 100644
--- a/javascript/app/templates/package/show/file.hbs
+++ b/javascript/app/templates/package/show/file.hbs
@@ -1,11 +1,11 @@
-{{#if model.isHaskellModule}}
+{{#if model.isHaskellModule}}
{{haskell-module
path=model.id
name=model.name
packageId=model.packageId
componentId=model.componentId
html=model.sourceCodeHtml
- identifiers=model.identifiers
+ identifiers=model.identifiers
occurrences=model.occurrences
colorTheme=settings.colorTheme
declarations=model.declarations
diff --git a/javascript/app/templates/search.hbs b/javascript/app/templates/search.hbs
index 222919a..5a36913 100644
--- a/javascript/app/templates/search.hbs
+++ b/javascript/app/templates/search.hbs
@@ -1,6 +1,6 @@
<div class="flex-container container">
<div style="position:relative;height:100%">
- <div class="absolute-container">
+ <div class="absolute-container">
<div class="global-identifier-search-form">
{{#input-with-autocomplete
onSubmit=(action 'searchIdentifier')
diff --git a/javascript/app/utils/api-urls.js b/javascript/app/utils/api-urls.js
index 7dce1c3..5280720 100644
--- a/javascript/app/utils/api-urls.js
+++ b/javascript/app/utils/api-urls.js
@@ -15,13 +15,13 @@ function fixDots(string) {
}
}
-export const urls = {
+export const urls = {
packageInfoUrl : function(packageId) {
return config.APP.staticUrlPrefix+"/"+packageId+"/"+config.APP.haskellCodeExplorerDirectory+"/packageInfo.json";
},
fileUrl : function(packageId,filePath) {
return config.APP.staticUrlPrefix+"/"+packageId+"/"+filePath;
- },
+ },
haskellModuleUrl : function (packageId,filePath) {
return config.APP.staticUrlPrefix+"/"+packageId+"/"+config.APP.haskellCodeExplorerDirectory+"/"+encodeURIComponent(encodeURIComponent(filePath))+ ".json";
},
diff --git a/javascript/app/utils/color-themes.js b/javascript/app/utils/color-themes.js
index 13b5240..49eda64 100644
--- a/javascript/app/utils/color-themes.js
+++ b/javascript/app/utils/color-themes.js
@@ -1,6 +1,6 @@
function colorThemeToCss(colorTheme) {
const css = `
- body {
+ body {
color: ${colorTheme.defaultColor} !important;
background-color: ${colorTheme.backgroundColor} !important;
}
@@ -31,7 +31,7 @@ function colorThemeToCss(colorTheme) {
}
.declarations-header {
background-color: ${colorTheme.navigationPanelColor} !important;
- border: 1px solid ${colorTheme.borderColor} !important;
+ border: 1px solid ${colorTheme.borderColor} !important;
}
li.declaration {
border-bottom: 1px solid ${colorTheme.borderColor} !important;
@@ -73,19 +73,19 @@ function colorThemeToCss(colorTheme) {
border-left: 1px solid ${colorTheme.borderColor} !important;
border-right: 1px solid ${colorTheme.borderColor} !important;
}
- ul.autocomplete-items > li {
+ ul.autocomplete-items > li {
border-bottom: 1px solid ${colorTheme.borderColor} !important;
}
- ul.autocomplete-items > li:hover {
+ ul.autocomplete-items > li:hover {
background-color: ${colorTheme.highlightedLineColor} !important;
}
- ul.autocomplete-items > li.highlighted {
+ ul.autocomplete-items > li.highlighted {
background-color: ${colorTheme.highlightedLineColor} !important;
}
.source-code-snippet {
color: ${colorTheme.defaultColor} !important;
border-bottom: 1px solid ${colorTheme.borderColor} !important;
- }
+ }
.source-code-snippet:hover {
background-color: ${colorTheme.highlightedLineColor} !important;
}
@@ -94,7 +94,7 @@ function colorThemeToCss(colorTheme) {
border-top: 1px solid ${colorTheme.borderColor} !important;
}
.bottom-panel-header {
- border-bottom: 1px solid ${colorTheme.borderColor} !important;
+ border-bottom: 1px solid ${colorTheme.borderColor} !important;
}
.paginated-list-header {
border-bottom: 1px solid ${colorTheme.borderColor} !important;
@@ -118,7 +118,7 @@ function colorThemeToCss(colorTheme) {
}
.references-packages {
border-right:1px solid ${colorTheme.borderColor} !important;
- }`;
+ }`;
return css;
}
@@ -150,14 +150,14 @@ const lightTheme = {
name: "Light theme",
description: "Light theme (Github based)",
defaultColor: "#24292e",
- backgroundColor: "#ffffff",
+ backgroundColor: "#ffffff",
typeColor: "#005cc5",
literalColor: "#032f62",
topLevelIdFromCurrentModule : "#6f42c1",
localIdentifierColor: ["#005C31",
"#2BCE48","#808080","#8F7C00",
"#C20088","#FFA405","#ffa8bb","#426600","#FF0010",
- "#09d7d8","#00998F","#990000","#FF5005"],
+ "#09d7d8","#00998F","#990000","#FF5005"],
menuColor: "#f2f4f8",
menuLinkColor : "#24292e",
infoWindowColor: "#f2f4f8",
@@ -171,7 +171,7 @@ function updateColorThemeCss (colorTheme) {
const newStyle = document.createElement('style');
newStyle.type = 'text/css';
newStyle.innerHTML = colorThemeToCss(colorTheme);
- newStyle.id = 'color-theme';
+ newStyle.id = 'color-theme';
const oldStyle = document.querySelector("style#color-theme");
if(oldStyle) {
oldStyle.parentElement.removeChild(oldStyle);
@@ -186,6 +186,6 @@ const themes = {
export {
updateColorThemeCss,
- colorThemeToCss,
- themes
+ colorThemeToCss,
+ themes
}
diff --git a/javascript/app/utils/go-to-definition.js b/javascript/app/utils/go-to-definition.js
index 6eac9c3..59b5dba 100644
--- a/javascript/app/utils/go-to-definition.js
+++ b/javascript/app/utils/go-to-definition.js
@@ -25,10 +25,10 @@ function openUrl(buttonId,url) {
return false;
}
-function saveCurrentLocation(currentLineNumber) {
+function saveCurrentLocation(currentLineNumber) {
if(currentLineNumber) {
- const url = window.location.origin + window.location.pathname + "#L" + currentLineNumber;
- if(location.href != url) {
+ const url = window.location.origin + window.location.pathname + "#L" + currentLineNumber;
+ if(location.href != url) {
window.location.hash = "#L" + currentLineNumber;
}
}
@@ -43,7 +43,7 @@ function goToDefinition(store,locationInfo,buttonId,currentLineNumber) {
openUrl(buttonId,url);
} else if((locationInfo.tag === "ApproximateLocation") &&
(locationInfo.moduleName.indexOf("Paths_") !== 0)) {
- const packageId = locationInfo.packageId.name+"-"+locationInfo.packageId.version;
+ const packageId = locationInfo.packageId.name+"-"+locationInfo.packageId.version;
if(locationInfo.entity === "Mod") {
store.loadDefinitionSite(packageId,
locationInfo.moduleName,
@@ -55,7 +55,7 @@ function goToDefinition(store,locationInfo,buttonId,currentLineNumber) {
openUrl(buttonId,"/package/" + packageId + "/show/" + defSite.location.modulePath);
}).catch(() => {
openUrl(buttonId,hackageUrl(packageId,locationInfo));
- });
+ });
} else {
store.loadDefinitionSite(packageId,
locationInfo.moduleName,
@@ -78,10 +78,10 @@ function goToDefinition(store,locationInfo,buttonId,currentLineNumber) {
saveCurrentLocation(currentLineNumber);
openUrl(buttonId,hackageUrl(packageId,locationInfo));
});
- }
+ }
} else {
alert('No location info');
- }
+ }
}
export {
diff --git a/javascript/app/utils/language-extensions.js b/javascript/app/utils/language-extensions.js
index bee90b6..f5e8b41 100644
--- a/javascript/app/utils/language-extensions.js
+++ b/javascript/app/utils/language-extensions.js
@@ -198,7 +198,7 @@ const extensions = {
"InterruptibleFFI": {
"description": "Enable interruptible FFI.",
"link": "https://haskell.org/ghc/docs/latest/html/users_guide/ffi-chap.html#interruptible-foreign-calls"
- },
+ },
"KindSignatures": {
"description": "Allow an explicit kind signature giving the kind of types over which a type variable ranges.",
"link": "https://www.haskell.org/ghc/docs/latest/html/users_guide/glasgow_exts.html#ghc-flag--XKindSignatures"
@@ -314,7 +314,7 @@ const extensions = {
"PatternGuards": {
"description": "Enable a form of guard which matches a pattern and binds variables.",
"link": "https://www.haskell.org/ghc/docs/latest/html/users_guide/glasgow_exts.html#ghc-flag--XPatternGuards"
- },
+ },
"PatternSynonyms": {
"description": "Allow giving names to and abstracting over patterns.",
"link": "https://www.haskell.org/ghc/docs/latest/html/users_guide/glasgow_exts.html#ghc-flag--XPatternSynonyms"
@@ -322,7 +322,7 @@ const extensions = {
"PolyKinds": {
"description": "Enable kind polymorphism.",
"link": "https://www.haskell.org/ghc/docs/latest/html/users_guide/glasgow_exts.html#ghc-flag--XPolyKinds"
- },
+ },
"PostfixOperators": {
"description": "Relax the interpretation of left operator sections to allow unary postfix operators.",
"link": "https://www.haskell.org/ghc/docs/latest/html/users_guide/glasgow_exts.html#ghc-flag--XPostfixOperators"
@@ -394,7 +394,7 @@ const extensions = {
"StarIsType": {
"description": "Have * refer to Type.",
"link":"https://ghc.haskell.org/trac/ghc/wiki/Migration/8.6#StarIsType"
-
+
},
"StaticPointers": {
"description": "Enable support for 'static pointers' (and the static keyword) to refer to globally stable names, even across different programs.",
@@ -497,7 +497,7 @@ const extensions = {
const regexp = new RegExp(Object.keys(extensions).join("|"),"g");
-function addLinksToLanguageExtensionsDocs(string) {
+function addLinksToLanguageExtensionsDocs(string) {
return string.replace(regexp, function(match) {
const extension = extensions[match];
if(extensions) {
diff --git a/javascript/app/utils/line-selection.js b/javascript/app/utils/line-selection.js
index d6d0976..d2e55e3 100644
--- a/javascript/app/utils/line-selection.js
+++ b/javascript/app/utils/line-selection.js
@@ -6,7 +6,7 @@ function initializeLineSelection(sourceCodeContainerElement,component) {
}
window.addEventListener("hashchange",onhashchange);
component._onhashchange = onhashchange;
-
+
let shiftPressed;
const onkeydown = function (event) {
if(event.keyCode === 16) { shiftPressed = true; }
@@ -14,12 +14,12 @@ function initializeLineSelection(sourceCodeContainerElement,component) {
const onkeyup = function (event) {
if(event.keyCode === 16) { shiftPressed = false; }
};
-
+
document.addEventListener('keydown',onkeydown);
document.addEventListener('keyup',onkeyup);
component._onkeydown = onkeydown;
component._onkeyup = onkeyup;
-
+
let selectedLine1,selectedLine2;
lineNumbers.forEach((lineNumberElement) => {
lineNumberElement.onclick = function() {
@@ -35,7 +35,7 @@ function initializeLineSelection(sourceCodeContainerElement,component) {
window.location.hash = "L"+selectedLine2+"-L"+selectedLine1;
}
}
- } else {
+ } else {
selectedLine1 = number;
selectedLine2 = null;
highlightLines(sourceCodeContainerElement,selectedLine1,selectedLine1);
@@ -43,11 +43,11 @@ function initializeLineSelection(sourceCodeContainerElement,component) {
}
}
});
- const lines = highlightSelectedLines(sourceCodeContainerElement);
+ const lines = highlightSelectedLines(sourceCodeContainerElement);
if(lines.length) {
selectedLine1 = lines[0];
selectedLine2 = lines[1];
- }
+ }
}
}
@@ -85,18 +85,18 @@ function highlightSelectedLines (sourceCodeContainerElement) {
function scrollLineIntoView(lineElement,sourceCodeContainerElement) {
lineElement.parentNode.scrollIntoView();
- const container = sourceCodeContainerElement.parentNode.parentNode;
+ const container = sourceCodeContainerElement.parentNode.parentNode;
const windowHeight = container.offsetHeight;
const fullHeight = sourceCodeContainerElement.offsetHeight;
- if(fullHeight - container.scrollTop > windowHeight) {
+ if(fullHeight - container.scrollTop > windowHeight) {
container.scrollTop = container.scrollTop - (windowHeight/2 - 20);
}
}
-function highlightLines(parentElement,startLine,endLine) {
+function highlightLines(parentElement,startLine,endLine) {
const lineElements = Array.prototype.slice.call(parentElement.querySelectorAll("td.line-content"));
- lineElements.forEach((lineElement) => {
+ lineElements.forEach((lineElement) => {
const number = parseInt(lineElement.id.substring(2)); //<td "id"="LC10">...</td>
if(number >= startLine && number <= endLine) {
lineElement.classList.add('highlighted-line');