Experimenting to persistant index store

This commit is contained in:
James Barnsley
2018-08-02 16:24:12 +12:00
parent ca8e122dcf
commit 9b01509803
8 changed files with 301 additions and 130 deletions

View File

@ -2601,6 +2601,11 @@ h4 {
h4 .dropdown-field { h4 .dropdown-field {
margin-left: 10px; } margin-left: 10px; }
h5 {
font-size: 1rem;
margin-bottom: 4px;
font-weight: 700; }
p a { p a {
color: inherit; } color: inherit; }
p a:hover { p a:hover {
@ -5736,6 +5741,10 @@ main header {
pointer-events: none; pointer-events: none;
width: 220px; width: 220px;
max-width: 98vw; } max-width: 98vw; }
.debug-info-section {
padding-top: 14px; }
.debug-info-section:first-child {
padding-top: 0; }
.has-tooltip { .has-tooltip {
position: relative; } position: relative; }

View File

@ -61265,6 +61265,32 @@ var localstorageMiddleware = function () {
session: null session: null
}); });
break; break;
/**
* Experimental saving of stores to localStorage
* This uses way too much storage space (ie 10MB+) so won't work. We need
* to use the IndexedDB engine instead for storing this quantity of data
case 'UPDATE_TRACKS_INDEX':
helpers.setStorage('core', {tracks: action.tracks});
next(action);
break;
case 'UPDATE_ALBUMS_INDEX':
helpers.setStorage('core', {albums: action.albums});
next(action);
break;
case 'UPDATE_ARTISTS_INDEX':
helpers.setStorage('core', {artists: action.artists});
next(action);
break;
case 'UPDATE_PLAYLISTS_INDEX':
helpers.setStorage('core', {playlists: action.playlists});
next(action);
break;
case 'UPDATE_USERS_INDEX':
helpers.setStorage('core', {users: action.users});
next(action);
break;
*/
} }
}; };
}; };
@ -64865,6 +64891,28 @@ var DebugInfo = function (_React$Component) {
} }
_createClass(DebugInfo, [{ _createClass(DebugInfo, [{
key: 'localStorageSize',
value: function localStorageSize() {
var data = '';
for (var key in window.localStorage) {
if (window.localStorage.hasOwnProperty(key)) {
data += window.localStorage[key];
}
}
var used = 0;
var total = 5000;
if (data !== '') {
used = (data.length * 16 / (8 * 1024)).toFixed(2);
}
return {
used: used,
percent: (used / total * 100).toFixed(2)
};
}
}, {
key: 'renderLoadQueue', key: 'renderLoadQueue',
value: function renderLoadQueue() { value: function renderLoadQueue() {
if (!this.props.ui.load_queue) { if (!this.props.ui.load_queue) {
@ -64876,7 +64924,7 @@ var DebugInfo = function (_React$Component) {
return _react2.default.createElement( return _react2.default.createElement(
'div', 'div',
{ className: 'item' }, { className: 'debug-info-item' },
queue queue
); );
} }
@ -64884,7 +64932,11 @@ var DebugInfo = function (_React$Component) {
key: 'renderLoadQueue', key: 'renderLoadQueue',
value: function renderLoadQueue() { value: function renderLoadQueue() {
if (!this.props.ui.load_queue) { if (!this.props.ui.load_queue) {
return null; return _react2.default.createElement(
'div',
{ className: 'debug-info-item grey-text' },
'Nothing loading'
);
} }
var load_queue = this.props.ui.load_queue; var load_queue = this.props.ui.load_queue;
@ -64902,90 +64954,115 @@ var DebugInfo = function (_React$Component) {
if (queue.length > 0) { if (queue.length > 0) {
return _react2.default.createElement( return _react2.default.createElement(
'div', 'div',
{ className: 'item' }, { className: 'debug-info-item' },
_react2.default.createElement('br', null),
queue queue
); );
} else { } else {
return null; return _react2.default.createElement(
'div',
{ className: 'debug-info-item grey-text' },
'Nothing loading'
);
} }
} }
}, { }, {
key: 'render', key: 'render',
value: function render() { value: function render() {
var localStorageUsage = this.localStorageSize();
return _react2.default.createElement( return _react2.default.createElement(
'div', 'div',
{ className: 'debug-info' }, { className: 'debug-info' },
_react2.default.createElement( _react2.default.createElement(
'div', 'div',
{ className: 'item' }, { className: 'debug-info-section' },
_react2.default.createElement(
'h5',
null,
'Indexes (',
localStorageUsage.percent,
'%, ',
localStorageUsage.used,
'KB)'
),
_react2.default.createElement(
'div',
{ className: 'debug-info-item' },
'Albums: ', 'Albums: ',
this.props.core.albums ? Object.keys(this.props.core.albums).length : '0' this.props.core.albums ? Object.keys(this.props.core.albums).length : '0'
), ),
_react2.default.createElement( _react2.default.createElement(
'div', 'div',
{ className: 'item' }, { className: 'debug-info-item' },
'Artists: ', 'Artists: ',
this.props.core.artists ? Object.keys(this.props.core.artists).length : '0' this.props.core.artists ? Object.keys(this.props.core.artists).length : '0'
), ),
_react2.default.createElement( _react2.default.createElement(
'div', 'div',
{ className: 'item' }, { className: 'debug-info-item' },
'Playlists: ', 'Playlists: ',
this.props.core.playlists ? Object.keys(this.props.core.playlists).length : '0' this.props.core.playlists ? Object.keys(this.props.core.playlists).length : '0'
), ),
_react2.default.createElement( _react2.default.createElement(
'div', 'div',
{ className: 'item' }, { className: 'debug-info-item' },
'Tracks: ', 'Tracks: ',
this.props.core.tracks ? Object.keys(this.props.core.tracks).length : '0' this.props.core.tracks ? Object.keys(this.props.core.tracks).length : '0'
), ),
_react2.default.createElement( _react2.default.createElement(
'div', 'div',
{ className: 'item' }, { className: 'debug-info-item' },
'Users: ', 'Users: ',
this.props.core.users ? Object.keys(this.props.core.users).length : '0' this.props.core.users ? Object.keys(this.props.core.users).length : '0'
), ),
_react2.default.createElement( _react2.default.createElement(
'div', 'div',
{ className: 'item' }, { className: 'debug-info-item' },
'Notifications: ', 'Notifications: ',
this.props.ui.notifications ? Object.keys(this.props.ui.notifications).length : '0' this.props.ui.notifications ? Object.keys(this.props.ui.notifications).length : '0'
), ),
_react2.default.createElement( _react2.default.createElement(
'div', 'div',
{ className: 'item' }, { className: 'debug-info-item' },
'Processes: ', 'Processes: ',
this.props.ui.processes ? Object.keys(this.props.ui.processes).length : '0' this.props.ui.processes ? Object.keys(this.props.ui.processes).length : '0'
), ),
_react2.default.createElement( _react2.default.createElement(
'div', 'div',
{ className: 'item' }, { className: 'debug-info-item' },
'Enqueue batches: ', 'Enqueue batches: ',
this.props.mopidy.enqueue_uris_batches ? this.props.mopidy.enqueue_uris_batches.length : '0' this.props.mopidy.enqueue_uris_batches ? this.props.mopidy.enqueue_uris_batches.length : '0'
)
), ),
_react2.default.createElement('br', null),
_react2.default.createElement( _react2.default.createElement(
'div', 'div',
{ className: 'item' }, { className: 'debug-info-section' },
_react2.default.createElement(
'h5',
null,
'Config'
),
_react2.default.createElement(
'div',
{ className: 'debug-info-item' },
'Slim mode: ', 'Slim mode: ',
this.props.ui.slim_mode ? 'on' : 'off' this.props.ui.slim_mode ? 'on' : 'off'
), ),
_react2.default.createElement( _react2.default.createElement(
'div', 'div',
{ className: 'item' }, { className: 'debug-info-item' },
'Test mode: ', 'Test mode: ',
this.props.ui.test_mode ? 'on' : 'off' this.props.ui.test_mode ? 'on' : 'off'
), ),
_react2.default.createElement( _react2.default.createElement(
'div', 'div',
{ className: 'item' }, { className: 'debug-info-item' },
'Touch: ', 'Touch: ',
helpers.isTouchDevice() ? 'on' : 'off' helpers.isTouchDevice() ? 'on' : 'off'
), ),
_react2.default.createElement( _react2.default.createElement(
'div', 'div',
{ className: 'item' }, { className: 'debug-info-item' },
'Selected tracks: ', 'Selected tracks: ',
this.props.ui.selected_tracks.length, this.props.ui.selected_tracks.length,
_react2.default.createElement('br', null), _react2.default.createElement('br', null),
@ -64996,8 +65073,18 @@ var DebugInfo = function (_React$Component) {
track_key track_key
); );
}) })
)
),
_react2.default.createElement(
'div',
{ className: 'debug-info-section' },
_react2.default.createElement(
'h5',
null,
'Load queue'
), ),
this.renderLoadQueue() this.renderLoadQueue()
)
); );
} }
}]); }]);

File diff suppressed because one or more lines are too long

View File

@ -98,7 +98,7 @@
// Release details // Release details
// These are automatically injected to built HTML // These are automatically injected to built HTML
var build = "1533153076"; var build = "1533153578";
var version = "3.23.0"; var version = "3.23.0";
// Construct the script tag // Construct the script tag

View File

@ -13,16 +13,37 @@ class DebugInfo extends React.Component{
super(props); super(props);
} }
localStorageSize(){
var data = '';
for (var key in window.localStorage){
if(window.localStorage.hasOwnProperty(key)){
data += window.localStorage[key];
}
}
var used = 0;
var total = 5000;
if (data !== ''){
used = ((data.length * 16)/(8 * 1024)).toFixed(2);
}
return {
used: used,
percent: (used / total * 100).toFixed(2)
};
}
renderLoadQueue(){ renderLoadQueue(){
if (!this.props.ui.load_queue){ if (!this.props.ui.load_queue){
return null return null
} }
var load_queue = this.props.ui.load_queue var load_queue = this.props.ui.load_queue;
var queue = [] var queue = [];
return ( return (
<div className="item"> <div className="debug-info-item">
{queue} {queue}
</div> </div>
) )
@ -30,7 +51,7 @@ class DebugInfo extends React.Component{
renderLoadQueue(){ renderLoadQueue(){
if (!this.props.ui.load_queue){ if (!this.props.ui.load_queue){
return null return <div className="debug-info-item grey-text">Nothing loading</div>;
} }
var load_queue = this.props.ui.load_queue var load_queue = this.props.ui.load_queue
@ -43,54 +64,61 @@ class DebugInfo extends React.Component{
if (queue.length > 0){ if (queue.length > 0){
return ( return (
<div className="item"> <div className="debug-info-item">
<br />
{queue} {queue}
</div> </div>
) )
} else { } else {
return null return <div className="debug-info-item grey-text">Nothing loading</div>;
} }
} }
render(){ render(){
var localStorageUsage = this.localStorageSize();
return ( return (
<div className="debug-info"> <div className="debug-info">
<div className="item">
<div className="debug-info-section">
<h5>Indexes ({localStorageUsage.percent}%, {localStorageUsage.used}KB)</h5>
<div className="debug-info-item">
Albums: {this.props.core.albums ? Object.keys(this.props.core.albums).length : '0'} Albums: {this.props.core.albums ? Object.keys(this.props.core.albums).length : '0'}
</div> </div>
<div className="item"> <div className="debug-info-item">
Artists: {this.props.core.artists ? Object.keys(this.props.core.artists).length : '0'} Artists: {this.props.core.artists ? Object.keys(this.props.core.artists).length : '0'}
</div> </div>
<div className="item"> <div className="debug-info-item">
Playlists: {this.props.core.playlists ? Object.keys(this.props.core.playlists).length : '0'} Playlists: {this.props.core.playlists ? Object.keys(this.props.core.playlists).length : '0'}
</div> </div>
<div className="item"> <div className="debug-info-item">
Tracks: {this.props.core.tracks ? Object.keys(this.props.core.tracks).length : '0'} Tracks: {this.props.core.tracks ? Object.keys(this.props.core.tracks).length : '0'}
</div> </div>
<div className="item"> <div className="debug-info-item">
Users: {this.props.core.users ? Object.keys(this.props.core.users).length : '0'} Users: {this.props.core.users ? Object.keys(this.props.core.users).length : '0'}
</div> </div>
<div className="item"> <div className="debug-info-item">
Notifications: {this.props.ui.notifications ? Object.keys(this.props.ui.notifications).length : '0'} Notifications: {this.props.ui.notifications ? Object.keys(this.props.ui.notifications).length : '0'}
</div> </div>
<div className="item"> <div className="debug-info-item">
Processes: {this.props.ui.processes ? Object.keys(this.props.ui.processes).length : '0'} Processes: {this.props.ui.processes ? Object.keys(this.props.ui.processes).length : '0'}
</div> </div>
<div className="item"> <div className="debug-info-item">
Enqueue batches: {this.props.mopidy.enqueue_uris_batches ? this.props.mopidy.enqueue_uris_batches.length : '0'} Enqueue batches: {this.props.mopidy.enqueue_uris_batches ? this.props.mopidy.enqueue_uris_batches.length : '0'}
</div> </div>
<br /> </div>
<div className="item">
<div className="debug-info-section">
<h5>Config</h5>
<div className="debug-info-item">
Slim mode: {this.props.ui.slim_mode ? 'on' : 'off'} Slim mode: {this.props.ui.slim_mode ? 'on' : 'off'}
</div> </div>
<div className="item"> <div className="debug-info-item">
Test mode: {this.props.ui.test_mode ? 'on' : 'off'} Test mode: {this.props.ui.test_mode ? 'on' : 'off'}
</div> </div>
<div className="item"> <div className="debug-info-item">
Touch: {helpers.isTouchDevice() ? 'on' : 'off'} Touch: {helpers.isTouchDevice() ? 'on' : 'off'}
</div> </div>
<div className="item"> <div className="debug-info-item">
Selected tracks: {this.props.ui.selected_tracks.length}<br /> Selected tracks: {this.props.ui.selected_tracks.length}<br />
{ {
this.props.ui.selected_tracks.map((track_key, index) => { this.props.ui.selected_tracks.map((track_key, index) => {
@ -100,8 +128,14 @@ class DebugInfo extends React.Component{
}) })
} }
</div> </div>
</div>
<div className="debug-info-section">
<h5>Load queue</h5>
{this.renderLoadQueue()} {this.renderLoadQueue()}
</div> </div>
</div>
); );
} }
} }

View File

@ -180,6 +180,33 @@ const localstorageMiddleware = (function(){
} }
); );
break; break;
/**
* Experimental saving of stores to localStorage
* This uses way too much storage space (ie 10MB+) so won't work. We need
* to use the IndexedDB engine instead for storing this quantity of data
case 'UPDATE_TRACKS_INDEX':
helpers.setStorage('core', {tracks: action.tracks});
next(action);
break;
case 'UPDATE_ALBUMS_INDEX':
helpers.setStorage('core', {albums: action.albums});
next(action);
break;
case 'UPDATE_ARTISTS_INDEX':
helpers.setStorage('core', {artists: action.artists});
next(action);
break;
case 'UPDATE_PLAYLISTS_INDEX':
helpers.setStorage('core', {playlists: action.playlists});
next(action);
break;
case 'UPDATE_USERS_INDEX':
helpers.setStorage('core', {users: action.users});
next(action);
break;
*/
} }
} }

View File

@ -12,4 +12,12 @@
pointer-events: none; pointer-events: none;
width: 220px; width: 220px;
max-width: 98vw; max-width: 98vw;
&-section {
padding-top: 14px;
&:first-child {
padding-top: 0;
}
}
} }

View File

@ -197,6 +197,12 @@ h4 {
} }
} }
h5 {
font-size: 1rem;
margin-bottom: 4px;
font-weight: 700;
}
p { p {
a { a {
color: inherit; color: inherit;