@rancher/shell 0.1.1 → 0.1.3
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.
- package/assets/translations/en-us.yaml +33 -769
- package/assets/translations/zh-hans.yaml +153 -781
- package/components/ActionMenu.vue +3 -3
- package/components/CodeMirror.vue +6 -8
- package/components/CommunityLinks.vue +1 -1
- package/components/ContainerResourceLimit.vue +14 -0
- package/components/ExplorerMembers.vue +123 -0
- package/components/ExplorerProjectsNamespaces.vue +405 -0
- package/components/GrafanaDashboard.vue +17 -2
- package/components/LocaleSelector.vue +81 -0
- package/components/PromptModal.vue +2 -3
- package/components/ResourceList/index.vue +1 -1
- package/components/ResourceTable.vue +3 -6
- package/components/SingleClusterInfo.vue +1 -1
- package/components/SortableTable/index.vue +23 -20
- package/components/SortableTable/selection.js +1 -0
- package/components/auth/AzureWarning.vue +5 -1
- package/components/auth/Principal.vue +1 -1
- package/components/auth/RoleDetailEdit.vue +32 -12
- package/components/fleet/FleetRepos.vue +0 -2
- package/components/form/NameNsDescription.vue +4 -6
- package/components/form/NodeScheduling.vue +1 -1
- package/components/form/ResourceTabs/index.vue +27 -18
- package/components/form/WorkloadPorts.vue +1 -1
- package/components/formatter/ClusterLink.vue +13 -0
- package/components/formatter/PodImages.vue +11 -1
- package/components/formatter/RKETemplateName.vue +37 -0
- package/components/formatter/WorkloadHealthScale.vue +1 -1
- package/components/nav/Header.vue +9 -9
- package/components/nav/NamespaceFilter.vue +7 -4
- package/components/nav/TopLevelMenu.vue +6 -43
- package/components/nav/WindowManager/ContainerLogs.vue +1 -1
- package/config/product/harvester-manager.js +64 -2
- package/config/product/manager.js +9 -0
- package/config/settings.js +17 -71
- package/config/table-headers.js +0 -1
- package/config/types.js +8 -26
- package/core/plugin-routes.ts +34 -22
- package/core/plugin.ts +15 -3
- package/core/plugins-loader.js +2 -0
- package/core/plugins.js +79 -36
- package/core/types.ts +7 -1
- package/creators/app/tsconfig.json +6 -1
- package/creators/pkg/init +3 -0
- package/creators/pkg/tsconfig.json +7 -2
- package/detail/provisioning.cattle.io.cluster.vue +23 -0
- package/detail/workload/index.vue +11 -5
- package/{components/dialog → dialog}/AddClusterMemberDialog.vue +0 -0
- package/{components/dialog → dialog}/AddCustomBadgeDialog.vue +0 -0
- package/{components/dialog → dialog}/AddProjectMemberDialog.vue +0 -0
- package/{components/dialog → dialog}/AddonConfigConfirmationDialog.vue +0 -0
- package/{components/dialog → dialog}/DrainNode.vue +0 -0
- package/{components/dialog → dialog}/ForceMachineRemoveDialog.vue +0 -0
- package/{components/dialog → dialog}/GenericPrompt.vue +0 -0
- package/{components/dialog → dialog}/RollbackWorkloadDialog.vue +0 -0
- package/{components/dialog → dialog}/RotateCertificatesDialog.vue +0 -0
- package/{components/dialog → dialog}/RotateEncryptionKeyDialog.vue +0 -0
- package/{components/dialog → dialog}/SaveAsRKETemplateDialog.vue +0 -0
- package/{components/dialog → dialog}/ScaleMachineDownDialog.vue +0 -0
- package/edit/auth/azuread.vue +20 -1
- package/edit/cloudcredential.vue +7 -1
- package/edit/management.cattle.io.project.vue +2 -2
- package/edit/namespace.vue +17 -10
- package/edit/networking.k8s.io.ingress/index.vue +2 -1
- package/edit/persistentvolumeclaim.vue +33 -2
- package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +1 -1
- package/edit/provisioning.cattle.io.cluster/MachinePool.vue +34 -6
- package/edit/provisioning.cattle.io.cluster/index.vue +1 -1
- package/edit/provisioning.cattle.io.cluster/rke2.vue +21 -6
- package/edit/service.vue +1 -1
- package/edit/workload/index.vue +363 -15
- package/edit/workload/mixins/workload.js +62 -7
- package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +1 -0
- package/layouts/default.vue +52 -27
- package/layouts/error.vue +5 -1
- package/layouts/home.vue +6 -2
- package/list/harvesterhci.io.management.cluster.vue +74 -33
- package/list/namespace.vue +3 -5
- package/list/provisioning.cattle.io.cluster.vue +6 -0
- package/machine-config/amazonec2.vue +2 -0
- package/machine-config/harvester.vue +96 -49
- package/middleware/authenticated.js +56 -52
- package/mixins/brand.js +3 -4
- package/mixins/create-edit-view/impl.js +0 -8
- package/mixins/form-validation.js +1 -1
- package/mixins/resource-fetch.js +3 -1
- package/models/chart.js +1 -1
- package/models/cluster/node.js +12 -1
- package/models/fleet.cattle.io.bundle.js +26 -19
- package/models/harvesterhci.io.management.cluster.js +194 -5
- package/models/management.cattle.io.cluster.js +1 -1
- package/models/management.cattle.io.clusterroletemplatebinding.js +9 -0
- package/models/management.cattle.io.globalrole.js +0 -19
- package/models/management.cattle.io.project.js +23 -2
- package/models/management.cattle.io.roletemplate.js +2 -21
- package/models/namespace.js +19 -3
- package/models/pod.js +19 -2
- package/models/provisioning.cattle.io.cluster.js +71 -0
- package/models/service.js +5 -1
- package/models/workload.js +4 -243
- package/models/workload.service.js +314 -0
- package/nuxt.config.js +14 -12
- package/package.json +3 -3
- package/pages/auth/login.vue +11 -2
- package/pages/auth/setup.vue +1 -1
- package/pages/c/_cluster/_product/members/index.vue +3 -93
- package/pages/c/_cluster/_product/projectsnamespaces.vue +6 -403
- package/pages/c/_cluster/apps/charts/install.vue +0 -6
- package/pages/c/_cluster/settings/performance.vue +19 -16
- package/pages/fail-whale.vue +1 -10
- package/pages/index.vue +18 -4
- package/pages/plugins.vue +2 -2
- package/pages/prefs.vue +8 -6
- package/pkg/auto-import.js +44 -7
- package/pkg/dynamic-plugin-loader.js +28 -0
- package/pkg/import.js +2 -2
- package/pkg/model-loader-require.lib.js +3 -0
- package/pkg/vue.config.js +9 -6
- package/plugins/console.js +10 -5
- package/plugins/dashboard-store/actions.js +8 -3
- package/plugins/dashboard-store/getters.js +7 -2
- package/plugins/dashboard-store/model-loader-require.js +12 -0
- package/plugins/dashboard-store/model-loader.js +4 -1
- package/plugins/dashboard-store/resource-class.js +10 -3
- package/plugins/steve/actions.js +1 -1
- package/plugins/steve/index.js +6 -4
- package/plugins/steve/steve-description-class.js +32 -0
- package/plugins/steve/subscribe.js +34 -23
- package/rancher-components/Banner/Banner.vue +2 -2
- package/rancher-components/Form/Checkbox/Checkbox.test.ts +77 -0
- package/rancher-components/Form/Checkbox/Checkbox.vue +12 -2
- package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +0 -2
- package/rancher-components/Form/LabeledInput/LabeledInput.vue +2 -0
- package/rancher-components/Form/Radio/RadioButton.vue +14 -1
- package/rancher-components/Form/ToggleSwitch/ToggleSwitch.test.ts +107 -0
- package/{components/form → rancher-components/Form/ToggleSwitch}/ToggleSwitch.vue +18 -8
- package/rancher-components/Form/ToggleSwitch/index.ts +1 -0
- package/rancher-components/Form/index.ts +1 -0
- package/scripts/build-pkg.sh +48 -2
- package/scripts/drone-build-pkg.sh +31 -0
- package/scripts/publish-shell.sh +10 -11
- package/scripts/serve-pkgs +17 -10
- package/scripts/test-plugins-build.sh +18 -1
- package/store/catalog.js +3 -1
- package/store/i18n.js +16 -11
- package/store/index.js +4 -181
- package/store/prefs.js +30 -2
- package/store/type-map.js +16 -29
- package/types/{index.d.ts → rancher/index.d.ts} +0 -0
- package/utils/cluster.js +1 -1
- package/utils/custom-validators.js +1 -12
- package/utils/dynamic-importer.js +1 -1
- package/utils/validators/setting.js +0 -35
- package/components/FilterLabel.vue +0 -254
- package/components/HarvesterUpgradeProgressBarList.vue +0 -109
- package/components/VMConsoleBar.vue +0 -87
- package/components/dialog/harvester/AddHotplugModal.vue +0 -159
- package/components/dialog/harvester/BackupModal.vue +0 -117
- package/components/dialog/harvester/CloneTemplate.vue +0 -125
- package/components/dialog/harvester/EjectCDROMDialog.vue +0 -157
- package/components/dialog/harvester/ExportImageDialog.vue +0 -152
- package/components/dialog/harvester/MaintenanceDialog.vue +0 -94
- package/components/dialog/harvester/MigrationDialog.vue +0 -154
- package/components/dialog/harvester/RestoreDialog.vue +0 -153
- package/components/dialog/harvester/SupportBundle.vue +0 -217
- package/components/dialog/harvester/UnplugVolume.vue +0 -108
- package/components/form/SerialConsole/index.vue +0 -267
- package/components/formatter/AttachVMWithName.vue +0 -46
- package/components/formatter/CloudInitType.vue +0 -27
- package/components/formatter/HarvesterBackupTargetValidation.vue +0 -43
- package/components/formatter/HarvesterCPUUsed.vue +0 -122
- package/components/formatter/HarvesterDiskState.vue +0 -66
- package/components/formatter/HarvesterHostName.vue +0 -66
- package/components/formatter/HarvesterIpAddress.vue +0 -90
- package/components/formatter/HarvesterMemoryUsed.vue +0 -140
- package/components/formatter/HarvesterMigrationState.vue +0 -85
- package/components/formatter/HarvesterNodeName.vue +0 -49
- package/components/formatter/HarvesterStorageUsed.vue +0 -194
- package/components/formatter/HarvesterVmState.vue +0 -123
- package/components/nav/HarvesterUpgrade.vue +0 -232
- package/components/novnc/NovncConsole.vue +0 -93
- package/components/novnc/NovncConsoleItem.vue +0 -89
- package/components/novnc/NovncConsoleWrapper.vue +0 -243
- package/config/harvester-map.js +0 -44
- package/config/harvester-table-headers.js +0 -27
- package/config/product/harvester.js +0 -305
- package/detail/harvesterhci.io.host/HarvesterHostBasic.vue +0 -364
- package/detail/harvesterhci.io.host/HarvesterHostDisk.vue +0 -200
- package/detail/harvesterhci.io.host/HarvesterHostNetwork.vue +0 -89
- package/detail/harvesterhci.io.host/VirtualMachineInstance.vue +0 -134
- package/detail/harvesterhci.io.host/index.vue +0 -243
- package/detail/harvesterhci.io.virtualmachinebackup/index.vue +0 -221
- package/detail/harvesterhci.io.virtualmachineimage.vue +0 -118
- package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineBasics.vue +0 -279
- package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineEvents.vue +0 -75
- package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineKeypairs.vue +0 -114
- package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineMigration.vue +0 -79
- package/detail/kubevirt.io.virtualmachine/index.vue +0 -213
- package/edit/harvesterhci.io.cloudtemplate.vue +0 -123
- package/edit/harvesterhci.io.host/HarvesterDisk.vue +0 -262
- package/edit/harvesterhci.io.host/index.vue +0 -533
- package/edit/harvesterhci.io.keypair.vue +0 -112
- package/edit/harvesterhci.io.managedchart/index.vue +0 -25
- package/edit/harvesterhci.io.managedchart/rancher-monitoring.vue +0 -172
- package/edit/harvesterhci.io.networkattachmentdefinition.vue +0 -210
- package/edit/harvesterhci.io.setting/additional-ca.vue +0 -36
- package/edit/harvesterhci.io.setting/backup-target.vue +0 -182
- package/edit/harvesterhci.io.setting/http-proxy.vue +0 -79
- package/edit/harvesterhci.io.setting/index.vue +0 -201
- package/edit/harvesterhci.io.setting/overcommit-config.vue +0 -94
- package/edit/harvesterhci.io.setting/ssl-certificates.vue +0 -117
- package/edit/harvesterhci.io.setting/ssl-parameters.vue +0 -161
- package/edit/harvesterhci.io.setting/support-bundle-image.vue +0 -134
- package/edit/harvesterhci.io.setting/support-bundle-namespaces.vue +0 -73
- package/edit/harvesterhci.io.setting/vip-pools.vue +0 -244
- package/edit/harvesterhci.io.setting/vm-force-reset-policy.vue +0 -81
- package/edit/harvesterhci.io.virtualmachinebackup.vue +0 -256
- package/edit/harvesterhci.io.virtualmachineimage.vue +0 -364
- package/edit/harvesterhci.io.virtualmachinetemplateversion.vue +0 -340
- package/edit/harvesterhci.io.volume.vue +0 -195
- package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/AccessCredentialsUsers.vue +0 -190
- package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/index.vue +0 -212
- package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/type/basicAuth.vue +0 -94
- package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/type/sshkey.vue +0 -85
- package/edit/kubevirt.io.virtualmachine/VirtualMachineCloudConfig/DataTemplate.vue +0 -153
- package/edit/kubevirt.io.virtualmachine/VirtualMachineCloudConfig/index.vue +0 -279
- package/edit/kubevirt.io.virtualmachine/VirtualMachineCpuMemory.vue +0 -113
- package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/__tests__/HarvesterEditNetwork.test.ts +0 -41
- package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/base.vue +0 -281
- package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/index.vue +0 -142
- package/edit/kubevirt.io.virtualmachine/VirtualMachineReserved.vue +0 -54
- package/edit/kubevirt.io.virtualmachine/VirtualMachineSSHKey.vue +0 -256
- package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/index.vue +0 -391
- package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditContainer.test.ts +0 -40
- package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditExisting.test.ts +0 -102
- package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditVMImage.test.ts +0 -117
- package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditVolume.test.ts +0 -74
- package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/container.vue +0 -132
- package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/existing.vue +0 -303
- package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/vmImage.vue +0 -285
- package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/volume.vue +0 -188
- package/edit/kubevirt.io.virtualmachine/index.vue +0 -642
- package/edit/network.harvesterhci.io.clusternetwork/index.vue +0 -19
- package/edit/network.harvesterhci.io.clusternetwork/vlan.vue +0 -134
- package/edit/workload/types/Deployment.vue +0 -377
- package/edit/workload/types/Generic.vue +0 -295
- package/list/harvesterhci.io.cloudtemplate.vue +0 -78
- package/list/harvesterhci.io.dashboard/HarvesterUpgrade.vue +0 -211
- package/list/harvesterhci.io.dashboard/UpgradeInfo.vue +0 -40
- package/list/harvesterhci.io.dashboard/index.vue +0 -752
- package/list/harvesterhci.io.host/index.vue +0 -186
- package/list/harvesterhci.io.networkattachmentdefinition.vue +0 -167
- package/list/harvesterhci.io.setting.vue +0 -241
- package/list/harvesterhci.io.virtualmachinebackup.vue +0 -172
- package/list/harvesterhci.io.virtualmachineimage.vue +0 -80
- package/list/harvesterhci.io.virtualmachinetemplateversion.vue +0 -173
- package/list/harvesterhci.io.volume.vue +0 -122
- package/list/kubevirt.io.virtualmachine.vue +0 -193
- package/mixins/harvester-vm/impl.js +0 -267
- package/mixins/harvester-vm/index.js +0 -1357
- package/models/harvester/configmap.js +0 -32
- package/models/harvester/harvesterhci.io.blockdevice.js +0 -55
- package/models/harvester/harvesterhci.io.keypair.js +0 -12
- package/models/harvester/harvesterhci.io.setting.js +0 -127
- package/models/harvester/harvesterhci.io.supportbundle.js +0 -35
- package/models/harvester/harvesterhci.io.upgrade.js +0 -226
- package/models/harvester/harvesterhci.io.virtualmachinebackup.js +0 -116
- package/models/harvester/harvesterhci.io.virtualmachineimage.js +0 -255
- package/models/harvester/harvesterhci.io.virtualmachinerestore.js +0 -43
- package/models/harvester/harvesterhci.io.virtualmachinetemplate.js +0 -69
- package/models/harvester/harvesterhci.io.virtualmachinetemplateversion.js +0 -227
- package/models/harvester/k8s.cni.cncf.io.networkattachmentdefinition.js +0 -32
- package/models/harvester/kubevirt.io.virtualmachine.js +0 -850
- package/models/harvester/kubevirt.io.virtualmachineinstance.js +0 -142
- package/models/harvester/management.cattle.io.managedchart.js +0 -191
- package/models/harvester/management.cattle.io.setting.js +0 -40
- package/models/harvester/network.harvesterhci.io.clusternetwork.js +0 -100
- package/models/harvester/network.harvesterhci.io.nodenetwork.js +0 -34
- package/models/harvester/node.js +0 -255
- package/models/harvester/persistentvolumeclaim.js +0 -166
- package/models/harvester/pod.js +0 -185
- package/pages/c/_cluster/harvester/airgapupgrade/index.vue +0 -309
- package/pages/c/_cluster/harvester/console/_uid/serial.vue +0 -51
- package/pages/c/_cluster/harvester/console/_uid/vnc.vue +0 -52
- package/pages/c/_cluster/harvester/index.vue +0 -24
- package/pages/c/_cluster/harvester/support/index.vue +0 -154
- package/pkg/model-loader.lib.js +0 -3
- package/plugins/lookup.js +0 -50
- package/promptRemove/kubevirt.io.virtualmachine.vue +0 -164
- package/store/harvester-common.js +0 -126
- package/utils/validators/vm-datavolumes.js +0 -38
- package/utils/validators/vm-image.js +0 -32
- package/utils/validators/vm.js +0 -221
- package/yarn-error.log +0 -196
package/pages/auth/login.vue
CHANGED
|
@@ -3,6 +3,7 @@ import { removeObject } from '@shell/utils/array';
|
|
|
3
3
|
import { USERNAME } from '@shell/config/cookies';
|
|
4
4
|
import { LabeledInput } from '@components/Form/LabeledInput';
|
|
5
5
|
import AsyncButton from '@shell/components/AsyncButton';
|
|
6
|
+
import LocaleSelector from '@shell/components/LocaleSelector';
|
|
6
7
|
import BrandImage from '@shell/components/BrandImage';
|
|
7
8
|
import InfoBox from '@shell/components/InfoBox';
|
|
8
9
|
import CopyCode from '@shell/components/CopyCode';
|
|
@@ -30,7 +31,7 @@ export default {
|
|
|
30
31
|
name: 'Login',
|
|
31
32
|
layout: 'unauthenticated',
|
|
32
33
|
components: {
|
|
33
|
-
LabeledInput, AsyncButton, Checkbox, BrandImage, Banner, InfoBox, CopyCode, Password
|
|
34
|
+
LabeledInput, AsyncButton, Checkbox, BrandImage, Banner, InfoBox, CopyCode, Password, LocaleSelector
|
|
34
35
|
},
|
|
35
36
|
|
|
36
37
|
async asyncData({ route, redirect, store }) {
|
|
@@ -164,7 +165,7 @@ export default {
|
|
|
164
165
|
|
|
165
166
|
kubectlCmd() {
|
|
166
167
|
return "kubectl get secret --namespace cattle-system bootstrap-secret -o go-template='{{.data.bootstrapPassword|base64decode}}{{\"\\n\"}}'";
|
|
167
|
-
}
|
|
168
|
+
},
|
|
168
169
|
|
|
169
170
|
},
|
|
170
171
|
|
|
@@ -393,6 +394,9 @@ export default {
|
|
|
393
394
|
{{ nonLocalPrompt }}
|
|
394
395
|
</a>
|
|
395
396
|
</div>
|
|
397
|
+
<div class="locale-elector">
|
|
398
|
+
<LocaleSelector></LocaleSelector>
|
|
399
|
+
</div>
|
|
396
400
|
</template>
|
|
397
401
|
</div>
|
|
398
402
|
|
|
@@ -435,4 +439,9 @@ export default {
|
|
|
435
439
|
}
|
|
436
440
|
}
|
|
437
441
|
}
|
|
442
|
+
|
|
443
|
+
.locale-elector {
|
|
444
|
+
position: absolute;
|
|
445
|
+
bottom: 30px;
|
|
446
|
+
}
|
|
438
447
|
</style>
|
package/pages/auth/setup.vue
CHANGED
|
@@ -114,7 +114,7 @@ export default {
|
|
|
114
114
|
setVendor(plSetting.value);
|
|
115
115
|
}
|
|
116
116
|
|
|
117
|
-
const productName = plSetting.default
|
|
117
|
+
const productName = plSetting.default;
|
|
118
118
|
|
|
119
119
|
const principals = await store.dispatch('rancher/findAll', { type: NORMAN.PRINCIPAL, opt: { url: '/v3/principals' } });
|
|
120
120
|
const me = findBy(principals, 'me', true);
|
|
@@ -1,96 +1,6 @@
|
|
|
1
1
|
<script>
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
import Loading from '@shell/components/Loading';
|
|
5
|
-
import Masthead from '@shell/components/ResourceList/Masthead';
|
|
6
|
-
import { AGE, ROLE, STATE, PRINCIPAL } from '@shell/config/table-headers';
|
|
7
|
-
import { canViewClusterPermissionsEditor } from '@shell/components/form/Members/ClusterPermissionsEditor.vue';
|
|
8
|
-
import Banner from '@components/Banner/Banner.vue';
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Explorer members page.
|
|
12
|
-
* Route: /c/local/explorer/members
|
|
13
|
-
*/
|
|
14
|
-
export default {
|
|
15
|
-
|
|
16
|
-
name: 'ExplorerMembers',
|
|
17
|
-
|
|
18
|
-
components: {
|
|
19
|
-
Banner, Loading, Masthead, ResourceTable
|
|
20
|
-
},
|
|
21
|
-
|
|
22
|
-
async fetch() {
|
|
23
|
-
const clusterRoleTemplateBindingSchema = this.$store.getters[`rancher/schemaFor`](NORMAN.CLUSTER_ROLE_TEMPLATE_BINDING);
|
|
24
|
-
|
|
25
|
-
const hydration = [
|
|
26
|
-
clusterRoleTemplateBindingSchema ? this.$store.dispatch(`rancher/findAll`, { type: NORMAN.CLUSTER_ROLE_TEMPLATE_BINDING }, { root: true }) : [],
|
|
27
|
-
clusterRoleTemplateBindingSchema ? this.$store.dispatch(`management/findAll`, { type: MANAGEMENT.CLUSTER_ROLE_TEMPLATE_BINDING }) : [],
|
|
28
|
-
this.$store.dispatch('rancher/findAll', { type: NORMAN.PRINCIPAL }),
|
|
29
|
-
this.$store.dispatch(`management/findAll`, { type: MANAGEMENT.USER }),
|
|
30
|
-
this.$store.dispatch(`management/findAll`, { type: MANAGEMENT.ROLE_TEMPLATE }),
|
|
31
|
-
];
|
|
32
|
-
const [clusterRoleTemplateBindings] = await Promise.all(hydration);
|
|
33
|
-
const steveBindings = await Promise.all(clusterRoleTemplateBindings.map(b => b.steve));
|
|
34
|
-
|
|
35
|
-
this.$set(this, 'clusterRoleTemplateBindings', steveBindings);
|
|
36
|
-
},
|
|
37
|
-
|
|
38
|
-
data() {
|
|
39
|
-
return {
|
|
40
|
-
schema: this.$store.getters[`management/schemaFor`](MANAGEMENT.CLUSTER_ROLE_TEMPLATE_BINDING),
|
|
41
|
-
headers: [
|
|
42
|
-
STATE,
|
|
43
|
-
PRINCIPAL,
|
|
44
|
-
ROLE,
|
|
45
|
-
AGE
|
|
46
|
-
],
|
|
47
|
-
createLocation: {
|
|
48
|
-
name: 'c-cluster-product-resource-create',
|
|
49
|
-
params: {
|
|
50
|
-
product: this.$store.getters['currentProduct'].name,
|
|
51
|
-
resource: MANAGEMENT.CLUSTER_ROLE_TEMPLATE_BINDING,
|
|
52
|
-
}
|
|
53
|
-
},
|
|
54
|
-
resource: MANAGEMENT.CLUSTER_ROLE_TEMPLATE_BINDING,
|
|
55
|
-
clusterRoleTemplateBindings: [],
|
|
56
|
-
VIRTUAL_TYPES
|
|
57
|
-
};
|
|
58
|
-
},
|
|
59
|
-
|
|
60
|
-
computed: {
|
|
61
|
-
filteredClusterRoleTemplateBindings() {
|
|
62
|
-
return this.clusterRoleTemplateBindings
|
|
63
|
-
.filter(b => b.clusterName === this.$store.getters['currentCluster'].id);
|
|
64
|
-
},
|
|
65
|
-
canManageMembers() {
|
|
66
|
-
return canViewClusterPermissionsEditor(this.$store);
|
|
67
|
-
},
|
|
68
|
-
isLocal() {
|
|
69
|
-
return this.$store.getters['currentCluster'].isLocal;
|
|
70
|
-
}
|
|
71
|
-
},
|
|
72
|
-
};
|
|
2
|
+
import ExplorerMembers from '@shell/components/ExplorerMembers';
|
|
3
|
+
export default { components: { ExplorerMembers } };
|
|
73
4
|
</script>
|
|
74
5
|
|
|
75
|
-
<template>
|
|
76
|
-
<Loading v-if="$fetchState.pending" />
|
|
77
|
-
<div v-else>
|
|
78
|
-
<Masthead
|
|
79
|
-
:schema="schema"
|
|
80
|
-
:resource="resource"
|
|
81
|
-
:favorite-resource="VIRTUAL_TYPES.CLUSTER_MEMBERS"
|
|
82
|
-
:create-location="createLocation"
|
|
83
|
-
:create-button-label="t('members.createActionLabel')"
|
|
84
|
-
/>
|
|
85
|
-
<Banner v-if="isLocal" color="error" :label="t('members.localClusterWarning')" />
|
|
86
|
-
<ResourceTable
|
|
87
|
-
:schema="schema"
|
|
88
|
-
:headers="headers"
|
|
89
|
-
:rows="filteredClusterRoleTemplateBindings"
|
|
90
|
-
:groupable="false"
|
|
91
|
-
:namespaced="false"
|
|
92
|
-
sub-search="subSearch"
|
|
93
|
-
:sub-fields="['nameDisplay']"
|
|
94
|
-
/>
|
|
95
|
-
</div>
|
|
96
|
-
</template>
|
|
6
|
+
<template><ExplorerMembers v-bind="$attrs" /></template>
|
|
@@ -1,403 +1,6 @@
|
|
|
1
|
-
<script>
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
import { PROJECT_ID } from '@shell/config/query-params';
|
|
8
|
-
import Masthead from '@shell/components/ResourceList/Masthead';
|
|
9
|
-
import { mapPref, GROUP_RESOURCES, DEV } from '@shell/store/prefs';
|
|
10
|
-
import MoveModal from '@shell/components/MoveModal';
|
|
11
|
-
import { defaultTableSortGenerationFn } from '@shell/components/ResourceTable.vue';
|
|
12
|
-
import { NAMESPACE_FILTER_ALL_ORPHANS } from '@shell/utils/namespace-filter';
|
|
13
|
-
import { mapGetters } from 'vuex';
|
|
14
|
-
|
|
15
|
-
export default {
|
|
16
|
-
name: 'ListNamespace',
|
|
17
|
-
components: {
|
|
18
|
-
Loading, Masthead, MoveModal, ResourceTable
|
|
19
|
-
},
|
|
20
|
-
|
|
21
|
-
props: {},
|
|
22
|
-
|
|
23
|
-
async fetch() {
|
|
24
|
-
const inStore = this.$store.getters['currentStore'](NAMESPACE);
|
|
25
|
-
|
|
26
|
-
this.schema = this.$store.getters[`${ inStore }/schemaFor`](NAMESPACE);
|
|
27
|
-
this.projectSchema = this.$store.getters[`management/schemaFor`](MANAGEMENT.PROJECT);
|
|
28
|
-
|
|
29
|
-
if ( !this.schema ) {
|
|
30
|
-
// clusterReady: When switching routes, it will cause clusterReady to change, causing itself to repeat rendering。
|
|
31
|
-
// this.$store.dispatch('loadingError', `Type ${ NAMESPACE } not found`);
|
|
32
|
-
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
this.namespaces = await this.$store.dispatch(`${ inStore }/findAll`, { type: NAMESPACE });
|
|
37
|
-
this.projects = await this.$store.dispatch('management/findAll', { type: MANAGEMENT.PROJECT, opt: { force: true } });
|
|
38
|
-
},
|
|
39
|
-
|
|
40
|
-
data() {
|
|
41
|
-
return {
|
|
42
|
-
schema: null,
|
|
43
|
-
namespaces: [],
|
|
44
|
-
projects: [],
|
|
45
|
-
projectSchema: null,
|
|
46
|
-
MANAGEMENT,
|
|
47
|
-
VIRTUAL_TYPES
|
|
48
|
-
};
|
|
49
|
-
},
|
|
50
|
-
|
|
51
|
-
computed: {
|
|
52
|
-
...mapGetters(['currentCluster']),
|
|
53
|
-
|
|
54
|
-
isNamespaceCreatable() {
|
|
55
|
-
return (this.schema?.collectionMethods || []).includes('POST');
|
|
56
|
-
},
|
|
57
|
-
headers() {
|
|
58
|
-
const project = {
|
|
59
|
-
name: 'project',
|
|
60
|
-
label: 'Project',
|
|
61
|
-
value: 'project.nameDisplay',
|
|
62
|
-
sort: ['projectNameSort', 'nameSort'],
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
return [
|
|
66
|
-
STATE,
|
|
67
|
-
NAME,
|
|
68
|
-
this.groupPreference === 'none' ? project : null,
|
|
69
|
-
AGE
|
|
70
|
-
].filter(h => h);
|
|
71
|
-
},
|
|
72
|
-
projectIdsWithNamespaces() {
|
|
73
|
-
const ids = this.rows
|
|
74
|
-
.map(row => row.projectId)
|
|
75
|
-
.filter(id => id);
|
|
76
|
-
|
|
77
|
-
return uniq(ids);
|
|
78
|
-
},
|
|
79
|
-
clusterProjects() {
|
|
80
|
-
const clusterId = this.$store.getters['currentCluster'].id;
|
|
81
|
-
|
|
82
|
-
// Get the list of projects from the store so that the list
|
|
83
|
-
// is updated if a new project is created or removed.
|
|
84
|
-
const projectsInAllClusters = this.$store.getters['management/all'](MANAGEMENT.PROJECT);
|
|
85
|
-
|
|
86
|
-
const clustersInProjects = projectsInAllClusters.filter(project => project.spec.clusterName === clusterId);
|
|
87
|
-
|
|
88
|
-
return clustersInProjects;
|
|
89
|
-
},
|
|
90
|
-
projectsWithoutNamespaces() {
|
|
91
|
-
return this.activeProjects.filter((project) => {
|
|
92
|
-
return !this.projectIdsWithNamespaces.find(item => project?.id?.endsWith(`/${ item }`));
|
|
93
|
-
});
|
|
94
|
-
},
|
|
95
|
-
// We're using this because we need to show projects as groups even if the project doesn't have any namespaces.
|
|
96
|
-
rowsWithFakeNamespaces() {
|
|
97
|
-
const fakeRows = this.projectsWithoutNamespaces.map((project) => {
|
|
98
|
-
return {
|
|
99
|
-
groupByLabel: `${ ('resourceTable.groupLabel.notInAProject') }-${ project.id }`,
|
|
100
|
-
isFake: true,
|
|
101
|
-
mainRowKey: project.id,
|
|
102
|
-
nameDisplay: project.spec?.displayName, // Enable filtering by the project name
|
|
103
|
-
project,
|
|
104
|
-
availableActions: []
|
|
105
|
-
};
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
if (this.showMockNotInProjectGroup) {
|
|
109
|
-
fakeRows.push( {
|
|
110
|
-
groupByLabel: this.t('resourceTable.groupLabel.notInAProject'), // Same as the groupByLabel for the namespace model
|
|
111
|
-
mainRowKey: 'fake-empty',
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
return [...this.rows, ...fakeRows];
|
|
116
|
-
},
|
|
117
|
-
createProjectLocation() {
|
|
118
|
-
return {
|
|
119
|
-
name: 'c-cluster-product-resource-create',
|
|
120
|
-
params: {
|
|
121
|
-
product: this.$store.getters['currentProduct'].name,
|
|
122
|
-
resource: MANAGEMENT.PROJECT
|
|
123
|
-
},
|
|
124
|
-
};
|
|
125
|
-
},
|
|
126
|
-
groupPreference: mapPref(GROUP_RESOURCES),
|
|
127
|
-
activeNamespaceFilters() {
|
|
128
|
-
return this.$store.getters['activeNamespaceFilters'];
|
|
129
|
-
},
|
|
130
|
-
activeProjectFilters() {
|
|
131
|
-
const activeProjects = {};
|
|
132
|
-
|
|
133
|
-
for (const filter of this.activeNamespaceFilters) {
|
|
134
|
-
const [type, id] = filter.split('://', 2);
|
|
135
|
-
|
|
136
|
-
if (type === 'project') {
|
|
137
|
-
activeProjects[id] = true;
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
return activeProjects;
|
|
142
|
-
},
|
|
143
|
-
activeProjects() {
|
|
144
|
-
const namespaceFilters = this.$store.getters['activeNamespaceFilters'];
|
|
145
|
-
|
|
146
|
-
if (namespaceFilters.includes(NAMESPACE_FILTER_ALL_ORPHANS) && Object.keys(this.activeProjectFilters).length === 0) {
|
|
147
|
-
// If the user wants to only see namespaces that are not
|
|
148
|
-
// in a project, don't show any projects.
|
|
149
|
-
return [];
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
// If the user is not filtering by any projects or namespaces, return
|
|
153
|
-
// all projects in the cluster.
|
|
154
|
-
if (!this.userIsFilteringForSpecificNamespaceOrProject()) {
|
|
155
|
-
return this.clusterProjects;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
// Filter out projects that are not selected in the top nav.
|
|
159
|
-
return this.clusterProjects.filter((projectData) => {
|
|
160
|
-
const projectId = projectData.id.split('/')[1];
|
|
161
|
-
|
|
162
|
-
return !!this.activeProjectFilters[projectId];
|
|
163
|
-
});
|
|
164
|
-
},
|
|
165
|
-
activeNamespaces() {
|
|
166
|
-
// Apply namespace filters from the top nav.
|
|
167
|
-
const activeNamespaces = this.$store.getters['namespaces']();
|
|
168
|
-
|
|
169
|
-
return this.namespaces.filter((namespaceData) => {
|
|
170
|
-
return !!activeNamespaces[namespaceData.metadata.name];
|
|
171
|
-
});
|
|
172
|
-
},
|
|
173
|
-
filteredRows() {
|
|
174
|
-
return this.groupPreference === 'none' ? this.rows : this.rowsWithFakeNamespaces;
|
|
175
|
-
},
|
|
176
|
-
rows() {
|
|
177
|
-
if (this.$store.getters['prefs/get'](DEV)) {
|
|
178
|
-
// If developer tools are turned on in the user preferences,
|
|
179
|
-
// return all namespaces including system namespaces and RBAC
|
|
180
|
-
// management namespaces.
|
|
181
|
-
return this.activeNamespaces;
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
const isVirtualCluster = this.$store.getters['isVirtualCluster'];
|
|
185
|
-
|
|
186
|
-
return this.activeNamespaces.filter((namespace) => {
|
|
187
|
-
const isSettingSystemNamespace = this.$store.getters['systemNamespaces'].includes(namespace.metadata.name);
|
|
188
|
-
|
|
189
|
-
const systemNS = namespace.isSystem || namespace.isFleetManaged || isSettingSystemNamespace;
|
|
190
|
-
|
|
191
|
-
// For Harvester, filter out system namespaces AND obscure namespaces.
|
|
192
|
-
if (isVirtualCluster) {
|
|
193
|
-
return !systemNS && !namespace.isObscure;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
// Otherwise only filter out obscure namespaces, such as namespaces
|
|
197
|
-
// that Rancher uses to manage RBAC for projects, which should not be
|
|
198
|
-
// edited or deleted by Rancher users.
|
|
199
|
-
return !namespace.isObscure;
|
|
200
|
-
});
|
|
201
|
-
},
|
|
202
|
-
|
|
203
|
-
canSeeProjectlessNamespaces() {
|
|
204
|
-
return this.currentCluster.canUpdate;
|
|
205
|
-
},
|
|
206
|
-
|
|
207
|
-
showMockNotInProjectGroup() {
|
|
208
|
-
if (!this.canSeeProjectlessNamespaces) {
|
|
209
|
-
return false;
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
const someNamespacesAreNotInProject = !this.rows.some(row => !row.project);
|
|
213
|
-
|
|
214
|
-
// Hide the "Not in a Project" group if the user is filtering
|
|
215
|
-
// for specific namespaces or projects.
|
|
216
|
-
const usingSpecificFilter = this.userIsFilteringForSpecificNamespaceOrProject();
|
|
217
|
-
|
|
218
|
-
return !usingSpecificFilter && someNamespacesAreNotInProject;
|
|
219
|
-
},
|
|
220
|
-
|
|
221
|
-
notInProjectKey() {
|
|
222
|
-
return this.$store.getters['i18n/t']('resourceTable.groupLabel.notInAProject');
|
|
223
|
-
}
|
|
224
|
-
},
|
|
225
|
-
methods: {
|
|
226
|
-
userIsFilteringForSpecificNamespaceOrProject() {
|
|
227
|
-
const activeFilters = this.$store.getters['namespaceFilters'];
|
|
228
|
-
|
|
229
|
-
for (let i = 0; i < activeFilters.length; i++) {
|
|
230
|
-
const filter = activeFilters[i];
|
|
231
|
-
const filterType = filter.split('://')[0];
|
|
232
|
-
|
|
233
|
-
if (filterType === 'ns' || filterType === 'project') {
|
|
234
|
-
return true;
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
return false;
|
|
239
|
-
},
|
|
240
|
-
slotName(project) {
|
|
241
|
-
return `main-row:${ project.id }`;
|
|
242
|
-
},
|
|
243
|
-
createNamespaceLocation(group) {
|
|
244
|
-
const project = group.rows[0].project;
|
|
245
|
-
|
|
246
|
-
return {
|
|
247
|
-
name: 'c-cluster-product-resource-create',
|
|
248
|
-
params: {
|
|
249
|
-
product: this.$store.getters['currentProduct'].name,
|
|
250
|
-
resource: NAMESPACE
|
|
251
|
-
},
|
|
252
|
-
query: { [PROJECT_ID]: project?.metadata.name }
|
|
253
|
-
};
|
|
254
|
-
},
|
|
255
|
-
showProjectAction(event, group) {
|
|
256
|
-
const project = group.rows[0].project;
|
|
257
|
-
|
|
258
|
-
this.$store.commit(`action-menu/show`, {
|
|
259
|
-
resources: [project],
|
|
260
|
-
elem: event.target
|
|
261
|
-
});
|
|
262
|
-
},
|
|
263
|
-
showProjectActionButton(group) {
|
|
264
|
-
const project = group.rows[0].project;
|
|
265
|
-
|
|
266
|
-
return !!project;
|
|
267
|
-
},
|
|
268
|
-
projectLabel(group) {
|
|
269
|
-
const row = group.rows[0];
|
|
270
|
-
|
|
271
|
-
if (row.isFake) {
|
|
272
|
-
return this.t('resourceTable.groupLabel.project', { name: row.project?.nameDisplay }, true);
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
return row.groupByLabel;
|
|
276
|
-
},
|
|
277
|
-
|
|
278
|
-
projectDescription(group) {
|
|
279
|
-
const project = group.rows[0].project;
|
|
280
|
-
|
|
281
|
-
return project?.description;
|
|
282
|
-
},
|
|
283
|
-
|
|
284
|
-
clearSelection() {
|
|
285
|
-
this.$refs.table.clearSelection();
|
|
286
|
-
},
|
|
287
|
-
|
|
288
|
-
sortGenerationFn() {
|
|
289
|
-
// The sort generation function creates a unique value and is used to create a key including sort details.
|
|
290
|
-
// The unique key determines if the list is redrawn or a cached version is shown.
|
|
291
|
-
// Because we ensure the 'not in a project' group is there via a row, and timing issues, the unqiue key doesn't change
|
|
292
|
-
// after a namespace is removed... so the list won't update... so we need to inject a string to ensure the key is fresh
|
|
293
|
-
const base = defaultTableSortGenerationFn(this.schema, this.$store);
|
|
294
|
-
|
|
295
|
-
return base + (this.showMockNotInProjectGroup ? '-mock' : '');
|
|
296
|
-
},
|
|
297
|
-
|
|
298
|
-
}
|
|
299
|
-
};
|
|
300
|
-
</script>
|
|
301
|
-
|
|
302
|
-
<template>
|
|
303
|
-
<Loading v-if="$fetchState.pending" />
|
|
304
|
-
<div v-else class="project-namespaces">
|
|
305
|
-
<Masthead
|
|
306
|
-
:schema="projectSchema"
|
|
307
|
-
:type-display="t('projectNamespaces.label')"
|
|
308
|
-
:resource="MANAGEMENT.PROJECT"
|
|
309
|
-
:favorite-resource="VIRTUAL_TYPES.PROJECT_NAMESPACES"
|
|
310
|
-
:create-location="createProjectLocation"
|
|
311
|
-
:create-button-label="t('projectNamespaces.createProject')"
|
|
312
|
-
/>
|
|
313
|
-
<ResourceTable
|
|
314
|
-
ref="table"
|
|
315
|
-
class="table"
|
|
316
|
-
v-bind="$attrs"
|
|
317
|
-
:schema="schema"
|
|
318
|
-
:headers="headers"
|
|
319
|
-
:rows="filteredRows"
|
|
320
|
-
:groupable="true"
|
|
321
|
-
:sort-generation-fn="sortGenerationFn"
|
|
322
|
-
group-tooltip="resourceTable.groupBy.project"
|
|
323
|
-
key-field="_key"
|
|
324
|
-
v-on="$listeners"
|
|
325
|
-
>
|
|
326
|
-
<template #group-by="group">
|
|
327
|
-
<div class="project-bar" :class="{'has-description': projectDescription(group.group)}">
|
|
328
|
-
<div v-trim-whitespace class="group-tab">
|
|
329
|
-
<div class="project-name" v-html="projectLabel(group.group)" />
|
|
330
|
-
<div v-if="projectDescription(group.group)" class="description text-muted text-small">
|
|
331
|
-
{{ projectDescription(group.group) }}
|
|
332
|
-
</div>
|
|
333
|
-
</div>
|
|
334
|
-
<div class="right">
|
|
335
|
-
<n-link
|
|
336
|
-
v-if="isNamespaceCreatable && (canSeeProjectlessNamespaces || group.group.key !== notInProjectKey)"
|
|
337
|
-
class="create-namespace btn btn-sm role-secondary mr-5"
|
|
338
|
-
:to="createNamespaceLocation(group.group)"
|
|
339
|
-
>
|
|
340
|
-
{{ t('projectNamespaces.createNamespace') }}
|
|
341
|
-
</n-link>
|
|
342
|
-
<button type="button" class="project-action btn btn-sm role-multi-action actions mr-10" :class="{invisible: !showProjectActionButton(group.group)}" @click="showProjectAction($event, group.group)">
|
|
343
|
-
<i class="icon icon-actions" />
|
|
344
|
-
</button>
|
|
345
|
-
</div>
|
|
346
|
-
</div>
|
|
347
|
-
</template>
|
|
348
|
-
<template #cell:project="{row}">
|
|
349
|
-
<span v-if="row.project">{{ row.project.nameDisplay }}</span>
|
|
350
|
-
<span v-else class="text-muted">–</span>
|
|
351
|
-
</template>
|
|
352
|
-
<template v-for="project in projectsWithoutNamespaces" v-slot:[slotName(project)]>
|
|
353
|
-
<tr :key="project.id" class="main-row">
|
|
354
|
-
<td class="empty text-center" colspan="5">
|
|
355
|
-
{{ t('projectNamespaces.noNamespaces') }}
|
|
356
|
-
</td>
|
|
357
|
-
</tr>
|
|
358
|
-
</template>
|
|
359
|
-
<template #main-row:fake-empty>
|
|
360
|
-
<tr class="main-row">
|
|
361
|
-
<td class="empty text-center" colspan="5">
|
|
362
|
-
{{ t('projectNamespaces.noProjectNoNamespaces') }}
|
|
363
|
-
</td>
|
|
364
|
-
</tr>
|
|
365
|
-
</template>
|
|
366
|
-
</ResourceTable>
|
|
367
|
-
<MoveModal @moving="clearSelection" />
|
|
368
|
-
</div>
|
|
369
|
-
</template>
|
|
370
|
-
<style lang="scss" scoped>
|
|
371
|
-
.project-namespaces {
|
|
372
|
-
& ::v-deep {
|
|
373
|
-
.project-name {
|
|
374
|
-
line-height: 30px;
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
.project-bar {
|
|
378
|
-
display: flex;
|
|
379
|
-
flex-direction: row;
|
|
380
|
-
justify-content: space-between;
|
|
381
|
-
|
|
382
|
-
&.has-description {
|
|
383
|
-
.right {
|
|
384
|
-
margin-top: 5px;
|
|
385
|
-
}
|
|
386
|
-
.group-tab {
|
|
387
|
-
&, &::after {
|
|
388
|
-
height: 50px;
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
&::after {
|
|
392
|
-
right: -20px;
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
.description {
|
|
396
|
-
margin-top: -20px;
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
|
-
}
|
|
403
|
-
</style>
|
|
1
|
+
<script>
|
|
2
|
+
import ExplorerProjectsNamespaces from '@shell/components/ExplorerProjectsNamespaces';
|
|
3
|
+
export default { components: { ExplorerProjectsNamespaces } };
|
|
4
|
+
</script>
|
|
5
|
+
|
|
6
|
+
<template><ExplorerProjectsNamespaces v-bind="$attrs" /></template>
|
|
@@ -740,12 +740,6 @@ export default {
|
|
|
740
740
|
|
|
741
741
|
window.scrollTop = 0;
|
|
742
742
|
|
|
743
|
-
// For easy access debugging...
|
|
744
|
-
if ( typeof window !== 'undefined' ) {
|
|
745
|
-
window.v = this.value;
|
|
746
|
-
window.c = this;
|
|
747
|
-
}
|
|
748
|
-
|
|
749
743
|
this.preFormYamlOption = this.valuesComponent || this.hasQuestions ? VALUES_STATE.FORM : VALUES_STATE.YAML;
|
|
750
744
|
},
|
|
751
745
|
|
|
@@ -5,18 +5,8 @@ import AsyncButton from '@shell/components/AsyncButton';
|
|
|
5
5
|
import { Banner } from '@components/Banner';
|
|
6
6
|
import { LabeledInput } from '@components/Form/LabeledInput';
|
|
7
7
|
import { MANAGEMENT } from '@shell/config/types';
|
|
8
|
-
import { SETTING } from '@shell/config/settings';
|
|
8
|
+
import { DEFAULT_PERF_SETTING, SETTING } from '@shell/config/settings';
|
|
9
9
|
import { _EDIT, _VIEW } from '@shell/config/query-params';
|
|
10
|
-
const DEFAULT_PERF_SETTING = {
|
|
11
|
-
incrementalLoading: {
|
|
12
|
-
enabled: false,
|
|
13
|
-
threshold: 2500,
|
|
14
|
-
},
|
|
15
|
-
manualRefresh: {
|
|
16
|
-
enabled: false,
|
|
17
|
-
threshold: 2500,
|
|
18
|
-
}
|
|
19
|
-
};
|
|
20
10
|
|
|
21
11
|
export default {
|
|
22
12
|
layout: 'authenticated',
|
|
@@ -27,6 +17,7 @@ export default {
|
|
|
27
17
|
Banner,
|
|
28
18
|
LabeledInput,
|
|
29
19
|
},
|
|
20
|
+
|
|
30
21
|
async fetch() {
|
|
31
22
|
try {
|
|
32
23
|
this.uiPerfSetting = await this.$store.dispatch('management/find', { type: MANAGEMENT.SETTING, id: SETTING.UI_PERFORMANCE });
|
|
@@ -41,6 +32,7 @@ export default {
|
|
|
41
32
|
|
|
42
33
|
this.value = JSON.parse(sValue);
|
|
43
34
|
},
|
|
35
|
+
|
|
44
36
|
data() {
|
|
45
37
|
return {
|
|
46
38
|
uiPerfSetting: DEFAULT_PERF_SETTING,
|
|
@@ -49,6 +41,7 @@ export default {
|
|
|
49
41
|
errors: [],
|
|
50
42
|
};
|
|
51
43
|
},
|
|
44
|
+
|
|
52
45
|
computed: {
|
|
53
46
|
mode() {
|
|
54
47
|
const schema = this.$store.getters[`management/schemaFor`](MANAGEMENT.SETTING);
|
|
@@ -56,10 +49,12 @@ export default {
|
|
|
56
49
|
return schema?.resourceMethods?.includes('PUT') ? _EDIT : _VIEW;
|
|
57
50
|
},
|
|
58
51
|
},
|
|
52
|
+
|
|
59
53
|
methods: {
|
|
60
54
|
async save(btnCB) {
|
|
61
55
|
this.uiPerfSetting.value = JSON.stringify(this.value);
|
|
62
56
|
this.errors = [];
|
|
57
|
+
|
|
63
58
|
try {
|
|
64
59
|
await this.uiPerfSetting.save();
|
|
65
60
|
btnCB(true);
|
|
@@ -78,12 +73,19 @@ export default {
|
|
|
78
73
|
{{ t('performance.label') }}
|
|
79
74
|
</h1>
|
|
80
75
|
<div>
|
|
81
|
-
<label class="text-label">
|
|
82
|
-
{{ t(`performance.description`, {}, true) }}
|
|
83
|
-
</label>
|
|
84
|
-
<Banner color="error" label-key="performance.banner" />
|
|
85
|
-
<!-- Incremental Loading -->
|
|
86
76
|
<div class="ui-perf-setting">
|
|
77
|
+
<!-- Websocket Notifications -->
|
|
78
|
+
<div class="mt-40">
|
|
79
|
+
<h2>{{ t('performance.websocketNotification.label') }}</h2>
|
|
80
|
+
<p>{{ t('performance.websocketNotification.description') }}</p>
|
|
81
|
+
<Checkbox
|
|
82
|
+
v-model="value.disableWebsocketNotification"
|
|
83
|
+
:label="t('performance.websocketNotification.checkboxLabel')"
|
|
84
|
+
class="mt-10 mb-20"
|
|
85
|
+
:primary="true"
|
|
86
|
+
/>
|
|
87
|
+
</div>
|
|
88
|
+
<!-- Incremental Loading -->
|
|
87
89
|
<div class="mt-40">
|
|
88
90
|
<h2>{{ t('performance.incrementalLoad.label') }}</h2>
|
|
89
91
|
<p>{{ t('performance.incrementalLoad.description') }}</p>
|
|
@@ -111,6 +113,7 @@ export default {
|
|
|
111
113
|
<div class="mt-40">
|
|
112
114
|
<h2 v-t="'performance.manualRefresh.label'" />
|
|
113
115
|
<p>{{ t('performance.manualRefresh.description') }}</p>
|
|
116
|
+
<Banner color="error" label-key="performance.manualRefresh.banner" />
|
|
114
117
|
<Checkbox
|
|
115
118
|
v-model="value.manualRefresh.enabled"
|
|
116
119
|
:label="t('performance.manualRefresh.checkboxLabel')"
|
package/pages/fail-whale.vue
CHANGED
|
@@ -2,8 +2,6 @@
|
|
|
2
2
|
import BrandImage from '@shell/components/BrandImage';
|
|
3
3
|
import { mapGetters, mapState } from 'vuex';
|
|
4
4
|
import { stringify } from '@shell/utils/error';
|
|
5
|
-
import { getVendor } from '@shell/config/private-label';
|
|
6
|
-
import { NAME as HARVESTER } from '@shell/config/product/harvester';
|
|
7
5
|
|
|
8
6
|
export default {
|
|
9
7
|
layout: 'home',
|
|
@@ -13,7 +11,7 @@ export default {
|
|
|
13
11
|
data() {
|
|
14
12
|
const store = this.$store;
|
|
15
13
|
|
|
16
|
-
if (
|
|
14
|
+
if (!store.state.error && !store.state.cameFromError) {
|
|
17
15
|
store.commit('cameFromError');
|
|
18
16
|
this.$router.replace('/');
|
|
19
17
|
}
|
|
@@ -29,13 +27,6 @@ export default {
|
|
|
29
27
|
...mapGetters(['isSingleProduct']),
|
|
30
28
|
|
|
31
29
|
home() {
|
|
32
|
-
const isOnlyHarvester = getVendor() === HARVESTER;
|
|
33
|
-
|
|
34
|
-
if (isOnlyHarvester) {
|
|
35
|
-
// This looks like it's covered by `isSingleProduct?.afterLoginRoute` too
|
|
36
|
-
return 'c/local/harvester/harvesterhci.io.dashboard';
|
|
37
|
-
}
|
|
38
|
-
|
|
39
30
|
if (this.isSingleProduct?.afterLoginRoute) {
|
|
40
31
|
return this.$router.resolve(this.isSingleProduct.afterLoginRoute).href;
|
|
41
32
|
}
|