Commit 9e09a962 authored by ibuler's avatar ibuler

[Feature] 支持popover

parent 3e62a7f5
...@@ -42,7 +42,7 @@ class AssetViewSet(CustomFilterMixin, LabelFilter, BulkModelViewSet): ...@@ -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): ...@@ -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): ...@@ -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):
......
...@@ -33,14 +33,18 @@ $(document).ready(function(){ ...@@ -33,14 +33,18 @@ $(document).ready(function(){
{targets: 1, createdCell: function (td, cellData, rowData) { {targets: 1, createdCell: function (td, cellData, rowData) {
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 @@ ...@@ -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() { ...@@ -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() { ...@@ -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 { ...@@ -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) { ...@@ -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) { ...@@ -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;
}
\ No newline at end of file
...@@ -52,7 +52,7 @@ class UserUpdateGroupSerializer(serializers.ModelSerializer): ...@@ -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): ...@@ -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 @@ ...@@ -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() { ...@@ -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() { ...@@ -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()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment