From 44d840d483f0bef7e2b287118e427c2cd335d21e Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Tue, 19 Jul 2016 01:09:14 -0400 Subject: [PATCH 1/5] update lists --- .../emby-webcomponents/itemcontextmenu.js | 2 +- .../bower_components/emby-webcomponents/itemhelper.js | 4 ++++ .../emby-webcomponents/listview/listview.css | 8 ++++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/dashboard-ui/bower_components/emby-webcomponents/itemcontextmenu.js b/dashboard-ui/bower_components/emby-webcomponents/itemcontextmenu.js index d08d5b14f..0ac7356a9 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/itemcontextmenu.js +++ b/dashboard-ui/bower_components/emby-webcomponents/itemcontextmenu.js @@ -154,7 +154,7 @@ define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'embyRouter', if (user.Policy.IsAdministrator) { - if (item.Type != 'Timer') { + if (item.Type != 'Timer' && item.Type != 'Program') { commands.push({ name: globalize.translate('sharedcomponents#Refresh'), id: 'refresh' diff --git a/dashboard-ui/bower_components/emby-webcomponents/itemhelper.js b/dashboard-ui/bower_components/emby-webcomponents/itemhelper.js index 2ee4afcd1..5fa6ce96e 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/itemhelper.js +++ b/dashboard-ui/bower_components/emby-webcomponents/itemhelper.js @@ -75,6 +75,10 @@ define(['apphost'], function (appHost) { return false; } + if (itemType == 'Program') { + return false; + } + if (user.Policy.IsAdministrator) { return true; diff --git a/dashboard-ui/bower_components/emby-webcomponents/listview/listview.css b/dashboard-ui/bower_components/emby-webcomponents/listview/listview.css index 539d83212..c2987411a 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/listview/listview.css +++ b/dashboard-ui/bower_components/emby-webcomponents/listview/listview.css @@ -138,6 +138,10 @@ div.listItem { transform: scale(1.025, 1.025); } + .listItem > .fab:first-child { + margin-left: .75em; + } + .paperList { padding: .5em 0; margin: 1em auto; @@ -149,6 +153,10 @@ div.listItem { background-color: transparent !important; } + .paperList .listItem { + border-bottom: 0; + } + .listItemMediaInfo { align-items: center; } From dc69bc6055dc9f6cde1ef49dbbfae24053c8e54f Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Tue, 19 Jul 2016 15:51:22 -0400 Subject: [PATCH 2/5] update dialogs --- .../emby-webcomponents/.bower.json | 8 +- .../collectioneditor/collectioneditor.js | 6 +- .../emby-itemscontainer.js | 16 ++- .../indicators/indicators.js | 2 +- .../emby-webcomponents/itemcontextmenu.js | 32 ++++- .../playlisteditor/playlisteditor.js | 6 +- .../refreshdialog/refreshdialog.js | 4 +- .../scroller/smoothscroller.js | 4 +- .../emby-webcomponents/shortcuts.js | 10 ++ .../emby-webcomponents/strings/da.json | 19 +-- .../emby-webcomponents/strings/de.json | 19 +-- .../emby-webcomponents/strings/en-US.json | 27 +++-- .../emby-webcomponents/strings/es-MX.json | 61 +++++----- .../emby-webcomponents/strings/fr.json | 23 ++-- .../emby-webcomponents/strings/kk.json | 27 +++-- .../emby-webcomponents/strings/nb.json | 113 +++++++++--------- .../emby-webcomponents/strings/nl.json | 23 ++-- .../emby-webcomponents/strings/pt-BR.json | 19 +-- .../emby-webcomponents/strings/pt-PT.json | 19 +-- .../emby-webcomponents/strings/ru.json | 27 +++-- .../emby-webcomponents/strings/sv.json | 22 +++- .../emby-webcomponents/strings/zh-TW.json | 19 +-- .../emby-webcomponents/voice/voicedialog.js | 4 +- 23 files changed, 300 insertions(+), 210 deletions(-) diff --git a/dashboard-ui/bower_components/emby-webcomponents/.bower.json b/dashboard-ui/bower_components/emby-webcomponents/.bower.json index ffc933624..204259f41 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/.bower.json +++ b/dashboard-ui/bower_components/emby-webcomponents/.bower.json @@ -15,12 +15,12 @@ }, "devDependencies": {}, "ignore": [], - "version": "1.4.101", - "_release": "1.4.101", + "version": "1.4.106", + "_release": "1.4.106", "_resolution": { "type": "version", - "tag": "1.4.101", - "commit": "c6aa6b09f9c705ca83e31728ebbf0c4a2cda2454" + "tag": "1.4.106", + "commit": "a24b7adf582019433bcd1cc93c7c38495e642d89" }, "_source": "https://github.com/MediaBrowser/emby-webcomponents.git", "_target": "^1.2.0", diff --git a/dashboard-ui/bower_components/emby-webcomponents/collectioneditor/collectioneditor.js b/dashboard-ui/bower_components/emby-webcomponents/collectioneditor/collectioneditor.js index 11dc47eb7..1e557d723 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/collectioneditor/collectioneditor.js +++ b/dashboard-ui/bower_components/emby-webcomponents/collectioneditor/collectioneditor.js @@ -137,7 +137,7 @@ var html = ''; - html += '
'; + html += '
'; html += '
'; html += '
'; @@ -240,9 +240,9 @@ dlg.classList.add('formDialog'); var html = ''; - var title = items.length ? globalize.translate('sharedcomponents#AddToCollection') : globalize.translate('sharedcomponents#NewCollection'); + var title = items.length ? globalize.translate('sharedcomponents#HeaderAddToCollection') : globalize.translate('sharedcomponents#NewCollection'); - html += '
'; + html += '
'; html += ''; html += '
'; html += title; diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-itemscontainer/emby-itemscontainer.js b/dashboard-ui/bower_components/emby-webcomponents/emby-itemscontainer/emby-itemscontainer.js index 6681ff2c8..8ac2a9bb6 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/emby-itemscontainer/emby-itemscontainer.js +++ b/dashboard-ui/bower_components/emby-webcomponents/emby-itemscontainer/emby-itemscontainer.js @@ -62,9 +62,11 @@ var current = this.hoverMenu; - if (!enabled && current) { - current.destroy(); - this.hoverMenu = null; + if (!enabled) { + if (current) { + current.destroy(); + this.hoverMenu = null; + } return; } @@ -82,9 +84,11 @@ var current = this.multiSelect; - if (!enabled && current) { - current.destroy(); - this.multiSelect = null; + if (!enabled) { + if (current) { + current.destroy(); + this.multiSelect = null; + } return; } diff --git a/dashboard-ui/bower_components/emby-webcomponents/indicators/indicators.js b/dashboard-ui/bower_components/emby-webcomponents/indicators/indicators.js index 0afb8f4ae..d763d2280 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/indicators/indicators.js +++ b/dashboard-ui/bower_components/emby-webcomponents/indicators/indicators.js @@ -61,7 +61,7 @@ define(['css!./indicators.css', 'material-icons'], function () { } if (userData.PlayedPercentage && userData.PlayedPercentage >= 100 || (userData.Played)) { - return '
check
'; + return '
'; } } diff --git a/dashboard-ui/bower_components/emby-webcomponents/itemcontextmenu.js b/dashboard-ui/bower_components/emby-webcomponents/itemcontextmenu.js index 0ac7356a9..526663ce9 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/itemcontextmenu.js +++ b/dashboard-ui/bower_components/emby-webcomponents/itemcontextmenu.js @@ -1,4 +1,4 @@ -define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'embyRouter', 'playbackManager'], function (appHost, globalize, connectionManager, itemHelper, embyRouter, playbackManager) { +define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'embyRouter', 'playbackManager', 'loading'], function (appHost, globalize, connectionManager, itemHelper, embyRouter, playbackManager, loading) { var isTheater = true; appHost.appInfo().then(function (result) { @@ -32,6 +32,13 @@ define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'embyRouter', }); } + if (item.Type == 'Timer' && user.Policy.EnableLiveTvManagement) { + commands.push({ + name: globalize.translate('sharedcomponents#ButtonCancel'), + id: 'canceltimer' + }); + } + if (item.CanDelete) { commands.push({ name: globalize.translate('sharedcomponents#Delete'), @@ -445,7 +452,7 @@ define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'embyRouter', break; case 'canceltimer': - deleteTimer(itemId, parentWithClass(card, 'itemsContainer')); + deleteTimer(apiClient, item, resolve, id); break; default: reject(); @@ -454,6 +461,27 @@ define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'embyRouter', }); } + function deleteTimer(apiClient, item, resolve, command) { + + require(['confirm'], function (confirm) { + + confirm(globalize.translate('sharedcomponents#MessageConfirmRecordingCancellation'), globalize.translate('sharedcomponents#HeaderConfirmRecordingCancellation')).then(function () { + + loading.show(); + + apiClient.cancelLiveTvTimer(item.Id).then(function () { + + require(['toast'], function (toast) { + toast(globalize.translate('sharedcomponents#RecordingCancelled')); + }); + + loading.hide(); + getResolveFunction(resolve, command, true)(); + }); + }); + }); + } + function play(item, resume, queue) { var method = queue ? 'queue' : 'play'; diff --git a/dashboard-ui/bower_components/emby-webcomponents/playlisteditor/playlisteditor.js b/dashboard-ui/bower_components/emby-webcomponents/playlisteditor/playlisteditor.js index 85ab938c6..1f88bebc9 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/playlisteditor/playlisteditor.js +++ b/dashboard-ui/bower_components/emby-webcomponents/playlisteditor/playlisteditor.js @@ -137,7 +137,7 @@ var html = ''; - html += '
'; + html += '
'; html += '
'; html += ''; @@ -221,9 +221,9 @@ dlg.classList.add('formDialog'); var html = ''; - var title = globalize.translate('sharedcomponents#AddToPlaylist'); + var title = globalize.translate('sharedcomponents#HeaderAddToPlaylist'); - html += '
'; + html += '
'; html += ''; html += '
'; html += title; diff --git a/dashboard-ui/bower_components/emby-webcomponents/refreshdialog/refreshdialog.js b/dashboard-ui/bower_components/emby-webcomponents/refreshdialog/refreshdialog.js index 9ab658e8b..56aaf45e9 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/refreshdialog/refreshdialog.js +++ b/dashboard-ui/bower_components/emby-webcomponents/refreshdialog/refreshdialog.js @@ -17,7 +17,7 @@ var html = ''; - html += '
'; + html += '
'; html += '
'; html += ''; @@ -114,7 +114,7 @@ var html = ''; var title = globalize.translate('sharedcomponents#RefreshMetadata'); - html += '
'; + html += '
'; html += ''; html += '
'; html += title; diff --git a/dashboard-ui/bower_components/emby-webcomponents/scroller/smoothscroller.js b/dashboard-ui/bower_components/emby-webcomponents/scroller/smoothscroller.js index 054049469..2bda845a8 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/scroller/smoothscroller.js +++ b/dashboard-ui/bower_components/emby-webcomponents/scroller/smoothscroller.js @@ -911,9 +911,9 @@ define(['browser', 'layoutManager', 'scrollStyles'], function (browser, layoutMa } else { if (o.horizontal) { - slideeElement.scrollLeft += o.scrollBy * delta; + slideeElement.scrollLeft += 12 * delta; } else { - slideeElement.scrollTop += o.scrollBy * delta; + slideeElement.scrollTop += 12 * delta; } } } diff --git a/dashboard-ui/bower_components/emby-webcomponents/shortcuts.js b/dashboard-ui/bower_components/emby-webcomponents/shortcuts.js index 0834e1655..38de50092 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/shortcuts.js +++ b/dashboard-ui/bower_components/emby-webcomponents/shortcuts.js @@ -146,6 +146,16 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'embyRouter', 'g })); } } + else if (result.command == 'canceltimer') { + + if (itemsContainer) { + itemsContainer.dispatchEvent(new CustomEvent('timercancelled', { + detail: {}, + cancelable: false, + bubbles: true + })); + } + } }); }); }); diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/da.json b/dashboard-ui/bower_components/emby-webcomponents/strings/da.json index 5f16d65ce..cec45454e 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/da.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/da.json @@ -1,10 +1,6 @@ { - "MarkPlayed": "Mark Played", - "MarkUnplayed": "Mark Unplayed", - "GroupVersions": "Group Versions", - "PleaseSelectTwoItems": "Please select at least two items.", - "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", - "Error": "Error", + "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", + "MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Del", "ServerUpdateNeeded": "Denne Emby server b\u00f8r opdateres. For at downloade den nyeste version bes\u00f8g venligst {0}", @@ -103,7 +99,6 @@ "Favorite": "Favorite", "Like": "Like", "Dislike": "Dislike", - "Played": "Played", "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "Open": "Open", "Play": "Play", @@ -121,5 +116,13 @@ "PlayFromBeginning": "Play from beginning", "ResumeAt": "Resume from {0}", "RemoveFromPlaylist": "Remove from Playlist", - "Trailer": "Trailer" + "Trailer": "Trailer", + "MarkPlayed": "Mark Played", + "MarkUnplayed": "Mark Unplayed", + "GroupVersions": "Group Versions", + "PleaseSelectTwoItems": "Please select at least two items.", + "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", + "TryMultiSelect": "Try Multi-Select", + "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", + "Error": "Error" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/de.json b/dashboard-ui/bower_components/emby-webcomponents/strings/de.json index eb1a8f47c..dad38653a 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/de.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/de.json @@ -1,10 +1,6 @@ { - "MarkPlayed": "Mark Played", - "MarkUnplayed": "Mark Unplayed", - "GroupVersions": "Group Versions", - "PleaseSelectTwoItems": "Please select at least two items.", - "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", - "Error": "Error", + "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", + "MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Teilen", "ServerUpdateNeeded": "Dieser Emby Server sollte aktualisiert werden. Um die neueste Version zu laden, besuche bitte {0}", @@ -103,7 +99,6 @@ "Favorite": "Favorite", "Like": "Like", "Dislike": "Dislike", - "Played": "Played", "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "Open": "Open", "Play": "Play", @@ -121,5 +116,13 @@ "PlayFromBeginning": "Play from beginning", "ResumeAt": "Resume from {0}", "RemoveFromPlaylist": "Remove from Playlist", - "Trailer": "Trailer" + "Trailer": "Trailer", + "MarkPlayed": "Mark Played", + "MarkUnplayed": "Mark Unplayed", + "GroupVersions": "Group Versions", + "PleaseSelectTwoItems": "Please select at least two items.", + "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", + "TryMultiSelect": "Try Multi-Select", + "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", + "Error": "Error" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/en-US.json b/dashboard-ui/bower_components/emby-webcomponents/strings/en-US.json index b0d4a9e83..e0a07ffdb 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/en-US.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/en-US.json @@ -57,7 +57,8 @@ "ConfirmDeleteItem": "Deleting this item will delete it from both the file system and your media library. Are you sure you wish to continue?", "Refresh": "Refresh", "RefreshQueued": "Refresh queued.", - "AddToCollection": "Add to Collection", + "AddToCollection": "Add to collection", + "HeaderAddToCollection": "Add to Collection", "NewCollection": "New Collection", "LabelCollection": "Collection:", "Help": "Help", @@ -68,7 +69,8 @@ "MessageItemsAdded": "Items added.", "OptionNew": "New...", "LabelPlaylist": "Playlist:", - "AddToPlaylist": "Add to Playlist", + "AddToPlaylist": "Add to playlist", + "HeaderAddToPlaylist": "Add to Playlist", "Subtitles": "Subtitles", "SearchForSubtitles": "Search for Subtitles", "LabelLanguage": "Language:", @@ -79,7 +81,7 @@ "ConfirmDeletion": "Confirm Deletion", "MySubtitles": "My Subtitles", "MessageDownloadQueued": "Download queued.", - "EditSubtitles": "Edit Subtitles", + "EditSubtitles": "Edit subtitles", "UnlockGuide": "Unlock Guide", "RefreshMetadata": "Refresh Metadata", "ReplaceExistingImages": "Replace existing images", @@ -103,17 +105,18 @@ "Queue": "Queue", "Shuffle": "Shuffle", "Identify": "Identify", - "EditImages": "Edit Images", - "EditInfo": "Edit Info", + "EditImages": "Edit images", + "EditInfo": "Edit info", "Sync": "Sync", - "InstantMix": "Instant Mix", - "ViewAlbum": "View Album", - "ViewArtist": "View Artist", - "QueueAllFromHere": "Queue All from Here", - "PlayAllFromHere": "Play All from Here", + "InstantMix": "Instant mix", + "ViewAlbum": "View album", + "ViewArtist": "View artist", + "QueueAllFromHere": "Queue all from here", + "PlayAllFromHere": "Play all from here", "PlayFromBeginning": "Play from beginning", "ResumeAt": "Resume from {0}", - "RemoveFromPlaylist": "Remove from Playlist", + "RemoveFromPlaylist": "Remove from playlist", + "RemoveFromCollection": "Remove from collection", "Trailer": "Trailer", "MarkPlayed": "Mark Played", "MarkUnplayed": "Mark Unplayed", @@ -122,5 +125,7 @@ "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", + "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", + "MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?", "Error": "Error" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/es-MX.json b/dashboard-ui/bower_components/emby-webcomponents/strings/es-MX.json index 7e9f0dade..c80d30214 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/es-MX.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/es-MX.json @@ -1,10 +1,6 @@ { - "MarkPlayed": "Mark Played", - "MarkUnplayed": "Mark Unplayed", - "GroupVersions": "Group Versions", - "PleaseSelectTwoItems": "Please select at least two items.", - "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", - "Error": "Error", + "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", + "MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?", "ValueSpecialEpisodeName": "Especial - {0}", "Share": "Compartir", "ServerUpdateNeeded": "Este Servidor Emby necesita ser actualizado. Para descargar la ultima versi\u00f3n, por favor visite {0}", @@ -98,28 +94,35 @@ "HeaderYouSaid": "Ha Dicho...", "MessageWeDidntRecognizeCommand": "Lo sentimos, no reconocimos ese comando.", "MessageIfYouBlockedVoice": "Si ha negado el acceso por voz a la aplicaci\u00f3n necesitara reconfigurar antes de intentarlo de nuevo.", - "ValueDiscNumber": "Disc {0}", - "Unrated": "Unrated", - "Favorite": "Favorite", - "Like": "Like", - "Dislike": "Dislike", - "Played": "Played", + "ValueDiscNumber": "Disco {0}", + "Unrated": "Sin clasificar", + "Favorite": "Favorito", + "Like": "Me gusta", + "Dislike": "No me gusta", "RefreshDialogHelp": "Los metadatos son actualizados bas\u00e1ndose en las configuraciones y servicios de internet que que est\u00e9n activados en el panel de control de su Servidor de Emby.", - "Open": "Open", - "Play": "Play", - "Queue": "Queue", - "Shuffle": "Shuffle", - "Identify": "Identify", - "EditImages": "Edit Images", - "EditInfo": "Edit Info", - "Sync": "Sync", - "InstantMix": "Instant Mix", - "ViewAlbum": "View Album", - "ViewArtist": "View Artist", - "QueueAllFromHere": "Queue All from Here", - "PlayAllFromHere": "Play All from Here", - "PlayFromBeginning": "Play from beginning", - "ResumeAt": "Resume from {0}", - "RemoveFromPlaylist": "Remove from Playlist", - "Trailer": "Trailer" + "Open": "Abrir", + "Play": "Reproducir", + "Queue": "Cola", + "Shuffle": "Aleatorio", + "Identify": "Identificar", + "EditImages": "Editar im\u00e1genes", + "EditInfo": "Editar Informaci\u00f3n", + "Sync": "Sinc.", + "InstantMix": "Mix instant\u00e1neo", + "ViewAlbum": "Ver \u00c1lbum", + "ViewArtist": "Ver Artista", + "QueueAllFromHere": "Encolar todos desde aqu\u00ed", + "PlayAllFromHere": "Reproducir todos desde aqu\u00ed", + "PlayFromBeginning": "Reproducir desde el inicio", + "ResumeAt": "Reanudar desde {0}", + "RemoveFromPlaylist": "Eliminar de la lista de reproducci\u00f3n", + "Trailer": "Tr\u00e1iler", + "MarkPlayed": "Marcar como Reproducido", + "MarkUnplayed": "Marcar como No Reproducido", + "GroupVersions": "Agrupar Versiones", + "PleaseSelectTwoItems": "Por favor seleccione al menos dos \u00edtems.", + "TheSelectedItemsWillBeGrouped": "Los videos seleccionados se agruparan en un solo \u00edtem virtual. Las aplicaciones Emby elegir\u00e1n autom\u00e1ticamente cual versi\u00f3n reproducir dependiendo del dispositivo y el rendimiento de la red. \u00bfEsta seguro de que desea continuar?", + "TryMultiSelect": "Intente Multi-Selecci\u00f3n", + "TryMultiSelectMessage": "Para editar m\u00faltiples medios, solo de clic sostenido sobre cualquier p\u00f3ster y elija los items que desea administrar. \u00a1int\u00e9ntelo!", + "Error": "Error" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/fr.json b/dashboard-ui/bower_components/emby-webcomponents/strings/fr.json index 6a0707643..9e2e5db98 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/fr.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/fr.json @@ -1,10 +1,6 @@ { - "MarkPlayed": "Mark Played", - "MarkUnplayed": "Mark Unplayed", - "GroupVersions": "Group Versions", - "PleaseSelectTwoItems": "Please select at least two items.", - "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", - "Error": "Error", + "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", + "MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?", "ValueSpecialEpisodeName": "Sp\u00e9cial - {0}", "Share": "Partager", "ServerUpdateNeeded": "Le serveur Emby doit \u00eatre mis \u00e0 jour. Pour t\u00e9l\u00e9charger la derni\u00e8re version, veuillez visiter {0}", @@ -103,7 +99,6 @@ "Favorite": "Favoris", "Like": "J'aime", "Dislike": "Je n'aime pas", - "Played": "Lu", "RefreshDialogHelp": "Les m\u00e9tadonn\u00e9es sont actualis\u00e9es en fonction des param\u00e8tres et des services internet qui sont activ\u00e9s dans le tableau de bord Emby Server.", "Open": "Ouvrir", "Play": "Lire", @@ -118,8 +113,16 @@ "ViewArtist": "Voir l'artiste", "QueueAllFromHere": "Tout mette en file d'attente \u00e0 partir d'ici", "PlayAllFromHere": "Tout lire \u00e0 partir d'ici", - "PlayFromBeginning": "Play from beginning", - "ResumeAt": "Resume from {0}", + "PlayFromBeginning": "Lire depuis le d\u00e9but", + "ResumeAt": "Reprendre \u00e0 {0}", "RemoveFromPlaylist": "Supprimer de la liste de lecture", - "Trailer": "Trailer" + "Trailer": "Bande-annonce", + "MarkPlayed": "Marquer comme lu", + "MarkUnplayed": "Marquer comme non lu", + "GroupVersions": "Versions des groupes", + "PleaseSelectTwoItems": "Veuillez s\u00e9lectionner au moins deux \u00e9l\u00e9ments.", + "TheSelectedItemsWillBeGrouped": "Les vid\u00e9os s\u00e9lectionn\u00e9es seront regroup\u00e9es dans un objet virtuel. L'application Emby choisra automatiquement quelle version jouer d'apr\u00e8s le p\u00e9riph\u00e9rique et la performance du r\u00e9seau. \u00cates vous s\u00fbre de vouloir continuer ?", + "TryMultiSelect": "Essayer la s\u00e9lection multiple", + "TryMultiSelectMessage": "Pour modifier plusieurs \u00e9l\u00e9ments m\u00e9dias, il suffit de cliquer et maintenir le clic sur n'importe quel poster et de s\u00e9lectionner les \u00e9l\u00e9ments que vous voulez g\u00e9rer. Essayer le !", + "Error": "Erreur" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/kk.json b/dashboard-ui/bower_components/emby-webcomponents/strings/kk.json index 1643667e5..ed3bdcbe5 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/kk.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/kk.json @@ -1,10 +1,6 @@ { - "MarkPlayed": "Mark Played", - "MarkUnplayed": "Mark Unplayed", - "GroupVersions": "Group Versions", - "PleaseSelectTwoItems": "Please select at least two items.", - "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", - "Error": "Error", + "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", + "MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?", "ValueSpecialEpisodeName": "\u0410\u0440\u043d\u0430\u0439\u044b - {0}", "Share": "\u041e\u0440\u0442\u0430\u049b\u0442\u0430\u0441\u0443", "ServerUpdateNeeded": "\u041e\u0441\u044b Emby Server \u0436\u0430\u04a3\u0430\u0440\u0442\u044b\u043b\u0443\u044b \u049b\u0430\u0436\u0435\u0442. \u0421\u043e\u04a3\u0493\u044b \u043d\u04b1\u0441\u049b\u0430\u0441\u044b\u043d \u0436\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u0443 \u04af\u0448\u0456\u043d, {0} \u043a\u0456\u0440\u0456\u04a3\u0456\u0437", @@ -103,7 +99,6 @@ "Favorite": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b", "Like": "\u04b0\u043d\u0430\u0439\u0434\u044b", "Dislike": "\u04b0\u043d\u0430\u043c\u0430\u0439\u0434\u044b", - "Played": "\u041e\u0439\u043d\u0430\u0442\u044b\u043b\u0493\u0430\u043d", "RefreshDialogHelp": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440 \u043c\u0435\u043d Emby Server \u0431\u0430\u049b\u044b\u043b\u0430\u0443 \u0442\u0430\u049b\u0442\u0430\u0441\u044b\u043d\u0434\u0430 \u049b\u043e\u0441\u044b\u043b\u0493\u0430\u043d \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u049b\u044b\u0437\u043c\u0435\u0442\u0442\u0435\u0440\u0456 \u043d\u0435\u0433\u0456\u0437\u0456\u043d\u0434\u0435 \u0436\u0430\u04a3\u0493\u044b\u0440\u0442\u044b\u043b\u0430\u0434\u044b.", "Open": "\u0410\u0448\u0443", "Play": "\u041e\u0439\u043d\u0430\u0442\u0443", @@ -111,15 +106,23 @@ "Shuffle": "\u0410\u0440\u0430\u043b\u0430\u0441\u0442\u044b\u0440\u0443", "Identify": "\u0410\u043d\u044b\u049b\u0442\u0430\u0443", "EditImages": "\u0421\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0434\u0456 \u04e9\u04a3\u0434\u0435\u0443", - "EditInfo": "Edit Info", + "EditInfo": "\u041c\u04d9\u043b\u0456\u043c\u0435\u0442\u0442\u0435\u0440\u0434\u0456 \u04e9\u04a3\u0434\u0435\u0443", "Sync": "\u04ae\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443", "InstantMix": "\u041b\u0435\u0437\u0434\u0456\u043a \u049b\u043e\u0441\u043f\u0430", "ViewAlbum": "\u0410\u043b\u044c\u0431\u043e\u043c\u0434\u044b \u049b\u0430\u0440\u0430\u0443", "ViewArtist": "\u041e\u0440\u044b\u043d\u0434\u0430\u0443\u0448\u044b\u043d\u044b \u049b\u0430\u0440\u0430\u0443", "QueueAllFromHere": "\u0411\u04b1\u043b \u0430\u0440\u0430\u0434\u0430\u043d \u0431\u04d9\u0440\u0456\u043d \u043a\u0435\u0437\u0435\u043a\u043a\u0435", "PlayAllFromHere": "\u0411\u04b1\u043b \u0430\u0440\u0430\u0434\u0430\u043d \u0431\u04d9\u0440\u0456\u043d \u043e\u0439\u043d\u0430\u0442\u0443", - "PlayFromBeginning": "Play from beginning", - "ResumeAt": "Resume from {0}", - "RemoveFromPlaylist": "Remove from Playlist", - "Trailer": "Trailer" + "PlayFromBeginning": "\u0411\u0430\u0441\u044b\u043d\u0430\u043d \u043e\u0439\u043d\u0430\u0442\u0443", + "ResumeAt": "{0} \u0431\u0430\u0441\u0442\u0430\u043f \u0436\u0430\u043b\u0493\u0430\u0441\u0442\u044b\u0440\u0443", + "RemoveFromPlaylist": "\u041e\u0439\u043d\u0430\u0442\u0443 \u0442\u0456\u0437\u0456\u043c\u0456\u043d\u0435\u043d \u0430\u043b\u0430\u0441\u0442\u0430\u0443", + "Trailer": "\u0422\u0440\u0435\u0439\u043b\u0435\u0440", + "MarkPlayed": "\u041e\u0439\u043d\u0430\u0442\u044b\u043b\u0493\u0430\u043d \u0434\u0435\u043f \u0431\u0435\u043b\u0433\u0456\u043b\u0435\u0443", + "MarkUnplayed": "\u041e\u0439\u043d\u0430\u0442\u044b\u043b\u043c\u0430\u0493\u0430\u043d \u0434\u0435\u043f \u0431\u0435\u043b\u0433\u0456\u043b\u0435\u0443", + "GroupVersions": "\u041d\u04b1\u0441\u049b\u0430\u043b\u0430\u0440\u0434\u044b \u0442\u043e\u043f\u0442\u0430\u0441\u0442\u044b\u0440\u0443", + "PleaseSelectTwoItems": "\u0415\u04a3 \u043a\u0435\u043c\u0456\u043d\u0434\u0435 \u0435\u043a\u0456 \u0442\u0430\u0440\u043c\u0430\u049b\u0442\u044b \u0442\u0430\u04a3\u0434\u0430\u04a3\u044b\u0437.", + "TheSelectedItemsWillBeGrouped": "\u0411\u04e9\u043b\u0435\u043a\u0442\u0435\u043b\u0433\u0435\u043d \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0440 \u0431\u0456\u0440 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u0434\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043a\u0435 \u0442\u043e\u043f\u0442\u0430\u0441\u0442\u044b\u0440\u044b\u043b\u0430\u0434\u044b. Emby \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u043b\u0430\u0440\u044b \u049b\u04b1\u0440\u044b\u043b\u0493\u044b \u043c\u0435\u043d \u0436\u0435\u043b\u0456 \u04e9\u043d\u0456\u043c\u0434\u0456\u043b\u0456\u0433\u0456 \u043d\u0435\u0433\u0456\u0437\u0456\u043d\u0434\u0435 \u043e\u0439\u043d\u0430\u0442\u044b\u043b\u0430\u0442\u044b\u043d \u043d\u04b1\u0441\u049b\u0430\u0441\u044b\u043d \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u0442\u0430\u04a3\u0434\u0430\u0439\u0434\u044b. \u0428\u044b\u043d\u044b\u043c\u0435\u043d \u0436\u0430\u043b\u0493\u0430\u0441\u0442\u044b\u0440\u0443 \u049b\u0430\u0436\u0435\u0442 \u043f\u0435?", + "TryMultiSelect": "\u04ae\u043d\u0434\u0435\u0441\u043a\u0435\u043d \u0431\u04e9\u043b\u0435\u043a\u0442\u0435\u0443\u0434\u0456 \u0441\u044b\u043d\u0430\u043f \u043a\u04e9\u0440\u0443", + "TryMultiSelectMessage": "\u0411\u0456\u0440\u043d\u0435\u0448\u0435 \u0442\u0430\u0441\u044b\u0493\u044b\u0448 \u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0442\u0435\u0440\u0456\u043d \u04e9\u04a3\u0434\u0435\u0443 \u04af\u0448\u0456\u043d, \u043a\u0435\u0437 \u043a\u0435\u043b\u0433\u0435\u043d \u043f\u043e\u0441\u0442\u0435\u0440\u0434\u0456 \u0436\u0430\u0439 \u0493\u0430\u043d\u0430 \u0442\u0456\u043d\u0442\u0443\u0456\u0440 \u0431\u0430\u0442\u044b\u0440\u043c\u0430\u0493\u0430 \u0431\u0430\u0441\u044b\u043f \u0442\u04b1\u0440\u044b\u043f \u043d\u04b1\u049b\u044b\u04a3\u044b\u0437 \u0436\u04d9\u043d\u0435 \u0431\u0430\u0441\u049b\u0430\u0440\u0443\u044b\u043d \u049b\u0430\u043b\u0430\u0493\u0430\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0442\u0435\u0440\u0434\u0456 \u0431\u04e9\u043b\u0435\u043a\u0442\u0435\u04a3\u0456\u0437. \u0421\u044b\u043d\u0430\u043f \u043a\u04e9\u0440\u0456\u04a3\u0456\u0437!", + "Error": "\u049a\u0430\u0442\u0435" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/nb.json b/dashboard-ui/bower_components/emby-webcomponents/strings/nb.json index 05c3dccd6..ec7cc4744 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/nb.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/nb.json @@ -1,10 +1,6 @@ { - "MarkPlayed": "Mark Played", - "MarkUnplayed": "Mark Unplayed", - "GroupVersions": "Group Versions", - "PleaseSelectTwoItems": "Please select at least two items.", - "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", - "Error": "Error", + "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", + "MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?", "ValueSpecialEpisodeName": "Spesial - {0}", "Share": "Del", "ServerUpdateNeeded": "Denne Emby serveren trenger en oppdatering. For \u00e5 laste ned nyeste versjon, vennligst bes\u00f8k: {0}", @@ -29,9 +25,9 @@ "ButtonOk": "Ok", "ButtonCancel": "Avbryt", "ButtonGotIt": "Skj\u00f8nner", - "RecordingCancelled": "Recording cancelled.", + "RecordingCancelled": "Opptatt avbrutt.", "RecordingScheduled": "Planlagte opptak.", - "SeriesRecordingScheduled": "Series recording scheduled.", + "SeriesRecordingScheduled": "Serie opptak planlagt.", "HeaderNewRecording": "Tar opp n\u00e5", "Sunday": "S\u00f8ndag", "Monday": "Mandag", @@ -75,51 +71,58 @@ "OptionNew": "Ny", "LabelPlaylist": "Spilleliste:", "AddToPlaylist": "Legg til i Spilleliste", - "Subtitles": "Subtitles", - "SearchForSubtitles": "Search for Subtitles", - "LabelLanguage": "Language:", - "Search": "Search", - "NoSubtitleSearchResultsFound": "No results found.", - "File": "File", - "MessageAreYouSureDeleteSubtitles": "Are you sure you wish to delete this subtitle file?", - "ConfirmDeletion": "Confirm Deletion", - "MySubtitles": "My Subtitles", - "MessageDownloadQueued": "Download queued.", - "EditSubtitles": "Edit Subtitles", - "UnlockGuide": "Unlock Guide", - "RefreshMetadata": "Refresh Metadata", - "ReplaceExistingImages": "Replace existing images", - "ReplaceAllMetadata": "Replace all metadata", - "SearchForMissingMetadata": "Search for missing metadata", - "LabelRefreshMode": "Refresh mode:", - "NoItemsFound": "No items found.", - "HeaderSaySomethingLike": "Say Something Like...", - "ButtonTryAgain": "Try Again", - "HeaderYouSaid": "You Said...", - "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", - "MessageIfYouBlockedVoice": "If you denied voice access to the app you'll need to reconfigure before trying again.", - "ValueDiscNumber": "Disc {0}", - "Unrated": "Unrated", - "Favorite": "Favorite", - "Like": "Like", - "Dislike": "Dislike", - "Played": "Played", - "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", - "Open": "Open", - "Play": "Play", - "Queue": "Queue", - "Shuffle": "Shuffle", - "Identify": "Identify", - "EditImages": "Edit Images", - "EditInfo": "Edit Info", - "Sync": "Sync", - "InstantMix": "Instant Mix", - "ViewAlbum": "View Album", - "ViewArtist": "View Artist", - "QueueAllFromHere": "Queue All from Here", - "PlayAllFromHere": "Play All from Here", - "PlayFromBeginning": "Play from beginning", - "ResumeAt": "Resume from {0}", - "RemoveFromPlaylist": "Remove from Playlist", - "Trailer": "Trailer" + "Subtitles": "Undertekster", + "SearchForSubtitles": "S\u00f8k etter undertekster", + "LabelLanguage": "Spr\u00e5k:", + "Search": "S\u00f8k:", + "NoSubtitleSearchResultsFound": "Ingen resultater funnet.", + "File": "Fil:", + "MessageAreYouSureDeleteSubtitles": "Er du sikker p\u00e5 at du vil slette denne undertekst filen?", + "ConfirmDeletion": "Bekreft sletting", + "MySubtitles": "Mine undertekster", + "MessageDownloadQueued": "Nedlasting satt til i k\u00f8", + "EditSubtitles": "Endre undertekster", + "UnlockGuide": "L\u00e5s opp guide", + "RefreshMetadata": "Oppdater metadata", + "ReplaceExistingImages": "Erstatt eksisterende bilde", + "ReplaceAllMetadata": "Erstatt all metadata", + "SearchForMissingMetadata": "S\u00f8k etter manglende metadata", + "LabelRefreshMode": "Oppdatering modus:", + "NoItemsFound": "Ingen elementer funnet", + "HeaderSaySomethingLike": "Si noe slik som...", + "ButtonTryAgain": "Pr\u00f8v igjen", + "HeaderYouSaid": "Du Sa...", + "MessageWeDidntRecognizeCommand": "Beklager vi kunne ikke forst\u00e5 den kommandoen.", + "MessageIfYouBlockedVoice": "Hvis du nektet stemmegjenkjenning tilgang til applikasjonen m\u00e5 du rekonfigurere dette f\u00f8r du pr\u00f8ver igjen.", + "ValueDiscNumber": "Disk {0}", + "Unrated": "Uten sensur", + "Favorite": "Favoritt", + "Like": "Liker", + "Dislike": "Liker ikke", + "RefreshDialogHelp": "Metadata er oppdatert basert p\u00e5 innstillinger og internett-tjenester som er aktivert i Emby Server dashbordet", + "Open": "\u00c5pne", + "Play": "Spill", + "Queue": "K\u00f8", + "Shuffle": "Tilfeldig", + "Identify": "Identifisere", + "EditImages": "Endre bilder", + "EditInfo": "Endre informasjon", + "Sync": "Synkronisere", + "InstantMix": "Umiddelbar Blanding", + "ViewAlbum": "Vis album", + "ViewArtist": "Vis artister", + "QueueAllFromHere": "Sett alt i k\u00f8en fra her", + "PlayAllFromHere": "Spill av alle fra her", + "PlayFromBeginning": "Start fra starten", + "ResumeAt": "Forsett fra {0}", + "RemoveFromPlaylist": "Fjern fra spilleliste", + "Trailer": "Trailer", + "MarkPlayed": "Merker som sett", + "MarkUnplayed": "Merker som usett", + "GroupVersions": "Gruppering av versjoner", + "PleaseSelectTwoItems": "Vennligst velg minst to elementer", + "TheSelectedItemsWillBeGrouped": "De valgte videoene blir gruppert i en virtuell element. Emby app vil automatisk velge hvilken versjon du vil spille basert p\u00e5 enheten og nettverksytelse . Er du sikker p\u00e5 at du vil fortsette?", + "TryMultiSelect": "Pr\u00f8v flervalg.", + "TryMultiSelectMessage": "Hvis du vil redigere flere medier elementer, klikker du bare og hold en plakat og velg elementene du \u00f8nsker \u00e5 administrere. Pr\u00f8v det!", + "Error": "Feil" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/nl.json b/dashboard-ui/bower_components/emby-webcomponents/strings/nl.json index 95d4d2c68..4bd8bfd2d 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/nl.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/nl.json @@ -1,10 +1,6 @@ { - "MarkPlayed": "Mark Played", - "MarkUnplayed": "Mark Unplayed", - "GroupVersions": "Group Versions", - "PleaseSelectTwoItems": "Please select at least two items.", - "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", - "Error": "Error", + "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", + "MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?", "ValueSpecialEpisodeName": "Speciaal - {0}", "Share": "Delen", "ServerUpdateNeeded": "Deze Emby Server moet worden bijgewerkt. Om de laatste versie te downloaden, gaat u naar {0}", @@ -103,7 +99,6 @@ "Favorite": "Favoriet", "Like": "Leuk", "Dislike": "Niet leuk", - "Played": "Afgespeeld", "RefreshDialogHelp": "Metadata wordt vernieuwd op basis van de instellingen en internet diensten die zijn ingeschakeld in het dashboard van de Emby Server.", "Open": "Openen", "Play": "Afspelen", @@ -118,8 +113,16 @@ "ViewArtist": "Bekijk artiest", "QueueAllFromHere": "Plaats alles in de wachtrij vanaf hier", "PlayAllFromHere": "Speel alles vanaf hier", - "PlayFromBeginning": "Play from beginning", - "ResumeAt": "Resume from {0}", + "PlayFromBeginning": "Afspelen vanaf begin", + "ResumeAt": "Hervatten vanaf {0}", "RemoveFromPlaylist": "Verwijderen uit afspeellijst", - "Trailer": "Trailer" + "Trailer": "Trailer", + "MarkPlayed": "Markeren als Afgespeeld", + "MarkUnplayed": "Markeren als Niet Afgespeeld", + "GroupVersions": "Groepeer Versies", + "PleaseSelectTwoItems": "Selecteer ten minste twee items.", + "TheSelectedItemsWillBeGrouped": "De geselecteerde videos worden in 1 item gegroepeerd. Emby apps zullen automatisch de juiste versie selecteren op basis van het apparaat en netwerk prestaties. Weet u zeker dat u door wilt gaan?", + "TryMultiSelect": "Try Multi-Select", + "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", + "Error": "Fout" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/pt-BR.json b/dashboard-ui/bower_components/emby-webcomponents/strings/pt-BR.json index 1b9c85b63..8dbd2f417 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/pt-BR.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/pt-BR.json @@ -1,10 +1,6 @@ { - "MarkPlayed": "Mark Played", - "MarkUnplayed": "Mark Unplayed", - "GroupVersions": "Group Versions", - "PleaseSelectTwoItems": "Please select at least two items.", - "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", - "Error": "Error", + "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", + "MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?", "ValueSpecialEpisodeName": "Especial - {0}", "Share": "Compartilhar", "ServerUpdateNeeded": "Este servidor Emby precisa ser atualizado. Para baixar a \u00faltima vers\u00e3o, por favor visite {0}", @@ -103,7 +99,6 @@ "Favorite": "Favorito", "Like": "Gostei", "Dislike": "N\u00e3o Gostei", - "Played": "Reproduzido", "RefreshDialogHelp": "Os metadados s\u00e3o atualizados com bases nas defini\u00e7\u00f5es e nos servi\u00e7os de internet que est\u00e3o ativos no painel do Servidor Emby.", "Open": "Abrir", "Play": "Reproduzir", @@ -121,5 +116,13 @@ "PlayFromBeginning": "Reproduzir do in\u00edcio", "ResumeAt": "Retomar de {0}", "RemoveFromPlaylist": "Remover da Lista de Reprodu\u00e7\u00e3o", - "Trailer": "Trailer" + "Trailer": "Trailer", + "MarkPlayed": "Mark Played", + "MarkUnplayed": "Mark Unplayed", + "GroupVersions": "Group Versions", + "PleaseSelectTwoItems": "Please select at least two items.", + "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", + "TryMultiSelect": "Try Multi-Select", + "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", + "Error": "Error" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/pt-PT.json b/dashboard-ui/bower_components/emby-webcomponents/strings/pt-PT.json index 87d1b5488..8d223194f 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/pt-PT.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/pt-PT.json @@ -1,10 +1,6 @@ { - "MarkPlayed": "Mark Played", - "MarkUnplayed": "Mark Unplayed", - "GroupVersions": "Group Versions", - "PleaseSelectTwoItems": "Please select at least two items.", - "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", - "Error": "Error", + "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", + "MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?", "ValueSpecialEpisodeName": "Especial - {0}", "Share": "Partilhar", "ServerUpdateNeeded": "Este Servidor Emby precisa ser atualizado. Para fazer download da vers\u00e3o mais recente, por favor visite {0}", @@ -103,7 +99,6 @@ "Favorite": "Favorite", "Like": "Like", "Dislike": "Dislike", - "Played": "Played", "RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Emby Server dashboard.", "Open": "Open", "Play": "Play", @@ -121,5 +116,13 @@ "PlayFromBeginning": "Play from beginning", "ResumeAt": "Resume from {0}", "RemoveFromPlaylist": "Remove from Playlist", - "Trailer": "Trailer" + "Trailer": "Trailer", + "MarkPlayed": "Mark Played", + "MarkUnplayed": "Mark Unplayed", + "GroupVersions": "Group Versions", + "PleaseSelectTwoItems": "Please select at least two items.", + "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", + "TryMultiSelect": "Try Multi-Select", + "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", + "Error": "Error" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/ru.json b/dashboard-ui/bower_components/emby-webcomponents/strings/ru.json index dfeac81d6..a245e08ad 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/ru.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/ru.json @@ -1,10 +1,6 @@ { - "MarkPlayed": "Mark Played", - "MarkUnplayed": "Mark Unplayed", - "GroupVersions": "Group Versions", - "PleaseSelectTwoItems": "Please select at least two items.", - "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", - "Error": "Error", + "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", + "MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?", "ValueSpecialEpisodeName": "\u0421\u043f\u0435\u0446\u044d\u043f\u0438\u0437\u043e\u0434 - {0}", "Share": "\u041f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f", "ServerUpdateNeeded": "\u0414\u0430\u043d\u043d\u044b\u0439 Emby Server \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c. \u0427\u0442\u043e\u0431\u044b \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0432\u0435\u0440\u0441\u0438\u044e, \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435 {0}", @@ -103,7 +99,6 @@ "Favorite": "\u0418\u0437\u0431\u0440\u0430\u043d\u043d\u043e\u0435", "Like": "\u041d\u0440\u0430\u0432\u0438\u0442\u0441\u044f", "Dislike": "\u041d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f", - "Played": "\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0451\u043d\u043d\u043e\u0435", "RefreshDialogHelp": "\u041f\u043e\u0434\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u0432 \u0438\u043d\u0444\u043e\u043f\u0430\u043d\u0435\u043b\u0438 Emby Server \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0443\u0441\u043b\u0443\u0433\u0430\u043c\u0438.", "Open": "\u041e\u0442\u043a\u0440\u044b\u0442\u044c", "Play": "\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438", @@ -111,15 +106,23 @@ "Shuffle": "\u041f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u0442\u044c", "Identify": "\u0420\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0442\u044c", "EditImages": "\u041f\u0440\u0430\u0432\u0438\u0442\u044c \u0440\u0438\u0441\u0443\u043d\u043a\u0438", - "EditInfo": "Edit Info", + "EditInfo": "\u041f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f", "Sync": "\u0421\u0438\u043d\u0445\u0440\u043e", "InstantMix": "\u0410\u0432\u0442\u043e\u043c\u0438\u043a\u0441", "ViewAlbum": "\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0430\u043b\u044c\u0431\u043e\u043c", "ViewArtist": "\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044f", "QueueAllFromHere": "\u0412 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0432\u0441\u0435 \u043e\u0442\u0441\u044e\u0434\u0430", "PlayAllFromHere": "\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u0432\u0441\u0435 \u043e\u0442\u0441\u044e\u0434\u0430", - "PlayFromBeginning": "Play from beginning", - "ResumeAt": "Resume from {0}", - "RemoveFromPlaylist": "Remove from Playlist", - "Trailer": "Trailer" + "PlayFromBeginning": "\u0412\u043e\u0441\u043f\u0440. \u0441 \u043d\u0430\u0447\u0430\u043b\u0430", + "ResumeAt": "\u0412\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441 {0}", + "RemoveFromPlaylist": "\u0418\u0437\u044a\u044f\u0442\u044c \u0438\u0437 \u043f\u043b\u0435\u0439-\u043b\u0438\u0441\u0442\u0430", + "Trailer": "\u0422\u0440\u0435\u0439\u043b\u0435\u0440", + "MarkPlayed": "\u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043a\u0430\u043a \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0451\u043d\u043d\u043e\u0435", + "MarkUnplayed": "\u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043a\u0430\u043a \u043d\u0435\u0432\u043e\u0441\u043f\u0440-\u043e\u0435", + "GroupVersions": "\u0421\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u0438", + "PleaseSelectTwoItems": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0445\u043e\u0442\u044f \u0431\u044b \u0434\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.", + "TheSelectedItemsWillBeGrouped": "\u0412\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0432\u0438\u0434\u0435\u043e \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u043e\u0434\u0438\u043d \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442. \u0412 Emby-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u0431\u0443\u0434\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0434\u043b\u044f \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c\u0430\u044f \u043f\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443 \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441\u0435\u0442\u0438. \u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c?", + "TryMultiSelect": "\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043d\u0435\u0441\u0432\u044f\u0437\u043d\u043e\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435", + "TryMultiSelectMessage": "\u0427\u0442\u043e\u0431\u044b \u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0440\u043e\u0441\u0442\u043e \u0449\u0451\u043b\u043a\u043d\u0438\u0442\u0435 \u0438 \u0443\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0439\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443 \u043c\u044b\u0448\u0438 \u043d\u0430 \u043b\u044e\u0431\u043e\u043c \u043f\u043e\u0441\u0442\u0435\u0440\u0435 \u0438 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u0435 \u0442\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u044d\u0442\u043e!", + "Error": "\u041e\u0448\u0438\u0431\u043a\u0430" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/sv.json b/dashboard-ui/bower_components/emby-webcomponents/strings/sv.json index aaa8b7ac2..49b763441 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/sv.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/sv.json @@ -1,8 +1,6 @@ { - "EditInfo": "Edit Info", - "RemoveFromPlaylist": "Remove from Playlist", - "PlayFromBeginning": "Play from beginning", - "ResumeAt": "Resume from {0}", + "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", + "MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?", "ValueSpecialEpisodeName": "Specialavsnitt - {0}", "Share": "Dela", "ServerUpdateNeeded": "Den h\u00e4r Emby servern beh\u00f6ver uppdateras. F\u00f6r att ladda ner senaste versionen, g\u00e5 till {0}", @@ -101,7 +99,6 @@ "Favorite": "Favorit", "Like": "Gilla", "Dislike": "Ogilla", - "Played": "Visad", "RefreshDialogHelp": "Metadata uppdateras baserat p\u00e5 inst\u00e4llningar och internettj\u00e4nster som har aktiverats under Emby servers kontrollpanel.", "Open": "\u00d6ppna", "Play": "Spela", @@ -109,10 +106,23 @@ "Shuffle": "Blanda", "Identify": "Identifiera", "EditImages": "\u00c4ndra bilder", + "EditInfo": "Edit Info", "Sync": "Synk", "InstantMix": "Instant mix", "ViewAlbum": "Bl\u00e4ddra album", "ViewArtist": "Bl\u00e4ddra artist", "QueueAllFromHere": "K\u00f6a alla h\u00e4rifr\u00e5n", - "PlayAllFromHere": "Spela upp alla h\u00e4rifr\u00e5n" + "PlayAllFromHere": "Spela upp alla h\u00e4rifr\u00e5n", + "PlayFromBeginning": "Play from beginning", + "ResumeAt": "Resume from {0}", + "RemoveFromPlaylist": "Remove from Playlist", + "Trailer": "Trailer", + "MarkPlayed": "Mark Played", + "MarkUnplayed": "Mark Unplayed", + "GroupVersions": "Group Versions", + "PleaseSelectTwoItems": "Please select at least two items.", + "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", + "TryMultiSelect": "Try Multi-Select", + "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", + "Error": "Error" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/zh-TW.json b/dashboard-ui/bower_components/emby-webcomponents/strings/zh-TW.json index 13a2dee9f..869aaddcb 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/zh-TW.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/zh-TW.json @@ -1,10 +1,6 @@ { - "MarkPlayed": "Mark Played", - "MarkUnplayed": "Mark Unplayed", - "GroupVersions": "Group Versions", - "PleaseSelectTwoItems": "Please select at least two items.", - "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", - "Error": "Error", + "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", + "MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?", "ValueSpecialEpisodeName": "Special - {0}", "Share": "\u5206\u4eab", "ServerUpdateNeeded": "\u6b64Emby\u4f3a\u670d\u5668\u9700\u8981\u66f4\u65b0\uff0c\u8acb\u81f3{0}\u53d6\u5f97\u6700\u65b0\u7248\u672c", @@ -103,7 +99,6 @@ "Favorite": "Favorite", "Like": "Like", "Dislike": "Dislike", - "Played": "Played", "RefreshDialogHelp": "\u8a73\u7d30\u8cc7\u6599\u7684\u66f4\u65b0\u65b9\u5f0f\u6703\u4f9d\u64daEmby\u7684\u8a2d\u5b9a\u53ca\u5df2\u7d93\u555f\u7528\u7684\u7db2\u8def\u670d\u52d9\u4f86\u9032\u884c", "Open": "Open", "Play": "Play", @@ -121,5 +116,13 @@ "PlayFromBeginning": "Play from beginning", "ResumeAt": "Resume from {0}", "RemoveFromPlaylist": "Remove from Playlist", - "Trailer": "Trailer" + "Trailer": "Trailer", + "MarkPlayed": "Mark Played", + "MarkUnplayed": "Mark Unplayed", + "GroupVersions": "Group Versions", + "PleaseSelectTwoItems": "Please select at least two items.", + "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", + "TryMultiSelect": "Try Multi-Select", + "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", + "Error": "Error" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/voice/voicedialog.js b/dashboard-ui/bower_components/emby-webcomponents/voice/voicedialog.js index dee43a6dd..b394f8242 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/voice/voicedialog.js +++ b/dashboard-ui/bower_components/emby-webcomponents/voice/voicedialog.js @@ -111,7 +111,7 @@ define(['dialogHelper', './voicereceiver', './voiceprocessor', 'globalize', 'emb dlg.classList.add('formDialog'); var html = ''; - html += '
'; + html += '
'; html += ''; html += '
'; //html += title; @@ -120,7 +120,7 @@ define(['dialogHelper', './voicereceiver', './voiceprocessor', 'globalize', 'emb html += '
'; - html += '
'; + html += '
'; html += '
'; html += '
'; From a694661cc13b1fc64225b7c19817626c5a0fbabf Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Tue, 19 Jul 2016 16:23:28 -0400 Subject: [PATCH 3/5] update playlist drag and drop --- .../bower_components/Sortable/Sortable.js | 1249 ----------------- .../Sortable/meteor/.versions | 34 - .../example/.meteor/.finished-upgraders | 8 - .../meteor/example/.meteor/.gitignore | 1 - .../Sortable/meteor/example/.meteor/.id | 7 - .../Sortable/meteor/example/.meteor/packages | 10 - .../Sortable/meteor/example/.meteor/platforms | 2 - .../Sortable/meteor/example/.meteor/release | 1 - .../Sortable/meteor/example/.meteor/versions | 53 - .../example/client/define-object-type.css | 57 - .../example/client/define-object-type.html | 94 -- .../example/client/define-object-type.js | 101 -- .../Sortable/meteor/example/model.js | 2 - .../Sortable/meteor/example/run.bat | 7 - .../Sortable/meteor/example/run.sh | 5 - .../meteor/example/server/fixtures.js | 75 - .../example/server/sortable-collections.js | 3 - .../Sortable/meteor/methods-client.js | 16 - .../Sortable/meteor/methods-server.js | 31 - .../Sortable/meteor/package.js | 85 -- .../Sortable/meteor/publish.sh | 26 - .../Sortable/meteor/reactivize.js | 201 --- .../Sortable/meteor/runtests.bat | 8 - .../Sortable/meteor/runtests.sh | 35 - .../Sortable/meteor/template.html | 5 - .../bower_components/Sortable/meteor/test.js | 9 - .../bower_components/Sortable/st/app.css | 239 ---- .../bower_components/Sortable/st/app.js | 226 --- .../bower_components/Sortable/st/face-01.jpg | Bin 3172 -> 0 bytes .../bower_components/Sortable/st/face-02.jpg | Bin 4445 -> 0 bytes .../bower_components/Sortable/st/face-03.jpg | Bin 2907 -> 0 bytes .../bower_components/Sortable/st/face-04.jpg | Bin 4163 -> 0 bytes .../bower_components/Sortable/st/face-05.jpg | Bin 3883 -> 0 bytes .../bower_components/Sortable/st/face-06.jpg | Bin 3273 -> 0 bytes .../bower_components/Sortable/st/face-07.jpg | Bin 3867 -> 0 bytes .../bower_components/Sortable/st/face-08.jpg | Bin 3354 -> 0 bytes .../bower_components/Sortable/st/face-09.jpg | Bin 4724 -> 0 bytes .../Sortable/st/iframe/frame.html | 32 - .../Sortable/st/iframe/index.html | 49 - .../bower_components/Sortable/st/logo.png | Bin 5062 -> 0 bytes .../bower_components/Sortable/st/og-image.png | Bin 12039 -> 0 bytes .../emby-itemscontainer.js | 73 +- dashboard-ui/scripts/playlistedit.js | 45 +- 43 files changed, 74 insertions(+), 2715 deletions(-) delete mode 100644 dashboard-ui/bower_components/Sortable/Sortable.js delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/.versions delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/example/.meteor/.finished-upgraders delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/example/.meteor/.gitignore delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/example/.meteor/.id delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/example/.meteor/packages delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/example/.meteor/platforms delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/example/.meteor/release delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/example/.meteor/versions delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/example/client/define-object-type.css delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/example/client/define-object-type.html delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/example/client/define-object-type.js delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/example/model.js delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/example/run.bat delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/example/run.sh delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/example/server/fixtures.js delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/example/server/sortable-collections.js delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/methods-client.js delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/methods-server.js delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/package.js delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/publish.sh delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/reactivize.js delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/runtests.bat delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/runtests.sh delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/template.html delete mode 100644 dashboard-ui/bower_components/Sortable/meteor/test.js delete mode 100644 dashboard-ui/bower_components/Sortable/st/app.css delete mode 100644 dashboard-ui/bower_components/Sortable/st/app.js delete mode 100644 dashboard-ui/bower_components/Sortable/st/face-01.jpg delete mode 100644 dashboard-ui/bower_components/Sortable/st/face-02.jpg delete mode 100644 dashboard-ui/bower_components/Sortable/st/face-03.jpg delete mode 100644 dashboard-ui/bower_components/Sortable/st/face-04.jpg delete mode 100644 dashboard-ui/bower_components/Sortable/st/face-05.jpg delete mode 100644 dashboard-ui/bower_components/Sortable/st/face-06.jpg delete mode 100644 dashboard-ui/bower_components/Sortable/st/face-07.jpg delete mode 100644 dashboard-ui/bower_components/Sortable/st/face-08.jpg delete mode 100644 dashboard-ui/bower_components/Sortable/st/face-09.jpg delete mode 100644 dashboard-ui/bower_components/Sortable/st/iframe/frame.html delete mode 100644 dashboard-ui/bower_components/Sortable/st/iframe/index.html delete mode 100644 dashboard-ui/bower_components/Sortable/st/logo.png delete mode 100644 dashboard-ui/bower_components/Sortable/st/og-image.png diff --git a/dashboard-ui/bower_components/Sortable/Sortable.js b/dashboard-ui/bower_components/Sortable/Sortable.js deleted file mode 100644 index f4ac38dff..000000000 --- a/dashboard-ui/bower_components/Sortable/Sortable.js +++ /dev/null @@ -1,1249 +0,0 @@ -/**! - * Sortable - * @author RubaXa - * @license MIT - */ - - -(function (factory) { - "use strict"; - - if (typeof define === "function" && define.amd) { - define(factory); - } - else if (typeof module != "undefined" && typeof module.exports != "undefined") { - module.exports = factory(); - } - else if (typeof Package !== "undefined") { - Sortable = factory(); // export for Meteor.js - } - else { - /* jshint sub:true */ - window["Sortable"] = factory(); - } -})(function () { - "use strict"; - - var dragEl, - parentEl, - ghostEl, - cloneEl, - rootEl, - nextEl, - - scrollEl, - scrollParentEl, - - lastEl, - lastCSS, - lastParentCSS, - - oldIndex, - newIndex, - - activeGroup, - autoScroll = {}, - - tapEvt, - touchEvt, - - moved, - - /** @const */ - RSPACE = /\s+/g, - - expando = 'Sortable' + (new Date).getTime(), - - win = window, - document = win.document, - parseInt = win.parseInt, - - supportDraggable = !!('draggable' in document.createElement('div')), - supportCssPointerEvents = (function (el) { - el = document.createElement('x'); - el.style.cssText = 'pointer-events:auto'; - return el.style.pointerEvents === 'auto'; - })(), - - _silent = false, - - abs = Math.abs, - slice = [].slice, - - touchDragOverListeners = [], - - _autoScroll = _throttle(function (/**Event*/evt, /**Object*/options, /**HTMLElement*/rootEl) { - // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521 - if (rootEl && options.scroll) { - var el, - rect, - sens = options.scrollSensitivity, - speed = options.scrollSpeed, - - x = evt.clientX, - y = evt.clientY, - - winWidth = window.innerWidth, - winHeight = window.innerHeight, - - vx, - vy - ; - - // Delect scrollEl - if (scrollParentEl !== rootEl) { - scrollEl = options.scroll; - scrollParentEl = rootEl; - - if (scrollEl === true) { - scrollEl = rootEl; - - do { - if ((scrollEl.offsetWidth < scrollEl.scrollWidth) || - (scrollEl.offsetHeight < scrollEl.scrollHeight) - ) { - break; - } - /* jshint boss:true */ - } while (scrollEl = scrollEl.parentNode); - } - } - - if (scrollEl) { - el = scrollEl; - rect = scrollEl.getBoundingClientRect(); - vx = (abs(rect.right - x) <= sens) - (abs(rect.left - x) <= sens); - vy = (abs(rect.bottom - y) <= sens) - (abs(rect.top - y) <= sens); - } - - - if (!(vx || vy)) { - vx = (winWidth - x <= sens) - (x <= sens); - vy = (winHeight - y <= sens) - (y <= sens); - - /* jshint expr:true */ - (vx || vy) && (el = win); - } - - - if (autoScroll.vx !== vx || autoScroll.vy !== vy || autoScroll.el !== el) { - autoScroll.el = el; - autoScroll.vx = vx; - autoScroll.vy = vy; - - clearInterval(autoScroll.pid); - - if (el) { - autoScroll.pid = setInterval(function () { - if (el === win) { - win.scrollTo(win.pageXOffset + vx * speed, win.pageYOffset + vy * speed); - } else { - vy && (el.scrollTop += vy * speed); - vx && (el.scrollLeft += vx * speed); - } - }, 24); - } - } - } - }, 30), - - _prepareGroup = function (options) { - var group = options.group; - - if (!group || typeof group != 'object') { - group = options.group = {name: group}; - } - - ['pull', 'put'].forEach(function (key) { - if (!(key in group)) { - group[key] = true; - } - }); - - options.groups = ' ' + group.name + (group.put.join ? ' ' + group.put.join(' ') : '') + ' '; - } - ; - - - - /** - * @class Sortable - * @param {HTMLElement} el - * @param {Object} [options] - */ - function Sortable(el, options) { - if (!(el && el.nodeType && el.nodeType === 1)) { - throw 'Sortable: `el` must be HTMLElement, and not ' + {}.toString.call(el); - } - - this.el = el; // root element - this.options = options = _extend({}, options); - - - // Export instance - el[expando] = this; - - - // Default options - var defaults = { - group: Math.random(), - sort: true, - disabled: false, - store: null, - handle: null, - scroll: true, - scrollSensitivity: 30, - scrollSpeed: 10, - draggable: /[uo]l/i.test(el.nodeName) ? 'li' : '>*', - ghostClass: 'sortable-ghost', - chosenClass: 'sortable-chosen', - ignore: 'a, img', - filter: null, - animation: 0, - setData: function (dataTransfer, dragEl) { - dataTransfer.setData('Text', dragEl.textContent); - }, - dropBubble: false, - dragoverBubble: false, - dataIdAttr: 'data-id', - delay: 0, - forceFallback: false, - fallbackClass: 'sortable-fallback', - fallbackOnBody: false - }; - - - // Set default options - for (var name in defaults) { - !(name in options) && (options[name] = defaults[name]); - } - - _prepareGroup(options); - - // Bind all private methods - for (var fn in this) { - if (fn.charAt(0) === '_') { - this[fn] = this[fn].bind(this); - } - } - - // Setup drag mode - this.nativeDraggable = options.forceFallback ? false : supportDraggable; - - // Bind events - _on(el, 'mousedown', this._onTapStart); - _on(el, 'touchstart', this._onTapStart); - - if (this.nativeDraggable) { - _on(el, 'dragover', this); - _on(el, 'dragenter', this); - } - - touchDragOverListeners.push(this._onDragOver); - - // Restore sorting - options.store && this.sort(options.store.get(this)); - } - - - Sortable.prototype = /** @lends Sortable.prototype */ { - constructor: Sortable, - - _onTapStart: function (/** Event|TouchEvent */evt) { - var _this = this, - el = this.el, - options = this.options, - type = evt.type, - touch = evt.touches && evt.touches[0], - target = (touch || evt).target, - originalTarget = target, - filter = options.filter; - - - if (type === 'mousedown' && evt.button !== 0 || options.disabled) { - return; // only left button or enabled - } - - target = _closest(target, options.draggable, el); - - if (!target) { - return; - } - - // get the index of the dragged element within its parent - oldIndex = _index(target); - - // Check filter - if (typeof filter === 'function') { - if (filter.call(this, evt, target, this)) { - _dispatchEvent(_this, originalTarget, 'filter', target, el, oldIndex); - evt.preventDefault(); - return; // cancel dnd - } - } - else if (filter) { - filter = filter.split(',').some(function (criteria) { - criteria = _closest(originalTarget, criteria.trim(), el); - - if (criteria) { - _dispatchEvent(_this, criteria, 'filter', target, el, oldIndex); - return true; - } - }); - - if (filter) { - evt.preventDefault(); - return; // cancel dnd - } - } - - - if (options.handle && !_closest(originalTarget, options.handle, el)) { - return; - } - - - // Prepare `dragstart` - this._prepareDragStart(evt, touch, target); - }, - - _prepareDragStart: function (/** Event */evt, /** Touch */touch, /** HTMLElement */target) { - var _this = this, - el = _this.el, - options = _this.options, - ownerDocument = el.ownerDocument, - dragStartFn; - - if (target && !dragEl && (target.parentNode === el)) { - tapEvt = evt; - - rootEl = el; - dragEl = target; - parentEl = dragEl.parentNode; - nextEl = dragEl.nextSibling; - activeGroup = options.group; - - dragStartFn = function () { - // Delayed drag has been triggered - // we can re-enable the events: touchmove/mousemove - _this._disableDelayedDrag(); - - // Make the element draggable - dragEl.draggable = true; - - // Chosen item - _toggleClass(dragEl, _this.options.chosenClass, true); - - // Bind the events: dragstart/dragend - _this._triggerDragStart(touch); - }; - - // Disable "draggable" - options.ignore.split(',').forEach(function (criteria) { - _find(dragEl, criteria.trim(), _disableDraggable); - }); - - _on(ownerDocument, 'mouseup', _this._onDrop); - _on(ownerDocument, 'touchend', _this._onDrop); - _on(ownerDocument, 'touchcancel', _this._onDrop); - - if (options.delay) { - // If the user moves the pointer or let go the click or touch - // before the delay has been reached: - // disable the delayed drag - _on(ownerDocument, 'mouseup', _this._disableDelayedDrag); - _on(ownerDocument, 'touchend', _this._disableDelayedDrag); - _on(ownerDocument, 'touchcancel', _this._disableDelayedDrag); - _on(ownerDocument, 'mousemove', _this._disableDelayedDrag); - _on(ownerDocument, 'touchmove', _this._disableDelayedDrag); - - _this._dragStartTimer = setTimeout(dragStartFn, options.delay); - } else { - dragStartFn(); - } - } - }, - - _disableDelayedDrag: function () { - var ownerDocument = this.el.ownerDocument; - - clearTimeout(this._dragStartTimer); - _off(ownerDocument, 'mouseup', this._disableDelayedDrag); - _off(ownerDocument, 'touchend', this._disableDelayedDrag); - _off(ownerDocument, 'touchcancel', this._disableDelayedDrag); - _off(ownerDocument, 'mousemove', this._disableDelayedDrag); - _off(ownerDocument, 'touchmove', this._disableDelayedDrag); - }, - - _triggerDragStart: function (/** Touch */touch) { - if (touch) { - // Touch device support - tapEvt = { - target: dragEl, - clientX: touch.clientX, - clientY: touch.clientY - }; - - this._onDragStart(tapEvt, 'touch'); - } - else if (!this.nativeDraggable) { - this._onDragStart(tapEvt, true); - } - else { - _on(dragEl, 'dragend', this); - _on(rootEl, 'dragstart', this._onDragStart); - } - - try { - if (document.selection) { - document.selection.empty(); - } else { - window.getSelection().removeAllRanges(); - } - } catch (err) { - } - }, - - _dragStarted: function () { - if (rootEl && dragEl) { - // Apply effect - _toggleClass(dragEl, this.options.ghostClass, true); - - Sortable.active = this; - - // Drag start event - _dispatchEvent(this, rootEl, 'start', dragEl, rootEl, oldIndex); - } - }, - - _emulateDragOver: function () { - if (touchEvt) { - if (this._lastX === touchEvt.clientX && this._lastY === touchEvt.clientY) { - return; - } - - this._lastX = touchEvt.clientX; - this._lastY = touchEvt.clientY; - - if (!supportCssPointerEvents) { - _css(ghostEl, 'display', 'none'); - } - - var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY), - parent = target, - groupName = ' ' + this.options.group.name + '', - i = touchDragOverListeners.length; - - if (parent) { - do { - if (parent[expando] && parent[expando].options.groups.indexOf(groupName) > -1) { - while (i--) { - touchDragOverListeners[i]({ - clientX: touchEvt.clientX, - clientY: touchEvt.clientY, - target: target, - rootEl: parent - }); - } - - break; - } - - target = parent; // store last element - } - /* jshint boss:true */ - while (parent = parent.parentNode); - } - - if (!supportCssPointerEvents) { - _css(ghostEl, 'display', ''); - } - } - }, - - - _onTouchMove: function (/**TouchEvent*/evt) { - if (tapEvt) { - // only set the status to dragging, when we are actually dragging - if (!Sortable.active) { - this._dragStarted(); - } - - // as well as creating the ghost element on the document body - this._appendGhost(); - - var touch = evt.touches ? evt.touches[0] : evt, - dx = touch.clientX - tapEvt.clientX, - dy = touch.clientY - tapEvt.clientY, - translate3d = evt.touches ? 'translate3d(' + dx + 'px,' + dy + 'px,0)' : 'translate(' + dx + 'px,' + dy + 'px)'; - - moved = true; - touchEvt = touch; - - _css(ghostEl, 'webkitTransform', translate3d); - _css(ghostEl, 'mozTransform', translate3d); - _css(ghostEl, 'msTransform', translate3d); - _css(ghostEl, 'transform', translate3d); - - evt.preventDefault(); - } - }, - - _appendGhost: function () { - if (!ghostEl) { - var rect = dragEl.getBoundingClientRect(), - css = _css(dragEl), - options = this.options, - ghostRect; - - ghostEl = dragEl.cloneNode(true); - - _toggleClass(ghostEl, options.ghostClass, false); - _toggleClass(ghostEl, options.fallbackClass, true); - - _css(ghostEl, 'top', rect.top - parseInt(css.marginTop, 10)); - _css(ghostEl, 'left', rect.left - parseInt(css.marginLeft, 10)); - _css(ghostEl, 'width', rect.width); - _css(ghostEl, 'height', rect.height); - _css(ghostEl, 'opacity', '0.8'); - _css(ghostEl, 'position', 'fixed'); - _css(ghostEl, 'zIndex', '100000'); - _css(ghostEl, 'pointerEvents', 'none'); - - options.fallbackOnBody && document.body.appendChild(ghostEl) || rootEl.appendChild(ghostEl); - - // Fixing dimensions. - ghostRect = ghostEl.getBoundingClientRect(); - _css(ghostEl, 'width', rect.width * 2 - ghostRect.width); - _css(ghostEl, 'height', rect.height * 2 - ghostRect.height); - } - }, - - _onDragStart: function (/**Event*/evt, /**boolean*/useFallback) { - var dataTransfer = evt.dataTransfer, - options = this.options; - - this._offUpEvents(); - - if (activeGroup.pull == 'clone') { - cloneEl = dragEl.cloneNode(true); - _css(cloneEl, 'display', 'none'); - rootEl.insertBefore(cloneEl, dragEl); - } - - if (useFallback) { - - if (useFallback === 'touch') { - // Bind touch events - _on(document, 'touchmove', this._onTouchMove); - _on(document, 'touchend', this._onDrop); - _on(document, 'touchcancel', this._onDrop); - } else { - // Old brwoser - _on(document, 'mousemove', this._onTouchMove); - _on(document, 'mouseup', this._onDrop); - } - - this._loopId = setInterval(this._emulateDragOver, 50); - } - else { - if (dataTransfer) { - dataTransfer.effectAllowed = 'move'; - options.setData && options.setData.call(this, dataTransfer, dragEl); - } - - _on(document, 'drop', this); - setTimeout(this._dragStarted, 0); - } - }, - - _onDragOver: function (/**Event*/evt) { - var el = this.el, - target, - dragRect, - revert, - options = this.options, - group = options.group, - groupPut = group.put, - isOwner = (activeGroup === group), - canSort = options.sort; - - if (evt.preventDefault !== void 0) { - evt.preventDefault(); - !options.dragoverBubble && evt.stopPropagation(); - } - - moved = true; - - if (activeGroup && !options.disabled && - (isOwner - ? canSort || (revert = !rootEl.contains(dragEl)) // Reverting item into the original list - : activeGroup.pull && groupPut && ( - (activeGroup.name === group.name) || // by Name - (groupPut.indexOf && ~groupPut.indexOf(activeGroup.name)) // by Array - ) - ) && - (evt.rootEl === void 0 || evt.rootEl === this.el) // touch fallback - ) { - // Smart auto-scrolling - _autoScroll(evt, options, this.el); - - if (_silent) { - return; - } - - target = _closest(evt.target, options.draggable, el); - dragRect = dragEl.getBoundingClientRect(); - - if (revert) { - _cloneHide(true); - - if (cloneEl || nextEl) { - rootEl.insertBefore(dragEl, cloneEl || nextEl); - } - else if (!canSort) { - rootEl.appendChild(dragEl); - } - - return; - } - - - if ((el.children.length === 0) || (el.children[0] === ghostEl) || - (el === evt.target) && (target = _ghostIsLast(el, evt)) - ) { - - if (target) { - if (target.animated) { - return; - } - - targetRect = target.getBoundingClientRect(); - } - - _cloneHide(isOwner); - - if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect) !== false) { - if (!dragEl.contains(el)) { - el.appendChild(dragEl); - parentEl = el; // actualization - } - - this._animate(dragRect, dragEl); - target && this._animate(targetRect, target); - } - } - else if (target && !target.animated && target !== dragEl && (target.parentNode[expando] !== void 0)) { - if (lastEl !== target) { - lastEl = target; - lastCSS = _css(target); - lastParentCSS = _css(target.parentNode); - } - - - var targetRect = target.getBoundingClientRect(), - width = targetRect.right - targetRect.left, - height = targetRect.bottom - targetRect.top, - floating = /left|right|inline/.test(lastCSS.cssFloat + lastCSS.display) - || (lastParentCSS.display == 'flex' && lastParentCSS['flex-direction'].indexOf('row') === 0), - isWide = (target.offsetWidth > dragEl.offsetWidth), - isLong = (target.offsetHeight > dragEl.offsetHeight), - halfway = (floating ? (evt.clientX - targetRect.left) / width : (evt.clientY - targetRect.top) / height) > 0.5, - nextSibling = target.nextElementSibling, - moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect), - after - ; - - if (moveVector !== false) { - _silent = true; - setTimeout(_unsilent, 30); - - _cloneHide(isOwner); - - if (moveVector === 1 || moveVector === -1) { - after = (moveVector === 1); - } - else if (floating) { - var elTop = dragEl.offsetTop, - tgTop = target.offsetTop; - - if (elTop === tgTop) { - after = (target.previousElementSibling === dragEl) && !isWide || halfway && isWide; - } else { - after = tgTop > elTop; - } - } else { - after = (nextSibling !== dragEl) && !isLong || halfway && isLong; - } - - if (!dragEl.contains(el)) { - if (after && !nextSibling) { - el.appendChild(dragEl); - } else { - target.parentNode.insertBefore(dragEl, after ? nextSibling : target); - } - } - - parentEl = dragEl.parentNode; // actualization - - this._animate(dragRect, dragEl); - this._animate(targetRect, target); - } - } - } - }, - - _animate: function (prevRect, target) { - var ms = this.options.animation; - - if (ms) { - var currentRect = target.getBoundingClientRect(); - - _css(target, 'transition', 'none'); - _css(target, 'transform', 'translate3d(' - + (prevRect.left - currentRect.left) + 'px,' - + (prevRect.top - currentRect.top) + 'px,0)' - ); - - target.offsetWidth; // repaint - - _css(target, 'transition', 'all ' + ms + 'ms'); - _css(target, 'transform', 'translate3d(0,0,0)'); - - clearTimeout(target.animated); - target.animated = setTimeout(function () { - _css(target, 'transition', ''); - _css(target, 'transform', ''); - target.animated = false; - }, ms); - } - }, - - _offUpEvents: function () { - var ownerDocument = this.el.ownerDocument; - - _off(document, 'touchmove', this._onTouchMove); - _off(ownerDocument, 'mouseup', this._onDrop); - _off(ownerDocument, 'touchend', this._onDrop); - _off(ownerDocument, 'touchcancel', this._onDrop); - }, - - _onDrop: function (/**Event*/evt) { - var el = this.el, - options = this.options; - - clearInterval(this._loopId); - clearInterval(autoScroll.pid); - clearTimeout(this._dragStartTimer); - - // Unbind events - _off(document, 'mousemove', this._onTouchMove); - - if (this.nativeDraggable) { - _off(document, 'drop', this); - _off(el, 'dragstart', this._onDragStart); - } - - this._offUpEvents(); - - if (evt) { - if (moved) { - evt.preventDefault(); - !options.dropBubble && evt.stopPropagation(); - } - - ghostEl && ghostEl.parentNode.removeChild(ghostEl); - - if (dragEl) { - if (this.nativeDraggable) { - _off(dragEl, 'dragend', this); - } - - _disableDraggable(dragEl); - - // Remove class's - _toggleClass(dragEl, this.options.ghostClass, false); - _toggleClass(dragEl, this.options.chosenClass, false); - - if (rootEl !== parentEl) { - newIndex = _index(dragEl); - - if (newIndex >= 0) { - // drag from one list and drop into another - _dispatchEvent(null, parentEl, 'sort', dragEl, rootEl, oldIndex, newIndex); - _dispatchEvent(this, rootEl, 'sort', dragEl, rootEl, oldIndex, newIndex); - - // Add event - _dispatchEvent(null, parentEl, 'add', dragEl, rootEl, oldIndex, newIndex); - - // Remove event - _dispatchEvent(this, rootEl, 'remove', dragEl, rootEl, oldIndex, newIndex); - } - } - else { - // Remove clone - cloneEl && cloneEl.parentNode.removeChild(cloneEl); - - if (dragEl.nextSibling !== nextEl) { - // Get the index of the dragged element within its parent - newIndex = _index(dragEl); - - if (newIndex >= 0) { - // drag & drop within the same list - _dispatchEvent(this, rootEl, 'update', dragEl, rootEl, oldIndex, newIndex); - _dispatchEvent(this, rootEl, 'sort', dragEl, rootEl, oldIndex, newIndex); - } - } - } - - if (Sortable.active) { - if (newIndex === null || newIndex === -1) { - newIndex = oldIndex; - } - - _dispatchEvent(this, rootEl, 'end', dragEl, rootEl, oldIndex, newIndex); - - // Save sorting - this.save(); - } - } - - // Nulling - rootEl = - dragEl = - parentEl = - ghostEl = - nextEl = - cloneEl = - - scrollEl = - scrollParentEl = - - tapEvt = - touchEvt = - - moved = - newIndex = - - lastEl = - lastCSS = - - activeGroup = - Sortable.active = null; - } - }, - - - handleEvent: function (/**Event*/evt) { - var type = evt.type; - - if (type === 'dragover' || type === 'dragenter') { - if (dragEl) { - this._onDragOver(evt); - _globalDragOver(evt); - } - } - else if (type === 'drop' || type === 'dragend') { - this._onDrop(evt); - } - }, - - - /** - * Serializes the item into an array of string. - * @returns {String[]} - */ - toArray: function () { - var order = [], - el, - children = this.el.children, - i = 0, - n = children.length, - options = this.options; - - for (; i < n; i++) { - el = children[i]; - if (_closest(el, options.draggable, this.el)) { - order.push(el.getAttribute(options.dataIdAttr) || _generateId(el)); - } - } - - return order; - }, - - - /** - * Sorts the elements according to the array. - * @param {String[]} order order of the items - */ - sort: function (order) { - var items = {}, rootEl = this.el; - - this.toArray().forEach(function (id, i) { - var el = rootEl.children[i]; - - if (_closest(el, this.options.draggable, rootEl)) { - items[id] = el; - } - }, this); - - order.forEach(function (id) { - if (items[id]) { - rootEl.removeChild(items[id]); - rootEl.appendChild(items[id]); - } - }); - }, - - - /** - * Save the current sorting - */ - save: function () { - var store = this.options.store; - store && store.set(this); - }, - - - /** - * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree. - * @param {HTMLElement} el - * @param {String} [selector] default: `options.draggable` - * @returns {HTMLElement|null} - */ - closest: function (el, selector) { - return _closest(el, selector || this.options.draggable, this.el); - }, - - - /** - * Set/get option - * @param {string} name - * @param {*} [value] - * @returns {*} - */ - option: function (name, value) { - var options = this.options; - - if (value === void 0) { - return options[name]; - } else { - options[name] = value; - - if (name === 'group') { - _prepareGroup(options); - } - } - }, - - - /** - * Destroy - */ - destroy: function () { - var el = this.el; - - el[expando] = null; - - _off(el, 'mousedown', this._onTapStart); - _off(el, 'touchstart', this._onTapStart); - - if (this.nativeDraggable) { - _off(el, 'dragover', this); - _off(el, 'dragenter', this); - } - - // Remove draggable attributes - Array.prototype.forEach.call(el.querySelectorAll('[draggable]'), function (el) { - el.removeAttribute('draggable'); - }); - - touchDragOverListeners.splice(touchDragOverListeners.indexOf(this._onDragOver), 1); - - this._onDrop(); - - this.el = el = null; - } - }; - - - function _cloneHide(state) { - if (cloneEl && (cloneEl.state !== state)) { - _css(cloneEl, 'display', state ? 'none' : ''); - !state && cloneEl.state && rootEl.insertBefore(cloneEl, dragEl); - cloneEl.state = state; - } - } - - - function _closest(/**HTMLElement*/el, /**String*/selector, /**HTMLElement*/ctx) { - if (el) { - ctx = ctx || document; - selector = selector.split('.'); - - var tag = selector.shift().toUpperCase(), - re = new RegExp('\\s(' + selector.join('|') + ')(?=\\s)', 'g'); - - do { - if ( - (tag === '>*' && el.parentNode === ctx) || ( - (tag === '' || el.nodeName.toUpperCase() == tag) && - (!selector.length || ((' ' + el.className + ' ').match(re) || []).length == selector.length) - ) - ) { - return el; - } - } - while (el !== ctx && (el = el.parentNode)); - } - - return null; - } - - - function _globalDragOver(/**Event*/evt) { - if (evt.dataTransfer) { - evt.dataTransfer.dropEffect = 'move'; - } - evt.preventDefault(); - } - - - function _on(el, event, fn) { - el.addEventListener(event, fn, false); - } - - - function _off(el, event, fn) { - el.removeEventListener(event, fn, false); - } - - - function _toggleClass(el, name, state) { - if (el) { - if (el.classList) { - el.classList[state ? 'add' : 'remove'](name); - } - else { - var className = (' ' + el.className + ' ').replace(RSPACE, ' ').replace(' ' + name + ' ', ' '); - el.className = (className + (state ? ' ' + name : '')).replace(RSPACE, ' '); - } - } - } - - - function _css(el, prop, val) { - var style = el && el.style; - - if (style) { - if (val === void 0) { - if (document.defaultView && document.defaultView.getComputedStyle) { - val = document.defaultView.getComputedStyle(el, ''); - } - else if (el.currentStyle) { - val = el.currentStyle; - } - - return prop === void 0 ? val : val[prop]; - } - else { - if (!(prop in style)) { - prop = '-webkit-' + prop; - } - - style[prop] = val + (typeof val === 'string' ? '' : 'px'); - } - } - } - - - function _find(ctx, tagName, iterator) { - if (ctx) { - var list = ctx.getElementsByTagName(tagName), i = 0, n = list.length; - - if (iterator) { - for (; i < n; i++) { - iterator(list[i], i); - } - } - - return list; - } - - return []; - } - - - - function _dispatchEvent(sortable, rootEl, name, targetEl, fromEl, startIndex, newIndex) { - var evt = document.createEvent('Event'), - options = (sortable || rootEl[expando]).options, - onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1); - - evt.initEvent(name, true, true); - - evt.to = rootEl; - evt.from = fromEl || rootEl; - evt.item = targetEl || rootEl; - evt.clone = cloneEl; - - evt.oldIndex = startIndex; - evt.newIndex = newIndex; - - rootEl.dispatchEvent(evt); - - if (options[onName]) { - options[onName].call(sortable, evt); - } - } - - - function _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect) { - var evt, - sortable = fromEl[expando], - onMoveFn = sortable.options.onMove, - retVal; - - evt = document.createEvent('Event'); - evt.initEvent('move', true, true); - - evt.to = toEl; - evt.from = fromEl; - evt.dragged = dragEl; - evt.draggedRect = dragRect; - evt.related = targetEl || toEl; - evt.relatedRect = targetRect || toEl.getBoundingClientRect(); - - fromEl.dispatchEvent(evt); - - if (onMoveFn) { - retVal = onMoveFn.call(sortable, evt); - } - - return retVal; - } - - - function _disableDraggable(el) { - el.draggable = false; - } - - - function _unsilent() { - _silent = false; - } - - - /** @returns {HTMLElement|false} */ - function _ghostIsLast(el, evt) { - var lastEl = el.lastElementChild, - rect = lastEl.getBoundingClientRect(); - - return ((evt.clientY - (rect.top + rect.height) > 5) || (evt.clientX - (rect.right + rect.width) > 5)) && lastEl; // min delta - } - - - /** - * Generate id - * @param {HTMLElement} el - * @returns {String} - * @private - */ - function _generateId(el) { - var str = el.tagName + el.className + el.src + el.href + el.textContent, - i = str.length, - sum = 0; - - while (i--) { - sum += str.charCodeAt(i); - } - - return sum.toString(36); - } - - /** - * Returns the index of an element within its parent - * @param {HTMLElement} el - * @return {number} - */ - function _index(el) { - var index = 0; - - if (!el || !el.parentNode) { - return -1; - } - - while (el && (el = el.previousElementSibling)) { - if (el.nodeName.toUpperCase() !== 'TEMPLATE') { - index++; - } - } - - return index; - } - - function _throttle(callback, ms) { - var args, _this; - - return function () { - if (args === void 0) { - args = arguments; - _this = this; - - setTimeout(function () { - if (args.length === 1) { - callback.call(_this, args[0]); - } else { - callback.apply(_this, args); - } - - args = void 0; - }, ms); - } - }; - } - - function _extend(dst, src) { - if (dst && src) { - for (var key in src) { - if (src.hasOwnProperty(key)) { - dst[key] = src[key]; - } - } - } - - return dst; - } - - - // Export utils - Sortable.utils = { - on: _on, - off: _off, - css: _css, - find: _find, - is: function (el, selector) { - return !!_closest(el, selector, el); - }, - extend: _extend, - throttle: _throttle, - closest: _closest, - toggleClass: _toggleClass, - index: _index - }; - - - /** - * Create sortable instance - * @param {HTMLElement} el - * @param {Object} [options] - */ - Sortable.create = function (el, options) { - return new Sortable(el, options); - }; - - - // Export - Sortable.version = '1.4.2'; - return Sortable; -}); diff --git a/dashboard-ui/bower_components/Sortable/meteor/.versions b/dashboard-ui/bower_components/Sortable/meteor/.versions deleted file mode 100644 index 777e70ed9..000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/.versions +++ /dev/null @@ -1,34 +0,0 @@ -base64@1.0.3 -binary-heap@1.0.3 -blaze@2.1.2 -blaze-tools@1.0.3 -callback-hook@1.0.3 -check@1.0.5 -dburles:mongo-collection-instances@0.3.4 -ddp@1.1.0 -deps@1.0.7 -ejson@1.0.6 -geojson-utils@1.0.3 -html-tools@1.0.4 -htmljs@1.0.4 -id-map@1.0.3 -jquery@1.11.3_2 -json@1.0.3 -lai:collection-extensions@0.1.4 -local-test:rubaxa:sortable@1.2.1 -logging@1.0.7 -meteor@1.1.6 -minifiers@1.1.5 -minimongo@1.0.8 -mongo@1.1.0 -observe-sequence@1.0.6 -ordered-dict@1.0.3 -random@1.0.3 -reactive-var@1.0.5 -retry@1.0.3 -rubaxa:sortable@1.2.1 -spacebars-compiler@1.0.6 -templating@1.1.1 -tinytest@1.0.5 -tracker@1.0.7 -underscore@1.0.3 diff --git a/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/.finished-upgraders b/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/.finished-upgraders deleted file mode 100644 index 8a761038c..000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/.finished-upgraders +++ /dev/null @@ -1,8 +0,0 @@ -# This file contains information which helps Meteor properly upgrade your -# app when you run 'meteor update'. You should check it into version control -# with your project. - -notices-for-0.9.0 -notices-for-0.9.1 -0.9.4-platform-file -notices-for-facebook-graph-api-2 diff --git a/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/.gitignore b/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/.gitignore deleted file mode 100644 index 408303742..000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/.gitignore +++ /dev/null @@ -1 +0,0 @@ -local diff --git a/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/.id b/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/.id deleted file mode 100644 index b39baa1d8..000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/.id +++ /dev/null @@ -1,7 +0,0 @@ -# This file contains a token that is unique to your project. -# Check it into your repository along with the rest of this directory. -# It can be used for purposes such as: -# - ensuring you don't accidentally deploy one app on top of another -# - providing package authors with aggregated statistics - -ir0jg2douy3yo5mehw diff --git a/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/packages b/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/packages deleted file mode 100644 index 6f65fb7c4..000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/packages +++ /dev/null @@ -1,10 +0,0 @@ -# Meteor packages used by this project, one per line. -# -# 'meteor add' and 'meteor remove' will edit this file for you, -# but you can also edit it by hand. - -meteor-platform -autopublish -insecure -rubaxa:sortable -fezvrasta:bootstrap-material-design diff --git a/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/platforms b/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/platforms deleted file mode 100644 index 8a3a35f9f..000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/platforms +++ /dev/null @@ -1,2 +0,0 @@ -browser -server diff --git a/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/release b/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/release deleted file mode 100644 index 315c635bf..000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/release +++ /dev/null @@ -1 +0,0 @@ -METEOR@1.1.0.3 diff --git a/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/versions b/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/versions deleted file mode 100644 index a65be54d9..000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/example/.meteor/versions +++ /dev/null @@ -1,53 +0,0 @@ -autopublish@1.0.3 -autoupdate@1.2.1 -base64@1.0.3 -binary-heap@1.0.3 -blaze@2.1.2 -blaze-tools@1.0.3 -boilerplate-generator@1.0.3 -callback-hook@1.0.3 -check@1.0.5 -dburles:mongo-collection-instances@0.3.4 -ddp@1.1.0 -deps@1.0.7 -ejson@1.0.6 -fastclick@1.0.3 -fezvrasta:bootstrap-material-design@0.3.0 -geojson-utils@1.0.3 -html-tools@1.0.4 -htmljs@1.0.4 -http@1.1.0 -id-map@1.0.3 -insecure@1.0.3 -jquery@1.11.3_2 -json@1.0.3 -lai:collection-extensions@0.1.4 -launch-screen@1.0.2 -livedata@1.0.13 -logging@1.0.7 -meteor@1.1.6 -meteor-platform@1.2.2 -minifiers@1.1.5 -minimongo@1.0.8 -mobile-status-bar@1.0.3 -mongo@1.1.0 -observe-sequence@1.0.6 -ordered-dict@1.0.3 -random@1.0.3 -reactive-dict@1.1.0 -reactive-var@1.0.5 -reload@1.1.3 -retry@1.0.3 -routepolicy@1.0.5 -rubaxa:sortable@1.2.1 -session@1.1.0 -spacebars@1.0.6 -spacebars-compiler@1.0.6 -templating@1.1.1 -tracker@1.0.7 -twbs:bootstrap@3.3.5 -ui@1.0.6 -underscore@1.0.3 -url@1.0.4 -webapp@1.2.0 -webapp-hashing@1.0.3 diff --git a/dashboard-ui/bower_components/Sortable/meteor/example/client/define-object-type.css b/dashboard-ui/bower_components/Sortable/meteor/example/client/define-object-type.css deleted file mode 100644 index d67b4b1d7..000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/example/client/define-object-type.css +++ /dev/null @@ -1,57 +0,0 @@ -.glyphicon { - vertical-align: baseline; - font-size: 80%; - margin-right: 0.5em; -} - -[class^="mdi-"], [class*=" mdi-"] { - vertical-align: baseline; - font-size: 90%; - margin-right: 0.4em; -} - -.list-pair { - display: flex; /* use the flexbox model */ - flex-direction: row; -} -.sortable { -/* font-size: 2em;*/ -} - -.sortable.source { - /*background: #9FA8DA;*/ - flex: 0 0 auto; - margin-right: 1em; - cursor: move; - cursor: -webkit-grabbing; -} - -.sortable.target { - /*background: #3F51B5;*/ - flex: 1 1 auto; - margin-left: 1em; -} - -.target .well { - -} - -.sortable-handle { - cursor: move; - cursor: -webkit-grabbing; -} -.sortable-handle.pull-right { - margin-top: 0.3em; -} - -.sortable-ghost { - opacity: 0.6; -} - -/* show the remove button on hover */ -.removable .close { - display: none; -} -.removable:hover .close { - display: block; -} diff --git a/dashboard-ui/bower_components/Sortable/meteor/example/client/define-object-type.html b/dashboard-ui/bower_components/Sortable/meteor/example/client/define-object-type.html deleted file mode 100644 index d852cbcb5..000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/example/client/define-object-type.html +++ /dev/null @@ -1,94 +0,0 @@ - - Reactive RubaXa:Sortable for Meteor - - - - {{> navbar}} - -
- - - {{> typeDefinition}} -
- - - - - - - - \ No newline at end of file diff --git a/dashboard-ui/bower_components/Sortable/meteor/example/client/define-object-type.js b/dashboard-ui/bower_components/Sortable/meteor/example/client/define-object-type.js deleted file mode 100644 index ad2a19e2a..000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/example/client/define-object-type.js +++ /dev/null @@ -1,101 +0,0 @@ -// Define an object type by dragging together attributes - -Template.typeDefinition.helpers({ - types: function () { - return Types.find({}, { sort: { order: 1 } }); - }, - typesOptions: { - sortField: 'order', // defaults to 'order' anyway - group: { - name: 'typeDefinition', - pull: 'clone', - put: false - }, - sort: false // don't allow reordering the types, just the attributes below - }, - - attributes: function () { - return Attributes.find({}, { - sort: { order: 1 }, - transform: function (doc) { - doc.icon = Types.findOne({name: doc.type}).icon; - return doc; - } - }); - }, - attributesOptions: { - group: { - name: 'typeDefinition', - put: true - }, - onAdd: function (event) { - delete event.data._id; // Generate a new id when inserting in the Attributes collection. Otherwise, if we add the same type twice, we'll get an error that the ids are not unique. - delete event.data.icon; - event.data.type = event.data.name; - event.data.name = 'Rename me (double click)' - }, - // event handler for reordering attributes - onSort: function (event) { - console.log('Item %s went from #%d to #%d', - event.data.name, event.oldIndex, event.newIndex - ); - } - } -}); - -Template.sortableItemTarget.events({ - 'dblclick .name': function (event, template) { - // Make the name editable. We should use an existing component, but it's - // in a sorry state - https://github.com/arillo/meteor-x-editable/issues/1 - var name = template.$('.name'); - var input = template.$('input'); - if (input.length) { // jQuery never returns null - http://stackoverflow.com/questions/920236/how-can-i-detect-if-a-selector-returns-null - input.show(); - } else { - input = $(''); - name.after(input); - } - name.hide(); - input.focus(); - }, - 'blur input[type=text]': function (event, template) { - // commit the change to the name, if any - var input = template.$('input'); - input.hide(); - template.$('.name').show(); - // TODO - what is the collection here? We'll hard-code for now. - // https://github.com/meteor/meteor/issues/3303 - if (this.name !== input.val() && this.name !== '') - Attributes.update(this._id, {$set: {name: input.val()}}); - }, - 'keydown input[type=text]': function (event, template) { - if (event.which === 27) { - // ESC - discard edits and keep existing value - template.$('input').val(this.name); - event.preventDefault(); - event.target.blur(); - } else if (event.which === 13) { - // ENTER - event.preventDefault(); - event.target.blur(); - } - } -}); - -// you can add events to all Sortable template instances -Template.sortable.events({ - 'click .close': function (event, template) { - // `this` is the data context set by the enclosing block helper (#each, here) - template.collection.remove(this._id); - // custom code, working on a specific collection - if (Attributes.find().count() === 0) { - Meteor.setTimeout(function () { - Attributes.insert({ - name: 'Not nice to delete the entire list! Add some attributes instead.', - type: 'String', - order: 0 - }) - }, 1000); - } - } -}); diff --git a/dashboard-ui/bower_components/Sortable/meteor/example/model.js b/dashboard-ui/bower_components/Sortable/meteor/example/model.js deleted file mode 100644 index 8ae88226a..000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/example/model.js +++ /dev/null @@ -1,2 +0,0 @@ -Types = new Mongo.Collection('types'); -Attributes = new Mongo.Collection('attributes'); diff --git a/dashboard-ui/bower_components/Sortable/meteor/example/run.bat b/dashboard-ui/bower_components/Sortable/meteor/example/run.bat deleted file mode 100644 index b2a0d8b4e..000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/example/run.bat +++ /dev/null @@ -1,7 +0,0 @@ -@echo off -REM Sanity check: make sure we're in the directory of the script -set DIR=%~dp0 -cd %DIR% - -set PACKAGE_DIRS=..\..\ -meteor run %* diff --git a/dashboard-ui/bower_components/Sortable/meteor/example/run.sh b/dashboard-ui/bower_components/Sortable/meteor/example/run.sh deleted file mode 100644 index 8a9123ae3..000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/example/run.sh +++ /dev/null @@ -1,5 +0,0 @@ -# sanity check: make sure we're in the root directory of the example -cd "$( dirname "$0" )" - -# let Meteor find the local package -PACKAGE_DIRS=../../ meteor run "$@" diff --git a/dashboard-ui/bower_components/Sortable/meteor/example/server/fixtures.js b/dashboard-ui/bower_components/Sortable/meteor/example/server/fixtures.js deleted file mode 100644 index 617acf948..000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/example/server/fixtures.js +++ /dev/null @@ -1,75 +0,0 @@ -Meteor.startup(function () { - if (Types.find().count() === 0) { - [ - { - name: 'String', - icon: '' - }, - { - name: 'Text, multi-line', - icon: '' - }, - { - name: 'Category', - icon: '' - }, - { - name: 'Number', - icon: '' - }, - { - name: 'Date', - icon: '' - }, - { - name: 'Hyperlink', - icon: '' - }, - { - name: 'Image', - icon: '' - }, - { - name: 'Progress', - icon: '' - }, - { - name: 'Duration', - icon: '' - }, - { - name: 'Map address', - icon: '' - }, - { - name: 'Relationship', - icon: '' - } - ].forEach(function (type, i) { - Types.insert({ - name: type.name, - icon: type.icon, - order: i - }); - } - ); - console.log('Initialized attribute types.'); - } - - if (Attributes.find().count() === 0) { - [ - { name: 'Name', type: 'String' }, - { name: 'Created at', type: 'Date' }, - { name: 'Link', type: 'Hyperlink' }, - { name: 'Owner', type: 'Relationship' } - ].forEach(function (attribute, i) { - Attributes.insert({ - name: attribute.name, - type: attribute.type, - order: i - }); - } - ); - console.log('Created sample object type.'); - } -}); diff --git a/dashboard-ui/bower_components/Sortable/meteor/example/server/sortable-collections.js b/dashboard-ui/bower_components/Sortable/meteor/example/server/sortable-collections.js deleted file mode 100644 index 76069a592..000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/example/server/sortable-collections.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict'; - -Sortable.collections = ['attributes']; diff --git a/dashboard-ui/bower_components/Sortable/meteor/methods-client.js b/dashboard-ui/bower_components/Sortable/meteor/methods-client.js deleted file mode 100644 index 52f4ebec2..000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/methods-client.js +++ /dev/null @@ -1,16 +0,0 @@ -'use strict'; - -Meteor.methods({ - /** - * Update the sortField of documents with given ids in a collection, incrementing it by incDec - * @param {String} collectionName - name of the collection to update - * @param {String[]} ids - array of document ids - * @param {String} orderField - the name of the order field, usually "order" - * @param {Number} incDec - pass 1 or -1 - */ - 'rubaxa:sortable/collection-update': function (collectionName, ids, sortField, incDec) { - var selector = {_id: {$in: ids}}, modifier = {$inc: {}}; - modifier.$inc[sortField] = incDec; - Mongo.Collection.get(collectionName).update(selector, modifier, {multi: true}); - } -}); diff --git a/dashboard-ui/bower_components/Sortable/meteor/methods-server.js b/dashboard-ui/bower_components/Sortable/meteor/methods-server.js deleted file mode 100644 index 9598bfc99..000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/methods-server.js +++ /dev/null @@ -1,31 +0,0 @@ -'use strict'; - -Sortable = {}; -Sortable.collections = []; // array of collection names that the client is allowed to reorder - -Meteor.methods({ - /** - * Update the sortField of documents with given ids in a collection, incrementing it by incDec - * @param {String} collectionName - name of the collection to update - * @param {String[]} ids - array of document ids - * @param {String} orderField - the name of the order field, usually "order" - * @param {Number} incDec - pass 1 or -1 - */ - 'rubaxa:sortable/collection-update': function (collectionName, ids, sortField, incDec) { - check(collectionName, String); - // don't allow the client to modify just any collection - if (!Sortable || !Array.isArray(Sortable.collections)) { - throw new Meteor.Error(500, 'Please define Sortable.collections'); - } - if (Sortable.collections.indexOf(collectionName) === -1) { - throw new Meteor.Error(403, 'Collection <' + collectionName + '> is not Sortable. Please add it to Sortable.collections in server code.'); - } - - check(ids, [String]); - check(sortField, String); - check(incDec, Number); - var selector = {_id: {$in: ids}}, modifier = {$inc: {}}; - modifier.$inc[sortField] = incDec; - Mongo.Collection.get(collectionName).update(selector, modifier, {multi: true}); - } -}); diff --git a/dashboard-ui/bower_components/Sortable/meteor/package.js b/dashboard-ui/bower_components/Sortable/meteor/package.js deleted file mode 100644 index aaa048eea..000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/package.js +++ /dev/null @@ -1,85 +0,0 @@ -// Package metadata file for Meteor.js -'use strict'; - -var packageName = 'rubaxa:sortable'; // https://atmospherejs.com/rubaxa/sortable -var gitHubPath = 'RubaXa/Sortable'; // https://github.com/RubaXa/Sortable -var npmPackageName = 'sortablejs'; // https://www.npmjs.com/package/sortablejs - optional but recommended; used as fallback if GitHub fails - -/* All of the below is just to get the version number of the 3rd party library. - * First we'll try to read it from package.json. This works when publishing or testing the package - * but not when running an example app that uses a local copy of the package because the current - * directory will be that of the app, and it won't have package.json. Finding the path of a file is hard: - * http://stackoverflow.com/questions/27435797/how-do-i-obtain-the-path-of-a-file-in-a-meteor-package - * Therefore, we'll fall back to GitHub (which is more frequently updated), and then to NPMJS. - * We also don't have the HTTP package at this stage, and if we use Package.* in the request() callback, - * it will error that it must be run in a Fiber. So we'll use Node futures. - */ -var request = Npm.require('request'); -var Future = Npm.require('fibers/future'); - -var fut = new Future; -var version; - -if (!version) try { - var packageJson = JSON.parse(Npm.require('fs').readFileSync('../package.json')); - version = packageJson.version; -} catch (e) { - // if the file was not found, fall back to GitHub - console.warn('Could not find ../package.json to read version number from; trying GitHub...'); - var url = 'https://api.github.com/repos/' + gitHubPath + '/tags'; - request.get({ - url: url, - headers: { - 'User-Agent': 'request' // GitHub requires it - } - }, function (error, response, body) { - if (!error && response.statusCode === 200) { - var versions = JSON.parse(body).map(function (version) { - return version['name'].replace(/^\D+/, '') // trim leading non-digits from e.g. "v4.3.0" - }).sort(); - fut.return(versions[versions.length -1]); - } else { - // GitHub API rate limit reached? Fall back to npmjs. - console.warn('GitHub request to', url, 'failed:\n ', response && response.statusCode, response && response.body, error || '', '\nTrying NPMJS...'); - url = 'http://registry.npmjs.org/' + npmPackageName + '/latest'; - request.get(url, function (error, response, body) { - if (!error && response.statusCode === 200) - fut.return(JSON.parse(body).version); - else - fut.throw('Could not get version information from ' + url + ' either (incorrect package name?):\n' + (response && response.statusCode || '') + (response && response.body || '') + (error || '')); - }); - } - }); - - version = fut.wait(); -} - -// Now that we finally have an accurate version number... -Package.describe({ - name: packageName, - summary: 'Sortable: reactive minimalist reorderable drag-and-drop lists on modern browsers and touch devices', - version: version, - git: 'https://github.com/RubaXa/Sortable.git', - documentation: 'README.md' -}); - -Package.onUse(function (api) { - api.versionsFrom(['METEOR@0.9.0', 'METEOR@1.0']); - api.use('templating', 'client'); - api.use('dburles:mongo-collection-instances@0.3.4'); // to watch collections getting created - api.export('Sortable'); // exported on the server too, as a global to hold the array of sortable collections (for security) - api.addFiles([ - '../Sortable.js', - 'template.html', // the HTML comes first, so reactivize.js can refer to the template in it - 'reactivize.js' - ], 'client'); - api.addFiles('methods-client.js', 'client'); - api.addFiles('methods-server.js', 'server'); -}); - -Package.onTest(function (api) { - api.use(packageName, 'client'); - api.use('tinytest', 'client'); - - api.addFiles('test.js', 'client'); -}); diff --git a/dashboard-ui/bower_components/Sortable/meteor/publish.sh b/dashboard-ui/bower_components/Sortable/meteor/publish.sh deleted file mode 100644 index af392cac1..000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/publish.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash -# Publish package to Meteor's repository, Atmospherejs.com - -# Make sure Meteor is installed, per https://www.meteor.com/install. -# The curl'ed script is totally safe; takes 2 minutes to read its source and check. -type meteor >/dev/null 2>&1 || { curl https://install.meteor.com/ | sh; } - -# sanity check: make sure we're in the directory of the script -cd "$( dirname "$0" )" - -# publish package, creating it if it's the first time we're publishing -PACKAGE_NAME=$(grep -i name package.js | head -1 | cut -d "'" -f 2) - -echo "Publishing $PACKAGE_NAME..." - -# Attempt to re-publish the package - the most common operation once the initial release has -# been made. If the package name was changed (rare), you'll have to pass the --create flag. -meteor publish "$@"; EXIT_CODE=$? -if (( $EXIT_CODE == 0 )); then - echo "Thanks for releasing a new version. You can see it at" - echo "https://atmospherejs.com/${PACKAGE_NAME/://}" -else - echo "We have an error. Please post it at https://github.com/RubaXa/Sortable/issues" -fi - -exit $EXIT_CODE diff --git a/dashboard-ui/bower_components/Sortable/meteor/reactivize.js b/dashboard-ui/bower_components/Sortable/meteor/reactivize.js deleted file mode 100644 index ae7ff4b8d..000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/reactivize.js +++ /dev/null @@ -1,201 +0,0 @@ -/* -Make a Sortable reactive by binding it to a Mongo.Collection. -Calls `rubaxa:sortable/collection-update` on the server to update the sortField of affected records. - -TODO: - * supply consecutive values if the `order` field doesn't have any - * .get(DOMElement) - return the Sortable object of a DOMElement - * create a new _id automatically onAdd if the event.from list had pull: 'clone' - * support arrays - * sparse arrays - * tests - * drop onto existing empty lists - * insert back into lists emptied by dropping - * performance on dragging into long list at the beginning - * handle failures on Collection operations, e.g. add callback to .insert - * when adding elements, update ranks just for the half closer to the start/end of the list - * revisit http://programmers.stackexchange.com/questions/266451/maintain-ordered-collection-by-updating-as-few-order-fields-as-possible - * reproduce the insidious bug where the list isn't always sorted (fiddle with dragging #1 over #2, then back, then #N before #1) - - */ - -'use strict'; - -Template.sortable.created = function () { - var templateInstance = this; - // `this` is a template instance that can store properties of our choice - http://docs.meteor.com/#/full/template_inst - if (templateInstance.setupDone) return; // paranoid: only run setup once - // this.data is the data context - http://docs.meteor.com/#/full/template_data - // normalize all options into templateInstance.options, and remove them from .data - templateInstance.options = templateInstance.data.options || {}; - Object.keys(templateInstance.data).forEach(function (key) { - if (key === 'options' || key === 'items') return; - templateInstance.options[key] = templateInstance.data[key]; - delete templateInstance.data[key]; - }); - templateInstance.options.sortField = templateInstance.options.sortField || 'order'; - // We can get the collection via the .collection property of the cursor, but changes made that way - // will NOT be sent to the server - https://github.com/meteor/meteor/issues/3271#issuecomment-66656257 - // Thus we need to use dburles:mongo-collection-instances to get a *real* collection - if (templateInstance.data.items && templateInstance.data.items.collection) { - // cursor passed via items=; its .collection works client-only and has a .name property - templateInstance.collectionName = templateInstance.data.items.collection.name; - templateInstance.collection = Mongo.Collection.get(templateInstance.collectionName); - } else if (templateInstance.data.items) { - // collection passed via items=; does NOT have a .name property, but _name - templateInstance.collection = templateInstance.data.items; - templateInstance.collectionName = templateInstance.collection._name; - } else if (templateInstance.data.collection) { - // cursor passed directly - templateInstance.collectionName = templateInstance.data.collection.name; - templateInstance.collection = Mongo.Collection.get(templateInstance.collectionName); - } else { - templateInstance.collection = templateInstance.data; // collection passed directly - templateInstance.collectionName = templateInstance.collection._name; - } - - // TODO if (Array.isArray(templateInstance.collection)) - - // What if user filters some of the items in the cursor, instead of ordering the entire collection? - // Use case: reorder by preference movies of a given genre, a filter within all movies. - // A: Modify all intervening items **that are on the client**, to preserve the overall order - // TODO: update *all* orders via a server method that takes not ids, but start & end elements - mild security risk - delete templateInstance.data.options; - - /** - * When an element was moved, adjust its orders and possibly the order of - * other elements, so as to maintain a consistent and correct order. - * - * There are three approaches to this: - * 1) Using arbitrary precision arithmetic and setting only the order of the moved - * element to the average of the orders of the elements around it - - * http://programmers.stackexchange.com/questions/266451/maintain-ordered-collection-by-updating-as-few-order-fields-as-possible - * The downside is that the order field in the DB will increase by one byte every - * time an element is reordered. - * 2) Adjust the orders of the intervening items. This keeps the orders sane (integers) - * but is slower because we have to modify multiple documents. - * TODO: we may be able to update fewer records by only altering the - * order of the records between the newIndex/oldIndex and the start/end of the list. - * 3) Use regular precision arithmetic, but when the difference between the orders of the - * moved item and the one before/after it falls below a certain threshold, adjust - * the order of that other item, and cascade doing so up or down the list. - * This will keep the `order` field constant in size, and will only occasionally - * require updating the `order` of other records. - * - * For now, we use approach #2. - * - * @param {String} itemId - the _id of the item that was moved - * @param {Number} orderPrevItem - the order of the item before it, or null - * @param {Number} orderNextItem - the order of the item after it, or null - */ - templateInstance.adjustOrders = function adjustOrders(itemId, orderPrevItem, orderNextItem) { - var orderField = templateInstance.options.sortField; - var selector = templateInstance.options.selector || {}, modifier = {$set: {}}; - var ids = []; - var startOrder = templateInstance.collection.findOne(itemId)[orderField]; - if (orderPrevItem !== null) { - // Element has a previous sibling, therefore it was moved down in the list. - // Decrease the order of intervening elements. - selector[orderField] = {$lte: orderPrevItem, $gt: startOrder}; - ids = _.pluck(templateInstance.collection.find(selector, {fields: {_id: 1}}).fetch(), '_id'); - Meteor.call('rubaxa:sortable/collection-update', templateInstance.collectionName, ids, orderField, -1); - - // Set the order of the dropped element to the order of its predecessor, whose order was decreased - modifier.$set[orderField] = orderPrevItem; - } else { - // element moved up the list, increase order of intervening elements - selector[orderField] = {$gte: orderNextItem, $lt: startOrder}; - ids = _.pluck(templateInstance.collection.find(selector, {fields: {_id: 1}}).fetch(), '_id'); - Meteor.call('rubaxa:sortable/collection-update', templateInstance.collectionName, ids, orderField, 1); - - // Set the order of the dropped element to the order of its successor, whose order was increased - modifier.$set[orderField] = orderNextItem; - } - templateInstance.collection.update(itemId, modifier); - }; - - templateInstance.setupDone = true; -}; - - -Template.sortable.rendered = function () { - var templateInstance = this; - var orderField = templateInstance.options.sortField; - - // sorting was changed within the list - var optionsOnUpdate = templateInstance.options.onUpdate; - templateInstance.options.onUpdate = function sortableUpdate(/**Event*/event) { - var itemEl = event.item; // dragged HTMLElement - event.data = Blaze.getData(itemEl); - if (event.newIndex < event.oldIndex) { - // Element moved up in the list. The dropped element has a next sibling for sure. - var orderNextItem = Blaze.getData(itemEl.nextElementSibling)[orderField]; - templateInstance.adjustOrders(event.data._id, null, orderNextItem); - } else if (event.newIndex > event.oldIndex) { - // Element moved down in the list. The dropped element has a previous sibling for sure. - var orderPrevItem = Blaze.getData(itemEl.previousElementSibling)[orderField]; - templateInstance.adjustOrders(event.data._id, orderPrevItem, null); - } else { - // do nothing - drag and drop in the same location - } - if (optionsOnUpdate) optionsOnUpdate(event); - }; - - // element was added from another list - var optionsOnAdd = templateInstance.options.onAdd; - templateInstance.options.onAdd = function sortableAdd(/**Event*/event) { - var itemEl = event.item; // dragged HTMLElement - event.data = Blaze.getData(itemEl); - // let the user decorate the object with additional properties before insertion - if (optionsOnAdd) optionsOnAdd(event); - - // Insert the new element at the end of the list and move it where it was dropped. - // We could insert it at the beginning, but that would lead to negative orders. - var sortSpecifier = {}; sortSpecifier[orderField] = -1; - event.data.order = templateInstance.collection.findOne({}, { sort: sortSpecifier, limit: 1 }).order + 1; - // TODO: this can obviously be optimized by setting the order directly as the arithmetic average, with the caveats described above - var newElementId = templateInstance.collection.insert(event.data); - event.data._id = newElementId; - if (itemEl.nextElementSibling) { - var orderNextItem = Blaze.getData(itemEl.nextElementSibling)[orderField]; - templateInstance.adjustOrders(newElementId, null, orderNextItem); - } else { - // do nothing - inserted after the last element - } - // remove the dropped HTMLElement from the list because we have inserted it in the collection, which will update the template - itemEl.parentElement.removeChild(itemEl); - }; - - // element was removed by dragging into another list - var optionsOnRemove = templateInstance.options.onRemove; - templateInstance.options.onRemove = function sortableRemove(/**Event*/event) { - var itemEl = event.item; // dragged HTMLElement - event.data = Blaze.getData(itemEl); - // don't remove from the collection if group.pull is clone or false - if (typeof templateInstance.options.group === 'undefined' - || typeof templateInstance.options.group.pull === 'undefined' - || templateInstance.options.group.pull === true - ) templateInstance.collection.remove(event.data._id); - if (optionsOnRemove) optionsOnRemove(event); - }; - - // just compute the `data` context - ['onStart', 'onEnd', 'onSort', 'onFilter'].forEach(function (eventHandler) { - if (templateInstance.options[eventHandler]) { - var userEventHandler = templateInstance.options[eventHandler]; - templateInstance.options[eventHandler] = function (/**Event*/event) { - var itemEl = event.item; // dragged HTMLElement - event.data = Blaze.getData(itemEl); - userEventHandler(event); - }; - } - }); - - templateInstance.sortable = Sortable.create(templateInstance.firstNode.parentElement, templateInstance.options); - // TODO make the object accessible, e.g. via Sortable.getSortableById() or some such -}; - - -Template.sortable.destroyed = function () { - if(this.sortable) this.sortable.destroy(); -}; diff --git a/dashboard-ui/bower_components/Sortable/meteor/runtests.bat b/dashboard-ui/bower_components/Sortable/meteor/runtests.bat deleted file mode 100644 index 9bddf9348..000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/runtests.bat +++ /dev/null @@ -1,8 +0,0 @@ -@echo off -REM Test Meteor package before publishing to Atmospherejs.com - -REM Sanity check: make sure we're in the directory of the script -set DIR=%~dp0 -cd %DIR% - -meteor test-packages ./ %* diff --git a/dashboard-ui/bower_components/Sortable/meteor/runtests.sh b/dashboard-ui/bower_components/Sortable/meteor/runtests.sh deleted file mode 100644 index 0e738a7e8..000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/runtests.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/sh -# Test Meteor package before publishing to Atmospherejs.com - -# Make sure Meteor is installed, per https://www.meteor.com/install. -# The curl'ed script is totally safe; takes 2 minutes to read its source and check. -type meteor >/dev/null 2>&1 || { curl https://install.meteor.com/ | sh; } - -# sanity check: make sure we're in the directory of the script -cd "$( dirname "$0" )" - - -# delete the temporary files even if Ctrl+C is pressed -int_trap() { - printf "\nTests interrupted. Cleaning up...\n\n" -} -trap int_trap INT - - -EXIT_CODE=0 - -PACKAGE_NAME=$(grep -i name package.js | head -1 | cut -d "'" -f 2) - -echo "### Testing $PACKAGE_NAME..." - -# provide an invalid MONGO_URL so Meteor doesn't bog us down with an empty Mongo database -if [ $# -gt 0 ]; then - # interpret any parameter to mean we want an interactive test - MONGO_URL=mongodb:// meteor test-packages ./ -else - # automated/CI test with phantomjs - ./node_modules/.bin/spacejam --mongo-url mongodb:// test-packages ./ - EXIT_CODE=$(( $EXIT_CODE + $? )) -fi - -exit $EXIT_CODE diff --git a/dashboard-ui/bower_components/Sortable/meteor/template.html b/dashboard-ui/bower_components/Sortable/meteor/template.html deleted file mode 100644 index 3923d3d9c..000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/template.html +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/dashboard-ui/bower_components/Sortable/meteor/test.js b/dashboard-ui/bower_components/Sortable/meteor/test.js deleted file mode 100644 index f7c00a9fb..000000000 --- a/dashboard-ui/bower_components/Sortable/meteor/test.js +++ /dev/null @@ -1,9 +0,0 @@ -'use strict'; - -Tinytest.add('Sortable.is', function (test) { - var items = document.createElement('ul'); - items.innerHTML = '
  • item 1
  • item 2
  • item 3
  • '; - var sortable = new Sortable(items); - test.instanceOf(sortable, Sortable, 'Instantiation OK'); - test.length(sortable.toArray(), 3, 'Three elements'); -}); diff --git a/dashboard-ui/bower_components/Sortable/st/app.css b/dashboard-ui/bower_components/Sortable/st/app.css deleted file mode 100644 index 6a97f8e49..000000000 --- a/dashboard-ui/bower_components/Sortable/st/app.css +++ /dev/null @@ -1,239 +0,0 @@ -html { - background-image: -webkit-linear-gradient(bottom, #F4E2C9 20%, #F4D7C9 100%); - background-image: -ms-linear-gradient(bottom, #F4E2C9 20%, #F4D7C9 100%); - background-image: linear-gradient(to bottom, #F4E2C9 20%, #F4D7C9 100%); -} - -html, body { - margin: 0; - padding: 0; - position: relative; - color: #464637; - min-height: 100%; - font-size: 20px; - font-family: 'Roboto', sans-serif; - font-weight: 300; -} - - -h1 { - color: #FF3F00; - font-size: 20px; - font-family: 'Roboto', sans-serif; - font-weight: 300; - text-align: center; -} - - -ul { - margin: 0; - padding: 0; - list-style: none; -} - -.container { - width: 80%; - margin: auto; - min-width: 1100px; - max-width: 1300px; - position: relative; -} - -@media (min-width: 750px) and (max-width: 970px){ - .container { - width: 100%; - min-width: 750px; - } -} - - -.sortable-ghost { - opacity: .2; -} - - -img { - border: 0; - vertical-align: middle; -} - - -.logo { - top: 55px; - left: 30px; - position: absolute; -} - - -.title { - color: #fff; - padding: 3px 10px; - display: inline-block; - position: relative; - background-color: #FF7373; - z-index: 1000; -} - .title_xl { - padding: 3px 15px; - font-size: 40px; - } - - - -.tile { - width: 22%; - min-width: 245px; - color: #FF7270; - padding: 10px 30px; - text-align: center; - margin-top: 15px; - margin-left: 5px; - margin-right: 30px; - background-color: #fff; - display: inline-block; - vertical-align: top; -} - .tile__name { - cursor: move; - padding-bottom: 10px; - border-bottom: 1px solid #FF7373; - } - - .tile__list { - margin-top: 10px; - } - .tile__list:last-child { - margin-right: 0; - min-height: 80px; - } - - .tile__list img { - cursor: move; - margin: 10px; - border-radius: 100%; - } - - - -.block { - opacity: 1; - position: absolute; -} - .block__list { - padding: 20px 0; - max-width: 360px; - margin-top: -8px; - margin-left: 5px; - background-color: #fff; - } - .block__list-title { - margin: -20px 0 0; - padding: 10px; - text-align: center; - background: #5F9EDF; - } - .block__list li { cursor: move; } - - .block__list_words li { - background-color: #fff; - padding: 10px 40px; - } - .block__list_words .sortable-ghost { - opacity: 0.4; - background-color: #F4E2C9; - } - - .block__list_words li:first-letter { - text-transform: uppercase; - } - - .block__list_tags { - padding-left: 30px; - } - - .block__list_tags:after { - clear: both; - content: ''; - display: block; - } - .block__list_tags li { - color: #fff; - float: left; - margin: 8px 20px 10px 0; - padding: 5px 10px; - min-width: 10px; - background-color: #5F9EDF; - text-align: center; - } - .block__list_tags li:first-child:first-letter { - text-transform: uppercase; - } - - - -#editable {} - #editable li { - position: relative; - } - - #editable i { - -webkit-transition: opacity .2s; - transition: opacity .2s; - opacity: 0; - display: block; - cursor: pointer; - color: #c00; - top: 10px; - right: 40px; - position: absolute; - font-style: normal; - } - - #editable li:hover i { - opacity: 1; - } - - -#filter {} - #filter button { - color: #fff; - width: 100%; - border: none; - outline: 0; - opacity: .5; - margin: 10px 0 0; - transition: opacity .1s ease; - cursor: pointer; - background: #5F9EDF; - padding: 10px 0; - font-size: 20px; - } - #filter button:hover { - opacity: 1; - } - - #filter .block__list { - padding-bottom: 0; - } - -.drag-handle { - margin-right: 10px; - font: bold 20px Sans-Serif; - color: #5F9EDF; - display: inline-block; - cursor: move; - cursor: -webkit-grabbing; /* overrides 'move' */ -} - -#todos input { - padding: 5px; - font-size: 14px; - font-family: 'Roboto', sans-serif; - font-weight: 300; -} - - - -#nested ul li { - background-color: rgba(0,0,0,.05); -} diff --git a/dashboard-ui/bower_components/Sortable/st/app.js b/dashboard-ui/bower_components/Sortable/st/app.js deleted file mode 100644 index 164270d9a..000000000 --- a/dashboard-ui/bower_components/Sortable/st/app.js +++ /dev/null @@ -1,226 +0,0 @@ -(function () { - 'use strict'; - - var byId = function (id) { return document.getElementById(id); }, - - loadScripts = function (desc, callback) { - var deps = [], key, idx = 0; - - for (key in desc) { - deps.push(key); - } - - (function _next() { - var pid, - name = deps[idx], - script = document.createElement('script'); - - script.type = 'text/javascript'; - script.src = desc[deps[idx]]; - - pid = setInterval(function () { - if (window[name]) { - clearTimeout(pid); - - deps[idx++] = window[name]; - - if (deps[idx]) { - _next(); - } else { - callback.apply(null, deps); - } - } - }, 30); - - document.getElementsByTagName('head')[0].appendChild(script); - })() - }, - - console = window.console; - - - if (!console.log) { - console.log = function () { - alert([].join.apply(arguments, ' ')); - }; - } - - - Sortable.create(byId('foo'), { - group: "words", - animation: 150, - store: { - get: function (sortable) { - var order = localStorage.getItem(sortable.options.group); - return order ? order.split('|') : []; - }, - set: function (sortable) { - var order = sortable.toArray(); - localStorage.setItem(sortable.options.group, order.join('|')); - } - }, - onAdd: function (evt){ console.log('onAdd.foo:', [evt.item, evt.from]); }, - onUpdate: function (evt){ console.log('onUpdate.foo:', [evt.item, evt.from]); }, - onRemove: function (evt){ console.log('onRemove.foo:', [evt.item, evt.from]); }, - onStart:function(evt){ console.log('onStart.foo:', [evt.item, evt.from]);}, - onSort:function(evt){ console.log('onStart.foo:', [evt.item, evt.from]);}, - onEnd: function(evt){ console.log('onEnd.foo:', [evt.item, evt.from]);} - }); - - - Sortable.create(byId('bar'), { - group: "words", - animation: 150, - onAdd: function (evt){ console.log('onAdd.bar:', evt.item); }, - onUpdate: function (evt){ console.log('onUpdate.bar:', evt.item); }, - onRemove: function (evt){ console.log('onRemove.bar:', evt.item); }, - onStart:function(evt){ console.log('onStart.foo:', evt.item);}, - onEnd: function(evt){ console.log('onEnd.foo:', evt.item);} - }); - - - // Multi groups - Sortable.create(byId('multi'), { - animation: 150, - draggable: '.tile', - handle: '.tile__name' - }); - - [].forEach.call(byId('multi').getElementsByClassName('tile__list'), function (el){ - Sortable.create(el, { - group: 'photo', - animation: 150 - }); - }); - - - // Editable list - var editableList = Sortable.create(byId('editable'), { - animation: 150, - filter: '.js-remove', - onFilter: function (evt) { - evt.item.parentNode.removeChild(evt.item); - } - }); - - - byId('addUser').onclick = function () { - Ply.dialog('prompt', { - title: 'Add', - form: { name: 'name' } - }).done(function (ui) { - var el = document.createElement('li'); - el.innerHTML = ui.data.name + ''; - editableList.el.appendChild(el); - }); - }; - - - // Advanced groups - [{ - name: 'advanced', - pull: true, - put: true - }, - { - name: 'advanced', - pull: 'clone', - put: false - }, { - name: 'advanced', - pull: false, - put: true - }].forEach(function (groupOpts, i) { - Sortable.create(byId('advanced-' + (i + 1)), { - sort: (i != 1), - group: groupOpts, - animation: 150 - }); - }); - - - // 'handle' option - Sortable.create(byId('handle-1'), { - handle: '.drag-handle', - animation: 150 - }); - - - // Angular example - angular.module('todoApp', ['ng-sortable']) - .constant('ngSortableConfig', {onEnd: function() { - console.log('default onEnd()'); - }}) - .controller('TodoController', ['$scope', function ($scope) { - $scope.todos = [ - {text: 'learn angular', done: true}, - {text: 'build an angular app', done: false} - ]; - - $scope.addTodo = function () { - $scope.todos.push({text: $scope.todoText, done: false}); - $scope.todoText = ''; - }; - - $scope.remaining = function () { - var count = 0; - angular.forEach($scope.todos, function (todo) { - count += todo.done ? 0 : 1; - }); - return count; - }; - - $scope.archive = function () { - var oldTodos = $scope.todos; - $scope.todos = []; - angular.forEach(oldTodos, function (todo) { - if (!todo.done) $scope.todos.push(todo); - }); - }; - }]) - .controller('TodoControllerNext', ['$scope', function ($scope) { - $scope.todos = [ - {text: 'learn Sortable', done: true}, - {text: 'use ng-sortable', done: false}, - {text: 'Enjoy', done: false} - ]; - - $scope.remaining = function () { - var count = 0; - angular.forEach($scope.todos, function (todo) { - count += todo.done ? 0 : 1; - }); - return count; - }; - - $scope.sortableConfig = { group: 'todo', animation: 150 }; - 'Start End Add Update Remove Sort'.split(' ').forEach(function (name) { - $scope.sortableConfig['on' + name] = console.log.bind(console, name); - }); - }]); -})(); - - - -// Background -document.addEventListener("DOMContentLoaded", function () { - function setNoiseBackground(el, width, height, opacity) { - var canvas = document.createElement("canvas"); - var context = canvas.getContext("2d"); - - canvas.width = width; - canvas.height = height; - - for (var i = 0; i < width; i++) { - for (var j = 0; j < height; j++) { - var val = Math.floor(Math.random() * 255); - context.fillStyle = "rgba(" + val + "," + val + "," + val + "," + opacity + ")"; - context.fillRect(i, j, 1, 1); - } - } - - el.style.background = "url(" + canvas.toDataURL("image/png") + ")"; - } - - setNoiseBackground(document.getElementsByTagName('body')[0], 50, 50, 0.02); -}, false); diff --git a/dashboard-ui/bower_components/Sortable/st/face-01.jpg b/dashboard-ui/bower_components/Sortable/st/face-01.jpg deleted file mode 100644 index 06f9640b2844ddde69fb167e8709f915ef1690d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3172 zcmb_d3pCXE7yr(TnPI$U7-K@rj7LVEL**4smR*l!2qCMGO31TC9-ENI5K$&l>-|VX zY+=PB@_r;GlviwdEum8E>~FNK-E;o?Kj(kW|IV4;_jB&ObMKvdKll4%53$Dq*2Kuz z2*BU~z@QIc{|>km0DBTHVQgSg$6fJ9`Hb zdKCKA4uAkupyll9??Y!W%)r0OyQiES01PN`V*RVze>Px_yZO69rVZ%pZBMUEd#$> z@bEc@jH}29z3tu*HqiV=mCa_400V&HLZXmdC=?QfMx(efSPX`T2ZI+7Mi9}I6 zfgrY1R!U4;vY7M`v}1GUo69b4*^BQ z!Ew-Yu(E=$%}Qg(kox7aXPPuEUQ~zM@8CX4y^jhoybd6Bru$>WlduF3+IVXWd{(ziYZ%@NlxKIBt$D)c3GAC$g% zE<86Tmj(T8SuB9VxL{mx#Fvh75Eo8}gcK&LQKYeWI*mOHxFIVH37-fI;!Rsab}P)t zd&j#AE08R?kH@QOOT4 zs^TXlZ1|RX&G}PdWPYu7i|g>0y^$B;XS=a&sm;R3Xw!o9nZhv>#UY>BTb~9_+fX}( z3!Gzh#V#dLj*cKryfn|cdCP=l^R8vSr~DX@UA%u{sw$x6ec6WxVQux5=)-RW=l96` zeCmE`{s{h%NLGN%%5Ztb?%ut{=Z~d4tqvT0QihkfF&Q(jQ&Nu49@{s1qV|-RZ+B$* z#>6F>LOM00yjJ819v}Wq1vtX*aTq7AiMMt@n$6@;?cB9UHiQl7cw3bhvdq9!L3#0N=g4y`i!T`<#zK_* zB3l`t1VS{+tqjm2=)+_c^j@;QIvFZE@~kL{=WK~6AG6|4^JJ_~TkXp|re}MfH(w{muTE(0C8u{lRWE(r!F!WNx zdiu^aMVu*{Wq7!^TU-8~U9xH|Q64wtk<tfT z#V=z>GaD`U2@}4ZwrL}wWsQWIJV~4n7SH7rCfzRQdUsi^@RK}tG_%VDF=%SGfHoHH zn|7@I>5x7T*%nh|-Mnjpd$zA+TCzQ{IV;=E7Yj;NKSX@Ot3d}q51d)LKArAxaRBw_R1{u46`%94VrET8YgutKzM zu}r3T*@{uOqo})+ajaG(*4l?$>Gi-oZa6zQL(iA7df#eOn;uhZb|1? zqlH4h(wWbSo0I98W^`|@q$d?g@(q(#RO03yG;p|r_FHo{{rbilvH|0=5uRUEReb;9 z>EVI$5K46e{IL;AI0l-`)4__q1upXgVh3sqV{qXFBCAWtU+8(MfVDM7m(X|L)Mb|FsZz z7Vev!xQVbPtosux1V7fQnyq(2Yg-gA(X9Hd^p!WUu8@I{?LK%V3Vdj%`wPyU7cw+N@JWpd}FA@Ph>@({rnGe8iRoV diff --git a/dashboard-ui/bower_components/Sortable/st/face-02.jpg b/dashboard-ui/bower_components/Sortable/st/face-02.jpg deleted file mode 100644 index 9063724c897569d917d1e17e1f4be339ffa78af1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4445 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 diff --git a/dashboard-ui/bower_components/Sortable/st/face-03.jpg b/dashboard-ui/bower_components/Sortable/st/face-03.jpg deleted file mode 100644 index 3e64a48bdb478019f39c1e7e96ff031f7ed59321..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2907 zcmb_c2~-nV7X6jo$Wnm-A#8yFCecViKtrRf5=2o*a6x5Fpe2B^DqthXjwlGUfY{oK zf@>>_qQcOE%_0KQf@muu1hsKNG&U_R4Z~Ex5$7DI&zW=PfV$L zz$*l<0svtEfY2Y98U=?ug2Q9Nql3dE7`%lD;5)jm!r_1-cIjd^1FE03AlxN*k(X7# zR*`h0X#H|O?iyVT3y1}dtCk_=2!aHN`3Mh1#F~#-Dp1TrtP~h%IfFiXG4mtOQ>`3Y|L++i3`OEDhhV z^DJmK1p>S<)@L*{Vh4VA)xm_HqzyZ7H$6wDrluYMCqTgA33wcVfF}@%1QHo0ljqDK zQ&m)zU@a<*rbX4%r0ba&&~=!)nwpFS45sNkHixZkz(u$$#Dv9WDJFr4L?W3)Rwt9y zS#(W0>wk`^UjT&!0zn`a7y*a^VJOg4Gtfad6tA%C=fFZ39DxY%=%5DlA0vtq#WP<` z_W>m=I!wV(6c&l^k3J-Kx!CuZquH{7B{hyA==#_8Q(m&%*WaktYVh_g!`Wt?wd;Df zM8qW62QO`d_cBJx&DQSw*3Ff;Jk7CY#a&+YDW1wPW*)C^XuPjL$0ViV^|gr}d(+K# zUp^U2k$b4;*|f^CTdZ8~cQxqGD}DODY{z`P)wuzbZa8ll<8HliM>;iQ^591eryGwi z=3=ko4yCn(<~qv)DZ9;cVC!A}=3PLqKMC!}1O^Zm2jQ@vyM-`V9KgdAHG;aKIm5_- z%A4u~Bvd5`kLjw+(Dh-LAE&<`0b(3<;&FEt=?CdUe%}wiDgy2~qH*P5+G20^mOC%B z7M<#DYbl=GsIQ*tJ};nme84iwJb3R5wQF+S4R*I=qW(wS@fK&E4TkKb^J&$!1D9Lh zh>XhRy=#yoVT(CKoIr$N0Cp)a@!RbyxHc92U}#Ka(XS#ZxOvT*o~} z>!uFDL@@JQ?LLA7}R2T3<34abf6!4EJclBD1?m=a|cnR zI@Q84Aeot8^+|Ms9j2o_Bbu#;ymfvceUNNkNcMCe)|Gcf65bl-EkJ-d3T>tKH#N^7ho>s4-rYG3o>}=rMozXMQHi%Ms zz4`*)h3*%>ZM3P_lN9DVUPSoIS;zFd=80UIbo3{a%p^~@9m)wSx@>%#mLB`~{Eq{P zMg@!EhnbgdYsIleizJur9Xwxt!=JE!e&$m3%OaZ`lNITQ&)r`cU%WN5LACHqQqI-X zst4(u`F-#AdE%opPK~|DB%G=9jfI~sS+ArYUSDr*hpNVeA%MYP71t+yAwV%ShaH5G z`2oqLRq~;K8_>?s-+struIs4#2z@>I)b$K(%F*+hKW4Et1V_d7bzSi?ynsP|C5%#xzg4-#Gt;gs_Ru~YhJ(S+llK{ zSzeFN27foEUARQ==cbUvxy4X{idM$G6+Qd~_es^9(2fJYdp(>N8rHj~;^`hcRN~oh z7>o#pk9RJKHdAv{S*Rz?>UK73n6FexIvbq|t2fhRj(kZf>Gt>6HEvck3QSueoPxX(hlwV~jz z5{b?EpIeu&%kv$2?&4v#tEQ14b7`NrJ`5^Vo4u)SyIC;Lu|9L0v8dwS8@2Y2bGWhG z4$OvIXCh;lk)WD6w#;7Tz&(|ri0{3YVY|vp<;KXjN-Z0hMcv0gNC-kfDIxNd1BR7C zT+_LwRL;om+*V3-%BQ7s`jz_LL?*x7suNxA{(c#Gp}}*tJ-;YFxRzB?f4Q&cN$a|^ zs>bahIs?V;b~4oi7ZaUdSuzhAzEUo!HBf3YK6Dd)0m$v{mF_W`u>g)MofyT$`}5V&?r<&ez)|iUSN&0G=&Ru@3mhsKXXnkRf z=Dk#VenLU#x*d%>Gw*lOClmVv(i+dgc0s({u1#upTCSF^`GKRmLCZQh_@fEZofWp< zVdoWd%||!CXT@($oB~c4hH*5T9Yz;6YPyh&bqa;Gllav2!aM$F5v3z(&fo l31q9}6ZP#f#zSsg+ipy)r^OiVjJ3Hzvz5B+B2PMX|6k!M)n5Pr diff --git a/dashboard-ui/bower_components/Sortable/st/face-04.jpg b/dashboard-ui/bower_components/Sortable/st/face-04.jpg deleted file mode 100644 index 0e5c73bcc5411f8f778769bb523a4469442a94bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4163 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 WZjy4|SF7sxcp7%wZXK4oJ^D}HB{OsY diff --git a/dashboard-ui/bower_components/Sortable/st/face-05.jpg b/dashboard-ui/bower_components/Sortable/st/face-05.jpg deleted file mode 100644 index a8111224db9ace0ca61983fdc888a8a255d79921..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3883 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 diff --git a/dashboard-ui/bower_components/Sortable/st/face-07.jpg b/dashboard-ui/bower_components/Sortable/st/face-07.jpg deleted file mode 100644 index aebd0112e5660f344d64bc5e17c84e19447e9017..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3867 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 P9J$nk@BMQ@e{ - - - - - - - - - - - -
    -
    - 14 - - Drag me by the handle -
    -
    - 2 - - You can also select text -
    -
    - 1 - - Best of both worlds! -
    -
    - - - diff --git a/dashboard-ui/bower_components/Sortable/st/iframe/index.html b/dashboard-ui/bower_components/Sortable/st/iframe/index.html deleted file mode 100644 index fcd089857..000000000 --- a/dashboard-ui/bower_components/Sortable/st/iframe/index.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - IFrame playground - - - - - - - - - - - - - -
    -
    This is Sortable
    -
    It works with Bootstrap...
    -
    ...out of the box.
    -
    It has support for touch devices.
    -
    Just drag some elements around.
    -
    - - - - - diff --git a/dashboard-ui/bower_components/Sortable/st/logo.png b/dashboard-ui/bower_components/Sortable/st/logo.png deleted file mode 100644 index 76cc77c3474f3352898bb6a6effe6795c359b1cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5062 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 diff --git a/dashboard-ui/bower_components/Sortable/st/og-image.png b/dashboard-ui/bower_components/Sortable/st/og-image.png deleted file mode 100644 index 7d7a51da9a6fb573a5df0a4ea189dafa51e7231a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12039 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 diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-itemscontainer/emby-itemscontainer.js b/dashboard-ui/bower_components/emby-webcomponents/emby-itemscontainer/emby-itemscontainer.js index 8ac2a9bb6..d72ff544d 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/emby-itemscontainer/emby-itemscontainer.js +++ b/dashboard-ui/bower_components/emby-webcomponents/emby-itemscontainer/emby-itemscontainer.js @@ -1,4 +1,4 @@ -define(['itemShortcuts', 'connectionManager', 'layoutManager', 'browser', 'dom', 'registerElement'], function (itemShortcuts, connectionManager, layoutManager, browser, dom) { +define(['itemShortcuts', 'connectionManager', 'layoutManager', 'browser', 'dom', 'loading', 'registerElement'], function (itemShortcuts, connectionManager, layoutManager, browser, dom, loading) { var ItemsContainerProtoType = Object.create(HTMLDivElement.prototype); @@ -105,6 +105,76 @@ }); }; + function onDrop(evt, itemsContainer) { + + var playlistId = itemsContainer.getAttribute('data-playlistid'); + + loading.show(); + + var el = evt.item; + + var newIndex = evt.newIndex; + var itemId = el.getAttribute('data-playlistitemid'); + + var serverId = el.getAttribute('data-serverid'); + var apiClient = connectionManager.getApiClient(serverId); + + apiClient.ajax({ + + url: apiClient.getUrl('Playlists/' + playlistId + '/Items/' + itemId + '/Move/' + newIndex), + + type: 'POST' + + }).then(function () { + + el.setAttribute('data-index', newIndex); + loading.hide(); + + }, function () { + + loading.hide(); + + itemsContainer.dispatchEvent(new CustomEvent('needsrefresh', { + detail: {}, + cancelable: false, + bubbles: true + })); + }); + } + + ItemsContainerProtoType.enableDragReordering = function (enabled) { + + var current = this.sortable; + + if (!enabled) { + if (current) { + current.destroy(); + this.sortable = null; + } + return; + } + + if (current) { + return; + } + + var self = this; + require(['sortable'], function (Sortable) { + + self.sortable = new Sortable(self, { + + draggable: ".listItem", + handle: '.listViewDragHandle', + + // dragging ended + onEnd: function (/**Event*/evt) { + + onDrop(evt, self); + } + }); + }); + }; + ItemsContainerProtoType.attachedCallback = function () { this.addEventListener('click', onClick); @@ -130,6 +200,7 @@ this.enableHoverMenu(false); this.enableMultiSelect(false); + this.enableDragReordering(false); this.removeEventListener('click', onClick); this.removeEventListener('contextmenu', onContextMenu); this.removeEventListener('contextmenu', disableEvent); diff --git a/dashboard-ui/scripts/playlistedit.js b/dashboard-ui/scripts/playlistedit.js index 4cb057da6..687aa88c0 100644 --- a/dashboard-ui/scripts/playlistedit.js +++ b/dashboard-ui/scripts/playlistedit.js @@ -76,22 +76,6 @@ elem.setAttribute('data-playlistid', item.Id); elem.innerHTML = html; - var listParent = elem; - - require(['sortable'], function (Sortable) { - - var sortable = new Sortable(listParent, { - - draggable: ".listItem", - handle: '.listViewDragHandle', - - // dragging ended - onEnd: function (/**Event*/evt) { - - onDrop(evt, page, item); - } - }); - }); ImageLoader.lazyChildren(elem); $('.btnNextPage', elem).on('click', function () { @@ -108,37 +92,12 @@ }); } - function onDrop(evt, page, item) { - - Dashboard.showLoadingMsg(); - - var el = evt.item; - - var newIndex = evt.newIndex; - var itemId = el.getAttribute('data-playlistitemid'); - - ApiClient.ajax({ - - url: ApiClient.getUrl('Playlists/' + item.Id + '/Items/' + itemId + '/Move/' + newIndex), - - type: 'POST' - - }).then(function () { - - el.setAttribute('data-index', newIndex); - Dashboard.hideLoadingMsg(); - - }, function () { - - Dashboard.hideLoadingMsg(); - reloadItems(page, item); - }); - } - function init(page, item) { var elem = page.querySelector('#childrenContent .itemsContainer'); + elem.enableDragReordering(true); + elem.addEventListener('needsrefresh', function () { reloadItems(page, item); From 9ff21cf7b856cb1f9374e0c85de41a993e0ff439 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Wed, 20 Jul 2016 02:23:18 -0400 Subject: [PATCH 4/5] update components --- .../emby-webcomponents/.bower.json | 8 +- .../actionsheet/actionsheet.js | 14 ++ .../emby-webcomponents/confirm/confirm.js | 138 +++--------------- .../emby-webcomponents/dialog/dialog.js | 126 ++++++++++++++++ .../emby-webcomponents/listview/listview.css | 6 +- .../emby-webcomponents/strings/en-US.json | 3 +- .../emby-webcomponents/voice/voicedialog.js | 2 +- dashboard-ui/scripts/itemdetailpage.js | 1 + dashboard-ui/scripts/site.js | 2 + 9 files changed, 174 insertions(+), 126 deletions(-) create mode 100644 dashboard-ui/bower_components/emby-webcomponents/dialog/dialog.js diff --git a/dashboard-ui/bower_components/emby-webcomponents/.bower.json b/dashboard-ui/bower_components/emby-webcomponents/.bower.json index 204259f41..ab9c8a073 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/.bower.json +++ b/dashboard-ui/bower_components/emby-webcomponents/.bower.json @@ -15,12 +15,12 @@ }, "devDependencies": {}, "ignore": [], - "version": "1.4.106", - "_release": "1.4.106", + "version": "1.4.107", + "_release": "1.4.107", "_resolution": { "type": "version", - "tag": "1.4.106", - "commit": "a24b7adf582019433bcd1cc93c7c38495e642d89" + "tag": "1.4.107", + "commit": "924bb12b6d7c3536ee00fc1a58ac4c492c36f559" }, "_source": "https://github.com/MediaBrowser/emby-webcomponents.git", "_target": "^1.2.0", diff --git a/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.js b/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.js index d10276e32..b58d427b0 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.js +++ b/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.js @@ -217,16 +217,30 @@ }); + var timeout; + if (options.timeout) { + timeout = setTimeout(function () { + dialogHelper.close(dlg); + }, options.timeout); + } + return new Promise(function (resolve, reject) { dlg.addEventListener('close', function () { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + if (selectedId != null) { if (options.callback) { options.callback(selectedId); } resolve(selectedId); + } else { + reject(); } }); diff --git a/dashboard-ui/bower_components/emby-webcomponents/confirm/confirm.js b/dashboard-ui/bower_components/emby-webcomponents/confirm/confirm.js index fbce2372e..5cd23133f 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/confirm/confirm.js +++ b/dashboard-ui/bower_components/emby-webcomponents/confirm/confirm.js @@ -1,116 +1,4 @@ -define(['layoutManager', 'globalize'], function (layoutManager, globalize) { - - function showTvConfirm(options) { - return new Promise(function (resolve, reject) { - - require(['actionsheet'], function (actionSheet) { - - var items = []; - - items.push({ - name: globalize.translate('sharedcomponents#ButtonOk'), - id: 'ok' - }); - - items.push({ - name: globalize.translate('sharedcomponents#ButtonCancel'), - id: 'cancel' - }); - - actionSheet.show({ - - title: options.text, - items: items - - }).then(function (id) { - - switch (id) { - - case 'ok': - resolve(); - break; - default: - reject(); - break; - } - - }, reject); - }); - }); - } - - function showConfirmInternal(options, dialogHelper, resolve, reject) { - - var dialogOptions = { - removeOnClose: true - }; - - var backButton = false; - - if (layoutManager.tv) { - dialogOptions.size = 'fullscreen'; - backButton = true; - dialogOptions.autoFocus = true; - } else { - - dialogOptions.modal = false; - dialogOptions.entryAnimationDuration = 160; - dialogOptions.exitAnimationDuration = 160; - dialogOptions.autoFocus = false; - } - - var dlg = dialogHelper.createDialog(dialogOptions); - var html = ''; - - if (options.title) { - html += '

    ' + options.title + '

    '; - } - - var text = options.html || options.text; - - if (text) { - html += '
    ' + text + '
    '; - } - - html += '
    '; - - html += ''; - - html += ''; - - html += '
    '; - - dlg.innerHTML = html; - document.body.appendChild(dlg); - - var confirmed = false; - dlg.querySelector('.btnConfirm').addEventListener('click', function () { - confirmed = true; - dialogHelper.close(dlg); - }); - dlg.querySelector('.btnCancel').addEventListener('click', function () { - confirmed = false; - dialogHelper.close(dlg); - }); - - dialogHelper.open(dlg).then(function () { - - if (confirmed) { - resolve(); - } else { - reject(); - } - }); - } - - function showConfirm(options) { - return new Promise(function (resolve, reject) { - - require(['dialogHelper', 'emby-button'], function (dialogHelper) { - showConfirmInternal(options, dialogHelper, resolve, reject); - }); - }); - } +define(['dialog', 'globalize'], function (dialog, globalize) { return function (text, title) { @@ -124,10 +12,26 @@ define(['layoutManager', 'globalize'], function (layoutManager, globalize) { options = text; } - if (layoutManager.tv) { - return showTvConfirm(options); - } + var items = []; - return showConfirm(options); + items.push({ + name: globalize.translate('sharedcomponents#ButtonOk'), + id: 'ok' + }); + + items.push({ + name: globalize.translate('sharedcomponents#ButtonCancel'), + id: 'cancel' + }); + + options.buttons = items; + + return dialog(options).then(function (result) { + if (result == 'ok') { + return Promise.resolve(); + } + + return Promise.reject(); + }); }; }); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/dialog/dialog.js b/dashboard-ui/bower_components/emby-webcomponents/dialog/dialog.js new file mode 100644 index 000000000..272720695 --- /dev/null +++ b/dashboard-ui/bower_components/emby-webcomponents/dialog/dialog.js @@ -0,0 +1,126 @@ +define(['layoutManager', 'globalize'], function (layoutManager, globalize) { + + function showTvDialog(options) { + return new Promise(function (resolve, reject) { + + require(['actionsheet'], function (actionSheet) { + + var items = []; + + items.push({ + name: globalize.translate('sharedcomponents#ButtonOk'), + id: 'ok' + }); + + items.push({ + name: globalize.translate('sharedcomponents#ButtonCancel'), + id: 'cancel' + }); + + actionSheet.show({ + + title: options.text, + items: options.buttons + + }).then(resolve, reject); + }); + }); + } + + function showDialogInternal(options, dialogHelper, resolve, reject) { + + var dialogOptions = { + removeOnClose: true + }; + + var backButton = false; + + if (layoutManager.tv) { + dialogOptions.size = 'fullscreen'; + backButton = true; + dialogOptions.autoFocus = true; + } else { + + dialogOptions.modal = false; + dialogOptions.entryAnimationDuration = 160; + dialogOptions.exitAnimationDuration = 160; + dialogOptions.autoFocus = true; + } + + var dlg = dialogHelper.createDialog(dialogOptions); + var html = ''; + + if (options.title) { + html += '

    ' + options.title + '

    '; + } + + var text = options.html || options.text; + + if (text) { + html += '
    ' + text + '
    '; + } + + html += '
    '; + + var i, length; + for (i = 0, length = options.buttons.length; i < length; i++) { + + var item = options.buttons[i]; + var autoFocus = i == 0 ? ' autofocus' : ''; + html += ''; + } + + html += '
    '; + + dlg.innerHTML = html; + document.body.appendChild(dlg); + + var dialogResult; + function onButtonClick() { + dialogResult = this.getAttribute('data-id'); + dialogHelper.close(dlg); + } + + var buttons = dlg.querySelectorAll('.btnOption'); + for (i = 0, length = options.buttons.length; i < length; i++) { + buttons[i].addEventListener('click', onButtonClick); + } + + dialogHelper.open(dlg).then(function () { + + if (dialogResult) { + resolve(dialogResult); + } else { + reject(); + } + }); + } + + function showDialog(options) { + return new Promise(function (resolve, reject) { + + require(['dialogHelper', 'emby-button'], function (dialogHelper) { + showDialogInternal(options, dialogHelper, resolve, reject); + }); + }); + } + + return function (text, title) { + + var options; + if (typeof text === 'string') { + options = { + title: title, + text: text + }; + } else { + options = text; + } + + if (layoutManager.tv) { + return showTvDialog(options); + } + + return showDialog(options); + }; +}); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/listview/listview.css b/dashboard-ui/bower_components/emby-webcomponents/listview/listview.css index c2987411a..17a59f638 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/listview/listview.css +++ b/dashboard-ui/bower_components/emby-webcomponents/listview/listview.css @@ -1,7 +1,7 @@ button.listItem { background: transparent; - border: 0 !important; - border-bottom: 1px solid #2a2a2a !important; + border: 0; + border-bottom: 1px solid #2a2a2a; cursor: pointer; outline: none !important; color: inherit; @@ -138,7 +138,7 @@ div.listItem { transform: scale(1.025, 1.025); } - .listItem > .fab:first-child { + .listItem > .fab:first-child, .listItem > i:first-child { margin-left: .75em; } diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/en-US.json b/dashboard-ui/bower_components/emby-webcomponents/strings/en-US.json index e0a07ffdb..1f3bff351 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/en-US.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/en-US.json @@ -127,5 +127,6 @@ "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", "MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?", - "Error": "Error" + "Error": "Error", + "VoiceInput": "Voice Input" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/voice/voicedialog.js b/dashboard-ui/bower_components/emby-webcomponents/voice/voicedialog.js index b394f8242..fe63ca629 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/voice/voicedialog.js +++ b/dashboard-ui/bower_components/emby-webcomponents/voice/voicedialog.js @@ -114,7 +114,7 @@ define(['dialogHelper', './voicereceiver', './voiceprocessor', 'globalize', 'emb html += '
    '; html += ''; html += '
    '; - //html += title; + html += globalize.translate('sharedcomponents#VoiceInput'); html += '
    '; html += '
    '; diff --git a/dashboard-ui/scripts/itemdetailpage.js b/dashboard-ui/scripts/itemdetailpage.js index d28c94ab0..0b92da967 100644 --- a/dashboard-ui/scripts/itemdetailpage.js +++ b/dashboard-ui/scripts/itemdetailpage.js @@ -70,6 +70,7 @@ queue: false, playAllFromHere: false, queueAllFromHere: false, + sync: false, positionTo: button }; } diff --git a/dashboard-ui/scripts/site.js b/dashboard-ui/scripts/site.js index 69f198f12..24ee0a92e 100644 --- a/dashboard-ui/scripts/site.js +++ b/dashboard-ui/scripts/site.js @@ -2175,6 +2175,8 @@ var AppInfo = {}; define("alert", [embyWebComponentsBowerPath + "/alert/alert"], returnFirstDependency); } + define("dialog", [embyWebComponentsBowerPath + "/dialog/dialog"], returnFirstDependency); + if (preferNativeAlerts && window.confirm) { define("confirm", [embyWebComponentsBowerPath + "/confirm/nativeconfirm"], returnFirstDependency); } else { From 79240b1a2416dc1d51a0612e5e1e7f181f53cb11 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Wed, 20 Jul 2016 09:56:24 -0400 Subject: [PATCH 5/5] update voice --- .../emby-webcomponents/.bower.json | 8 +- .../emby-webcomponents/alert/alert.js | 103 ++++-------------- .../voice/commands/playcommands.js | 14 ++- .../voice/grammarprocessor.js | 1 - .../emby-webcomponents/voice/voicedialog.js | 8 +- .../voice/voiceprocessor.js | 37 ++++--- .../emby-webcomponents/voice/voicereceiver.js | 42 +++++-- dashboard-ui/scripts/site.js | 2 + 8 files changed, 90 insertions(+), 125 deletions(-) diff --git a/dashboard-ui/bower_components/emby-webcomponents/.bower.json b/dashboard-ui/bower_components/emby-webcomponents/.bower.json index ab9c8a073..2749bde15 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/.bower.json +++ b/dashboard-ui/bower_components/emby-webcomponents/.bower.json @@ -15,12 +15,12 @@ }, "devDependencies": {}, "ignore": [], - "version": "1.4.107", - "_release": "1.4.107", + "version": "1.4.108", + "_release": "1.4.108", "_resolution": { "type": "version", - "tag": "1.4.107", - "commit": "924bb12b6d7c3536ee00fc1a58ac4c492c36f559" + "tag": "1.4.108", + "commit": "42932aca23d729123c468fa71c73d84483025aca" }, "_source": "https://github.com/MediaBrowser/emby-webcomponents.git", "_target": "^1.2.0", diff --git a/dashboard-ui/bower_components/emby-webcomponents/alert/alert.js b/dashboard-ui/bower_components/emby-webcomponents/alert/alert.js index 2bb5d361b..25a65a1ec 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/alert/alert.js +++ b/dashboard-ui/bower_components/emby-webcomponents/alert/alert.js @@ -1,95 +1,32 @@ -define(['dialogHelper', 'layoutManager', 'globalize', 'material-icons', 'css!./../prompt/style.css', 'emby-button', 'paper-icon-button-light'], function (dialogHelper, layoutManager, globalize) { +define(['dialog', 'globalize'], function (dialog, globalize) { - function getIcon(icon, cssClass, canFocus, autoFocus) { + return function (text, title) { - var tabIndex = canFocus ? '' : ' tabindex="-1"'; - autoFocus = autoFocus ? ' autofocus' : ''; - return ''; - } - - return function (options) { - - if (typeof options === 'string') { + var options; + if (typeof text === 'string') { options = { - title: '', - text: options + title: title, + text: text }; - } - - var dialogOptions = { - removeOnClose: true - }; - - var backButton = false; - var raisedButtons = false; - var isFullscreen = false; - - if (layoutManager.tv) { - dialogOptions.size = 'fullscreen'; - backButton = true; - raisedButtons = true; - isFullscreen = true; } else { - - dialogOptions.modal = false; - dialogOptions.entryAnimationDuration = 160; - dialogOptions.exitAnimationDuration = 200; + options = text; } - var dlg = dialogHelper.createDialog(dialogOptions); + var items = []; - dlg.classList.add('promptDialog'); - - var html = ''; - - html += '
    '; - if (backButton) { - html += getIcon('', 'btnPromptExit', false); - } - - if (options.title) { - html += '

    '; - html += options.title; - html += '

    '; - } else if (!isFullscreen) { - // Add a little space so it's not hugging the border - html += '
    '; - } - - var text = options.html || options.text; - - if (text) { - - if (options.title) { - html += '

    '; - } else { - html += '

    '; - } - - html += text; - html += '

    '; - } - - var buttonText = options.type == 'error' ? 'sharedcomponents#ButtonOk' : 'sharedcomponents#ButtonGotIt'; - if (raisedButtons) { - html += ''; - } else { - html += '
    '; - html += ''; - html += '
    '; - } - - html += '
    '; - - dlg.innerHTML = html; - - document.body.appendChild(dlg); - - dlg.querySelector('.btnSubmit').addEventListener('click', function (e) { - - dialogHelper.close(dlg); + items.push({ + name: globalize.translate('sharedcomponents#ButtonOk'), + id: 'ok' }); - return dialogHelper.open(dlg); + options.buttons = items; + + return dialog(options).then(function (result) { + if (result == 'ok') { + return Promise.resolve(); + } + + return Promise.reject(); + }); }; }); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/voice/commands/playcommands.js b/dashboard-ui/bower_components/emby-webcomponents/voice/commands/playcommands.js index dcc659584..6cdfefef2 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/voice/commands/playcommands.js +++ b/dashboard-ui/bower_components/emby-webcomponents/voice/commands/playcommands.js @@ -10,13 +10,15 @@ items = shuffleArray(items); } - items = items.map(function (i) { - return i.Id; - }); - if (items.length) { + var serverId = items[0].ServerId; + items = items.map(function (i) { + return i.Id; + }); + playbackManager.play({ - ids: items + ids: items, + serverId: serverId }); } else { @@ -63,6 +65,7 @@ } var apiClient = connectionManager.currentApiClient(); + if (result.item.sourceid === 'nextup') { apiClient.getNextUpEpisodes(query).then(function (queryResult) { @@ -90,7 +93,6 @@ query.Filters = 'IsFavorite'; } - apiClient.getItems(apiClient.getCurrentUserId(), query).then(function (queryResult) { playItems(queryResult.Items, result.item.shuffle); diff --git a/dashboard-ui/bower_components/emby-webcomponents/voice/grammarprocessor.js b/dashboard-ui/bower_components/emby-webcomponents/voice/grammarprocessor.js index 4b0bbca76..f1a792127 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/voice/grammarprocessor.js +++ b/dashboard-ui/bower_components/emby-webcomponents/voice/grammarprocessor.js @@ -85,7 +85,6 @@ define([], function () { }, command: null, text: text, - userId: Dashboard.getCurrentUserId(), success: false }; diff --git a/dashboard-ui/bower_components/emby-webcomponents/voice/voicedialog.js b/dashboard-ui/bower_components/emby-webcomponents/voice/voicedialog.js index fe63ca629..7006dc38e 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/voice/voicedialog.js +++ b/dashboard-ui/bower_components/emby-webcomponents/voice/voicedialog.js @@ -1,4 +1,4 @@ -define(['dialogHelper', './voicereceiver', './voiceprocessor', 'globalize', 'emby-button', 'css!./voice.css', 'material-icons', 'css!./../formdialog'], function (dialogHelper, voicereceiver, voiceprocessor, globalize) { +define(['dialogHelper', 'voiceReceiver', 'voiceProcessor', 'globalize', 'emby-button', 'css!./voice.css', 'material-icons', 'css!./../formdialog'], function (dialogHelper, voicereceiver, voiceprocessor, globalize) { var lang = 'en-US'; @@ -244,7 +244,11 @@ define(['dialogHelper', './voicereceiver', './voiceprocessor', 'globalize', 'emb listen(); } function listen() { - voicereceiver.listenForCommand(lang || "en-US").then(processInput).then(function (result) { + voicereceiver.listen({ + + lang: lang || "en-US" + + }).then(processInput).then(function (result) { closeDialog(); diff --git a/dashboard-ui/bower_components/emby-webcomponents/voice/voiceprocessor.js b/dashboard-ui/bower_components/emby-webcomponents/voice/voiceprocessor.js index dfb8732ce..e8956b371 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/voice/voiceprocessor.js +++ b/dashboard-ui/bower_components/emby-webcomponents/voice/voiceprocessor.js @@ -23,24 +23,27 @@ /// . function processTranscript(text) { if (text) { - var processor = grammarprocessor(commandgroups, text); - if (processor && processor.command) { - console.log("Command from Grammar Processor", processor); - return voicecommands(processor) - .then(function (result) { - console.log("Result of executed command", result); - if (result.item.actionid === 'show' && result.item.sourceid === 'group') { - return Promise.resolve({ error: "group", item: result.item, groupName: result.name, fn: result.fn }); - } else { - return Promise.resolve({ item: result.item, fn: result.fn }); - } - }, function () { - return Promise.reject({ error: "unrecognized-command", text: text }); - }); - } else { - return Promise.reject({ error: "unrecognized-command", text: text }); - } + return getCommandGroups().then(function (commandgroups) { + var processor = grammarprocessor(commandgroups, text); + if (processor && processor.command) { + console.log("Command from Grammar Processor", processor); + return voicecommands(processor) + .then(function (result) { + + console.log("Result of executed command", result); + if (result.item.actionid === 'show' && result.item.sourceid === 'group') { + return Promise.resolve({ error: "group", item: result.item, groupName: result.name, fn: result.fn }); + } else { + return Promise.resolve({ item: result.item, fn: result.fn }); + } + }, function () { + return Promise.reject({ error: "unrecognized-command", text: text }); + }); + } else { + return Promise.reject({ error: "unrecognized-command", text: text }); + } + }); } else { return Promise.reject({ error: "empty" }); diff --git a/dashboard-ui/bower_components/emby-webcomponents/voice/voicereceiver.js b/dashboard-ui/bower_components/emby-webcomponents/voice/voicereceiver.js index d25bd115f..9c96a8c72 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/voice/voicereceiver.js +++ b/dashboard-ui/bower_components/emby-webcomponents/voice/voicereceiver.js @@ -1,10 +1,15 @@ -define([], function () { - var currentRecognition = null; +define(['events'], function (events) { + var receiver = { + + }; + + var currentRecognition = null; /// Starts listening for voice commands /// . - function listenForCommand(lang) { + function listen(options) { + return new Promise(function (resolve, reject) { cancelListener(); @@ -13,13 +18,28 @@ window.mozSpeechRecognition || window.oSpeechRecognition || window.msSpeechRecognition)(); - recognition.lang = lang; + + recognition.lang = options.lang; + recognition.continuous = options.continuous || false; + + var resultCount = 0; recognition.onresult = function (event) { console.log(event); if (event.results.length > 0) { - var resultInput = event.results[0][0].transcript || ''; - resolve(resultInput); + + var resultInput = event.results[resultCount][0].transcript || ''; + resultCount++; + + if (options.continuous) { + events.trigger(receiver, 'input', [ + { + text: resultInput + } + ]); + } else { + resolve(resultInput); + } } }; @@ -36,7 +56,6 @@ }); } - /// Cancel listener. /// . function cancelListener() { @@ -48,10 +67,9 @@ } - /// An enum constant representing the window. voice input manager option. - return { - listenForCommand: listenForCommand, - cancel: cancelListener - }; + receiver.listen = listen; + receiver.cancel = cancelListener; + /// An enum constant representing the window. voice input manager option. + return receiver; }); \ No newline at end of file diff --git a/dashboard-ui/scripts/site.js b/dashboard-ui/scripts/site.js index 24ee0a92e..1baa1b53a 100644 --- a/dashboard-ui/scripts/site.js +++ b/dashboard-ui/scripts/site.js @@ -1830,6 +1830,8 @@ var AppInfo = {}; define("tvguide", [embyWebComponentsBowerPath + "/guide/guide", 'embyRouter'], returnFirstDependency); define("voiceDialog", [embyWebComponentsBowerPath + "/voice/voicedialog"], returnFirstDependency); + define("voiceReceiver", [embyWebComponentsBowerPath + "/voice/voicereceiver"], returnFirstDependency); + define("voiceProcessor", [embyWebComponentsBowerPath + "/voice/voiceprocessor"], returnFirstDependency); define("viewManager", [embyWebComponentsBowerPath + "/viewmanager/viewmanager"], function (viewManager) { window.ViewManager = viewManager;