[Feature] 支持popover

pull/1007/head
ibuler 2018-01-30 18:07:51 +08:00
parent 3e62a7f5b7
commit 9e09a962af
9 changed files with 62 additions and 22 deletions

View File

@ -42,7 +42,7 @@ class AssetViewSet(CustomFilterMixin, LabelFilter, BulkModelViewSet):
"""
filter_fields = ("hostname", "ip")
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()
serializer_class = serializers.AssetSerializer
pagination_class = LimitOffsetPagination

View File

@ -12,7 +12,7 @@ class AssetGroupSerializer(BulkSerializerMixin, serializers.ModelSerializer):
"""
资产组序列化数据模型
"""
assets_amount = serializers.SerializerMethodField()
assets_display = serializers.SerializerMethodField()
assets = serializers.PrimaryKeyRelatedField(
many=True, queryset=Asset.objects.all(), required=False
)
@ -20,11 +20,11 @@ class AssetGroupSerializer(BulkSerializerMixin, serializers.ModelSerializer):
class Meta:
model = AssetGroup
list_serializer_class = BulkListSerializer
fields = ['id', 'name', 'comment', 'assets_amount', 'assets']
fields = ['id', 'name', 'comment', 'assets_display', 'assets']
@staticmethod
def get_assets_amount(obj):
return obj.assets.all().count()
def get_assets_display(obj):
return [asset.hostname for asset in obj.assets.all()]
class AssetUpdateSystemUserSerializer(serializers.ModelSerializer):

View File

@ -33,14 +33,18 @@ $(document).ready(function(){
{targets: 1, createdCell: function (td, cellData, rowData) {
var detail_btn = '<a href="{% url "assets:asset-group-detail" pk=DEFAULT_PK %}">' + cellData + '</a>';
$(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) {
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);
$(td).html(update_btn + del_btn)
}}],
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()
};
jumpserver.initDataTable(options);

View File

@ -29,7 +29,6 @@
<td class="text-center">{{ asset.id }}</td>
<td class="text-center">{{ asset.hostname }}</td>
<td class="text-center">{{ asset.ip }}</td>
<td class="text-center">{{ asset.env }}-{{ asset.type }}</td>
</tr>
{% endfor %}
</tbody>

View File

@ -48,19 +48,24 @@ function initTable() {
$(td).html(detail_btn.replace('{{ DEFAULT_PK }}', rowData.id));
}},
{targets: 2, createdCell: function (td, cellData) {
$(td).html(cellData.length);
var html = createPopover(cellData);
$(td).html(html);
}},
{targets: 3, createdCell: function (td, cellData) {
$(td).html(cellData.length);
var html = createPopover(cellData);
$(td).html(html);
}},
{targets: 4, createdCell: function (td, cellData) {
$(td).html(cellData.length);
var html = createPopover(cellData);
$(td).html(html);
}},
{targets: 5, createdCell: function (td, cellData) {
$(td).html(cellData.length);
var html = createPopover(cellData);
$(td).html(html);
}},
{targets: 6, createdCell: function (td, cellData) {
$(td).html(cellData.length);
var html = createPopover(cellData);
$(td).html(html);
}},
{targets: 7, createdCell: function (td, cellData) {
if (!cellData) {
@ -85,11 +90,15 @@ function initTable() {
],
op_html: $('#actions').html()
};
jumpserver.initDataTable(options);
jumpserver.initDataTable(options).on('daw', function () {
$('[data-toggle="popover"]').popover({
html: true
});
});
}
$(document).ready(function(){
initTable();
initTable()
})
.on('click', '.btn-del', function () {

View File

@ -340,4 +340,9 @@ div.dataTables_wrapper div.dataTables_filter {
border: none;
}
.popover{
max-width: 100%; /* Max Width of the popover (depending on the container!) */
padding-left: 20px;
padding-right: 20px;
}

View File

@ -310,10 +310,15 @@ jumpserver.initDataTable = function (options) {
var $node = table[ type ]( indexes ).nodes().to$();
$node.find('input.ipt_check').prop('checked', false);
jumpserver.selected[$node.find('input.ipt_check').prop('id')] = false
}).
on('draw', function(){
}).on('draw', function(){
$('#op').html(options.op_html || '');
$('#uc').html(options.uc_html || '');
$('[data-toggle="popover"]').popover({
html: true,
placement: 'bottom',
trigger: 'hover',
container: 'body'
});
});
$('.ipt_check_all').on('click', function() {
if (!jumpserver.checked) {
@ -512,3 +517,17 @@ function delCookie(key) {
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;
}

View File

@ -52,7 +52,7 @@ class UserUpdateGroupSerializer(serializers.ModelSerializer):
class UserGroupSerializer(BulkSerializerMixin, serializers.ModelSerializer):
user_amount = serializers.SerializerMethodField()
users = serializers.SerializerMethodField()
class Meta:
model = UserGroup
@ -60,8 +60,8 @@ class UserGroupSerializer(BulkSerializerMixin, serializers.ModelSerializer):
fields = '__all__'
@staticmethod
def get_user_amount(obj):
return obj.users.count()
def get_users(obj):
return [user.name for user in obj.users.all()]
class UserGroupUpdateMemeberSerializer(serializers.ModelSerializer):

View File

@ -10,7 +10,7 @@
<input id="" type="checkbox" class="ipt_check_all">
</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 'Action' %}</th>
</tr>
@ -31,6 +31,10 @@ $(document).ready(function() {
var detail_btn = '<a href="{% url "users:user-group-detail" pk=DEFAULT_PK %}">' + cellData + '</a>';
$(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) {
var innerHtml = cellData.length > 30 ? cellData.substring(0, 30) + '...': cellData;
$(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" %}',
columns: [{data: function(){return ""}}, {data: "name" }, {data: "user_amount"},
columns: [{data: function(){return ""}}, {data: "name" }, {data: "users"},
{data: "comment"}, {data: "id" }],
order: [],
op_html: $('#actions').html()