From d5da4e48180a4ed4713572265ab2e9c76a13d1b8 Mon Sep 17 00:00:00 2001 From: "Phyks (Lucas Verney)" Date: Tue, 2 Aug 2016 13:07:12 +0200 Subject: [PATCH] Fix grid + begin play buttons --- app/actions/auth.js | 2 +- app/components/Album.jsx | 13 ++- app/components/Albums.jsx | 1 + app/components/Artists.jsx | 1 + app/components/Login.jsx | 4 +- app/components/Songs.jsx | 11 +- app/components/elements/FilterBar.jsx | 2 +- app/components/elements/Grid.jsx | 32 +++--- app/components/elements/Pagination.jsx | 6 +- app/dist/fix.ie9.js.map | 2 +- app/dist/index.js | 44 ++++---- app/dist/index.js.map | 2 +- app/locales/en-US/index.js | 1 + app/locales/fr-FR/index.js | 1 + app/locales/messagesDescriptors/common.js | 5 + app/middleware/api.js | 128 +++++++++++----------- 16 files changed, 142 insertions(+), 113 deletions(-) diff --git a/app/actions/auth.js b/app/actions/auth.js index e9d10ed..04b9a40 100644 --- a/app/actions/auth.js +++ b/app/actions/auth.js @@ -143,7 +143,7 @@ export function loginUser(username, passwordOrToken, endpoint, rememberMe, redir loginUserRequest, jsonData => dispatch => { if (!jsonData.auth || !jsonData.sessionExpire) { - return Promise.reject(new i18nRecord({ id: "app.api.error", values: {} })); + return dispatch(loginUserFailure(new i18nRecord({ id: "app.api.error", values: {} }))); } const token = { token: jsonData.auth, diff --git a/app/components/Album.jsx b/app/components/Album.jsx index fc5347b..ae6c630 100644 --- a/app/components/Album.jsx +++ b/app/components/Album.jsx @@ -1,15 +1,26 @@ import React, { Component, PropTypes } from "react"; import CSSModules from "react-css-modules"; +import { defineMessages, FormattedMessage } from "react-intl"; -import { formatLength } from "../utils"; +import { formatLength, messagesMap } from "../utils"; + +import commonMessages from "../locales/messagesDescriptors/common"; import css from "../styles/Album.scss"; +const albumMessages = defineMessages(messagesMap(commonMessages)); + export class AlbumTrackRow extends Component { render () { const length = formatLength(this.props.track.length); return ( + + + + + + {this.props.track.track} {this.props.track.name} {length} diff --git a/app/components/Albums.jsx b/app/components/Albums.jsx index 90e5c4f..aba6be9 100644 --- a/app/components/Albums.jsx +++ b/app/components/Albums.jsx @@ -8,6 +8,7 @@ export default class Albums extends Component { const grid = { isFetching: this.props.isFetching, items: this.props.albums, + itemsType: "album", itemsLabel: "app.common.album", subItemsType: "tracks", subItemsLabel: "app.common.track" diff --git a/app/components/Artists.jsx b/app/components/Artists.jsx index 40d5f18..94eb5ab 100644 --- a/app/components/Artists.jsx +++ b/app/components/Artists.jsx @@ -8,6 +8,7 @@ class Artists extends Component { const grid = { isFetching: this.props.isFetching, items: this.props.artists, + itemsType: "artist", itemsLabel: "app.common.artist", subItemsType: "albums", subItemsLabel: "app.common.album" diff --git a/app/components/Login.jsx b/app/components/Login.jsx index 6fd71cb..001bb5f 100644 --- a/app/components/Login.jsx +++ b/app/components/Login.jsx @@ -175,8 +175,8 @@ Login.propTypes = { rememberMe: PropTypes.bool, onSubmit: PropTypes.func.isRequired, isAuthenticating: PropTypes.bool, - error: PropTypes.string, - info: PropTypes.oneOfType([PropTypes.string, PropTypes.object]) + info: PropTypes.oneOfType([PropTypes.string, PropTypes.object]), + error: PropTypes.oneOfType([PropTypes.string, PropTypes.object]) }; export default CSSModules(Login, css); diff --git a/app/components/Songs.jsx b/app/components/Songs.jsx index 45014c7..4cbf835 100644 --- a/app/components/Songs.jsx +++ b/app/components/Songs.jsx @@ -18,12 +18,17 @@ const songsMessages = defineMessages(messagesMap(Array.concat([], commonMessages export class SongsTableRow extends Component { render () { - const length = formatLength(this.props.song.length); + const length = formatLength(this.props.song.time); const linkToArtist = "/artist/" + this.props.song.artist.id; const linkToAlbum = "/album/" + this.props.song.album.id; return ( - + + + + + + {this.props.song.name} {this.props.song.artist.name} {this.props.song.album.name} @@ -45,7 +50,7 @@ class SongsTableCSS extends Component { if (this.props.filterText) { // Use Fuse for the filter displayedSongs = new Fuse( - this.props.songs, + this.props.songs.toArray(), { "keys": ["name"], "threshold": 0.4, diff --git a/app/components/elements/FilterBar.jsx b/app/components/elements/FilterBar.jsx index e4dd0ad..8153f27 100644 --- a/app/components/elements/FilterBar.jsx +++ b/app/components/elements/FilterBar.jsx @@ -29,7 +29,7 @@ class FilterBarCSSIntl extends Component {

-
+
diff --git a/app/components/elements/Grid.jsx b/app/components/elements/Grid.jsx index eb94df6..ae7bd25 100644 --- a/app/components/elements/Grid.jsx +++ b/app/components/elements/Grid.jsx @@ -30,10 +30,10 @@ class GridItemCSSIntl extends Component { var subItemsLabel = formatMessage(gridMessages[this.props.subItemsLabel], { itemCount: nSubItems }); - const to = "/" + this.props.item.type + "/" + this.props.item.id; - const id = "grid-item-" + this.props.item.type + "/" + this.props.item.id; + const to = "/" + this.props.itemsType + "/" + this.props.item.id; + const id = "grid-item-" + this.props.itemsType + "/" + this.props.item.id; - const title = formatMessage(gridMessages["app.grid.goTo" + this.props.item.type.capitalize() + "Page"]); + const title = formatMessage(gridMessages["app.grid.goTo" + this.props.itemsType.capitalize() + "Page"]); return (
@@ -48,6 +48,7 @@ class GridItemCSSIntl extends Component { GridItemCSSIntl.propTypes = { item: PropTypes.object.isRequired, + itemsType: PropTypes.string.isRequired, itemsLabel: PropTypes.string.isRequired, subItemsType: PropTypes.string.isRequired, subItemsLabel: PropTypes.string.isRequired, @@ -96,7 +97,7 @@ export class Grid extends Component { } // Use Fuse for the filter var result = new Fuse( - props.items, + props.items.toArray(), { "keys": ["name"], "threshold": 0.4, @@ -150,11 +151,12 @@ export class Grid extends Component { componentDidUpdate(prevProps) { // The list of keys seen in the previous render let currentKeys = prevProps.items.map( - (n) => "grid-item-" + n.type + "/" + n.id); + (n) => "grid-item-" + prevProps.itemsType + "/" + n.id); // The latest list of keys that have been rendered + const {itemsType} = this.props; let newKeys = this.props.items.map( - (n) => "grid-item-" + n.type + "/" + n.id); + (n) => "grid-item-" + itemsType + "/" + n.id); // Find which keys are new between the current set of keys and any new children passed to this component let addKeys = immutableDiff(newKeys, currentKeys); @@ -162,17 +164,17 @@ export class Grid extends Component { // Find which keys have been removed between the current set of keys and any new children passed to this component let removeKeys = immutableDiff(currentKeys, newKeys); + var iso = this.iso; if (removeKeys.count() > 0) { - removeKeys.forEach(removeKey => this.iso.remove(document.getElementById(removeKey))); - this.iso.arrange(); + removeKeys.forEach(removeKey => iso.remove(document.getElementById(removeKey))); + iso.arrange(); } if (addKeys.count() > 0) { const itemsToAdd = addKeys.map((addKey) => document.getElementById(addKey)).toArray(); - this.iso.addItems(itemsToAdd); - this.iso.arrange(); + iso.addItems(itemsToAdd); + iso.arrange(); } - var iso = this.iso; // Layout again after images are loaded imagesLoaded(this.refs.grid).on("progress", function() { // Layout after each image load, fix for responsive grid @@ -185,11 +187,9 @@ export class Grid extends Component { render () { var gridItems = []; - const itemsLabel = this.props.itemsLabel; - const subItemsType = this.props.subItemsType; - const subItemsLabel = this.props.subItemsLabel; + const { itemsType, itemsLabel, subItemsType, subItemsLabel } = this.props; this.props.items.forEach(function (item) { - gridItems.push(); + gridItems.push(); }); var loading = null; if (gridItems.length == 0 && this.props.isFetching) { @@ -220,8 +220,10 @@ export class Grid extends Component { Grid.propTypes = { isFetching: PropTypes.bool.isRequired, items: PropTypes.instanceOf(Immutable.List).isRequired, + itemsType: PropTypes.string.isRequired, itemsLabel: PropTypes.string.isRequired, subItemsType: PropTypes.string.isRequired, + subItemsLabel: PropTypes.string.isRequired, filterText: PropTypes.string }; diff --git a/app/components/elements/Pagination.jsx b/app/components/elements/Pagination.jsx index 8f87f1d..9945161 100644 --- a/app/components/elements/Pagination.jsx +++ b/app/components/elements/Pagination.jsx @@ -68,7 +68,7 @@ class PaginationCSSIntl extends Component { // Push first page pagesButton.push(
  • - +
  • @@ -95,7 +95,7 @@ class PaginationCSSIntl extends Component { const title = formatMessage(paginationMessages["app.pagination.goToPageWithoutMarkup"], { pageNumber: i }); pagesButton.push(
  • - + {currentSpan} @@ -117,7 +117,7 @@ class PaginationCSSIntl extends Component { // Push last page pagesButton.push(
  • - +
  • diff --git a/app/dist/fix.ie9.js.map b/app/dist/fix.ie9.js.map index 6a7b371..e53960e 100644 --- a/app/dist/fix.ie9.js.map +++ b/app/dist/fix.ie9.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///fix.ie9.js","webpack:///webpack/bootstrap e9d10e17e07a2f3e33a2?797f","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","599","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__(599);\n\t\n\tObject.keys(_html5shiv).forEach(function (key) {\n\t if (key === \"default\") 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/***/ 599:\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