Commit a9183bfe authored by delanoe's avatar delanoe

Merge branch 'testing' into stable

parents 9137a6c0 e94f5c2f
......@@ -360,7 +360,7 @@ DEFAULT_N_DOCS_HAVING_NGRAM = 5
# Graph constraints to compute the graph:
# Modes: live graph generation, graph asynchronously computed or errors detected
# here are the maximum size of corpus and maplist required to compute the graph
graph_constraints = {'corpusMax' : 1001
graph_constraints = {'corpusMax' : 599
,'corpusMin' : 40
,'mapList' : 50
}
......@@ -438,7 +438,8 @@ class CorpusFacet(APIView):
# check that the hyperfield parameter makes sense
_facet_available_subfields = [
'journal', 'publication_year', 'rubrique',
'language_iso2', 'language_iso3', 'language_name'
'language_iso2', 'language_iso3', 'language_name',
'authors'
]
parameters = get_parameters(request)
......
......@@ -70,6 +70,34 @@ def docs_by_journals(request, project_id, corpus_id):
},
)
@requires_auth
def docs_by_authors(request, project_id, corpus_id):
'''
Browse authors for a given corpus
NB: javascript in page will GET counts from our api: facets?subfield=author
# TODO refactor Author && Journals_dyna_charts_and_table.js
'''
# we pass our corpus to mark it's a corpora page
corpus = cache.Node[corpus_id]
# and the project just for project.id in corpusBannerTop
project = cache.Node[project_id]
# rendered page : journals.html
return render(
template_name = 'pages/corpora/authors.html',
request = request,
context = {
'debug': settings.DEBUG,
'date': datetime.now(),
'project': project,
'corpus' : corpus,
'resourcename' : get_resource_by_name(corpus.resources()[0]),
'view': 'authors'
},
)
@requires_auth
def analytics(request, project_id, corpus_id):
authorized, user, project, corpus = _get_user_project_corpus(request, project_id, corpus_id)
......
......@@ -22,7 +22,6 @@ def home(request):
},
)
def about(request):
'''About Gargantext, its team and sponsors
'''
......@@ -39,6 +38,14 @@ def about(request):
},
)
def robots(request):
'''Robots rules
'''
return render(
template_name = 'pages/main/robots.txt',
request = request,
content_type='text/plain',
)
def maintenance(request):
'''Gargantext out of service
......
......@@ -104,16 +104,9 @@ def project(request, project_id):
# parse_extract: fileparsing -> ngram extraction -> lists
scheduled(parse_extract_indexhyperdata)(corpus.id)
return render(
template_name = 'pages/projects/wait.html',
request = request,
context = {
'user' : request.user,
'project': project,
},
)
wait = True
else:
wait = False
# corpora within this project
corpora = project.children('CORPUS', order=True).all()
......@@ -161,6 +154,25 @@ def project(request, project_id):
}
for sourcename, count in sourcename2documentscount.items()
]
if wait:
return render(
template_name = 'pages/projects/wait.html',
request = request,
context = {
'form': NewCorpusForm,
'user': request.user,
'date': datetime.now(),
'project': project,
'donut': donut,
'list_corpora': dict(sourcename2corpora),
'whitelists': [],
'blacklists': [],
'cooclists': [],
'number': len(corpora),
'query_size': QUERY_SIZE_N_DEFAULT,
},
)
# response!
return render(
template_name = 'pages/projects/project.html',
......
......@@ -10,6 +10,7 @@ urlpatterns = [
# presentation pages
url(r'^$', main.home),
url(r'^about/?$', main.about),
url(r'^robots.txt$', main.robots),
# maintenance mode
url(r'^maintenance/?$', main.maintenance),
# authentication
......@@ -25,6 +26,9 @@ urlpatterns = [
# corpus by journals
url(r'^projects/(\d+)/corpora/(\d+)/journals/?$', corpora.docs_by_journals),
# corpus by journals
url(r'^projects/(\d+)/corpora/(\d+)/authors/?$', corpora.docs_by_authors),
# terms table for the corpus
url(r'^projects/(\d+)/corpora/(\d+)/terms/?$', terms.ngramtable),
......
......@@ -151,7 +151,7 @@ def get_graph( request=None , corpus=None
, start=start , end =end
, mapList_id=mapList_id , groupList_id=groupList_id
, isMonopartite=True , threshold = threshold
, save_on_db = False
, save_on_db = True
#, limit=size
)
else:
......
function pr(msg) {
console.log(msg)
}
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) == (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
var latest,oldest;
var TheBuffer = false
var PossibleActions = []
var action1 = {
"id":"to_delete",
"name": "Delete",
"color":"red"
}
var action2 = {
"id":"to_keep",
"name": "Keep",
"color":"green"
}
var action3 = {
"id":"to_group",
"name": "Group",
"color":"blue"
}
PossibleActions.push(action1)
PossibleActions.push(action2)
PossibleActions.push(action3)
var FlagsBuffer = {}
for(var i in PossibleActions) {
FlagsBuffer[PossibleActions[i].id] = {}
}
var MyTable;
var RecDict={};
var AjaxRecords = []
// D3.js: Interactive timerange variables.
var LineChart = dc.lineChart("#monthly-move-chart");
var volumeChart = dc.barChart("#monthly-volume-chart");
function Push2Buffer( NewVal ) {
if ( TheBuffer == false) {
if( ! NewVal ) {
var limits = [ oldest , latest ];
NewVal = limits;
}
console.log( " - - - - - - " )
console.log( "\tchanging to:" )
console.log( NewVal )
TheBuffer = NewVal;
Final_UpdateTable( "changerange" )
console.log( "- - - - - - -\n" )
return 1;
}
if ( TheBuffer != false ) {
var past = TheBuffer[0]+"_"+TheBuffer[1]
if( ! NewVal ) {
var limits = [ oldest , latest ];
NewVal = limits;
}
var now = NewVal[0]+"_"+NewVal[1]
if ( past != now ) {
console.log( " - - - - - - " )
console.log( "\tchanging to:" )
console.log( NewVal )
TheBuffer = NewVal;
Final_UpdateTable( "changerange" )
console.log( "- - - - - - -\n" )
}
return 1;
}
}
function Final_UpdateTable( action ) {
var UpdateTable = false
if (action=="changerange") {
UpdateTable = true;
}
pr("update table??: "+UpdateTable)
if ( ! UpdateTable ) return false; //stop whatever you wanted to do.
var TimeRange = AjaxRecords;
var dataini = (TheBuffer[0])?TheBuffer[0]:oldest;
var datafin = (TheBuffer[1])?TheBuffer[1]:latest;
pr("show me the pubs of the selected period")
pr("\tfrom ["+dataini+"] to ["+datafin+"]")
pr("\tfrom ["+oldest+"] to ["+latest+"]")
TimeRange = []
for (var i in AjaxRecords) {
if(AjaxRecords[i].score>=dataini && AjaxRecords[i].score<=datafin){
// pr( AjaxRecords[i].date+" : "+AjaxRecords[i].id )
TimeRange.push(AjaxRecords[i])
}
}
MyTable = $('#my-ajax-table').dynatable({
dataset: {
records: TimeRange
},
features: {
pushState: false,
// sort: false
},
writers: {
_rowWriter: ulWriter
// _cellWriter: customCellWriter
}
});
MyTable.data('dynatable').settings.dataset.originalRecords = []
MyTable.data('dynatable').settings.dataset.originalRecords = TimeRange;
MyTable.data('dynatable').paginationPage.set(1);
MyTable.data('dynatable').process();
}
// STEP 01:
// Get all the duplicates using the Django-Garg API
var current_docs = {}
var BIS_dict = {}
var url_elems = window.location.href.split("/")
var url_mainIDs = {}
for(var i=0; i<url_elems.length; i++) {
// if the this element is a number:
if(url_elems[i]!="" && !isNaN(Number(url_elems[i]))) {
url_mainIDs[url_elems[i-1]] = Number(url_elems[i]);
}
}
var theurl = "/api/nodes/"+url_mainIDs["corpus"]+"/children/duplicates?keys=title&limit=9999"
// $.ajax({
// url: theurl,
// success: function(data) {
// bisarray = data.data
// for(var i in bisarray) {
// untitlebis = bisarray[i].values
// BIS_dict[untitlebis[0]] = [bisarray[i].count , 0];// [ total amount , removed ]
// }
// pr(BIS_dict)
// if(Object.keys(BIS_dict).length>0) $("#delAll").css("visibility", "visible"); $("#delAll").show();
// }
// });
function getRecord(rec_id) {
return MyTable.data('dynatable').settings.dataset.originalRecords[rec_id];
// return AjaxRecords[rec_id]
}
function getRecords() {
return MyTable.data('dynatable').settings.dataset.originalRecords;
}
function transformContent2(rec_id) {
// pr("\t\ttransformContent2: "+rec_id)
var elem = AjaxRecords[rec_id];
var result = {}
// console.log("\t\t\telement flag : "+elem["flag"])
if (elem["flag"]) {
result["id"] = elem["id"]
result["score"] = '<div class="'+elem["flag"]+'"><i>'+elem["score"]+'</div>'
result["name"] = '<div class="'+elem["flag"]+'"><i>'+elem["name"]+'</div>'
result["flag"] = '<input id='+rec_id+' onclick="overRide(this)" type="checkbox" checked/>'
} else {
result["id"] = elem["id"]
result["score"] = elem["score"]
result["name"] = elem["name"]
result["flag"] = '<input id='+rec_id+' onclick="overRide(this)" type="checkbox"/>'
}
return result;
}
function overRide(elem) {
var id = elem.id
var current_flag = $("input[type='radio'][name='radios']:checked").val()
var this_newflag = (current_flag==AjaxRecords[id]["flag"])?false:current_flag
console.log("striking: "+id+" | this-elem_flag: "+AjaxRecords[id]["flag"]+" | current_flag: "+current_flag)
console.log("\t so the new flag is: "+this_newflag)
AjaxRecords[id]["flag"] = Mark_NGram ( id , AjaxRecords[id]["flag"] , this_newflag );
MyTable.data('dynatable').dom.update();
}
function transformContent(rec_id , header , content) {
if(header=="flag") {
// pr("\t\ttransformContent1: "+rec_id)
if(content==true) return '<input id='+rec_id+' onclick="overRide(this)" type="checkbox" checked/>'
if(content==false) return '<input id='+rec_id+' onclick="overRide(this)" type="checkbox"/>'
} else return content;
}
function Mark_NGram( ngram_id , old_flag , new_flag ) {
if(new_flag){
for(var f in FlagsBuffer) {
if( new_flag==f )
FlagsBuffer[f][ngram_id] = true;
else
delete FlagsBuffer[f][ngram_id];
}
} else {
delete FlagsBuffer[ old_flag ][ngram_id];
}
return new_flag;
}
//generic enough
function ulWriter(rowIndex, record, columns, cellWriter) {
// pr("\tulWriter: "+record.id)
var tr = '';
var cp_rec = {}
if(!MyTable) {
for(var i in record) {
cp_rec[i] = transformContent(RecDict[record.id], i , record[i])
}
} else {
// pr("\t\tbfr transf2: rec_id="+record.id+" | arg="+RecDict[record.id])
cp_rec = transformContent2(RecDict[record.id])
}
// grab the record's attribute for each column
// console.log("\tin ulWriter:")
// console.log(record)
for (var i = 0, len = columns.length; i < len; i++) {
tr += cellWriter(columns[i], cp_rec);
}
var data_id = RecDict[record.id]
return '<tr data-stuff='+data_id+'>' + tr + '</tr>';
}
function Main_test( data , initial) {
var DistributionDict = {}
for(var i in DistributionDict)
delete DistributionDict[i];
delete DistributionDict;
DistributionDict = {}
AjaxRecords = []
var FirstScore = initial;
var arrayd3 = []
// div_table += "\t"+"\t"+"\t"+'<input type="checkbox" id="multiple_selection" onclick="SelectAll(this);" /> Select'+"\n"
$("#div-table").html("")
$("#div-table").empty();
var div_table = '<p align="right">'+"\n"
div_table += '<table id="my-ajax-table" class="table table-bordered table-hover">'+"\n"
div_table += "\t"+'<thead>'+"\n"
div_table += "\t"+"\t"+'<th data-dynatable-column="name"><span class="glyphicon glyphicon-text-size"></span> Title</th>'+"\n"
div_table += "\t"+"\t"+'<th data-dynatable-column="score" data-dynatable-sorts="score">No. Pubs</th>'+"\n"
// div_table += "\t"+"\t"+'<th id="score_column_id" data-dynatable-sorts="score" data-dynatable-column="score">Score</th>'+"\n"
div_table += "\t"+"\t"+'</th>'+"\n"
div_table += "\t"+'</thead>'+"\n"
div_table += "\t"+'<tbody>'+"\n"
div_table += "\t"+'</tbody>'+"\n"
div_table += '</table>'+"\n"
div_table += '</p>';
$("#div-table").html(div_table)
// $("#stats").html(div_stats)
var ID = 0
console.log("Filling 'AjaxRecords' from argument 'data'")
for(var i in data) {
console.log(" >>" + i)
// var le_ngram = data.ngrams[i]
var orig_id = ID
var arr_id = parseInt(ID)
RecDict[orig_id] = arr_id;
var url_title = encodeURIComponent(i)//.replace(" ","+")
// url_title = i.replace(" ","+")
var node_info = {
"id" : ID,
"name" : '<a target=_blank href="http://search.iscpif.fr/?categories=general&q='+url_title+'">'+i+'</a>',
"score": data[i],
}
AjaxRecords.push(node_info)
if ( ! DistributionDict[node_info.score] ) DistributionDict[node_info.score] = 0;
DistributionDict[node_info.score]++;
ID++;
}
// console.log("The Distribution!:")
// console.log(Distribution)
var DistributionList = []
var min_occ=99999,max_occ=-1,min_frec=99999,max_frec=-1;
for(var i in DistributionDict) {
var info = {
"x_occ":Number(i),
"y_frec":DistributionDict[i]
}
DistributionList.push(info)
if(info.x_occ > max_occ) max_occ = info.x_occ
if(info.x_occ < min_occ) min_occ = info.x_occ
if(info.y_frec > max_frec) max_frec = info.y_frec
if(info.y_frec < min_frec) min_frec = info.y_frec
}
oldest = Number(min_occ);
latest = Number(max_occ);
var ndx = false;
ndx = crossfilter();
ndx.add(DistributionList);
// x_occs = ndx.dimension(dc.pluck('x_occ'));
var x_occs = ndx.dimension(function (d) {
return d.x_occ;
});
var y_frecs = x_occs.group().reduceSum(function (d) {
return d.y_frec;
});
console.log("scores: [ "+min_occ+" , "+max_occ+" ] ")
console.log("frecs: [ "+min_frec+" , "+max_frec+" ] ")
LineChart
.width(800)
.height(150)
.margins({top: 10, right: 50, bottom: 25, left: 40})
.group(y_frecs)
.dimension(x_occs)
.transitionDuration(500)
.x(d3.scale.linear().domain([min_occ,max_occ+min_occ]))
// .y(d3.scale.log().domain([min_frec/2,max_frec*2]))
.renderArea(true)
// .valueAccessor(function (d) {
// return d.value;
// })
// .stack(y_frecs, function (d) {
// return d.value;
// })
// .ordinalColors(d3.scale.category10())
.elasticY(true)
// .round(dc.round.floor)
.renderHorizontalGridLines(true)
.renderVerticalGridLines(true)
// .colors('red')
// .interpolate("monotone")
// .renderDataPoints({radius: 2, fillOpacity: 0.8, strokeOpacity: 0.8})
.brushOn(false)
.title(function (d) {
var value = d.data.value.avg ? d.data.value.avg : d.data.value;
if (isNaN(value)) value = 0;
return value+" authors with "+Number(d.key)+" publications";
})
.xAxis();
LineChart.yAxis().ticks(5)
LineChart.render()
volumeChart.width(800)
.height(100)
.margins({top: 30, right: 50, bottom: 20, left: 40})
.dimension(x_occs)
.group(y_frecs)
.centerBar(true)
.gap(5)
.x(d3.scale.linear().domain([min_occ/2,max_occ+min_occ]))
.y(d3.scale.sqrt().domain([min_frec/2,max_frec+min_frec]))
// .elasticY(true)
// // .round(d3.time.month.round)
// // .xUnits(d3.time.months)
.renderlet(function (chart) {
chart.select("g.y").style("display", "none");
LineChart.filter(chart.filter());
console.log("lalaal moveChart.focus(chartfilt);")
})
.on("filtered", function (chart) {
dc.events.trigger(function () {
var chartfilt = chart.filter()
// tricky part: identifying when the moveChart changes.
if(chartfilt) {
Push2Buffer ( chart.filter() )
} else {
if(TheBuffer) {
Push2Buffer ( false )
}
}
LineChart.focus(chartfilt);
});
})
.xAxis()
volumeChart.yAxis().ticks(5)
volumeChart.render()
LineChart.filterAll();
volumeChart.filterAll();
dc.redrawAll();
MyTable = []
MyTable = $('#my-ajax-table').dynatable({
dataset: {
records: AjaxRecords
},
features: {
pushState: false,
// sort: false //i need to fix the sorting function... the current one just sucks
},
writers: {
_rowWriter: ulWriter
// _cellWriter: customCellWriter
}
});
console.log("After table 1")
// MyTable.data('dynatable').settings.dataset.records = []
// MyTable.data('dynatable').settings.dataset.originalRecords = []
// MyTable.data('dynatable').settings.dataset.originalRecords = AjaxRecords;
MyTable.data('dynatable').sorts.clear();
MyTable.data('dynatable').sorts.add('score', 0) // 1=ASCENDING,
MyTable.data('dynatable').process();
MyTable.data('dynatable').paginationPage.set(1);
// MyTable.data('dynatable').process();
// MyTable.data('dynatable').sorts.clear();
MyTable.data('dynatable').process();
console.log("After table 2")
// // // $("#score_column_id").children()[0].text = FirstScore
// // // // MyTable.data('dynatable').process();
if ( $(".imadiv").length>0 ) return 1;
$('<br><br><div class="imadiv"></div>').insertAfter(".dynatable-per-page")
$(".dynatable-record-count").insertAfter(".imadiv")
$(".dynatable-pagination-links").insertAfter(".imadiv")
console.log("After table 3")
return "OK"
}
console.log(window.location.href)
// match corpus_id in the url
var corpus_id ;
rematch = window.location.href.match(/corpora\/(\d+)\/authors\/?$/)
if (rematch) {
corpus_id = rematch[1] ;
$.ajax({
url: window.location.origin
+ "/api/nodes/"
+ corpus_id
+ "/facets?hyperfield=authors",
success: function(data){
console.log(data)
$("#content_loader").remove()
// // Initializing the Charts and Table
var result = Main_test( data.by.authors , "FirstScore" )
console.log( result )
$("#content_loader").remove()
}
});
}
......@@ -320,7 +320,7 @@ function Main_test( data , initial) {
// url_title = i.replace(" ","+")
var node_info = {
"id" : ID,
"name" : '<a target=_blank href="http://google.com/search?q='+url_title+'">'+i+'</a>',
"name" : '<a target=_blank href="http://search.iscpif.fr/?categories=general&q='+url_title+'">'+i+'</a>',
"score": data[i],
}
AjaxRecords.push(node_info)
......
......@@ -174,6 +174,98 @@ var tableSpan ;
var corpusesList = {}
// =============================================================================
// CACHE MANAGEMENT
// =============================================================================
/**
* a local cache to remember active filters and page after reload
* cf. saveParamsToCache()
* restoreSettingsFromCache()
*
* TODO localStorage.clear() after expiry date
*/
window.onbeforeunload = saveParamsToCache;
// always called at page close/quit
// £TODO use url instead of corpusId+'/terms' as prefix
function saveParamsToCache() {
var corpusId = getIDFromURL("corpora")
var search_filter_status = MyTable.data('dynatable').settings.dataset.queries['search']
var state_filter_status = MyTable.data('dynatable').settings.dataset.queries['my_state_filter']
var type_filter_status = MyTable.data('dynatable').settings.dataset.queries['my_termtype_filter']
// var page_status = document.getElementsByClassName("dynatable-page-link dynatable-active-page")[0].getAttribute("data-dynatable-page")
var per_page_status = MyTable.data('dynatable').settings.dataset.perPage
// keys and values are str only so we use path-like keys
if (search_filter_status) {
localStorage[corpusId+'/terms/search'] = search_filter_status
}
else {
localStorage.removeItem(corpusId+'/terms/search')
}
if (state_filter_status) {
localStorage[corpusId+'/terms/state'] = state_filter_status
}
else {
localStorage.removeItem(corpusId+'/terms/state')
}
if (type_filter_status) {
localStorage[corpusId+'/terms/type'] = type_filter_status
}
else {
localStorage.removeItem(corpusId+'/terms/type')
}
// if (page_status) {
// localStorage[corpusId+'/terms/page'] = page_status
// }
// else {
// localStorage.removeItem(corpusId+'/terms/page')
// }
if (per_page_status) {
localStorage[corpusId+'/terms/perPage'] = per_page_status
}
else {
localStorage.removeItem(corpusId+'/terms/perPage')
}
return null;
}
// always called after MyTable init
function restoreSettingsFromCache() {
var corpusId = getIDFromURL("corpora")
// var had_page = localStorage[corpusId+'/terms/page']
var had_type = localStorage[corpusId+'/terms/type']
var had_state = localStorage[corpusId+'/terms/state']
var had_search = localStorage[corpusId+'/terms/search']
var had_perPage = localStorage[corpusId+'/terms/perPage']
// if (had_page) {
// MyTable.data('dynatable').paginationPage.set(had_page);
// }
if (had_type) {
MyTable.data('dynatable').settings.dataset.queries['my_termtype_filter'] = had_type
}
if (had_state) {
MyTable.data('dynatable').settings.dataset.queries['my_state_filter'] = had_state
}
if (had_search) {
MyTable.data('dynatable').settings.dataset.queries['search'] = had_search
}
if (had_perPage) {
MyTable.data('dynatable').paginationPerPage.set(had_perPage)
}
// re-process to makes the changes visible
MyTable.data('dynatable').process()
return null;
}
// =============================================================================
// ELEMENT CONTROLLERS AND ROW PROCESSORS
// =============================================================================
......@@ -1816,6 +1908,10 @@ function GROUPCRUDS( groupnode_id , send_data, http_method , callback) {
* @param ngdata: OriginalNG['records']
* @param initial: initial score type "occs" or "tfidf"
* @param search_filter: value among {0,1,2,'reset'} (see #picklistmenu options)
*
* TODO replace by new @param filters (multiple) for all cached values
* (would allow us to use them directly in settings instead of a posteriori
* with restoreSettingsFromCache)
*/
function MainTableAndCharts( ngdata , initial , search_filter) {
......@@ -2130,8 +2226,7 @@ function MainTableAndCharts( ngdata , initial , search_filter) {
// _cellWriter: customCellWriter
},
inputs: {
queries: $('select#testquery'),
queries: $('select#picklistmenu'),
queries: $('select#picklistmenu, select#picktermtype'),
}
})
......@@ -2186,23 +2281,43 @@ function MainTableAndCharts( ngdata , initial , search_filter) {
// bind a filter named 'my_state_filter' to dynatable.queries.functions
MyTable.data('dynatable').queries
// selects on current state <=> shows only elements of specific list
// nb: possible value are in {0,1,2} (see terms.html > #picklistmenu)
// (see terms.html > #picklistmenu)
.functions['my_state_filter'] = function(record,selectedValue) {
if (selectedValue == 'reset') {
// return (AjaxRecords[record.id].state >= 0)
return true
}
// for states, possible value are in {0,1,2}
else {
// return true or false
return (AjaxRecords[record.id].state == selectedValue)
// return true or false
return (AjaxRecords[record.id].state == selectedValue)
}
}
// second filter named 'my_termtype_filter'
MyTable.data('dynatable').queries
.functions['my_termtype_filter'] = function(record,selectedValue) {
if (selectedValue == 'reset') {
return true
}
else if (selectedValue == 'mono') {
// one-word terms aka monograms aka monolexical terms
return (AjaxRecords[record.id]['name'].indexOf(" ") == -1)
}
else if (selectedValue == 'multi') {
// MWE aka multigrams aka polylexical terms
return (AjaxRecords[record.id]['name'].indexOf(" ") != -1)
}
}
// and set this filter's initial status to 'maplist' (aka state == 1)
// MyTable.data('dynatable').settings.dataset.queries['my_state_filter'] = 1 ;
// and set these filters' initial status
MyTable.data('dynatable').settings.dataset.queries['my_state_filter'] = search_filter ;
MyTable.data('dynatable').settings.dataset.queries['my_termtype_filter'] = 'reset' ;
MyTable.data('dynatable').process();
// £todo factorize with previous with a param search_filters
restoreSettingsFromCache(localStorage)
// moves pagination over table
if ( $(".imadiv").length>0 ) return 1;
$('<br><br><div class="imadiv"></div>').insertAfter(".dynatable-per-page")
......
......@@ -145,7 +145,7 @@
<!-- <script type="text/javascript" src="{% static "lib/d3/d3/d3.v2.min.js" %}"></script> -->
<script type="text/javascript" src="{% static "lib/d3/n3.line-chart.min.js" %}"></script>
<script type="text/javascript" src="{% static "lib/ng-tags//ng-tags-input.min.js" %}"></script>
<script type="text/javascript" src="{% static "lib/ng-tags/ng-tags-input.min.js" %}"></script>
<link rel="stylesheet" href="{% static "lib/ng-tags/ng-tags-input.min.css" %}">
<script type="text/javascript" src="{% static "lib/gargantext/gargantext.angular.js" %}"></script>
......
{% extends "pages/menu.html" %}
{% block css %}
{% load staticfiles %}
<link rel="stylesheet" type="text/css" href="{% static "lib/bootstrap/3.0.2/bootstrap.css" %}">
<link rel="stylesheet" type="text/css" href="{% static "lib/d3/dc.css"%}"/>
<link rel="stylesheet" type="text/css" href="{% static "lib/jquery/dynatable/jquery.dynatable.css"%}"/>
<link rel="stylesheet" type="text/css" href="{% static "lib/gargantext/tables.css"%}"/>
<link rel="stylesheet" type="text/css" href="{% static "lib/gargantext/charts.css"%}"/>
<script type="text/javascript" src="{% static "lib/d3/d3.js"%}"></script>
<script type="text/javascript" src="{% static "lib/d3/crossfilter.js"%}"></script>
<script type="text/javascript" src="{% static "lib/d3/dc.js"%}"></script>
{% endblock %}
{% block content %}
<div class="container">
<div class="col-md-3 col-md-offset-2">
<div id="monthly-move-chart">
<center>
Select a frequency group in the chart with blue bars to zoom in
<p align="center">
<!--<a class="btn btn-xs btn-default" role="button" href="/chart/corpus/{{ corpus.id }}/data.csv">Save</a>-->
<a class="btn btn-xs btn-default" href="javascript:volumeChart.filterAll();dc.redrawAll();">Reset</a></p>
<!-- <p style="font-size:70%">
<b>x</b>: amount of documents for the author
<b>y</b>: number of authors with that amount
</p> -->
<div class="clearfix"></div>
</center>
</div>
<div class="bs-callout">
<div class="row">
<div id="monthly-volume-chart"></div>
</div>
<div id="content_loader">
<br>
<center>
<!-- <img width="10%" src="{% static "img/ajax-loader.gif"%}"></img> -->
</center>
<br>
</div>
</div>
</div>
</div>
<div class="container">
<div class="jumbotron">
<div class="panel panel-default">
<div class="panel-heading">
<h2 class="panel-title">
<center>
<span class="glyphicon glyphicon-hand-down" aria-hidden="true"></span>
Publications by source
</center>
</h2>
</div>
<div class="panel-body">
<div id="div-table">
<!-- (table id="my-ajax-table") dynamically set by Authors_dyna_chart_and_table -->
</div>
</div>
</div> <!-- /div panel -->
</div> <!-- /jumbotron -->
<!--</div> This div is closed in the menu !-->
<script type="text/javascript" src="{% static "lib/jquery/dynatable/jquery.dynatable.js" %}"></script>
<!-- custom-lib for dynatable.js and dc.js -->
<script type="text/javascript" src="{% static "lib/gargantext/Authors_dyna_chart_and_table.js" %}"></script>
{% endblock %}
......@@ -26,29 +26,39 @@
<div class="col-md-5 content">
<li>
Graph created at {{cooc.date}}
{{cooc.date}}
{% for key, value in coocs_count.items %}
{% if key == cooc.id %}
{% if value > 0 %}
with {{ value }} nodes :
<ul>
<!-- <li>{{cooc.id}}</li> --!>
<li>Start period: {% if not cooc.hyperdata.start %} begin of corpus {% else %} {{cooc.hyperdata.start}} {% endif %} </li>
<li>End period: {% if not cooc.hyperdata.end %} end of corpus {% else %} {{cooc.hyperdata.end}} {% endif %} </li>
<li>Distances:
<li>From: {% if not cooc.hyperdata.start %} begin of corpus {% else %} {{cooc.hyperdata.start}} {% endif %}
, To: {% if not cooc.hyperdata.end %} end of corpus {% else %} {{cooc.hyperdata.end}} {% endif %}
</li>
<li> {{ value }} nodes with distances:
<ul>
<li> <span class="glyphicon glyphicon-eye-open" aria-hidden="true"></span>
Conditional with bridgeness
<a href="/projects/{{project.id}}/corpora/{{corpus.id}}/explorer?cooc_id={{cooc.id}}&distance=conditional&bridgeness=5">5</a>
or <a href="/projects/{{project.id}}/corpora/{{corpus.id}}/explorer?cooc_id={{cooc.id}}&distance=conditional&bridgeness=10">10</a>
<li>
<a href="/projects/{{project.id}}/corpora/{{corpus.id}}/explorer?cooc_id={{cooc.id}}&distance=distributional&bridgeness=5">
<span class="glyphicon glyphicon-eye-open" aria-hidden="true"></span>
Conditional
</a>
(with bridgeness
<a href="/projects/{{project.id}}/corpora/{{corpus.id}}/explorer?cooc_id={{cooc.id}}&distance=conditional&bridgeness=10">10</a>
or <a href="/projects/{{project.id}}/corpora/{{corpus.id}}/explorer?cooc_id={{cooc.id}}&distance=conditional&bridgeness=20">20</a>
<li> <span class="glyphicon glyphicon-eye-open" aria-hidden="true"></span>
Distributional with bridgeness
<a href="/projects/{{project.id}}/corpora/{{corpus.id}}/explorer?cooc_id={{cooc.id}}&distance=distributional&bridgeness=5">5</a>
or <a href="/projects/{{project.id}}/corpora/{{corpus.id}}/explorer?cooc_id={{cooc.id}}&distance=distributional&bridgeness=10">10</a>
or <a href="/projects/{{project.id}}/corpora/{{corpus.id}}/explorer?cooc_id={{cooc.id}}&distance=conditional&bridgeness=30">30</a>
)
</li>
<li>
<a href="/projects/{{project.id}}/corpora/{{corpus.id}}/explorer?cooc_id={{cooc.id}}&distance=distributional&bridgeness=5">
<span class="glyphicon glyphicon-eye-open" aria-hidden="true"></span>
Distributional
</a>
(with bridgeness
<a href="/projects/{{project.id}}/corpora/{{corpus.id}}/explorer?cooc_id={{cooc.id}}&distance=distributional&bridgeness=10">10</a>
or <a href="/projects/{{project.id}}/corpora/{{corpus.id}}/explorer?cooc_id={{cooc.id}}&distance=distributional&bridgeness=20">20</a>
or <a href="/projects/{{project.id}}/corpora/{{corpus.id}}/explorer?cooc_id={{cooc.id}}&distance=distributional&bridgeness=30">30</a>
)
</li>
</ul>
</ul>
......
......@@ -137,14 +137,18 @@ em {
</div>
<!-- see in javascript function queries.functions['my_state_filter'] -->
<div class="pull-right" style="margin-top:2.1em;padding-left:1em;">
Filter:
<select id="picklistmenu" name="my_state_filter">
<option value='reset'>All terms</option>
<option value='reset'>All lists</option>
<option value='0'>Candidates only</option>
<!-- <option value='1' selected="selected">Map terms only</option> -->
<option value='1'>Map terms only</option>
<option value='2'>Stopwords only</option>
</select>
<select id="picktermtype" name="my_termtype_filter" style="margin-left:1em;">
<option value='reset'>All types</option>
<option value='mono'>One word terms only</option>
<option value='multi'>Multiword terms only</option>
</select>
</div>
</h4>
</div>
......
User-agent: *
Disallow : /auth/
Disallow : /projects/
......@@ -81,17 +81,30 @@
<li>
<a type="button" class="btn btn-default {% if view == 'titles' %} active {% endif %}"
onclick="javascript:location.href='/projects/{{project.id}}/corpora/{{ corpus.id }}/'"
data-target='#' href='#'>Documents
data-target='#' href='#'>
<span class="glyphicon glyphicon-folder-open" aria-hidden="true"></span>
&nbsp;Documents
</a>
</li>
<li>
<a type="button" class="btn btn-default {% if view == 'journals' %} active {% endif %}"
onclick="javascript:location.href='/projects/{{project.id}}/corpora/{{ corpus.id }}/journals'"
data-target='#' href='#'>Journals
data-target='#' href='#'>
<span class="glyphicon glyphicon-globe" aria-hidden="true"></span>
Journals
</a>
</li>
<!--
<li>
<a type="button" class="btn btn-default {% if view == 'authors' %} active {% endif %}"
onclick="javascript:location.href='/projects/{{project.id}}/corpora/{{ corpus.id }}/authors'"
data-target='#' href='#'>Authors
<span class="glyphicon glyphicon-user" aria-hidden="true"></span>
</a>
</li>
--!>
{% for state in corpus.hyperdata.statuses %}
{% if state.action == "Workflow" %}
......@@ -100,13 +113,16 @@
<li>
<a type="button" class="btn btn-default {% if view == 'terms' %} active {% endif %}"
onclick="javascript:location.href='/projects/{{project.id}}/corpora/{{ corpus.id }}/terms'"
data-target='#' href='#'>Terms
data-target='#' href='#'>
<span class="glyphicon glyphicon-text-width" aria-hidden="true"></span>
Terms
</a>
</li>
<li class="dropdown">
<a href="#graph" role="button" type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" title="That is your username">
<span class="glyphicon glyphicon-map-marker" aria-hidden="true"></span>
Graphs
</a>
<i class="caret"></i>
......@@ -134,7 +150,10 @@
<li>
<a type="button" class="btn btn-default {% if view == 'analytics' %} active {% endif %}"
onclick="javascript:location.href='/projects/{{project.id}}/corpora/{{ corpus.id }}/analytics'"
data-target='#' href='#'>Analytics
data-target='#' href='#'>
<span class="glyphicon glyphicon-signal" aria-hidden="true"></span>
Analytics
</a>
</li>
......@@ -246,7 +265,7 @@
<p>
Gargantext
<span class="glyphicon glyphicon-registration-mark" aria-hidden="true"></span>
, version 3.0.5,
, version 3.0.5.1,
<a href="http://www.cnrs.fr" target="blank" title="Institution that enables this project.">
Copyrights
<span class="glyphicon glyphicon-copyright-mark" aria-hidden="true"></span>
......
......@@ -61,23 +61,7 @@
</p>
</div>
</div>
<!-- Modal -->
<div id="wait" class="modal" style="top:8%;">
<div class="jumbotron">
<div class="container theme-showcase jumbotron" role="main">
<div>
<div class="col-md-3"></div>
<div class="col-md-6">
<h2>Your file has been uploaded ! </h2>
<h2>Gargantext need some time to eat it.</h2>
<h2>Duration depends on the size of the dish.</h2>
<a class="btn btn-primary btn-lg" href="/projects/{{ project.id }}" title="Click and test by yourself">Continue on Gargantext</a>
</div>
<div class="col-md-3"></div>
</div>
</div>
</div>
</div>
</div>
......@@ -295,6 +279,29 @@
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
<!-- Modal -->
<div id="wait" class="modal fade">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
<h2 class="modal-title"><h2><span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span> Uploading corpus...</h2>
</div>
<div class="modal-body">
<p>
Your file has been uploaded !
Gargantext need some time to eat it.
Duration depends on the size of the dish.
</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Continue on Gargantext</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
<script type="text/javascript" src="{% static "lib/jquery/1.11.2/jquery-ui.js" %}"></script>
<script type="text/javascript">
function getCookie(name) {
......@@ -312,7 +319,7 @@
}
return cookieValue;
}
var thequeries = [] ;
// load the template's value for N scan size
......@@ -657,9 +664,14 @@
alert("OK")
setTimeout(
function() {
alert("TimeOut!")
$('#addcorpus').modal('hide')
$("#wait").modal("show")
$("#wait").modal("show");
// setTimeout(
// function(){
// location.reload();
//
// }, 600);
// )
//setTimeout(, 300)
//location.reload();
}, 600);
......@@ -730,6 +742,10 @@
formatter: function (y) { return y + "%" }
});
{% endif %}
$('#wait').on('hidden.bs.modal', function (e) {
// reload page when dismiss the info box
window.location.reload()
})
</script>
......
......@@ -12,7 +12,7 @@
{% block content %}
<!--
<div class="container theme-showcase" role="main">
<div class="jumbotron">
<h2>Your file has been uploaded ! </h2>
......@@ -20,6 +20,210 @@
<h2>Duration depends on the size of the dish.</h2>
<a class="btn btn-primary btn-lg" href="/projects/{{ project.id }}" title="Click and test by yourself">Continue on Gargantext</a>
</div> -->
<div class="container theme-showcase" role="main">
<div class="jumbotron">
<div class="row">
<div class="col-md-6">
{% if project %}
<h1>
<span class="glyphicon glyphicon-book" aria-hidden="true"></span>
{{ project.name | truncatechars:25 }}</h1>
<!--<h3> {{number}} corpora </h3>-->
{% endif %}
</div>
<div class="col-md-4">
<p>
{% if donut %}
<div id="hero-donut" style="height: 200px;"></div>
{% endif %}
<center>
<a data-toggle="modal" href="#addcorpus">
<button
type="button"
class="btn btn-primary btn-lg"
data-container="body"
data-toggle="popover"
data-placement="bottom"
>
<span class="glyphicon glyphicon-plus" aria-hidden="true" ></span>
Add a corpus
</button>
</a>
</center>
</p>
</div>
</div>
</div>
<!-- Add jumbotron container for each type of corpus (presse, science etc.) -->
<div id="semLoader" style="position:absolute; top:50%; left:40%; width:80px; visibility: hidden;">
<img src="{% static "img/loading-bar.gif" %}"></img>
</div>
<div class="container">
{% if list_corpora %}
{% for key, corpora in list_corpora.items %}
<h2>
<div class="row">
<div class="col-md-1 content"></div>
<span class="glyphicon glyphicon-cd" aria-hidden="true"></span>
{{ key }}
</h2>
{% for corpus in corpora %}
<div id="corpus_{{corpus.id}}">
<div class="row">
<h4>
<div class="col-md-1 content"></div>
<div class="col-md-5 content">
<a href="/projects/{{project.id}}/corpora/{{corpus.id}}">
<span class="glyphicon glyphicon-file" aria-hidden="true"></span>
{{corpus.name}}, {{ corpus.count }} documents {{ corpus.status_message }}
</a>
</div>
<div class="col-md-3 content">
<!-- -->
{% for state in corpus.hyperdata.statuses %}
{% ifequal state.action "Workflow" %}
{% if state.complete %}
<a href="/projects/{{project.id}}/corpora/{{corpus.id}}" title="View the corpus">
<button type="button" class="btn btn-default" aria-label="Left Align">
<span class="glyphicon glyphicon-eye-open" aria-hidden="true"></span>
</button>
</a>
<button type="button" class="btn btn-default yopla" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="focus"
data-content="
<ul>
<li
onclick=&quot;
garganrest.metrics.update({{corpus.id}}, function(){alert('The corpus ({{corpus.name|escapejs}}) was updated')});
&quot;>
<a href='#'>Recalculate ngram metrics</a> <br/> (can take a little while)
</li>
</ul>
">
<span class="glyphicon glyphicon-repeat" aria-hidden="true"
title='Recalculate ngram scores and similarities'></span>
</button>
{% endif %}
<!-- TODO: delete non seulement si state.complete mais aussi si state.error -->
<button type="button" class="btn btn-default" data-container="body" data-toggle="popover" data-placement="bottom"
data-content="
<ul>
<li
onclick=&quot;
garganrest.nodes.delete({{corpus.id}}, function(){$('#corpus_'+{{corpus.id}}).remove()});
$(this).parent().parent().remove();
&quot;>
<a href='#'>Delete this</a>
</li>
</ul>
">
<span class="glyphicon glyphicon-trash" aria-hidden="true"
title='Delete this corpus'></span>
</button>
{% endifequal %}
{% endfor %}
</div>
<div class="col-md-3 content">
{% for state in corpus.hyperdata.statuses %}
{% ifequal state.action "Workflow" %}
{% if state.complete %}
<span class="glyphicon glyphicon-ok" aria-hidden="true"></span>
{% else %}
{% if state.error %}
<span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span>
{{ state.error }}
{% else %}
<div class="progress">
<div class=" progress-bar progress-bar-striped
progress-bar-success
"
role="progressbar" aria-valuenow="45" aria-valuemin="0" aria-valuemax="100" style="width: 20%">
<span>
Upload
</span>
</div>
{% for state in corpus.hyperdata.statuses %}
<!-- {% if state.action != "Workflow" %} --!>
<div class=" progress-bar progress-bar-striped
{% if state.complete %}
progress-bar-success
{% else %}
active
{% endif %}
"
role="progressbar" aria-valuenow="45" aria-valuemin="0" aria-valuemax="100" style="width: 20%">
<span>
{{ state.action }}
{% if not state.complete %}
Processing
{% endif %}
</span>
</div>
<!-- {% endif %} --!>
{% endfor %}
</div>
{% endif %}
{% endif %}
{% endifequal %}
{% endfor %}
</div>
<div class="col-md-1 content"></div>
</h4>
</div>
</div>
{% endfor %}
{% endfor %}
{% endif %}
<!-- Modal -->
<div id="wait" class="modal fade">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
<h2 class="modal-title"><h2><span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span> Uploading corpus...</h2>
</div>
<div class="modal-body">
<p>
Your file has been uploaded !
Gargantext need some time to eat it.
Duration depends on the size of the dish.
</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Continue on Gargantext</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
<script type="text/javascript" src="{% static "lib/jquery/1.11.2/jquery-ui.js" %}"></script>
<script type="text/javascript">
$(window).load(function() {
var projectid = window.location.href.split("projects")[1].replace(/\//g, '')//replace all the slashes
$('#wait').modal({ show: false})
$("#wait").modal("show");
$('#wait').on('hidden.bs.modal', function (e) {
// reload page when dismiss the info box
$(location).attr('href', window.location.origin+'/projects/'+projectid)
})
});
</script>
{% endblock %}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment