From 8ddda8e5afdcbc2b9ae40f5bc491f505446d1e53 Mon Sep 17 00:00:00 2001 From: ibuler Date: Thu, 12 Sep 2019 11:17:15 +0800 Subject: [PATCH 1/5] =?UTF-8?q?[Update]=20=E4=BF=AE=E5=A4=8D=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2bug=E5=92=8Cpopover=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/forms/asset.py | 9 +++++++-- apps/assets/models/node.py | 11 +++++++---- apps/assets/views/asset.py | 2 +- apps/audits/templates/audits/ftp_log_list.html | 3 +++ apps/audits/templates/audits/login_log_list.html | 6 ++++++ apps/audits/templates/audits/operate_log_list.html | 6 ++++++ .../templates/audits/password_change_log_list.html | 6 ++++++ apps/common/mixins/api.py | 5 +++-- apps/ops/tasks.py | 2 +- apps/ops/templates/ops/command_execution_list.html | 13 +++++-------- apps/orgs/mixins/api.py | 4 ++++ apps/static/js/inspinia.js | 5 ++--- apps/static/js/jumpserver.js | 3 +-- 13 files changed, 52 insertions(+), 23 deletions(-) diff --git a/apps/assets/forms/asset.py b/apps/assets/forms/asset.py index 3500862e5..69e64ceaf 100644 --- a/apps/assets/forms/asset.py +++ b/apps/assets/forms/asset.py @@ -33,11 +33,16 @@ class AssetCreateForm(OrgModelForm): return nodes_field = self.fields['nodes'] if self.instance: - nodes_field.choices = ((n.id, n.full_value) for n in - self.instance.nodes.all()) + nodes_field.choices = [(n.id, n.full_value) for n in + self.instance.nodes.all()] else: nodes_field.choices = [] + def add_nodes_initial(self, node): + nodes_field = self.fields['nodes'] + nodes_field.choices.append((node.id, node.full_value)) + nodes_field.initial = [node] + class Meta: model = Asset fields = [ diff --git a/apps/assets/models/node.py b/apps/assets/models/node.py index 37ebbd6d3..243c352a7 100644 --- a/apps/assets/models/node.py +++ b/apps/assets/models/node.py @@ -37,19 +37,22 @@ class TreeMixin: def tree(cls): from ..utils import TreeService tree_updated_time = cache.get(cls.tree_updated_time_cache_key, 0) + now = time.time() + # 什么时候重新初始化 _tree_service if not cls.tree_created_time or \ tree_updated_time > cls.tree_created_time: logger.debug("Create node tree") tree = TreeService.new() - cls.tree_created_time = time.time() - cls.tree_assets_created_time = time.time() + cls.tree_created_time = now + cls.tree_assets_created_time = now cls._tree_service = tree return tree + # 是否要重新初始化节点资产 node_assets_updated_time = cache.get(cls.tree_assets_cache_key, 0) if not cls.tree_assets_created_time or \ node_assets_updated_time > cls.tree_assets_created_time: - cls._tree_service.init_assets_async() - cls.tree_assets_created_time = time.time() + cls._tree_service.init_assets() + cls.tree_assets_created_time = now logger.debug("Refresh node tree assets") return cls._tree_service diff --git a/apps/assets/views/asset.py b/apps/assets/views/asset.py index 257691fa4..f08c08db8 100644 --- a/apps/assets/views/asset.py +++ b/apps/assets/views/asset.py @@ -86,7 +86,7 @@ class AssetCreateView(PermissionsMixin, FormMixin, TemplateView): node = get_object_or_none(Node, id=node_id) else: node = Node.org_root() - form["nodes"].initial = node + form.add_nodes_initial(node) return form def get_protocol_formset(self): diff --git a/apps/audits/templates/audits/ftp_log_list.html b/apps/audits/templates/audits/ftp_log_list.html index 91ea6c49d..a5e3fceec 100644 --- a/apps/audits/templates/audits/ftp_log_list.html +++ b/apps/audits/templates/audits/ftp_log_list.html @@ -11,6 +11,9 @@ #search_btn { margin-bottom: 0; } + .form-control { + height: 30px; + } {% endblock %} diff --git a/apps/audits/templates/audits/login_log_list.html b/apps/audits/templates/audits/login_log_list.html index c855db1c1..6a3bae989 100644 --- a/apps/audits/templates/audits/login_log_list.html +++ b/apps/audits/templates/audits/login_log_list.html @@ -8,6 +8,12 @@ #search_btn { margin-bottom: 0; } + .form-control { + height: 30px; + } + .select2-selection__rendered span.select2-selection, .select2-container .select2-selection--single { + height: 30px !important; + } {% endblock %} diff --git a/apps/audits/templates/audits/operate_log_list.html b/apps/audits/templates/audits/operate_log_list.html index 736c4f7ac..ae072187d 100644 --- a/apps/audits/templates/audits/operate_log_list.html +++ b/apps/audits/templates/audits/operate_log_list.html @@ -11,6 +11,12 @@ #search_btn { margin-bottom: 0; } + .form-control { + height: 30px; + } + .select2-selection__rendered span.select2-selection, .select2-container .select2-selection--single { + height: 30px !important; + } {% endblock %} diff --git a/apps/audits/templates/audits/password_change_log_list.html b/apps/audits/templates/audits/password_change_log_list.html index a8a2f818d..1440dca2d 100644 --- a/apps/audits/templates/audits/password_change_log_list.html +++ b/apps/audits/templates/audits/password_change_log_list.html @@ -11,6 +11,12 @@ #search_btn { margin-bottom: 0; } + .form-control { + height: 30px; + } + .select2-selection__rendered span.select2-selection, .select2-container .select2-selection--single { + height: 30px !important; + } {% endblock %} diff --git a/apps/common/mixins/api.py b/apps/common/mixins/api.py index ae92e3e97..96c170670 100644 --- a/apps/common/mixins/api.py +++ b/apps/common/mixins/api.py @@ -44,8 +44,9 @@ class IDInCacheFilterMixin(object): return queryset cache_key = KEY_CACHE_RESOURCES_ID.format(spm) resources_id = cache.get(cache_key) - if resources_id and isinstance(resources_id, list): - queryset = queryset.filter(id__in=resources_id) + if not resources_id or not isinstance(resources_id, list): + queryset = queryset.none() + queryset = queryset.filter(id__in=resources_id) return queryset diff --git a/apps/ops/tasks.py b/apps/ops/tasks.py index 64d979c25..d2f55f623 100644 --- a/apps/ops/tasks.py +++ b/apps/ops/tasks.py @@ -40,7 +40,7 @@ def run_ansible_task(tid, callback=None, **kwargs): logger.error("No task found") -@shared_task(soft_time_limit=60) +@shared_task(soft_time_limit=60, queue="ansible") def run_command_execution(cid, **kwargs): execution = get_object_or_none(CommandExecution, id=cid) if execution: diff --git a/apps/ops/templates/ops/command_execution_list.html b/apps/ops/templates/ops/command_execution_list.html index fe8b7122c..3c9f1b54e 100644 --- a/apps/ops/templates/ops/command_execution_list.html +++ b/apps/ops/templates/ops/command_execution_list.html @@ -9,6 +9,9 @@ @@ -29,7 +29,8 @@
-
+
+ {% trans 'Loading' %} ...
@@ -55,12 +56,78 @@
{% endblock %} diff --git a/apps/assets/templates/assets/asset_list.html b/apps/assets/templates/assets/asset_list.html index 58e0d86e5..fcd0f79ff 100644 --- a/apps/assets/templates/assets/asset_list.html +++ b/apps/assets/templates/assets/asset_list.html @@ -226,6 +226,33 @@ function onNodeSelected(event, treeNode) { asset_table.ajax.reload(); } +function onAssetModalConfirmAddAssetToNode(table) { + var assets_selected = table.selected; + if (!current_node_id) { + return + } + + var data = {'assets': assets_selected}; + var success = function () { + table.selected = []; + table.ajax.reload() + }; + + var url = ''; + if (update_node_action === "move") { + url = "{% url 'api-assets:node-replace-assets' pk=DEFAULT_PK %}".replace("{{ DEFAULT_PK }}", current_node_id); + } else { + url = "{% url 'api-assets:node-add-assets' pk=DEFAULT_PK %}".replace("{{ DEFAULT_PK }}", current_node_id); + } + + requestApi({ + 'url': url, + 'method': 'PUT', + 'body': JSON.stringify(data), + 'success': success + }) +} + $(document).ready(function(){ initTable(); initTree(); @@ -236,6 +263,12 @@ $(document).ready(function(){ else{ $('#show_current_asset').css('display', 'inline-block'); } + + var modalOption = { + onModalConfirm: onAssetModalConfirmAddAssetToNode, + onModalTableDone: null + }; + setAssetModalOptions(modalOption); }) .on('click', '.labels li', function () { var val = $(this).text(); @@ -429,7 +462,6 @@ $(document).ready(function(){ } function doRemove() { - var nodes = zTree.getSelectedNodes(); if (!current_node_id) { return } @@ -472,32 +504,7 @@ $(document).ready(function(){ } $(".ipt_check_all").prop("checked", false) }) -.on('click', '#btn_asset_modal_confirm', function () { - var assets_selected = asset_table2.selected; - if (!current_node_id) { - return - } - - var data = {'assets': assets_selected}; - var success = function () { - asset_table2.selected = []; - asset_table2.ajax.reload() - }; - - var url = ''; - if (update_node_action === "move") { - url = "{% url 'api-assets:node-replace-assets' pk=DEFAULT_PK %}".replace("{{ DEFAULT_PK }}", current_node_id); - } else { - url = "{% url 'api-assets:node-add-assets' pk=DEFAULT_PK %}".replace("{{ DEFAULT_PK }}", current_node_id); - } - - requestApi({ - 'url': url, - 'method': 'PUT', - 'body': JSON.stringify(data), - 'success': success - }) -}).on('hidden.bs.modal', '#asset_list_modal', function () { +.on('hidden.bs.modal', '#asset_list_modal', function () { window.location.reload(); }).on('click', '#menu_asset_add', function () { update_node_action = "add" diff --git a/apps/assets/templates/assets/domain_create_update.html b/apps/assets/templates/assets/domain_create_update.html index 399b38011..96bfd02aa 100644 --- a/apps/assets/templates/assets/domain_create_update.html +++ b/apps/assets/templates/assets/domain_create_update.html @@ -28,25 +28,6 @@ $(document).ready(function () { }).on('click', '.select2-selection__rendered', function (e) { e.preventDefault(); $("#asset_list_modal").modal(); - initSelectedAssets2Table(); -}) -.on('click', '#btn_asset_modal_confirm', function () { - var assets = asset_table2.selected; - var options = []; - $('#id_assets option').each(function (i, v) { - options.push(v.value) - }); - asset_table2.selected_rows.forEach(function (i) { - var name = i.hostname + '(' + i.ip + ')'; - var option = new Option(name, i.id, false, true); - - if (options.indexOf(i.id) === -1) { - $('#id_assets').append(option).trigger('change'); - } - }); - $('.select2').val(assets).trigger('change'); - $("#asset_list_modal").modal('hide'); - }) .on("submit", "form", function (evt) { evt.preventDefault(); diff --git a/apps/assets/templates/assets/label_create_update.html b/apps/assets/templates/assets/label_create_update.html index a6b9582a5..41646003c 100644 --- a/apps/assets/templates/assets/label_create_update.html +++ b/apps/assets/templates/assets/label_create_update.html @@ -32,24 +32,6 @@ $(document).ready(function () { }).on('click', '.select2-selection__rendered', function (e) { e.preventDefault(); $("#asset_list_modal").modal(); - initSelectedAssets2Table(); -}) -.on('click', '#btn_asset_modal_confirm', function () { - var assets = asset_table2.selected; - var options = []; - $('#id_assets option').each(function (i, v) { - options.push(v.value) - }); - asset_table2.selected_rows.forEach(function (i) { - var name = i.hostname + '(' + i.ip + ')'; - var option = new Option(name, i.id, false, true); - - if (options.indexOf(i.id) === -1) { - $('#id_assets').append(option).trigger('change'); - } - }); - $('#id_assets').val(assets).trigger('change'); - $("#asset_list_modal").modal('hide'); }) .on("submit", "form", function (evt) { evt.preventDefault(); diff --git a/apps/common/signals_handlers.py b/apps/common/signals_handlers.py index 91901676d..e7dd728c3 100644 --- a/apps/common/signals_handlers.py +++ b/apps/common/signals_handlers.py @@ -14,7 +14,7 @@ from .local import thread_local pattern = re.compile(r'FROM `(\w+)`') logger = get_logger(__name__) -DEBUG_DB_QUERY = os.environ.get('DEBUG_DB_QUERY', '0') == '1' +DEBUG_DB = os.environ.get('DEBUG_DB', '0') == '1' class Counter: @@ -58,7 +58,7 @@ def on_request_finished_release_local(sender, **kwargs): thread_local.__release_local__() -if settings.DEBUG and DEBUG_DB_QUERY: +if settings.DEBUG and DEBUG_DB: request_finished.connect(on_request_finished_logging_db_query) diff --git a/apps/jumpserver/settings.py b/apps/jumpserver/settings.py index 27df6314f..ed6e665b5 100644 --- a/apps/jumpserver/settings.py +++ b/apps/jumpserver/settings.py @@ -607,8 +607,10 @@ SWAGGER_SETTINGS = { 'in': 'header' } }, + 'DEFAULT_API_URL': 'http://www.fit2cloud.com' } + # Default email suffix EMAIL_SUFFIX = CONFIG.EMAIL_SUFFIX LOGIN_LOG_KEEP_DAYS = CONFIG.LOGIN_LOG_KEEP_DAYS diff --git a/apps/ops/templates/ops/command_execution_list.html b/apps/ops/templates/ops/command_execution_list.html index 3c9f1b54e..81e9635c6 100644 --- a/apps/ops/templates/ops/command_execution_list.html +++ b/apps/ops/templates/ops/command_execution_list.html @@ -110,10 +110,16 @@ $(document).ready(function() { data_list.pop(); } var html = createPopover(data_list); - console.log(html); $(this).html(html); }); - $('[data-toggle=popover]').popover({html : true}); + $('[data-toggle="popover"]').popover({ + html: true, + placement: 'bottom', + trigger: 'click', + container: 'body' + }).on('click', function (e) { + $('[data-toggle="popover"]').not(this).popover('hide'); + }); }) {% endblock %} diff --git a/apps/perms/api/asset_permission.py b/apps/perms/api/asset_permission.py index 810ae5ac9..3e7f4a078 100644 --- a/apps/perms/api/asset_permission.py +++ b/apps/perms/api/asset_permission.py @@ -97,6 +97,8 @@ class AssetPermissionViewSet(viewsets.ModelViewSet): inherit_nodes_keys = assets.all().values_list('nodes__key', flat=True) for key in inherit_nodes_keys: + if key is None: + continue ancestor_keys = Node.get_nodes_ancestor_keys_by_key(key, with_self=True) inherit_all_nodes.update(ancestor_keys) queryset = queryset.filter( diff --git a/apps/perms/forms/asset_permission.py b/apps/perms/forms/asset_permission.py index 1d80258d4..6fdaee30b 100644 --- a/apps/perms/forms/asset_permission.py +++ b/apps/perms/forms/asset_permission.py @@ -53,6 +53,16 @@ class AssetPermissionForm(OrgModelForm): assets_field.queryset = Asset.objects.none() nodes_field.queryset = Node.objects.none() + def set_nodes_initial(self, nodes): + field = self.fields['nodes'] + field.choices = [(n.id, n.full_value) for n in nodes] + field.initial = nodes + + def set_assets_initial(self, assets): + field = self.fields['assets'] + field.choices = [(a.id, a.hostname) for a in assets] + field.initial = assets + class Meta: model = AssetPermission exclude = ( diff --git a/apps/perms/signals_handler.py b/apps/perms/signals_handler.py index e23bc1f8c..8066ce5ca 100644 --- a/apps/perms/signals_handler.py +++ b/apps/perms/signals_handler.py @@ -47,7 +47,7 @@ def on_permission_nodes_changed(sender, instance=None, action='', **kwargs): if isinstance(instance, AssetPermission): logger.debug("Asset permission nodes change signal received") nodes = kwargs['model'].objects.filter(pk__in=kwargs['pk_set']) - system_users = instance.system_users.all().values_list('id', flat=True) + system_users = instance.system_users.all() for system_user in system_users: system_user.nodes.add(*tuple(nodes)) @@ -59,7 +59,7 @@ def on_permission_assets_changed(sender, instance=None, action='', **kwargs): if isinstance(instance, AssetPermission): logger.debug("Asset permission assets change signal received") assets = kwargs['model'].objects.filter(pk__in=kwargs['pk_set']) - system_users = instance.system_users.all().values_list('id', flat=True) + system_users = instance.system_users.all() for system_user in system_users: system_user.assets.add(*tuple(assets)) diff --git a/apps/perms/templates/perms/asset_permission_asset.html b/apps/perms/templates/perms/asset_permission_asset.html index ccb1b7f90..093ab39a8 100644 --- a/apps/perms/templates/perms/asset_permission_asset.html +++ b/apps/perms/templates/perms/asset_permission_asset.html @@ -100,10 +100,7 @@
- @@ -202,35 +199,22 @@ function initAssetTable() { return table } + $(document).ready(function () { $('.select2').select2(); table = initAssetTable(); + + var nodeListUrl = "{% url 'api-assets:node-list' %}"; + nodesSelect2Init(".nodes-select2", nodeListUrl); + $("#asset_select2").parent().find(".select2-selection").on('click', function (e) { if ($(e.target).attr('class') !== 'select2-selection__choice__remove'){ e.preventDefault(); e.stopPropagation(); $("#asset_list_modal").modal(); - initSelectedAssets2Table('#asset_select2'); } }) }) -.on('click', '#btn_asset_modal_confirm', function () { - var assets = asset_table2.selected; - var options = []; - $('#asset_select2 option').each(function (i, v) { - options.push(v.value) - }); - asset_table2.selected_rows.forEach(function (i) { - var name = i.hostname + '(' + i.ip + ')'; - var option = new Option(name, i.id, false, true); - - if (options.indexOf(i.id) === -1) { - $('#asset_select2').append(option).trigger('change'); - } - }); - $('#asset_select2').val(assets).trigger('change'); - $("#asset_list_modal").modal('hide'); -}) .on('click', '.btn-add-assets', function () { var assets_selected = $("#asset_select2 option:selected").map(function () { return $(this).attr('value'); @@ -250,7 +234,7 @@ $(document).ready(function () { }) .on('click', '#btn-add-node', function () { var nodes_selected = {}; - $("#node_select2 option:selected").each(function (i, data) { + $("#nodes_select2 option:selected").each(function (i, data) { nodes_selected[$(data).attr('value')] = $(data).text(); }); if (Object.keys(nodes_selected).length === 0) { diff --git a/apps/perms/templates/perms/asset_permission_create_update.html b/apps/perms/templates/perms/asset_permission_create_update.html index 5b69f7b4c..be4424549 100644 --- a/apps/perms/templates/perms/asset_permission_create_update.html +++ b/apps/perms/templates/perms/asset_permission_create_update.html @@ -111,31 +111,57 @@ var dateOptions = { } }; var api_action = "{{ api_action }}"; + +function onAssetModalConfirm(table) { + var assets = assetModalTable.selected; + var options = []; + $('#id_assets option').each(function (i, v) { + options.push(v.value) + }); + assetModalTable.selected_rows.forEach(function (i) { + var name = i.hostname + '(' + i.ip + ')'; + var option = new Option(name, i.id, false, true); + + if (options.indexOf(i.id) === -1) { + $('#id_assets').append(option).trigger('change'); + } + }); + $('#id_assets').val(assets).trigger('change'); +} + $(document).ready(function () { $('.select2').select2({ closeOnSelect: false }); var url = "{% url 'api-assets:node-list' %}"; nodesSelect2Init(".nodes-select2", url); + $('#date_start').daterangepicker(dateOptions); $('#date_expired').daterangepicker(dateOptions); + + var modalOption = { + onModalConfirm: onAssetModalConfirm, + onAssetTableDone: function (modalTable) { + syncSelectedAssetsToModalTable(modalTable) + }, + }; + setAssetModalOptions(modalOption); $("#id_assets").parent().find(".select2-selection").on('click', function (e) { if ($(e.target).attr('class') !== 'select2-selection__choice__remove'){ e.preventDefault(); e.stopPropagation(); $("#asset_list_modal").modal(); - initSelectedAssets2Table(); } }) }) .on('click', '#btn_asset_modal_confirm', function () { - var assets = asset_table2.selected; + var assets = assetModalTable.selected; var options = []; $('#id_assets option').each(function (i, v) { options.push(v.value) }); - asset_table2.selected_rows.forEach(function (i) { + assetModalTable.selected_rows.forEach(function (i) { var name = i.hostname + '(' + i.ip + ')'; var option = new Option(name, i.id, false, true); diff --git a/apps/perms/templates/perms/asset_permission_list.html b/apps/perms/templates/perms/asset_permission_list.html index 95a92f16b..2a493e16b 100644 --- a/apps/perms/templates/perms/asset_permission_list.html +++ b/apps/perms/templates/perms/asset_permission_list.html @@ -227,7 +227,6 @@ function toggle() { $(document).ready(function(){ initTable(); initTree(); - }) .on('click', '.btn-del', function () { var $this = $(this); @@ -247,17 +246,19 @@ $(document).ready(function(){ }) .on('click', '.btn-create-permission', function () { var url = "{% url 'perms:asset-permission-create' %}"; - var nodes = zTree.getSelectedNodes(); - var _nodes = []; - var _assets = []; - $.each(nodes, function (id, node) { - if (node.meta.type === 'node') { - _nodes.push(node.meta.node.id) - } else { - _assets.push(node.meta.asset.id) - } - }); - url += "?assets=" + _assets.join(",") + "&nodes=" + _nodes.join(","); + if (zTree) { + var nodes = zTree.getSelectedNodes(); + var _nodes = []; + var _assets = []; + $.each(nodes, function (id, node) { + if (node.meta.type === 'node') { + _nodes.push(node.meta.node.id) + } else { + _assets.push(node.meta.asset.id) + } + }); + url += "?assets=" + _assets.join(",") + "&nodes=" + _nodes.join(","); + } window.open(url, '_self'); }).on('click', '.toggle', function (e) { e.preventDefault(); @@ -283,7 +284,6 @@ $(document).ready(function(){ detailRows.push(tr.attr('id')); } } - }).on('click', '#permission_list_table_filter input', function (e) { e.preventDefault(); e.stopPropagation(); diff --git a/apps/perms/views/asset_permission.py b/apps/perms/views/asset_permission.py index e7d2f155b..94c7c8c62 100644 --- a/apps/perms/views/asset_permission.py +++ b/apps/perms/views/asset_permission.py @@ -53,11 +53,11 @@ class AssetPermissionCreateView(PermissionsMixin, CreateView): nodes_id = nodes_id.split(",") nodes = Node.objects.filter(id__in=nodes_id)\ .exclude(id=Node.org_root().id) - form['nodes'].initial = nodes + form.set_nodes_initial(nodes) if assets_id: assets_id = assets_id.split(",") assets = Asset.objects.filter(id__in=assets_id) - form['assets'].initial = assets + form.set_assets_initial(assets) return form def get_context_data(self, **kwargs): diff --git a/apps/settings/templates/settings/_ldap_list_users_modal.html b/apps/settings/templates/settings/_ldap_list_users_modal.html index c0d062714..dd839eb5b 100644 --- a/apps/settings/templates/settings/_ldap_list_users_modal.html +++ b/apps/settings/templates/settings/_ldap_list_users_modal.html @@ -17,13 +17,6 @@ padding: 10px 10px; text-align: center; } - -#assetTree2.ztree * { - background-color: #f8fafb; -} -#assetTree2.ztree { - background-color: #f8fafb; -}
diff --git a/apps/static/js/jumpserver.js b/apps/static/js/jumpserver.js index 0d88c69bd..3252bb39f 100644 --- a/apps/static/js/jumpserver.js +++ b/apps/static/js/jumpserver.js @@ -1,7 +1,8 @@ //jumpserver 自定义js 2015-01-29 //此函数用于checkbox的全选和反选 -var checked=false; +var checked = false; + function check_all(form) { var checkboxes = document.getElementById(form); if (checked === false) { @@ -16,26 +17,23 @@ function check_all(form) { } } -function checkAll(id, name){ +function checkAll(id, name) { var checklist = document.getElementsByName(name); - if(document.getElementById(id).checked) - { - for(var i=0;i") ; + var help_msg = v.join("
"); helpBlockRef.html(help_msg); } else { $.each(v, function (kk, vv) { @@ -241,7 +236,7 @@ function formSubmit(props) { $.each(vv, function (kkk, vvv) { noneFieldErrorMsg += " " + vvv + '
'; }) - } else{ + } else { noneFieldErrorMsg += vv + '
'; } }) @@ -264,7 +259,7 @@ function requestApi(props) { var user_fail_message = props.fail_message; var default_failed_message = gettext('An unknown error occurred while updating..'); var flash_message = props.flash_message || true; - if (props.flash_message === false){ + if (props.flash_message === false) { flash_message = false; } @@ -274,7 +269,7 @@ function requestApi(props) { data: props.body, contentType: props.content_type || "application/json; charset=utf-8", dataType: props.data_type || "json" - }).done(function(data, textStatue, jqXHR) { + }).done(function (data, textStatue, jqXHR) { if (flash_message) { var msg = ""; if (user_success_message) { @@ -287,7 +282,7 @@ function requestApi(props) { if (typeof props.success === 'function') { return props.success(data); } - }).fail(function(jqXHR, textStatus, errorThrown) { + }).fail(function (jqXHR, textStatus, errorThrown) { if (flash_message) { var msg = ""; if (user_fail_message) { @@ -308,24 +303,24 @@ function requestApi(props) { return props.error(jqXHR.responseText, jqXHR.status); } }); - // return true; + // return true; } // Sweet Alert for Delete function objectDelete(obj, name, url, redirectTo) { function doDelete() { var body = {}; - var success = function() { + var success = function () { // swal('Deleted!', "[ "+name+"]"+" has been deleted ", "success"); if (!redirectTo) { $(obj).parent().parent().remove(); } else { - window.location.href=redirectTo; + window.location.href = redirectTo; } }; - var fail = function() { + var fail = function () { // swal("错误", "删除"+"[ "+name+" ]"+"遇到错误", "error"); - swal(gettext('Error'), "[ "+name+" ]" + gettext("Being used by the asset, please unbind the asset first."), "error"); + swal(gettext('Error'), "[ " + name + " ]" + gettext("Being used by the asset, please unbind the asset first."), "error"); }; requestApi({ url: url, @@ -336,6 +331,7 @@ function objectDelete(obj, name, url, redirectTo) { error: fail }); } + swal({ title: gettext('Are you sure about deleting it?'), text: " [" + name + "] ", @@ -350,22 +346,21 @@ function objectDelete(obj, name, url, redirectTo) { }); } -function orgDelete(obj, name, url, redirectTo){ +function orgDelete(obj, name, url, redirectTo) { function doDelete() { var body = {}; - var success = function() { + var success = function () { if (!redirectTo) { $(obj).parent().parent().remove(); } else { - window.location.href=redirectTo; + window.location.href = redirectTo; } }; - var fail = function(responseText, status) { - if (status === 400){ - swal(gettext("Error"), "[ " + name + " ] " + gettext("The organization contains undeleted information. Please try again after deleting"), "error"); - } - else if (status === 405){ - swal(gettext("Error"), " [ "+ name + " ] " + gettext("Do not perform this operation under this organization. Try again after switching to another organization"), "error"); + var fail = function (responseText, status) { + if (status === 400) { + swal(gettext("Error"), "[ " + name + " ] " + gettext("The organization contains undeleted information. Please try again after deleting"), "error"); + } else if (status === 405) { + swal(gettext("Error"), " [ " + name + " ] " + gettext("Do not perform this operation under this organization. Try again after switching to another organization"), "error"); } }; requestApi({ @@ -377,6 +372,7 @@ function orgDelete(obj, name, url, redirectTo){ error: fail }); } + swal({ title: gettext("Please ensure that the following information in the organization has been deleted"), text: gettext("User list、User group、Asset list、Domain list、Admin user、System user、Labels、Asset permission"), @@ -391,11 +387,10 @@ function orgDelete(obj, name, url, redirectTo){ }); } -$.fn.serializeObject = function() -{ +$.fn.serializeObject = function () { var o = {}; var a = this.serializeArray(); - $.each(a, function() { + $.each(a, function () { if (o[this.name] !== undefined) { if (!o[this.name].push) { o[this.name] = [o[this.name]]; @@ -413,7 +408,6 @@ function makeLabel(data) { } - var jumpserver = {}; jumpserver.checked = false; jumpserver.selected = {}; @@ -422,7 +416,7 @@ jumpserver.language = { search: gettext('Search'), select: { rows: { - _: gettext("Selected item %d"), + _: gettext("Selected item %d"), 0: "" } }, @@ -440,36 +434,40 @@ jumpserver.language = { } }; jumpserver.initDataTable = function (options) { - // options = { - // ele *: $('#dataTable_id'), - // ajax_url *: '{% url 'users:user-list-api' %}', - // columns *: [{data: ''}, ....], - // dom: 'fltip', - // i18n_url: '{% static "js/...../en-us.json" %}', - // order: [[1, 'asc'], [2, 'asc'], ...], - // buttons: ['excel', 'pdf', 'print'], - // columnDefs: [{target: 0, createdCell: ()=>{}}, ...], - // uc_html: 'header button', - // op_html: 'div.btn-group?', - // paging: true - // } - var ele = options.ele || $('.dataTable'); - var columnDefs = [ - { - targets: 0, - orderable: false, - createdCell: function (td, cellData) { - $(td).html(''.replace('99991937', cellData)); - } - }, - {className: 'text-center', render: $.fn.dataTable.render.text(), targets: '_all'} - ]; - columnDefs = options.columnDefs ? options.columnDefs.concat(columnDefs) : columnDefs; - var select = { - style: 'multi', - selector: 'td:first-child' - }; - var table = ele.DataTable({ + // options = { + // ele *: $('#dataTable_id'), + // ajax_url *: '{% url 'users:user-list-api' %}', + // columns *: [{data: ''}, ....], + // dom: 'fltip', + // i18n_url: '{% static "js/...../en-us.json" %}', + // order: [[1, 'asc'], [2, 'asc'], ...], + // buttons: ['excel', 'pdf', 'print'], + // columnDefs: [{target: 0, createdCell: ()=>{}}, ...], + // uc_html: 'header button', + // op_html: 'div.btn-group?', + // paging: true + // } + var ele = options.ele || $('.dataTable'); + var columnDefs = [ + { + targets: 0, + orderable: false, + createdCell: function (td, cellData) { + $(td).html(''.replace('99991937', cellData)); + } + }, + { + className: 'text-center', + render: $.fn.dataTable.render.text(), + targets: '_all' + } + ]; + columnDefs = options.columnDefs ? options.columnDefs.concat(columnDefs) : columnDefs; + var select = { + style: 'multi', + selector: 'td:first-child' + }; + var table = ele.DataTable({ pageLength: options.pageLength || 15, dom: options.dom || '<"#uc.pull-left"><"pull-right"<"inline"l><"#fb.inline"><"inline"f><"#fa.inline">>tr<"row m-t"<"col-md-8"<"#op.col-md-6"><"col-md-6 text-center"i>><"col-md-4"p>>', order: options.order || [], @@ -486,15 +484,15 @@ jumpserver.initDataTable = function (options) { language: jumpserver.language, lengthMenu: [[10, 15, 25, 50, -1], [10, 15, 25, 50, "All"]] }); - table.on('select', function(e, dt, type, indexes) { - var $node = table[ type ]( indexes ).nodes().to$(); + table.on('select', function (e, dt, type, indexes) { + var $node = table[type](indexes).nodes().to$(); $node.find('input.ipt_check').prop('checked', true); jumpserver.selected[$node.find('input.ipt_check').prop('id')] = true - }).on('deselect', function(e, dt, type, indexes) { - var $node = table[ type ]( indexes ).nodes().to$(); + }).on('deselect', function (e, dt, type, indexes) { + 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({ @@ -506,16 +504,16 @@ jumpserver.initDataTable = function (options) { $('[data-toggle="popover"]').not(this).popover('hide'); }); }); - $('.ipt_check_all').on('click', function() { - if ($(this).prop("checked")) { - $(this).closest('table').find('.ipt_check').prop('checked', true); - jumpserver.checked = true; - table.rows({search:'applied', page:'current'}).select(); - } else { - $(this).closest('table').find('.ipt_check').prop('checked', false); - jumpserver.checked = false; - table.rows({search:'applied', page:'current'}).deselect(); - } + $('.ipt_check_all').on('click', function () { + if ($(this).prop("checked")) { + $(this).closest('table').find('.ipt_check').prop('checked', true); + jumpserver.checked = true; + table.rows({search: 'applied', page: 'current'}).select(); + } else { + $(this).closest('table').find('.ipt_check').prop('checked', false); + jumpserver.checked = false; + table.rows({search: 'applied', page: 'current'}).deselect(); + } }); return table; @@ -532,40 +530,42 @@ jumpserver.initStaticTable = function (selector) { }; jumpserver.initServerSideDataTable = function (options) { - // options = { - // ele *: $('#dataTable_id'), - // ajax_url *: '{% url 'users:user-list-api' %}', - // columns *: [{data: ''}, ....], - // dom: 'fltip', - // i18n_url: '{% static "js/...../en-us.json" %}', - // order: [[1, 'asc'], [2, 'asc'], ...], - // buttons: ['excel', 'pdf', 'print'], - // columnDefs: [{target: 0, createdCell: ()=>{}}, ...], - // uc_html: 'header button', - // op_html: 'div.btn-group?', - // paging: true - // } - var ele = options.ele || $('.dataTable'); - var columnDefs = [ - { - targets: 0, - orderable: false, - createdCell: function (td, cellData) { - $(td).html(''.replace('99991937', cellData)); - } - }, - { - targets: '_all', - className: 'text-center', - render: $.fn.dataTable.render.text() - } - ]; - columnDefs = options.columnDefs ? options.columnDefs.concat(columnDefs) : columnDefs; - var select = { - style: 'multi', - selector: 'td:first-child' - }; - var table = ele.DataTable({ + // options = { + // ele *: $('#dataTable_id'), + // ajax_url *: '{% url 'users:user-list-api' %}', + // select_style: 'multi', + // columns *: [{data: ''}, ....], + // dom: 'fltip', + // i18n_url: '{% static "js/...../en-us.json" %}', + // order: [[1, 'asc'], [2, 'asc'], ...], + // buttons: ['excel', 'pdf', 'print'], + // columnDefs: [{target: 0, createdCell: ()=>{}}, ...], + // uc_html: 'header button', + // op_html: 'div.btn-group?', + // paging: true + // } + var ele = options.ele || $('.dataTable'); + var columnDefs = [ + { + targets: 0, + orderable: false, + createdCell: function (td, cellData) { + $(td).html(''.replace('99991937', cellData)); + } + }, + { + targets: '_all', + className: 'text-center', + render: $.fn.dataTable.render.text() + } + ]; + var select_style = options.select_style || 'multi'; + columnDefs = options.columnDefs ? options.columnDefs.concat(columnDefs) : columnDefs; + var select = { + style: select_style, + selector: 'td:first-child' + }; + var table = ele.DataTable({ pageLength: options.pageLength || 15, // dom: options.dom || '<"#uc.pull-left">fltr<"row m-t"<"col-md-8"<"#op.col-md-6"><"col-md-6 text-center"i>><"col-md-4"p>>', dom: options.dom || '<"#uc.pull-left"><"pull-right"<"inline"l><"#fb.inline"><"inline"f><"#fa.inline">>tr<"row m-t"<"col-md-8"<"#op.col-md-6"><"col-md-6 text-center"i>><"col-md-4"p>>', @@ -576,8 +576,8 @@ jumpserver.initServerSideDataTable = function (options) { processing: true, searchDelay: 800, ajax: { - url: options.ajax_url , - error: function(jqXHR, textStatus, errorThrown) { + url: options.ajax_url, + error: function (jqXHR, textStatus, errorThrown) { var msg = gettext("Unknown error occur"); if (jqXHR.responseJSON) { if (jqXHR.responseJSON.error) { @@ -590,7 +590,7 @@ jumpserver.initServerSideDataTable = function (options) { }, data: function (data) { delete data.columns; - if (data.length !== null){ + if (data.length !== null) { data.limit = data.length; delete data.length; } @@ -605,15 +605,15 @@ jumpserver.initServerSideDataTable = function (options) { var search_raw = []; search_list.map(function (val, index) { - var kv = val.split(":"); - if (kv.length === 2) { - var value = kv[1]; - var key = kv[0].trim(); - value = value.replace("+", " ").trim(); - search_attr[key] = value - } else { - search_raw.push(kv) - } + var kv = val.split(":"); + if (kv.length === 2) { + var value = kv[1]; + var key = kv[0].trim(); + value = value.replace("+", " ").trim(); + search_attr[key] = value + } else { + search_raw.push(kv) + } }); data.search = search_raw.join(""); $.each(search_attr, function (k, v) { @@ -629,8 +629,8 @@ jumpserver.initServerSideDataTable = function (options) { data.order = order; } }, - dataFilter: function(data){ - var json = jQuery.parseJSON( data ); + dataFilter: function (data) { + var json = jQuery.parseJSON(data); json.recordsTotal = json.count; json.recordsFiltered = json.count; return JSON.stringify(json); // return JSON string @@ -644,35 +644,36 @@ jumpserver.initServerSideDataTable = function (options) { }); table.selected = []; table.selected_rows = []; - table.on('select', function(e, dt, type, indexes) { - var $node = table[ type ]( indexes ).nodes().to$(); + table.on('select', function (e, dt, type, indexes) { + var $node = table[type](indexes).nodes().to$(); $node.find('input.ipt_check').prop('checked', true); jumpserver.selected[$node.find('input.ipt_check').prop('id')] = true; if (type === 'row') { var rows = table.rows(indexes).data(); $.each(rows, function (id, row) { - table.selected_rows.push(row); - if (row.id && $.inArray(row.id, table.selected) === -1){ - table.selected.push(row.id) + if (row.id && $.inArray(row.id, table.selected) === -1) { + table.selected.push(row.id); + table.selected_rows.push(row); } }) } - }).on('deselect', function(e, dt, type, indexes) { - var $node = table[ type ]( indexes ).nodes().to$(); + }).on('deselect', function (e, dt, type, indexes) { + 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; if (type === 'row') { var rows = table.rows(indexes).data(); $.each(rows, function (id, row) { - if (row.id){ + if (row.id) { var index = table.selected.indexOf(row.id); - if (index > -1){ - table.selected.splice(index, 1) + if (index > -1) { + table.selected.splice(index, 1); + table.selected_rows.splice(index, 1); } } }) } - }).on('draw', function(){ + }).on('draw', function () { $('[data-toggle="popover"]').popover({ html: true, placement: 'bottom', @@ -690,7 +691,7 @@ jumpserver.initServerSideDataTable = function (options) { $.each(table.selected, function (id, data) { var index = table_data.indexOf(data); - if (index > -1){ + if (index > -1) { table.rows(index).select() } }); @@ -701,13 +702,16 @@ jumpserver.initServerSideDataTable = function (options) { $('#fa').html(options.fa_html || ''); }); var table_id = table.settings()[0].sTableId; - $('#' + table_id + ' .ipt_check_all').on('click', function() { + $('#' + table_id + ' .ipt_check_all').on('click', function () { + if (select_style !== 'multi') { + return + } if ($(this).prop("checked")) { $(this).closest('table').find('.ipt_check').prop('checked', true); - table.rows({search:'applied', page:'current'}).select(); + table.rows({search: 'applied', page: 'current'}).select(); } else { $(this).closest('table').find('.ipt_check').prop('checked', false); - table.rows({search:'applied', page:'current'}).deselect(); + table.rows({search: 'applied', page: 'current'}).deselect(); } }); @@ -728,7 +732,7 @@ String.prototype.replaceAll = function (exp, newStr) { * 原型:字符串格式化 * @param args 格式化参数值 */ -String.prototype.format = function(args) { +String.prototype.format = function (args) { var result = this; if (arguments.length < 1) { return result; @@ -738,7 +742,7 @@ String.prototype.format = function(args) { if (arguments.length == 1 && typeof (args) == "object") { data = args; } - for ( var key in data) { + for (var key in data) { var value = data[key]; if (undefined != value) { result = result.replaceAll("\\{" + key + "\\}", value); @@ -750,7 +754,7 @@ String.prototype.format = function(args) { function setCookie(key, value, time) { var expires = new Date(); if (!time) { - time = expires.getTime() + (24 * 60 * 60 * 1000); + time = expires.getTime() + (24 * 60 * 60 * 1000); } expires.setTime(time); document.cookie = key + '=' + value + ';expires=' + expires.toUTCString() + ';path=/'; @@ -767,7 +771,7 @@ function delCookie(key) { } function createPopover(dataset, title, callback) { - if (callback !== undefined){ + if (callback !== undefined) { var new_dataset = []; $.each(dataset, function (index, value) { new_dataset.push(callback(value)) @@ -780,12 +784,13 @@ function createPopover(dataset, title, callback) { } - $(function () { +$(function () { (function ($) { $.getUrlParam = function (name) { var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); var r = window.location.search.substr(1).match(reg); - if (r != null) return unescape(r[2]); return null; + if (r != null) return unescape(r[2]); + return null; } })(jQuery); }); @@ -793,12 +798,13 @@ function createPopover(dataset, title, callback) { function getUrlParam(name) { var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); var r = window.location.search.substr(1).match(reg); - if (r != null) return unescape(r[2]); return null; + if (r != null) return unescape(r[2]); + return null; } function setUrlParam(url, name, value) { var urlArray = url.split("?"); - if (urlArray.length===1){ + if (urlArray.length === 1) { url += "?" + name + "=" + value; } else { var oriParam = urlArray[1].split("&"); @@ -835,12 +841,11 @@ var rules_id_map_label = { 'id_security_password_special_char': gettext('Must contain special characters') }; -function getRuleLabel(rule){ +function getRuleLabel(rule) { var label = ''; - if (rule.key === rules_short_map_id['min']){ + if (rule.key === rules_short_map_id['min']) { label = rules_id_map_label[rule.key].replace('{N}', rule.value) - } - else{ + } else { label = rules_id_map_label[rule.key] } return label @@ -849,38 +854,33 @@ function getRuleLabel(rule){ // 校验密码-改变规则颜色 function checkPasswordRules(password, minLength) { if (wordMinLength(password, minLength)) { - $('#'+rules_short_map_id['min']).css('color', 'green') - } - else { - $('#'+rules_short_map_id['min']).css('color', '#908a8a') + $('#' + rules_short_map_id['min']).css('color', 'green') + } else { + $('#' + rules_short_map_id['min']).css('color', '#908a8a') } if (wordUpperCase(password)) { - $('#'+rules_short_map_id['upper']).css('color', 'green') - } - else { - $('#'+rules_short_map_id['upper']).css('color', '#908a8a') + $('#' + rules_short_map_id['upper']).css('color', 'green') + } else { + $('#' + rules_short_map_id['upper']).css('color', '#908a8a') } if (wordLowerCase(password)) { - $('#'+rules_short_map_id['lower']).css('color', 'green') - } - else { - $('#'+rules_short_map_id['lower']).css('color', '#908a8a') + $('#' + rules_short_map_id['lower']).css('color', 'green') + } else { + $('#' + rules_short_map_id['lower']).css('color', '#908a8a') } if (wordNumber(password)) { - $('#'+rules_short_map_id['number']).css('color', 'green') - } - else { - $('#'+rules_short_map_id['number']).css('color', '#908a8a') + $('#' + rules_short_map_id['number']).css('color', 'green') + } else { + $('#' + rules_short_map_id['number']).css('color', '#908a8a') } if (wordSpecialChar(password)) { - $('#'+rules_short_map_id['special']).css('color', 'green') - } - else { - $('#'+rules_short_map_id['special']).css('color', '#908a8a') + $('#' + rules_short_map_id['special']).css('color', 'green') + } else { + $('#' + rules_short_map_id['special']).css('color', '#908a8a') } } @@ -890,18 +890,22 @@ function wordMinLength(word, minLength) { var re = new RegExp("^(.{" + minLength + ",})$"); return word.match(re) } + // 大写字母 function wordUpperCase(word) { return word.match(/([A-Z]+)/) } + // 小写字母 function wordLowerCase(word) { return word.match(/([a-z]+)/) } + // 数字字符 function wordNumber(word) { return word.match(/([\d]+)/) } + // 特殊字符 function wordSpecialChar(word) { return word.match(/[`,~,!,@,#,\$,%,\^,&,\*,\(,\),\-,_,=,\+,\{,\},\[,\],\|,\\,;,',:,",\,,\.,<,>,\/,\?]+/) @@ -919,7 +923,7 @@ function popoverPasswordRules(password_check_rules, $el) { } // 初始化弹窗popover -function initPopover($container, $progress, $idPassword, $el, password_check_rules, i18n_fallback){ +function initPopover($container, $progress, $idPassword, $el, password_check_rules, i18n_fallback) { options = {}; // User Interface options.ui = { @@ -943,37 +947,6 @@ function initPopover($container, $progress, $idPassword, $el, password_check_rul popoverPasswordRules(password_check_rules, $el); } -// 解决input框中的资产和弹出表格中资产的显示不一致 -function initSelectedAssets2Table(id){ - if (!id) { - id = "#id_assets" - } - var inputAssets = $(id).val(); - var selectedAssets = asset_table2.selected.concat(); - - // input assets无,table assets选中,则取消勾选(再次click) - if (selectedAssets.length !== 0){ - $.each(selectedAssets, function (index, assetId){ - if ($.inArray(assetId, inputAssets) === -1){ - $('#'+assetId).trigger('click'); // 取消勾选 - } - }); - } - - // input assets有,table assets没选,则选中(click) - if (inputAssets !== null){ - asset_table2.selected = inputAssets; - $.each(inputAssets, function(index, assetId){ - var dom = document.getElementById(assetId); - if (dom !== null){ - var selected = dom.parentElement.parentElement.className.indexOf('selected') - } - if (selected === -1){ - $('#'+assetId).trigger('click'); - } - }); - } -} function rootNodeAddDom(ztree, callback) { @@ -1001,7 +974,7 @@ function APIExportData(props) { var params = props.params || {}; params['format'] = props.format; params['spm'] = data.spm; - for (var k in params){ + for (var k in params) { export_url = setUrlParam(export_url, k, params[k]) } window.open(export_url); @@ -1012,7 +985,7 @@ function APIExportData(props) { }) } -function APIImportData(props){ +function APIImportData(props) { props = props || {}; $.ajax({ url: props.url, @@ -1021,12 +994,12 @@ function APIImportData(props){ data: props.body, contentType: props.content_type || 'text/csv', success: function (data) { - if(props.method === 'POST'){ + if (props.method === 'POST') { $('#created_failed').html(''); $('#created_failed_detail').html(''); $('#success_created').html(gettext("Import Success")); $('#success_created_detail').html("Count" + ": " + data.length); - }else{ + } else { $('#updated_failed').html(''); $('#updated_failed_detail').html(''); $('#success_updated').html(gettext("Update Success")); @@ -1037,11 +1010,11 @@ function APIImportData(props){ }, error: function (error) { var data = error.responseJSON; - if (data instanceof Array){ + if (data instanceof Array) { var html = ''; var li = ''; var err = ''; - $.each(data, function (index, item){ + $.each(data, function (index, item) { err = ''; for (var prop in item) { err += prop + ": " + item[prop][0] + " " @@ -1052,16 +1025,15 @@ function APIImportData(props){ } }); html = "
    " + html + "
" - } - else { + } else { html = error.responseText } - if(props.method === 'POST'){ + if (props.method === 'POST') { $('#success_created').html(''); $('#success_created_detail').html(''); $('#created_failed').html(gettext("Import failed")); $('#created_failed_detail').html(html); - }else{ + } else { $('#success_updated').html(''); $('#success_updated_detail').html(''); $('#updated_failed').html(gettext("Update failed")); @@ -1072,7 +1044,7 @@ function APIImportData(props){ } -function htmlEscape ( d ) { +function htmlEscape(d) { return typeof d === 'string' ? d.replace(//g, '>').replace(/"/g, '"') : d; @@ -1080,10 +1052,9 @@ function htmlEscape ( d ) { function objectAttrsIsList(obj, attrs) { attrs.forEach(function (attr) { - if (!obj[attr]){ + if (!obj[attr]) { obj[attr] = [] - } - else if (obj[attr] && !(obj[attr] instanceof Array)){ + } else if (obj[attr] && !(obj[attr] instanceof Array)) { obj[attr] = [obj[attr]] } }) @@ -1106,8 +1077,8 @@ function objectAttrsIsBool(obj, attrs) { } function cleanDateStr(d) { - for (var i=0;i<3;i++) { - if (!isNaN(Date.parse(d))){ + for (var i = 0; i < 3; i++) { + if (!isNaN(Date.parse(d))) { return d; } if (!isNaN(Number(d))) { @@ -1144,7 +1115,7 @@ function toSafeLocalDateStr(d) { function getUrlParams(url) { url = url.split("?"); var params = ""; - if (url.length === 2){ + if (url.length === 2) { params = url[1]; } return params @@ -1166,7 +1137,7 @@ function getTimeUnits(u) { function timeOffset(a, b) { var start = safeDate(a); var end = safeDate(b); - var offset = (end - start)/1000; + var offset = (end - start) / 1000; var days = offset / 3600 / 24; var hours = offset / 3600; @@ -1191,7 +1162,7 @@ function readFile(ref) { if (hasFile) { var reader = new FileReader();//新建一个FileReader reader.readAsText(files[0], "UTF-8");//读取文件 - reader.onload = function(evt){ //读取完文件之后会回来这里 + reader.onload = function (evt) { //读取完文件之后会回来这里 ref.trigger("onload", evt.target.result); }; } else { @@ -1209,9 +1180,9 @@ function nodesSelect2Init(selector, url) { data: function (params) { var page = params.page || 1; var query = { - search: params.term, - offset: (page -1) * 10, - limit: 10 + search: params.term, + offset: (page - 1) * 10, + limit: 10 }; return query }, @@ -1220,7 +1191,7 @@ function nodesSelect2Init(selector, url) { return {id: v.id, text: v.full_value} }); var more = !!data.next; - return {results: results, pagination: {"more": more }} + return {results: results, pagination: {"more": more}} } }, }) From 1ba6fa65e0c911f9cd22f93eb77622400665942a Mon Sep 17 00:00:00 2001 From: ibuler Date: Thu, 12 Sep 2019 18:02:30 +0800 Subject: [PATCH 3/5] =?UTF-8?q?[Update]=20=E4=BF=AE=E6=94=B9=E7=BF=BB?= =?UTF-8?q?=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../templates/assets/_asset_list_modal.html | 1 - apps/locale/zh/LC_MESSAGES/django.mo | Bin 79722 -> 79372 bytes apps/locale/zh/LC_MESSAGES/django.po | 465 +++++++++--------- apps/static/js/jumpserver.js | 2 +- 4 files changed, 230 insertions(+), 238 deletions(-) diff --git a/apps/assets/templates/assets/_asset_list_modal.html b/apps/assets/templates/assets/_asset_list_modal.html index 5352776fc..06aa4a707 100644 --- a/apps/assets/templates/assets/_asset_list_modal.html +++ b/apps/assets/templates/assets/_asset_list_modal.html @@ -58,7 +58,6 @@