@c8y/ng1-modules 1023.88.4 → 1023.92.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1755,6 +1755,9 @@ msgstr "所有软件类型"
1755
1755
  msgid "All statuses"
1756
1756
  msgstr "所有状态"
1757
1757
 
1758
+ msgid "All time`interval option`"
1759
+ msgstr "全部歷來"
1760
+
1758
1761
  msgid "All types"
1759
1762
  msgstr "所有类型"
1760
1763
 
@@ -3127,6 +3130,9 @@ msgstr "居中"
3127
3130
  msgid "Certificate"
3128
3131
  msgstr "证书"
3129
3132
 
3133
+ msgid "Certificate (PEM)"
3134
+ msgstr "证书 (PEM)"
3135
+
3130
3136
  msgid "Certificate ID field"
3131
3137
  msgstr "证书 ID 字段"
3132
3138
 
@@ -4897,6 +4903,12 @@ msgstr "當前"
4897
4903
  msgid "Currently installed"
4898
4904
  msgstr "当前已安装"
4899
4905
 
4906
+ msgid "Currently saved certificate"
4907
+ msgstr "当前保存的证书"
4908
+
4909
+ msgid "Currently saved private key"
4910
+ msgstr "当前已保存的私钥"
4911
+
4900
4912
  msgid "Custom"
4901
4913
  msgstr "自定义"
4902
4914
 
@@ -6493,6 +6505,12 @@ msgstr "在表格儲存格周圍繪製邊框"
6493
6505
  msgid "Drop"
6494
6506
  msgstr "放置"
6495
6507
 
6508
+ msgid "Drop a new certificate to replace"
6509
+ msgstr "发行一张新证书以替换"
6510
+
6511
+ msgid "Drop a new private key to replace"
6512
+ msgstr "放置一個新的私钥以替换"
6513
+
6496
6514
  msgid "Drop file here"
6497
6515
  msgstr "将文件放在此处"
6498
6516
 
@@ -6505,6 +6523,12 @@ msgstr "将文件放在此处"
6505
6523
  msgid "Drop files here or click to browse"
6506
6524
  msgstr "將檔案放置在此處或按一下以瀏覽"
6507
6525
 
6526
+ msgid "Drop the certificate in PEM format."
6527
+ msgstr "請上傳 PEM 格式的证书。"
6528
+
6529
+ msgid "Drop the private key in PEM format."
6530
+ msgstr "請提供 PEM 格式的私钥。"
6531
+
6508
6532
  msgid "Due to the large number, only a subset of alarms are displayed. Use search to narrow down the number of results."
6509
6533
  msgstr "由於數量眾多,僅顯示報警的子集。請使用搜尋縮小結果數量。"
6510
6534
 
@@ -6781,6 +6805,9 @@ msgstr "啟用深色主題支援"
6781
6805
  msgid "Enable in-product information & communication"
6782
6806
  msgstr "啟用產品中資訊和通信"
6783
6807
 
6808
+ msgid "Enable mTLS authentication"
6809
+ msgstr "启用 mTLS 身份验证"
6810
+
6784
6811
  msgid "Enable message banner"
6785
6812
  msgstr "啟用消息橫幅"
6786
6813
 
@@ -8025,11 +8052,11 @@ msgstr "若要连接模拟设备,请在已安装 `\n"
8025
8052
  " <a href=\"https://github.com/thin-edge/tedge-demo-container\" target=\"_blank\" rel=\"noopener noreferrer\">tedge-demo-container</a>`。"
8026
8053
 
8027
8054
  msgid "For correct application behavior you can use only \"{{ host }}\" or \"{{\n"
8028
- " defaultRedirectUrl\n"
8029
- " }}\", the latter one is recommended."
8030
- msgstr "要獲得正確的應用程式列為,您只能使用 \"{{ host }}\" 或 \"{{\n"
8031
- " defaultRedirectUrl\n"
8032
- " }}\",建議使用後者。"
8055
+ " defaultRedirectUrl\n"
8056
+ " }}\", the latter one is recommended."
8057
+ msgstr "為確保应用程序能正確運作,您只能使用「{{ host }}」或「{{\n"
8058
+ " defaultRedirectUrl\n"
8059
+ " }}」,建議使用後者。"
8033
8060
 
8034
8061
  msgid "For details refer to the\n"
8035
8062
  " <a c8y-guide-href=\"/docs/standard-tenant/standard-tenant-introduction\">\n"
@@ -8935,6 +8962,9 @@ msgstr "隐藏详细信息"
8935
8962
  msgid "Hide devices"
8936
8963
  msgstr "隐藏设备"
8937
8964
 
8965
+ msgid "Hide in widget"
8966
+ msgstr "在小组件中隱藏"
8967
+
8938
8968
  msgid "Hide password"
8939
8969
  msgstr "隱藏密碼"
8940
8970
 
@@ -10292,11 +10322,21 @@ msgstr "主要警报"
10292
10322
  msgid "Major`alarm`"
10293
10323
  msgstr "主要"
10294
10324
 
10295
- msgid "Make sure that \"Valid Redirect URIs\" in the authorization server is set to \"{{ redirectURI }}\" or to the full URIs of the used applications if the authorization server does not support patterns."
10296
- msgstr "確保授權伺服器中的「有效重定向 URI」設定為 \"{{ redirectURI }}\" 或所使用應用程式的完整 URI (如果授權伺服器不支援模式)。"
10297
-
10298
- msgid "Make sure that \"Valid Redirect URIs\" in the authorization server is set to \"{{ redirectURI }}\"."
10299
- msgstr "確認授權伺服器中的「有效重定向 URI」設定為 \"{{ redirectURI }}\"。"
10325
+ msgid "Make sure that \"Valid Redirect URIs\" in the authorization server is set to \"{{\n"
10326
+ " redirectURI\n"
10327
+ " }}\" or to the full URIs of the used applications if the authorization server\n"
10328
+ " does not support patterns."
10329
+ msgstr "请确保授权服务器中的「有效重定向 URI」已设置为「{{\n"
10330
+ " redirectURI\n"
10331
+ " }}」,或若授权服务器\n"
10332
+ " 不支援模式,则应设置为所使用的应用程序的完整 URI。"
10333
+
10334
+ msgid "Make sure that \"Valid Redirect URIs\" in the authorization server is set to \"{{\n"
10335
+ " redirectURI\n"
10336
+ " }}\"."
10337
+ msgstr "請確認授權伺服器中的「有效重定向 URI」已設定為「{{\n"
10338
+ " redirectURI\n"
10339
+ " }}」。"
10300
10340
 
10301
10341
  msgid "Make sure that:"
10302
10342
  msgstr "確保:"
@@ -11295,6 +11335,9 @@ msgstr "沒有可供顯示的數據。"
11295
11335
  msgid "No date filter"
11296
11336
  msgstr "無日期篩選器"
11297
11337
 
11338
+ msgid "No date filter applied — every record is returned regardless of when it occurred."
11339
+ msgstr "未应用日期篩选条件 — 无论发生时间如何,所有记录都会被回传。"
11340
+
11298
11341
  msgid "No delegation"
11299
11342
  msgstr "无委托"
11300
11343
 
@@ -13089,9 +13132,15 @@ msgstr "面板的打印屏幕"
13089
13132
  msgid "Private key"
13090
13133
  msgstr "私钥"
13091
13134
 
13135
+ msgid "Private key (PEM)"
13136
+ msgstr "私钥 (PEM)"
13137
+
13092
13138
  msgid "Private key cipher does not match"
13093
13139
  msgstr "私钥密码不匹配"
13094
13140
 
13141
+ msgid "Private key matching the client certificate, in PEM format (PKCS#8). The platform encrypts the key at rest after the first save and will return only an encrypted value on subsequent loads. Accepted file extensions: .pem, .key."
13142
+ msgstr "與客戶端证书相符的私钥,格式為 PEM(PKCS#8)。平台會在首次保存後對靜態私钥進行加密,並在後續加载時僅返回加密後的值。可接受的檔案副檔名:.pem、.key。"
13143
+
13095
13144
  msgid "Private key must be provided when \"Public/private keys\" option is selected."
13096
13145
  msgstr "选择 \"公钥/私钥\" 选项时,必须提供私钥。"
13097
13146
 
@@ -13230,6 +13279,9 @@ msgstr "提供的憑證"
13230
13279
  msgid "Provisioned certificates removed from user object: \"{{ userName }}\""
13231
13280
  msgstr "已從使用者物件移除預先配置的憑證:\"{{ userName }}\""
13232
13281
 
13282
+ msgid "Public X.509 client certificate in PEM format, issued for this tenant by a CA trusted by your authorization server. Accepted file extension: .pem."
13283
+ msgstr "由您的授權伺服器所信任的憑證授權機構(CA)為此租戶簽發的、採用 PEM 格式的公開 X.509 客戶端憑證。接受的檔案副檔名:.pem。"
13284
+
13233
13285
  msgid "Public key"
13234
13286
  msgstr "公钥"
13235
13287
 
@@ -15864,9 +15916,6 @@ msgstr "顯示符合以下条件的复选框:"
15864
15916
  msgid "Show cleared alarms"
15865
15917
  msgstr "顯示清除的警报"
15866
15918
 
15867
- msgid "Show controls directly in the widget view for easier access."
15868
- msgstr "將控制項直接顯示在小组件視圖中,以便於存取。"
15869
-
15870
15919
  msgid "Show data point"
15871
15920
  msgstr "顯示資料點"
15872
15921
 
@@ -15915,9 +15964,6 @@ msgstr "顯示於圖例"
15915
15964
  msgid "Show in navigator"
15916
15965
  msgstr "顯示在导航器中"
15917
15966
 
15918
- msgid "Show in widget"
15919
- msgstr "顯示於小工具中"
15920
-
15921
15967
  msgid "Show items registered`between dates`"
15922
15968
  msgstr "將項顯示為已註冊"
15923
15969
 
@@ -17407,6 +17453,12 @@ msgstr "预览显示来自单一来源的原始文件结构。"
17407
17453
  msgid "The preview shows the structure of the raw file from all sources."
17408
17454
  msgstr "预览画面显示了来自全部来源的原始文件结构。"
17409
17455
 
17456
+ msgid "The private key is encrypted for security reasons."
17457
+ msgstr "基於安全考量,私钥已進行加密。"
17458
+
17459
+ msgid "The private key will be encrypted on the server after saving."
17460
+ msgstr "私钥在保存後將於伺服器上進行加密。"
17461
+
17410
17462
  msgid "The provided name is already taken."
17411
17463
  msgstr "提供的名稱已被使用。"
17412
17464
 
@@ -17517,9 +17569,6 @@ msgstr "阈值不能小于 1%。"
17517
17569
  msgid "The time context can be configured in the widget view mode."
17518
17570
  msgstr "時間上下文可在小工具檢視模式中進行設定。"
17519
17571
 
17520
- msgid "The time context can only get changed in the configuration."
17521
- msgstr "時間上下文只能在設定檔中進行變更。"
17522
-
17523
17572
  msgid "The update method is determined by the widget type. Some widgets support real-time updates via WebSocket connection, while others use periodic refreshes."
17524
17573
  msgstr "更新方式取決於小工具類型。部分小工具支援透過 WebSocket 連線進行即時更新,而其他小工具則採用定期刷新機制。"
17525
17574
 
@@ -18742,6 +18791,9 @@ msgstr "使用 * 以允许任意值。"
18742
18791
  msgid "Use [Enter] or <br> tag to add a new line"
18743
18792
  msgstr "使用 [Enter] 或 <br> 標籤添加新行"
18744
18793
 
18794
+ msgid "Use a client certificate (mTLS) instead of a client secret to authenticate the platform with the authorization server. Use this option only if the authorization server enforces certificate-based client authentication."
18795
+ msgstr "请使用客户端证书(mTLS)而非客户端密码,来让平台向授权伺服器进行身份验证。仅当授权伺服器强制执行基于证书的客户端身份验证时,才应使用此选项。"
18796
+
18745
18797
  msgid "Use alarms to create smart rules for microservice availability."
18746
18798
  msgstr "使用警报为微服务可用性创建智能规则。"
18747
18799
 
@@ -21345,6 +21397,9 @@ msgstr "{{hours}} 小時 1 分鐘"
21345
21397
  msgid "{{hours}} hours {{minutes}} minutes"
21346
21398
  msgstr "{{hours}} 小時 {{minutes}} 分鐘"
21347
21399
 
21400
+ msgid "{{interval}}, {{aggregation}}"
21401
+ msgstr "{{interval}}, {{aggregation}}"
21402
+
21348
21403
  msgid "{{minutes}} minutes"
21349
21404
  msgstr "{{minutes}} 分鐘"
21350
21405
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@c8y/ng1-modules",
3
- "version": "1023.88.4",
3
+ "version": "1023.92.0",
4
4
  "license": "Apache-2.0",
5
5
  "author": "Cumulocity",
6
6
  "description": "AngularJS modules for Cumulocity IoT applications.",
@@ -1 +1 @@
1
- (()=>{function e(s,n,o,r,t,e,i,u,a,l,c,g){var f,d=this;function h(e){return f=e?[]:d.users,d.users=[],o.list((e=_.get(d.filters,"text"),n=(n=_.map(_.get(d.filters,"globalRoles"),"id")).length?n.join(","):void 0,{withSubusersCount:!0,username:e,groups:n,withApps:!1,withGroups:!1,withRoles:!1,onlyRoots:_.isEmpty(e)})).then(p);var n}function p(e){E(e),d.users.paging=e.paging}function E(e){var n=d.users,t=n.paging,r=o.getTfaStrategy();_.forEach(e,function(t){var e=_.find(f,{id:t.id});t.twoFactorAuthenticationEnabled||s.all({enforced:o.isTfaActive(t),strategy:r}).then(function(e){var n=e.enforced,e=e.strategy;"SMS"!==e&&e||n&&(t.twoFactorAuthenticationEnabled=n)}),e&&(t._expanded=e._expanded),_.some(n,{id:t.id})||(n=n.concat([t]))}),n.paging=t,d.users=n}function R(e){d.globalRoles=e}function A(e){return e._globalRoles=_.map(_.get(e,"groups.references"),function(e){return _.find(d.globalRoles,{id:e.group.id})}),e}function U(){o.current().then(function(e){d.canAddUser=o.hasRole(e,"ROLE_USER_MANAGEMENT_ADMIN")||d.FEATURE_USER_HIERARCHY&&o.hasRole(e,"ROLE_USER_MANAGEMENT_CREATE"),d.canRevokeTokens=o.hasRole(e,"ROLE_USER_MANAGEMENT_ADMIN")})}function v(e){return f=d.users,o.listAll({owner:e.id,withSubusersCount:!0}).then(E)}_.assign(d,{ROUTE_NEW_USER:t.ROUTE_NEW_USER,$onInit:function(){s.all([h(),e.global.list({pageSize:1e4}).then(R)]).then(function(){return _.forEach(d.users,A)}),t.userHierarchyActive().then(function(e){d.FEATURE_USER_HIERARCHY=e}).then(U)},loadMore:function(){d.users.paging.loading=!0,d.users.paging.next().then(p).finally(function(){d.users.paging.loading=!1})},loadUsers:h,loadSubusers:v,changeUser:function(s,e){var n="changeGlobalRoles"===e.name;return t.warnAboutUserLogOutIfNeeded(s,{rolesChanged:n}).then(function(){return t.changeUser(s,e)}).then(function(e){var n,t,r=s;return(e=e||{}).removeUser&&(d.users=_.reject(d.users,{id:r.id}),t=_.get(r,"_owner.id"),d.users=_.map(d.users,function(e){return t&&t===e.id?(e.subusersCount--,angular.copy(e)):e})),e.refresh||e.removeUser||(n=o.list({username:r.id,withSubusersCount:!0}).then(_.first).then(function(t){var r=t.id,e=_.map(d.users,function(e){var n=r===e.id;return n&&(t._expanded=e._expanded),n?A(t):e});_.assign(e,_.pick(d.users,["statistics","paging"])),d.users=e})),n=e.refresh?h():n})},showExpandCollapse:function(){return d.FEATURE_USER_HIERARCHY&&_.some(d.users,function(e){return 0<e.subusersCount||_.get(e,"_owns.length")})},collapseAll:function(){t.collapseAll(d.users)},expandAll:function(){t.expandAll(d.users),s.all(_.map(d.users,function(e){return e.subusersCount>e._owns.length?v(e).then(function(){return!0}):s.resolve(!1)})).then(function(e){_.some(e)&&n(d.expandAll)})},filters:{},applyFilters:function(){h(!0)},clearFilters:function(){d.filters={},h(!0)},isAnyFilterSelected:function(){return _.some(d.filters,_.identity)},refresh:function(){return h(!0).then(function(){return _.forEach(d.users,A)})},revokeTokens:function(){function e(){return o.current().then(function(e){return t(e)}).then(function(e){return e?r.logoutAndReloadPage():s.resolve()})}var n=g.get("c8yAuthBridgeService").getPreferredLoginOption(),t=function(e){return!(!o.hasExternalOrigin(e)&&"BASIC"===n.type)};i({title:l("Confirm log out all users?"),body:c.getString('You are about to log out all users currently logged with "OAI-Secure" or "Single sign-on redirect". The JWT tokens retrieved by all devices in the current tenant will also be invalidated. Do you want to proceed?'),status:"warning",size:"sm",labels:{ok:l("Confirm")}}).then(function(){return o.revokeTokens()}).then(e).then(function(){return u.success(l("Logged out all users and invalidated tokens."))}).catch(function(e){e&&u.danger(a.getResErrorMessage(e))})}})}e.$inject=["$q","$timeout","c8yUser","c8yUserUtil","c8yUsersUi","c8yRoles","c8yModal","c8yAlert","c8yBase","gettext","gettextCatalog","$injector"],angular.module("c8y.users").component("c8yUserListView",{templateUrl:":::PLUGIN_PATH:::/userListView/userListView.html",controller:e,controllerAs:"vm"})})();
1
+ (()=>{function e(s,t,n,o,r,i,e,u,l,a,c,g,f){var d,h=this,p=(_.assign(h,{ROUTE_NEW_USER:i.ROUTE_NEW_USER,$onInit:function(){s.all([E(),e.global.list({pageSize:1e4}).then(v)]).then(function(){return _.forEach(h.users,y)}),i.userHierarchyActive().then(function(e){h.FEATURE_USER_HIERARCHY=e}).then(U),t.$watch("vm.filters.text",function(e,n){e!==n&&(h.showSearchHint=e&&0<e.length&&e.length<3,!e||3<=e.length?p(!0):n&&3<=n.length&&p(!0,!0))})},loadMore:function(){h.users.paging.loading=!0,h.users.paging.next().then(R).finally(function(){h.users.paging.loading=!1})},loadUsers:E,loadSubusers:S,changeUser:function(s,e){var n="changeGlobalRoles"===e.name;return i.warnAboutUserLogOutIfNeeded(s,{rolesChanged:n}).then(function(){return i.changeUser(s,e)}).then(function(e){var n,t,r=s;return(e=e||{}).removeUser&&(h.users=_.reject(h.users,{id:r.id}),t=_.get(r,"_owner.id"),h.users=_.map(h.users,function(e){return t&&t===e.id?(e.subusersCount--,angular.copy(e)):e})),e.refresh||e.removeUser||(n=o.list({username:r.id,withSubusersCount:!0}).then(_.first).then(function(t){var r=t.id,e=_.map(h.users,function(e){var n=r===e.id;return n&&(t._expanded=e._expanded),n?y(t):e});_.assign(e,_.pick(h.users,["statistics","paging"])),h.users=e})),n=e.refresh?E():n})},showExpandCollapse:function(){return h.FEATURE_USER_HIERARCHY&&_.some(h.users,function(e){return 0<e.subusersCount||_.get(e,"_owns.length")})},collapseAll:function(){i.collapseAll(h.users)},expandAll:function(){i.expandAll(h.users),s.all(_.map(h.users,function(e){return e.subusersCount>e._owns.length?S(e).then(function(){return!0}):s.resolve(!1)})).then(function(e){_.some(e)&&n(h.expandAll)})},filters:{},applyFilters:function(){E(!0)},clearFilters:function(){h.filters.globalRoles=[],E(!0)},isAnyFilterSelected:function(){return 0<_.get(h.filters,"globalRoles.length",0)},refresh:function(){return E(!0).then(function(){return _.forEach(h.users,y)})},revokeTokens:function(){function e(){return o.current().then(function(e){return t(e)}).then(function(e){return e?r.logoutAndReloadPage():s.resolve()})}var n=f.get("c8yAuthBridgeService").getPreferredLoginOption(),t=function(e){return!(!o.hasExternalOrigin(e)&&"BASIC"===n.type)};u({title:c("Confirm log out all users?"),body:g.getString('You are about to log out all users currently logged with "OAI-Secure" or "Single sign-on redirect". The JWT tokens retrieved by all devices in the current tenant will also be invalidated. Do you want to proceed?'),status:"warning",size:"sm",labels:{ok:c("Confirm")}}).then(function(){return o.revokeTokens()}).then(e).then(function(){return l.success(c("Logged out all users and invalidated tokens."))}).catch(function(e){e&&l.danger(a.getResErrorMessage(e))})},onSearchKeydown:function(e){"Enter"===e.key&&(e.preventDefault(),p.cancel(),E(!0))},clearSearch:function(){h.filters.text="",p.cancel(),E(!0)}}),_.debounce(function(e,n){E(e,n),t.$applyAsync()},300));function E(e){var n=1<arguments.length&&void 0!==arguments[1]&&arguments[1];return d=e?[]:h.users,h.users=[],o.list(n?{}:(e=_.get(h.filters,"text"),n=(n=_.map(_.get(h.filters,"globalRoles"),"id")).length?n.join(","):void 0,{withSubusersCount:!0,usernameContains:e,groups:n,withApps:!1,withGroups:!1,withRoles:!1,onlyRoots:_.isEmpty(e)})).then(R)}function R(e){A(e),h.users.paging=e.paging}function A(e){var n=h.users,t=n.paging,r=o.getTfaStrategy();_.forEach(e,function(t){var e=_.find(d,{id:t.id});t.twoFactorAuthenticationEnabled||s.all({enforced:o.isTfaActive(t),strategy:r}).then(function(e){var n=e.enforced,e=e.strategy;"SMS"!==e&&e||n&&(t.twoFactorAuthenticationEnabled=n)}),e&&(t._expanded=e._expanded),_.some(n,{id:t.id})||(n=n.concat([t]))}),n.paging=t,h.users=n}function v(e){h.globalRoles=e}function y(e){return e._globalRoles=_.map(_.get(e,"groups.references"),function(e){return _.find(h.globalRoles,{id:e.group.id})}),e}function U(){o.current().then(function(e){h.canAddUser=o.hasRole(e,"ROLE_USER_MANAGEMENT_ADMIN")||h.FEATURE_USER_HIERARCHY&&o.hasRole(e,"ROLE_USER_MANAGEMENT_CREATE"),h.canRevokeTokens=o.hasRole(e,"ROLE_USER_MANAGEMENT_ADMIN")})}function S(e){return d=h.users,o.listAll({owner:e.id,withSubusersCount:!0}).then(A)}}e.$inject=["$q","$scope","$timeout","c8yUser","c8yUserUtil","c8yUsersUi","c8yRoles","c8yModal","c8yAlert","c8yBase","gettext","gettextCatalog","$injector"],angular.module("c8y.users").component("c8yUserListView",{templateUrl:":::PLUGIN_PATH:::/userListView/userListView.html",controller:e,controllerAs:"vm"})})();
@@ -21,21 +21,40 @@
21
21
  <div class="input-group input-group-search">
22
22
  <input
23
23
  class="form-control"
24
- title="{{ 'Filter users' | translate }}"
24
+ title="{{ 'Search users' | translate }}"
25
25
  id="Filter"
26
- placeholder="{{ 'Filter users' | translate }}"
26
+ placeholder="{{ 'Search users' | translate }}"
27
27
  type="search"
28
28
  ng-model="vm.filters.text"
29
+ ng-keydown="vm.onSearchKeydown($event)"
29
30
  />
30
- <span class="input-group-addon">
31
+ <span
32
+ class="input-group-addon"
33
+ ng-if="!vm.filters.text"
34
+ >
31
35
  <i c8y-icon="search"></i>
32
36
  </span>
37
+ <span
38
+ class="input-group-addon clickable"
39
+ title="{{ 'Clear search' | translate }}"
40
+ ng-if="vm.filters.text && !vm.showSearchHint"
41
+ ng-click="vm.clearSearch()"
42
+ >
43
+ <i c8y-icon="times"></i>
44
+ </span>
45
+ <span
46
+ class="input-group-addon text-warning"
47
+ title="{{ 'Enter at least 3 characters to search.' | translate }}"
48
+ ng-if="vm.showSearchHint"
49
+ >
50
+ <i c8y-icon="exclamation-circle"></i>
51
+ </span>
33
52
  <span
34
53
  class="sr-only"
35
54
  for="Filter"
36
55
  translate
37
56
  >
38
- Filter users
57
+ Search users
39
58
  </span>
40
59
  </div>
41
60
  </div>
@@ -57,7 +76,6 @@
57
76
  title="{{ 'Apply filters' | translate }}"
58
77
  type="button"
59
78
  ng-click="vm.applyFilters()"
60
- c8y-key-shortcut="Enter"
61
79
  >
62
80
  <i c8y-icon="filter"></i>
63
81
  <span
@@ -86,32 +104,6 @@
86
104
  </form>
87
105
  </li>
88
106
 
89
- <li>
90
- <button
91
- class="btn btn-link hidden-sm"
92
- title="{{ 'Expand all' | translate }}"
93
- type="button"
94
- ng-click="vm.expandAll()"
95
- ng-show="vm.showExpandCollapse()"
96
- >
97
- <i c8y-icon="window-maximize"></i>
98
- {{ 'Expand all' | translate }}
99
- </button>
100
- </li>
101
-
102
- <li>
103
- <button
104
- class="btn btn-link hidden-sm"
105
- title="{{ 'Collapse all' | translate }}"
106
- type="button"
107
- ng-click="vm.collapseAll()"
108
- ng-show="vm.showExpandCollapse()"
109
- >
110
- <i c8y-icon="minus"></i>
111
- {{ 'Collapse all' | translate }}
112
- </button>
113
- </li>
114
-
115
107
  <li
116
108
  title="{{ 'Add user' | translate }}"
117
109
  ng-show="vm.canAddUser"
@@ -129,19 +121,6 @@
129
121
  </a>
130
122
  </li>
131
123
 
132
- <li ng-show="vm.canRevokeTokens">
133
- <button
134
- class="btn btn-link"
135
- title="{{ 'Log out all users' | translate }}"
136
- type="button"
137
- data-cy="c8y-users--log-out-all-users"
138
- ng-click="vm.revokeTokens()"
139
- >
140
- <i c8y-icon="account-disable"></i>
141
- {{ 'Log out all users' | translate }}
142
- </button>
143
- </li>
144
-
145
124
  <li>
146
125
  <button
147
126
  class="btn btn-link"
@@ -153,6 +132,68 @@
153
132
  {{ 'Reload' | translate }}
154
133
  </button>
155
134
  </li>
135
+
136
+ <li ng-show="vm.showExpandCollapse() || vm.canRevokeTokens">
137
+ <div
138
+ class="dropdown"
139
+ uib-dropdown
140
+ >
141
+ <button
142
+ class="dropdown-toggle c8y-dropdown d-flex a-i-center"
143
+ title="{{ 'More' | translate }}…"
144
+ aria-haspopup="true"
145
+ type="button"
146
+ uib-dropdown-toggle
147
+ >
148
+ <span
149
+ class="text-truncate"
150
+ translate
151
+ >More…</span
152
+ >
153
+ <i c8y-icon="caret-down"></i>
154
+ </button>
155
+ <ul
156
+ class="dropdown-menu dropdown-menu-right"
157
+ uib-dropdown-menu
158
+ >
159
+ <li>
160
+ <button
161
+ class="btn btn-link hidden-sm"
162
+ title="{{ 'Expand all' | translate }}"
163
+ type="button"
164
+ ng-click="vm.expandAll()"
165
+ ng-show="vm.showExpandCollapse()"
166
+ >
167
+ <i c8y-icon="window-maximize"></i>
168
+ {{ 'Expand all' | translate }}
169
+ </button>
170
+ </li>
171
+ <li>
172
+ <button
173
+ class="btn btn-link hidden-sm"
174
+ title="{{ 'Collapse all' | translate }}"
175
+ type="button"
176
+ ng-click="vm.collapseAll()"
177
+ ng-show="vm.showExpandCollapse()"
178
+ >
179
+ <i c8y-icon="minus"></i>
180
+ {{ 'Collapse all' | translate }}
181
+ </button>
182
+ </li>
183
+ <li ng-show="vm.canRevokeTokens">
184
+ <button
185
+ title="{{ 'Log out all users' | translate }}"
186
+ type="button"
187
+ data-cy="c8y-users--log-out-all-users"
188
+ ng-click="vm.revokeTokens()"
189
+ >
190
+ <i c8y-icon="account-disable"></i>
191
+ {{ 'Log out all users' | translate }}
192
+ </button>
193
+ </li>
194
+ </ul>
195
+ </div>
196
+ </li>
156
197
  </c8y-ui-action-bar-set>
157
198
 
158
199
  <c8y-help src="/docs/standard-tenant/managing-users/#managing-users"></c8y-help>