diff --git a/webapp/dist/app/components/shico/trackerParameters.template.html b/webapp/dist/app/components/shico/trackerParameters.template.html index a4f8231..0325178 100644 --- a/webapp/dist/app/components/shico/trackerParameters.template.html +++ b/webapp/dist/app/components/shico/trackerParameters.template.html @@ -74,8 +74,12 @@ - - +
+ + +
diff --git a/webapp/dist/config.json b/webapp/dist/config.json index 33c0cfa..e4acd36 100644 --- a/webapp/dist/config.json +++ b/webapp/dist/config.json @@ -1,3 +1,3 @@ { - "baseURL": "http://ui.shico-nlesc.vm.surfsara.nl:5000" + "baseURL": "http://ui.shico-nlesc.vm.surfsara.nl:8000" } diff --git a/webapp/dist/maps/scripts/app.js.map b/webapp/dist/maps/scripts/app.js.map index bc577ce..fcfb73d 100644 --- a/webapp/dist/maps/scripts/app.js.map +++ b/webapp/dist/maps/scripts/app.js.map @@ -1 +1 @@ -{"version":3,"sources":["scripts/app.js"],"names":["angular","module","TrackerParametersService","$http","marked","getParameters","vm","parameters","setParameters","params","forEach","val","key","isDefined","updateYearKeys","yearValues","availableYears","values","idxYearFrom","from","idxYearTo","to","startKey","endKey","loadToolTip","url","ttKey","method","success","content","tooltips","this","terms","maxTerms","maxRelatedTerms","minDist","wordBoost","forwards","boostMethod","algorithm","aggWeighFunction","aggWFParam","aggYearsInInterval","aggWordsPerYear","options","floor","ceil","step","onChange","service","$inject","trackerParameters","directive","scope","templateUrl","controllerAs","controller","TrackerParametersController","algorithms","weighFuncs","directions","boostMethods","years","trackerGraphs","TrackerGraphsController","GraphControlService","yearsInSight","yearIdx","forceGraph","currYearIdx","addBorder","svg","attr","downloadData","rawData","getRawData","stream","allWords","Set","allYears","wordValues","year","push","weight","word","add","headers","concat","csvData","row","streamGraph","slider_options","getYearLabel","parameterIO","ParameterIOController","hide","readOnly","text","JSON","stringify","btnText","closeParamIO","parse","GraphConfigService","yearLabels","update","data","idx","setVocabulary","setStreamYears","streamData","formatForStream","forceData","formatForForce","networks","length","network","getConfig","showTicksValues","translate","vocab","wordColourIdx","getColour","item","name","cIdx","colours","getX","point","getY","tickY","tickVal","parseFloat","toFixed","tickYear","yearTickLabels","labels","processNode","node","addTextLabels","setSize","forceGraphHooks","hook","append","d","style","type","select","chooseSymbolType","chooseSymbolSize","Math","log2","count","customTooltipContent","showContent","html","addForceGraphHook","callback","graphName","streamConfig","forceConfig","chart","height","margin","top","right","bottom","left","x","y","xAxis","tickFormat","yAxis","color","customSymbol","d3","symbol","size","width","nodeExtras","curveLinks","useArrows","tooltip","contentGenerator","scale","category20","FormController","ConceptService","doPost","resp","trackConcept","trackerPromise","then","SettingsService","$resource","doLoad","configFile","get","$promise","config","baseURL","trackerURL","avlYearSvcURL","avlYearResource","first","last","$log","trackerParams","tracker","request","trackPromise","parseTermTrack","net","nodes","toJSON","runBlock","debug","run","$logProvider","toastrConfig","debugEnabled","allowHtml","timeOut","positionClass","preventDuplicates","progressBar","$templateCache","put"],"mappings":"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","file":"scripts/app.js","sourcesContent":["(function() {\n 'use strict';\n\n angular\n .module('shico', [\n 'ngResource',\n 'ngAnimate',\n 'ui.bootstrap',\n 'toastr',\n 'nvd3',\n 'rzModule',\n 'cgBusy',\n 'ngSanitize',\n 'ngCsv',\n 'hc.marked'\n ]);\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('shico')\n .service('TrackerParametersService', TrackerParametersService);\n\n function TrackerParametersService($http, marked) {\n var vm = this;\n\n vm.parameters = {\n terms: '',\n maxTerms: 10,\n maxRelatedTerms: 10,\n startKey: '',\n endKey: '',\n minDist: 0.7,\n wordBoost: 1.0,\n forwards: 'Forward',\n boostMethod: 'Sum similarity',\n algorithm: 'Adaptive', // 'adaptive' or 'non-adaptive'\n // Aggregator parameters:\n aggWeighFunction: 'Gaussian',\n aggWFParam: 1,\n aggYearsInInterval: 5,\n aggWordsPerYear: 5\n };\n\n vm.availableYears = {\n from: 0, to: 1,\n values: {},\n options: {\n floor: 0,\n ceil: 1,\n step: 1,\n onChange: updateYearKeys\n }\n };\n\n vm.tooltips = {};\n loadToolTip('/help/algorithm.md', 'algorithm');\n\n var service = {\n getParameters: getParameters,\n setParameters: setParameters,\n tooltips: vm.tooltips,\n availableYears: vm.availableYears\n };\n return service;\n\n function getParameters() {\n return vm.parameters;\n }\n\n function setParameters(params) {\n // Copy parameters from `params` which already exist in `vm.parameters`\n angular.forEach(vm.parameters, function(val,key) {\n if(angular.isDefined(params[key])) {\n vm.parameters[key] = params[key]\n }\n });\n }\n\n function updateYearKeys() {\n // Copy values from slider to startKey and endKey\n // Slider contains only year (e.g. 1954), while startKey and endKey\n // require the name of the corresponding w2v model (e.g. 1950_1959)\n var yearValues = vm.availableYears.values;\n var idxYearFrom = vm.availableYears.from;\n var idxYearTo = vm.availableYears.to;\n\n vm.parameters.startKey = yearValues[idxYearFrom];\n vm.parameters.endKey = yearValues[idxYearTo];\n }\n\n function loadToolTip(url, ttKey) {\n $http({method: 'GET',url: url})\n .success(function(content){\n vm.tooltips[ttKey] = marked(content);\n });\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('shico')\n .directive('trackerParameters', trackerParameters);\n\n function trackerParameters() {\n var directive = {\n scope: {}, // Directive has it's own personal scope\n templateUrl: 'app/components/shico/trackerParameters.template.html',\n controllerAs: 'vm',\n controller: 'TrackerParametersController'\n };\n return directive;\n }\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('shico')\n .controller('TrackerParametersController', TrackerParametersController);\n\n function TrackerParametersController(TrackerParametersService) {\n var vm = this;\n vm.algorithms = ['Adaptive', 'Non-adaptive'];\n vm.weighFuncs = ['Gaussian', 'Linear', 'JSD'];\n vm.directions = ['Forward', 'Backward'];\n vm.boostMethods = ['Sum similarity', 'Counts'];\n // Years not defined here because it gets loaded by service\n vm.years = TrackerParametersService.availableYears;\n\n // We use the parameters variable from ParameterService directly.\n vm.parameters = TrackerParametersService.getParameters();\n\n // \n vm.tooltips = TrackerParametersService.tooltips;\n }\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('shico')\n .directive('trackerGraphs', trackerGraphs);\n\n function trackerGraphs() {\n var directive = {\n scope: {}, // Directive has it's own personal scope\n templateUrl: 'app/components/shico/trackerGraphs.template.html',\n controllerAs: 'vm',\n controller: 'TrackerGraphsController'\n };\n return directive;\n }\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('shico')\n .controller('TrackerGraphsController', TrackerGraphsController);\n\n function TrackerGraphsController(GraphControlService) {\n var vm = this;\n\n // Share graph data from service to controller\n // so directive can find them.\n vm.streamGraph = GraphControlService.streamGraph;\n vm.forceGraph = GraphControlService.forceGraph;\n vm.slider_options = GraphControlService.slider_options;\n vm.getYearLabel = GraphControlService.getYearLabel;\n vm.yearsInSight = yearsInSight;\n vm.addBorder = addBorder;\n vm.downloadData = downloadData;\n\n function yearsInSight(yearIdx) {\n return (vm.forceGraph.currYearIdx - 1) <= yearIdx &&\n yearIdx <= (vm.forceGraph.currYearIdx + 1);\n }\n\n function addBorder(scope) {\n // Add border\n scope.svg.attr('style', 'border-style: solid');\n }\n\n function downloadData() {\n var rawData = GraphControlService.getRawData().stream;\n\n // allWords and allYears we already had -- we shouldn't need to build them again\n var allWords = new Set();\n var allYears = [];\n angular.forEach(rawData, function(wordValues, year) {\n allYears.push(year);\n angular.forEach(wordValues, function(weight, word) {\n allWords.add(word);\n });\n });\n\n // Create CSV file\n var headers = [ '' ].concat(allYears);\n var csvData = [ headers ];\n angular.forEach(allWords, function(word) {\n var row = [ word ];\n angular.forEach(allYears, function(year) {\n var val = (word in rawData[year]) ? rawData[year][word] : 0;\n row.push(val);\n });\n csvData.push(row);\n });\n\n return csvData;\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n// console.log('Running temp code...');\n\n// var shico = angular\n// .module('shico');\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('shico')\n .directive('parameterIo', parameterIO);\n\n function parameterIO() {\n var directive = {\n scope: {}, // Directive has it's own personal scope\n templateUrl: 'app/components/shico/parameterIO.template.html',\n controllerAs: 'vm',\n controller: 'ParameterIOController'\n };\n return directive;\n }\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('shico')\n .controller('ParameterIOController', ParameterIOController);\n\n function ParameterIOController(TrackerParametersService) {\n var vm = this;\n vm.getParameters = getParameters;\n vm.setParameters = setParameters;\n vm.closeParamIO = closeParamIO;\n\n vm.text = '';\n vm.readOnly = false;\n vm.hide = true;\n\n function getParameters () {\n vm.hide = false;\n vm.readOnly = true;\n vm.text = JSON.stringify(TrackerParametersService.getParameters());\n vm.btnText = 'Ok';\n }\n\n function setParameters () {\n vm.hide = false;\n vm.readOnly = false;\n vm.text = '';\n vm.btnText = 'Load';\n }\n\n function closeParamIO() {\n vm.hide = true;\n if(!vm.readOnly) {\n var params = JSON.parse(vm.text);\n TrackerParametersService.setParameters(params);\n }\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('shico')\n .service('GraphControlService', GraphControlService);\n\n function GraphControlService(GraphConfigService) {\n var vm = this;\n\n vm.streamGraph = {\n options: GraphConfigService.getConfig('streamGraph'),\n data: []\n };\n\n vm.forceGraph = {\n options: GraphConfigService.getConfig('forceGraph'),\n data: [],\n currYearIdx: 0\n };\n\n vm.yearLabels = [];\n vm.slider_options = {\n floor: 0,\n ceil: 0,\n showTicksValues: false,\n translate: getYearLabel\n };\n\n var service = {\n update: update,\n getRawData: getRawData,\n getYearLabel: getYearLabel,\n streamGraph: vm.streamGraph,\n forceGraph: vm.forceGraph,\n slider_options: vm.slider_options\n\n };\n return service;\n\n function getYearLabel(yearIdx) {\n return vm.yearLabels[yearIdx];\n }\n\n // Update graphs with the given data\n function update(data) {\n vm.rawData = data;\n\n // Collect all words and year labels on data\n var allYears = [];\n var allWords = new Set();\n angular.forEach(data.stream, function(wordValues, year) {\n allYears.push(year);\n angular.forEach(wordValues, function(weight, word) {\n allWords.add(word);\n });\n });\n\n // Create year idx -> label table\n var yearIdx = {};\n angular.forEach(allYears, function(year, idx) {\n yearIdx[year] = idx;\n });\n\n // Register vocabulary and year labels with to be used by config\n GraphConfigService.setVocabulary(allWords);\n GraphConfigService.setStreamYears(allYears);\n vm.yearLabels = allYears;\n\n // Prepare data on format suitable from NVD3\n var streamData = formatForStream(data.stream, yearIdx, allWords, allYears);\n var forceData = formatForForce(data.networks, yearIdx);\n\n // Register data on graph\n vm.streamGraph.data = streamData;\n vm.forceGraph.data = forceData;\n\n vm.slider_options.ceil = vm.yearLabels.length-1;\n }\n\n function getRawData() {\n return vm.rawData;\n }\n\n function formatForStream(data, yearIdx, allWords, allYears) {\n var streamData = [];\n angular.forEach(allWords, function(word) {\n var values = [];\n angular.forEach(allYears, function(year) {\n var val = (word in data[year]) ? data[year][word] : 0;\n this.push([ yearIdx[year], val]);\n }, values);\n this.push({\n key: word,\n values: values\n });\n }, streamData);\n return streamData;\n }\n\n function formatForForce(data, yearIdx) {\n var forceData = {};\n\n angular.forEach(data, function(network, year) {\n forceData[yearIdx[year]] = network;\n });\n\n return forceData;\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('shico')\n .service('GraphConfigService', GraphConfigService);\n\n function GraphConfigService() {\n // NVD3 configuration for stream graph\n var streamConfig = {\n chart: {\n type: 'stackedAreaChart',\n height: 500,\n margin : {\n top: 20,\n right: 20,\n bottom: 60,\n left: 55\n },\n x: getX,\n y: getY,\n xAxis: {\n tickFormat: tickYear\n },\n yAxis: {\n tickFormat: tickY\n },\n color: getColour\n }\n };\n\n var customSymbol = d3.svg.symbol()\n .type( chooseSymbolType )\n .size( chooseSymbolSize );\n\n // NVD3 configuration for force directed graph\n var forceConfig = {\n chart: {\n type: 'forceDirectedGraph',\n height: 300,\n width: 300,\n color: getColour,\n symbol: customSymbol,\n nodeExtras: processNode,\n curveLinks: true,\n useArrows: true,\n tooltip: { contentGenerator: customTooltipContent }\n }\n };\n var colours = d3.scale.category20();\n\n var yearTickLabels = {}; // Year markers for stream graph\n var forceGraphHooks = [];\n var wordColourIdx = {};\n\n var service = {\n getConfig: getConfig,\n setStreamYears: setStreamYears,\n addForceGraphHook: addForceGraphHook,\n setVocabulary: setVocabulary\n };\n return service;\n\n // Helper functions for all graphs\n function setVocabulary(vocab) {\n var idx = 0;\n // Each word of vocabulary is assigned an unique ID, later used to assign colour\n // TODO: can't we get a list of words from server?\n angular.forEach(vocab, function(word) {\n wordColourIdx[word] = idx;\n idx += 1;\n });\n }\n\n function getColour(item) {\n var word = item.key || item.name;\n var cIdx = wordColourIdx[word];\n return cIdx ? colours(cIdx) : '#223344';\n }\n\n // Helper functions for streamConfig\n function getX(point){ return point[0]; }\n function getY(point){ return point[1]; }\n function tickY(tickVal) { return parseFloat(tickVal).toFixed(1); }\n\n function tickYear(idx) {\n if(idx in yearTickLabels) { return yearTickLabels[idx]; }\n else { return idx; }\n }\n function setStreamYears(labels) {\n yearTickLabels = labels;\n }\n\n // Helper functions for forceConfig\n function processNode(node) {\n // Nodes have: {'name': 'str', 'type': 'seed', 'count': N, year: XXXX},\n addTextLabels(node);\n setSize(node);\n angular.forEach(forceGraphHooks, function(hook) {\n hook(node);\n });\n }\n\n function addTextLabels(node) {\n node.append(\"text\")\n .attr(\"dx\", 12)\n .attr(\"dy\", \".35em\")\n .text(function(d) { return d.name; })\n .style(\"font-weight\", function(d) { return d.type==\"seed\"?\"bold\":\"\"; });\n }\n\n function setSize(node) {\n node.select('circle')\n .attr('r', function(d) { return 5 + 2 * (d.count); });\n }\n\n function chooseSymbolType(d) {\n if (d.type==\"seed\") {\n return \"triangle-up\";\n } else if(d.type==\"word\") {\n return \"circle\";\n } else {\n return \"diamond\";\n }\n }\n\n function chooseSymbolSize(d) {\n return 50 * Math.log2(2 + d.count);\n }\n\n function customTooltipContent(d) {\n var showContent = [ 'type', 'count', 'weight' ];\n\n var html = '';\n html += '';\n html += '';\n\n angular.forEach(showContent, function(key) {\n html += '';\n html += '';\n html += '';\n html += '';\n });\n\n html += '';\n html += '
' + d['name'] + '
' + key + '' + d[key] + '
';\n return html;\n }\n\n function addForceGraphHook(callback) {\n forceGraphHooks.push(callback);\n }\n\n function getConfig(graphName) {\n if(graphName === 'streamGraph') {\n return streamConfig;\n } else if(graphName === 'forceGraph'){\n return forceConfig;\n }\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('shico')\n .controller('FormController', FormController);\n\n function FormController(ConceptService,\n TrackerParametersService,\n GraphControlService) {\n var vm = this;\n\n vm.doPost = doPost;\n\n function doPost() {\n var params = TrackerParametersService.getParameters();\n var resp = ConceptService.trackConcept(params);\n vm.trackerPromise = resp; // ng-busy watches on trackerPromise\n resp.then(GraphControlService.update);\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('shico')\n .service('SettingsService', SettingsService);\n\n function SettingsService($resource, TrackerParametersService) {\n var service = {\n doLoad: doLoad\n };\n return service;\n\n function doLoad() {\n var configFile = $resource('config.json');\n configFile.get().$promise.then(function(config) {\n var baseURL = config.baseURL;\n var trackerURL = baseURL + '/track/:terms';\n var avlYearSvcURL = baseURL + '/available-years';\n\n if(baseURL.length==0) {\n trackerURL = 'dummy2.json';\n avlYearSvcURL = 'http://localhost:5000/available-years';\n }\n\n // Copy config from JSON to the service\n service.trackerURL = trackerURL;\n\n // Call avlYearSvc resource to get years\n var avlYearResource = $resource(avlYearSvcURL);\n avlYearResource.get().$promise.then(function(years) {\n TrackerParametersService.availableYears.from = years.first;\n TrackerParametersService.availableYears.to = years.last;\n TrackerParametersService.availableYears.values = years.values;\n TrackerParametersService.availableYears.options.floor = years.first;\n TrackerParametersService.availableYears.options.ceil = years.last;\n });\n });\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('shico')\n .service('ConceptService', ConceptService);\n\n function ConceptService($resource, $log, SettingsService) {\n var service = {\n trackConcept: trackConcept\n };\n return service;\n\n function trackConcept(trackerParams) {\n // trackerURL format: http://localhost:5000/track/:terms\n var tracker = $resource(SettingsService.trackerURL);\n var request = tracker.get(trackerParams);\n var trackPromise = request.$promise.then(parseTermTrack);\n return trackPromise;\n }\n\n function parseTermTrack(data) {\n // If data needs to be parsed, it should be done here.\n\n // Copy year into each node\n angular.forEach(data.networks, function(net,year) {\n angular.forEach(net.nodes, function(node) {\n node.year = year;\n });\n });\n return data.toJSON();\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('shico')\n .run(runBlock);\n\n /** @ngInject */\n function runBlock($log, SettingsService) {\n $log.debug('runBlock end');\n SettingsService.doLoad();\n }\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('shico');\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('shico')\n .config(config);\n\n /** @ngInject */\n function config($logProvider, toastrConfig) {\n // Enable log\n $logProvider.debugEnabled(true);\n\n // Set options third-party lib\n toastrConfig.allowHtml = true;\n toastrConfig.timeOut = 3000;\n toastrConfig.positionClass = 'toast-top-right';\n toastrConfig.preventDuplicates = true;\n toastrConfig.progressBar = true;\n }\n})();\n\nangular.module(\"shico\").run([\"$templateCache\", function($templateCache) {$templateCache.put(\"app/components/shico/parameterIO.template.html\",\"

\");\n$templateCache.put(\"app/components/shico/trackerGraphs.template.html\",\"
{{ vm.getYearLabel(yearIdx) }}
\");\n$templateCache.put(\"app/components/shico/trackerParameters.template.html\",\"

Concept search

Year period:
\");}]);"],"sourceRoot":"/source/"} \ No newline at end of file +{"version":3,"sources":["scripts/app.js"],"names":["angular","module","TrackerParametersService","$http","marked","getParameters","vm","parameters","setParameters","params","forEach","val","key","isDefined","updateYearKeys","yearValues","availableYears","values","idxYearFrom","from","idxYearTo","to","startKey","endKey","loadToolTip","url","ttKey","method","success","content","tooltips","this","terms","maxTerms","maxRelatedTerms","minDist","wordBoost","forwards","boostMethod","algorithm","aggWeighFunction","aggWFParam","aggYearsInInterval","aggWordsPerYear","doCleaning","options","floor","ceil","step","onChange","features","canClean","service","$inject","trackerParameters","directive","scope","templateUrl","controllerAs","controller","TrackerParametersController","algorithms","weighFuncs","directions","boostMethods","years","trackerGraphs","TrackerGraphsController","GraphControlService","yearsInSight","yearIdx","forceGraph","currYearIdx","addBorder","svg","attr","downloadData","rawData","getRawData","stream","allWords","Set","allYears","wordValues","year","push","weight","word","add","headers","concat","csvData","row","streamGraph","slider_options","getYearLabel","parameterIO","ParameterIOController","hide","readOnly","text","JSON","stringify","btnText","closeParamIO","parse","GraphConfigService","yearLabels","update","data","idx","setVocabulary","setStreamYears","streamData","formatForStream","forceData","formatForForce","networks","length","network","getConfig","showTicksValues","translate","vocab","wordColourIdx","getColour","item","name","cIdx","colours","getX","point","getY","tickY","tickVal","parseFloat","toFixed","tickYear","yearTickLabels","labels","processNode","node","addTextLabels","setSize","forceGraphHooks","hook","append","d","style","type","select","chooseSymbolType","chooseSymbolSize","Math","log2","count","customTooltipContent","showContent","html","addForceGraphHook","callback","graphName","streamConfig","forceConfig","chart","height","margin","top","right","bottom","left","x","y","xAxis","tickFormat","yAxis","color","customSymbol","d3","symbol","size","width","nodeExtras","curveLinks","useArrows","tooltip","contentGenerator","scale","category20","FormController","ConceptService","doPost","resp","trackConcept","trackerPromise","then","SettingsService","$resource","doLoad","configFile","get","$promise","config","baseURL","trackerURL","serverSettingsUrl","serverSettingsResource","settings","first","last","cleaning","$log","trackerParams","tracker","request","trackPromise","parseTermTrack","net","nodes","toJSON","runBlock","debug","run","$logProvider","toastrConfig","debugEnabled","allowHtml","timeOut","positionClass","preventDuplicates","progressBar","$templateCache","put"],"mappings":"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","file":"scripts/app.js","sourcesContent":["(function() {\n 'use strict';\n\n angular\n .module('shico', [\n 'ngResource',\n 'ngAnimate',\n 'ui.bootstrap',\n 'toastr',\n 'nvd3',\n 'rzModule',\n 'cgBusy',\n 'ngSanitize',\n 'ngCsv',\n 'hc.marked'\n ]);\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('shico')\n .service('TrackerParametersService', TrackerParametersService);\n\n function TrackerParametersService($http, marked) {\n var vm = this;\n\n vm.parameters = {\n terms: '',\n maxTerms: 10,\n maxRelatedTerms: 10,\n startKey: '',\n endKey: '',\n minDist: 0.7,\n wordBoost: 1.0,\n forwards: 'Forward',\n boostMethod: 'Sum similarity',\n algorithm: 'Adaptive', // 'adaptive' or 'non-adaptive'\n // Aggregator parameters:\n aggWeighFunction: 'Gaussian',\n aggWFParam: 1,\n aggYearsInInterval: 5,\n aggWordsPerYear: 5,\n doCleaning: 'No'\n };\n\n vm.availableYears = {\n from: 0, to: 1,\n values: {},\n options: {\n floor: 0,\n ceil: 1,\n step: 1,\n onChange: updateYearKeys\n }\n };\n\n vm.features = {\n canClean: false\n }\n\n vm.tooltips = {};\n loadToolTip('/help/algorithm.md', 'algorithm');\n\n var service = {\n getParameters: getParameters,\n setParameters: setParameters,\n tooltips: vm.tooltips,\n availableYears: vm.availableYears,\n features: vm.features\n };\n return service;\n\n function getParameters() {\n return vm.parameters;\n }\n\n function setParameters(params) {\n // Copy parameters from `params` which already exist in `vm.parameters`\n angular.forEach(vm.parameters, function(val,key) {\n if(angular.isDefined(params[key])) {\n vm.parameters[key] = params[key]\n }\n });\n }\n\n function updateYearKeys() {\n // Copy values from slider to startKey and endKey\n // Slider contains only year (e.g. 1954), while startKey and endKey\n // require the name of the corresponding w2v model (e.g. 1950_1959)\n var yearValues = vm.availableYears.values;\n var idxYearFrom = vm.availableYears.from;\n var idxYearTo = vm.availableYears.to;\n\n vm.parameters.startKey = yearValues[idxYearFrom];\n vm.parameters.endKey = yearValues[idxYearTo];\n }\n\n function loadToolTip(url, ttKey) {\n $http({method: 'GET',url: url})\n .success(function(content){\n vm.tooltips[ttKey] = marked(content);\n });\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('shico')\n .directive('trackerParameters', trackerParameters);\n\n function trackerParameters() {\n var directive = {\n scope: {}, // Directive has it's own personal scope\n templateUrl: 'app/components/shico/trackerParameters.template.html',\n controllerAs: 'vm',\n controller: 'TrackerParametersController'\n };\n return directive;\n }\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('shico')\n .controller('TrackerParametersController', TrackerParametersController);\n\n function TrackerParametersController(TrackerParametersService) {\n var vm = this;\n vm.algorithms = ['Adaptive', 'Non-adaptive'];\n vm.weighFuncs = ['Gaussian', 'Linear', 'JSD'];\n vm.directions = ['Forward', 'Backward'];\n vm.boostMethods = ['Sum similarity', 'Counts'];\n vm.doCleaning = [ 'Yes', 'No' ];\n\n // Years and features gets loaded by SettingsService\n vm.years = TrackerParametersService.availableYears;\n vm.features = TrackerParametersService.features;\n\n // We use the parameters variable from ParameterService directly.\n vm.parameters = TrackerParametersService.getParameters();\n\n //\n vm.tooltips = TrackerParametersService.tooltips;\n }\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('shico')\n .directive('trackerGraphs', trackerGraphs);\n\n function trackerGraphs() {\n var directive = {\n scope: {}, // Directive has it's own personal scope\n templateUrl: 'app/components/shico/trackerGraphs.template.html',\n controllerAs: 'vm',\n controller: 'TrackerGraphsController'\n };\n return directive;\n }\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('shico')\n .controller('TrackerGraphsController', TrackerGraphsController);\n\n function TrackerGraphsController(GraphControlService) {\n var vm = this;\n\n // Share graph data from service to controller\n // so directive can find them.\n vm.streamGraph = GraphControlService.streamGraph;\n vm.forceGraph = GraphControlService.forceGraph;\n vm.slider_options = GraphControlService.slider_options;\n vm.getYearLabel = GraphControlService.getYearLabel;\n vm.yearsInSight = yearsInSight;\n vm.addBorder = addBorder;\n vm.downloadData = downloadData;\n\n function yearsInSight(yearIdx) {\n return (vm.forceGraph.currYearIdx - 1) <= yearIdx &&\n yearIdx <= (vm.forceGraph.currYearIdx + 1);\n }\n\n function addBorder(scope) {\n // Add border\n scope.svg.attr('style', 'border-style: solid');\n }\n\n function downloadData() {\n var rawData = GraphControlService.getRawData().stream;\n\n // allWords and allYears we already had -- we shouldn't need to build them again\n var allWords = new Set();\n var allYears = [];\n angular.forEach(rawData, function(wordValues, year) {\n allYears.push(year);\n angular.forEach(wordValues, function(weight, word) {\n allWords.add(word);\n });\n });\n\n // Create CSV file\n var headers = [ '' ].concat(allYears);\n var csvData = [ headers ];\n angular.forEach(allWords, function(word) {\n var row = [ word ];\n angular.forEach(allYears, function(year) {\n var val = (word in rawData[year]) ? rawData[year][word] : 0;\n row.push(val);\n });\n csvData.push(row);\n });\n\n return csvData;\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n// console.log('Running temp code...');\n\n// var shico = angular\n// .module('shico');\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('shico')\n .directive('parameterIo', parameterIO);\n\n function parameterIO() {\n var directive = {\n scope: {}, // Directive has it's own personal scope\n templateUrl: 'app/components/shico/parameterIO.template.html',\n controllerAs: 'vm',\n controller: 'ParameterIOController'\n };\n return directive;\n }\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('shico')\n .controller('ParameterIOController', ParameterIOController);\n\n function ParameterIOController(TrackerParametersService) {\n var vm = this;\n vm.getParameters = getParameters;\n vm.setParameters = setParameters;\n vm.closeParamIO = closeParamIO;\n\n vm.text = '';\n vm.readOnly = false;\n vm.hide = true;\n\n function getParameters () {\n vm.hide = false;\n vm.readOnly = true;\n vm.text = JSON.stringify(TrackerParametersService.getParameters());\n vm.btnText = 'Ok';\n }\n\n function setParameters () {\n vm.hide = false;\n vm.readOnly = false;\n vm.text = '';\n vm.btnText = 'Load';\n }\n\n function closeParamIO() {\n vm.hide = true;\n if(!vm.readOnly) {\n var params = JSON.parse(vm.text);\n TrackerParametersService.setParameters(params);\n }\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('shico')\n .service('GraphControlService', GraphControlService);\n\n function GraphControlService(GraphConfigService) {\n var vm = this;\n\n vm.streamGraph = {\n options: GraphConfigService.getConfig('streamGraph'),\n data: []\n };\n\n vm.forceGraph = {\n options: GraphConfigService.getConfig('forceGraph'),\n data: [],\n currYearIdx: 0\n };\n\n vm.yearLabels = [];\n vm.slider_options = {\n floor: 0,\n ceil: 0,\n showTicksValues: false,\n translate: getYearLabel\n };\n\n var service = {\n update: update,\n getRawData: getRawData,\n getYearLabel: getYearLabel,\n streamGraph: vm.streamGraph,\n forceGraph: vm.forceGraph,\n slider_options: vm.slider_options\n\n };\n return service;\n\n function getYearLabel(yearIdx) {\n return vm.yearLabels[yearIdx];\n }\n\n // Update graphs with the given data\n function update(data) {\n vm.rawData = data;\n\n // Collect all words and year labels on data\n var allYears = [];\n var allWords = new Set();\n angular.forEach(data.stream, function(wordValues, year) {\n allYears.push(year);\n angular.forEach(wordValues, function(weight, word) {\n allWords.add(word);\n });\n });\n\n // Create year idx -> label table\n var yearIdx = {};\n angular.forEach(allYears, function(year, idx) {\n yearIdx[year] = idx;\n });\n\n // Register vocabulary and year labels with to be used by config\n GraphConfigService.setVocabulary(allWords);\n GraphConfigService.setStreamYears(allYears);\n vm.yearLabels = allYears;\n\n // Prepare data on format suitable from NVD3\n var streamData = formatForStream(data.stream, yearIdx, allWords, allYears);\n var forceData = formatForForce(data.networks, yearIdx);\n\n // Register data on graph\n vm.streamGraph.data = streamData;\n vm.forceGraph.data = forceData;\n\n vm.slider_options.ceil = vm.yearLabels.length-1;\n }\n\n function getRawData() {\n return vm.rawData;\n }\n\n function formatForStream(data, yearIdx, allWords, allYears) {\n var streamData = [];\n angular.forEach(allWords, function(word) {\n var values = [];\n angular.forEach(allYears, function(year) {\n var val = (word in data[year]) ? data[year][word] : 0;\n this.push([ yearIdx[year], val]);\n }, values);\n this.push({\n key: word,\n values: values\n });\n }, streamData);\n return streamData;\n }\n\n function formatForForce(data, yearIdx) {\n var forceData = {};\n\n angular.forEach(data, function(network, year) {\n forceData[yearIdx[year]] = network;\n });\n\n return forceData;\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('shico')\n .service('GraphConfigService', GraphConfigService);\n\n function GraphConfigService() {\n // NVD3 configuration for stream graph\n var streamConfig = {\n chart: {\n type: 'stackedAreaChart',\n height: 500,\n margin : {\n top: 20,\n right: 20,\n bottom: 60,\n left: 55\n },\n x: getX,\n y: getY,\n xAxis: {\n tickFormat: tickYear\n },\n yAxis: {\n tickFormat: tickY\n },\n color: getColour\n }\n };\n\n var customSymbol = d3.svg.symbol()\n .type( chooseSymbolType )\n .size( chooseSymbolSize );\n\n // NVD3 configuration for force directed graph\n var forceConfig = {\n chart: {\n type: 'forceDirectedGraph',\n height: 300,\n width: 300,\n color: getColour,\n symbol: customSymbol,\n nodeExtras: processNode,\n curveLinks: true,\n useArrows: true,\n tooltip: { contentGenerator: customTooltipContent }\n }\n };\n var colours = d3.scale.category20();\n\n var yearTickLabels = {}; // Year markers for stream graph\n var forceGraphHooks = [];\n var wordColourIdx = {};\n\n var service = {\n getConfig: getConfig,\n setStreamYears: setStreamYears,\n addForceGraphHook: addForceGraphHook,\n setVocabulary: setVocabulary\n };\n return service;\n\n // Helper functions for all graphs\n function setVocabulary(vocab) {\n var idx = 0;\n // Each word of vocabulary is assigned an unique ID, later used to assign colour\n // TODO: can't we get a list of words from server?\n angular.forEach(vocab, function(word) {\n wordColourIdx[word] = idx;\n idx += 1;\n });\n }\n\n function getColour(item) {\n var word = item.key || item.name;\n var cIdx = wordColourIdx[word];\n return cIdx ? colours(cIdx) : '#223344';\n }\n\n // Helper functions for streamConfig\n function getX(point){ return point[0]; }\n function getY(point){ return point[1]; }\n function tickY(tickVal) { return parseFloat(tickVal).toFixed(1); }\n\n function tickYear(idx) {\n if(idx in yearTickLabels) { return yearTickLabels[idx]; }\n else { return idx; }\n }\n function setStreamYears(labels) {\n yearTickLabels = labels;\n }\n\n // Helper functions for forceConfig\n function processNode(node) {\n // Nodes have: {'name': 'str', 'type': 'seed', 'count': N, year: XXXX},\n addTextLabels(node);\n setSize(node);\n angular.forEach(forceGraphHooks, function(hook) {\n hook(node);\n });\n }\n\n function addTextLabels(node) {\n node.append(\"text\")\n .attr(\"dx\", 12)\n .attr(\"dy\", \".35em\")\n .text(function(d) { return d.name; })\n .style(\"font-weight\", function(d) { return d.type==\"seed\"?\"bold\":\"\"; });\n }\n\n function setSize(node) {\n node.select('circle')\n .attr('r', function(d) { return 5 + 2 * (d.count); });\n }\n\n function chooseSymbolType(d) {\n if (d.type==\"seed\") {\n return \"triangle-up\";\n } else if(d.type==\"word\") {\n return \"circle\";\n } else {\n return \"diamond\";\n }\n }\n\n function chooseSymbolSize(d) {\n return 50 * Math.log2(2 + d.count);\n }\n\n function customTooltipContent(d) {\n var showContent = [ 'type', 'count', 'weight' ];\n\n var html = '';\n html += '';\n html += '';\n\n angular.forEach(showContent, function(key) {\n html += '';\n html += '';\n html += '';\n html += '';\n });\n\n html += '';\n html += '
' + d['name'] + '
' + key + '' + d[key] + '
';\n return html;\n }\n\n function addForceGraphHook(callback) {\n forceGraphHooks.push(callback);\n }\n\n function getConfig(graphName) {\n if(graphName === 'streamGraph') {\n return streamConfig;\n } else if(graphName === 'forceGraph'){\n return forceConfig;\n }\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('shico')\n .controller('FormController', FormController);\n\n function FormController(ConceptService,\n TrackerParametersService,\n GraphControlService) {\n var vm = this;\n\n vm.doPost = doPost;\n\n function doPost() {\n var params = TrackerParametersService.getParameters();\n var resp = ConceptService.trackConcept(params);\n vm.trackerPromise = resp; // ng-busy watches on trackerPromise\n resp.then(GraphControlService.update);\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('shico')\n .service('SettingsService', SettingsService);\n\n function SettingsService($resource, TrackerParametersService) {\n var service = {\n doLoad: doLoad\n };\n return service;\n\n function doLoad() {\n var configFile = $resource('config.json');\n configFile.get().$promise.then(function(config) {\n var baseURL = config.baseURL;\n var trackerURL = baseURL + '/track/:terms';\n var serverSettingsUrl = baseURL + '/load-settings';\n\n if(baseURL.length==0) {\n trackerURL = 'dummy2.json';\n serverSettingsUrl = 'http://localhost:5000/load-settings';\n }\n\n // Copy config from JSON to the service\n service.trackerURL = trackerURL;\n\n // Call serverSettingsUrl resource to server setting\n var serverSettingsResource = $resource(serverSettingsUrl);\n serverSettingsResource.get().$promise.then(function(settings) {\n // Years available\n TrackerParametersService.availableYears.from = settings.years.first;\n TrackerParametersService.availableYears.to = settings.years.last;\n TrackerParametersService.availableYears.values = settings.years.values;\n TrackerParametersService.availableYears.options.floor = settings.years.first;\n TrackerParametersService.availableYears.options.ceil = settings.years.last;\n\n // Cleaning capabilities\n TrackerParametersService.features.canClean = settings.cleaning;\n });\n });\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('shico')\n .service('ConceptService', ConceptService);\n\n function ConceptService($resource, $log, SettingsService) {\n var service = {\n trackConcept: trackConcept\n };\n return service;\n\n function trackConcept(trackerParams) {\n // trackerURL format: http://localhost:5000/track/:terms\n var tracker = $resource(SettingsService.trackerURL);\n var request = tracker.get(trackerParams);\n var trackPromise = request.$promise.then(parseTermTrack);\n return trackPromise;\n }\n\n function parseTermTrack(data) {\n // If data needs to be parsed, it should be done here.\n\n // Copy year into each node\n angular.forEach(data.networks, function(net,year) {\n angular.forEach(net.nodes, function(node) {\n node.year = year;\n });\n });\n return data.toJSON();\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('shico')\n .run(runBlock);\n\n /** @ngInject */\n function runBlock($log, SettingsService) {\n $log.debug('runBlock end');\n SettingsService.doLoad();\n }\n\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('shico');\n})();\n\n(function() {\n 'use strict';\n\n angular\n .module('shico')\n .config(config);\n\n /** @ngInject */\n function config($logProvider, toastrConfig) {\n // Enable log\n $logProvider.debugEnabled(true);\n\n // Set options third-party lib\n toastrConfig.allowHtml = true;\n toastrConfig.timeOut = 3000;\n toastrConfig.positionClass = 'toast-top-right';\n toastrConfig.preventDuplicates = true;\n toastrConfig.progressBar = true;\n }\n})();\n\nangular.module(\"shico\").run([\"$templateCache\", function($templateCache) {$templateCache.put(\"app/components/shico/parameterIO.template.html\",\"

\");\n$templateCache.put(\"app/components/shico/trackerGraphs.template.html\",\"
{{ vm.getYearLabel(yearIdx) }}
\");\n$templateCache.put(\"app/components/shico/trackerParameters.template.html\",\"

Concept search

Year period:
\");}]);"],"sourceRoot":"/source/"} \ No newline at end of file diff --git a/webapp/dist/scripts/app.js b/webapp/dist/scripts/app.js index a6a60f1..683f7bd 100644 --- a/webapp/dist/scripts/app.js +++ b/webapp/dist/scripts/app.js @@ -1,2 +1,2 @@ -!function(){"use strict";angular.module("shico",["ngResource","ngAnimate","ui.bootstrap","toastr","nvd3","rzModule","cgBusy","ngSanitize","ngCsv","hc.marked"])}(),function(){"use strict";function e(e,r){function a(){return i.parameters}function t(e){angular.forEach(i.parameters,function(r,a){angular.isDefined(e[a])&&(i.parameters[a]=e[a])})}function o(){var e=i.availableYears.values,r=i.availableYears.from,a=i.availableYears.to;i.parameters.startKey=e[r],i.parameters.endKey=e[a]}function n(a,t){e({method:"GET",url:a}).success(function(e){i.tooltips[t]=r(e)})}var i=this;i.parameters={terms:"",maxTerms:10,maxRelatedTerms:10,startKey:"",endKey:"",minDist:.7,wordBoost:1,forwards:"Forward",boostMethod:"Sum similarity",algorithm:"Adaptive",aggWeighFunction:"Gaussian",aggWFParam:1,aggYearsInInterval:5,aggWordsPerYear:5},i.availableYears={from:0,to:1,values:{},options:{floor:0,ceil:1,step:1,onChange:o}},i.tooltips={},n("/help/algorithm.md","algorithm");var s={getParameters:a,setParameters:t,tooltips:i.tooltips,availableYears:i.availableYears};return s}angular.module("shico").service("TrackerParametersService",e),e.$inject=["$http","marked"]}(),function(){"use strict";function e(){var e={scope:{},templateUrl:"app/components/shico/trackerParameters.template.html",controllerAs:"vm",controller:"TrackerParametersController"};return e}angular.module("shico").directive("trackerParameters",e)}(),function(){"use strict";function e(e){var r=this;r.algorithms=["Adaptive","Non-adaptive"],r.weighFuncs=["Gaussian","Linear","JSD"],r.directions=["Forward","Backward"],r.boostMethods=["Sum similarity","Counts"],r.years=e.availableYears,r.parameters=e.getParameters(),r.tooltips=e.tooltips}angular.module("shico").controller("TrackerParametersController",e),e.$inject=["TrackerParametersService"]}(),function(){"use strict";function e(){var e={scope:{},templateUrl:"app/components/shico/trackerGraphs.template.html",controllerAs:"vm",controller:"TrackerGraphsController"};return e}angular.module("shico").directive("trackerGraphs",e)}(),function(){"use strict";function e(e){function r(e){return o.forceGraph.currYearIdx-1<=e&&e<=o.forceGraph.currYearIdx+1}function a(e){e.svg.attr("style","border-style: solid")}function t(){var r=e.getRawData().stream,a=new Set,t=[];angular.forEach(r,function(e,r){t.push(r),angular.forEach(e,function(e,r){a.add(r)})});var o=[""].concat(t),n=[o];return angular.forEach(a,function(e){var a=[e];angular.forEach(t,function(t){var o=e in r[t]?r[t][e]:0;a.push(o)}),n.push(a)}),n}var o=this;o.streamGraph=e.streamGraph,o.forceGraph=e.forceGraph,o.slider_options=e.slider_options,o.getYearLabel=e.getYearLabel,o.yearsInSight=r,o.addBorder=a,o.downloadData=t}angular.module("shico").controller("TrackerGraphsController",e),e.$inject=["GraphControlService"]}(),function(){"use strict"}(),function(){"use strict";function e(){var e={scope:{},templateUrl:"app/components/shico/parameterIO.template.html",controllerAs:"vm",controller:"ParameterIOController"};return e}angular.module("shico").directive("parameterIo",e)}(),function(){"use strict";function e(e){function r(){o.hide=!1,o.readOnly=!0,o.text=JSON.stringify(e.getParameters()),o.btnText="Ok"}function a(){o.hide=!1,o.readOnly=!1,o.text="",o.btnText="Load"}function t(){if(o.hide=!0,!o.readOnly){var r=JSON.parse(o.text);e.setParameters(r)}}var o=this;o.getParameters=r,o.setParameters=a,o.closeParamIO=t,o.text="",o.readOnly=!1,o.hide=!0}angular.module("shico").controller("ParameterIOController",e),e.$inject=["TrackerParametersService"]}(),function(){"use strict";function e(e){function r(e){return i.yearLabels[e]}function a(r){i.rawData=r;var a=[],t=new Set;angular.forEach(r.stream,function(e,r){a.push(r),angular.forEach(e,function(e,r){t.add(r)})});var s={};angular.forEach(a,function(e,r){s[e]=r}),e.setVocabulary(t),e.setStreamYears(a),i.yearLabels=a;var l=o(r.stream,s,t,a),c=n(r.networks,s);i.streamGraph.data=l,i.forceGraph.data=c,i.slider_options.ceil=i.yearLabels.length-1}function t(){return i.rawData}function o(e,r,a,t){var o=[];return angular.forEach(a,function(a){var o=[];angular.forEach(t,function(t){var o=a in e[t]?e[t][a]:0;this.push([r[t],o])},o),this.push({key:a,values:o})},o),o}function n(e,r){var a={};return angular.forEach(e,function(e,t){a[r[t]]=e}),a}var i=this;i.streamGraph={options:e.getConfig("streamGraph"),data:[]},i.forceGraph={options:e.getConfig("forceGraph"),data:[],currYearIdx:0},i.yearLabels=[],i.slider_options={floor:0,ceil:0,showTicksValues:!1,translate:r};var s={update:a,getRawData:t,getYearLabel:r,streamGraph:i.streamGraph,forceGraph:i.forceGraph,slider_options:i.slider_options};return s}angular.module("shico").service("GraphControlService",e),e.$inject=["GraphConfigService"]}(),function(){"use strict";function e(){function e(e){var r=0;angular.forEach(e,function(e){k[e]=r,r+=1})}function r(e){var r=e.key||e.name,a=k[r];return a?b(a):"#223344"}function a(e){return e[0]}function t(e){return e[1]}function o(e){return parseFloat(e).toFixed(1)}function n(e){return e in y?y[e]:e}function i(e){y=e}function s(e){l(e),c(e),angular.forEach(x,function(r){r(e)})}function l(e){e.append("text").attr("dx",12).attr("dy",".35em").text(function(e){return e.name}).style("font-weight",function(e){return"seed"==e.type?"bold":""})}function c(e){e.select("circle").attr("r",function(e){return 5+2*e.count})}function m(e){return"seed"==e.type?"triangle-up":"word"==e.type?"circle":"diamond"}function u(e){return 50*Math.log2(2+e.count)}function d(e){var r=["type","count","weight"],a="";return a+='",a+="",angular.forEach(r,function(r){a+="",a+='",a+='",a+=""}),a+="",a+="
'+e.name+"
'+r+"'+e[r]+"
"}function p(e){x.push(e)}function v(e){return"streamGraph"===e?f:"forceGraph"===e?h:void 0}var f={chart:{type:"stackedAreaChart",height:500,margin:{top:20,right:20,bottom:60,left:55},x:a,y:t,xAxis:{tickFormat:n},yAxis:{tickFormat:o},color:r}},g=d3.svg.symbol().type(m).size(u),h={chart:{type:"forceDirectedGraph",height:300,width:300,color:r,symbol:g,nodeExtras:s,curveLinks:!0,useArrows:!0,tooltip:{contentGenerator:d}}},b=d3.scale.category20(),y={},x=[],k={},w={getConfig:v,setStreamYears:i,addForceGraphHook:p,setVocabulary:e};return w}angular.module("shico").service("GraphConfigService",e)}(),function(){"use strict";function e(e,r,a){function t(){var t=r.getParameters(),n=e.trackConcept(t);o.trackerPromise=n,n.then(a.update)}var o=this;o.doPost=t}angular.module("shico").controller("FormController",e),e.$inject=["ConceptService","TrackerParametersService","GraphControlService"]}(),function(){"use strict";function e(e,r){function a(){var a=e("config.json");a.get().$promise.then(function(a){var o=a.baseURL,n=o+"/track/:terms",i=o+"/available-years";0==o.length&&(n="dummy2.json",i="http://localhost:5000/available-years"),t.trackerURL=n;var s=e(i);s.get().$promise.then(function(e){r.availableYears.from=e.first,r.availableYears.to=e.last,r.availableYears.values=e.values,r.availableYears.options.floor=e.first,r.availableYears.options.ceil=e.last})})}var t={doLoad:a};return t}angular.module("shico").service("SettingsService",e),e.$inject=["$resource","TrackerParametersService"]}(),function(){"use strict";function e(e,r,a){function t(r){var t=e(a.trackerURL),n=t.get(r),i=n.$promise.then(o);return i}function o(e){return angular.forEach(e.networks,function(e,r){angular.forEach(e.nodes,function(e){e.year=r})}),e.toJSON()}var n={trackConcept:t};return n}angular.module("shico").service("ConceptService",e),e.$inject=["$resource","$log","SettingsService"]}(),function(){"use strict";function e(e,r){e.debug("runBlock end"),r.doLoad()}angular.module("shico").run(e),e.$inject=["$log","SettingsService"]}(),function(){"use strict";angular.module("shico")}(),function(){"use strict";function e(e,r){e.debugEnabled(!0),r.allowHtml=!0,r.timeOut=3e3,r.positionClass="toast-top-right",r.preventDuplicates=!0,r.progressBar=!0}angular.module("shico").config(e),e.$inject=["$logProvider","toastrConfig"]}(),angular.module("shico").run(["$templateCache",function(e){e.put("app/components/shico/parameterIO.template.html",'

'),e.put("app/components/shico/trackerGraphs.template.html",'
{{ vm.getYearLabel(yearIdx) }}
'),e.put("app/components/shico/trackerParameters.template.html",'

Concept search

Year period:
')}]); +!function(){"use strict";angular.module("shico",["ngResource","ngAnimate","ui.bootstrap","toastr","nvd3","rzModule","cgBusy","ngSanitize","ngCsv","hc.marked"])}(),function(){"use strict";function e(e,r){function a(){return s.parameters}function t(e){angular.forEach(s.parameters,function(r,a){angular.isDefined(e[a])&&(s.parameters[a]=e[a])})}function o(){var e=s.availableYears.values,r=s.availableYears.from,a=s.availableYears.to;s.parameters.startKey=e[r],s.parameters.endKey=e[a]}function n(a,t){e({method:"GET",url:a}).success(function(e){s.tooltips[t]=r(e)})}var s=this;s.parameters={terms:"",maxTerms:10,maxRelatedTerms:10,startKey:"",endKey:"",minDist:.7,wordBoost:1,forwards:"Forward",boostMethod:"Sum similarity",algorithm:"Adaptive",aggWeighFunction:"Gaussian",aggWFParam:1,aggYearsInInterval:5,aggWordsPerYear:5,doCleaning:"No"},s.availableYears={from:0,to:1,values:{},options:{floor:0,ceil:1,step:1,onChange:o}},s.features={canClean:!1},s.tooltips={},n("/help/algorithm.md","algorithm");var i={getParameters:a,setParameters:t,tooltips:s.tooltips,availableYears:s.availableYears,features:s.features};return i}angular.module("shico").service("TrackerParametersService",e),e.$inject=["$http","marked"]}(),function(){"use strict";function e(){var e={scope:{},templateUrl:"app/components/shico/trackerParameters.template.html",controllerAs:"vm",controller:"TrackerParametersController"};return e}angular.module("shico").directive("trackerParameters",e)}(),function(){"use strict";function e(e){var r=this;r.algorithms=["Adaptive","Non-adaptive"],r.weighFuncs=["Gaussian","Linear","JSD"],r.directions=["Forward","Backward"],r.boostMethods=["Sum similarity","Counts"],r.doCleaning=["Yes","No"],r.years=e.availableYears,r.features=e.features,r.parameters=e.getParameters(),r.tooltips=e.tooltips}angular.module("shico").controller("TrackerParametersController",e),e.$inject=["TrackerParametersService"]}(),function(){"use strict";function e(){var e={scope:{},templateUrl:"app/components/shico/trackerGraphs.template.html",controllerAs:"vm",controller:"TrackerGraphsController"};return e}angular.module("shico").directive("trackerGraphs",e)}(),function(){"use strict";function e(e){function r(e){return o.forceGraph.currYearIdx-1<=e&&e<=o.forceGraph.currYearIdx+1}function a(e){e.svg.attr("style","border-style: solid")}function t(){var r=e.getRawData().stream,a=new Set,t=[];angular.forEach(r,function(e,r){t.push(r),angular.forEach(e,function(e,r){a.add(r)})});var o=[""].concat(t),n=[o];return angular.forEach(a,function(e){var a=[e];angular.forEach(t,function(t){var o=e in r[t]?r[t][e]:0;a.push(o)}),n.push(a)}),n}var o=this;o.streamGraph=e.streamGraph,o.forceGraph=e.forceGraph,o.slider_options=e.slider_options,o.getYearLabel=e.getYearLabel,o.yearsInSight=r,o.addBorder=a,o.downloadData=t}angular.module("shico").controller("TrackerGraphsController",e),e.$inject=["GraphControlService"]}(),function(){"use strict"}(),function(){"use strict";function e(){var e={scope:{},templateUrl:"app/components/shico/parameterIO.template.html",controllerAs:"vm",controller:"ParameterIOController"};return e}angular.module("shico").directive("parameterIo",e)}(),function(){"use strict";function e(e){function r(){o.hide=!1,o.readOnly=!0,o.text=JSON.stringify(e.getParameters()),o.btnText="Ok"}function a(){o.hide=!1,o.readOnly=!1,o.text="",o.btnText="Load"}function t(){if(o.hide=!0,!o.readOnly){var r=JSON.parse(o.text);e.setParameters(r)}}var o=this;o.getParameters=r,o.setParameters=a,o.closeParamIO=t,o.text="",o.readOnly=!1,o.hide=!0}angular.module("shico").controller("ParameterIOController",e),e.$inject=["TrackerParametersService"]}(),function(){"use strict";function e(e){function r(e){return s.yearLabels[e]}function a(r){s.rawData=r;var a=[],t=new Set;angular.forEach(r.stream,function(e,r){a.push(r),angular.forEach(e,function(e,r){t.add(r)})});var i={};angular.forEach(a,function(e,r){i[e]=r}),e.setVocabulary(t),e.setStreamYears(a),s.yearLabels=a;var l=o(r.stream,i,t,a),c=n(r.networks,i);s.streamGraph.data=l,s.forceGraph.data=c,s.slider_options.ceil=s.yearLabels.length-1}function t(){return s.rawData}function o(e,r,a,t){var o=[];return angular.forEach(a,function(a){var o=[];angular.forEach(t,function(t){var o=a in e[t]?e[t][a]:0;this.push([r[t],o])},o),this.push({key:a,values:o})},o),o}function n(e,r){var a={};return angular.forEach(e,function(e,t){a[r[t]]=e}),a}var s=this;s.streamGraph={options:e.getConfig("streamGraph"),data:[]},s.forceGraph={options:e.getConfig("forceGraph"),data:[],currYearIdx:0},s.yearLabels=[],s.slider_options={floor:0,ceil:0,showTicksValues:!1,translate:r};var i={update:a,getRawData:t,getYearLabel:r,streamGraph:s.streamGraph,forceGraph:s.forceGraph,slider_options:s.slider_options};return i}angular.module("shico").service("GraphControlService",e),e.$inject=["GraphConfigService"]}(),function(){"use strict";function e(){function e(e){var r=0;angular.forEach(e,function(e){k[e]=r,r+=1})}function r(e){var r=e.key||e.name,a=k[r];return a?b(a):"#223344"}function a(e){return e[0]}function t(e){return e[1]}function o(e){return parseFloat(e).toFixed(1)}function n(e){return e in y?y[e]:e}function s(e){y=e}function i(e){l(e),c(e),angular.forEach(x,function(r){r(e)})}function l(e){e.append("text").attr("dx",12).attr("dy",".35em").text(function(e){return e.name}).style("font-weight",function(e){return"seed"==e.type?"bold":""})}function c(e){e.select("circle").attr("r",function(e){return 5+2*e.count})}function m(e){return"seed"==e.type?"triangle-up":"word"==e.type?"circle":"diamond"}function u(e){return 50*Math.log2(2+e.count)}function d(e){var r=["type","count","weight"],a="";return a+='",a+="",angular.forEach(r,function(r){a+="",a+='",a+='",a+=""}),a+="",a+="
'+e.name+"
'+r+"'+e[r]+"
"}function p(e){x.push(e)}function v(e){return"streamGraph"===e?f:"forceGraph"===e?h:void 0}var f={chart:{type:"stackedAreaChart",height:500,margin:{top:20,right:20,bottom:60,left:55},x:a,y:t,xAxis:{tickFormat:n},yAxis:{tickFormat:o},color:r}},g=d3.svg.symbol().type(m).size(u),h={chart:{type:"forceDirectedGraph",height:300,width:300,color:r,symbol:g,nodeExtras:i,curveLinks:!0,useArrows:!0,tooltip:{contentGenerator:d}}},b=d3.scale.category20(),y={},x=[],k={},w={getConfig:v,setStreamYears:s,addForceGraphHook:p,setVocabulary:e};return w}angular.module("shico").service("GraphConfigService",e)}(),function(){"use strict";function e(e,r,a){function t(){var t=r.getParameters(),n=e.trackConcept(t);o.trackerPromise=n,n.then(a.update)}var o=this;o.doPost=t}angular.module("shico").controller("FormController",e),e.$inject=["ConceptService","TrackerParametersService","GraphControlService"]}(),function(){"use strict";function e(e,r){function a(){var a=e("config.json");a.get().$promise.then(function(a){var o=a.baseURL,n=o+"/track/:terms",s=o+"/load-settings";0==o.length&&(n="dummy2.json",s="http://localhost:5000/load-settings"),t.trackerURL=n;var i=e(s);i.get().$promise.then(function(e){r.availableYears.from=e.years.first,r.availableYears.to=e.years.last,r.availableYears.values=e.years.values,r.availableYears.options.floor=e.years.first,r.availableYears.options.ceil=e.years.last,r.features.canClean=e.cleaning})})}var t={doLoad:a};return t}angular.module("shico").service("SettingsService",e),e.$inject=["$resource","TrackerParametersService"]}(),function(){"use strict";function e(e,r,a){function t(r){var t=e(a.trackerURL),n=t.get(r),s=n.$promise.then(o);return s}function o(e){return angular.forEach(e.networks,function(e,r){angular.forEach(e.nodes,function(e){e.year=r})}),e.toJSON()}var n={trackConcept:t};return n}angular.module("shico").service("ConceptService",e),e.$inject=["$resource","$log","SettingsService"]}(),function(){"use strict";function e(e,r){e.debug("runBlock end"),r.doLoad()}angular.module("shico").run(e),e.$inject=["$log","SettingsService"]}(),function(){"use strict";angular.module("shico")}(),function(){"use strict";function e(e,r){e.debugEnabled(!0),r.allowHtml=!0,r.timeOut=3e3,r.positionClass="toast-top-right",r.preventDuplicates=!0,r.progressBar=!0}angular.module("shico").config(e),e.$inject=["$logProvider","toastrConfig"]}(),angular.module("shico").run(["$templateCache",function(e){e.put("app/components/shico/parameterIO.template.html",'

'),e.put("app/components/shico/trackerGraphs.template.html",'
{{ vm.getYearLabel(yearIdx) }}
'),e.put("app/components/shico/trackerParameters.template.html",'

Concept search

Year period:
')}]); //# sourceMappingURL=../maps/scripts/app.js.map