This repository has been archived on 2025-03-19. You can view files and clone it, but cannot push or open issues or pull requests.
feishin/src/renderer/features/playlists/utils.ts
Jeff 9f2e873366
Redesign sidebar / header and other misc. improvements (#24)
* Remove 1920px max width

* Fix position of list controls menu

* Match size and color of search input

* Adjust library header sizing

* Move app menu to sidebar

* Increase row buffer on play queue list

* Fix query builder styles

* Fix playerbar slider track bg

* Adjust titlebar styles

* Fix invalid modal prop

* Various adjustments to detail pages

* Fix sidebar height calculation

* Fix list null indicators, add filter indicator

* Adjust playqueue styles

* Fix jellyfin releaseYear normalization

* Suppress browser context menu on ag-grid

* Add radius to drawer queue -- normalize layout

* Add modal styles to provider theme

* Fix playlist song list pagination

* Add disc number to albums with more than one disc

* Fix query builder boolean values

* Adjust input placeholder color

* Properly handle rating/favorite from context menu on table

* Conform dropdown menu styles to context menu

* Increase sort type select width

* Fix drawer queue radius

* Change primary color

* Prevent volume wheel from invalid values

* Add icons to query builder dropdowns

* Update notification styles

* Update scrollbar thumb styles

* Remove "add to playlist" on smart playlists

* Fix "add to playlist" from context menu
2023-02-07 22:47:23 -08:00

128 lines
3.2 KiB
TypeScript

import { nanoid } from 'nanoid/non-secure';
import { NDSongQueryFields } from '/@/renderer/api/navidrome.types';
import { QueryBuilderGroup } from '/@/renderer/types';
export const parseQueryBuilderChildren = (groups: QueryBuilderGroup[], data: any[]) => {
if (groups.length === 0) {
return data;
}
const filterGroups: any[] = [];
for (const group of groups) {
const rootType = group.type;
const query: any = {
[rootType]: [],
};
for (const rule of group.rules) {
if (rule.field && rule.operator) {
const [table, field] = rule.field.split('.');
const operator = rule.operator;
const value = field !== 'releaseDate' ? rule.value : new Date(rule.value);
switch (table) {
default:
query[rootType].push({
[operator]: {
[table]: value,
},
});
break;
}
}
}
if (group.group.length > 0) {
const b = parseQueryBuilderChildren(group.group, data);
b.forEach((c) => query[rootType].push(c));
}
data.push(query);
filterGroups.push(query);
}
return filterGroups;
};
// Convert QueryBuilderGroup to default query
export const convertQueryGroupToNDQuery = (filter: QueryBuilderGroup) => {
const rootQueryType = filter.type;
const rootQuery = {
[rootQueryType]: [] as any[],
};
for (const rule of filter.rules) {
if (rule.field && rule.operator) {
const [field] = rule.field.split('.');
const operator = rule.operator;
let value = rule.value;
const booleanFields = NDSongQueryFields.filter(
(queryField) => queryField.type === 'boolean',
).map((field) => field.value);
// Convert string values to boolean
if (booleanFields.includes(field)) {
value = value === 'true';
}
switch (field) {
default:
rootQuery[rootQueryType].push({
[operator]: {
[field]: value,
},
});
break;
}
}
}
const groups = parseQueryBuilderChildren(filter.group, []);
for (const group of groups) {
rootQuery[rootQueryType].push(group);
}
return rootQuery;
};
// Convert default query to QueryBuilderGroup
export const convertNDQueryToQueryGroup = (query: Record<string, any>) => {
const rootType = Object.keys(query)[0];
const rootGroup: QueryBuilderGroup = {
group: [],
rules: [],
type: rootType as 'any' | 'all',
uniqueId: nanoid(),
};
for (const rule of query[rootType]) {
if (rule.any || rule.all) {
const group = convertNDQueryToQueryGroup(rule);
rootGroup.group.push(group);
} else {
const operator = Object.keys(rule)[0];
const field = Object.keys(rule[operator])[0];
let value = rule[operator][field];
const booleanFields = NDSongQueryFields.filter(
(queryField) => queryField.type === 'boolean',
).map((field) => field.value);
// Convert boolean values to string
if (booleanFields.includes(field)) {
value = value.toString();
}
rootGroup.rules.push({
field,
operator,
uniqueId: nanoid(),
value,
});
}
}
return rootGroup;
};