pandora/static/js/exportAnnotationsDialog.js

158 lines
4.3 KiB
JavaScript
Raw Permalink Normal View History

2014-09-18 10:40:41 +00:00
'use strict';
pandora.ui.exportAnnotationsDialog = function(options) {
var annotations = pandora.$ui.editor.getCurrentAnnotations(),
layers = pandora.site.layers.map(function(layer) {
return {
disabled: annotations[layer.id].length == 0,
id: layer.id,
title: layer.title
}
}),
enabledLayers = layers.filter(function(layer) {
return layer.disabled == false;
}),
layer = (enabledLayers.length ? enabledLayers : layers)[0].id,
$content = Ox.Element().css({margin: '16px'}),
$layerSelect = Ox.Select({
items: layers,
label: Ox._('Layer'),
labelWidth: 128,
value: layer,
width: 384
})
.css({
marginTop: '16px'
})
.bindEvent({
change: function() {
updateStatus();
that.enableButton('export');
2014-11-01 14:45:33 +00:00
!$link ? addLink() : updateLink();
}
})
.appendTo($content),
2014-09-18 17:54:37 +00:00
$formatSelect = Ox.Select({
items: [
{id: 'json', title: 'JSON'},
{id: 'srt', title: 'SRT'}
],
label: Ox._('Format'),
labelWidth: 128,
value: 'json',
width: 384
})
.css({
marginTop: '16px'
})
.bindEvent({
change: function() {
$link && updateLink();
}
})
.appendTo($content),
$status = Ox.$('<div>')
.css({
marginTop: '16px'
})
.appendTo($content),
2014-09-18 15:24:58 +00:00
$link,
that = Ox.Dialog({
buttons: [
Ox.Button({
2014-09-18 15:24:58 +00:00
id: 'dontExport',
title: Ox._('Don\'t Export')
})
.bindEvent({
click: function() {
that.close();
}
}),
Ox.Button({
2014-09-18 15:24:58 +00:00
disabled: enabledLayers.length == 0,
id: 'export',
title: Ox._('Export')
})
],
closeButton: true,
content: $content,
fixedSize: true,
2014-09-18 17:54:37 +00:00
height: 112,
removeOnClose: true,
title: Ox._('Export Annotations'),
width: 416
});
updateStatus();
2014-09-18 17:54:37 +00:00
enabledLayers.length && addLink();
2014-09-18 15:24:58 +00:00
function addLink() {
2014-09-18 17:54:37 +00:00
var $button = $(Ox.last(that.find('.OxButton')))
$button.wrap($('<a>'));
// On wrap, a reference to the link would *not* be the link in the DOM
$link = $($button.parent());
2014-11-01 14:45:33 +00:00
updateLink();
2014-09-18 15:24:58 +00:00
}
2018-08-09 13:42:54 +00:00
function textBlob(data) {
data = Ox.encodeUTF8(data);
var byteNumbers = new Array(data.length);
for (var i = 0; i < data.length; i++) {
byteNumbers[i] = data.charCodeAt(i);
}
var byteArray = new Uint8Array(byteNumbers);
var blob = new Blob([byteArray], {type: 'text/plain; charset=utf-8'});
return blob;
}
2014-09-18 15:24:58 +00:00
function updateLink() {
2014-09-18 17:54:37 +00:00
var layer = $layerSelect.value(),
format = $formatSelect.value(),
items = annotations[layer].map(function(annotation) {
var text = format == 'json'
? annotation.value
: annotation.value
.replace(/\n/g, ' ')
.replace(/\s+/g, ' ')
.replace(/<br>\s+?/g, '\n');
return {
'in': annotation['in'],
out: annotation.out,
text: text
};
2015-12-25 13:49:12 +00:00
}),
2018-08-09 13:42:54 +00:00
blob = textBlob(
2014-09-18 17:54:37 +00:00
format == 'json'
? JSON.stringify(items, null, ' ')
: Ox.formatSRT(items)
2018-08-09 13:42:54 +00:00
),
2015-12-25 13:49:12 +00:00
url = window.URL.createObjectURL(blob);
$link.attr({
download: options.title + ' - '
+ Ox.getObjectById(layers, layer).title + '.' + format,
href: url,
2014-09-18 17:54:37 +00:00
});
}
function updateStatus() {
$status.html(Ox._('All {0} currently shown will be exported.', [
Ox.getObjectById(layers, $layerSelect.value()).title.toLowerCase()
]));
}
return that;
2014-09-18 10:40:41 +00:00
2014-11-01 14:45:33 +00:00
};