diff --git a/app/azure/index.ts b/app/azure/index.ts
index 1d2dd8447..0034565ca 100644
--- a/app/azure/index.ts
+++ b/app/azure/index.ts
@@ -47,6 +47,9 @@ function config($stateRegistryProvider: StateRegistry) {
component: 'containerInstancesView',
},
},
+ data: {
+ docs: '/user/aci/containers',
+ },
};
const containerInstance = {
@@ -77,6 +80,9 @@ function config($stateRegistryProvider: StateRegistry) {
component: 'dashboardView',
},
},
+ data: {
+ docs: '/user/aci/dashboard',
+ },
};
$stateRegistryProvider.register(azure);
diff --git a/app/docker/__module.js b/app/docker/__module.js
index a5ef94fc9..f85a986f7 100644
--- a/app/docker/__module.js
+++ b/app/docker/__module.js
@@ -78,6 +78,9 @@ angular.module('portainer.docker', ['portainer.app', reactModule]).config([
controllerAs: 'ctrl',
},
},
+ data: {
+ docs: '/user/docker/configs',
+ },
};
var config = {
@@ -112,6 +115,9 @@ angular.module('portainer.docker', ['portainer.app', reactModule]).config([
component: 'customTemplatesView',
},
},
+ data: {
+ docs: '/user/docker/templates/custom',
+ },
};
const customTemplatesNew = {
@@ -149,6 +155,9 @@ angular.module('portainer.docker', ['portainer.app', reactModule]).config([
controller: 'DashboardController',
},
},
+ data: {
+ docs: '/user/docker/dashboard',
+ },
};
var host = {
@@ -159,6 +168,9 @@ angular.module('portainer.docker', ['portainer.app', reactModule]).config([
component: 'hostView',
},
},
+ data: {
+ docs: '/user/docker/host',
+ },
};
var hostBrowser = {
@@ -180,6 +192,9 @@ angular.module('portainer.docker', ['portainer.app', reactModule]).config([
controller: 'EventsController',
},
},
+ data: {
+ docs: '/user/docker/events',
+ },
};
var images = {
@@ -191,6 +206,9 @@ angular.module('portainer.docker', ['portainer.app', reactModule]).config([
controller: 'ImagesController',
},
},
+ data: {
+ docs: '/user/docker/images',
+ },
};
var image = {
@@ -235,6 +253,9 @@ angular.module('portainer.docker', ['portainer.app', reactModule]).config([
controller: 'NetworksController',
},
},
+ data: {
+ docs: '/user/docker/networks',
+ },
};
var network = {
@@ -262,6 +283,9 @@ angular.module('portainer.docker', ['portainer.app', reactModule]).config([
name: 'docker.nodes',
url: '/nodes',
abstract: true,
+ data: {
+ docs: '/user/docker/swarm',
+ },
};
var node = {
@@ -293,6 +317,9 @@ angular.module('portainer.docker', ['portainer.app', reactModule]).config([
controller: 'SecretsController',
},
},
+ data: {
+ docs: '/user/docker/secrets',
+ },
};
var secret = {
@@ -326,6 +353,9 @@ angular.module('portainer.docker', ['portainer.app', reactModule]).config([
controller: 'ServicesController',
},
},
+ data: {
+ docs: '/user/docker/services',
+ },
};
var service = {
@@ -370,6 +400,9 @@ angular.module('portainer.docker', ['portainer.app', reactModule]).config([
controller: 'StacksController',
},
},
+ data: {
+ docs: '/user/docker/stacks',
+ },
};
var stack = {
@@ -414,6 +447,9 @@ angular.module('portainer.docker', ['portainer.app', reactModule]).config([
controller: 'SwarmController',
},
},
+ data: {
+ docs: '/user/docker/swarm',
+ },
};
var swarmVisualizer = {
@@ -425,6 +461,9 @@ angular.module('portainer.docker', ['portainer.app', reactModule]).config([
controller: 'SwarmVisualizerController',
},
},
+ data: {
+ docs: '/user/docker/swarm/cluster-visualizer',
+ },
};
var tasks = {
@@ -464,6 +503,9 @@ angular.module('portainer.docker', ['portainer.app', reactModule]).config([
controller: 'TemplatesController',
},
},
+ data: {
+ docs: '/user/docker/templates',
+ },
};
var volumes = {
@@ -475,6 +517,9 @@ angular.module('portainer.docker', ['portainer.app', reactModule]).config([
controller: 'VolumesController',
},
},
+ data: {
+ docs: '/user/docker/volumes',
+ },
};
var volume = {
@@ -518,6 +563,9 @@ angular.module('portainer.docker', ['portainer.app', reactModule]).config([
component: 'dockerFeaturesConfigurationView',
},
},
+ data: {
+ docs: '/user/docker/host/setup',
+ },
};
const swarmFeaturesConfiguration = {
@@ -528,6 +576,9 @@ angular.module('portainer.docker', ['portainer.app', reactModule]).config([
component: 'dockerFeaturesConfigurationView',
},
},
+ data: {
+ docs: '/user/docker/swarm/setup',
+ },
};
const dockerRegistries = {
@@ -538,6 +589,9 @@ angular.module('portainer.docker', ['portainer.app', reactModule]).config([
component: 'endpointRegistriesView',
},
},
+ data: {
+ docs: '/user/docker/host/registries',
+ },
};
const swarmRegistries = {
@@ -548,6 +602,9 @@ angular.module('portainer.docker', ['portainer.app', reactModule]).config([
component: 'endpointRegistriesView',
},
},
+ data: {
+ docs: '/user/docker/swarm/registries',
+ },
};
const dockerRegistryAccess = {
diff --git a/app/docker/react/views/containers.ts b/app/docker/react/views/containers.ts
index b3669c896..f48ca5e59 100644
--- a/app/docker/react/views/containers.ts
+++ b/app/docker/react/views/containers.ts
@@ -34,6 +34,9 @@ function config($stateRegistryProvider: StateRegistry) {
component: 'containersView',
},
},
+ data: {
+ docs: '/user/docker/containers',
+ },
});
$stateRegistryProvider.register({
diff --git a/app/edge/__module.js b/app/edge/__module.js
index 90ab30890..3154469d3 100644
--- a/app/edge/__module.js
+++ b/app/edge/__module.js
@@ -22,6 +22,9 @@ angular
component: 'edgeGroupsView',
},
},
+ data: {
+ docs: '/user/edge/groups',
+ },
};
const groupsNew = {
@@ -52,6 +55,9 @@ angular
component: 'edgeStacksView',
},
},
+ data: {
+ docs: '/user/edge/stacks',
+ },
};
const stacksNew = {
@@ -87,6 +93,9 @@ angular
component: 'edgeJobsView',
},
},
+ data: {
+ docs: '/user/edge/jobs',
+ },
};
const edgeJob = {
@@ -127,6 +136,9 @@ angular
component: 'waitingRoomView',
},
},
+ data: {
+ docs: '/user/edge/devices',
+ },
});
}
diff --git a/app/kubernetes/__module.js b/app/kubernetes/__module.js
index 249001f5d..c779cb9e4 100644
--- a/app/kubernetes/__module.js
+++ b/app/kubernetes/__module.js
@@ -77,6 +77,9 @@ angular.module('portainer.kubernetes', ['portainer.app', registriesModule, custo
component: 'kubernetesHelmApplicationView',
},
},
+ data: {
+ docs: '/user/kubernetes/helm',
+ },
};
const helmTemplates = {
@@ -97,6 +100,9 @@ angular.module('portainer.kubernetes', ['portainer.app', registriesModule, custo
component: 'kubernetesServicesView',
},
},
+ data: {
+ docs: '/user/kubernetes/services',
+ },
};
const ingresses = {
@@ -107,6 +113,9 @@ angular.module('portainer.kubernetes', ['portainer.app', registriesModule, custo
component: 'kubernetesIngressesView',
},
},
+ data: {
+ docs: '/user/kubernetes/ingresses',
+ },
};
const ingressesCreate = {
@@ -137,6 +146,9 @@ angular.module('portainer.kubernetes', ['portainer.app', registriesModule, custo
component: 'kubernetesApplicationsView',
},
},
+ data: {
+ docs: '/user/kubernetes/applications',
+ },
};
const applicationCreation = {
@@ -232,11 +244,17 @@ angular.module('portainer.kubernetes', ['portainer.app', registriesModule, custo
params: {
tab: null,
},
+ data: {
+ docs: '/user/kubernetes/configurations',
+ },
};
const configmaps = {
name: 'kubernetes.configmaps',
url: '/configmaps',
abstract: true,
+ data: {
+ docs: '/user/kubernetes/configurations',
+ },
};
const configMapCreation = {
@@ -263,6 +281,9 @@ angular.module('portainer.kubernetes', ['portainer.app', registriesModule, custo
name: 'kubernetes.secrets',
url: '/secrets',
abstract: true,
+ data: {
+ docs: '/user/kubernetes/configurations',
+ },
};
const secretCreation = {
@@ -293,6 +314,9 @@ angular.module('portainer.kubernetes', ['portainer.app', registriesModule, custo
component: 'kubernetesClusterView',
},
},
+ data: {
+ docs: '/user/kubernetes/cluster',
+ },
};
const node = {
@@ -323,6 +347,9 @@ angular.module('portainer.kubernetes', ['portainer.app', registriesModule, custo
component: 'kubernetesDashboardView',
},
},
+ data: {
+ docs: '/user/kubernetes/dashboard',
+ },
};
const deploy = {
@@ -343,6 +370,9 @@ angular.module('portainer.kubernetes', ['portainer.app', registriesModule, custo
component: 'kubernetesResourcePoolsView',
},
},
+ data: {
+ docs: '/user/kubernetes/namespaces',
+ },
};
const resourcePoolCreation = {
@@ -383,6 +413,9 @@ angular.module('portainer.kubernetes', ['portainer.app', registriesModule, custo
component: 'kubernetesVolumesView',
},
},
+ data: {
+ docs: '/user/kubernetes/volumes',
+ },
};
const volume = {
@@ -403,6 +436,9 @@ angular.module('portainer.kubernetes', ['portainer.app', registriesModule, custo
component: 'endpointRegistriesView',
},
},
+ data: {
+ docs: '/user/kubernetes/cluster/registries',
+ },
};
const registriesAccess = {
@@ -423,6 +459,9 @@ angular.module('portainer.kubernetes', ['portainer.app', registriesModule, custo
component: 'kubernetesConfigureView',
},
},
+ data: {
+ docs: '/user/kubernetes/cluster/setup',
+ },
};
const endpointKubernetesSecurityConstraint = {
@@ -434,6 +473,9 @@ angular.module('portainer.kubernetes', ['portainer.app', registriesModule, custo
controller: 'KubernetesSecurityConstraintController',
},
},
+ data: {
+ docs: '/user/kubernetes/cluster/security',
+ },
};
$stateRegistryProvider.register(kubernetes);
diff --git a/app/kubernetes/custom-templates/index.js b/app/kubernetes/custom-templates/index.js
index 76e48c7a0..522b94729 100644
--- a/app/kubernetes/custom-templates/index.js
+++ b/app/kubernetes/custom-templates/index.js
@@ -27,6 +27,9 @@ function config($stateRegistryProvider) {
component: 'kubeCustomTemplatesView',
},
},
+ data: {
+ docs: '/user/kubernetes/templates',
+ },
};
const customTemplatesNew = {
diff --git a/app/nomad/index.ts b/app/nomad/index.ts
index 09037dc3f..27aec4246 100644
--- a/app/nomad/index.ts
+++ b/app/nomad/index.ts
@@ -81,6 +81,9 @@ function config($stateRegistryProvider: StateRegistry) {
component: 'nomadDashboardView',
},
},
+ data: {
+ docs: '/user/nomad/dashboard',
+ },
};
const jobs = {
@@ -91,6 +94,9 @@ function config($stateRegistryProvider: StateRegistry) {
component: 'nomadJobsView',
},
},
+ data: {
+ docs: '/user/nomad/jobs',
+ },
};
const events = {
diff --git a/app/portainer/__module.js b/app/portainer/__module.js
index 552b4cae3..5a69c84b1 100644
--- a/app/portainer/__module.js
+++ b/app/portainer/__module.js
@@ -121,6 +121,9 @@ angular
controller: 'AccountController',
},
},
+ data: {
+ docs: '/user/account-settings',
+ },
};
const tokenCreation = {
@@ -174,6 +177,9 @@ angular
component: 'environmentsListView',
},
},
+ data: {
+ docs: '/admin/environments',
+ },
};
var endpoint = {
@@ -263,6 +269,9 @@ angular
controller: 'GroupsController',
},
},
+ data: {
+ docs: '/admin/environments/groups',
+ },
};
var group = {
@@ -306,6 +315,9 @@ angular
component: 'homeView',
},
},
+ data: {
+ docs: '/user/home',
+ },
};
var init = {
@@ -337,6 +349,9 @@ angular
controller: 'RegistriesController',
},
},
+ data: {
+ docs: '/admin/registries',
+ },
};
var registry = {
@@ -367,6 +382,9 @@ angular
component: 'settingsView',
},
},
+ data: {
+ docs: '/admin/settings',
+ },
};
var settingsAuthentication = {
@@ -378,6 +396,9 @@ angular
controller: 'SettingsAuthenticationController',
},
},
+ data: {
+ docs: '/admin/settings/authentication',
+ },
};
var settingsEdgeCompute = {
@@ -388,6 +409,9 @@ angular
component: 'settingsEdgeComputeView',
},
},
+ data: {
+ docs: '/admin/settings/edge',
+ },
};
var tags = {
@@ -399,6 +423,9 @@ angular
controller: 'TagsController',
},
},
+ data: {
+ docs: '/admin/environments/tags',
+ },
};
var users = {
@@ -410,6 +437,9 @@ angular
controller: 'UsersController',
},
},
+ data: {
+ docs: '/admin/users',
+ },
};
var user = {
diff --git a/app/portainer/rbac/index.js b/app/portainer/rbac/index.js
index 28647e586..ecd34b57b 100644
--- a/app/portainer/rbac/index.js
+++ b/app/portainer/rbac/index.js
@@ -27,6 +27,9 @@ function config($stateRegistryProvider) {
component: 'rolesView',
},
},
+ data: {
+ docs: '/admin/users/roles',
+ },
};
$stateRegistryProvider.register(roles);
diff --git a/app/portainer/react/views/teams.ts b/app/portainer/react/views/teams.ts
index 2fd163ab2..b126f756e 100644
--- a/app/portainer/react/views/teams.ts
+++ b/app/portainer/react/views/teams.ts
@@ -29,6 +29,9 @@ function config($stateRegistryProvider: StateRegistry) {
component: 'teamsView',
},
},
+ data: {
+ docs: '/admin/users/teams',
+ },
});
$stateRegistryProvider.register({
diff --git a/app/portainer/react/views/wizard.ts b/app/portainer/react/views/wizard.ts
index 82635e105..3cc960008 100644
--- a/app/portainer/react/views/wizard.ts
+++ b/app/portainer/react/views/wizard.ts
@@ -55,6 +55,9 @@ function config($stateRegistryProvider: StateRegistry) {
params: {
localEndpointId: 0,
},
+ data: {
+ docs: '/admin/environments/add',
+ },
});
$stateRegistryProvider.register({
diff --git a/app/portainer/user-activity/index.js b/app/portainer/user-activity/index.js
index 201b03a25..20a57c4cb 100644
--- a/app/portainer/user-activity/index.js
+++ b/app/portainer/user-activity/index.js
@@ -16,6 +16,9 @@ function config($stateRegistryProvider) {
component: 'authLogsView',
},
},
+ data: {
+ docs: '/admin/logs',
+ },
});
$stateRegistryProvider.register({
@@ -26,6 +29,9 @@ function config($stateRegistryProvider) {
component: 'activityLogsView',
},
},
+ data: {
+ docs: '/admin/logs/activity',
+ },
});
$stateRegistryProvider.register({
@@ -39,5 +45,8 @@ function config($stateRegistryProvider) {
params: {
id: '',
},
+ data: {
+ docs: '/admin/notifications',
+ },
});
}
diff --git a/app/react/components/PageHeader/ContextHelp/ContextHelp.tsx b/app/react/components/PageHeader/ContextHelp/ContextHelp.tsx
index a173cc08d..a7626004e 100644
--- a/app/react/components/PageHeader/ContextHelp/ContextHelp.tsx
+++ b/app/react/components/PageHeader/ContextHelp/ContextHelp.tsx
@@ -1,20 +1,19 @@
import { HelpCircle } from 'lucide-react';
import clsx from 'clsx';
-
-import { getDocURL } from '@@/PageHeader/ContextHelp/docURLs';
+import { useCurrentStateAndParams } from '@uirouter/react';
import headerStyles from '../HeaderTitle.module.css';
import './ContextHelp.css';
export function ContextHelp() {
- function onHelpClick() {
- const docURL = getDocURL();
- window.open(docURL, '_blank');
- }
+ const docsUrl = useDocsUrl();
return (
-
);
}
+
+function useDocsUrl(): string {
+ const { state } = useCurrentStateAndParams();
+
+ if (!state) {
+ return '';
+ }
+
+ const { data } = state;
+ if (
+ data &&
+ typeof data === 'object' &&
+ 'docs' in data &&
+ typeof data.docs === 'string'
+ ) {
+ return data.docs;
+ }
+
+ return '';
+}
diff --git a/app/react/components/PageHeader/ContextHelp/docURLs.js b/app/react/components/PageHeader/ContextHelp/docURLs.js
deleted file mode 100644
index 30ba1bb63..000000000
--- a/app/react/components/PageHeader/ContextHelp/docURLs.js
+++ /dev/null
@@ -1,389 +0,0 @@
-const docURLs = [
- {
- desc: 'Home',
- docURL: 'https://docs.portainer.io/user/home',
- locationRegex: /#!\/home/,
- exmaples: ['#!/home'],
- },
- {
- desc: 'Docker or Swarm / Dashboard',
- docURL: 'https://docs.portainer.io/user/docker/dashboard',
- locationRegex: /#!\/\d+\/docker\/dashboard/,
- exmaples: ['#!/10/docker/dashboard'],
- },
- {
- desc: 'Docker or Swarm / Custom Templates',
- docURL: 'https://docs.portainer.io/user/docker/templates/custom',
- locationRegex: /#!\/\d+\/docker\/templates\/custom/,
- examples: ['#!/10/docker/templates/custom', '#!/10/docker/templates/custom/new?fileContent=&type=', '#!/10/docker/templates/custom/1'],
- },
- {
- desc: 'Docker or Swarm / App Templates',
- docURL: 'https://docs.portainer.io/user/docker/templates',
- locationRegex: /#!\/\d+\/docker\/templates/,
- examples: ['#!/10/docker/templates'],
- },
- {
- desc: 'Docker or Swarm / Stacks',
- docURL: 'https://docs.portainer.io/user/docker/stacks',
- locationRegex: /#!\/\d+\/docker\/stacks/,
- examples: ['#!/10/docker/stacks', '#!/10/docker/stacks/newstack', '#!/10/docker/stacks/s4?id=3&type=1®ular=true&external=false&orphaned=false'],
- },
- {
- desc: 'Swarm / Services',
- docURL: 'https://docs.portainer.io/user/docker/services',
- locationRegex: /#!\/\d+\/docker\/(services|tasks)/,
- examples: [
- '#!/10/docker/services',
- '#!/10/docker/services/zqp46vzoz5nnf39m6c518nlt8',
- '#!/10/docker/services/zqp46vzoz5nnf39m6c518nlt8/logs',
- '#!/10/docker/tasks/yyll0peo7ack4uaw2wom3nxso',
- '#!/10/docker/tasks/yyll0peo7ack4uaw2wom3nxso/logs',
- ],
- },
- {
- desc: 'Docker or Swarm / Containers',
- docURL: 'https://docs.portainer.io/user/docker/containers',
- locationRegex: /#!\/\d+\/docker\/containers/,
- examples: [
- '#!/10/docker/containers',
- '#!/10/docker/containers/new',
- '#!/10/docker/containers/new?from=49ff4ae03d10c57fe375f6968c48a6169a9852a6bfbb5137cd30c615d58188c1',
- '#!/10/docker/containers/49ff4ae03d10c57fe375f6968c48a6169a9852a6bfbb5137cd30c615d58188c1',
- '#!/10/docker/containers/49ff4ae03d10c57fe375f6968c48a6169a9852a6bfbb5137cd30c615d58188c1/logs',
- '#!/10/docker/containers/49ff4ae03d10c57fe375f6968c48a6169a9852a6bfbb5137cd30c615d58188c1/inspect',
- '#!/10/docker/containers/49ff4ae03d10c57fe375f6968c48a6169a9852a6bfbb5137cd30c615d58188c1/stats',
- ],
- },
- {
- desc: 'Docker or Swarm / Images',
- docURL: 'https://docs.portainer.io/user/docker/images',
- locationRegex: /#!\/\d+\/docker\/images/,
- examples: ['#!/10/docker/images', '#!/10/docker/images/build', '#!/10/docker/images/sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412'],
- },
- {
- desc: 'Docker or Swarm / Networks',
- docURL: 'https://docs.portainer.io/user/docker/networks',
- locationRegex: /#!\/\d+\/docker\/networks/,
- examples: ['#!/10/docker/networks', '#!/10/docker/networks/new', '#!/10/docker/networks/db5732ff4a2c6df70a18530dba6abd8625f8e94c5fc5daabbcbab07377ee1044'],
- },
- {
- desc: 'Docker or Swarm / Volumes',
- docURL: 'https://docs.portainer.io/user/docker/volumes',
- locationRegex: /#!\/\d+\/docker\/volumes/,
- examples: ['#!/10/docker/volumes', '#!/10/docker/volumes/new', '#!/10/docker/volumes/153b46162f5bab9a7c9d2c8e1675115fcedd4c0ccdf5834159400750fa6b794c'],
- },
- {
- desc: 'Swarm / Configs',
- docURL: 'https://docs.portainer.io/user/docker/configs',
- locationRegex: /#!\/\d+\/docker\/configs/,
- examples: ['#!/10/docker/configs', '#!/10/docker/configs/new', '#!/10/docker/configs/azd0xc805l298jrgnadbnnzyv'],
- },
- {
- desc: 'Swarm / Secrets',
- docURL: 'https://docs.portainer.io/user/docker/secrets',
- locationRegex: /#!\/\d+\/docker\/secrets/,
- examples: ['#!/10/docker/secrets', '#!/10/docker/secrets/new', '#!/10/docker/secrets/tsoeeh7ln7g54g5qkk67eg4xe'],
- },
- {
- desc: 'Docker or Swarm / Swarm / Cluster visualizer',
- docURL: 'https://docs.portainer.io/user/docker/swarm/cluster-visualizer',
- locationRegex: /#!\/\d+\/docker\/swarm\/visualizer/,
- examples: ['#!/10/docker/swarm/visualizer'],
- },
- {
- desc: 'Docker or Swarm / Swarm / Set up',
- docURL: 'https://docs.portainer.io/user/docker/swarm/setup',
- locationRegex: /#!\/\d+\/docker\/swarm\/feat-config/,
- examples: ['#!/10/docker/feat-config'],
- },
- {
- desc: 'Swarm / Swarm / Registries',
- docURL: 'https://docs.portainer.io/user/docker/swarm/registries',
- locationRegex: /#!\/\d+\/docker\/swarm\/registries/,
- examples: ['#!/10/docker/registries'],
- },
- {
- desc: 'Swarm / Swarm',
- docURL: 'https://docs.portainer.io/user/docker/swarm',
- locationRegex: /#!\/\d+\/docker\/(swarm|nodes)/,
- examples: ['#!/10/docker/swarm', '#!/10/docker/nodes/nd694yepzgms1j8y7kv3lpcc3'],
- },
- {
- desc: 'Docker / Events',
- docURL: 'https://docs.portainer.io/user/docker/events',
- locationRegex: /#!\/\d+\/docker\/events/,
- examples: ['#!/10/docker/events'],
- },
- {
- desc: 'Docker / Host / Registries',
- docURL: 'https://docs.portainer.io/user/docker/host/registries',
- locationRegex: /#!\/\d+\/docker\/host\/registries/,
- examples: ['#!/10/docker/registries'],
- },
- {
- desc: 'Docker / Host / Setup',
- docURL: 'https://docs.portainer.io/user/docker/host/setup',
- locationRegex: /#!\/\d+\/docker\/host\/feat-config/,
- examples: ['#!/10/docker/feat-config'],
- },
- {
- desc: 'Docker / Host',
- docURL: 'https://docs.portainer.io/user/docker/host',
- locationRegex: /#!\/\d+\/docker\/host/,
- examples: ['#!/10/docker/host'],
- },
- {
- desc: 'Kubernetes / Dashboard',
- docURL: 'https://docs.portainer.io/user/kubernetes/dashboard',
- locationRegex: /#!\/\d+\/kubernetes\/dashboard/,
- examples: ['#!/1/kubernetes/dashboard'],
- },
- {
- desc: 'Kubernetes / Custom Templates',
- docURL: 'https://docs.portainer.io/user/kubernetes/templates',
- locationRegex: /#!\/\d+\/kubernetes\/templates\/custom/,
- examples: ['#!/1/kubernetes/templates/custom', '#!/1/kubernetes/templates/custom/new?fileContent='],
- },
- {
- desc: 'Kubernetes / Namespaces',
- docURL: 'https://docs.portainer.io/user/kubernetes/namespaces',
- locationRegex: /#!\/\d+\/kubernetes\/pools/,
- examples: ['#!/1/kubernetes/pools', '#!/1/kubernetes/pools/new', '#!/1/kubernetes/deploy?templateId=', '#!/1/kubernetes/pools/default'],
- },
- {
- desc: 'Kubernetes / Helm',
- docURL: 'https://docs.portainer.io/user/kubernetes/helm',
- locationRegex: /#!\/\d+\/kubernetes\/templates\/helm/,
- examples: ['#!/1/kubernetes/templates/helm'],
- },
- {
- desc: 'Kubernetes / Applications',
- docURL: 'https://docs.portainer.io/user/kubernetes/applications',
- locationRegex: /#!\/\d+\/kubernetes\/applications/,
- examples: ['#!/1/kubernetes/applications', '#!/1/kubernetes/applications/new', '#!/1/kubernetes/deploy?templateId=', '#!/1/kubernetes/applications/metallb-system/controller'],
- },
- {
- desc: 'Kubernetes / Services',
- docURL: 'https://docs.portainer.io/user/kubernetes/services',
- locationRegex: /#!\/\d+\/kubernetes\/services/,
- examples: ['#!/1/kubernetes/services'],
- },
- {
- desc: 'Kubernetes / Ingresses',
- docURL: 'https://docs.portainer.io/user/kubernetes/ingresses',
- locationRegex: /#!\/\d+\/kubernetes\/ingresses/,
- examples: ['#!/1/kubernetes/ingresses'],
- },
- {
- desc: 'Kubernetes / ConfigMaps & Secrets',
- docURL: 'https://docs.portainer.io/user/kubernetes/configurations',
- locationRegex: /#!\/\d+\/kubernetes\/configurations/,
- examples: ['#!/1/kubernetes/configurations', '#!/1/kubernetes/configurations/new', '#!/1/kubernetes/configurations/metallb-system/config'],
- },
- {
- desc: 'Kubernetes / Volumes',
- docURL: 'https://docs.portainer.io/user/kubernetes/volumes',
- locationRegex: /#!\/\d+\/kubernetes\/volumes/,
- examples: ['#!/1/kubernetes/volumes'],
- },
- {
- desc: 'Kubernetes / Cluster / Set up',
- docURL: 'https://docs.portainer.io/user/kubernetes/cluster/setup',
- locationRegex: /#!\/\d+\/kubernetes\/cluster\/configure/,
- examples: ['#!/1/kubernetes/cluster/configure'],
- },
- {
- desc: 'Kubernetes / Cluster / Security constraints',
- docURL: 'https://docs.portainer.io/user/kubernetes/cluster/security',
- locationRegex: /#!\/\d+\/kubernetes\/cluster\/securityConstraint/,
- examples: ['#!/1/kubernetes/cluster/securityConstraint'],
- },
- {
- desc: 'Kubernetes / Cluster',
- docURL: 'https://docs.portainer.io/user/kubernetes/cluster',
- locationRegex: /#!\/\d+\/kubernetes\/cluster/,
- examples: ['#!/1/kubernetes/cluster', '#!/1/kubernetes/cluster/ip-10-138-11-102', '#!/1/kubernetes/cluster/ip-10-138-11-102/stats'],
- },
- {
- desc: 'Kubernetes / Cluster / Registries',
- docURL: 'https://docs.portainer.io/user/kubernetes/cluster/registries',
- locationRegex: /#!\/\d+\/kubernetes\/registries/,
- examples: ['#!/1/kubernetes/registries'],
- },
- {
- desc: 'Azure ACI / Dashboard',
- docURL: 'https://docs.portainer.io/user/aci/dashboard',
- locationRegex: /#!\/\d+\/azure\/dashboard/,
- examples: ['#!/26/azure/dashboard'],
- },
- {
- desc: 'Azure ACI / Container instances',
- docURL: 'https://docs.portainer.io/user/aci/containers',
- locationRegex: /#!\/\d+\/azure\/containerinstances/,
- examples: ['#!/26/azure/containerinstances'],
- },
- {
- desc: 'Edge Compute / Edge Devices',
- docURL: 'https://docs.portainer.io/user/edge/devices',
- locationRegex: /#!\/edge\/devices/,
- examples: ['#!/edge/devices', '#!/edge/devices/waiting-room'],
- },
- {
- desc: 'Edge Compute / Edge Groups',
- docURL: 'https://docs.portainer.io/user/edge/groups',
- locationRegex: /#!\/edge\/groups/,
- examples: ['#!/edge/groups', '#!/edge/groups/new'],
- },
- {
- desc: 'Edge Compute / Edge Stacks ',
- docURL: 'https://docs.portainer.io/user/edge/stacks',
- locationRegex: /#!\/edge\/stacks/,
- examples: ['#!/edge/stacks', '#!/edge/stacks/new'],
- },
- {
- desc: 'Edge Compute / Edge Jobs',
- docURL: 'https://docs.portainer.io/user/edge/jobs',
- locationRegex: /#!\/edge\/jobs/,
- examples: ['#!/edge/jobs', '#!/edge/jobs/new'],
- },
- {
- desc: 'Edge Compute / Edge Configurations',
- docURL: 'https://docs.portainer.io/user/edge/configurations',
- locationRegex: /#!\/edge\/configurations/,
- examples: ['#!/edge/configurations', '#!/edge/configurations/new'],
- },
- {
- desc: 'Nomad / Dashboard',
- docURL: 'https://docs.portainer.io/user/nomad/dashboard',
- locationRegex: /#!\/\d+\/nomad\/dashboard/,
- examples: ['#!/2/nomad/dashboard'],
- },
- {
- desc: 'Nomad / Nomad Jobs',
- docURL: 'https://docs.portainer.io/user/nomad/jobs',
- locationRegex: /#!\/\d+\/nomad\/jobs/,
- examples: [
- '#!/2/nomad/jobs',
- '#!/2/nomad/jobs/portainer-agent/tasks/portainer-agent/allocations/acdbf08e-34af-9b8a-cc84-7dc202bf1fcf/events?namespace=default',
- '#!/2/nomad/jobs/portainer-agent/tasks/portainer-agent/allocations/acdbf08e-34af-9b8a-cc84-7dc202bf1fcf/logs?namespace=default',
- ],
- },
- {
- desc: 'Account Settings',
- docURL: 'https://docs.portainer.io/user/account-settings',
- locationRegex: /#!\/account/,
- examples: ['#!/account', '#!/account/tokens/new'],
- },
- {
- desc: 'Settings / Users',
- docURL: 'https://docs.portainer.io/admin/users',
- locationRegex: /#!\/users/,
- examples: ['#!/users', '#!/users/1'],
- },
- {
- desc: 'Settings / Users / Teams',
- docURL: 'https://docs.portainer.io/admin/users/teams',
- locationRegex: /#!\/teams/,
- examples: ['#!/teams', '#!/teams/1'],
- },
- {
- desc: 'Settings / Users / Roles',
- docURL: 'https://docs.portainer.io/admin/users/roles',
- locationRegex: /#!\/roles/,
- examples: ['#!/roles'],
- },
- {
- desc: 'Settings / Environments',
- docURL: 'https://docs.portainer.io/admin/environments',
- locationRegex: /#!\/endpoints/,
- examples: ['#!/endpoints', '#!/endpoints/10', '#!/endpoints/10/access'],
- },
- {
- desc: 'Settings / Environments / Groups',
- docURL: 'https://docs.portainer.io/admin/environments/groups',
- locationRegex: /#!\/groups/,
- examples: ['#!/groups', '#!/groups/new', '#!/groups/3', '#!/groups/3/access'],
- },
- {
- desc: 'Settings / Environments / Tags',
- docURL: 'https://docs.portainer.io/admin/environments/tags',
- locationRegex: /#!\/tags/,
- examples: ['#!/tags'],
- },
- {
- desc: 'Settings / Registries',
- docURL: 'https://docs.portainer.io/admin/registries',
- locationRegex: /#!\/registries/,
- examples: [
- '#!/registries',
- '#!/registries/new',
- '#!/registries/1',
- '#!/registries/1/repositories',
- '#!/registries/1/configure',
- '#!/registries/5/portainer.demo~2Fportainerregistrytesting~2Falpine',
- '#!/registries/5/portainer.demo~2Fportainerregistrytesting~2Falpine/jfadelhaye',
- ],
- },
- {
- desc: 'Settings / Licenses',
- docURL: 'https://docs.portainer.io/admin/licenses',
- locationRegex: /#!\/licenses/,
- examples: ['#!/licenses', '#!/licenses/licenses/new'],
- },
- {
- desc: 'Settings / Authentication logs',
- docURL: 'https://docs.portainer.io/admin/logs',
- locationRegex: /#!\/auth-logs/,
- examples: ['#!/auth-logs'],
- },
- {
- desc: 'Settings / Authentication logs / Activity logs',
- docURL: 'https://docs.portainer.io/admin/logs/activity',
- locationRegex: /#!\/activity-logs/,
- examples: ['#!/activity-logs'],
- },
- {
- desc: 'Settings / Settings / Authentication',
- docURL: 'https://docs.portainer.io/admin/settings/authentication',
- locationRegex: /#!\/settings\/auth/,
- examples: ['#!/settings/auth'],
- },
- {
- desc: 'Settings / Settings / Notifications',
- docURL: 'https://docs.portainer.io/admin/notifications',
- locationRegex: /#!\/notifications/,
- examples: ['#!/notifications'],
- },
- {
- desc: 'Settings / Settings / Cloud settings',
- docURL: 'https://docs.portainer.io/admin/settings/cloud',
- locationRegex: /#!\/settings\/cloud/,
- examples: ['#!/settings/cloud', '#!/settings/cloud/credentials/new', '#!/settings/cloud/credentials/1'],
- },
- {
- desc: 'Settings / Settings / Edge Compute',
- docURL: 'https://docs.portainer.io/admin/settings/edge',
- locationRegex: /#!\/settings\/edge/,
- examples: ['#!/settings/edge'],
- },
- {
- desc: 'Settings / Settings',
- docURL: 'https://docs.portainer.io/admin/settings',
- locationRegex: /#!\/settings/,
- examples: ['#!/settings'],
- },
-];
-
-const DEFAULT_DOC_URL = 'https://docs.portainer.io';
-
-export function getDocURL() {
- const hash = window.location.hash;
- for (let i = 0; i < docURLs.length; i += 1) {
- const docURL = docURLs[i];
- if (hash.match(docURL.locationRegex)) {
- return docURL.docURL;
- }
- }
- return DEFAULT_DOC_URL;
-}
diff --git a/app/react/components/PageHeader/PageHeader.tsx b/app/react/components/PageHeader/PageHeader.tsx
index c2f854ad3..69e24c2f9 100644
--- a/app/react/components/PageHeader/PageHeader.tsx
+++ b/app/react/components/PageHeader/PageHeader.tsx
@@ -1,5 +1,6 @@
import { useRouter } from '@uirouter/react';
import { RefreshCw } from 'lucide-react';
+import { PropsWithChildren } from 'react';
import { Button } from '../buttons';
@@ -24,13 +25,10 @@ export function PageHeader({
reload,
loading,
onReload,
-}: Props) {
+ children,
+}: PropsWithChildren) {
const router = useRouter();
- function onClickedRefresh() {
- return onReload ? onReload() : router.stateService.reload();
- }
-
return (
@@ -47,7 +45,12 @@ export function PageHeader({
)}
+ {children}
);
+
+ function onClickedRefresh() {
+ return onReload ? onReload() : router.stateService.reload();
+ }
}