node player groups wip

This commit is contained in:
jr-k 2024-07-16 18:34:34 +02:00
parent 6923a837fa
commit e5803d2b04
12 changed files with 92 additions and 72 deletions

File diff suppressed because one or more lines are too long

View File

@ -22,7 +22,7 @@ jQuery(document).ready(function ($) {
$(document).on('click', '.node-player-group-player-assign', function () {
const route = $(this).attr('data-route');
showPickers('modal-node-player-explr-picker', function(nodePlayer) {
if (!nodePlayer.group_id || (nodePlayer.group_id && confirm(l.js_fleet_nodePlayer_assign_confirmation))) {
if (!nodePlayer.group_id || (nodePlayer.group_id && confirm(l.js_fleet_node_player_assign_confirmation))) {
document.location.href = route.replace('__id__', nodePlayer.id);
}
});
@ -37,7 +37,7 @@ jQuery(document).ready(function ($) {
url: $(this).attr('data-route'),
headers: {'Content-Type': 'application/json'},
success: function(response) {
$('.node-player-group-item-'+response.group_id+' .players-counter').text(response.pcounter);
$('.node-player-group-item-'+response.group_id+' .players-counter').html(response.pcounter);
}
});
}

View File

@ -33,6 +33,10 @@ main {
.contex-tail {
margin-right: 20px;
.btn {
margin-right: 0;
}
}
.context-user {

View File

@ -1,6 +1,5 @@
button,
.btn {
$shadowOffset: 2px;
position: relative;
@ -109,5 +108,9 @@ button,
font-size: 10px;
}
}
&.btn-double-icon {
margin-right: 5px;
}
}

View File

@ -154,6 +154,7 @@ ul.explr-dirview {
justify-content: flex-start;
align-items: center;
max-width: 84px;
min-width: 84px;
position: relative;
i {
@ -165,8 +166,8 @@ ul.explr-dirview {
sup,
sub {
position: absolute;
top: 0;
right: -12px;
top: -2px;
right: 0;
background: #777;
border-bottom: 2px solid $neutralGrey;
color: black;

View File

@ -111,6 +111,7 @@
align-items: center;
margin: 0;
.foot-span span,
.foot-span {
opacity: .8;
font-size: 13px;

View File

@ -137,6 +137,7 @@ form {
}
&.input-naked {
padding-left: 0;
color: #BBB;
}
@ -145,6 +146,7 @@ form {
border: none;
background: $black;
border-radius: $baseRadius;
padding-left: 10px;
}
}
}

View File

@ -24,7 +24,7 @@ class FleetNodePlayerGroupController(ObController):
self._app.add_url_rule('/fleet/node-player-group/add', 'fleet_node_player_group_add', self.guard_fleet(self._auth(self.fleet_node_player_group_add)), methods=['POST'])
self._app.add_url_rule('/fleet/node-player-group/save', 'fleet_node_player_group_save', self.guard_fleet(self._auth(self.fleet_node_player_group_save)), methods=['POST'])
self._app.add_url_rule('/fleet/node-player-group/delete/<player_group_id>', 'fleet_node_player_group_delete', self.guard_fleet(self._auth(self.fleet_node_player_group_delete)), methods=['GET'])
self._app.add_url_rule('/fleet/node-player-group/unassign-player', 'fleet_node_player_group_unassign_player', self._auth(self.fleet_node_player_group_unassign_player), methods=['DELETE'])
self._app.add_url_rule('/fleet/node-player-group/unassign-player/<player_id>', 'fleet_node_player_group_unassign_player', self._auth(self.fleet_node_player_group_unassign_player), methods=['DELETE'])
self._app.add_url_rule('/fleet/node-player-group/assign-player/<player_group_id>/<player_id>', 'fleet_node_player_group_assign_player', self._auth(self.fleet_node_player_group_assign_player), methods=['GET'])
def fleet_node_player_group(self):
@ -48,7 +48,11 @@ class FleetNodePlayerGroupController(ObController):
node_player_groups=node_player_groups,
pcounters=pcounters,
playlists=self._model_store.playlist().get_all_labels_indexed(),
players=self._model_store.node_player().get_node_players(group_id=current_player_group.id) if current_player_group else [],
players=[] if not current_player_group else self._model_store.node_player().get_node_players(
group_id=current_player_group.id,
sort='created_at',
ascending=True
),
foldered_node_players=self._model_store.node_player().get_all_indexed('folder_id', multiple=True),
working_folder_path=working_folder_path,
working_folder=working_folder,
@ -88,9 +92,9 @@ class FleetNodePlayerGroupController(ObController):
self._model_store.node_player_group().delete(player_group_id)
return redirect(url_for('fleet_node_player_group'))
def fleet_node_player_group_unassign_player(self, node_player_id: int = 0):
node_player_id = request.form['id'] if 'id' in request.form else node_player_id
node_player = self._model_store.node_player().get(node_player_id)
def fleet_node_player_group_unassign_player(self, player_id: int = 0):
player_id = request.form['id'] if 'id' in request.form else player_id
node_player = self._model_store.node_player().get(player_id)
if not node_player:
return redirect(url_for('fleet_node_player_group'))
@ -107,7 +111,7 @@ class FleetNodePlayerGroupController(ObController):
return jsonify({'status': 'ok', 'pcounter': pcounter, 'group_id': group_id})
def fleet_node_player_group_assign_player(self, player_group_id: int = 0, player_id: int = 0):
node_player_group = self._model_store.node_player().get(player_group_id)
node_player_group = self._model_store.node_player_group().get(player_group_id)
if not node_player_group:
return redirect(url_for('fleet_node_player_group'))

View File

@ -46,8 +46,8 @@ class NodePlayerManager(ModelManager):
object = self._db.get_by_id(self.TABLE_NAME, id)
return self.hydrate_object(object, id) if object else None
def get_by(self, query, sort: Optional[str] = None) -> List[NodePlayer]:
return self.hydrate_list(self._db.get_by_query(self.TABLE_NAME, query=query, sort=sort))
def get_by(self, query, sort: Optional[str] = None, ascending=False) -> List[NodePlayer]:
return self.hydrate_list(self._db.get_by_query(self.TABLE_NAME, query=query, sort=sort, ascending=ascending))
def get_one_by(self, query) -> Optional[NodePlayer]:
object = self._db.get_one_by_query(self.TABLE_NAME, query=query)
@ -81,7 +81,7 @@ class NodePlayerManager(ModelManager):
for node_player_id, edits in edits_node_players.items():
self._db.update_by_id(self.TABLE_NAME, node_player_id, edits)
def get_node_players(self, group_id: Optional[int] = None, folder_id: Optional[id] = None) -> List[NodePlayer]:
def get_node_players(self, group_id: Optional[int] = None, folder_id: Optional[id] = None, sort: Optional[str] = None, ascending=False) -> List[NodePlayer]:
query = " 1=1 "
if group_id:
@ -90,7 +90,7 @@ class NodePlayerManager(ModelManager):
if folder_id:
query = "{} {}".format(query, "AND folder_id = {}".format(folder_id))
return self.get_by(query=query)
return self.get_by(query=query, sort=sort, ascending=ascending)
def pre_add(self, node_player: Dict) -> Dict:
self.user_manager.track_user_on_create(node_player)

View File

@ -53,6 +53,9 @@
<div class="container {% block container_class %}{% endblock %}">
{% set authenticated_view = not AUTH_ENABLED or (current_user and current_user.is_authenticated) %}
{% set fully_authenticated_view = authenticated_view and current_user.is_authenticated %}
{% set dynmenu = {
"slideshow": {
"name": l.dynmenu_content,
@ -128,8 +131,8 @@
</a>
</h1>
{% if not AUTH_ENABLED or (current_user and current_user.is_authenticated) %}
<nav>
<nav>
{% if authenticated_view %}
<ul>
{{ HOOK(H_ROOT_NAV_ELEMENT_START) }}
{% for category, menu in dynmenu.items() %}
@ -141,8 +144,8 @@
{% endfor %}
{{ HOOK(H_ROOT_NAV_ELEMENT_END) }}
</ul>
</nav>
{% endif %}
{% endif %}
</nav>
{% block footer %}
<footer>
@ -161,63 +164,65 @@
{% endblock %}
<main>
{% set show_context_bar = current_dynmenu or AUTH_ENABLED %}
{% set show_context_bar = current_dynmenu or fully_authenticated_view %}
<div class="context-bar {{ 'hidden' if not show_context_bar }}">
{% if current_dynmenu %}
<div class="context-menu">
<div class="inner">
<ul class="pills">
{% for menu in current_dynmenu.pills %}
<li class="{{ 'active' if active_route == menu.route or active_route == menu.route_alt }}">
{% set href = menu.url_for if menu.url_for else url_for(menu.route) %}
<a href="{{ href }}">
{% if authenticated_view %}
<div class="context-bar {{ 'hidden' if not show_context_bar }}">
{% if current_dynmenu %}
<div class="context-menu">
<div class="inner">
<ul class="pills">
{% for menu in current_dynmenu.pills %}
<li class="{{ 'active' if active_route == menu.route or active_route == menu.route_alt }}">
{% set href = menu.url_for if menu.url_for else url_for(menu.route) %}
<a href="{{ href }}">
<span class="icon">
<i class="fa {{ menu.icon }}"></i>
</span>
{{ menu.name }}
{{ menu.name }}
</a>
</li>
{% endfor %}
</ul>
</div>
</div>
{% endif %}
<div class="context-divider"></div>
<div class="{% if not AUTH_ENABLED %}contex-tail{% endif %}">
<a href="{{ url_for('slideshow_player_refresh', next=request.full_path) }}" class="btn btn-naked btn-double-icon">
<i class="fa fa-display main"></i>
<sub><i class="fa fa-refresh"></i></sub>
</a>
</div>
{% if fully_authenticated_view %}
<div class="context-divider"></div>
<div class="context-user">
<div class="dropdown">
<div class="trigger">
<div class="avatar">
{{ current_user.username[0] }}
</div>
<div class="username">
{{ current_user.username }}
</div>
<i class="fa fa-sort-down"></i>
</div>
<ul class="dropdown-menu">
<li class="danger">
<a href="{{ url_for('logout') }}">
<i class="fa fa-power-off"></i> {{ l.logout }}
</a>
</li>
{% endfor %}
</ul>
</div>
</div>
{% endif %}
<div class="context-divider"></div>
<div class="{% if not AUTH_ENABLED %}contex-tail{% endif %}">
<a href="{{ url_for('slideshow_player_refresh', next=request.full_path) }}" class="btn btn-naked">
<i class="fa fa-display main"></i>
<sub><i class="fa fa-refresh"></i></sub>
</a>
</div>
{% if AUTH_ENABLED %}
<div class="context-divider"></div>
<div class="context-user">
<div class="dropdown">
<div class="trigger">
<div class="avatar">
{# {{ current_user.username[0] }}#}J
</div>
<div class="username">
{# {{ current_user.username }}#}Jessym
</div>
<i class="fa fa-sort-down"></i>
</ul>
</div>
<ul class="dropdown-menu">
<li class="danger">
<a href="{{ url_for('logout') }}">
<i class="fa fa-power-off"></i> {{ l.logout }}
</a>
</li>
</ul>
</div>
</div>
{% endif %}
</div>
{% endif %}
</div>
{% endif %}
<div class="main-container">
{% if request.args.get('refresh_player') %}
<div class="alert alert-success">

View File

@ -20,7 +20,7 @@
</div>
<div class="tail">
<a href="javascript:void(0);" class="item-delete node-player-group-unassign-player btn btn-naked" data-route="{{ url_for('fleet_node_player_group_unassign_player', node_player_id=player.id) }}">
<a href="javascript:void(0);" class="item-delete node-player-group-unassign-player btn btn-naked" data-route="{{ url_for('fleet_node_player_group_unassign_player', player_id=player.id) }}">
<i class="fa fa-close"></i>
</a>
</div>

View File

@ -12,10 +12,10 @@
{{ truncate((title)|default(l.common_untitled), 35, '...') }}
</div>
<div class="tile-metrics">
<div class="foot-span players-counter">
<div class="foot-span">
{% set pcounter = pcounters[node_player_group.id]|default(0) %}
{% if pcounter > 0 %}
{{ pcounter }} <sub><i class="fa fa-display"></i></sub>
<span class="players-counter">{{ pcounter }}</span> <sub><i class="fa fa-display"></i></sub>
{% else %}
{{ l.common_empty }}
{% endif %}