node player groups wip
This commit is contained in:
parent
6923a837fa
commit
e5803d2b04
File diff suppressed because one or more lines are too long
@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@ -33,6 +33,10 @@ main {
|
||||
|
||||
.contex-tail {
|
||||
margin-right: 20px;
|
||||
|
||||
.btn {
|
||||
margin-right: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.context-user {
|
||||
|
||||
@ -1,6 +1,5 @@
|
||||
button,
|
||||
.btn {
|
||||
|
||||
$shadowOffset: 2px;
|
||||
|
||||
position: relative;
|
||||
@ -109,5 +108,9 @@ button,
|
||||
font-size: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
&.btn-double-icon {
|
||||
margin-right: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -111,6 +111,7 @@
|
||||
align-items: center;
|
||||
margin: 0;
|
||||
|
||||
.foot-span span,
|
||||
.foot-span {
|
||||
opacity: .8;
|
||||
font-size: 13px;
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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'))
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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">
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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 %}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user