add rename keword dialog; minor cosmetic updates
This commit is contained in:
parent
1bb74f4f63
commit
b57676650c
2 changed files with 191 additions and 6 deletions
|
@ -29,9 +29,9 @@ pandora.localInit = function() {
|
||||||
},
|
},
|
||||||
$item = Ox.MenuButton({
|
$item = Ox.MenuButton({
|
||||||
items: [
|
items: [
|
||||||
{'id': 'rename', title: 'Rename Keyword'},
|
{id: 'rename', title: 'Rename Keyword...'},
|
||||||
{'id': 'ontology_graph', title: 'Ontology Graph'},
|
{id: 'manage', title: 'Manage Keywords...'},
|
||||||
{'id': 'ontology', title: 'Ontology Overview'},
|
{id: 'ontology', title: 'Open Ontology Graph'},
|
||||||
],
|
],
|
||||||
style: 'rounded',
|
style: 'rounded',
|
||||||
title: 'set',
|
title: 'set',
|
||||||
|
@ -41,10 +41,10 @@ pandora.localInit = function() {
|
||||||
click: function(data) {
|
click: function(data) {
|
||||||
if (data.id == 'rename') {
|
if (data.id == 'rename') {
|
||||||
pandora.ui.renameKeywordDialog().open()
|
pandora.ui.renameKeywordDialog().open()
|
||||||
} else if (data.id == 'ontology_graph') {
|
} else if (data.id == 'manage') {
|
||||||
pandora.openLink('/static/ontology/');
|
pandora.ui.manageKeywordsDialog().open()
|
||||||
} else if (data.id == 'ontology') {
|
} else if (data.id == 'ontology') {
|
||||||
pandora.openLink('/static/ontology/ontology.html');
|
pandora.openLink('/static/ontology/');
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
|
|
185
static/js/manageKeywordsDialog.cms.js
Normal file
185
static/js/manageKeywordsDialog.cms.js
Normal file
|
@ -0,0 +1,185 @@
|
||||||
|
pandora.ui.manageKeywordsDialog = function() {
|
||||||
|
|
||||||
|
function getOntology(callback) {
|
||||||
|
function parseNodes(parents, nodes) {
|
||||||
|
parsed = []
|
||||||
|
Object.keys(nodes).forEach(function(name) {
|
||||||
|
let fullName = parents ? parents + ': ' + name : name
|
||||||
|
let children = parseNodes(fullName, nodes[name])
|
||||||
|
if (children.length == 0) {
|
||||||
|
strings.push(fullName)
|
||||||
|
}
|
||||||
|
parsed.push({
|
||||||
|
'name': fullName,
|
||||||
|
'children': children
|
||||||
|
})
|
||||||
|
})
|
||||||
|
return parsed
|
||||||
|
}
|
||||||
|
let strings = []
|
||||||
|
let paths = {}
|
||||||
|
Ox.get('/static/ontology/ontology.json', function(data) {
|
||||||
|
let ontology = JSON.parse(data)
|
||||||
|
parseNodes('', ontology)
|
||||||
|
strings.forEach(function(string) {
|
||||||
|
let parts = string.split(': ')
|
||||||
|
if (parts.length >= 2) {
|
||||||
|
parts.pop()
|
||||||
|
paths[parts.pop()] = parts.join(': ')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
callback(paths)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function getKeywords(callback) {
|
||||||
|
let keywords = {}
|
||||||
|
pandora.api.find({
|
||||||
|
query: {conditions: [
|
||||||
|
{key: 'id', operator: '!=', value: 'BA'} // "Blue"
|
||||||
|
], operator: ''}
|
||||||
|
}, function(result) {
|
||||||
|
let length = result.data.items
|
||||||
|
let count = 0
|
||||||
|
pandora.api.find({
|
||||||
|
keys: ['id'],
|
||||||
|
query: {conditions: [], operator: ''},
|
||||||
|
range: [0, 1000000],
|
||||||
|
sort: [{key: 'id', operator: '+'}]
|
||||||
|
}, function(result) {
|
||||||
|
result.data.items.forEach(function(item) {
|
||||||
|
pandora.api.get({
|
||||||
|
id: item.id,
|
||||||
|
keys: ['layers']
|
||||||
|
}, function(result) {
|
||||||
|
result.data.layers.keywords.forEach(function(keyword) {
|
||||||
|
let value = keyword.value
|
||||||
|
if (!keywords[value]) {
|
||||||
|
keywords[value] = {
|
||||||
|
created: keyword.created,
|
||||||
|
count: 1
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (keyword.created < keywords[value].created) {
|
||||||
|
keywords[value].created = keyword.created
|
||||||
|
}
|
||||||
|
keywords[value].count += 1
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if (++count == length) {
|
||||||
|
let items = Object.keys(keywords).map(function(value) {
|
||||||
|
return Object.assign(keywords[value], {
|
||||||
|
keyword: value
|
||||||
|
})
|
||||||
|
})
|
||||||
|
callback(items)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
let $loadingScreen = Ox.LoadingScreen()
|
||||||
|
let $dialog = Ox.Dialog({
|
||||||
|
buttons: [
|
||||||
|
Ox.Button({
|
||||||
|
title: Ox._('Close'),
|
||||||
|
width: 64
|
||||||
|
}).bindEvent({
|
||||||
|
click: function() {
|
||||||
|
$dialog.close()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
],
|
||||||
|
closeButton: true,
|
||||||
|
content: $loadingScreen,
|
||||||
|
height: window.innerHeight * 0.9 - 48,
|
||||||
|
title: Ox._('Keywords'),
|
||||||
|
width: 968
|
||||||
|
}).bindEvent({
|
||||||
|
open: function() {
|
||||||
|
$loadingScreen.start()
|
||||||
|
getOntology(function(paths) {
|
||||||
|
getKeywords(function(keywords) {
|
||||||
|
keywords.forEach(function(keyword) {
|
||||||
|
let parent_ = ''
|
||||||
|
if (keyword.keyword.includes(': ')) {
|
||||||
|
parent_ = keyword.keyword.split(': ')[0]
|
||||||
|
}
|
||||||
|
keyword.ontology = (paths[parent_] ? paths[parent_] : 'unknown')
|
||||||
|
+ ': ' + keyword.keyword
|
||||||
|
})
|
||||||
|
let $list = Ox.TableList({
|
||||||
|
columns: [
|
||||||
|
{
|
||||||
|
format: function(value) {
|
||||||
|
return '<a href="/clip/modified/keywords=='
|
||||||
|
+ value.replace(/ /g, '_')
|
||||||
|
+ '" target="_blank">' + value + '</a>'
|
||||||
|
},
|
||||||
|
id: 'keyword',
|
||||||
|
operator: '+',
|
||||||
|
title: Ox._('Keyword'),
|
||||||
|
visible: true,
|
||||||
|
width: 256
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'ontology',
|
||||||
|
operator: '+',
|
||||||
|
title: Ox._('Ontology'),
|
||||||
|
visible: true,
|
||||||
|
width: 512
|
||||||
|
},
|
||||||
|
{
|
||||||
|
format: function(value) {
|
||||||
|
return value.replace('T', ' ').replace('Z', '')
|
||||||
|
},
|
||||||
|
id: 'created',
|
||||||
|
operator: '-',
|
||||||
|
title: Ox._('Created'),
|
||||||
|
visible: true,
|
||||||
|
width: 144
|
||||||
|
},
|
||||||
|
{
|
||||||
|
align: 'right',
|
||||||
|
format: Ox.formatNumber,
|
||||||
|
id: 'count',
|
||||||
|
operator: '-',
|
||||||
|
title: Ox._('Count'),
|
||||||
|
visible: true,
|
||||||
|
width: 48
|
||||||
|
}
|
||||||
|
],
|
||||||
|
columnsMovable: true,
|
||||||
|
columnsResizable: true,
|
||||||
|
columnsVisible: true,
|
||||||
|
items: keywords,
|
||||||
|
scrollbarVisible: true,
|
||||||
|
sort: [{key: 'created', operator: '-'}]
|
||||||
|
}).bindEvent({
|
||||||
|
init: function(data) {
|
||||||
|
$status.html(Ox.formatNumber(data.items) + ' ' + Ox._('keywords'))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
$loadingScreen.stop()
|
||||||
|
$dialog.options({
|
||||||
|
content: $list
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
let $status = Ox.Element().css({
|
||||||
|
fontSize: '9px',
|
||||||
|
height: '10px',
|
||||||
|
marginLeft: '96px',
|
||||||
|
position: 'absolute',
|
||||||
|
textAlign: 'center',
|
||||||
|
top: '6px',
|
||||||
|
width: '776px'
|
||||||
|
}).appendTo($dialog.find('.OxButtonsbar'))
|
||||||
|
|
||||||
|
return $dialog
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in a new issue