Provisioning: Onboarding landing page (#101112)
* add landing page before wizard * Update onboarding page * Update URL * Remove unused * Add deleteAll button * Improved text * betterer --------- Co-authored-by: Clarity-89 <homes89@ukr.net>
This commit is contained in:
1 parent
82ce39ae3d
commit
6a0bc60413
9 files changed
+208
-23
No files matched your search
+20
-11
@@ -5764,7 +5764,10 @@ exports[`better eslint`] = {
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "10"]
|
||||
],
|
||||
"public/app/features/provisioning/JobStatus.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "2"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "3"]
|
||||
],
|
||||
"public/app/features/provisioning/MigrateToRepository.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
@@ -5776,6 +5779,14 @@ exports[`better eslint`] = {
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "6"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "7"]
|
||||
],
|
||||
"public/app/features/provisioning/OnboardingPage.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "2"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "3"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "4"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "5"]
|
||||
],
|
||||
"public/app/features/provisioning/RecentJobs.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
@@ -5793,14 +5804,15 @@ exports[`better eslint`] = {
|
||||
"public/app/features/provisioning/RepositoryListPage.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "2"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "3"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "4"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "5"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "6"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "7"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "8"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "9"]
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "9"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "10"]
|
||||
],
|
||||
"public/app/features/provisioning/RepositoryOverview.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"],
|
||||
@@ -5884,9 +5896,7 @@ exports[`better eslint`] = {
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "3"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "4"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "5"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "6"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "7"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "8"]
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "6"]
|
||||
],
|
||||
"public/app/features/provisioning/Wizard/MigrateStep.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
|
||||
@@ -5894,10 +5904,12 @@ exports[`better eslint`] = {
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "3"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "4"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "5"],
|
||||
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "5"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "6"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "7"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "8"]
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "8"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "9"],
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "10"]
|
||||
],
|
||||
"public/app/features/provisioning/Wizard/ProvisioningWizard.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
|
||||
@@ -5921,9 +5933,6 @@ exports[`better eslint`] = {
|
||||
"public/app/features/provisioning/Wizard/Stepper.tsx:5381": [
|
||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
|
||||
],
|
||||
"public/app/features/provisioning/Wizard/WizardPage.tsx:5381": [
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
|
||||
],
|
||||
"public/app/features/provisioning/api/index.ts:5381": [
|
||||
[0, 0, 0, "Do not use export all (\`export * from ...\`)", "0"],
|
||||
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
import SVG from 'react-inlinesvg';
|
||||
|
||||
import { EmptyState, LinkButton, Alert, Stack, Text } from '@grafana/ui';
|
||||
import { Page } from 'app/core/components/Page/Page';
|
||||
|
||||
import { SetupWarnings } from './SetupWarnings';
|
||||
import { MIGRATE_URL } from './constants';
|
||||
|
||||
export default function OnboardingPage() {
|
||||
return (
|
||||
<Page
|
||||
navId="provisioning"
|
||||
pageNav={{ text: 'Setup provisioning', subTitle: 'Configure this instance to use provisioning' }}
|
||||
>
|
||||
<Page.Contents>
|
||||
<SetupWarnings />
|
||||
<Alert severity="info" title="Setting up this connection could cause a temporary outage">
|
||||
When you connect your whole instance, depending on its size, the setup might make the dashboard unavailable to
|
||||
users for up to 30 minutes. We recommend warning your users before starting the process. You can use the
|
||||
announcement banner or your preferred channels.
|
||||
</Alert>
|
||||
<EmptyState
|
||||
variant="call-to-action"
|
||||
message="Set up your provisioning connection!"
|
||||
image={<SVG src="public/img/provisioning-empty.svg" width={300} />}
|
||||
button={
|
||||
<LinkButton size="lg" icon="plus" href={MIGRATE_URL}>
|
||||
Connect Grafana to repository
|
||||
</LinkButton>
|
||||
}
|
||||
>
|
||||
<Stack direction="column" alignItems="center">
|
||||
<Text>Store and provision your Grafana resources externally by connecting to a repository.</Text>
|
||||
<Text>We currently support GitHub and local storage.</Text>
|
||||
<LinkButton fill="text" href="#" icon="external-link-alt">
|
||||
Learn more
|
||||
</LinkButton>
|
||||
</Stack>
|
||||
</EmptyState>
|
||||
</Page.Contents>
|
||||
</Page>
|
||||
);
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
import { ReactNode, useEffect, useState } from 'react';
|
||||
import { useNavigate } from 'react-router-dom-v5-compat';
|
||||
|
||||
import { AppEvents } from '@grafana/data';
|
||||
import { getAppEvents } from '@grafana/runtime';
|
||||
import {
|
||||
Card,
|
||||
EmptySearchResult,
|
||||
@@ -12,33 +13,69 @@ import {
|
||||
Stack,
|
||||
TextLink,
|
||||
Text,
|
||||
Alert,
|
||||
ConfirmModal,
|
||||
} from '@grafana/ui';
|
||||
import { Page } from 'app/core/components/Page/Page';
|
||||
|
||||
import { DeleteRepositoryButton } from './DeleteRepositoryButton';
|
||||
import OnboardingPage from './OnboardingPage';
|
||||
import { SetupWarnings } from './SetupWarnings';
|
||||
import { StatusBadge } from './StatusBadge';
|
||||
import { SyncRepository } from './SyncRepository';
|
||||
import { Repository, ResourceCount, useGetFrontendSettingsQuery } from './api';
|
||||
import { Repository, ResourceCount, useDeletecollectionRepositoryMutation, useGetFrontendSettingsQuery } from './api';
|
||||
import { NEW_URL, PROVISIONING_URL } from './constants';
|
||||
import { useRepositoryList } from './hooks';
|
||||
|
||||
const appEvents = getAppEvents();
|
||||
|
||||
export default function RepositoryListPage() {
|
||||
const [items, isLoading] = useRepositoryList({ watch: true });
|
||||
const settings = useGetFrontendSettingsQuery();
|
||||
const navigate = useNavigate();
|
||||
const [deleteAll, deleteAllResult] = useDeletecollectionRepositoryMutation();
|
||||
const [showDeleteModal, setShowDeleteModal] = useState(false);
|
||||
|
||||
useEffect(() => {
|
||||
if (settings.data?.legacyStorage && !items?.length) {
|
||||
navigate('/admin/provisioning/setup');
|
||||
if (deleteAllResult.isSuccess) {
|
||||
appEvents.publish({
|
||||
type: AppEvents.alertSuccess.name,
|
||||
payload: ['All configured repositories deleted'],
|
||||
});
|
||||
}
|
||||
}, [settings, navigate, items?.length]);
|
||||
}, [deleteAllResult.isSuccess]);
|
||||
|
||||
if (!items?.length && !isLoading) {
|
||||
return <OnboardingPage />;
|
||||
}
|
||||
|
||||
const onConfirmDelete = () => {
|
||||
deleteAll({ deleteOptions: {} });
|
||||
setShowDeleteModal(false);
|
||||
};
|
||||
|
||||
return (
|
||||
<Page navId="provisioning" subTitle="View and manage your configured repositories">
|
||||
<Page.Contents isLoading={isLoading}>
|
||||
<SetupWarnings />
|
||||
{settings.data?.legacyStorage && (
|
||||
<Alert
|
||||
title="Legacy storage detected"
|
||||
severity="error"
|
||||
buttonContent={<>Remove all configured repositories</>}
|
||||
onRemove={() => setShowDeleteModal(true)}
|
||||
>
|
||||
Configured repositories will not work while running legacy storage.
|
||||
</Alert>
|
||||
)}
|
||||
<RepositoryListPageContent items={items} />
|
||||
<ConfirmModal
|
||||
isOpen={showDeleteModal}
|
||||
title="Delete all configured repositories"
|
||||
body="Are you sure you want to delete all configured repositories? This action cannot be undone."
|
||||
confirmText="Delete repositories"
|
||||
onConfirm={onConfirmDelete}
|
||||
onDismiss={() => setShowDeleteModal(false)}
|
||||
/>
|
||||
</Page.Contents>
|
||||
</Page>
|
||||
);
|
||||
|
||||
+2
-2
@@ -4,11 +4,11 @@ import { SetupWarnings } from '../SetupWarnings';
|
||||
|
||||
import { ProvisioningWizard } from './ProvisioningWizard';
|
||||
|
||||
export default function NewRepositoryPage() {
|
||||
export default function MigrateToProvisioningPage() {
|
||||
return (
|
||||
<Page
|
||||
navId="provisioning"
|
||||
pageNav={{ text: 'Configure repository', subTitle: 'Migrate instance to provisioning.' }}
|
||||
pageNav={{ text: 'Migrate to Provisioning', subTitle: 'Manage this instance from provisioning' }}
|
||||
>
|
||||
<Page.Contents>
|
||||
<SetupWarnings />
|
||||
@@ -67,6 +67,30 @@ const injectedRtkApi = api
|
||||
}),
|
||||
invalidatesTags: ['Repository'],
|
||||
}),
|
||||
deletecollectionRepository: build.mutation<DeletecollectionRepositoryResponse, DeletecollectionRepositoryArg>({
|
||||
query: (queryArg) => ({
|
||||
url: `/repositories`,
|
||||
method: 'DELETE',
|
||||
body: queryArg.deleteOptions,
|
||||
params: {
|
||||
pretty: queryArg.pretty,
|
||||
continue: queryArg['continue'],
|
||||
dryRun: queryArg.dryRun,
|
||||
fieldSelector: queryArg.fieldSelector,
|
||||
gracePeriodSeconds: queryArg.gracePeriodSeconds,
|
||||
ignoreStoreReadErrorWithClusterBreakingPotential: queryArg.ignoreStoreReadErrorWithClusterBreakingPotential,
|
||||
labelSelector: queryArg.labelSelector,
|
||||
limit: queryArg.limit,
|
||||
orphanDependents: queryArg.orphanDependents,
|
||||
propagationPolicy: queryArg.propagationPolicy,
|
||||
resourceVersion: queryArg.resourceVersion,
|
||||
resourceVersionMatch: queryArg.resourceVersionMatch,
|
||||
sendInitialEvents: queryArg.sendInitialEvents,
|
||||
timeoutSeconds: queryArg.timeoutSeconds,
|
||||
},
|
||||
}),
|
||||
invalidatesTags: ['Repository'],
|
||||
}),
|
||||
getRepository: build.query<GetRepositoryResponse, GetRepositoryArg>({
|
||||
query: (queryArg) => ({
|
||||
url: `/repositories/${queryArg.name}`,
|
||||
@@ -361,6 +385,58 @@ export type CreateRepositoryArg = {
|
||||
fieldValidation?: string;
|
||||
repository: Repository;
|
||||
};
|
||||
export type DeletecollectionRepositoryResponse = /** status 200 OK */ Status;
|
||||
export type DeletecollectionRepositoryArg = {
|
||||
/** If 'true', then the output is pretty printed. Defaults to 'false' unless the user-agent indicates a browser or command-line HTTP tool (curl and wget). */
|
||||
pretty?: string;
|
||||
/** The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key".
|
||||
|
||||
This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications. */
|
||||
continue?: string;
|
||||
/** When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed */
|
||||
dryRun?: string;
|
||||
/** A selector to restrict the list of returned objects by their fields. Defaults to everything. */
|
||||
fieldSelector?: string;
|
||||
/** The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately. */
|
||||
gracePeriodSeconds?: number;
|
||||
/** if set to true, it will trigger an unsafe deletion of the resource in case the normal deletion flow fails with a corrupt object error. A resource is considered corrupt if it can not be retrieved from the underlying storage successfully because of a) its data can not be transformed e.g. decryption failure, or b) it fails to decode into an object. NOTE: unsafe deletion ignores finalizer constraints, skips precondition checks, and removes the object from the storage. WARNING: This may potentially break the cluster if the workload associated with the resource being unsafe-deleted relies on normal deletion flow. Use only if you REALLY know what you are doing. The default value is false, and the user must opt in to enable it */
|
||||
ignoreStoreReadErrorWithClusterBreakingPotential?: boolean;
|
||||
/** A selector to restrict the list of returned objects by their labels. Defaults to everything. */
|
||||
labelSelector?: string;
|
||||
/** limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.
|
||||
|
||||
The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned. */
|
||||
limit?: number;
|
||||
/** Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both. */
|
||||
orphanDependents?: boolean;
|
||||
/** Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground. */
|
||||
propagationPolicy?: string;
|
||||
/** resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.
|
||||
|
||||
Defaults to unset */
|
||||
resourceVersion?: string;
|
||||
/** resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.
|
||||
|
||||
Defaults to unset */
|
||||
resourceVersionMatch?: string;
|
||||
/** `sendInitialEvents=true` may be set together with `watch=true`. In that case, the watch stream will begin with synthetic events to produce the current state of objects in the collection. Once all such events have been sent, a synthetic "Bookmark" event will be sent. The bookmark will report the ResourceVersion (RV) corresponding to the set of objects, and be marked with `"k8s.io/initial-events-end": "true"` annotation. Afterwards, the watch stream will proceed as usual, sending watch events corresponding to changes (subsequent to the RV) to objects watched.
|
||||
|
||||
When `sendInitialEvents` option is set, we require `resourceVersionMatch` option to also be set. The semantic of the watch request is as following: - `resourceVersionMatch` = NotOlderThan
|
||||
is interpreted as "data at least as new as the provided `resourceVersion`"
|
||||
and the bookmark event is send when the state is synced
|
||||
to a `resourceVersion` at least as fresh as the one provided by the ListOptions.
|
||||
If `resourceVersion` is unset, this is interpreted as "consistent read" and the
|
||||
bookmark event is send when the state is synced at least to the moment
|
||||
when request started being processed.
|
||||
- `resourceVersionMatch` set to any other value or unset
|
||||
Invalid error is returned.
|
||||
|
||||
Defaults to true if `resourceVersion=""` or `resourceVersion="0"` (for backward compatibility reasons) and to false otherwise. */
|
||||
sendInitialEvents?: boolean;
|
||||
/** Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity. */
|
||||
timeoutSeconds?: number;
|
||||
deleteOptions: DeleteOptions;
|
||||
};
|
||||
export type GetRepositoryResponse = /** status 200 OK */ Repository;
|
||||
export type GetRepositoryArg = {
|
||||
/** name of the Repository */
|
||||
@@ -1099,6 +1175,7 @@ export const {
|
||||
useGetJobQuery,
|
||||
useListRepositoryQuery,
|
||||
useCreateRepositoryMutation,
|
||||
useDeletecollectionRepositoryMutation,
|
||||
useGetRepositoryQuery,
|
||||
useReplaceRepositoryMutation,
|
||||
useDeleteRepositoryMutation,
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
export const PROVISIONING_URL = '/admin/provisioning';
|
||||
export const NEW_URL = `${PROVISIONING_URL}/new`;
|
||||
export const MIGRATE_URL = `${PROVISIONING_URL}/migrate`;
|
||||
@@ -25,9 +25,12 @@ export function getProvisioningRoutes(): RouteDescriptor[] {
|
||||
),
|
||||
},
|
||||
{
|
||||
path: PROVISIONING_URL + '/setup',
|
||||
path: PROVISIONING_URL + '/migrate',
|
||||
component: SafeDynamicImport(
|
||||
() => import(/* webpackChunkName: "ProvisioningWizardPage"*/ 'app/features/provisioning/Wizard/WizardPage')
|
||||
() =>
|
||||
import(
|
||||
/* webpackChunkName: "ProvisioningWizardPage"*/ 'app/features/provisioning/Wizard/MigrateToProvisioningPage'
|
||||
)
|
||||
),
|
||||
},
|
||||
{
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
<svg width="352" height="129" viewBox="0 0 352 129" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_463_9219)">
|
||||
<path d="M85.4592 59.8311C85.3277 58.4941 85.1085 56.9598 84.6701 55.2503C84.2318 53.5626 83.5742 51.6996 82.6099 49.7708C81.6455 47.842 80.3962 45.8475 78.7742 43.8968C78.1386 43.1297 77.4372 42.3845 76.692 41.6612C77.8099 37.2119 75.3331 33.3544 75.3331 33.3544C71.0592 33.0914 68.3414 34.6914 67.3331 35.4146C67.1578 35.3489 67.0044 35.2612 66.829 35.1955C66.1057 34.9105 65.3605 34.6256 64.5715 34.3845C63.8044 34.1434 63.0153 33.9242 62.2044 33.727C61.3934 33.5297 60.5825 33.3763 59.7496 33.2448C59.5962 33.2229 59.4646 33.2009 59.3112 33.179C57.4482 27.2174 52.1003 24.7188 52.1003 24.7188C46.1167 28.5105 44.9989 33.8146 44.9989 33.8146C44.9989 33.8146 44.977 33.9242 44.9331 34.1215C44.6044 34.2092 44.2756 34.3187 43.9468 34.4064C43.4866 34.5379 43.0263 34.7133 42.5879 34.8886C42.1277 35.064 41.6893 35.2393 41.229 35.4366C40.3304 35.8311 39.4318 36.2694 38.5551 36.7516C37.7003 37.2338 36.8674 37.7598 36.0564 38.3078C35.9468 38.264 35.8373 38.2201 35.8373 38.2201C27.5523 35.064 20.2099 38.8557 20.2099 38.8557C19.5304 47.6667 23.5194 53.2119 24.3085 54.2201C24.1112 54.7681 23.9359 55.316 23.7605 55.864C23.1468 57.8585 22.6866 59.8968 22.4016 62.0229C22.3578 62.3297 22.314 62.6366 22.292 62.9434C14.6208 66.7352 12.3633 74.4722 12.3633 74.4722C18.7414 81.8146 26.1934 82.2749 26.1934 82.2749L26.2153 82.253C27.1578 83.9407 28.2537 85.5407 29.4811 87.053C30.0071 87.6886 30.5331 88.2804 31.103 88.8722C28.7797 95.5352 31.4318 101.058 31.4318 101.058C38.5331 101.321 43.2016 97.9461 44.1879 97.179C44.8893 97.4201 45.6126 97.6393 46.3359 97.8146C48.5277 98.3845 50.7633 98.7133 52.9989 98.8009C53.5468 98.8229 54.1167 98.8448 54.6646 98.8229H54.9277H55.103H55.4537L55.8044 98.8009V98.8229C59.1578 103.601 65.0318 104.28 65.0318 104.28C69.2181 99.8749 69.4592 95.4913 69.4592 94.5489C69.4592 94.5489 69.4592 94.527 69.4592 94.4831C69.4592 94.3955 69.4592 94.3516 69.4592 94.3516C69.4592 94.2859 69.4592 94.2201 69.4592 94.1544C70.3359 93.5407 71.1688 92.8831 71.9578 92.1598C73.6236 90.6475 75.092 88.916 76.3194 87.053C76.429 86.8776 76.5386 86.7023 76.6482 86.527C81.3825 86.79 84.7359 83.59 84.7359 83.59C83.9468 78.6585 81.1414 76.2475 80.5496 75.7872C80.5496 75.7872 80.5277 75.7653 80.4838 75.7434C80.44 75.7215 80.44 75.6996 80.44 75.6996C80.4181 75.6777 80.3742 75.6557 80.3304 75.6338C80.3523 75.327 80.3742 75.042 80.3961 74.7352C80.44 74.2092 80.44 73.6612 80.44 73.1352V72.7407V72.5434V72.4338C80.44 72.3023 80.44 72.3461 80.44 72.3023L80.4181 71.9735L80.3961 71.5352C80.3961 71.3818 80.3742 71.2503 80.3523 71.1187C80.3304 70.9872 80.3304 70.8338 80.3085 70.7023L80.2646 70.2859L80.1989 69.8694C80.1112 69.3215 80.0236 68.7955 79.892 68.2475C79.3879 66.1215 78.5551 64.105 77.4811 62.2859C76.3852 60.4667 75.0263 58.8667 73.4701 57.5078C71.9359 56.1489 70.2044 55.053 68.4071 54.242C66.5879 53.4311 64.703 52.9051 62.8181 52.664C61.8756 52.5324 60.9331 52.4886 59.9907 52.5105H59.64H59.5523C59.5304 52.5105 59.4208 52.5105 59.4427 52.5105H59.2893L58.9386 52.5324C58.8071 52.5324 58.6756 52.5544 58.566 52.5544C58.0838 52.5982 57.6016 52.664 57.1414 52.7516C55.2564 53.1023 53.4811 53.7818 51.9249 54.7242C50.3688 55.6667 49.0099 56.8283 47.914 58.1434C46.8181 59.4585 45.9633 60.927 45.3715 62.4393C44.7797 63.9516 44.451 65.5297 44.3633 67.042C44.3414 67.4146 44.3414 67.8092 44.3414 68.1818C44.3414 68.2694 44.3414 68.379 44.3414 68.4667L44.3633 68.7735C44.3852 68.9489 44.3852 69.1461 44.4071 69.3215C44.4729 70.0886 44.6263 70.8338 44.8236 71.5352C45.24 72.9598 45.8975 74.253 46.7085 75.3489C47.5194 76.4448 48.5057 77.3434 49.5359 78.0667C50.566 78.7681 51.6838 79.2722 52.7797 79.6009C53.8756 79.9297 54.9715 80.0612 56.0016 80.0612C56.1331 80.0612 56.2647 80.0612 56.3742 80.0612C56.44 80.0612 56.5057 80.0612 56.5715 80.0612C56.6373 80.0612 56.703 80.0612 56.7688 80.0393C56.8783 80.0393 56.9879 80.0174 57.0975 80.0174C57.1194 80.0174 57.1633 80.0174 57.1852 79.9955L57.2948 79.9735C57.3605 79.9735 57.4263 79.9516 57.492 79.9516C57.6236 79.9297 57.7331 79.9078 57.8647 79.8859C57.9962 79.8639 58.1057 79.842 58.2153 79.7982C58.4564 79.7544 58.6756 79.6667 58.8948 79.6009C59.3331 79.4475 59.7715 79.2722 60.1441 79.0749C60.5386 78.8777 60.8893 78.6366 61.24 78.4174C61.3277 78.3516 61.4373 78.2859 61.5249 78.1982C61.8756 77.9133 61.9414 77.3872 61.6564 77.0366C61.4153 76.7297 60.977 76.642 60.6263 76.8393C60.5386 76.8831 60.451 76.927 60.3633 76.9708C60.0564 77.1242 59.7496 77.2557 59.4208 77.3653C59.092 77.4749 58.7414 77.5626 58.3907 77.6283C58.2153 77.6503 58.04 77.6722 57.8427 77.6941C57.7551 77.6941 57.6674 77.716 57.5578 77.716C57.4701 77.716 57.3605 77.716 57.2948 77.716C57.2071 77.716 57.1194 77.716 57.0318 77.716C56.9222 77.716 56.8126 77.716 56.703 77.6941C56.703 77.6941 56.6372 77.6941 56.6811 77.6941H56.6372H56.5715C56.5277 77.6941 56.4619 77.6941 56.4181 77.6722C56.3085 77.6503 56.2208 77.6503 56.1112 77.6283C55.3003 77.5187 54.4893 77.2776 53.7222 76.927C52.9331 76.5763 52.1879 76.0941 51.5085 75.4804C50.829 74.8667 50.2373 7Line truncated
|
||||
fill="#CCCCDC" fill-opacity="0.65"/>
|
||||
</g>
|
||||
<path d="M112 52.5L132 64.047L132 40.953L112 52.5ZM208 50.5L130 50.5L130 54.5L208 54.5L208 50.5Z" fill="#CCCCDC"
|
||||
fill-opacity="0.65"/>
|
||||
<path d="M208 76.5L188 64.953L188 88.047L208 76.5ZM190 74.5L112 74.5L112 78.5L190 78.5L190 74.5Z" fill="#CCCCDC"
|
||||
fill-opacity="0.65"/>
|
||||
<path d="M322.239 49.6189C318.977 42.1299 313.348 35.9175 306.217 31.9344C299.085 27.9512 290.843 26.4171 282.756 27.5673C274.669 28.7174 267.182 32.4883 261.443 38.3019C255.705 44.1154 252.031 51.6506 250.986 59.7522C245.901 60.9699 241.441 64.0127 238.451 68.3026C235.462 72.5924 234.152 77.8308 234.771 83.0227C235.39 88.2146 237.893 92.9986 241.807 96.4661C245.72 99.9337 250.771 101.843 255.999 101.832H314.666C321.063 101.815 327.24 99.4983 332.071 95.3057C336.902 91.1132 340.065 85.3238 340.983 78.9935C341.901 72.6631 340.513 66.2137 337.073 60.8213C333.632 55.429 328.367 51.4531 322.239 49.6189ZM314.666 91.1655H255.999C253.17 91.1655 250.457 90.0417 248.457 88.0413C246.457 86.041 245.333 83.3279 245.333 80.4989C245.333 77.6699 246.457 74.9568 248.457 72.9564C250.457 70.956 253.17 69.8322 255.999 69.8322C257.414 69.8322 258.77 69.2703 259.771 68.2701C260.771 67.2699 261.333 65.9134 261.333 64.4989C261.346 58.191 263.596 52.0922 267.681 47.286C271.766 42.4797 277.423 39.2773 283.646 38.2475C289.869 37.2178 296.256 38.4274 301.672 41.6616C307.087 44.8957 311.181 49.945 313.226 55.9122C313.539 56.8188 314.09 57.6242 314.823 58.2436C315.555 58.8631 316.44 59.2737 317.386 59.4322C321.295 60.1536 324.796 62.3044 327.206 65.4656C329.617 68.6269 330.764 72.5722 330.424 76.533C330.085 80.4938 328.283 84.1863 325.37 86.8913C322.457 89.5963 318.641 91.12 314.666 91.1655Z"
|
||||
fill="#CCCCDC" fill-opacity="0.65"/>
|
||||
<defs>
|
||||
<clipPath id="clip0_463_9219">
|
||||
<rect width="80" height="80" fill="white" transform="translate(8 24.5)"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 11 KiB |
@@ -65,8 +65,6 @@ function filterEndpoints(name: string) {
|
||||
return (
|
||||
!name.toLowerCase().includes('forallnamespaces') &&
|
||||
!name.toLowerCase().includes('getapiresources') &&
|
||||
!name.toLowerCase().includes('watch') &&
|
||||
!name.toLowerCase().includes('collection') &&
|
||||
!name.toLowerCase().includes('update')
|
||||
);
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user