From a1bc4141bb22aaeb975dc19c2132d4f162a60532 Mon Sep 17 00:00:00 2001 From: "Phyks (Lucas Verney)" Date: Sun, 18 Sep 2016 22:19:50 +0200 Subject: [PATCH] Add an action to flush current playlist --- app/actions/webplayer.js | 8 ++--- app/components/Playlist.jsx | 10 +++++- app/locales/en-US/index.js | 13 ++++---- app/locales/fr-FR/index.js | 13 ++++---- app/locales/messagesDescriptors/Playlist.js | 5 +++ app/views/PlaylistPage.jsx | 2 +- public/fix.ie9.js.map | 2 +- public/index.js | 34 ++++++++++----------- public/index.js.map | 2 +- 9 files changed, 52 insertions(+), 37 deletions(-) diff --git a/app/actions/webplayer.js b/app/actions/webplayer.js index 07a90da..72d7ac2 100644 --- a/app/actions/webplayer.js +++ b/app/actions/webplayer.js @@ -47,14 +47,14 @@ export const STOP_PLAYBACK = "STOP_PLAYBACK"; */ export function stopPlayback() { return (dispatch, getState) => { - // Handle reference counting - dispatch(decrementRefCount({ - song: getState().webplayer.get("playlist").toArray(), - })); // Stop playback dispatch ({ type: STOP_PLAYBACK, }); + // Handle reference counting + dispatch(decrementRefCount({ + song: getState().webplayer.get("playlist").toArray(), + })); }; } diff --git a/app/components/Playlist.jsx b/app/components/Playlist.jsx index 3e2eab8..5feeb2a 100644 --- a/app/components/Playlist.jsx +++ b/app/components/Playlist.jsx @@ -1,3 +1,4 @@ +// TODO: Styling // NPM import import React, { Component, PropTypes } from "react"; import Immutable from "immutable"; @@ -36,6 +37,12 @@ class PlaylistIntl extends Component { }; playlistText = (
+

+ +

+

@@ -68,7 +75,8 @@ class PlaylistIntl extends Component { } PlaylistIntl.propTypes = { playAction: PropTypes.func.isRequired, - playNextAction: PropTypes.func.isRequired, + playNextAction: PropTypes.func, + flushAction: PropTypes.func.isRequired, songs: PropTypes.instanceOf(Immutable.List).isRequired, currentIndex: PropTypes.number.isRequired, intl: intlShape.isRequired, diff --git a/app/locales/en-US/index.js b/app/locales/en-US/index.js index 8f6515e..e1d4e18 100644 --- a/app/locales/en-US/index.js +++ b/app/locales/en-US/index.js @@ -11,7 +11,7 @@ module.exports = { "app.common.loading": "Loading…", // Loading indicator "app.common.pause": "Pause", // Pause icon description "app.common.play": "Play", // Play icon description - "app.common.playNext": "Play next", // "Play next icon descripton" + "app.common.playNext": "Play next", // Play next icon descripton "app.common.track": "{itemCount, plural, one {track} other {tracks}}", // Track "app.filter.filter": "Filter…", // Filtering input placeholder "app.filter.whatAreWeListeningToToday": "What are we listening to today?", // Description for the filter bar @@ -32,10 +32,11 @@ module.exports = { "app.pagination.goToPageWithoutMarkup": "Go to page {pageNumber}", // Link title to go to page N "app.pagination.pageNavigation": "Page navigation", // ARIA label for the nav block containing pagination "app.pagination.pageToGoTo": "Page to go to?", // Title of the pagination modal - "app.playlist.currentSongPlaying": "Current song playing", // "Current song playing" - "app.playlist.emptyPlaylist": "Empty playlist", // "Empty playlist message" - "app.playlist.fullPlaylist": "Full playlist", // "Full playlist" - "app.playlist.playlist": "Playlist", // "Playlist translation" + "app.playlist.currentSongPlaying": "Current song playing", // Current song playing + "app.playlist.emptyPlaylist": "Empty playlist", // Empty playlist message + "app.playlist.flushPlaylist": "Empty the playlist", // Empty the playlist link label + "app.playlist.fullPlaylist": "Full playlist", // Full playlist + "app.playlist.playlist": "Playlist", // Playlist translation "app.sidebarLayout.browse": "Browse", // Browse "app.sidebarLayout.browseAlbums": "Browse albums", // Browse albums "app.sidebarLayout.browseArtists": "Browse artists", // Browse artists @@ -56,6 +57,6 @@ module.exports = { "app.webplayer.previous": "Previous", // Previous button description "app.webplayer.random": "Random", // Random button description "app.webplayer.repeat": "Repeat", // Repeat button description - "app.webplayer.unsupported": "Unsupported media type", // "Unsupported media type", + "app.webplayer.unsupported":"Unsupported media type", // Unsupported media type "app.webplayer.volume": "Volume", // Volume button description }; diff --git a/app/locales/fr-FR/index.js b/app/locales/fr-FR/index.js index 5da5a01..88429a4 100644 --- a/app/locales/fr-FR/index.js +++ b/app/locales/fr-FR/index.js @@ -11,7 +11,7 @@ module.exports = { "app.common.loading": "Chargement…", // Loading indicator "app.common.pause": "Pause", // Pause icon description "app.common.play": "Jouer", // PLay icon description - "app.common.playNext": "Jouer après", // "Play next icon descripton" + "app.common.playNext": "Jouer après", // Play next icon descripton "app.common.track": "{itemCount, plural, one {piste} other {pistes}}", // Track "app.filter.filter": "Filtrer…", // Filtering input placeholder "app.filter.whatAreWeListeningToToday": "Que voulez-vous écouter aujourd'hui\u00a0?", // Description for the filter bar @@ -32,10 +32,11 @@ module.exports = { "app.pagination.goToPageWithoutMarkup": "Aller à la page {pageNumber}", // Link title to go to page N "app.pagination.pageNavigation": "Navigation entre les pages", // ARIA label for the nav block containing pagination "app.pagination.pageToGoTo": "Page à laquelle aller\u00a0?", // Title of the pagination modal - "app.playlist.currentSongPlaying": "Piste en cours de lecture", // "Current song playing", - "app.playlist.emptyPlaylist": "Liste de lecture vide", // "Empty playlist message" - "app.playlist.fullPlaylist": "Playlist complète", // "Full playlist", - "app.playlist.playlist": "Liste de lecture", // "Playlist translation" + "app.playlist.currentSongPlaying": "Piste en cours de lecture", // Current song playing + "app.playlist.emptyPlaylist": "Liste de lecture vide", // Empty playlist message + "app.playlist.flushPlaylist": "Vider la playlist", // Empty the playlist link label + "app.playlist.fullPlaylist": "Playlist complète", // Full playlist + "app.playlist.playlist": "Liste de lecture", // Playlist translation "app.sidebarLayout.browse": "Explorer", // Browse "app.sidebarLayout.browseAlbums": "Parcourir les albums", // Browse albums "app.sidebarLayout.browseArtists": "Parcourir les artistes", // Browse artists @@ -56,6 +57,6 @@ module.exports = { "app.webplayer.previous": "Précédent", // Previous button description "app.webplayer.random": "Aléatoire", // Random button description "app.webplayer.repeat": "Répéter", // Repeat button description - "app.webplayer.unsupported": "Format non supporté", // "Unsupported media type", + "app.webplayer.unsupported": "Format non supporté", // Unsupported media type "app.webplayer.volume": "Volume", // Volume button description }; diff --git a/app/locales/messagesDescriptors/Playlist.js b/app/locales/messagesDescriptors/Playlist.js index 2d673c3..40fb986 100644 --- a/app/locales/messagesDescriptors/Playlist.js +++ b/app/locales/messagesDescriptors/Playlist.js @@ -19,6 +19,11 @@ const messages = [ "defaultMessage": "Empty playlist", "description": "Empty playlist message", }, + { + "id": "app.playlist.flushPlaylist", + "defaultMessage": "Empty the playlist", + "description": "Empty the playlist link label", + }, ]; export default messages; diff --git a/app/views/PlaylistPage.jsx b/app/views/PlaylistPage.jsx index 22d0f3e..1481618 100644 --- a/app/views/PlaylistPage.jsx +++ b/app/views/PlaylistPage.jsx @@ -17,7 +17,7 @@ import Playlist from "../components/Playlist"; class PlaylistPage extends Component { render() { return ( - + ); } } diff --git a/public/fix.ie9.js.map b/public/fix.ie9.js.map index e24d213..5adbeec 100644 --- a/public/fix.ie9.js.map +++ b/public/fix.ie9.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///fix.ie9.js","webpack:///webpack/bootstrap 2364c394875e708d132f?87df","webpack:///./fix.ie9.js","webpack:///./~/html5shiv/dist/html5shiv.js"],"names":["modules","__webpack_require__","moduleId","installedModules","exports","module","id","loaded","call","m","c","p","0","Object","defineProperty","value","_html5shiv","keys","forEach","key","enumerable","get","639","window","document","addStyleSheet","ownerDocument","cssText","createElement","parent","getElementsByTagName","documentElement","innerHTML","insertBefore","lastChild","firstChild","getElements","elements","html5","split","addElements","newElements","join","shivDocument","getExpandoData","data","expandoData","expando","expanID","nodeName","supportsUnknownElements","node","cache","cloneNode","saveClones","test","createElem","canHaveChildren","reSkip","tagUrn","frag","appendChild","createDocumentFragment","clone","i","elems","l","length","shivMethods","createFrag","Function","replace","shivCSS","supportsHtml5Styles","hasCSS","version","options","a","childNodes","e","type","this"],"mappings":"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","file":"fix.ie9.js","sourcesContent":["/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"./\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _html5shiv = __webpack_require__(639);\n\t\n\tObject.keys(_html5shiv).forEach(function (key) {\n\t if (key === \"default\" || key === \"__esModule\") return;\n\t Object.defineProperty(exports, key, {\n\t enumerable: true,\n\t get: function get() {\n\t return _html5shiv[key];\n\t }\n\t });\n\t});\n\n/***/ },\n\n/***/ 639:\n/***/ function(module, exports) {\n\n\t/**\n\t* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed\n\t*/\n\t;(function(window, document) {\n\t/*jshint evil:true */\n\t /** version */\n\t var version = '3.7.3-pre';\n\t\n\t /** Preset options */\n\t var options = window.html5 || {};\n\t\n\t /** Used to skip problem elements */\n\t var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i;\n\t\n\t /** Not all elements can be cloned in IE **/\n\t var saveClones = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i;\n\t\n\t /** Detect whether the browser supports default html5 styles */\n\t var supportsHtml5Styles;\n\t\n\t /** Name of the expando, to work with multiple documents or to re-shiv one document */\n\t var expando = '_html5shiv';\n\t\n\t /** The id for the the documents expando */\n\t var expanID = 0;\n\t\n\t /** Cached data for each document */\n\t var expandoData = {};\n\t\n\t /** Detect whether the browser supports unknown elements */\n\t var supportsUnknownElements;\n\t\n\t (function() {\n\t try {\n\t var a = document.createElement('a');\n\t a.innerHTML = '';\n\t //if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles\n\t supportsHtml5Styles = ('hidden' in a);\n\t\n\t supportsUnknownElements = a.childNodes.length == 1 || (function() {\n\t // assign a false positive if unable to shiv\n\t (document.createElement)('a');\n\t var frag = document.createDocumentFragment();\n\t return (\n\t typeof frag.cloneNode == 'undefined' ||\n\t typeof frag.createDocumentFragment == 'undefined' ||\n\t typeof frag.createElement == 'undefined'\n\t );\n\t }());\n\t } catch(e) {\n\t // assign a false positive if detection fails => unable to shiv\n\t supportsHtml5Styles = true;\n\t supportsUnknownElements = true;\n\t }\n\t\n\t }());\n\t\n\t /*--------------------------------------------------------------------------*/\n\t\n\t /**\n\t * Creates a style sheet with the given CSS text and adds it to the document.\n\t * @private\n\t * @param {Document} ownerDocument The document.\n\t * @param {String} cssText The CSS text.\n\t * @returns {StyleSheet} The style element.\n\t */\n\t function addStyleSheet(ownerDocument, cssText) {\n\t var p = ownerDocument.createElement('p'),\n\t parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement;\n\t\n\t p.innerHTML = 'x';\n\t return parent.insertBefore(p.lastChild, parent.firstChild);\n\t }\n\t\n\t /**\n\t * Returns the value of `html5.elements` as an array.\n\t * @private\n\t * @returns {Array} An array of shived element node names.\n\t */\n\t function getElements() {\n\t var elements = html5.elements;\n\t return typeof elements == 'string' ? elements.split(' ') : elements;\n\t }\n\t\n\t /**\n\t * Extends the built-in list of html5 elements\n\t * @memberOf html5\n\t * @param {String|Array} newElements whitespace separated list or array of new element names to shiv\n\t * @param {Document} ownerDocument The context document.\n\t */\n\t function addElements(newElements, ownerDocument) {\n\t var elements = html5.elements;\n\t if(typeof elements != 'string'){\n\t elements = elements.join(' ');\n\t }\n\t if(typeof newElements != 'string'){\n\t newElements = newElements.join(' ');\n\t }\n\t html5.elements = elements +' '+ newElements;\n\t shivDocument(ownerDocument);\n\t }\n\t\n\t /**\n\t * Returns the data associated to the given document\n\t * @private\n\t * @param {Document} ownerDocument The document.\n\t * @returns {Object} An object of data.\n\t */\n\t function getExpandoData(ownerDocument) {\n\t var data = expandoData[ownerDocument[expando]];\n\t if (!data) {\n\t data = {};\n\t expanID++;\n\t ownerDocument[expando] = expanID;\n\t expandoData[expanID] = data;\n\t }\n\t return data;\n\t }\n\t\n\t /**\n\t * returns a shived element for the given nodeName and document\n\t * @memberOf html5\n\t * @param {String} nodeName name of the element\n\t * @param {Document} ownerDocument The context document.\n\t * @returns {Object} The shived element.\n\t */\n\t function createElement(nodeName, ownerDocument, data){\n\t if (!ownerDocument) {\n\t ownerDocument = document;\n\t }\n\t if(supportsUnknownElements){\n\t return ownerDocument.createElement(nodeName);\n\t }\n\t if (!data) {\n\t data = getExpandoData(ownerDocument);\n\t }\n\t var node;\n\t\n\t if (data.cache[nodeName]) {\n\t node = data.cache[nodeName].cloneNode();\n\t } else if (saveClones.test(nodeName)) {\n\t node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode();\n\t } else {\n\t node = data.createElem(nodeName);\n\t }\n\t\n\t // Avoid adding some elements to fragments in IE < 9 because\n\t // * Attributes like `name` or `type` cannot be set/changed once an element\n\t // is inserted into a document/fragment\n\t // * Link elements with `src` attributes that are inaccessible, as with\n\t // a 403 response, will cause the tab/window to crash\n\t // * Script elements appended to fragments will execute when their `src`\n\t // or `text` property is set\n\t return node.canHaveChildren && !reSkip.test(nodeName) && !node.tagUrn ? data.frag.appendChild(node) : node;\n\t }\n\t\n\t /**\n\t * returns a shived DocumentFragment for the given document\n\t * @memberOf html5\n\t * @param {Document} ownerDocument The context document.\n\t * @returns {Object} The shived DocumentFragment.\n\t */\n\t function createDocumentFragment(ownerDocument, data){\n\t if (!ownerDocument) {\n\t ownerDocument = document;\n\t }\n\t if(supportsUnknownElements){\n\t return ownerDocument.createDocumentFragment();\n\t }\n\t data = data || getExpandoData(ownerDocument);\n\t var clone = data.frag.cloneNode(),\n\t i = 0,\n\t elems = getElements(),\n\t l = elems.length;\n\t for(;i