|
|
@ -1,11 +1,11 @@ |
|
|
|
import React, { useEffect } from 'react'; |
|
|
|
import React, { useEffect } from 'react'; |
|
|
|
import { createMuiTheme, Box, LinearProgress } from '@material-ui/core'; |
|
|
|
import { createMuiTheme, Box, LinearProgress } from '@material-ui/core'; |
|
|
|
import { QueryElem, toApiQuery } from '../../../lib/query/Query'; |
|
|
|
import { QueryElem, toApiQuery, QueryLeafBy, QueryLeafOp } from '../../../lib/query/Query'; |
|
|
|
import QueryBuilder from '../../querybuilder/QueryBuilder'; |
|
|
|
import QueryBuilder from '../../querybuilder/QueryBuilder'; |
|
|
|
import * as serverApi from '../../../api'; |
|
|
|
import * as serverApi from '../../../api'; |
|
|
|
import SongTable from '../../tables/ResultsTable'; |
|
|
|
import SongTable from '../../tables/ResultsTable'; |
|
|
|
import { songGetters } from '../../../lib/songGetters'; |
|
|
|
import { songGetters } from '../../../lib/songGetters'; |
|
|
|
import { getArtists, getSongTitles, getAlbums, getTags } from '../../../lib/query/Getters'; |
|
|
|
import { queryArtists, querySongs, queryAlbums, queryTags } from '../../../lib/query/Backend'; |
|
|
|
import { grey } from '@material-ui/core/colors'; |
|
|
|
import { grey } from '@material-ui/core/colors'; |
|
|
|
import { WindowState } from '../Windows'; |
|
|
|
import { WindowState } from '../Windows'; |
|
|
|
var _ = require('lodash'); |
|
|
|
var _ = require('lodash'); |
|
|
@ -36,6 +36,56 @@ export enum QueryWindowStateActions { |
|
|
|
SetResultsForQuery = "setResultsForQuery", |
|
|
|
SetResultsForQuery = "setResultsForQuery", |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async function getArtistNames(filter: string) { |
|
|
|
|
|
|
|
const artists = await queryArtists({ |
|
|
|
|
|
|
|
query: filter.length > 0 ? { |
|
|
|
|
|
|
|
a: QueryLeafBy.ArtistName, |
|
|
|
|
|
|
|
b: '%' + filter + '%', |
|
|
|
|
|
|
|
leafOp: QueryLeafOp.Like |
|
|
|
|
|
|
|
} : undefined, |
|
|
|
|
|
|
|
offset: 0, |
|
|
|
|
|
|
|
limit: -1, |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return [...(new Set([...(artists.map((a:any) => a.name))]))]; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async function getAlbumNames(filter: string) { |
|
|
|
|
|
|
|
const albums = await queryAlbums({ |
|
|
|
|
|
|
|
query: filter.length > 0 ? { |
|
|
|
|
|
|
|
a: QueryLeafBy.AlbumName, |
|
|
|
|
|
|
|
b: '%' + filter + '%', |
|
|
|
|
|
|
|
leafOp: QueryLeafOp.Like |
|
|
|
|
|
|
|
} : undefined, |
|
|
|
|
|
|
|
offset: 0, |
|
|
|
|
|
|
|
limit: -1, |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return [...(new Set([...(albums.map((a:any) => a.name))]))]; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async function getSongTitles(filter: string) { |
|
|
|
|
|
|
|
const songs = await querySongs({ |
|
|
|
|
|
|
|
query: filter.length > 0 ? { |
|
|
|
|
|
|
|
a: QueryLeafBy.SongTitle, |
|
|
|
|
|
|
|
b: '%' + filter + '%', |
|
|
|
|
|
|
|
leafOp: QueryLeafOp.Like |
|
|
|
|
|
|
|
} : undefined, |
|
|
|
|
|
|
|
offset: 0, |
|
|
|
|
|
|
|
limit: -1, |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return [...(new Set([...(songs.map((s:any) => s.title))]))]; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async function getTagItems() { |
|
|
|
|
|
|
|
return await queryTags({ |
|
|
|
|
|
|
|
query: undefined, |
|
|
|
|
|
|
|
offset: 0, |
|
|
|
|
|
|
|
limit: -1, |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
export function QueryWindowReducer(state: QueryWindowState, action: any) { |
|
|
|
export function QueryWindowReducer(state: QueryWindowState, action: any) { |
|
|
|
switch (action.type) { |
|
|
|
switch (action.type) { |
|
|
|
case QueryWindowStateActions.SetQuery: |
|
|
|
case QueryWindowStateActions.SetQuery: |
|
|
@ -73,36 +123,18 @@ export default function QueryWindow(props: IProps) { |
|
|
|
const showResults = (query && resultsFor && query == resultsFor.for) ? resultsFor.results : []; |
|
|
|
const showResults = (query && resultsFor && query == resultsFor.for) ? resultsFor.results : []; |
|
|
|
|
|
|
|
|
|
|
|
const doQuery = async (_query: QueryElem) => { |
|
|
|
const doQuery = async (_query: QueryElem) => { |
|
|
|
var q: serverApi.QueryRequest = { |
|
|
|
const songs = await querySongs({ |
|
|
|
query: toApiQuery(_query), |
|
|
|
query: _query, |
|
|
|
offsetsLimits: { |
|
|
|
offset: 0, |
|
|
|
songOffset: 0, |
|
|
|
limit: 100, //TODO: pagination
|
|
|
|
songLimit: 100, |
|
|
|
}); |
|
|
|
}, |
|
|
|
|
|
|
|
ordering: { |
|
|
|
|
|
|
|
orderBy: { |
|
|
|
|
|
|
|
type: serverApi.OrderByType.Name, |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
ascending: true, |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const requestOpts = { |
|
|
|
|
|
|
|
method: 'POST', |
|
|
|
|
|
|
|
headers: { 'Content-Type': 'application/json' }, |
|
|
|
|
|
|
|
body: JSON.stringify(q), |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return (async () => { |
|
|
|
|
|
|
|
const response = await fetch((process.env.REACT_APP_BACKEND || "") + serverApi.QueryEndpoint, requestOpts) |
|
|
|
|
|
|
|
let json: any = await response.json(); |
|
|
|
|
|
|
|
if (_.isEqual(query, _query)) { |
|
|
|
if (_.isEqual(query, _query)) { |
|
|
|
setResultsForQuery({ |
|
|
|
setResultsForQuery({ |
|
|
|
for: _query, |
|
|
|
for: _query, |
|
|
|
results: json.songs, |
|
|
|
results: songs, |
|
|
|
}) |
|
|
|
}) |
|
|
|
} |
|
|
|
} |
|
|
|
})(); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => { |
|
|
|
useEffect(() => { |
|
|
@ -124,10 +156,10 @@ export default function QueryWindow(props: IProps) { |
|
|
|
editing={editing} |
|
|
|
editing={editing} |
|
|
|
onChangeEditing={setEditingQuery} |
|
|
|
onChangeEditing={setEditingQuery} |
|
|
|
requestFunctions={{ |
|
|
|
requestFunctions={{ |
|
|
|
getArtists: getArtists, |
|
|
|
getArtists: getArtistNames, |
|
|
|
getSongTitles: getSongTitles, |
|
|
|
getSongTitles: getSongTitles, |
|
|
|
getAlbums: getAlbums, |
|
|
|
getAlbums: getAlbumNames, |
|
|
|
getTags: getTags, |
|
|
|
getTags: getTagItems, |
|
|
|
}} |
|
|
|
}} |
|
|
|
/> |
|
|
|
/> |
|
|
|
</Box> |
|
|
|
</Box> |
|
|
|