glitch-images/scripts/views/openfileview.js
2015-12-23 23:09:12 +01:00

234 lines
7.3 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*global define*/
define(
[ 'util/browser', 'util/addpublishers', 'util/el', 'util/time', 'util/localizetext', 'views/dialog' ],
function ( browser, addPublishers, elHelper, timeHelper, loc, Dialog ) {
function OpenFileView ( parentEl ) {
if ( ! ( this instanceof OpenFileView ) ) {
return new OpenFileView( parentEl );
}
var self = this;
var fileOpenEl;
var storageListEl;
var emptyListEl;
var navButtonEl;
var dialog;
var publishers = addPublishers( self, 'openfile', 'deletefromlocalstorage', 'openfromlocalstorage', 'deletefromimgur' );
// check if the browser supports the filereader API
// before displaying upload button
if ( browser.getFeature( window, 'FileReader' ) ) {
navButtonEl = elHelper.createButton( 'file.open', 'file.opentitle', 'open-button nav-button', parentEl );
dialog = Dialog( 'open-file-dialog', parentEl, navButtonEl );
var fileLabelEl = elHelper.createLabel( 'file.importtitle', 'input-file', 'file-label label' );
fileInputEl = document.createElement( 'input' );
fileInputEl.classList.add( 'file-input' );
fileInputEl.type = 'file';
fileInputEl.id = 'input-file';
fileInputEl.accept = 'image/*';
fileInputEl.addEventListener( 'change', fileSelected );
var fileLabelButtonEl = elHelper.createLabel( 'file.import', 'input-file', 'file-button button' );
dialog.add( fileLabelEl, fileInputEl, fileLabelButtonEl );
self.fileinput = fileInputEl;
}
if ( browser.test( 'localforage' ) ) {
storageListEl = elHelper.createEl( 'ul', 'storage-list dialog-list' );
var storageLabelEl = elHelper.createLabel( 'file.recent', 'file.recenttitle', 'load-label label' );
dialog.add( storageLabelEl, storageListEl );
}
function fileSelected ( event ) {
if (
event.target &&
event.target.files &&
event.target.files[0]
) {
publishers.openfile.dispatch( event.target.files[0] );
}
}
// compare all items in the list with what's in localstorage
// and add, remove and edit them accordingly,
// including images shared on imgur
function updateList ( entries ) {
if ( storageListEl ) {
if ( entries && Object.keys( entries ).length ) {
if ( emptyListEl ) {
removeListItem( emptyListEl );
emptyListEl = null;
}
var storageListItemEl;
var offlineLinkEl;
for ( var uid in entries ) {
storageListItemEl = storageListEl.querySelector( '[data-uid="' + uid + '"]' );
updateListItem( storageListItemEl, uid, entries[uid] );
}
var storageListItemEls = storageListEl.querySelectorAll( '[data-uid]' );
for ( var i = 0, len = storageListItemEls.length; i < len; i++ ) {
var itemUid = storageListItemEls[i].getAttribute( 'data-uid' );
if ( itemUid && ! entries[itemUid] ) {
removeListItem( storageListItemEls[i] );
}
}
} else {
// no entries but there are still elements in dom
if ( entries && Object.keys( entries ).length === 0 ) {
var storageListItemEls = storageListEl.querySelectorAll( '[data-uid]' );
for ( var i = 0, len = storageListItemEls.length; i < len; i++ ) {
removeListItem( storageListItemEls[i] );
}
}
if ( ! emptyListEl ) {
emptyListEl = elHelper.createEl( 'li', 'no-items' );
loc( emptyListEl, 'textContent', 'file.norecent' );
storageListEl.appendChild( emptyListEl );
}
}
}
return self;
}
function updateListItem ( listItemEl, uid, entry ) {
if ( entry.src && entry.values && ! listItemEl ) {
addListItem( uid, entry );
} else {
if ( listItemEl ) {
if ( ! entry.src && ! entry.values ) {
removeListItem( listItemEl );
} else {
var offlineLinkEl = listItemEl.querySelector( '.entry-shared-button-wrapper' );
if ( ! entry.deleteHash && offlineLinkEl ) {
offlineLinkEl.parentNode.removeChild( offlineLinkEl );
listItemEl.classList.remove( 'has-offline-button' );
}
// add link el to open item online instead
if ( entry.deleteHash && ! offlineLinkEl ) {
addOnlineButtons( listItemEl, entry.deleteHash, entry.publicUrl, uid );
}
}
}
}
}
function addListItem ( uid, entry ) {
if ( entry ) {
var date = timeHelper.timestampToDate( entry.timestamp );
var listItemEl = elHelper.createEl( 'li', 'entry clear dialog-list-item', storageListEl );
listItemEl.setAttribute( 'data-uid', uid );
var listItemThumbnailEl = elHelper.createEl( 'img', 'entry-thumb', listItemEl );
listItemThumbnailEl.src = entry.thumbnail;
listItemThumbnailEl.addEventListener( 'click', loadItemFn( uid ) );
var textWrapperEl = elHelper.createEl( 'p', 'entry-text', listItemEl );
var listItemNameEl = elHelper.createEl( 'p', 'entry-name', textWrapperEl );
if ( entry.name ) {
listItemNameEl.textContent = entry.name;
} else {
loc( listItemNameEl, 'textContent', 'file.untitled' );
}
var listItemDateEl = elHelper.createEl( 'time', 'entry-datetime', textWrapperEl );
listItemDateEl.setAttribute( 'datetime', date.toISOString() );
var dateEl = elHelper.createEl( 'span', 'entry-date', listItemDateEl );
dateEl.textContent = timeHelper.dateToLocalStr( date );
var timeEl = elHelper.createEl( 'span', 'entry-time', listItemDateEl );
timeEl.textContent = timeHelper.timeToLocalStr( date );
var buttonWrapperEl = elHelper.createEl( 'div', 'entry-button-wrapper', listItemEl );
elHelper.createButton( 'file.del', 'file.deltitle', 'item-delete-button button', buttonWrapperEl, removeItemFn( uid ) );
elHelper.createButton( 'file.openimage', 'file.openimagetitle', 'item-load-button button', buttonWrapperEl, loadItemFn( uid ) );
if ( entry.deleteHash && entry.publicUrl ) {
addOnlineButtons( listItemEl, entry.deleteHash, entry.publicUrl, uid );
}
}
}
function addOnlineButtons ( listEl, deleteHash, publicUrl, uid ) {
var sharedButtonWrapperEl = elHelper.createEl( 'div', 'entry-shared-button-wrapper is-online-only', listEl );
listEl.classList.add( 'has-offline-button' );
elHelper.createButton(
'file.offline',
'file.offlinetitle',
'item-offline-button button',
sharedButtonWrapperEl,
removeItemFromImgurFn( uid, deleteHash )
);
elHelper.createLink(
'file.openlink',
'file.openlinktitle',
publicUrl,
'_blank',
'entry-shared-link button',
sharedButtonWrapperEl
);
}
function removeListItem ( itemEl ) {
itemEl.parentNode.removeChild( itemEl );
}
function removeItemFn ( uid ) {
return function () {
publishers.deletefromlocalstorage.dispatch( uid );
}
}
function removeItemFromImgurFn ( uid, deleteHash ) {
return function () {
var buttonEl = storageListEl.querySelector( '[data-uid="' + uid + '"] .item-offline-button' );
if ( buttonEl ) {
buttonEl.setAttribute( 'disabled', 'disabled' );
}
publishers.deletefromimgur.dispatch( uid, deleteHash );
}
}
function loadItemFn ( uid ) {
return function () {
dialog.hide();
publishers.openfromlocalstorage.dispatch( uid );
}
}
self.updateList = updateList;
self.dialog = dialog;
}
return OpenFileView;
}
);