1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00
Signed-off-by: Roman <ixrock@gmail.com>
This commit is contained in:
Roman 2020-08-26 20:11:31 +03:00
parent bec50de6a6
commit 56d1806619
11 changed files with 542 additions and 194 deletions

View File

@ -87,8 +87,8 @@ msgstr "Account Name"
msgid "Active" msgid "Active"
msgstr "Active" msgstr "Active"
#: src/renderer/components/+add-cluster/add-cluster.tsx:248 #: src/renderer/components/+add-cluster/add-cluster.tsx:303
#: src/renderer/components/cluster-manager/clusters-menu.tsx:116 #: src/renderer/components/cluster-manager/clusters-menu.tsx:118
msgid "Add Cluster" msgid "Add Cluster"
msgstr "Add Cluster" msgstr "Add Cluster"
@ -112,7 +112,7 @@ msgstr "Add bindings to {name}"
#~ msgid "Add cluster" #~ msgid "Add cluster"
#~ msgstr "Add cluster" #~ msgstr "Add cluster"
#: src/renderer/components/+add-cluster/add-cluster.tsx:266 #: src/renderer/components/+add-cluster/add-cluster.tsx:320
msgid "Add cluster(s)" msgid "Add cluster(s)"
msgstr "Add cluster(s)" msgstr "Add cluster(s)"
@ -132,6 +132,10 @@ msgstr "Add field"
#~ msgid "Added repos:" #~ msgid "Added repos:"
#~ msgstr "Added repos:" #~ msgstr "Added repos:"
#: src/renderer/components/+add-cluster/add-cluster.tsx:244
#~ msgid "Adding clusters: <0>{0}</0>"
#~ msgstr "Adding clusters: <0>{0}</0>"
#: src/renderer/components/+preferences/preferences.tsx:103 #: src/renderer/components/+preferences/preferences.tsx:103
msgid "Adding helm branch <0>{0}</0> has failed: {1}" msgid "Adding helm branch <0>{0}</0> has failed: {1}"
msgstr "Adding helm branch <0>{0}</0> has failed: {1}" msgstr "Adding helm branch <0>{0}</0> has failed: {1}"
@ -289,7 +293,7 @@ msgstr "Are you sure you want to drain <0>{nodeName}</0>?"
msgid "Arguments" msgid "Arguments"
msgstr "Arguments" msgstr "Arguments"
#: src/renderer/components/cluster-manager/clusters-menu.tsx:106 #: src/renderer/components/cluster-manager/clusters-menu.tsx:108
msgid "Associate clusters and choose the ones you want to access via quick launch menu by clicking the + button." msgid "Associate clusters and choose the ones you want to access via quick launch menu by clicking the + button."
msgstr "Associate clusters and choose the ones you want to access via quick launch menu by clicking the + button." msgstr "Associate clusters and choose the ones you want to access via quick launch menu by clicking the + button."
@ -319,7 +323,7 @@ msgstr "Binding targets"
msgid "Bindings" msgid "Bindings"
msgstr "Bindings" msgstr "Bindings"
#: src/renderer/components/+add-cluster/add-cluster.tsx:227 #: src/renderer/components/+add-cluster/add-cluster.tsx:251
msgid "Browse" msgid "Browse"
msgstr "Browse" msgstr "Browse"
@ -600,6 +604,14 @@ msgstr "Containers"
msgid "Context" msgid "Context"
msgstr "Context" msgstr "Context"
#: src/renderer/components/+add-cluster/add-cluster.tsx:244
#~ msgid "Contexts: <0>{0}</0>"
#~ msgstr "Contexts: <0>{0}</0>"
#: src/renderer/components/+add-cluster/add-cluster.tsx:249
#~ msgid "Contexts: {0}"
#~ msgstr "Contexts: {0}"
#: src/renderer/components/+workloads-pods/pods.tsx:79 #: src/renderer/components/+workloads-pods/pods.tsx:79
#: src/renderer/components/kube-object/kube-object-meta.tsx:39 #: src/renderer/components/kube-object/kube-object-meta.tsx:39
msgid "Controlled By" msgid "Controlled By"
@ -903,6 +915,10 @@ msgstr "Environment"
msgid "Error stack" msgid "Error stack"
msgstr "Error stack" msgstr "Error stack"
#: src/renderer/components/+add-cluster/add-cluster.tsx:129
msgid "Error while adding cluster(s): {0}"
msgstr "Error while adding cluster(s): {0}"
#: src/renderer/components/+events/events.tsx:56 #: src/renderer/components/+events/events.tsx:56
#: src/renderer/components/+events/kube-event-details.tsx:34 #: src/renderer/components/+events/kube-event-details.tsx:34
#: src/renderer/components/+events/kube-event-details.tsx:39 #: src/renderer/components/+events/kube-event-details.tsx:39
@ -1730,7 +1746,7 @@ msgstr "Parallelism"
msgid "Parameters" msgid "Parameters"
msgstr "Parameters" msgstr "Parameters"
#: src/renderer/components/+add-cluster/add-cluster.tsx:222 #: src/renderer/components/+add-cluster/add-cluster.tsx:245
msgid "Paste as text" msgid "Paste as text"
msgstr "Paste as text" msgstr "Paste as text"
@ -1754,9 +1770,17 @@ msgstr "Persistent Volume Claims"
msgid "Persistent Volumes" msgid "Persistent Volumes"
msgstr "Persistent Volumes" msgstr "Persistent Volumes"
#: src/renderer/components/+add-cluster/add-cluster.tsx:95
msgid "Please select at least one cluster context"
msgstr "Please select at least one cluster context"
#: src/renderer/components/+add-cluster/add-cluster.tsx:146
#~ msgid "Please select at least one context to add a cluster"
#~ msgstr "Please select at least one context to add a cluster"
#: src/renderer/components/+add-cluster/add-cluster.tsx:106 #: src/renderer/components/+add-cluster/add-cluster.tsx:106
msgid "Please select kube-config's context" #~ msgid "Please select kube-config's context"
msgstr "Please select kube-config's context" #~ msgstr "Please select kube-config's context"
#: src/renderer/components/+add-cluster/add-cluster.tsx:63 #: src/renderer/components/+add-cluster/add-cluster.tsx:63
#~ msgid "Please select kubeconfig" #~ msgid "Please select kubeconfig"
@ -1766,6 +1790,10 @@ msgstr "Please select kube-config's context"
#~ msgid "Please select kubeconfig context" #~ msgid "Please select kubeconfig context"
#~ msgstr "Please select kubeconfig context" #~ msgstr "Please select kubeconfig context"
#: src/renderer/components/+add-cluster/add-cluster.tsx:106
#~ msgid "Please select kubeconfig's context"
#~ msgstr "Please select kubeconfig's context"
#: src/renderer/components/+workloads-pods/pod-menu.tsx:50 #: src/renderer/components/+workloads-pods/pod-menu.tsx:50
msgid "Pod" msgid "Pod"
msgstr "Pod" msgstr "Pod"
@ -1851,13 +1879,33 @@ msgstr "Private Key Secret"
msgid "Privileged" msgid "Privileged"
msgstr "Privileged" msgstr "Privileged"
#: src/renderer/components/+add-cluster/add-cluster.tsx:264
#~ msgid "Pro-Tip: paste kubeconfig (text/yaml) to get available contexts"
#~ msgstr "Pro-Tip: paste kubeconfig (text/yaml) to get available contexts"
#: src/renderer/components/+add-cluster/add-cluster.tsx:264
#~ msgid "Pro-Tip: paste kubeconfig to collect available contexts"
#~ msgstr "Pro-Tip: paste kubeconfig to collect available contexts"
#: src/renderer/components/+add-cluster/add-cluster.tsx:263
msgid "Pro-Tip: paste kubeconfig to get available contexts"
msgstr "Pro-Tip: paste kubeconfig to get available contexts"
#: src/renderer/components/+add-cluster/add-cluster.tsx:264
#~ msgid "Pro-Tip: paste kubeconfig to parse available contexts"
#~ msgstr "Pro-Tip: paste kubeconfig to parse available contexts"
#: src/renderer/components/+add-cluster/add-cluster.tsx:254
msgid "Pro-Tip: you can also drag-n-drop kubeconfig file to this area"
msgstr "Pro-Tip: you can also drag-n-drop kubeconfig file to this area"
#: src/renderer/components/+add-cluster/add-cluster.tsx:225 #: src/renderer/components/+add-cluster/add-cluster.tsx:225
#~ msgid "Pro-tip: you can also drag-n-drop kube-config file in the left-side area" #~ msgid "Pro-tip: you can also drag-n-drop kube-config file in the left-side area"
#~ msgstr "Pro-tip: you can also drag-n-drop kube-config file in the left-side area" #~ msgstr "Pro-tip: you can also drag-n-drop kube-config file in the left-side area"
#: src/renderer/components/+add-cluster/add-cluster.tsx:229 #: src/renderer/components/+add-cluster/add-cluster.tsx:229
msgid "Pro-tip: you can also drag-n-drop kube-config file to this area" #~ msgid "Pro-tip: you can also drag-n-drop kube-config file to this area"
msgstr "Pro-tip: you can also drag-n-drop kube-config file to this area" #~ msgstr "Pro-tip: you can also drag-n-drop kube-config file to this area"
#: src/renderer/components/+storage-classes/storage-class-details.tsx:28 #: src/renderer/components/+storage-classes/storage-class-details.tsx:28
#: src/renderer/components/+storage-classes/storage-classes.tsx:35 #: src/renderer/components/+storage-classes/storage-classes.tsx:35
@ -1868,7 +1916,7 @@ msgstr "Provisioner"
msgid "Proxy is used only for non-cluster communication." msgid "Proxy is used only for non-cluster communication."
msgstr "Proxy is used only for non-cluster communication." msgstr "Proxy is used only for non-cluster communication."
#: src/renderer/components/+add-cluster/add-cluster.tsx:254 #: src/renderer/components/+add-cluster/add-cluster.tsx:308
msgid "Proxy settings" msgid "Proxy settings"
msgstr "Proxy settings" msgstr "Proxy settings"
@ -2049,7 +2097,7 @@ msgstr "Required Drop Capabilities"
msgid "Required field" msgid "Required field"
msgstr "Required field" msgstr "Required field"
#: src/renderer/components/+add-cluster/add-cluster.tsx:226 #: src/renderer/components/+add-cluster/add-cluster.tsx:250
#: src/renderer/components/item-object-list/page-filters-list.tsx:31 #: src/renderer/components/item-object-list/page-filters-list.tsx:31
msgid "Reset" msgid "Reset"
msgstr "Reset" msgstr "Reset"
@ -2059,8 +2107,8 @@ msgid "Reset filters?"
msgstr "Reset filters?" msgstr "Reset filters?"
#: src/renderer/components/+add-cluster/add-cluster.tsx:65 #: src/renderer/components/+add-cluster/add-cluster.tsx:65
msgid "Resetting config to {0}" #~ msgid "Resetting config to {0}"
msgstr "Resetting config to {0}" #~ msgstr "Resetting config to {0}"
#: src/renderer/components/+add-cluster/add-cluster.tsx:68 #: src/renderer/components/+add-cluster/add-cluster.tsx:68
#~ msgid "Resetting kube-config to current {0}" #~ msgid "Resetting kube-config to current {0}"
@ -2265,9 +2313,9 @@ msgstr "Secret type"
msgid "Secrets" msgid "Secrets"
msgstr "Secrets" msgstr "Secrets"
#: src/renderer/components/+add-cluster/add-cluster.tsx:251 #: src/renderer/components/+add-cluster/add-cluster.tsx:253
msgid "Select a context" #~ msgid "Select a context"
msgstr "Select a context" #~ msgstr "Select a context"
#: src/renderer/components/+config-resource-quotas/add-quota-dialog.tsx:134 #: src/renderer/components/+config-resource-quotas/add-quota-dialog.tsx:134
msgid "Select a quota.." msgid "Select a quota.."
@ -2277,23 +2325,40 @@ msgstr "Select a quota.."
#~ msgid "Select context" #~ msgid "Select context"
#~ msgstr "Select context" #~ msgstr "Select context"
#: src/renderer/components/+add-cluster/add-cluster.tsx:245
#~ msgid "Select context(s)"
#~ msgstr "Select context(s)"
#: src/renderer/components/+add-cluster/add-cluster.tsx:272
msgid "Select contexts"
msgstr "Select contexts"
#: src/renderer/components/+add-cluster/add-cluster.tsx:76 #: src/renderer/components/+add-cluster/add-cluster.tsx:76
#: src/renderer/components/+add-cluster/add-cluster.tsx:76 #: src/renderer/components/+add-cluster/add-cluster.tsx:76
msgid "Select custom kube-config file" #~ msgid "Select custom kube-config file"
msgstr "Select custom kube-config file" #~ msgstr "Select custom kube-config file"
#: src/renderer/components/+add-cluster/add-cluster.tsx:85
#: src/renderer/components/+add-cluster/add-cluster.tsx:85
msgid "Select custom kubeconfig file"
msgstr "Select custom kubeconfig file"
#: src/renderer/components/+add-cluster/add-cluster.tsx:212 #: src/renderer/components/+add-cluster/add-cluster.tsx:212
#~ msgid "Select file" #~ msgid "Select file"
#~ msgstr "Select file" #~ msgstr "Select file"
#: src/renderer/components/+add-cluster/add-cluster.tsx:221 #: src/renderer/components/+add-cluster/add-cluster.tsx:221
msgid "Select kube-config file" #~ msgid "Select kube-config file"
msgstr "Select kube-config file" #~ msgstr "Select kube-config file"
#: src/renderer/components/+add-cluster/add-cluster.tsx:173 #: src/renderer/components/+add-cluster/add-cluster.tsx:173
#~ msgid "Select kubeconfig" #~ msgid "Select kubeconfig"
#~ msgstr "Select kubeconfig" #~ msgstr "Select kubeconfig"
#: src/renderer/components/+add-cluster/add-cluster.tsx:244
msgid "Select kubeconfig file"
msgstr "Select kubeconfig file"
#: src/renderer/components/+add-cluster/add-cluster.tsx:224 #: src/renderer/components/+add-cluster/add-cluster.tsx:224
#~ msgid "Select or drop file" #~ msgid "Select or drop file"
#~ msgstr "Select or drop file" #~ msgstr "Select or drop file"
@ -2310,6 +2375,22 @@ msgstr "Select role.."
msgid "Select service accounts" msgid "Select service accounts"
msgstr "Select service accounts" msgstr "Select service accounts"
#: src/renderer/components/+add-cluster/add-cluster.tsx:244
#~ msgid "Selected clusters: <0>{0}</0>"
#~ msgstr "Selected clusters: <0>{0}</0>"
#: src/renderer/components/+add-cluster/add-cluster.tsx:244
#~ msgid "Selected contexts ({0}): <0>{1}</0>"
#~ msgstr "Selected contexts ({0}): <0>{1}</0>"
#: src/renderer/components/+add-cluster/add-cluster.tsx:271
msgid "Selected contexts: <0>{0}</0>"
msgstr "Selected contexts: <0>{0}</0>"
#: src/renderer/components/+add-cluster/add-cluster.tsx:246
#~ msgid "Selected contexts: {0}"
#~ msgstr "Selected contexts: {0}"
#: src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets-details.tsx:27 #: src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets-details.tsx:27
#: src/renderer/components/+network-services/service-details.tsx:37 #: src/renderer/components/+network-services/service-details.tsx:37
#: src/renderer/components/+network-services/services.tsx:50 #: src/renderer/components/+network-services/services.tsx:50
@ -2486,6 +2567,10 @@ msgstr "Submitting.."
msgid "Subsets" msgid "Subsets"
msgstr "Subsets" msgstr "Subsets"
#: src/renderer/components/+add-cluster/add-cluster.tsx:122
msgid "Successfully imported <0>{0}</0> cluster(s)"
msgstr "Successfully imported <0>{0}</0> cluster(s)"
#: src/renderer/components/+pod-security-policies/pod-security-policy-details.tsx:128 #: src/renderer/components/+pod-security-policies/pod-security-policy-details.tsx:128
msgid "Supplemental Groups" msgid "Supplemental Groups"
msgstr "Supplemental Groups" msgstr "Supplemental Groups"
@ -2532,7 +2617,7 @@ msgstr "There are no logs available."
msgid "This field is required" msgid "This field is required"
msgstr "This field is required" msgstr "This field is required"
#: src/renderer/components/cluster-manager/clusters-menu.tsx:104 #: src/renderer/components/cluster-manager/clusters-menu.tsx:106
msgid "This is the quick launch menu." msgid "This is the quick launch menu."
msgstr "This is the quick launch menu." msgstr "This is the quick launch menu."
@ -2636,8 +2721,8 @@ msgstr "Upgrade version"
msgid "Usage" msgid "Usage"
msgstr "Usage" msgstr "Usage"
#: src/renderer/components/+add-cluster/add-cluster.tsx:77 #: src/renderer/components/+add-cluster/add-cluster.tsx:86
#: src/renderer/components/+add-cluster/add-cluster.tsx:77 #: src/renderer/components/+add-cluster/add-cluster.tsx:86
msgid "Use configuration" msgid "Use configuration"
msgstr "Use configuration" msgstr "Use configuration"
@ -2804,7 +2889,7 @@ msgstr "listKind"
msgid "never" msgid "never"
msgstr "never" msgstr "never"
#: src/renderer/components/cluster-manager/clusters-menu.tsx:119 #: src/renderer/components/cluster-manager/clusters-menu.tsx:121
msgid "new" msgid "new"
msgstr "new" msgstr "new"

View File

@ -87,8 +87,8 @@ msgstr ""
msgid "Active" msgid "Active"
msgstr "" msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:248 #: src/renderer/components/+add-cluster/add-cluster.tsx:303
#: src/renderer/components/cluster-manager/clusters-menu.tsx:116 #: src/renderer/components/cluster-manager/clusters-menu.tsx:118
msgid "Add Cluster" msgid "Add Cluster"
msgstr "" msgstr ""
@ -112,7 +112,7 @@ msgstr ""
#~ msgid "Add cluster" #~ msgid "Add cluster"
#~ msgstr "" #~ msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:266 #: src/renderer/components/+add-cluster/add-cluster.tsx:320
msgid "Add cluster(s)" msgid "Add cluster(s)"
msgstr "" msgstr ""
@ -132,6 +132,10 @@ msgstr ""
#~ msgid "Added repos:" #~ msgid "Added repos:"
#~ msgstr "" #~ msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:244
#~ msgid "Adding clusters: <0>{0}</0>"
#~ msgstr ""
#: src/renderer/components/+preferences/preferences.tsx:103 #: src/renderer/components/+preferences/preferences.tsx:103
msgid "Adding helm branch <0>{0}</0> has failed: {1}" msgid "Adding helm branch <0>{0}</0> has failed: {1}"
msgstr "" msgstr ""
@ -289,7 +293,7 @@ msgstr ""
msgid "Arguments" msgid "Arguments"
msgstr "" msgstr ""
#: src/renderer/components/cluster-manager/clusters-menu.tsx:106 #: src/renderer/components/cluster-manager/clusters-menu.tsx:108
msgid "Associate clusters and choose the ones you want to access via quick launch menu by clicking the + button." msgid "Associate clusters and choose the ones you want to access via quick launch menu by clicking the + button."
msgstr "" msgstr ""
@ -319,7 +323,7 @@ msgstr ""
msgid "Bindings" msgid "Bindings"
msgstr "" msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:227 #: src/renderer/components/+add-cluster/add-cluster.tsx:251
msgid "Browse" msgid "Browse"
msgstr "" msgstr ""
@ -596,6 +600,14 @@ msgstr ""
msgid "Context" msgid "Context"
msgstr "" msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:244
#~ msgid "Contexts: <0>{0}</0>"
#~ msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:249
#~ msgid "Contexts: {0}"
#~ msgstr ""
#: src/renderer/components/+workloads-pods/pods.tsx:79 #: src/renderer/components/+workloads-pods/pods.tsx:79
#: src/renderer/components/kube-object/kube-object-meta.tsx:39 #: src/renderer/components/kube-object/kube-object-meta.tsx:39
msgid "Controlled By" msgid "Controlled By"
@ -899,6 +911,10 @@ msgstr ""
msgid "Error stack" msgid "Error stack"
msgstr "" msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:129
msgid "Error while adding cluster(s): {0}"
msgstr ""
#: src/renderer/components/+events/events.tsx:56 #: src/renderer/components/+events/events.tsx:56
#: src/renderer/components/+events/kube-event-details.tsx:34 #: src/renderer/components/+events/kube-event-details.tsx:34
#: src/renderer/components/+events/kube-event-details.tsx:39 #: src/renderer/components/+events/kube-event-details.tsx:39
@ -1713,7 +1729,7 @@ msgstr ""
msgid "Parameters" msgid "Parameters"
msgstr "" msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:222 #: src/renderer/components/+add-cluster/add-cluster.tsx:245
msgid "Paste as text" msgid "Paste as text"
msgstr "" msgstr ""
@ -1737,10 +1753,18 @@ msgstr ""
msgid "Persistent Volumes" msgid "Persistent Volumes"
msgstr "" msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:106 #: src/renderer/components/+add-cluster/add-cluster.tsx:95
msgid "Please select kube-config's context" msgid "Please select at least one cluster context"
msgstr "" msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:146
#~ msgid "Please select at least one context to add a cluster"
#~ msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:106
#~ msgid "Please select kube-config's context"
#~ msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:63 #: src/renderer/components/+add-cluster/add-cluster.tsx:63
#~ msgid "Please select kubeconfig" #~ msgid "Please select kubeconfig"
#~ msgstr "" #~ msgstr ""
@ -1749,6 +1773,10 @@ msgstr ""
#~ msgid "Please select kubeconfig context" #~ msgid "Please select kubeconfig context"
#~ msgstr "" #~ msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:106
#~ msgid "Please select kubeconfig's context"
#~ msgstr ""
#: src/renderer/components/+workloads-pods/pod-menu.tsx:50 #: src/renderer/components/+workloads-pods/pod-menu.tsx:50
msgid "Pod" msgid "Pod"
msgstr "" msgstr ""
@ -1834,13 +1862,33 @@ msgstr ""
msgid "Privileged" msgid "Privileged"
msgstr "" msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:264
#~ msgid "Pro-Tip: paste kubeconfig (text/yaml) to get available contexts"
#~ msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:264
#~ msgid "Pro-Tip: paste kubeconfig to collect available contexts"
#~ msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:263
msgid "Pro-Tip: paste kubeconfig to get available contexts"
msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:264
#~ msgid "Pro-Tip: paste kubeconfig to parse available contexts"
#~ msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:254
msgid "Pro-Tip: you can also drag-n-drop kubeconfig file to this area"
msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:225 #: src/renderer/components/+add-cluster/add-cluster.tsx:225
#~ msgid "Pro-tip: you can also drag-n-drop kube-config file in the left-side area" #~ msgid "Pro-tip: you can also drag-n-drop kube-config file in the left-side area"
#~ msgstr "" #~ msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:229 #: src/renderer/components/+add-cluster/add-cluster.tsx:229
msgid "Pro-tip: you can also drag-n-drop kube-config file to this area" #~ msgid "Pro-tip: you can also drag-n-drop kube-config file to this area"
msgstr "" #~ msgstr ""
#: src/renderer/components/+storage-classes/storage-class-details.tsx:28 #: src/renderer/components/+storage-classes/storage-class-details.tsx:28
#: src/renderer/components/+storage-classes/storage-classes.tsx:35 #: src/renderer/components/+storage-classes/storage-classes.tsx:35
@ -1851,7 +1899,7 @@ msgstr ""
msgid "Proxy is used only for non-cluster communication." msgid "Proxy is used only for non-cluster communication."
msgstr "" msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:254 #: src/renderer/components/+add-cluster/add-cluster.tsx:308
msgid "Proxy settings" msgid "Proxy settings"
msgstr "" msgstr ""
@ -2032,7 +2080,7 @@ msgstr ""
msgid "Required field" msgid "Required field"
msgstr "" msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:226 #: src/renderer/components/+add-cluster/add-cluster.tsx:250
#: src/renderer/components/item-object-list/page-filters-list.tsx:31 #: src/renderer/components/item-object-list/page-filters-list.tsx:31
msgid "Reset" msgid "Reset"
msgstr "" msgstr ""
@ -2042,8 +2090,8 @@ msgid "Reset filters?"
msgstr "" msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:65 #: src/renderer/components/+add-cluster/add-cluster.tsx:65
msgid "Resetting config to {0}" #~ msgid "Resetting config to {0}"
msgstr "" #~ msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:68 #: src/renderer/components/+add-cluster/add-cluster.tsx:68
#~ msgid "Resetting kube-config to current {0}" #~ msgid "Resetting kube-config to current {0}"
@ -2248,9 +2296,9 @@ msgstr ""
msgid "Secrets" msgid "Secrets"
msgstr "" msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:251 #: src/renderer/components/+add-cluster/add-cluster.tsx:253
msgid "Select a context" #~ msgid "Select a context"
msgstr "" #~ msgstr ""
#: src/renderer/components/+config-resource-quotas/add-quota-dialog.tsx:134 #: src/renderer/components/+config-resource-quotas/add-quota-dialog.tsx:134
msgid "Select a quota.." msgid "Select a quota.."
@ -2260,9 +2308,22 @@ msgstr ""
#~ msgid "Select context" #~ msgid "Select context"
#~ msgstr "" #~ msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:245
#~ msgid "Select context(s)"
#~ msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:272
msgid "Select contexts"
msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:76 #: src/renderer/components/+add-cluster/add-cluster.tsx:76
#: src/renderer/components/+add-cluster/add-cluster.tsx:76 #: src/renderer/components/+add-cluster/add-cluster.tsx:76
msgid "Select custom kube-config file" #~ msgid "Select custom kube-config file"
#~ msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:85
#: src/renderer/components/+add-cluster/add-cluster.tsx:85
msgid "Select custom kubeconfig file"
msgstr "" msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:212 #: src/renderer/components/+add-cluster/add-cluster.tsx:212
@ -2270,13 +2331,17 @@ msgstr ""
#~ msgstr "" #~ msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:221 #: src/renderer/components/+add-cluster/add-cluster.tsx:221
msgid "Select kube-config file" #~ msgid "Select kube-config file"
msgstr "" #~ msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:173 #: src/renderer/components/+add-cluster/add-cluster.tsx:173
#~ msgid "Select kubeconfig" #~ msgid "Select kubeconfig"
#~ msgstr "" #~ msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:244
msgid "Select kubeconfig file"
msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:224 #: src/renderer/components/+add-cluster/add-cluster.tsx:224
#~ msgid "Select or drop file" #~ msgid "Select or drop file"
#~ msgstr "" #~ msgstr ""
@ -2293,6 +2358,22 @@ msgstr ""
msgid "Select service accounts" msgid "Select service accounts"
msgstr "" msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:244
#~ msgid "Selected clusters: <0>{0}</0>"
#~ msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:244
#~ msgid "Selected contexts ({0}): <0>{1}</0>"
#~ msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:271
msgid "Selected contexts: <0>{0}</0>"
msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:246
#~ msgid "Selected contexts: {0}"
#~ msgstr ""
#: src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets-details.tsx:27 #: src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets-details.tsx:27
#: src/renderer/components/+network-services/service-details.tsx:37 #: src/renderer/components/+network-services/service-details.tsx:37
#: src/renderer/components/+network-services/services.tsx:50 #: src/renderer/components/+network-services/services.tsx:50
@ -2469,6 +2550,10 @@ msgstr ""
msgid "Subsets" msgid "Subsets"
msgstr "" msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:122
msgid "Successfully imported <0>{0}</0> cluster(s)"
msgstr ""
#: src/renderer/components/+pod-security-policies/pod-security-policy-details.tsx:128 #: src/renderer/components/+pod-security-policies/pod-security-policy-details.tsx:128
msgid "Supplemental Groups" msgid "Supplemental Groups"
msgstr "" msgstr ""
@ -2515,7 +2600,7 @@ msgstr ""
msgid "This field is required" msgid "This field is required"
msgstr "" msgstr ""
#: src/renderer/components/cluster-manager/clusters-menu.tsx:104 #: src/renderer/components/cluster-manager/clusters-menu.tsx:106
msgid "This is the quick launch menu." msgid "This is the quick launch menu."
msgstr "" msgstr ""
@ -2619,8 +2704,8 @@ msgstr ""
msgid "Usage" msgid "Usage"
msgstr "" msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:77 #: src/renderer/components/+add-cluster/add-cluster.tsx:86
#: src/renderer/components/+add-cluster/add-cluster.tsx:77 #: src/renderer/components/+add-cluster/add-cluster.tsx:86
msgid "Use configuration" msgid "Use configuration"
msgstr "" msgstr ""
@ -2787,7 +2872,7 @@ msgstr ""
msgid "never" msgid "never"
msgstr "" msgstr ""
#: src/renderer/components/cluster-manager/clusters-menu.tsx:119 #: src/renderer/components/cluster-manager/clusters-menu.tsx:121
msgid "new" msgid "new"
msgstr "" msgstr ""

View File

@ -88,8 +88,8 @@ msgstr "Название аккаунта"
msgid "Active" msgid "Active"
msgstr "Активный" msgstr "Активный"
#: src/renderer/components/+add-cluster/add-cluster.tsx:248 #: src/renderer/components/+add-cluster/add-cluster.tsx:303
#: src/renderer/components/cluster-manager/clusters-menu.tsx:116 #: src/renderer/components/cluster-manager/clusters-menu.tsx:118
msgid "Add Cluster" msgid "Add Cluster"
msgstr "" msgstr ""
@ -113,7 +113,7 @@ msgstr "Добавить привязки к {name}"
#~ msgid "Add cluster" #~ msgid "Add cluster"
#~ msgstr "" #~ msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:266 #: src/renderer/components/+add-cluster/add-cluster.tsx:320
msgid "Add cluster(s)" msgid "Add cluster(s)"
msgstr "" msgstr ""
@ -133,6 +133,10 @@ msgstr "Добавить поле"
#~ msgid "Added repos:" #~ msgid "Added repos:"
#~ msgstr "" #~ msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:244
#~ msgid "Adding clusters: <0>{0}</0>"
#~ msgstr ""
#: src/renderer/components/+preferences/preferences.tsx:103 #: src/renderer/components/+preferences/preferences.tsx:103
msgid "Adding helm branch <0>{0}</0> has failed: {1}" msgid "Adding helm branch <0>{0}</0> has failed: {1}"
msgstr "" msgstr ""
@ -290,7 +294,7 @@ msgstr "Выполнить команду drain для ноды <0>{nodeName}</0
msgid "Arguments" msgid "Arguments"
msgstr "Аргументы" msgstr "Аргументы"
#: src/renderer/components/cluster-manager/clusters-menu.tsx:106 #: src/renderer/components/cluster-manager/clusters-menu.tsx:108
msgid "Associate clusters and choose the ones you want to access via quick launch menu by clicking the + button." msgid "Associate clusters and choose the ones you want to access via quick launch menu by clicking the + button."
msgstr "" msgstr ""
@ -320,7 +324,7 @@ msgstr "Цели привязки"
msgid "Bindings" msgid "Bindings"
msgstr "Привязки" msgstr "Привязки"
#: src/renderer/components/+add-cluster/add-cluster.tsx:227 #: src/renderer/components/+add-cluster/add-cluster.tsx:251
msgid "Browse" msgid "Browse"
msgstr "" msgstr ""
@ -601,6 +605,14 @@ msgstr "Контейнеры"
msgid "Context" msgid "Context"
msgstr "Контекст" msgstr "Контекст"
#: src/renderer/components/+add-cluster/add-cluster.tsx:244
#~ msgid "Contexts: <0>{0}</0>"
#~ msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:249
#~ msgid "Contexts: {0}"
#~ msgstr ""
#: src/renderer/components/+workloads-pods/pods.tsx:79 #: src/renderer/components/+workloads-pods/pods.tsx:79
#: src/renderer/components/kube-object/kube-object-meta.tsx:39 #: src/renderer/components/kube-object/kube-object-meta.tsx:39
msgid "Controlled By" msgid "Controlled By"
@ -904,6 +916,10 @@ msgstr "Среда"
msgid "Error stack" msgid "Error stack"
msgstr "Стэк ошибки" msgstr "Стэк ошибки"
#: src/renderer/components/+add-cluster/add-cluster.tsx:129
msgid "Error while adding cluster(s): {0}"
msgstr ""
#: src/renderer/components/+events/events.tsx:56 #: src/renderer/components/+events/events.tsx:56
#: src/renderer/components/+events/kube-event-details.tsx:34 #: src/renderer/components/+events/kube-event-details.tsx:34
#: src/renderer/components/+events/kube-event-details.tsx:39 #: src/renderer/components/+events/kube-event-details.tsx:39
@ -1731,7 +1747,7 @@ msgstr "Параллелизм"
msgid "Parameters" msgid "Parameters"
msgstr "Параметры" msgstr "Параметры"
#: src/renderer/components/+add-cluster/add-cluster.tsx:222 #: src/renderer/components/+add-cluster/add-cluster.tsx:245
msgid "Paste as text" msgid "Paste as text"
msgstr "" msgstr ""
@ -1755,10 +1771,18 @@ msgstr "Persistent Volume Claims"
msgid "Persistent Volumes" msgid "Persistent Volumes"
msgstr "Persistent Volumes" msgstr "Persistent Volumes"
#: src/renderer/components/+add-cluster/add-cluster.tsx:106 #: src/renderer/components/+add-cluster/add-cluster.tsx:95
msgid "Please select kube-config's context" msgid "Please select at least one cluster context"
msgstr "" msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:146
#~ msgid "Please select at least one context to add a cluster"
#~ msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:106
#~ msgid "Please select kube-config's context"
#~ msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:63 #: src/renderer/components/+add-cluster/add-cluster.tsx:63
#~ msgid "Please select kubeconfig" #~ msgid "Please select kubeconfig"
#~ msgstr "" #~ msgstr ""
@ -1767,6 +1791,10 @@ msgstr ""
#~ msgid "Please select kubeconfig context" #~ msgid "Please select kubeconfig context"
#~ msgstr "" #~ msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:106
#~ msgid "Please select kubeconfig's context"
#~ msgstr ""
#: src/renderer/components/+workloads-pods/pod-menu.tsx:50 #: src/renderer/components/+workloads-pods/pod-menu.tsx:50
msgid "Pod" msgid "Pod"
msgstr "" msgstr ""
@ -1852,13 +1880,33 @@ msgstr "Секрет приватного ключа"
msgid "Privileged" msgid "Privileged"
msgstr "" msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:264
#~ msgid "Pro-Tip: paste kubeconfig (text/yaml) to get available contexts"
#~ msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:264
#~ msgid "Pro-Tip: paste kubeconfig to collect available contexts"
#~ msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:263
msgid "Pro-Tip: paste kubeconfig to get available contexts"
msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:264
#~ msgid "Pro-Tip: paste kubeconfig to parse available contexts"
#~ msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:254
msgid "Pro-Tip: you can also drag-n-drop kubeconfig file to this area"
msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:225 #: src/renderer/components/+add-cluster/add-cluster.tsx:225
#~ msgid "Pro-tip: you can also drag-n-drop kube-config file in the left-side area" #~ msgid "Pro-tip: you can also drag-n-drop kube-config file in the left-side area"
#~ msgstr "" #~ msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:229 #: src/renderer/components/+add-cluster/add-cluster.tsx:229
msgid "Pro-tip: you can also drag-n-drop kube-config file to this area" #~ msgid "Pro-tip: you can also drag-n-drop kube-config file to this area"
msgstr "" #~ msgstr ""
#: src/renderer/components/+storage-classes/storage-class-details.tsx:28 #: src/renderer/components/+storage-classes/storage-class-details.tsx:28
#: src/renderer/components/+storage-classes/storage-classes.tsx:35 #: src/renderer/components/+storage-classes/storage-classes.tsx:35
@ -1869,7 +1917,7 @@ msgstr "Комиссия"
msgid "Proxy is used only for non-cluster communication." msgid "Proxy is used only for non-cluster communication."
msgstr "" msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:254 #: src/renderer/components/+add-cluster/add-cluster.tsx:308
msgid "Proxy settings" msgid "Proxy settings"
msgstr "" msgstr ""
@ -2050,7 +2098,7 @@ msgstr ""
msgid "Required field" msgid "Required field"
msgstr "Обязательное поле" msgstr "Обязательное поле"
#: src/renderer/components/+add-cluster/add-cluster.tsx:226 #: src/renderer/components/+add-cluster/add-cluster.tsx:250
#: src/renderer/components/item-object-list/page-filters-list.tsx:31 #: src/renderer/components/item-object-list/page-filters-list.tsx:31
msgid "Reset" msgid "Reset"
msgstr "Сбросить" msgstr "Сбросить"
@ -2060,8 +2108,8 @@ msgid "Reset filters?"
msgstr "Сбросить фильтры?" msgstr "Сбросить фильтры?"
#: src/renderer/components/+add-cluster/add-cluster.tsx:65 #: src/renderer/components/+add-cluster/add-cluster.tsx:65
msgid "Resetting config to {0}" #~ msgid "Resetting config to {0}"
msgstr "" #~ msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:68 #: src/renderer/components/+add-cluster/add-cluster.tsx:68
#~ msgid "Resetting kube-config to current {0}" #~ msgid "Resetting kube-config to current {0}"
@ -2266,9 +2314,9 @@ msgstr "Тип секрета"
msgid "Secrets" msgid "Secrets"
msgstr "Secrets" msgstr "Secrets"
#: src/renderer/components/+add-cluster/add-cluster.tsx:251 #: src/renderer/components/+add-cluster/add-cluster.tsx:253
msgid "Select a context" #~ msgid "Select a context"
msgstr "" #~ msgstr ""
#: src/renderer/components/+config-resource-quotas/add-quota-dialog.tsx:134 #: src/renderer/components/+config-resource-quotas/add-quota-dialog.tsx:134
msgid "Select a quota.." msgid "Select a quota.."
@ -2278,9 +2326,22 @@ msgstr "Выберите квоту..."
#~ msgid "Select context" #~ msgid "Select context"
#~ msgstr "" #~ msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:245
#~ msgid "Select context(s)"
#~ msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:272
msgid "Select contexts"
msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:76 #: src/renderer/components/+add-cluster/add-cluster.tsx:76
#: src/renderer/components/+add-cluster/add-cluster.tsx:76 #: src/renderer/components/+add-cluster/add-cluster.tsx:76
msgid "Select custom kube-config file" #~ msgid "Select custom kube-config file"
#~ msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:85
#: src/renderer/components/+add-cluster/add-cluster.tsx:85
msgid "Select custom kubeconfig file"
msgstr "" msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:212 #: src/renderer/components/+add-cluster/add-cluster.tsx:212
@ -2288,13 +2349,17 @@ msgstr ""
#~ msgstr "" #~ msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:221 #: src/renderer/components/+add-cluster/add-cluster.tsx:221
msgid "Select kube-config file" #~ msgid "Select kube-config file"
msgstr "" #~ msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:173 #: src/renderer/components/+add-cluster/add-cluster.tsx:173
#~ msgid "Select kubeconfig" #~ msgid "Select kubeconfig"
#~ msgstr "" #~ msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:244
msgid "Select kubeconfig file"
msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:224 #: src/renderer/components/+add-cluster/add-cluster.tsx:224
#~ msgid "Select or drop file" #~ msgid "Select or drop file"
#~ msgstr "" #~ msgstr ""
@ -2311,6 +2376,22 @@ msgstr "Выбрать роль.."
msgid "Select service accounts" msgid "Select service accounts"
msgstr "Выбрать сервисные аккаунты" msgstr "Выбрать сервисные аккаунты"
#: src/renderer/components/+add-cluster/add-cluster.tsx:244
#~ msgid "Selected clusters: <0>{0}</0>"
#~ msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:244
#~ msgid "Selected contexts ({0}): <0>{1}</0>"
#~ msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:271
msgid "Selected contexts: <0>{0}</0>"
msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:246
#~ msgid "Selected contexts: {0}"
#~ msgstr ""
#: src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets-details.tsx:27 #: src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets-details.tsx:27
#: src/renderer/components/+network-services/service-details.tsx:37 #: src/renderer/components/+network-services/service-details.tsx:37
#: src/renderer/components/+network-services/services.tsx:50 #: src/renderer/components/+network-services/services.tsx:50
@ -2487,6 +2568,10 @@ msgstr "Применение.."
msgid "Subsets" msgid "Subsets"
msgstr "" msgstr ""
#: src/renderer/components/+add-cluster/add-cluster.tsx:122
msgid "Successfully imported <0>{0}</0> cluster(s)"
msgstr ""
#: src/renderer/components/+pod-security-policies/pod-security-policy-details.tsx:128 #: src/renderer/components/+pod-security-policies/pod-security-policy-details.tsx:128
msgid "Supplemental Groups" msgid "Supplemental Groups"
msgstr "" msgstr ""
@ -2533,7 +2618,7 @@ msgstr "Логи отсутствуют."
msgid "This field is required" msgid "This field is required"
msgstr "Это обязательное поле" msgstr "Это обязательное поле"
#: src/renderer/components/cluster-manager/clusters-menu.tsx:104 #: src/renderer/components/cluster-manager/clusters-menu.tsx:106
msgid "This is the quick launch menu." msgid "This is the quick launch menu."
msgstr "" msgstr ""
@ -2637,8 +2722,8 @@ msgstr "Обновить версию"
msgid "Usage" msgid "Usage"
msgstr "Использование" msgstr "Использование"
#: src/renderer/components/+add-cluster/add-cluster.tsx:77 #: src/renderer/components/+add-cluster/add-cluster.tsx:86
#: src/renderer/components/+add-cluster/add-cluster.tsx:77 #: src/renderer/components/+add-cluster/add-cluster.tsx:86
msgid "Use configuration" msgid "Use configuration"
msgstr "" msgstr ""
@ -2805,7 +2890,7 @@ msgstr ""
msgid "never" msgid "never"
msgstr "" msgstr ""
#: src/renderer/components/cluster-manager/clusters-menu.tsx:119 #: src/renderer/components/cluster-manager/clusters-menu.tsx:121
msgid "new" msgid "new"
msgstr "" msgstr ""

View File

@ -87,6 +87,7 @@ export class ClusterStore extends BaseStore<ClusterStoreModel> {
return this.activeClusterId === id; return this.activeClusterId === id;
} }
@action
setActive(id: ClusterId) { setActive(id: ClusterId) {
this.activeClusterId = id; this.activeClusterId = id;
} }
@ -108,14 +109,18 @@ export class ClusterStore extends BaseStore<ClusterStoreModel> {
} }
@action @action
async addCluster(model: ClusterModel, activate = true): Promise<Cluster> { addCluster(model: ClusterModel): Cluster {
tracker.event("cluster", "add"); tracker.event("cluster", "add");
const cluster = new Cluster(model); const cluster = new Cluster(model);
this.clusters.set(model.id, cluster); this.clusters.set(model.id, cluster);
if (activate) this.activeClusterId = model.id;
return cluster; return cluster;
} }
@action
addClusters(models: ClusterModel[]) {
models.forEach(model => this.addCluster(model));
}
@action @action
async removeById(clusterId: ClusterId) { async removeById(clusterId: ClusterId) {
tracker.event("cluster", "remove"); tracker.event("cluster", "remove");

View File

@ -9,6 +9,16 @@
.hint { .hint {
margin-top: -$padding; margin-top: -$padding;
color: $textColorSecondary;
> * {
vertical-align: middle;
}
}
.AceEditor {
min-height: 200px;
max-height: 400px;
} }
.Select { .Select {
@ -16,6 +26,14 @@
--flex-gap: #{$padding}; --flex-gap: #{$padding};
} }
// todo: extract to component, merge with namespace-select.scss
&__placeholder {
width: 100%;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
&__control { &__control {
box-shadow: 0 0 0 1px $borderFaintColor; box-shadow: 0 0 0 1px $borderFaintColor;
} }

View File

@ -2,7 +2,7 @@ import "./add-cluster.scss"
import os from "os"; import os from "os";
import React, { Fragment } from "react"; import React, { Fragment } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { computed, observable } from "mobx"; import { action, observable, runInAction } from "mobx";
import { remote } from "electron"; import { remote } from "electron";
import { KubeConfig } from "@kubernetes/client-node"; import { KubeConfig } from "@kubernetes/client-node";
import { _i18n } from "../../i18n"; import { _i18n } from "../../i18n";
@ -14,7 +14,7 @@ import { Button } from "../button";
import { Icon } from "../icon"; import { Icon } from "../icon";
import { WizardLayout } from "../layout/wizard-layout"; import { WizardLayout } from "../layout/wizard-layout";
import { kubeConfigDefaultPath, loadConfig, saveConfigToAppFiles, splitConfig, validateConfig } from "../../../common/kube-helpers"; import { kubeConfigDefaultPath, loadConfig, saveConfigToAppFiles, splitConfig, validateConfig } from "../../../common/kube-helpers";
import { clusterStore } from "../../../common/cluster-store"; import { ClusterModel, clusterStore } from "../../../common/cluster-store";
import { workspaceStore } from "../../../common/workspace-store"; import { workspaceStore } from "../../../common/workspace-store";
import { v4 as uuid } from "uuid" import { v4 as uuid } from "uuid"
import { navigate } from "../../navigation"; import { navigate } from "../../navigation";
@ -31,17 +31,18 @@ enum KubeConfigSourceTab {
@observer @observer
export class AddCluster extends React.Component { export class AddCluster extends React.Component {
@observable.ref localKubeConfig: KubeConfig; @observable.ref kubeConfigLocal: KubeConfig;
@observable.ref newClusterConfig: KubeConfig;
@observable.ref error: React.ReactNode; @observable.ref error: React.ReactNode;
@observable kubeConfigPath = ""; @observable kubeContexts = observable.map<string, KubeConfig>(); // available contexts from kubeconfig-file or user-input
@observable selectedContexts = observable.array<string>();
@observable sourceTab = KubeConfigSourceTab.FILE; @observable sourceTab = KubeConfigSourceTab.FILE;
@observable kubeConfigPath = "";
@observable customConfig = ""
@observable proxyServer = ""
@observable isWaiting = false @observable isWaiting = false
@observable showSettings = false @observable showSettings = false
@observable dropAreaActive = false; @observable dropAreaActive = false;
@observable proxyServer = ""
@observable customConfig = ""
componentDidMount() { componentDidMount() {
this.setKubeConfig(userStore.kubeConfigPath); this.setKubeConfig(userStore.kubeConfigPath);
@ -51,19 +52,17 @@ export class AddCluster extends React.Component {
userStore.markNewContextsAsSeen(); userStore.markNewContextsAsSeen();
} }
protected setKubeConfig(filePath: string, { saveGlobal = true, throwError = false } = {}) { @action
protected setKubeConfig(filePath: string, { throwError = false } = {}) {
try { try {
const kubeConfig = loadConfig(filePath); this.kubeConfigLocal = loadConfig(filePath);
validateConfig(kubeConfig); validateConfig(this.kubeConfigLocal);
this.refreshContexts();
this.kubeConfigPath = filePath; this.kubeConfigPath = filePath;
this.localKubeConfig = kubeConfig; userStore.kubeConfigPath = filePath; // save to store
this.newClusterConfig = null; // reset previously selected
if (saveGlobal) {
userStore.kubeConfigPath = filePath; // save to store
}
} catch (err) { } catch (err) {
Notifications.error( Notifications.error(
<p>Can't read config file in <em>{filePath}</em>: {String(err)}</p> <div>Can't setup <code>{filePath}</code> as kubeconfig: {String(err)}</div>
); );
if (throwError) { if (throwError) {
throw err; throw err;
@ -71,27 +70,48 @@ export class AddCluster extends React.Component {
} }
} }
onKubeConfigInputBlur = () => { refreshContexts = (autoSelect = true) => {
const isChanged = this.kubeConfigPath !== userStore.kubeConfigPath; this.selectedContexts.clear();
if (isChanged) {
this.kubeConfigPath = this.kubeConfigPath.replace("~", os.homedir()); switch (this.sourceTab) {
case KubeConfigSourceTab.FILE:
const contexts = this.getContexts(this.kubeConfigLocal);
this.kubeContexts.replace(contexts);
break;
case KubeConfigSourceTab.TEXT:
try { try {
this.setKubeConfig(this.kubeConfigPath, { throwError: true }) this.error = ""
const contexts = this.getContexts(loadConfig(this.customConfig || "{}"));
this.kubeContexts.replace(contexts);
} catch (err) { } catch (err) {
Notifications.info(<p> this.error = String(err);
<Trans>Resetting config to {userStore.kubeConfigPath}</Trans>
</p>, { timeout: 2500 });
this.setKubeConfig(userStore.kubeConfigPath);
} }
break;
}
if (autoSelect) {
const allContexts = Array.from(this.kubeContexts.keys());
this.selectedContexts.replace(allContexts);
} }
} }
selectKubeConfig = async () => { protected getContexts(config: KubeConfig): Map<string, KubeConfig> {
const contexts = new Map();
splitConfig(config).forEach(config => {
const isExists = clusterStore.hasContext(config.currentContext);
if (!isExists) {
contexts.set(config.currentContext, config);
}
})
return contexts
}
selectKubeConfigDialog = async () => {
const { dialog, BrowserWindow } = remote; const { dialog, BrowserWindow } = remote;
const { canceled, filePaths } = await dialog.showOpenDialog(BrowserWindow.getFocusedWindow(), { const { canceled, filePaths } = await dialog.showOpenDialog(BrowserWindow.getFocusedWindow(), {
defaultPath: this.kubeConfigPath, defaultPath: this.kubeConfigPath,
properties: ["openFile", "showHiddenFiles"], properties: ["openFile", "showHiddenFiles"],
message: _i18n._(t`Select custom kube-config file`), message: _i18n._(t`Select custom kubeconfig file`),
buttonLabel: _i18n._(t`Use configuration`), buttonLabel: _i18n._(t`Use configuration`),
}); });
if (!canceled && filePaths.length) { if (!canceled && filePaths.length) {
@ -99,67 +119,44 @@ export class AddCluster extends React.Component {
} }
} }
resetKubeConfig = () => { addClusters = () => {
this.setKubeConfig(kubeConfigDefaultPath);
}
@computed get clusterOptions() {
const options: SelectOption<KubeConfig>[] = [];
if (this.localKubeConfig) {
splitConfig(this.localKubeConfig).forEach(kubeConfig => {
const context = kubeConfig.currentContext;
const hasContext = clusterStore.hasContext(context);
if (!hasContext) {
options.push({
value: kubeConfig,
label: context,
});
}
})
}
return options;
}
protected formatClusterContextLabel = ({ value, label }: SelectOption<KubeConfig>) => {
if (value instanceof KubeConfig) {
const context = value.currentContext;
const isNew = userStore.newContexts.has(context);
return (
<div className={cssNames("kube-context flex gaps align-center", context)}>
<span>{context}</span>
{isNew && <Icon material="fiber_new"/>}
</div>
)
}
return label;
};
// fixme: allow to create multiple clusters at once (multi-select)
addCluster = async () => {
const { newClusterConfig, customConfig, proxyServer } = this;
const clusterId = uuid();
this.isWaiting = true
this.error = ""
try { try {
const config = this.sourceTab == KubeConfigSourceTab.TEXT ? loadConfig(customConfig) : newClusterConfig; if (!this.selectedContexts.length) {
if (!config) { this.error = <Trans>Please select at least one cluster context</Trans>
this.error = <Trans>Please select kube-config's context</Trans>
return; return;
} }
validateConfig(config); this.error = ""
await clusterStore.addCluster({ this.isWaiting = true
id: clusterId, const newClusters: ClusterModel[] = this.selectedContexts.map(context => {
kubeConfigPath: saveConfigToAppFiles(clusterId, config), const clusterId = uuid();
workspace: workspaceStore.currentWorkspaceId, const kubeConfig = this.kubeContexts.get(context);
contextName: config.currentContext, return {
preferences: { id: clusterId,
clusterName: config.currentContext, kubeConfigPath: saveConfigToAppFiles(clusterId, kubeConfig),
httpsProxy: proxyServer || undefined, workspace: workspaceStore.currentWorkspaceId,
}, contextName: kubeConfig.currentContext,
preferences: {
clusterName: kubeConfig.currentContext,
httpsProxy: this.proxyServer || undefined,
},
}
}); });
navigate(clusterViewURL({ params: { clusterId } })) runInAction(() => {
clusterStore.addClusters(newClusters);
if (newClusters.length === 1) {
const clusterId = newClusters[0].id;
clusterStore.setActive(clusterId);
navigate(clusterViewURL({ params: { clusterId } }));
} else {
Notifications.ok(
<Trans>Successfully imported <b>{newClusters.length}</b> cluster(s)</Trans>
);
}
})
this.refreshContexts();
} catch (err) { } catch (err) {
this.error = String(err); this.error = String(err);
Notifications.error(<Trans>Error while adding cluster(s): {this.error}</Trans>);
} finally { } finally {
this.isWaiting = false; this.isWaiting = false;
} }
@ -219,10 +216,10 @@ export class AddCluster extends React.Component {
renderKubeConfigSource() { renderKubeConfigSource() {
return ( return (
<> <>
<Tabs withBorder onChange={v => this.sourceTab = v}> <Tabs withBorder onChange={this.onKubeConfigTabChange}>
<Tab <Tab
value={KubeConfigSourceTab.FILE} value={KubeConfigSourceTab.FILE}
label={<Trans>Select kube-config file</Trans>} label={<Trans>Select kubeconfig file</Trans>}
active={this.sourceTab == KubeConfigSourceTab.FILE}/> active={this.sourceTab == KubeConfigSourceTab.FILE}/>
<Tab <Tab
value={KubeConfigSourceTab.TEXT} value={KubeConfigSourceTab.TEXT}
@ -243,34 +240,105 @@ export class AddCluster extends React.Component {
{this.kubeConfigPath !== kubeConfigDefaultPath && ( {this.kubeConfigPath !== kubeConfigDefaultPath && (
<Icon <Icon
material="settings_backup_restore" material="settings_backup_restore"
onClick={this.resetKubeConfig} onClick={() => this.setKubeConfig(kubeConfigDefaultPath)}
tooltip={<Trans>Reset</Trans>} tooltip={<Trans>Reset</Trans>}
/> />
)} )}
<Icon <Icon
material="folder" material="folder"
onClick={this.selectKubeConfig} onClick={this.selectKubeConfigDialog}
tooltip={<Trans>Browse</Trans>} tooltip={<Trans>Browse</Trans>}
/> />
</div> </div>
<small className="hint"> <small className="hint">
<Trans>Pro-tip: you can also drag-n-drop kube-config file to this area</Trans> <Trans>Pro-Tip: you can also drag-n-drop kubeconfig file to this area</Trans>
</small> </small>
</> </>
)} )}
{this.sourceTab === KubeConfigSourceTab.TEXT && ( {this.sourceTab === KubeConfigSourceTab.TEXT && (
<AceEditor <>
autoFocus <AceEditor
showGutter={false} autoFocus
mode="yaml" showGutter={false}
value={this.customConfig} mode="yaml"
onChange={value => this.customConfig = value} value={this.customConfig}
/> onChange={value => {
this.customConfig = value;
this.refreshContexts();
}}
/>
<small className="hint">
<Trans>Pro-Tip: paste kubeconfig to get available contexts</Trans>
</small>
</>
)} )}
</> </>
) )
} }
renderContextSelector() {
const allContexts = Array.from(this.kubeContexts.keys());
const placeholder = this.selectedContexts.length > 0
? <Trans>Selected contexts: <b>{this.selectedContexts.length}</b></Trans>
: <Trans>Select contexts</Trans>;
return (
<>
<Select
id="kubecontext-select" // todo: provide better mapping for integration tests (e.g. data-test-id="..")
placeholder={placeholder}
controlShouldRenderValue={false}
closeMenuOnSelect={false}
isOptionSelected={() => false}
options={allContexts}
formatOptionLabel={this.formatContextLabel}
onChange={({ value: ctx }: SelectOption<string>) => {
if (this.selectedContexts.includes(ctx)) {
this.selectedContexts.remove(ctx)
} else {
this.selectedContexts.push(ctx);
}
}}
/>
{this.selectedContexts.length > 0 && (
<small className="hint">
<span>Applying contexts:</span>{" "}
<code>{this.selectedContexts.join(", ")}</code>
</small>
)}
</>
)
}
onKubeConfigInputBlur = (evt: React.FocusEvent<HTMLInputElement>) => {
const isChanged = this.kubeConfigPath !== userStore.kubeConfigPath;
if (isChanged) {
this.kubeConfigPath = this.kubeConfigPath.replace("~", os.homedir());
try {
this.setKubeConfig(this.kubeConfigPath, { throwError: true });
} catch (err) {
this.setKubeConfig(userStore.kubeConfigPath); // revert to previous valid path
}
}
}
onKubeConfigTabChange = (tabId: KubeConfigSourceTab) => {
this.sourceTab = tabId;
this.error = "";
this.refreshContexts();
}
protected formatContextLabel = ({ value: context }: SelectOption<string>) => {
const isNew = userStore.newContexts.has(context);
const isSelected = this.selectedContexts.includes(context);
return (
<div className={cssNames("kube-context flex gaps align-center", context)}>
<span>{context}</span>
{isNew && <Icon small material="fiber_new"/>}
{isSelected && <Icon small material="check" className="box right"/>}
</div>
)
};
render() { render() {
return ( return (
<WizardLayout <WizardLayout
@ -285,6 +353,7 @@ export class AddCluster extends React.Component {
event.dataTransfer.dropEffect = "move" event.dataTransfer.dropEffect = "move"
}, },
onDrop: event => { onDrop: event => {
this.sourceTab = KubeConfigSourceTab.FILE;
this.dropAreaActive = false this.dropAreaActive = false
this.setKubeConfig(event.dataTransfer.files[0].path) this.setKubeConfig(event.dataTransfer.files[0].path)
} }
@ -292,14 +361,7 @@ export class AddCluster extends React.Component {
> >
<h2><Trans>Add Cluster</Trans></h2> <h2><Trans>Add Cluster</Trans></h2>
{this.renderKubeConfigSource()} {this.renderKubeConfigSource()}
<Select {this.renderContextSelector()}
id="kubecontext-select" // todo: provide better mapping for integration tests (e.g. data-test-id="..")
placeholder={<Trans>Select a context</Trans>}
value={this.newClusterConfig}
options={this.clusterOptions}
onChange={({ value }: SelectOption) => this.newClusterConfig = value}
formatOptionLabel={this.formatClusterContextLabel}
/>
<div className="cluster-settings"> <div className="cluster-settings">
<a href="#" onClick={() => this.showSettings = !this.showSettings}> <a href="#" onClick={() => this.showSettings = !this.showSettings}>
<Trans>Proxy settings</Trans> <Trans>Proxy settings</Trans>
@ -326,7 +388,7 @@ export class AddCluster extends React.Component {
<Button <Button
primary primary
label={<Trans>Add cluster(s)</Trans>} label={<Trans>Add cluster(s)</Trans>}
onClick={this.addCluster} onClick={this.addClusters}
waiting={this.isWaiting} waiting={this.isWaiting}
/> />
</div> </div>

View File

@ -3,17 +3,19 @@
import "./ace-editor.scss" import "./ace-editor.scss"
import React from "react" import React from "react"
import { observer, disposeOnUnmount } from "mobx-react";
import AceBuild, { Ace } from "ace-builds"
import { autobind, cssNames } from "../../utils";
import { themeStore } from "../../theme.store";
import { reaction } from "mobx"; import { reaction } from "mobx";
import { disposeOnUnmount, observer } from "mobx-react";
import AceBuild, { Ace } from "ace-builds"
import { autobind, cssNames, noop } from "../../utils";
import { themeStore } from "../../theme.store";
interface Props extends Partial<Ace.EditorOptions> { interface Props extends Partial<Ace.EditorOptions> {
className?: string; className?: string;
autoFocus?: boolean; autoFocus?: boolean;
hidden?: boolean; hidden?: boolean;
cursorPos?: Ace.Point; cursorPos?: Ace.Point;
onFocus?(evt: FocusEvent, value: string): void;
onBlur?(evt: FocusEvent, value: string): void;
onChange?(value: string, delta: Ace.Delta): void; onChange?(value: string, delta: Ace.Delta): void;
onCursorPosChange?(point: Ace.Point): void; onCursorPosChange?(point: Ace.Point): void;
} }
@ -30,6 +32,8 @@ const defaultProps: Partial<Props> = {
foldStyle: "markbegin", foldStyle: "markbegin",
printMargin: false, printMargin: false,
useWorker: false, useWorker: false,
onBlur: noop,
onFocus: noop,
}; };
@observer @observer
@ -64,7 +68,7 @@ export class AceEditor extends React.Component<Props, State> {
async componentDidMount() { async componentDidMount() {
const { const {
mode, autoFocus, className, hidden, cursorPos, mode, autoFocus, className, hidden, cursorPos,
onChange, onCursorPosChange, children, onBlur, onFocus, onChange, onCursorPosChange, children,
...options ...options
} = this.props; } = this.props;
@ -75,6 +79,8 @@ export class AceEditor extends React.Component<Props, State> {
this.setCursorPos(cursorPos); this.setCursorPos(cursorPos);
// bind events // bind events
this.editor.on("blur", (evt: any) => onBlur(evt, this.getValue()));
this.editor.on("focus", (evt: any) => onFocus(evt, this.getValue()));
this.editor.on("change", this.onChange); this.editor.on("change", this.onChange);
this.editor.selection.on("changeCursor", this.onCursorPosChange); this.editor.selection.on("changeCursor", this.onCursorPosChange);

View File

@ -76,8 +76,10 @@ export class ClustersMenu extends React.Component<Props> {
label: _i18n._(t`Remove`), label: _i18n._(t`Remove`),
}, },
ok: () => { ok: () => {
if (clusterStore.activeClusterId === cluster.id) {
navigate(landingURL());
}
clusterStore.removeById(cluster.id); clusterStore.removeById(cluster.id);
navigate(landingURL());
}, },
message: <p>Are you sure want to remove cluster <b title={cluster.id}>{cluster.contextName}</b>?</p>, message: <p>Are you sure want to remove cluster <b title={cluster.id}>{cluster.contextName}</b>?</p>,
}) })

View File

@ -24,8 +24,12 @@
&:not(.isOpen) { &:not(.isOpen) {
height: auto !important; height: auto !important;
.Tab:not(:focus):after { .Tab {
display: none; --color-active: inherit;
&:not(:focus):after {
display: none;
}
} }
} }

View File

@ -258,7 +258,7 @@ export class Input extends React.Component<InputProps, State> {
render() { render() {
const { const {
multiLine, showValidationLine, validators, theme, maxRows, children, multiLine, showValidationLine, validators, theme, maxRows, children,
maxLength, rows, disabled, autoSelectOnFocus, maxLength, rows, disabled, autoSelectOnFocus, iconLeft, iconRight,
...inputProps ...inputProps
} = this.props; } = this.props;
const { focused, dirty, valid, validating, errors } = this.state; const { focused, dirty, valid, validating, errors } = this.state;
@ -273,11 +273,6 @@ export class Input extends React.Component<InputProps, State> {
validatingLine: validating && showValidationLine, validatingLine: validating && showValidationLine,
}); });
// normalize icons
let { iconLeft, iconRight } = this.props;
if (isString(iconLeft)) iconLeft = <Icon material={iconLeft}/>
if (isString(iconRight)) iconRight = <Icon material={iconRight}/>
// prepare input props // prepare input props
Object.assign(inputProps, { Object.assign(inputProps, {
className: "input box grow", className: "input box grow",
@ -294,9 +289,9 @@ export class Input extends React.Component<InputProps, State> {
return ( return (
<div className={className}> <div className={className}>
<label className="input-area flex gaps align-center"> <label className="input-area flex gaps align-center">
{iconLeft} {isString(iconLeft) ? <Icon material={iconLeft}/> : iconLeft}
{multiLine ? <textarea {...inputProps as any}/> : <input {...inputProps as any}/>} {multiLine ? <textarea {...inputProps as any}/> : <input {...inputProps as any}/>}
{iconRight} {isString(iconRight) ? <Icon material={iconRight}/> : iconRight}
</label> </label>
<div className="input-info flex gaps"> <div className="input-info flex gaps">
{!valid && dirty && ( {!valid && dirty && (

View File

@ -36,6 +36,7 @@ export class Select extends React.Component<SelectProps> {
static defaultProps: SelectProps = { static defaultProps: SelectProps = {
autoConvertOptions: true, autoConvertOptions: true,
menuPortalTarget: document.body, menuPortalTarget: document.body,
menuPlacement: "auto",
} }
@computed get theme() { @computed get theme() {