Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion core/controllers/playlists.php
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,10 @@ public function search()

$my = $this->data('my');

$search_result = $this->models->playlists('search', $query, $limit, $offset, $sort_by, $sort_dir, $my);
$owner = $this->data('owner');
$group = $this->data('group');

$search_result = $this->models->playlists('search', $query, $limit, $offset, $sort_by, $sort_dir, $my, $owner, $group);

foreach ($search_result['playlists'] as &$playlist) {
$playlist['can_edit'] = $this->user_can_edit($playlist);
Expand Down
15 changes: 14 additions & 1 deletion core/models/media_model.php
Original file line number Diff line number Diff line change
Expand Up @@ -954,7 +954,7 @@ public function search_filters_validate($args = [])
OBFHelpers::require_args($args, ['filters']);
$filters = $args['filters'];

$allowed_filters = ['comments','artist','title','album','year','type','category','country','language','genre','duration','is_copyright_owner','status','dynamic_select'];
$allowed_filters = ['comments','artist','title','album','year','type','category','country','language','genre','duration','is_copyright_owner','status','dynamic_select','owner','group'];
$allowed_operators = [
// deprecated
'like',
Expand Down Expand Up @@ -1037,6 +1037,7 @@ public function search_filters_where_array($args = [])
$column_array['comments'] = 'media.comments';
$column_array['is_copyright_owner'] = 'media.is_copyright_owner';
$column_array['dynamic_select'] = 'media.dynamic_select';
$column_array['owner'] = 'media.owner_id';

$metadata_fields = $this->models->mediametadata('get_all');
$metadata_defaults = [];
Expand All @@ -1057,6 +1058,18 @@ public function search_filters_where_array($args = [])
}
}

// group filter uses a subquery on media_permissions_groups
if ($filter['filter'] === 'group') {
$group_id = $this->db->escape($filter['val']);
if (in_array($filter['op'], ['is', 'eq'])) {
$tmp_sql = 'media.id IN (SELECT media_id FROM media_permissions_groups WHERE group_id = "' . $group_id . '")';
} else {
$tmp_sql = 'media.id NOT IN (SELECT media_id FROM media_permissions_groups WHERE group_id = "' . $group_id . '")';
}
$where_array[] = $tmp_sql;
continue;
}

// find_in_set works a bit differently
// TODO note not_has deprecated
if (in_array($filter['op'], ['has','not_has','nhas'])) {
Expand Down
12 changes: 11 additions & 1 deletion core/models/playlists_model.php
Original file line number Diff line number Diff line change
Expand Up @@ -294,7 +294,7 @@ public function where_used($id)
*
* @return [num_results, playlists]
*/
public function search($query, $limit, $offset, $sort_by, $sort_dir, $my = false)
public function search($query, $limit, $offset, $sort_by, $sort_dir, $my = false, $owner = null, $group = null)
{
$where_strings = [];

Expand All @@ -310,6 +310,16 @@ public function search($query, $limit, $offset, $sort_by, $sort_dir, $my = false
$where_strings[] = 'owner_id = "' . $this->db->escape($this->user->param('id')) . '"';
}

// filter by owner
if (!empty($owner)) {
$where_strings[] = 'owner_id = "' . $this->db->escape($owner) . '"';
}

// filter by group
if (!empty($group)) {
$where_strings[] = 'playlists.id IN (SELECT playlist_id FROM playlists_permissions_groups WHERE group_id = "' . $this->db->escape($group) . '")';
}

if (count($where_strings) > 0) {
$this->db->where_string(implode(' AND ', $where_strings));
}
Expand Down
6 changes: 6 additions & 0 deletions public/html/sidebar/advanced_search.html
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
</option>
<option value="status" data-compare="select" data-value="status" data-t>Status</option>
<option value="dynamic_select" data-compare="select" data-value="bool" data-t>Include in Dynamic Selections?</option>
<option value="owner" data-compare="select" data-value="owner" data-t>Owner</option>
<option value="group" data-compare="select" data-value="group" data-t>Group</option>
</select>

<select id="advanced_search_text_compare" data-type="compare" data-name="text">
Expand Down Expand Up @@ -99,6 +101,10 @@

<input type="text" id="advanced_search_value" data-type="value" data-name="text" />

<select id="advanced_search_owner_options" data-type="value" data-name="owner" class="hidden"></select>

<select id="advanced_search_group_options" data-type="value" data-name="group" class="hidden"></select>

<div id="advanced_search_metadata" style="display: none; align-items: flex-start; gap: 10px"></div>

&nbsp;
Expand Down
5 changes: 5 additions & 0 deletions public/js/settings.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ OB.Settings.genres = new Array();

OB.Settings.permissions = null;
OB.Settings.groups = null;
OB.Settings.users = null;

OB.Settings.storeCache = {};

Expand All @@ -31,6 +32,8 @@ OB.Settings.getSettings = function (callback) {
post.push(["metadata", "media_get_fields", {}]);
post.push(["metadata", "playlist_item_types", {}]);
post.push(["metadata", "recording_default_values", {}]);
post.push(["users", "user_list", {}]);
post.push(["users", "group_list", {}]);

OB.API.multiPost(
post,
Expand All @@ -44,6 +47,8 @@ OB.Settings.getSettings = function (callback) {
OB.Settings.media_required_fields = response[6].data;
OB.Settings.playlist_item_types = response[7].data;
OB.Settings.recording_metadata = response[8].data;
OB.Settings.users = response[9].data;
OB.Settings.groups = response[10].data;

if (callback) callback();
},
Expand Down
16 changes: 16 additions & 0 deletions public/js/sidebar.js
Original file line number Diff line number Diff line change
Expand Up @@ -1293,6 +1293,22 @@ OB.Sidebar.advancedSearchWindowInit = function () {
);
});

if (OB.Settings.users) {
$.each(OB.Settings.users, function (index, user) {
$("#advanced_search_owner_options").append(
'<option value="' + user.id + '">' + htmlspecialchars(user.display_name) + "</option>",
);
});
}

if (OB.Settings.groups) {
$.each(OB.Settings.groups, function (index, group) {
$("#advanced_search_group_options").append(
'<option value="' + group.id + '">' + htmlspecialchars(group.name) + "</option>",
);
});
}

$.each(OB.Settings.media_metadata, function (index, metadata) {
// skip hidden metadata and media/playlist currently unsupported for advanced search
if (metadata.type == "hidden" || metadata.type == "media" || metadata.type == "playlist") return;
Expand Down
Loading