mirror of
https://github.com/jumpserver/jumpserver.git
synced 2025-07-07 11:59:18 +00:00
[Feature] 支持popover
This commit is contained in:
parent
3e62a7f5b7
commit
9e09a962af
@ -42,7 +42,7 @@ class AssetViewSet(CustomFilterMixin, LabelFilter, BulkModelViewSet):
|
|||||||
"""
|
"""
|
||||||
filter_fields = ("hostname", "ip")
|
filter_fields = ("hostname", "ip")
|
||||||
search_fields = filter_fields
|
search_fields = filter_fields
|
||||||
ordering_fields = ("hostname", "ip", "port", "cluster", "type", "env", "cpu_cores")
|
ordering_fields = ("hostname", "ip", "port", "cluster", "cpu_cores")
|
||||||
queryset = Asset.objects.all()
|
queryset = Asset.objects.all()
|
||||||
serializer_class = serializers.AssetSerializer
|
serializer_class = serializers.AssetSerializer
|
||||||
pagination_class = LimitOffsetPagination
|
pagination_class = LimitOffsetPagination
|
||||||
|
@ -12,7 +12,7 @@ class AssetGroupSerializer(BulkSerializerMixin, serializers.ModelSerializer):
|
|||||||
"""
|
"""
|
||||||
资产组序列化数据模型
|
资产组序列化数据模型
|
||||||
"""
|
"""
|
||||||
assets_amount = serializers.SerializerMethodField()
|
assets_display = serializers.SerializerMethodField()
|
||||||
assets = serializers.PrimaryKeyRelatedField(
|
assets = serializers.PrimaryKeyRelatedField(
|
||||||
many=True, queryset=Asset.objects.all(), required=False
|
many=True, queryset=Asset.objects.all(), required=False
|
||||||
)
|
)
|
||||||
@ -20,11 +20,11 @@ class AssetGroupSerializer(BulkSerializerMixin, serializers.ModelSerializer):
|
|||||||
class Meta:
|
class Meta:
|
||||||
model = AssetGroup
|
model = AssetGroup
|
||||||
list_serializer_class = BulkListSerializer
|
list_serializer_class = BulkListSerializer
|
||||||
fields = ['id', 'name', 'comment', 'assets_amount', 'assets']
|
fields = ['id', 'name', 'comment', 'assets_display', 'assets']
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_assets_amount(obj):
|
def get_assets_display(obj):
|
||||||
return obj.assets.all().count()
|
return [asset.hostname for asset in obj.assets.all()]
|
||||||
|
|
||||||
|
|
||||||
class AssetUpdateSystemUserSerializer(serializers.ModelSerializer):
|
class AssetUpdateSystemUserSerializer(serializers.ModelSerializer):
|
||||||
|
@ -34,13 +34,17 @@ $(document).ready(function(){
|
|||||||
var detail_btn = '<a href="{% url "assets:asset-group-detail" pk=DEFAULT_PK %}">' + cellData + '</a>';
|
var detail_btn = '<a href="{% url "assets:asset-group-detail" pk=DEFAULT_PK %}">' + cellData + '</a>';
|
||||||
$(td).html(detail_btn.replace('{{ DEFAULT_PK }}', rowData.id));
|
$(td).html(detail_btn.replace('{{ DEFAULT_PK }}', rowData.id));
|
||||||
}},
|
}},
|
||||||
|
{targets: 2, createdCell: function (td, cellData, rowData) {
|
||||||
|
var html = createPopover(cellData);
|
||||||
|
$(td).html(html);
|
||||||
|
}},
|
||||||
{targets: 4, createdCell: function (td, cellData, rowData) {
|
{targets: 4, createdCell: function (td, cellData, rowData) {
|
||||||
var update_btn = '<a href="{% url "assets:asset-group-update" pk=DEFAULT_PK %}" class="btn btn-xs m-l-xs btn-info">{% trans "Update" %}</a>'.replace('{{ DEFAULT_PK }}', cellData);
|
var update_btn = '<a href="{% url "assets:asset-group-update" pk=DEFAULT_PK %}" class="btn btn-xs m-l-xs btn-info">{% trans "Update" %}</a>'.replace('{{ DEFAULT_PK }}', cellData);
|
||||||
var del_btn = '<a class="btn btn-xs btn-danger m-l-xs btn_asset_group_delete" data-uid="{{ DEFAULT_PK }}">{% trans "Delete" %}</a>'.replace('{{ DEFAULT_PK }}', cellData);
|
var del_btn = '<a class="btn btn-xs btn-danger m-l-xs btn_asset_group_delete" data-uid="{{ DEFAULT_PK }}">{% trans "Delete" %}</a>'.replace('{{ DEFAULT_PK }}', cellData);
|
||||||
$(td).html(update_btn + del_btn)
|
$(td).html(update_btn + del_btn)
|
||||||
}}],
|
}}],
|
||||||
ajax_url: '{% url "api-assets:asset-group-list" %}',
|
ajax_url: '{% url "api-assets:asset-group-list" %}',
|
||||||
columns: [{data: "id"}, {data: "name" }, {data: "assets_amount" }, {data: "comment" }, {data: "id"}],
|
columns: [{data: "id"}, {data: "name" }, {data: "assets_display" }, {data: "comment" }, {data: "id"}],
|
||||||
op_html: $('#actions').html()
|
op_html: $('#actions').html()
|
||||||
};
|
};
|
||||||
jumpserver.initDataTable(options);
|
jumpserver.initDataTable(options);
|
||||||
|
@ -29,7 +29,6 @@
|
|||||||
<td class="text-center">{{ asset.id }}</td>
|
<td class="text-center">{{ asset.id }}</td>
|
||||||
<td class="text-center">{{ asset.hostname }}</td>
|
<td class="text-center">{{ asset.hostname }}</td>
|
||||||
<td class="text-center">{{ asset.ip }}</td>
|
<td class="text-center">{{ asset.ip }}</td>
|
||||||
<td class="text-center">{{ asset.env }}-{{ asset.type }}</td>
|
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
|
@ -48,19 +48,24 @@ function initTable() {
|
|||||||
$(td).html(detail_btn.replace('{{ DEFAULT_PK }}', rowData.id));
|
$(td).html(detail_btn.replace('{{ DEFAULT_PK }}', rowData.id));
|
||||||
}},
|
}},
|
||||||
{targets: 2, createdCell: function (td, cellData) {
|
{targets: 2, createdCell: function (td, cellData) {
|
||||||
$(td).html(cellData.length);
|
var html = createPopover(cellData);
|
||||||
|
$(td).html(html);
|
||||||
}},
|
}},
|
||||||
{targets: 3, createdCell: function (td, cellData) {
|
{targets: 3, createdCell: function (td, cellData) {
|
||||||
$(td).html(cellData.length);
|
var html = createPopover(cellData);
|
||||||
|
$(td).html(html);
|
||||||
}},
|
}},
|
||||||
{targets: 4, createdCell: function (td, cellData) {
|
{targets: 4, createdCell: function (td, cellData) {
|
||||||
$(td).html(cellData.length);
|
var html = createPopover(cellData);
|
||||||
|
$(td).html(html);
|
||||||
}},
|
}},
|
||||||
{targets: 5, createdCell: function (td, cellData) {
|
{targets: 5, createdCell: function (td, cellData) {
|
||||||
$(td).html(cellData.length);
|
var html = createPopover(cellData);
|
||||||
|
$(td).html(html);
|
||||||
}},
|
}},
|
||||||
{targets: 6, createdCell: function (td, cellData) {
|
{targets: 6, createdCell: function (td, cellData) {
|
||||||
$(td).html(cellData.length);
|
var html = createPopover(cellData);
|
||||||
|
$(td).html(html);
|
||||||
}},
|
}},
|
||||||
{targets: 7, createdCell: function (td, cellData) {
|
{targets: 7, createdCell: function (td, cellData) {
|
||||||
if (!cellData) {
|
if (!cellData) {
|
||||||
@ -85,11 +90,15 @@ function initTable() {
|
|||||||
],
|
],
|
||||||
op_html: $('#actions').html()
|
op_html: $('#actions').html()
|
||||||
};
|
};
|
||||||
jumpserver.initDataTable(options);
|
jumpserver.initDataTable(options).on('daw', function () {
|
||||||
|
$('[data-toggle="popover"]').popover({
|
||||||
|
html: true
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
$(document).ready(function(){
|
$(document).ready(function(){
|
||||||
initTable();
|
initTable()
|
||||||
})
|
})
|
||||||
|
|
||||||
.on('click', '.btn-del', function () {
|
.on('click', '.btn-del', function () {
|
||||||
|
@ -340,4 +340,9 @@ div.dataTables_wrapper div.dataTables_filter {
|
|||||||
border: none;
|
border: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.popover{
|
||||||
|
max-width: 100%; /* Max Width of the popover (depending on the container!) */
|
||||||
|
padding-left: 20px;
|
||||||
|
padding-right: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -310,10 +310,15 @@ jumpserver.initDataTable = function (options) {
|
|||||||
var $node = table[ type ]( indexes ).nodes().to$();
|
var $node = table[ type ]( indexes ).nodes().to$();
|
||||||
$node.find('input.ipt_check').prop('checked', false);
|
$node.find('input.ipt_check').prop('checked', false);
|
||||||
jumpserver.selected[$node.find('input.ipt_check').prop('id')] = false
|
jumpserver.selected[$node.find('input.ipt_check').prop('id')] = false
|
||||||
}).
|
}).on('draw', function(){
|
||||||
on('draw', function(){
|
|
||||||
$('#op').html(options.op_html || '');
|
$('#op').html(options.op_html || '');
|
||||||
$('#uc').html(options.uc_html || '');
|
$('#uc').html(options.uc_html || '');
|
||||||
|
$('[data-toggle="popover"]').popover({
|
||||||
|
html: true,
|
||||||
|
placement: 'bottom',
|
||||||
|
trigger: 'hover',
|
||||||
|
container: 'body'
|
||||||
|
});
|
||||||
});
|
});
|
||||||
$('.ipt_check_all').on('click', function() {
|
$('.ipt_check_all').on('click', function() {
|
||||||
if (!jumpserver.checked) {
|
if (!jumpserver.checked) {
|
||||||
@ -512,3 +517,17 @@ function delCookie(key) {
|
|||||||
document.cookie = key + '=' + val + ";expires" + expires.toUTCString() + ';path=/';
|
document.cookie = key + '=' + val + ";expires" + expires.toUTCString() + ';path=/';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function createPopover(dataset, title, callback) {
|
||||||
|
if (callback !== undefined){
|
||||||
|
var new_dataset = [];
|
||||||
|
$.each(dataset, function (index, value) {
|
||||||
|
new_dataset.push(callback(value))
|
||||||
|
});
|
||||||
|
dataset = new_dataset;
|
||||||
|
}
|
||||||
|
var data_content = dataset.join("</br>");
|
||||||
|
|
||||||
|
var html = "<a data-toggle='popover' data-content='" + data_content + "'>" + dataset.length + "</a>";
|
||||||
|
return html;
|
||||||
|
}
|
@ -52,7 +52,7 @@ class UserUpdateGroupSerializer(serializers.ModelSerializer):
|
|||||||
|
|
||||||
|
|
||||||
class UserGroupSerializer(BulkSerializerMixin, serializers.ModelSerializer):
|
class UserGroupSerializer(BulkSerializerMixin, serializers.ModelSerializer):
|
||||||
user_amount = serializers.SerializerMethodField()
|
users = serializers.SerializerMethodField()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = UserGroup
|
model = UserGroup
|
||||||
@ -60,8 +60,8 @@ class UserGroupSerializer(BulkSerializerMixin, serializers.ModelSerializer):
|
|||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_user_amount(obj):
|
def get_users(obj):
|
||||||
return obj.users.count()
|
return [user.name for user in obj.users.all()]
|
||||||
|
|
||||||
|
|
||||||
class UserGroupUpdateMemeberSerializer(serializers.ModelSerializer):
|
class UserGroupUpdateMemeberSerializer(serializers.ModelSerializer):
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
<input id="" type="checkbox" class="ipt_check_all">
|
<input id="" type="checkbox" class="ipt_check_all">
|
||||||
</th>
|
</th>
|
||||||
<th class="text-center">{% trans 'Name' %}</th>
|
<th class="text-center">{% trans 'Name' %}</th>
|
||||||
<th class="text-center">{% trans 'User count' %}</th>
|
<th class="text-center">{% trans 'User' %}</th>
|
||||||
<th class="text-center">{% trans 'Comment' %}</th>
|
<th class="text-center">{% trans 'Comment' %}</th>
|
||||||
<th class="text-center">{% trans 'Action' %}</th>
|
<th class="text-center">{% trans 'Action' %}</th>
|
||||||
</tr>
|
</tr>
|
||||||
@ -31,6 +31,10 @@ $(document).ready(function() {
|
|||||||
var detail_btn = '<a href="{% url "users:user-group-detail" pk=DEFAULT_PK %}">' + cellData + '</a>';
|
var detail_btn = '<a href="{% url "users:user-group-detail" pk=DEFAULT_PK %}">' + cellData + '</a>';
|
||||||
$(td).html(detail_btn.replace('{{ DEFAULT_PK }}', rowData.id));
|
$(td).html(detail_btn.replace('{{ DEFAULT_PK }}', rowData.id));
|
||||||
}},
|
}},
|
||||||
|
{targets: 2, createdCell: function (td, cellData, rowData) {
|
||||||
|
var html = createPopover(cellData);
|
||||||
|
$(td).html(html);
|
||||||
|
}},
|
||||||
{targets: 3, createdCell: function (td, cellData) {
|
{targets: 3, createdCell: function (td, cellData) {
|
||||||
var innerHtml = cellData.length > 30 ? cellData.substring(0, 30) + '...': cellData;
|
var innerHtml = cellData.length > 30 ? cellData.substring(0, 30) + '...': cellData;
|
||||||
$(td).html('<span href="javascript:void(0);" data-toggle="tooltip" title="' + cellData + '">' + innerHtml + '</span>');
|
$(td).html('<span href="javascript:void(0);" data-toggle="tooltip" title="' + cellData + '">' + innerHtml + '</span>');
|
||||||
@ -49,7 +53,7 @@ $(document).ready(function() {
|
|||||||
}}
|
}}
|
||||||
],
|
],
|
||||||
ajax_url: '{% url "api-users:user-group-list" %}',
|
ajax_url: '{% url "api-users:user-group-list" %}',
|
||||||
columns: [{data: function(){return ""}}, {data: "name" }, {data: "user_amount"},
|
columns: [{data: function(){return ""}}, {data: "name" }, {data: "users"},
|
||||||
{data: "comment"}, {data: "id" }],
|
{data: "comment"}, {data: "id" }],
|
||||||
order: [],
|
order: [],
|
||||||
op_html: $('#actions').html()
|
op_html: $('#actions').html()
|
||||||
|
Loading…
Reference in New Issue
Block a user