From ff0ce6ac4e21673a6bc155445aff8eb3aa58884a Mon Sep 17 00:00:00 2001 From: shivang Date: Fri, 13 Feb 2026 11:16:28 +0530 Subject: [PATCH 01/10] added swift repo --- web/src/ar/SWIFT_REGISTRY_CHECKLIST.md | 123 +++++++++++++++ web/src/ar/common/types.ts | 3 +- web/src/ar/hooks/useGetRepositoryTypes.ts | 5 + .../repository-details/RepositoryFactory.tsx | 2 + .../SwiftRepository/SwiftRepositoryType.tsx | 124 +++++++++++++++ .../SwiftVersion/SwiftVersionType.tsx | 143 ++++++++++++++++++ .../SwiftArtifactDetailsPage.tsx | 82 ++++++++++ .../pages/overview/SwiftOverviewPage.tsx | 58 +++++++ .../overview/SwiftVersionGeneralInfo.tsx | 80 ++++++++++ .../pages/overview/styles.module.scss | 22 +++ .../pages/overview/styles.module.scss.d.ts | 19 +++ .../SwiftVersion/styles.module.scss | 11 ++ .../SwiftVersion/styles.module.scss.d.ts | 20 +++ .../version-details/SwiftVersion/types.ts | 19 +++ .../pages/version-details/VersionFactory.tsx | 2 + web/src/ar/strings/strings.en.yaml | 2 + web/src/ar/strings/types.ts | 2 + 17 files changed, 716 insertions(+), 1 deletion(-) create mode 100644 web/src/ar/SWIFT_REGISTRY_CHECKLIST.md create mode 100644 web/src/ar/pages/repository-details/SwiftRepository/SwiftRepositoryType.tsx create mode 100644 web/src/ar/pages/version-details/SwiftVersion/SwiftVersionType.tsx create mode 100644 web/src/ar/pages/version-details/SwiftVersion/pages/artifact-details/SwiftArtifactDetailsPage.tsx create mode 100644 web/src/ar/pages/version-details/SwiftVersion/pages/overview/SwiftOverviewPage.tsx create mode 100644 web/src/ar/pages/version-details/SwiftVersion/pages/overview/SwiftVersionGeneralInfo.tsx create mode 100644 web/src/ar/pages/version-details/SwiftVersion/pages/overview/styles.module.scss create mode 100644 web/src/ar/pages/version-details/SwiftVersion/pages/overview/styles.module.scss.d.ts create mode 100644 web/src/ar/pages/version-details/SwiftVersion/styles.module.scss create mode 100644 web/src/ar/pages/version-details/SwiftVersion/styles.module.scss.d.ts create mode 100644 web/src/ar/pages/version-details/SwiftVersion/types.ts diff --git a/web/src/ar/SWIFT_REGISTRY_CHECKLIST.md b/web/src/ar/SWIFT_REGISTRY_CHECKLIST.md new file mode 100644 index 0000000000..8d85cf7f52 --- /dev/null +++ b/web/src/ar/SWIFT_REGISTRY_CHECKLIST.md @@ -0,0 +1,123 @@ +# Adding Swift as a New Registry Type – Checklist + +Swift is added like existing types (Python, Maven, Generic, etc.): same API usage and UI, with a **Swift-specific icon** only. + +--- + +## 1. New files to create + +### 1.1 Version (artifact/version UI) + +| File | Purpose | +|------|--------| +| `web/src/ar/pages/version-details/SwiftVersion/SwiftVersionType.tsx` | Version type class (copy from `GenericVersion/GenericVersionType.tsx`, set `packageType = RepositoryPackageType.SWIFT`, icon/tree labels as needed). | +| `web/src/ar/pages/version-details/SwiftVersion/types.ts` | Types for Swift version (copy from `GenericVersion/types.ts` if you need artifact-detail types). | +| `web/src/ar/pages/version-details/SwiftVersion/pages/overview/SwiftOverviewPage.tsx` | Overview tab content (copy from `GenericVersion/pages/overview/OverviewPage.tsx`). | +| `web/src/ar/pages/version-details/SwiftVersion/pages/overview/SwiftVersionGeneralInfo.tsx` | General info card showing package type label (use `getString('packageTypes.swiftPackage')` and Swift icon). | +| `web/src/ar/pages/version-details/SwiftVersion/pages/overview/styles.module.scss` | Styles for overview (copy from Generic). | +| `web/src/ar/pages/version-details/SwiftVersion/pages/overview/styles.module.scss.d.ts` | Typings for overview styles. | +| `web/src/ar/pages/version-details/SwiftVersion/pages/artifact-details/SwiftArtifactDetailsPage.tsx` | Files tab / artifact details page (copy from `GenericVersion/pages/artifact-details/GenericArtifactDetailsPage.tsx`). | +| `web/src/ar/pages/version-details/SwiftVersion/pages/oss-details/OSSContentPage.tsx` | OSS tab (if Swift supports it; copy from Generic). | +| `web/src/ar/pages/version-details/SwiftVersion/pages/oss-details/OSSArtifactDetailsContent.tsx` | OSS artifact content (if needed). | +| `web/src/ar/pages/version-details/SwiftVersion/pages/oss-details/OSSGeneralInfoContent.tsx` | OSS general info (if needed). | +| `web/src/ar/pages/version-details/SwiftVersion/pages/oss-details/ossDetails.module.scss` (+ `.d.ts`) | OSS styles (if needed). | + +**Minimal set (same behavior as Generic):** +`SwiftVersionType.tsx`, `types.ts`, overview page + `SwiftVersionGeneralInfo.tsx` + styles, and `SwiftArtifactDetailsPage.tsx`. Add OSS files only if Swift should have the OSS tab. + +### 1.2 Repository (registry setup UI) + +| File | Purpose | +|------|--------| +| `web/src/ar/pages/repository-details/SwiftRepository/SwiftRepositoryType.tsx` | Repository type class (copy from `GenericRepository/GenericRepositoryType.tsx`, set `packageType = RepositoryPackageType.SWIFT`, `repositoryIcon = 'swift-icon'` or chosen icon). | + +Optional (if you add tests): + +- `web/src/ar/pages/repository-details/SwiftRepository/__tests__/__mockData__.ts` +- `web/src/ar/pages/repository-details/SwiftRepository/__tests__/CreateSwiftRegistry.test.tsx` +- `web/src/ar/pages/version-details/SwiftVersion/__tests__/` (e.g. list/overview/artifact details tests, copy from Generic). + +--- + +## 2. Existing files to modify + +### 2.1 Types and enums + +| File | Change | +|------|--------| +| `web/src/ar/common/types.ts` | In `RepositoryPackageType` enum add: `SWIFT = 'SWIFT'`. | + +### 2.2 Upstream proxy (if Swift supports upstream) + +| File | Change | +|------|--------| +| `web/src/ar/pages/upstream-proxy-details/types.ts` | In `UpstreamProxyPackageType` enum add: `SWIFT = 'SWIFT'`. | + +### 2.3 Factories (registration) + +| File | Change | +|------|--------| +| `web/src/ar/pages/version-details/VersionFactory.tsx` | Import `SwiftVersionType`, then `versionFactory.registerStep(new SwiftVersionType())`. | +| `web/src/ar/pages/repository-details/RepositoryFactory.tsx` | Import `SwiftRepositoryType`, then `repositoryFactory.registerStep(new SwiftRepositoryType())`. | + +### 2.4 Repository/package type lists (dropdowns and artifact list “type” column) + +| File | Change | +|------|--------| +| `web/src/ar/hooks/useGetRepositoryTypes.ts` | In `RepositoryTypes` array add: `{ label: 'repositoryTypes.swift', value: RepositoryPackageType.SWIFT, icon: 'swift-icon' }` (or chosen icon name). | +| `web/src/ar/hooks/useGetUpstreamRepositoryPackageTypes.ts` | In `UpstreamProxyPackageTypeList` add same entry with `value: UpstreamProxyPackageType.SWIFT` (if Swift supports upstream). | + +### 2.5 Strings (labels and types) + +| File | Change | +|------|--------| +| `web/src/ar/strings/strings.en.yaml` | Under `packageTypes:` add `swiftPackage: Swift Package`. Under `repositoryTypes:` add `swift: Swift`. | +| `web/src/ar/strings/types.ts` | In `StringsMap` add `'packageTypes.swiftPackage': string` and `'repositoryTypes.swift': string`. | + +### 2.6 Version type implementation details + +- In **`SwiftVersionType.tsx`**: + - Extend the same base as Generic (e.g. `VersionStep`). + - Set `protected packageType = RepositoryPackageType.SWIFT`. + - Set `protected hasArtifactRowSubComponent = true` if the artifact list row should expand (e.g. to show files). + - Point overview tab to `SwiftOverviewPage` and general info to `SwiftVersionGeneralInfo`. + - Point artifact-details tab to a page that uses `VersionFilesProvider` + `ArtifactFilesContent` (or `SwiftArtifactDetailsPage` which does the same). + - Use `renderArtifactTreeNodeView` / `renderVersionTreeNodeView` with your chosen **Swift icon** (e.g. `'swift-icon'`). +- In **`SwiftVersionGeneralInfo.tsx`**: use `getString('packageTypes.swiftPackage')` and the same Swift icon for the package type row. + +### 2.7 Repository type implementation details + +- In **`SwiftRepositoryType.tsx`**: + - Set `protected packageType = RepositoryPackageType.SWIFT`. + - Set `protected repositoryIcon: IconName = 'swift-icon'` (or the icon you use in `@harnessio/icons`). + - Keep the same create/configuration/actions/setup client/redirect/tree methods as Generic (or as needed). + +### 2.8 Icon + +- **Icon name:** Use one of: + - An existing icon in `@harnessio/icons` that fits Swift (e.g. a code/package icon), or + - A new icon (e.g. `swift-icon`) if your design system adds it. +- Replace every `'swift-icon'` in this checklist with the actual icon name you use. + +--- + +## 3. Backend / API + +- Ensure the backend and OpenAPI client accept **`SWIFT`** as a valid `package_type` (or equivalent) for: + - Creating/updating registries + - Listing/filtering artifacts and versions + - Version details and file listing +- If the backend uses an enum, add `SWIFT` there and regenerate the client if needed. + +--- + +## 4. Summary table + +| Category | New files | Modified files | +|----------|-----------|----------------| +| Version (SwiftVersion) | `SwiftVersionType.tsx`, `types.ts`, overview page + GeneralInfo + styles, `SwiftArtifactDetailsPage.tsx`, (optional) OSS pages + styles | — | +| Repository (SwiftRepository) | `SwiftRepositoryType.tsx` | — | +| Registration & types | — | `common/types.ts`, `upstream-proxy-details/types.ts`, `VersionFactory.tsx`, `RepositoryFactory.tsx` | +| Lists & strings | — | `useGetRepositoryTypes.ts`, `useGetUpstreamRepositoryPackageTypes.ts`, `strings.en.yaml`, `strings/types.ts` | + +No changes are required in **routes** or **RouteDestinations**: version/repository resolution is done via `versionFactory.getVersionType(packageType)` and `repositoryFactory.getRepositoryType(packageType)` using the new `SWIFT` enum value and registered types. diff --git a/web/src/ar/common/types.ts b/web/src/ar/common/types.ts index 25e6f53647..832ce47967 100644 --- a/web/src/ar/common/types.ts +++ b/web/src/ar/common/types.ts @@ -67,7 +67,8 @@ export enum RepositoryPackageType { HUGGINGFACE = 'HUGGINGFACE', CONDA = 'CONDA', DART = 'DART', - COMPOSER = 'COMPOSER' + COMPOSER = 'COMPOSER', + SWIFT = 'SWIFT' } export enum RepositoryConfigType { diff --git a/web/src/ar/hooks/useGetRepositoryTypes.ts b/web/src/ar/hooks/useGetRepositoryTypes.ts index 43a360b6a7..30359852d5 100644 --- a/web/src/ar/hooks/useGetRepositoryTypes.ts +++ b/web/src/ar/hooks/useGetRepositoryTypes.ts @@ -98,6 +98,11 @@ const RepositoryTypes: RepositoryTypeListItem[] = [ value: RepositoryPackageType.CARGO, icon: 'rust-logo' }, + { + label: 'repositoryTypes.swift' as keyof StringsMap, + value: 'SWIFT' as RepositoryPackageType, + icon: 'maven-repository-type' + }, { label: 'repositoryTypes.go', value: RepositoryPackageType.GO, diff --git a/web/src/ar/pages/repository-details/RepositoryFactory.tsx b/web/src/ar/pages/repository-details/RepositoryFactory.tsx index d8cc71fe84..b5d0e146da 100644 --- a/web/src/ar/pages/repository-details/RepositoryFactory.tsx +++ b/web/src/ar/pages/repository-details/RepositoryFactory.tsx @@ -29,6 +29,7 @@ import { HuggingfaceRepositoryType } from './HuggingfaceRepositoryType/Huggingfa import { CondaRepositoryType } from './CondaRepository/CondaRepositoryType' import { DartRepositoryType } from './DartRepository/DartRepositoryType' import { ComposerRepositoryType } from './ComposerRepository/ComposerRepositoryType' +import { SwiftRepositoryType } from './SwiftRepository/SwiftRepositoryType' repositoryFactory.registerStep(new DockerRepositoryType()) repositoryFactory.registerStep(new HelmRepositoryType()) @@ -44,3 +45,4 @@ repositoryFactory.registerStep(new HuggingfaceRepositoryType()) repositoryFactory.registerStep(new CondaRepositoryType()) repositoryFactory.registerStep(new DartRepositoryType()) repositoryFactory.registerStep(new ComposerRepositoryType()) +repositoryFactory.registerStep(new SwiftRepositoryType()) diff --git a/web/src/ar/pages/repository-details/SwiftRepository/SwiftRepositoryType.tsx b/web/src/ar/pages/repository-details/SwiftRepository/SwiftRepositoryType.tsx new file mode 100644 index 0000000000..f89f7af86d --- /dev/null +++ b/web/src/ar/pages/repository-details/SwiftRepository/SwiftRepositoryType.tsx @@ -0,0 +1,124 @@ +/* + * Copyright 2024 Harness, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React from 'react' +import type { IconName } from '@harnessio/icons' + +import type { StringKeys } from '@ar/frameworks/strings' +import { RepositoryConfigType, RepositoryPackageType } from '@ar/common/types' +import { + UpstreamProxyAuthenticationMode, + type UpstreamRegistryRequest, + UpstreamRepositoryURLInputSource +} from '@ar/pages/upstream-proxy-details/types' +import { + CreateRepositoryFormProps, + RepositoryActionsProps, + RepositoryConfigurationFormProps, + RepositoryDetailsHeaderProps, + RepositoryStep, + RepositoryTreeNodeProps, + RepositoySetupClientProps +} from '@ar/frameworks/RepositoryStep/Repository' + +import RepositoryDetails from '../RepositoryDetails' +import type { Repository, VirtualRegistryRequest } from '../types' + +// Backend does not support SWIFT in API client PackageType yet; cast for frontend compilation +const SWIFT_PACKAGE_TYPE = 'SWIFT' as VirtualRegistryRequest['packageType'] +import RepositoryActions from '../components/Actions/RepositoryActions' +import RedirectPageView from '../components/RedirectPageView/RedirectPageView' +import RepositoryTreeNode from '../components/RepositoryTreeNode/RepositoryTreeNode' +import SetupClientContent from '../components/SetupClientContent/SetupClientContent' +import RepositoryConfigurationForm from '../components/Forms/RepositoryConfigurationForm' +import RepositoryCreateFormContent from '../components/FormContent/RepositoryCreateFormContent' +import RepositoryDetailsHeader from '../components/RepositoryDetailsHeader/RepositoryDetailsHeader' + +export class SwiftRepositoryType extends RepositoryStep { + protected packageType = 'SWIFT' as RepositoryPackageType + protected repositoryName = 'Swift Repository' + protected repositoryIcon: IconName = 'maven-repository-type' + protected supportedScanners = [] + protected supportsUpstreamProxy = false + protected isWebhookSupported = false + enterpriseAdvancedOptionSubTitle: StringKeys = + 'repositoryDetails.repositoryForm.enterpriseAdvancedWithoutUpstreamOptionsSubTitle' + + protected defaultValues: VirtualRegistryRequest = { + packageType: SWIFT_PACKAGE_TYPE, + identifier: '', + config: { + type: RepositoryConfigType.VIRTUAL + }, + scanners: [], + isPublic: false + } + + protected defaultUpstreamProxyValues: UpstreamRegistryRequest = { + packageType: SWIFT_PACKAGE_TYPE, + identifier: '', + config: { + type: RepositoryConfigType.UPSTREAM, + source: UpstreamRepositoryURLInputSource.Custom, + authType: UpstreamProxyAuthenticationMode.ANONYMOUS, + url: '' + }, + cleanupPolicy: [], + scanners: [], + isPublic: false + } + + renderCreateForm(_props: CreateRepositoryFormProps): JSX.Element { + return + } + + renderCofigurationForm(props: RepositoryConfigurationFormProps): JSX.Element { + return + } + + renderActions(props: RepositoryActionsProps): JSX.Element { + return + } + + renderSetupClient(props: RepositoySetupClientProps): JSX.Element { + const { repoKey, onClose, artifactKey, versionKey } = props + return ( + + ) + } + + renderRepositoryDetailsHeader(props: RepositoryDetailsHeaderProps): JSX.Element { + return + } + + renderRedirectPage(): JSX.Element { + return + } + + renderTreeNodeView(props: RepositoryTreeNodeProps): JSX.Element { + return + } + + renderTreeNodeDetails(): JSX.Element { + return + } +} diff --git a/web/src/ar/pages/version-details/SwiftVersion/SwiftVersionType.tsx b/web/src/ar/pages/version-details/SwiftVersion/SwiftVersionType.tsx new file mode 100644 index 0000000000..4f600106e7 --- /dev/null +++ b/web/src/ar/pages/version-details/SwiftVersion/SwiftVersionType.tsx @@ -0,0 +1,143 @@ +/* + * Copyright 2024 Harness, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React from 'react' +import type { ArtifactVersionSummary } from '@harnessio/react-har-service-client' +import { + type ArtifactActionProps, + ArtifactRowSubComponentProps, + type VersionActionProps, + type ArtifactTreeNodeViewProps, + type VersionDetailsHeaderProps, + type VersionDetailsTabProps, + type VersionListTableProps, + VersionStep, + type VersionTreeNodeViewProps +} from '@ar/frameworks/Version/Version' +import { String } from '@ar/frameworks/strings' +import { PageType, RepositoryPackageType } from '@ar/common/types' +import VersionListTable, { + type CommonVersionListTableProps +} from '@ar/pages/version-list/components/VersionListTable/VersionListTable' +import { VersionListColumnEnum } from '@ar/pages/version-list/components/VersionListTable/types' +import ArtifactActions from '@ar/pages/artifact-details/components/ArtifactActions/ArtifactActions' +import ArtifactTreeNode from '@ar/pages/artifact-details/components/ArtifactTreeNode/ArtifactTreeNode' +import ArtifactTreeNodeDetailsContent from '@ar/pages/artifact-details/components/ArtifactTreeNode/ArtifactTreeNodeDetailsContent' +import { VersionDetailsTab } from '../components/VersionDetailsTabs/constants' +import SwiftOverviewPage from './pages/overview/SwiftOverviewPage' +import VersionTreeNode from '../components/VersionTreeNode/VersionTreeNode' +import VersionDetailsTabs from '../components/VersionDetailsTabs/VersionDetailsTabs' +import VersionDetailsHeaderContent from '../components/VersionDetailsHeaderContent/VersionDetailsHeaderContent' +import VersionFilesProvider from '../context/VersionFilesProvider' +import ArtifactFilesContent from '../components/ArtifactFileListTable/ArtifactFilesContent' +import VersionActions from '../components/VersionActions/VersionActions' +import { VersionAction } from '../components/VersionActions/types' + +export class SwiftVersionType extends VersionStep { + protected packageType = 'SWIFT' as RepositoryPackageType + protected hasArtifactRowSubComponent = true + protected allowedVersionDetailsTabs: VersionDetailsTab[] = [ + VersionDetailsTab.OVERVIEW, + VersionDetailsTab.ARTIFACT_DETAILS + ] + + versionListTableColumnConfig: CommonVersionListTableProps['columnConfigs'] = { + [VersionListColumnEnum.Name]: { width: '100%' }, + [VersionListColumnEnum.Size]: { width: '100%' }, + [VersionListColumnEnum.FileCount]: { width: '100%' }, + [VersionListColumnEnum.LastModified]: { width: '100%' }, + [VersionListColumnEnum.Actions]: { width: '10%' } + } + + protected allowedActionsOnVersion = [ + VersionAction.Delete, + VersionAction.SetupClient, + VersionAction.ViewVersionDetails, + VersionAction.Quarantine, + VersionAction.Download + ] + protected allowedActionsOnVersionDetailsPage = [ + VersionAction.Delete, + VersionAction.Quarantine, + VersionAction.Download + ] + + renderVersionListTable(props: VersionListTableProps): JSX.Element { + return + } + + renderVersionDetailsHeader(props: VersionDetailsHeaderProps): JSX.Element { + return + } + + renderVersionDetailsTab(props: VersionDetailsTabProps): JSX.Element { + switch (props.tab) { + case VersionDetailsTab.OVERVIEW: + return + case VersionDetailsTab.ARTIFACT_DETAILS: + return ( + + + + ) + default: + return + } + } + + renderArtifactActions(props: ArtifactActionProps): JSX.Element { + return + } + + renderVersionActions(props: VersionActionProps): JSX.Element { + switch (props.pageType) { + case PageType.Details: + return + case PageType.Table: + case PageType.GlobalList: + default: + return + } + } + + renderArtifactRowSubComponent(props: ArtifactRowSubComponentProps): JSX.Element { + return ( + + + + ) + } + + renderArtifactTreeNodeView(props: ArtifactTreeNodeViewProps): JSX.Element { + return + } + + renderArtifactTreeNodeDetails(): JSX.Element { + return + } + + renderVersionTreeNodeView(props: VersionTreeNodeViewProps): JSX.Element { + return + } + + renderVersionTreeNodeDetails(): JSX.Element { + return + } +} diff --git a/web/src/ar/pages/version-details/SwiftVersion/pages/artifact-details/SwiftArtifactDetailsPage.tsx b/web/src/ar/pages/version-details/SwiftVersion/pages/artifact-details/SwiftArtifactDetailsPage.tsx new file mode 100644 index 0000000000..3d1b6d2d8d --- /dev/null +++ b/web/src/ar/pages/version-details/SwiftVersion/pages/artifact-details/SwiftArtifactDetailsPage.tsx @@ -0,0 +1,82 @@ +/* + * Copyright 2024 Harness, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React from 'react' +import { Page } from '@harnessio/uicore' +import { useGetArtifactFilesQuery } from '@harnessio/react-har-service-client' + +import { DEFAULT_PAGE_INDEX } from '@ar/constants' +import { encodeRef } from '@ar/hooks/useGetSpaceRef' +import type { VersionDetailsPathParams } from '@ar/routes/types' +import { useDecodedParams, useGetSpaceRef, useParentHooks } from '@ar/hooks' +import { + type ArtifactFileListPageQueryParams, + useArtifactFileListQueryParamOptions +} from '@ar/pages/version-details/components/ArtifactFileListTable/utils' +import { LocalArtifactType } from '@ar/pages/repository-details/constants' +import ArtifactFileListTable from '@ar/pages/version-details/components/ArtifactFileListTable/ArtifactFileListTable' +import versionDetailsPageCss from '../../styles.module.scss' + +export default function SwiftArtifactDetailsPage() { + const registryRef = useGetSpaceRef() + const { useQueryParams, useUpdateQueryParams } = useParentHooks() + const { updateQueryParams } = useUpdateQueryParams>() + + const pathParams = useDecodedParams() + const queryParamOptions = useArtifactFileListQueryParamOptions() + const queryParams = useQueryParams(queryParamOptions) + const { page, size, sort } = queryParams + + const [sortField, sortOrder] = sort || [] + + const { + isFetching: loading, + error, + data, + refetch + } = useGetArtifactFilesQuery({ + registry_ref: registryRef, + artifact: encodeRef(pathParams.artifactIdentifier), + version: pathParams.versionIdentifier, + queryParams: { + page, + size, + sort_field: sortField, + sort_order: sortOrder, + artifact_type: pathParams.artifactType === LocalArtifactType.ARTIFACTS ? undefined : pathParams.artifactType + } + }) + const response = data?.content?.data + + return ( + refetch()}> + {response && ( + updateQueryParams({ page: pageNumber })} + setSortBy={sortArr => { + updateQueryParams({ sort: sortArr, page: DEFAULT_PAGE_INDEX }) + }} + sortBy={sort} + /> + )} + + ) +} diff --git a/web/src/ar/pages/version-details/SwiftVersion/pages/overview/SwiftOverviewPage.tsx b/web/src/ar/pages/version-details/SwiftVersion/pages/overview/SwiftOverviewPage.tsx new file mode 100644 index 0000000000..ea759dd753 --- /dev/null +++ b/web/src/ar/pages/version-details/SwiftVersion/pages/overview/SwiftOverviewPage.tsx @@ -0,0 +1,58 @@ +/* + * Copyright 2024 Harness, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React from 'react' +import { Layout } from '@harnessio/uicore' +import { useGetArtifactDetailsQuery } from '@harnessio/react-har-service-client' + +import { encodeRef } from '@ar/hooks/useGetSpaceRef' +import { useDecodedParams, useGetSpaceRef } from '@ar/hooks' +import type { VersionDetailsPathParams } from '@ar/routes/types' +import PageContent from '@ar/components/PageContent/PageContent' + +import type { SwiftArtifactDetails } from '../../types' +import SwiftVersionGeneralInfo from './SwiftVersionGeneralInfo' + +import genericStyles from '../../styles.module.scss' + +export default function SwiftOverviewPage() { + const pathParams = useDecodedParams() + const spaceRef = useGetSpaceRef() + + const { + data, + isFetching: loading, + error, + refetch + } = useGetArtifactDetailsQuery({ + registry_ref: spaceRef, + artifact: encodeRef(pathParams.artifactIdentifier), + version: pathParams.versionIdentifier, + queryParams: {} + }) + + const response = data?.content?.data as SwiftArtifactDetails + + return ( + + {response && ( + + + + )} + + ) +} diff --git a/web/src/ar/pages/version-details/SwiftVersion/pages/overview/SwiftVersionGeneralInfo.tsx b/web/src/ar/pages/version-details/SwiftVersion/pages/overview/SwiftVersionGeneralInfo.tsx new file mode 100644 index 0000000000..3dbcaf1e84 --- /dev/null +++ b/web/src/ar/pages/version-details/SwiftVersion/pages/overview/SwiftVersionGeneralInfo.tsx @@ -0,0 +1,80 @@ +/* + * Copyright 2024 Harness, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React from 'react' +import { isEmpty } from 'lodash-es' +import { FontVariation } from '@harnessio/design-system' +import { Card, Container, Layout, Text } from '@harnessio/uicore' + +import { useStrings, type StringKeys } from '@ar/frameworks/strings' +import { DEFAULT_DATE_TIME_FORMAT } from '@ar/constants' +import { getReadableDateTime } from '@ar/common/dateUtils' +import { LabelValueTypeEnum } from '@ar/pages/version-details/components/LabelValueContent/type' +import { LabelValueContent } from '@ar/pages/version-details/components/LabelValueContent/LabelValueContent' + +import type { SwiftArtifactDetails } from '../../types' + +import css from './styles.module.scss' + +interface SwiftVersionGeneralInfoProps { + data: SwiftArtifactDetails + className?: string +} + +export default function SwiftVersionGeneralInfo(props: SwiftVersionGeneralInfoProps) { + const { data, className } = props + const { getString } = useStrings() + return ( + + + + {getString('versionDetails.overview.generalInformation.title')} + + + + + + + + + + + ) +} diff --git a/web/src/ar/pages/version-details/SwiftVersion/pages/overview/styles.module.scss b/web/src/ar/pages/version-details/SwiftVersion/pages/overview/styles.module.scss new file mode 100644 index 0000000000..457c2a3294 --- /dev/null +++ b/web/src/ar/pages/version-details/SwiftVersion/pages/overview/styles.module.scss @@ -0,0 +1,22 @@ +.gridContainer { + align-items: center; + display: grid; + grid-template-columns: max-content auto; + row-gap: var(--spacing-medium); + column-gap: 30px; + + & :global(.StyledProps--font-variation-small-bold) { + font-size: 13px !important; + } + + & :global(.StyledProps--font-variation-small) { + font-size: 13px !important; + } + + & :global(.CopyToClipboard--copyIcon) { + & > svg { + height: 16px; + width: 16px; + } + } +} diff --git a/web/src/ar/pages/version-details/SwiftVersion/pages/overview/styles.module.scss.d.ts b/web/src/ar/pages/version-details/SwiftVersion/pages/overview/styles.module.scss.d.ts new file mode 100644 index 0000000000..9f8083f63b --- /dev/null +++ b/web/src/ar/pages/version-details/SwiftVersion/pages/overview/styles.module.scss.d.ts @@ -0,0 +1,19 @@ +/* + * Copyright 2023 Harness, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* eslint-disable */ +// This is an auto-generated file +export declare const gridContainer: string diff --git a/web/src/ar/pages/version-details/SwiftVersion/styles.module.scss b/web/src/ar/pages/version-details/SwiftVersion/styles.module.scss new file mode 100644 index 0000000000..bc2bfda261 --- /dev/null +++ b/web/src/ar/pages/version-details/SwiftVersion/styles.module.scss @@ -0,0 +1,11 @@ +.pageBody { + --page-header-height: 137px; +} + +.cardContainer { + width: 60% !important; + min-width: 1040px; + padding: var(--spacing-7) !important; + background-color: var(--white); + margin: var(--spacing-large); +} diff --git a/web/src/ar/pages/version-details/SwiftVersion/styles.module.scss.d.ts b/web/src/ar/pages/version-details/SwiftVersion/styles.module.scss.d.ts new file mode 100644 index 0000000000..8b495a36bb --- /dev/null +++ b/web/src/ar/pages/version-details/SwiftVersion/styles.module.scss.d.ts @@ -0,0 +1,20 @@ +/* + * Copyright 2023 Harness, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* eslint-disable */ +// This is an auto-generated file +export declare const cardContainer: string +export declare const pageBody: string diff --git a/web/src/ar/pages/version-details/SwiftVersion/types.ts b/web/src/ar/pages/version-details/SwiftVersion/types.ts new file mode 100644 index 0000000000..2b2f35efa0 --- /dev/null +++ b/web/src/ar/pages/version-details/SwiftVersion/types.ts @@ -0,0 +1,19 @@ +/* + * Copyright 2024 Harness, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { ArtifactDetail, GenericArtifactDetailConfig } from '@harnessio/react-har-service-client' + +export type SwiftArtifactDetails = ArtifactDetail & GenericArtifactDetailConfig diff --git a/web/src/ar/pages/version-details/VersionFactory.tsx b/web/src/ar/pages/version-details/VersionFactory.tsx index b2c4b4c4a2..d9384fcf41 100644 --- a/web/src/ar/pages/version-details/VersionFactory.tsx +++ b/web/src/ar/pages/version-details/VersionFactory.tsx @@ -29,6 +29,7 @@ import { HuggingfaceVersionType } from './HuggingfaceVersion/HuggingfaceVersionT import { CondaVersionType } from './CondaVersion/CondaVersionType' import { DartVersionType } from './DartVersion/DartVersionType' import { ComposerVersionType } from './ComposerVersion/ComposerVersionType' +import { SwiftVersionType } from './SwiftVersion/SwiftVersionType' versionFactory.registerStep(new DockerVersionType()) versionFactory.registerStep(new HelmVersionType()) @@ -44,3 +45,4 @@ versionFactory.registerStep(new HuggingfaceVersionType()) versionFactory.registerStep(new CondaVersionType()) versionFactory.registerStep(new DartVersionType()) versionFactory.registerStep(new ComposerVersionType()) +versionFactory.registerStep(new SwiftVersionType()) diff --git a/web/src/ar/strings/strings.en.yaml b/web/src/ar/strings/strings.en.yaml index c281c731be..226aa205aa 100644 --- a/web/src/ar/strings/strings.en.yaml +++ b/web/src/ar/strings/strings.en.yaml @@ -112,6 +112,7 @@ packageTypes: nugetPackage: NuGet Package rpmPackage: RPM Package cargoPackage: Cargo Package + swiftPackage: Swift Package goPackage: Go Package huggingfacePackage: Huggingface Package condaPackage: Conda Package @@ -130,6 +131,7 @@ repositoryTypes: go: Go debian: Debian cargo: Cargo + swift: Swift alpine: Alpine huggingface: Huggingface conda: Conda diff --git a/web/src/ar/strings/types.ts b/web/src/ar/strings/types.ts index 919a4f705b..89a0dcf770 100644 --- a/web/src/ar/strings/types.ts +++ b/web/src/ar/strings/types.ts @@ -605,6 +605,7 @@ export interface StringsMap { 'packageTypes.package': string 'packageTypes.pythonPackage': string 'packageTypes.rpmPackage': string + 'packageTypes.swiftPackage': string plaintext: string plusNewName: string prod: string @@ -629,6 +630,7 @@ export interface StringsMap { 'repositoryTypes.nuget': string 'repositoryTypes.pypi': string 'repositoryTypes.rpm': string + 'repositoryTypes.swift': string restore: string retriableError: string save: string From 1267021dd01be4a5b1bda455e8999c9949a4dd07 Mon Sep 17 00:00:00 2001 From: shivang Date: Fri, 13 Feb 2026 13:26:40 +0530 Subject: [PATCH 02/10] added swift repo --- web/src/ar/hooks/useGetRepositoryTypes.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/web/src/ar/hooks/useGetRepositoryTypes.ts b/web/src/ar/hooks/useGetRepositoryTypes.ts index 30359852d5..2f4dab8e6d 100644 --- a/web/src/ar/hooks/useGetRepositoryTypes.ts +++ b/web/src/ar/hooks/useGetRepositoryTypes.ts @@ -99,8 +99,8 @@ const RepositoryTypes: RepositoryTypeListItem[] = [ icon: 'rust-logo' }, { - label: 'repositoryTypes.swift' as keyof StringsMap, - value: 'SWIFT' as RepositoryPackageType, + label: 'repositoryTypes.swift', + value: RepositoryPackageType.SWIFT, icon: 'maven-repository-type' }, { @@ -148,3 +148,4 @@ const RepositoryTypes: RepositoryTypeListItem[] = [ tag: ThumbnailTagEnum.ComingSoon } ] + From 0f538134d438ed91da2441c6d6dc5fbdb981b838 Mon Sep 17 00:00:00 2001 From: shivang Date: Fri, 13 Feb 2026 15:50:03 +0530 Subject: [PATCH 03/10] Files of swift --- .../SwiftRepository/SwiftRepositoryType.tsx | 15 +-- .../SwiftVersion/SwiftVersionType.tsx | 24 ++-- .../SwiftArtifactDetailsPage.tsx | 112 +++++++++--------- .../SwiftVersionDependencyContent.tsx | 41 +++++++ .../SwiftVersionFilesContent.tsx | 35 ++++++ .../pages/overview/SwiftOverviewPage.tsx | 35 +----- .../overview/SwiftVersionGeneralInfo.tsx | 18 ++- .../version-details/SwiftVersion/types.ts | 26 +++- 8 files changed, 192 insertions(+), 114 deletions(-) create mode 100644 web/src/ar/pages/version-details/SwiftVersion/pages/artifact-details/SwiftVersionDependencyContent.tsx create mode 100644 web/src/ar/pages/version-details/SwiftVersion/pages/artifact-details/SwiftVersionFilesContent.tsx diff --git a/web/src/ar/pages/repository-details/SwiftRepository/SwiftRepositoryType.tsx b/web/src/ar/pages/repository-details/SwiftRepository/SwiftRepositoryType.tsx index f89f7af86d..29552bdbb4 100644 --- a/web/src/ar/pages/repository-details/SwiftRepository/SwiftRepositoryType.tsx +++ b/web/src/ar/pages/repository-details/SwiftRepository/SwiftRepositoryType.tsx @@ -17,7 +17,6 @@ import React from 'react' import type { IconName } from '@harnessio/icons' -import type { StringKeys } from '@ar/frameworks/strings' import { RepositoryConfigType, RepositoryPackageType } from '@ar/common/types' import { UpstreamProxyAuthenticationMode, @@ -36,9 +35,6 @@ import { import RepositoryDetails from '../RepositoryDetails' import type { Repository, VirtualRegistryRequest } from '../types' - -// Backend does not support SWIFT in API client PackageType yet; cast for frontend compilation -const SWIFT_PACKAGE_TYPE = 'SWIFT' as VirtualRegistryRequest['packageType'] import RepositoryActions from '../components/Actions/RepositoryActions' import RedirectPageView from '../components/RedirectPageView/RedirectPageView' import RepositoryTreeNode from '../components/RepositoryTreeNode/RepositoryTreeNode' @@ -48,17 +44,16 @@ import RepositoryCreateFormContent from '../components/FormContent/RepositoryCre import RepositoryDetailsHeader from '../components/RepositoryDetailsHeader/RepositoryDetailsHeader' export class SwiftRepositoryType extends RepositoryStep { - protected packageType = 'SWIFT' as RepositoryPackageType + protected packageType = RepositoryPackageType.SWIFT protected repositoryName = 'Swift Repository' protected repositoryIcon: IconName = 'maven-repository-type' protected supportedScanners = [] protected supportsUpstreamProxy = false protected isWebhookSupported = false - enterpriseAdvancedOptionSubTitle: StringKeys = - 'repositoryDetails.repositoryForm.enterpriseAdvancedWithoutUpstreamOptionsSubTitle' + protected defaultValues: VirtualRegistryRequest = { - packageType: SWIFT_PACKAGE_TYPE, + packageType: RepositoryPackageType.SWIFT as VirtualRegistryRequest['packageType'], identifier: '', config: { type: RepositoryConfigType.VIRTUAL @@ -68,7 +63,7 @@ export class SwiftRepositoryType extends RepositoryStep } protected defaultUpstreamProxyValues: UpstreamRegistryRequest = { - packageType: SWIFT_PACKAGE_TYPE, + packageType: RepositoryPackageType.SWIFT as UpstreamRegistryRequest['packageType'], identifier: '', config: { type: RepositoryConfigType.UPSTREAM, @@ -101,7 +96,7 @@ export class SwiftRepositoryType extends RepositoryStep artifactKey={artifactKey} versionKey={versionKey} onClose={onClose} - packageType={SWIFT_PACKAGE_TYPE} + packageType={RepositoryPackageType.SWIFT as Parameters[0]['packageType']} /> ) } diff --git a/web/src/ar/pages/version-details/SwiftVersion/SwiftVersionType.tsx b/web/src/ar/pages/version-details/SwiftVersion/SwiftVersionType.tsx index 4f600106e7..54f53000b5 100644 --- a/web/src/ar/pages/version-details/SwiftVersion/SwiftVersionType.tsx +++ b/web/src/ar/pages/version-details/SwiftVersion/SwiftVersionType.tsx @@ -37,7 +37,9 @@ import ArtifactActions from '@ar/pages/artifact-details/components/ArtifactActio import ArtifactTreeNode from '@ar/pages/artifact-details/components/ArtifactTreeNode/ArtifactTreeNode' import ArtifactTreeNodeDetailsContent from '@ar/pages/artifact-details/components/ArtifactTreeNode/ArtifactTreeNodeDetailsContent' import { VersionDetailsTab } from '../components/VersionDetailsTabs/constants' +import VersionOverviewProvider from '../context/VersionOverviewProvider' import SwiftOverviewPage from './pages/overview/SwiftOverviewPage' +import SwiftArtifactDetailsPage from './pages/artifact-details/SwiftArtifactDetailsPage' import VersionTreeNode from '../components/VersionTreeNode/VersionTreeNode' import VersionDetailsTabs from '../components/VersionDetailsTabs/VersionDetailsTabs' import VersionDetailsHeaderContent from '../components/VersionDetailsHeaderContent/VersionDetailsHeaderContent' @@ -55,11 +57,14 @@ export class SwiftVersionType extends VersionStep { ] versionListTableColumnConfig: CommonVersionListTableProps['columnConfigs'] = { - [VersionListColumnEnum.Name]: { width: '100%' }, + [VersionListColumnEnum.Name]: { width: '150%' }, [VersionListColumnEnum.Size]: { width: '100%' }, [VersionListColumnEnum.FileCount]: { width: '100%' }, + [VersionListColumnEnum.DownloadCount]: { width: '100%' }, + [VersionListColumnEnum.PullCommand]: { width: '100%' }, [VersionListColumnEnum.LastModified]: { width: '100%' }, - [VersionListColumnEnum.Actions]: { width: '10%' } + [VersionListColumnEnum.Actions]: { width: '30%' } + } protected allowedActionsOnVersion = [ @@ -67,7 +72,8 @@ export class SwiftVersionType extends VersionStep { VersionAction.SetupClient, VersionAction.ViewVersionDetails, VersionAction.Quarantine, - VersionAction.Download + VersionAction.Download, + VersionAction.DownloadCommand, ] protected allowedActionsOnVersionDetailsPage = [ VersionAction.Delete, @@ -86,12 +92,16 @@ export class SwiftVersionType extends VersionStep { renderVersionDetailsTab(props: VersionDetailsTabProps): JSX.Element { switch (props.tab) { case VersionDetailsTab.OVERVIEW: - return + return ( + + + + ) case VersionDetailsTab.ARTIFACT_DETAILS: return ( - - - + + + ) default: return diff --git a/web/src/ar/pages/version-details/SwiftVersion/pages/artifact-details/SwiftArtifactDetailsPage.tsx b/web/src/ar/pages/version-details/SwiftVersion/pages/artifact-details/SwiftArtifactDetailsPage.tsx index 3d1b6d2d8d..f95257087b 100644 --- a/web/src/ar/pages/version-details/SwiftVersion/pages/artifact-details/SwiftArtifactDetailsPage.tsx +++ b/web/src/ar/pages/version-details/SwiftVersion/pages/artifact-details/SwiftArtifactDetailsPage.tsx @@ -14,69 +14,69 @@ * limitations under the License. */ -import React from 'react' -import { Page } from '@harnessio/uicore' -import { useGetArtifactFilesQuery } from '@harnessio/react-har-service-client' +import React, { useCallback } from 'react' +import { Layout } from '@harnessio/uicore' -import { DEFAULT_PAGE_INDEX } from '@ar/constants' -import { encodeRef } from '@ar/hooks/useGetSpaceRef' -import type { VersionDetailsPathParams } from '@ar/routes/types' -import { useDecodedParams, useGetSpaceRef, useParentHooks } from '@ar/hooks' +import { useParentHooks } from '@ar/hooks' +import { useStrings } from '@ar/frameworks/strings' +import { ButtonTab, ButtonTabs } from '@ar/components/ButtonTabs/ButtonTabs' +import VersionFilesProvider from '@ar/pages/version-details/context/VersionFilesProvider' +import { useVersionOverview } from '@ar/pages/version-details/context/VersionOverviewProvider' +import ReadmeFileContent from '@ar/pages/version-details/components/ReadmeFileContent/ReadmeFileContent' + +import SwiftVersionFilesContent from './SwiftVersionFilesContent' +import SwiftVersionDependencyContent from './SwiftVersionDependencyContent' import { - type ArtifactFileListPageQueryParams, - useArtifactFileListQueryParamOptions -} from '@ar/pages/version-details/components/ArtifactFileListTable/utils' -import { LocalArtifactType } from '@ar/pages/repository-details/constants' -import ArtifactFileListTable from '@ar/pages/version-details/components/ArtifactFileListTable/ArtifactFileListTable' -import versionDetailsPageCss from '../../styles.module.scss' + SwiftArtifactDetails, + SwiftArtifactDetailsTabEnum, + type SwiftVersionDetailsQueryParams +} from '../../types' export default function SwiftArtifactDetailsPage() { - const registryRef = useGetSpaceRef() - const { useQueryParams, useUpdateQueryParams } = useParentHooks() - const { updateQueryParams } = useUpdateQueryParams>() - - const pathParams = useDecodedParams() - const queryParamOptions = useArtifactFileListQueryParamOptions() - const queryParams = useQueryParams(queryParamOptions) - const { page, size, sort } = queryParams - - const [sortField, sortOrder] = sort || [] + const { getString } = useStrings() + const { useUpdateQueryParams, useQueryParams } = useParentHooks() + const { updateQueryParams } = useUpdateQueryParams() + const { detailsTab = SwiftArtifactDetailsTabEnum.ReadMe } = + useQueryParams() + const { data } = useVersionOverview() + const { metadata } = data - const { - isFetching: loading, - error, - data, - refetch - } = useGetArtifactFilesQuery({ - registry_ref: registryRef, - artifact: encodeRef(pathParams.artifactIdentifier), - version: pathParams.versionIdentifier, - queryParams: { - page, - size, - sort_field: sortField, - sort_order: sortOrder, - artifact_type: pathParams.artifactType === LocalArtifactType.ARTIFACTS ? undefined : pathParams.artifactType - } - }) - const response = data?.content?.data + const handleTabChange = useCallback( + (nextTab: SwiftArtifactDetailsTabEnum): void => { + updateQueryParams({ detailsTab: nextTab }) + }, + [updateQueryParams] + ) return ( - refetch()}> - {response && ( - updateQueryParams({ page: pageNumber })} - setSortBy={sortArr => { - updateQueryParams({ sort: sortArr, page: DEFAULT_PAGE_INDEX }) - }} - sortBy={sort} + + + } + title={getString('versionDetails.artifactDetails.tabs.readme')} + /> + + + + } + title={getString('versionDetails.artifactDetails.tabs.files')} + /> + } + title={getString('versionDetails.artifactDetails.tabs.dependencies')} /> - )} - + + ) } diff --git a/web/src/ar/pages/version-details/SwiftVersion/pages/artifact-details/SwiftVersionDependencyContent.tsx b/web/src/ar/pages/version-details/SwiftVersion/pages/artifact-details/SwiftVersionDependencyContent.tsx new file mode 100644 index 0000000000..f914fd79cc --- /dev/null +++ b/web/src/ar/pages/version-details/SwiftVersion/pages/artifact-details/SwiftVersionDependencyContent.tsx @@ -0,0 +1,41 @@ +/* + * Copyright 2024 Harness, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React, { useMemo } from 'react' +import { Text } from '@harnessio/uicore' + +import { useStrings } from '@ar/frameworks/strings' +import { useVersionOverview } from '@ar/pages/version-details/context/VersionOverviewProvider' +import type { IDependencyList } from '@ar/pages/version-details/components/ArtifactDependencyListTable/types' +import ArtifactDependencyListTable from '@ar/pages/version-details/components/ArtifactDependencyListTable/ArtifactDependencyListTable' + +import type { SwiftArtifactDetails } from '../../types' + +export default function SwiftVersionDependencyContent() { + const { getString } = useStrings() + const { data } = useVersionOverview() + + const dependencies = useMemo((): IDependencyList => { + const _dependencies = data.metadata?.dependencies || [] + return _dependencies.map(dep => ({ name: dep.name, version: dep.version })) + }, [data.metadata?.dependencies]) + + if (!dependencies.length) { + return {getString('versionDetails.noDependencies')} + } + + return +} diff --git a/web/src/ar/pages/version-details/SwiftVersion/pages/artifact-details/SwiftVersionFilesContent.tsx b/web/src/ar/pages/version-details/SwiftVersion/pages/artifact-details/SwiftVersionFilesContent.tsx new file mode 100644 index 0000000000..24591bb30a --- /dev/null +++ b/web/src/ar/pages/version-details/SwiftVersion/pages/artifact-details/SwiftVersionFilesContent.tsx @@ -0,0 +1,35 @@ +/* + * Copyright 2024 Harness, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React, { useContext } from 'react' + +import { DEFAULT_PAGE_INDEX } from '@ar/constants' +import { VersionFilesContext } from '@ar/pages/version-details/context/VersionFilesProvider' +import ArtifactFileListTable from '@ar/pages/version-details/components/ArtifactFileListTable/ArtifactFileListTable' + +export default function SwiftVersionFilesContent() { + const { data, updateQueryParams, sort } = useContext(VersionFilesContext) + return ( + updateQueryParams({ page: pageNumber })} + setSortBy={sortArr => { + updateQueryParams({ sort: sortArr, page: DEFAULT_PAGE_INDEX }) + }} + sortBy={sort} + /> + ) +} diff --git a/web/src/ar/pages/version-details/SwiftVersion/pages/overview/SwiftOverviewPage.tsx b/web/src/ar/pages/version-details/SwiftVersion/pages/overview/SwiftOverviewPage.tsx index ea759dd753..21a6c2254a 100644 --- a/web/src/ar/pages/version-details/SwiftVersion/pages/overview/SwiftOverviewPage.tsx +++ b/web/src/ar/pages/version-details/SwiftVersion/pages/overview/SwiftOverviewPage.tsx @@ -15,44 +15,11 @@ */ import React from 'react' -import { Layout } from '@harnessio/uicore' -import { useGetArtifactDetailsQuery } from '@harnessio/react-har-service-client' -import { encodeRef } from '@ar/hooks/useGetSpaceRef' -import { useDecodedParams, useGetSpaceRef } from '@ar/hooks' -import type { VersionDetailsPathParams } from '@ar/routes/types' -import PageContent from '@ar/components/PageContent/PageContent' - -import type { SwiftArtifactDetails } from '../../types' import SwiftVersionGeneralInfo from './SwiftVersionGeneralInfo' import genericStyles from '../../styles.module.scss' export default function SwiftOverviewPage() { - const pathParams = useDecodedParams() - const spaceRef = useGetSpaceRef() - - const { - data, - isFetching: loading, - error, - refetch - } = useGetArtifactDetailsQuery({ - registry_ref: spaceRef, - artifact: encodeRef(pathParams.artifactIdentifier), - version: pathParams.versionIdentifier, - queryParams: {} - }) - - const response = data?.content?.data as SwiftArtifactDetails - - return ( - - {response && ( - - - - )} - - ) + return } diff --git a/web/src/ar/pages/version-details/SwiftVersion/pages/overview/SwiftVersionGeneralInfo.tsx b/web/src/ar/pages/version-details/SwiftVersion/pages/overview/SwiftVersionGeneralInfo.tsx index 3dbcaf1e84..df96e7e088 100644 --- a/web/src/ar/pages/version-details/SwiftVersion/pages/overview/SwiftVersionGeneralInfo.tsx +++ b/web/src/ar/pages/version-details/SwiftVersion/pages/overview/SwiftVersionGeneralInfo.tsx @@ -15,7 +15,7 @@ */ import React from 'react' -import { isEmpty } from 'lodash-es' +import { defaultTo, isEmpty } from 'lodash-es' import { FontVariation } from '@harnessio/design-system' import { Card, Container, Layout, Text } from '@harnessio/uicore' @@ -23,6 +23,7 @@ import { useStrings, type StringKeys } from '@ar/frameworks/strings' import { DEFAULT_DATE_TIME_FORMAT } from '@ar/constants' import { getReadableDateTime } from '@ar/common/dateUtils' import { LabelValueTypeEnum } from '@ar/pages/version-details/components/LabelValueContent/type' +import { useVersionOverview } from '@ar/pages/version-details/context/VersionOverviewProvider' import { LabelValueContent } from '@ar/pages/version-details/components/LabelValueContent/LabelValueContent' import type { SwiftArtifactDetails } from '../../types' @@ -30,13 +31,14 @@ import type { SwiftArtifactDetails } from '../../types' import css from './styles.module.scss' interface SwiftVersionGeneralInfoProps { - data: SwiftArtifactDetails className?: string } export default function SwiftVersionGeneralInfo(props: SwiftVersionGeneralInfoProps) { - const { data, className } = props + const { className } = props + const { data } = useVersionOverview() const { getString } = useStrings() + return ( + + + } +} + +export type SwiftArtifactDetails = ArtifactDetail & LocalSwiftArtifactDetailConfig From 50d662a6b26e0515f5fea3274ac448acb975687a Mon Sep 17 00:00:00 2001 From: shivang Date: Wed, 18 Feb 2026 11:38:44 +0530 Subject: [PATCH 04/10] swift files --- web/.npmrc | 2 + web/src/ar/AR_REPO_STRUCTURE_REFERENCE.md | 382 ++++++++++++++++++ web/src/ar/SWIFT_ICON_SETUP.md | 144 +++++++ web/src/ar/hooks/useGetRepositoryTypes.ts | 2 +- .../SwiftRepository/SwiftRepositoryType.tsx | 2 +- .../SwiftVersion/SwiftVersionType.tsx | 4 +- .../overview/SwiftVersionGeneralInfo.tsx | 2 +- web/yarn.lock | 8 +- 8 files changed, 537 insertions(+), 9 deletions(-) create mode 100644 web/.npmrc create mode 100644 web/src/ar/AR_REPO_STRUCTURE_REFERENCE.md create mode 100644 web/src/ar/SWIFT_ICON_SETUP.md diff --git a/web/.npmrc b/web/.npmrc new file mode 100644 index 0000000000..4c932be17b --- /dev/null +++ b/web/.npmrc @@ -0,0 +1,2 @@ +# Use public npm registry (avoids host.docker.internal / custom registry when running yarn install locally) +registry=https://registry.npmjs.org/ diff --git a/web/src/ar/AR_REPO_STRUCTURE_REFERENCE.md b/web/src/ar/AR_REPO_STRUCTURE_REFERENCE.md new file mode 100644 index 0000000000..fb66a90ce9 --- /dev/null +++ b/web/src/ar/AR_REPO_STRUCTURE_REFERENCE.md @@ -0,0 +1,382 @@ +# Artifact Registry (AR) – Complete Repo Structure & UI Reference + +This document describes the **entire structure** of the AR (Artifact Registry) frontend with **absolute detail**, mapped to the UI. Use it as a single reference for navigation, routing, pages, factories, and data flow. + +--- + +## 1. Overview + +- **What AR is**: The Artifact Registry module lets users manage **registries** (repositories), **packages/artifacts**, and **versions** for multiple package types (Docker, NPM, Maven, Swift, Go, etc.). +- **Tech**: React, TypeScript, React Router, TanStack Query, Harness UI Core, YAML strings for i18n. +- **Location**: `web/src/ar/` (all paths below are relative to this unless stated). + +--- + +## 2. Entry Point & App Bootstrap + +### 2.1 App entry + +- **File**: `app/App.tsx` +- **Role**: Root component of the AR micro-frontend. It: + - Wraps the app in **QueryClientProvider** (TanStack React Query). + - Provides **AppStoreContext** (scope, baseUrl, matchPath, parent OSS/Enterprise, repository list view type, public access flags). + - Provides **StringsContextProvider** with `strings.en.yaml`. + - Provides **ParentProvider** with hooks and components from the parent (Harness/Gitness) – e.g. `useQueryParams`, `useUpdateQueryParams`, `usePermission`, `RbacButton`, `ModalProvider`, `PageNotPublic`. + - Registers **factories** by importing: + - `@ar/pages/version-details/VersionFactory` – registers all version types (Docker, NPM, Swift, …). + - `@ar/pages/repository-details/RepositoryFactory` – registers all repository types. + - Renders **NavComponent** (or custom) and inside it **AsyncDownloadRequestsProvider** and lazy **RouteDestinations** (the router). + +**UI**: No direct UI; it’s the shell. The first visible UI is either the **Repository List** (list or tree) or a **Redirect** page, depending on the route. + +### 2.2 API client + +- **File**: `app/useOpenApiClient.ts` +- **Role**: Configures OpenAPI clients (HAR Service, SSCA Manager, NG Manager) with interceptors (e.g. 401 handling) and custom headers from parent. Called once in `App.tsx`. + +--- + +## 3. Routing & URL Structure (UI Mapping) + +### 3.1 Route definitions + +- **File**: `routes/RouteDefinitions.ts` +- **Path types**: `routes/types.ts` + +Routes are built by `routeDefinitions` and can be wrapped with a “mode” prefix (e.g. org/project) via `routeDefinitionWithMode` in `routes/utils.ts`. **Hook**: `useRoutes()` (and `useRoutes(true)` for path-only definitions) from `hooks/useRoutes.ts`. + +| Route method | Typical path (relative) | UI | +|--------------|--------------------------|-----| +| `toAR()` | `/` | Redirects to repository list. | +| `toARRedirect()` | `/redirect?...` | Redirect page (e.g. deep links with packageType, registryId, artifactId, versionId). | +| `toARRepositories()` | `/registries` | **Repository list** (list or tree depending on `repositoryListViewType`). | +| `toARRepositoryDetails({ repositoryIdentifier })` | `/registries/:repositoryIdentifier` | **Repository details** – default tab (e.g. Packages). | +| `toARRepositoryDetailsTab({ repositoryIdentifier, tab })` | `/registries/:repositoryIdentifier/:tab` | **Repository details** – specific tab (packages, configuration, webhooks, metadata). | +| `toARArtifacts()` | (context-dependent) | **Global artifact list** (all artifacts across registries). | +| `toARArtifactDetails({ repositoryIdentifier, artifactType, artifactIdentifier })` | `/registries/:repo/:artifactType/:artifactIdentifier` | **Artifact details** – default sub-route (e.g. Versions). | +| `toARArtifactVersions(...)` | `.../versions` | **Artifact details** – **Versions** tab (version list table). | +| `toARArtifactProperties(...)` | `.../properties` | **Artifact details** – **Metadata/Properties** tab. | +| `toARVersionDetails({ ... params, versionIdentifier })` | `.../versions/:versionIdentifier` | **Version details** – default tab (usually Overview). | +| `toARVersionDetailsTab({ ... params, versionTab })` | `.../versions/:versionIdentifier/:versionTab` | **Version details** – specific tab (overview, artifact_details, supply_chain, etc.). | +| `toARRepositoryWebhookDetails(...)` | `/registries/:repo/webhooks/:webhookIdentifier` | **Webhook details**. | +| `toARRepositoryWebhookDetailsTab(...)` | `.../webhooks/:id/:tab` | **Webhook details** – tab. | + +**Note**: In **Gitness** (OSS), route definitions may be under a different base (e.g. space); see `gitness/utils/getARRouteDefinitions.ts` and `giness/RouteDefinitions.ts`. + +### 3.2 Route destinations (what renders where) + +- **File**: `routes/RouteDestinations.tsx` + +**Logic**: + +- **`/`** → redirect to `toARRepositories()`. +- **`/redirect`** → **RedirectPage**. +- **`/registries`** (exact): + - If **Directory** view → **RepositoryListTreeViewPage**. + - If **List** view → **RepositoryListPage**. +- **`/registries/:repositoryIdentifier`** and **`/registries/:repositoryIdentifier/:tab`** → **RepositoryDetailsPage** (public routes). +- **Webhook routes** → **WebhookDetailsPage**. +- **Version details routes** (multiple path variants for org/project/pipeline/ssca) → **VersionDetailsPage** (only when `parent === Enterprise` or `repositoryListViewType === Directory`; i.e. “separate version details route”). +- **Artifact routes** (`.../versions`, `.../properties`, `.../[artifactType]/[artifactIdentifier]`) → **ArtifactDetailsPage** (which internally can show version list or version details in OSS when not using separate version route). + +So: + +- **Repository list** (list or tree) → **RepositoryListPage** or **RepositoryListTreeViewPage**. +- **Repository details** (tabs: Packages/Datasets/Models/Configuration/Webhooks/Metadata) → **RepositoryDetailsPage**. +- **Artifact details** (tabs: Versions, Metadata) → **ArtifactDetailsPage**. +- **Version details** (tabs: Overview, Artifact details, Supply chain, etc.) → **VersionDetailsPage** (when using separate route) or embedded under **ArtifactDetailsPage** (OSS list view). + +--- + +## 4. Page Hierarchy & UI Flow + +High-level flow: + +``` +App + └─ NavComponent + └─ AsyncDownloadRequestsProvider + └─ RouteDestinations (Switch) + ├─ Repository List (list or tree) + ├─ Repository Details (header + tabs) + │ ├─ Packages / Datasets / Models → artifact list for that repo (and type) + │ ├─ Configuration → repo config form + │ ├─ Webhooks → webhook list + │ └─ Metadata → properties form + ├─ Artifact Details (header + tabs) + │ ├─ Versions → version list table (package-type-specific columns/actions) + │ └─ Metadata → properties + │ (When separate version route is used, version details live on VersionDetailsPage.) + ├─ Version Details (header + tabs) + │ ├─ Overview → package-type-specific overview (e.g. SwiftOverviewPage) + │ ├─ Artifact details → package-type-specific artifact details (e.g. readme, files, dependencies) + │ ├─ Supply chain / Security tests / Deployments / Code (Enterprise, feature-flagged) + │ └─ OSS (open source view) + ├─ Webhook Details + └─ Redirect +``` + +--- + +## 5. Factory Pattern (Repository & Version) + +The UI is **package-type-aware** via two factory patterns. Each **package type** (DOCKER, NPM, SWIFT, etc.) has: + +1. A **Repository** type (e.g. `SwiftRepositoryType`) – defines repo creation form, config form, setup client, tabs, tree node, etc. +2. A **Version** type (e.g. `SwiftVersionType`) – defines version list table, version details header, version details tabs (overview, artifact details, etc.), artifact/version actions, tree views, row expand (files). + +### 5.1 Version factory + +- **Framework base**: `frameworks/Version/Version.tsx` – abstract class **VersionStep\**. + - Key abstract props: `packageType`, `allowedVersionDetailsTabs`, `hasArtifactRowSubComponent`. + - Abstract render methods: `renderVersionListTable`, `renderVersionDetailsHeader`, `renderVersionDetailsTab`, `renderArtifactActions`, `renderVersionActions`, `renderArtifactRowSubComponent`, `renderArtifactTreeNodeView`, `renderArtifactTreeNodeDetails`, `renderVersionTreeNodeView`, `renderVersionTreeNodeDetails`. +- **Framework factory**: `frameworks/Version/VersionAbstractFactory.tsx` (base), `frameworks/Version/VersionFactory.tsx` (singleton). +- **Registration**: `pages/version-details/VersionFactory.tsx` – imports **versionFactory** and registers every *VersionType* (Docker, Helm, Generic, Maven, Npm, Python, NuGet, RPM, Cargo, Go, Huggingface, Conda, Dart, Composer, **Swift**). + +**Widgets** (resolve package type and delegate to the registered step): + +- **VersionListTableWidget** – `versionFactory.getVersionType(packageType).renderVersionListTable(...)` → **Version list table** on Artifact Details → Versions tab. +- **VersionDetailsHeaderWidget** – renders **Version details header** (title, breadcrumbs). +- **VersionDetailsTabWidget** – renders **Version details tab content** (Overview, Artifact details, etc.) by `versionTab` from URL. + +So: **Version list**, **Version details header**, and **Version details tab content** are all chosen by `packageType` from the factory. + +### 5.2 Repository factory + +- **Framework base**: `frameworks/RepositoryStep/Repository.tsx` – abstract class **RepositoryStep\**. + - Key abstract props: `packageType`, `repositoryName`, `defaultValues`, `defaultUpstreamProxyValues`, `repositoryIcon`, `supportsUpstreamProxy`, optional `supportedScanners`, `isWebhookSupported`, `supportedRepositoryTabs`, etc. + - Abstract render methods: `renderCreateForm`, `renderCofigurationForm`, `renderActions`, `renderSetupClient`, `renderRepositoryDetailsHeader`, `renderRedirectPage`, `renderTreeNodeView`, `renderTreeNodeDetails`. +- **Framework factory**: `frameworks/RepositoryStep/RepositoryAbstractFactory.tsx`, `frameworks/RepositoryStep/RepositoryFactory.tsx` (singleton). +- **Registration**: `pages/repository-details/RepositoryFactory.tsx` – registers every *RepositoryType* (Docker, Maven, Helm, … Swift). + +**Usage**: + +- **Repository details tabs**: `repositoryFactory.getRepositoryType(data?.packageType)` → `getSupportedRepositoryTabs()` → filters **RepositoryDetailsTabs** (Packages, Configuration, Webhooks, Metadata, etc.). +- **Repository configuration form**: **RepositoryConfigurationFormWidget** uses repository type to render the correct config form. +- **Create repository**: Package type selector and create flow use repository types (e.g. from `hooks/useGetRepositoryTypes.ts`). + +--- + +## 6. Key Pages in Detail (with UI) + +### 6.1 Repository list + +- **List view**: `pages/repository-list/RepositoryListPage.tsx` + - **UI**: Page header (title, breadcrumbs), filters (search, package type, repository type, config type, scope, soft delete), list/table toggle, **RepositoryListTable**, “Create repository” button. + - **Data**: `useLocalGetRegistriesQuery` (or equivalent) with query params (search, page, size, repositoryTypes, configType, scope, softDeleteFilter). +- **Tree view**: `pages/repository-list/RepositoryListTreeViewPage.tsx` + - **UI**: Header, package type / config type filters, **RepositoryListTreeView** (tree of repos → artifacts → versions). Clicking a node navigates (e.g. `toARRepositoryDetailsTab`, `toARArtifactDetails`, `toARVersionDetailsTab`). + +### 6.2 Repository details + +- **Page**: `pages/repository-details/RepositoryDetailsPage.tsx` + - Structure: **RepositoryProvider** → **RepositoryHeader** + **RepositoryDetails**. +- **RepositoryProvider** (`context/RepositoryProvider.tsx`): Fetches registry by `repositoryIdentifier` (and scope), provides `data`, `isReadonly`, `refetch`, `setIsDirty`, `setIsUpdating` to children. +- **RepositoryDetails** (`RepositoryDetails.tsx`): Renders **tabs** (Packages, Datasets, Models, Configuration, Webhooks, Metadata) based on `repositoryFactory.getRepositoryType(data?.packageType).getSupportedRepositoryTabs()` and feature flags / parent. Active tab drives route (`repositoryDetailsTabPathProps`). Tab content is rendered by **RepositoryDetailsTabPage**. +- **RepositoryDetailsTabPage** (`RepositoryDetailsTabPage.tsx`): + - **PACKAGES** → **RegistryArtifactListPage** (artifact list for this repo, `artifactType=ARTIFACTS`). + - **DATASETS** / **MODELS** → same with `artifactType=DATASET` / `MODEL`. + - **CONFIGURATION** → **RepositoryConfigurationFormWidget** (package-type-specific form). + - **WEBHOOKS** → **WebhookListPage**. + - **METADATA** → **PropertiesFormContent**. + +**UI**: Repository name/title in header, breadcrumbs, tab bar. Content = one of the above. + +### 6.3 Artifact details + +- **Page**: `pages/artifact-details/ArtifactDetailsPage.tsx` + - **ArtifactProvider** (repoKey, artifact from path) → **ArtifactDetailsHeader** + **ArtifactDetails**. +- **ArtifactDetails** (`ArtifactDetails.tsx`): Tabs come from `versionFactory.getVersionType(data?.packageType).getSupportedArtifactTabs()` (typically **Versions**, **Metadata**). Tab change updates route (`toARArtifactVersions` / `toARArtifactProperties`). Content: + - **VERSIONS** → **VersionListPage** (which uses **VersionListTableWidget** → package-type-specific **VersionListTable** with columns and actions). + - **METADATA** → **PropertiesFormContent**. + - When **separate version details route** is not used (e.g. OSS list view), version detail can be shown via **OSSVersionDetailsPage** or inline. + +**UI**: Artifact name in header, breadcrumbs, Versions / Metadata tabs. Versions tab = table of versions (name, size, file count, download count, pull command, last modified, actions). Row expand (if `hasArtifactRowSubComponent`) shows e.g. **ArtifactFilesContent** (minimal file list). + +### 6.4 Version details + +- **Page**: `pages/version-details/VersionDetailsPage.tsx` + - **VersionProvider** (repoKey, artifactKey, versionKey from path) → **VersionDetails**. +- **VersionProvider** (`context/VersionProvider.tsx`): Fetches **artifact version summary** by repo/artifact/version (and optional digest). Provides `data`, `isReadonly`, `refetch`, etc., to children. +- **VersionDetails** (`VersionDetails.tsx`): **VersionDetailsHeader** + **VersionDetailsTabs**. + - **VersionDetailsHeader**: Uses **VersionDetailsHeaderWidget** with `data.packageType` and `data` → package-type-specific header content (e.g. **VersionDetailsHeaderContent** for Swift/Generic). + - **VersionDetailsTabs**: Reads `versionTab` from URL; builds tab list from **VersionDetailsTabList** filtered by `versionType.getAllowedVersionDetailsTab()` and feature flags / parent. Each tab navigates to `toARVersionDetailsTab(..., versionTab)`. Tab **content** is rendered by **VersionDetailsTabWidget** → `versionFactory.getVersionType(packageType).renderVersionDetailsTab({ tab })`. + +**Tab content examples (by package type)**: + +- **OVERVIEW**: e.g. **SwiftOverviewPage** → **SwiftVersionGeneralInfo** (card with name, version, package type, size, downloads, uploaded by, description). Other types: **PythonVersionOverviewPage**, **NuGetVersionOverviewPage**, **GoVersionOverviewPage**, etc. +- **ARTIFACT_DETAILS**: e.g. **SwiftArtifactDetailsPage** → tabs Readme / Files / Dependencies (**SwiftVersionFilesContent**, **SwiftVersionDependencyContent**, **ReadmeFileContent**). Other types have their own artifact-details pages (NuGet, Npm, Python, etc.). +- **CODE** / **OSS**: Some types render **OSSContentPage** or similar. +- **SUPPLY_CHAIN**, **SECURITY_TESTS**, **DEPLOYMENTS**: Enterprise, feature-flagged. + +**UI**: Version identifier in header, breadcrumbs (Repository → Artifact). Tab bar (Overview, Artifact details, …). Content = one of the above. + +### 6.5 Global artifact list + +- **Page**: `pages/artifact-list/ArtifactListPage.tsx` + - **UI**: Header, filters (search, repository, package types, deployed artifacts, soft delete, metadata filter), **ArtifactListTable**. Used when navigating to “Artifacts” (e.g. `toARArtifacts()`). + +--- + +## 7. Contexts & Providers + +| Context / Provider | File | Purpose | +|--------------------|------|---------| +| **AppStoreContext** | `contexts/AppStoreContext.tsx` | Scope (account/org/project/space), baseUrl, matchPath, parent (OSS/Enterprise), repositoryListViewType, setRepositoryListViewType, isPublicAccessEnabledOnResources, isCurrentSessionPublic. | +| **ParentProvider** | `contexts/ParentProvider.tsx` | Injects parent’s hooks (useQueryParams, useUpdateQueryParams, usePermission, useConfirmationDialog, useModalHook, …) and components (RbacButton, ModalProvider, PageNotPublic, …). | +| **RepositoryProviderContext** | `pages/repository-details/context/RepositoryProvider.tsx` | Current repository `data`, isDirty, isUpdating, isReadonly, refetch, setIsDirty, setIsUpdating. | +| **ArtifactProviderContext** | `pages/artifact-details/context/ArtifactProvider.tsx` | Current artifact `data`, isDirty, isUpdating, isReadonly, refetch, setters. | +| **VersionProviderContext** | `pages/version-details/context/VersionProvider.tsx` | Current version summary `data`, isReadonly, refetch, isDirty, isUpdating, setters. | +| **VersionOverviewContext** | `pages/version-details/context/VersionOverviewProvider.tsx` | Used **inside** version details tab content; provides full **artifact details** `data` and refetch (e.g. for Overview and Artifact details tabs that need readme, dependencies, metadata). | +| **VersionFilesContext** | `pages/version-details/context/VersionFilesProvider.tsx` | Paginated/sortable **file list** for a version; used by “Files” tab and expandable row file list. | +| **AsyncDownloadRequestsProvider** | `contexts/AsyncDownloadRequestsProvider/AsyncDownloadRequestsProvider.tsx` | Tracks async download requests (e.g. for bulk download). | + +--- + +## 8. Hooks (main ones) + +- **File**: `hooks/index.ts` (re-exports). + +| Hook | Purpose | +|------|---------| +| **useAppStore** | Access AppStoreContext (scope, parent, repositoryListViewType, etc.). | +| **useRoutes** | Get route builder (toARRepositories, toARVersionDetailsTab, …). | +| **useDecodedParams** | Decode path params (e.g. repositoryIdentifier, artifactIdentifier, versionIdentifier, tab). | +| **useParentHooks** | Parent’s useQueryParams, useUpdateQueryParams, usePreferenceStore, usePermission. | +| **useParentComponents** | Parent’s RbacButton, ModalProvider, PageNotPublic, etc. | +| **useGetSpaceRef** | Space/scope ref for API calls (account/org/project/space). | +| **useGetRepositoryListViewType** | List vs Directory view. | +| **useFeatureFlags** / **useFeatureFlag** | Feature flags (e.g. HAR_CUSTOM_METADATA_ENABLED, HAR_TRIGGERS). | +| **useAllowSoftDelete** | Whether soft-delete filter/actions are allowed. | +| **useGetRepositoryTypes** | List of repository types for selectors (from `hooks/useGetRepositoryTypes.ts` – includes **RepositoryTypes** array with label, value, icon; Swift is here with icon `maven-repository-type` until a Swift icon is added). | + +--- + +## 9. Frameworks (Version & Repository steps) + +### 9.1 Version framework (`frameworks/Version/`) + +- **Version.tsx** – Abstract **VersionStep\** (see section 5.1). +- **VersionAbstractFactory.tsx** – Map of packageType → VersionStep; `registerStep`, `getVersionType`. +- **VersionFactory.tsx** – Singleton factory instance. +- **VersionListTableWidget.tsx** – Resolves version type, renders version list table. +- **VersionDetailsHeaderWidget.tsx** – Resolves version type, renders version details header. +- **VersionDetailsTabWidget.tsx** – Resolves version type, renders version details tab panel. +- **VersionActionsWidget.tsx** – Version actions (e.g. delete, setup client, quarantine, download). +- **ArtifactActionsWidget.tsx**, **ArtifactRowSubComponentWidget.tsx**, **ArtifactTreeNodeViewWidget.tsx**, **ArtifactTreeNodeDetailsWidget.tsx**, **VersionTreeNodeViewWidget.tsx**, **VersionTreeNodeDetailsWidget.tsx** – Delegate to version type for artifact/version tree and row expand. + +### 9.2 Repository framework (`frameworks/RepositoryStep/`) + +- **Repository.tsx** – Abstract **RepositoryStep\** (see section 5.2). +- **RepositoryAbstractFactory.tsx** – Map of packageType → RepositoryStep. +- **RepositoryFactory.tsx** – Singleton. +- **RepositoryConfigurationFormWidget.tsx** – Renders package-type-specific configuration form. +- **RepositoryDetailsHeaderWidget.tsx**, **CreateRepositoryWidget.tsx**, **RepositoryActionsWidget.tsx**, **RepositoryTreeNodeViewWidget.tsx**, **RepositoryTreeNodeDetailsWidget.tsx**, **RepositorySetupClientWidget.tsx**, **RedirectWidget.tsx** – All delegate to repository type. + +--- + +## 10. Shared Components (`components/`) + +Used across pages. Examples: + +- **Breadcrumbs** – Breadcrumb links (e.g. Repositories > Artifacts > Version). +- **ButtonTabs** / **ButtonTab** – Tab UI used in version artifact details (Readme, Files, Dependencies). +- **TabsContainer** – Wraps tab content. +- **RouteProvider** – Wraps a Route; handles public vs non-public (PageNotPublic) and **ParentSyncProvider**. +- **PackageTypeSelector** – Filter by package type (Docker, NPM, Swift, …). +- **MetadataFilterSelector** – Custom metadata filter (e.g. HAR_CUSTOM_METADATA_ENABLED). +- **PropertiesForm** / **PropertiesFormContent** – Metadata/properties form (repository metadata, artifact properties). +- **TreeView** – Tree (e.g. repository tree view). +- **SetupClientButton** – “Setup client” for a package type. +- **CommandBlock** – Copyable command (e.g. pull command). +- **TableCells** – Reusable table cell components. +- **MultiTagsInput**, **NameDescriptionTags**, **LabelsPopover**, **ManageMetadata** – Forms and metadata UI. + +--- + +## 11. Common Types & Constants + +- **common/types.ts**: **RepositoryPackageType** (DOCKER, NPM, SWIFT, …), **RepositoryConfigType** (VIRTUAL, UPSTREAM), **Parent** (OSS, Enterprise), **PageType**, **EntityScope**, **RepositoryScopeType**, **Scanners**, etc. +- **constants** (e.g. `constants/index.ts`): **DEFAULT_PAGE_INDEX**, **PreferenceScope**, **SoftDeleteFilterEnum**, etc. +- **common/permissionTypes**: **PermissionIdentifier**, **ResourceType** (e.g. ARTIFACT_REGISTRY). + +--- + +## 12. Strings & i18n + +- **strings/strings.en.yaml** – All user-facing strings (keys like `repositoryList.pageHeading`, `packageTypes.swiftPackage`, `repositoryTypes.swift`, `versionDetails.tabs.overview`, etc.). +- **strings/types.ts** – **StringsMap** (TypeScript keys for YAML). +- **frameworks/strings/** – **StringsContextProvider**, **String** component, **useStrings** (getString), **languageLoader**. + +Adding a new package type (e.g. Swift) requires: **packageTypes.swiftPackage**, **repositoryTypes.swift**, and any version/artifact tab or label strings. + +--- + +## 13. Package Types & Adding a New One (e.g. Swift) + +To add a package type (Swift is already added; this is the checklist): + +1. **common/types.ts** – Add enum value e.g. `SWIFT = 'SWIFT'` to **RepositoryPackageType**. +2. **strings** – Add `packageTypes.swiftPackage`, `repositoryTypes.swift` and ensure **StringsMap** in `strings/types.ts` includes them. +3. **useGetRepositoryTypes.ts** – Add entry to **RepositoryTypes** array (label, value, icon). (Swift currently uses `maven-repository-type`; see `SWIFT_ICON_SETUP.md` for a dedicated icon.) +4. **Version type** – Under `pages/version-details/SwiftVersion/`: + - **SwiftVersionType.tsx** – Extend **VersionStep**, implement all render* methods, set `allowedVersionDetailsTabs` (e.g. OVERVIEW, ARTIFACT_DETAILS), `versionListTableColumnConfig`, `allowedActionsOnVersion` / `allowedActionsOnVersionDetailsPage`. + - **types.ts** – e.g. **SwiftArtifactDetailsTabEnum**, **SwiftVersionDetailsQueryParams**, **SwiftArtifactDetails** (extends ArtifactDetail with local metadata). + - **pages/overview/** – **SwiftOverviewPage**, **SwiftVersionGeneralInfo** (overview card). + - **pages/artifact-details/** – **SwiftArtifactDetailsPage** (tabs: Readme, Files, Dependencies), **SwiftVersionFilesContent**, **SwiftVersionDependencyContent**. +5. **VersionFactory.tsx** – `versionFactory.registerStep(new SwiftVersionType())`. +6. **Repository type** – Under `pages/repository-details/SwiftRepository/`: + - **SwiftRepositoryType.tsx** – Extend **RepositoryStep**, set defaultValues, defaultUpstreamProxyValues, implement render* (create form, config form, setup client, header, tree node, etc.). +7. **RepositoryFactory.tsx** – `repositoryFactory.registerStep(new SwiftRepositoryType())`. + +Result in UI: Swift appears in package type filter and repository type selector; creating a Swift repo uses Swift repository form; repository details show Swift-specific tabs; artifact versions table and version details (overview, readme, files, dependencies) are Swift-specific. + +--- + +## 14. Directory Structure Summary + +``` +web/src/ar/ +├── app/ # App bootstrap, OpenAPI client +├── routes/ # Route definitions, path params, RouteDestinations +├── contexts/ # AppStoreContext, AsyncDownloadRequestsProvider +├── hooks/ # useRoutes, useDecodedParams, useAppStore, useGetRepositoryTypes, ... +├── common/ # types (RepositoryPackageType, etc.), utils, permissionTypes +├── constants/ # DEFAULT_PAGE_INDEX, PreferenceScope, SoftDeleteFilterEnum +├── frameworks/ +│ ├── Version/ # VersionStep, VersionFactory, *Widget (list, header, tab, actions, tree) +│ ├── RepositoryStep/ # RepositoryStep, RepositoryFactory, *Widget +│ └── strings/ # StringsContextProvider, String, useStrings +├── pages/ +│ ├── repository-list/ # RepositoryListPage, RepositoryListTreeViewPage, table/tree components +│ ├── repository-details/ # RepositoryDetailsPage, RepositoryDetails, RepositoryProvider, tab page, *RepositoryType +│ ├── artifact-list/ # ArtifactListPage (global artifacts) +│ ├── artifact-details/ # ArtifactDetailsPage, ArtifactDetails, ArtifactProvider, constants +│ ├── version-list/ # VersionListPage (versions for one artifact) +│ ├── version-details/ # VersionDetailsPage, VersionDetails, VersionProvider, VersionOverviewProvider, +│ │ │ # VersionFilesProvider, VersionDetailsTabs, VersionDetailsHeader, +│ │ │ # *VersionType (Docker, Npm, Swift, ...), shared version-details components +│ ├── webhook-details/ # WebhookDetailsPage +│ ├── upstream-proxy-details/ +│ ├── manage-registries/ +│ └── redirect-page/ +├── components/ # Breadcrumbs, ButtonTabs, RouteProvider, PackageTypeSelector, TreeView, ... +├── strings/ # strings.en.yaml, types (StringsMap) +├── utils/ # queryClient, customYupValidators, ... +├── __mocks__/ # PageNotPublic, DefaultNavComponent, RbacButton, hooks (useQueryParams, ...) +├── MFEAppTypes.ts # Parent props, Scope, AppstoreContext, ParentContextObj, components/hooks types +└── gitness/ # Gitness-specific route definitions and helpers +``` + +--- + +## 15. Data Flow (short) + +- **Repository list**: Query params (search, type, scope, …) → `useLocalGetRegistriesQuery` → **RepositoryListTable** or tree. +- **Repository details**: `repositoryIdentifier` from URL → **RepositoryProvider** → `useGetRegistryQuery` → context `data` → **RepositoryDetails** tabs → **RepositoryDetailsTabPage** (artifact list / config form / webhooks / metadata). +- **Artifact details**: `repositoryIdentifier`, `artifactIdentifier`, `artifactType` → **ArtifactProvider** → artifact summary → **VersionListPage** → **VersionListTableWidget** → package-type **VersionListTable** (versions query). +- **Version details**: Path params → **VersionProvider** (`useGetArtifactVersionSummaryQuery`) → **VersionOverviewProvider** (`useGetArtifactDetailsQuery` for full artifact details) → **VersionDetailsHeader** + **VersionDetailsTabs** → **VersionDetailsTabWidget** → package-type `renderVersionDetailsTab` → e.g. **SwiftOverviewPage** + **SwiftArtifactDetailsPage** (with **VersionFilesProvider** for files). + +--- + +This document covers the **entire structure** of the AR repo with **reference to the UI**: entry point, routing, every major page, the factory pattern, contexts, hooks, frameworks, components, types, strings, and how adding a package type (e.g. Swift) fits in. Use it as your single reference for navigation and implementation. diff --git a/web/src/ar/SWIFT_ICON_SETUP.md b/web/src/ar/SWIFT_ICON_SETUP.md new file mode 100644 index 0000000000..8b12199849 --- /dev/null +++ b/web/src/ar/SWIFT_ICON_SETUP.md @@ -0,0 +1,144 @@ +# Adding Swift logo (SVG) so it appears everywhere in the frontend + +Icons in the AR (Artifact Registry) frontend come from **`@harnessio/icons`**. To have the Swift logo show everywhere (repository type selector, repository/version trees, headers, overview cards, etc.), use one of the two approaches below. + +--- + +## Option A: Add the icon to the Harness Icons package (recommended) + +This makes Swift use the same `` pattern as Docker, Maven, NuGet, etc., so no AR code changes are needed beyond the icon name. + +### 1. Get the Swift SVG + +- Use your Swift logo SVG file (e.g. `swift-logo.svg`). +- Prefer a 24×24 (or square) viewBox so it scales well. +- Keep the file small and valid (no scripts, clean paths). + +### 2. Add it to the Harness Icons package + +The `@harnessio/icons` package is **external** (npm). Its types say: + +- *"This file is auto-generated. Please do not modify this file manually."* +- *"Use the command `yarn ui:icons` to regenerate this file."* + +So you need to add the Swift icon in the **repo that owns the Harness icons** (e.g. a design-system or ui-icons repo), not in gitness. + +Typical steps there: + +1. Clone the Harness icons (or design-system) repo. +2. Add your SVG (e.g. `swift-icon.svg`) in the folder where other icon SVGs live (e.g. `src/icons/` or similar). +3. Register the new icon in the config/list that the icon generator reads (if applicable). +4. Run the icon generation command (e.g. `yarn ui:icons` or the script that generates `HarnessIcons` and `HarnessIconName`). +5. Ensure the new icon gets a **kebab-case name** (e.g. `swift-icon`). +6. Build and publish a new version of `@harnessio/icons`. + +### 3. Use the new icon in gitness (AR) + +1. **Bump the dependency** in `web/package.json`: + - Set `"@harnessio/icons": "^x.y.z"` to the new version that includes the Swift icon. + +2. **Install:** + ```bash + cd web && yarn install + ``` + +3. **Use the new icon name everywhere Swift is referenced:** + - **Repository type list:** + `web/src/ar/hooks/useGetRepositoryTypes.ts` + Set the Swift entry’s `icon` to the new name (e.g. `'swift-icon'`). + - **Swift repository type:** + `web/src/ar/pages/repository-details/SwiftRepository/SwiftRepositoryType.tsx` + Set `protected repositoryIcon: IconName = 'swift-icon'`. + - **Swift version type:** + `web/src/ar/pages/version-details/SwiftVersion/SwiftVersionType.tsx` + Any place that passes an icon (e.g. for tree or header), use `'swift-icon'`. + - **Overview / general info:** + `web/src/ar/pages/version-details/SwiftVersion/pages/overview/SwiftVersionGeneralInfo.tsx` + In `LabelValueContent` for package type, set `icon="swift-icon"`. + +After that, the Swift logo will appear everywhere the app uses `RepositoryIcon` or the same icon name (repository selector, trees, headers, overview, etc.). + +--- + +## Option B: Use a local SVG in gitness only (no change to `@harnessio/icons`) + +If you cannot change the Harness Icons package, you can host the Swift SVG in gitness and render it only where you control the component. + +### 1. Add the SVG in the repo + +- Example: `web/src/ar/assets/swift-logo.svg` + (or `web/src/icons/swift-logo.svg` if you prefer to keep it with other app icons.) + +### 2. Declare SVG module (if needed) + +- The AR app already has in `web/src/ar/global.d.ts`: + ```ts + declare module '*.svg' { + const value: string + export default value + } + ``` +- If you import the SVG as URL (e.g. `import svg from './swift-logo.svg?url'`), ensure your bundler supports `?url` for SVGs (see e.g. `TreeNode.tsx`). + +### 3. Create a small Swift logo component + +Example: `web/src/ar/components/SwiftIcon/SwiftIcon.tsx` + +```tsx +import React from 'react' +import { IconProps } from '@harnessio/icons' + +import swiftLogoSvg from '@ar/assets/swift-logo.svg' // or path you chose + +interface SwiftIconProps { + size?: number + className?: string +} + +export default function SwiftIcon({ size = 24, className }: SwiftIconProps): JSX.Element { + return ( + Swift + ) +} +``` + +(If your setup uses `?url` for SVGs, use `import swiftLogoSvg from '...svg?url'` and same `src={swiftLogoSvg}`.) + +### 4. Use it where you control the UI + +- **RepositoryIcon** + In `web/src/ar/frameworks/RepositoryStep/RepositoryIcon.tsx`, when `packageType === RepositoryPackageType.SWIFT`, return `` instead of ``. For all other types, keep using ``. + +- **SwiftRepositoryType** + `repositoryIcon` is typed as `IconName`, so you can’t pass a component there. You can keep using a placeholder `IconName` (e.g. `'generic-repository-type'`) for the type, and rely on `RepositoryIcon` to show the real Swift logo when it sees `SWIFT`. + +- **Create-repository list** + The list uses `ButtonOption` with `icon: IconName`. So until the icon exists in `@harnessio/icons`, the create-repository grid will keep showing whatever icon name you put in `useGetRepositoryTypes` (e.g. a generic icon). Only after adding the icon to the package (Option A) will that grid show the Swift logo. + +- **Version/artifact trees and headers** + Where the code uses `RepositoryIcon` or a single place that resolves the icon by package type, the Swift logo will appear once `RepositoryIcon` is updated as above. Any place that uses `repositoryType.getIconName()` and then `` will still show the placeholder until the icon is in the package. + +So with Option B you get the Swift logo in: +- RepositoryIcon (headers, trees, any usage of that component) +- Any other spot where you explicitly render `` instead of ``. + +You do **not** get the Swift logo in the create-repository selector grid unless you add the icon to the Harness Icons package (Option A). + +--- + +## Summary + +| Goal | Approach | +|-----------------------------|-----------------------------| +| Swift logo everywhere | Add SVG to Harness Icons (Option A), then use `swift-icon` in AR. | +| Swift logo in AR only | Add local SVG + `SwiftIcon` and use it in `RepositoryIcon` and any custom screens (Option B). | +| Create-repository grid icon | Requires the icon in `@harnessio/icons` (Option A). | + +Recommended: add the Swift SVG to the Harness Icons package, publish a new version, then in gitness bump `@harnessio/icons` and set all Swift-related `icon` / `repositoryIcon` to the new name (e.g. `'swift-icon'`). diff --git a/web/src/ar/hooks/useGetRepositoryTypes.ts b/web/src/ar/hooks/useGetRepositoryTypes.ts index 2f4dab8e6d..76303a655e 100644 --- a/web/src/ar/hooks/useGetRepositoryTypes.ts +++ b/web/src/ar/hooks/useGetRepositoryTypes.ts @@ -101,7 +101,7 @@ const RepositoryTypes: RepositoryTypeListItem[] = [ { label: 'repositoryTypes.swift', value: RepositoryPackageType.SWIFT, - icon: 'maven-repository-type' + icon: 'swift-logo' }, { label: 'repositoryTypes.go', diff --git a/web/src/ar/pages/repository-details/SwiftRepository/SwiftRepositoryType.tsx b/web/src/ar/pages/repository-details/SwiftRepository/SwiftRepositoryType.tsx index 29552bdbb4..4050170969 100644 --- a/web/src/ar/pages/repository-details/SwiftRepository/SwiftRepositoryType.tsx +++ b/web/src/ar/pages/repository-details/SwiftRepository/SwiftRepositoryType.tsx @@ -46,7 +46,7 @@ import RepositoryDetailsHeader from '../components/RepositoryDetailsHeader/Repos export class SwiftRepositoryType extends RepositoryStep { protected packageType = RepositoryPackageType.SWIFT protected repositoryName = 'Swift Repository' - protected repositoryIcon: IconName = 'maven-repository-type' + protected repositoryIcon: IconName = 'swift-logo' protected supportedScanners = [] protected supportsUpstreamProxy = false protected isWebhookSupported = false diff --git a/web/src/ar/pages/version-details/SwiftVersion/SwiftVersionType.tsx b/web/src/ar/pages/version-details/SwiftVersion/SwiftVersionType.tsx index 54f53000b5..2c63e5cf24 100644 --- a/web/src/ar/pages/version-details/SwiftVersion/SwiftVersionType.tsx +++ b/web/src/ar/pages/version-details/SwiftVersion/SwiftVersionType.tsx @@ -136,7 +136,7 @@ export class SwiftVersionType extends VersionStep { } renderArtifactTreeNodeView(props: ArtifactTreeNodeViewProps): JSX.Element { - return + return } renderArtifactTreeNodeDetails(): JSX.Element { @@ -144,7 +144,7 @@ export class SwiftVersionType extends VersionStep { } renderVersionTreeNodeView(props: VersionTreeNodeViewProps): JSX.Element { - return + return } renderVersionTreeNodeDetails(): JSX.Element { diff --git a/web/src/ar/pages/version-details/SwiftVersion/pages/overview/SwiftVersionGeneralInfo.tsx b/web/src/ar/pages/version-details/SwiftVersion/pages/overview/SwiftVersionGeneralInfo.tsx index df96e7e088..d4033e6d72 100644 --- a/web/src/ar/pages/version-details/SwiftVersion/pages/overview/SwiftVersionGeneralInfo.tsx +++ b/web/src/ar/pages/version-details/SwiftVersion/pages/overview/SwiftVersionGeneralInfo.tsx @@ -63,7 +63,7 @@ export default function SwiftVersionGeneralInfo(props: SwiftVersionGeneralInfoPr label={getString('versionDetails.overview.generalInformation.packageType')} value={getString('packageTypes.swiftPackage' as StringKeys)} type={LabelValueTypeEnum.PackageType} - icon="maven-repository-type" + icon="swift-logo" /> Date: Wed, 18 Feb 2026 15:54:41 +0530 Subject: [PATCH 05/10] swift files --- web/src/ar/AR_REPO_STRUCTURE_REFERENCE.md | 4 +-- web/src/ar/MFEAppTypes.ts | 3 +- web/src/ar/hooks/useGetRepositoryTypes.ts | 17 +++++---- .../SwiftArtifactDetailsPage.tsx | 4 +-- .../SwiftVersionFilesContent.tsx | 35 ------------------- web/yarn.lock | 2 +- 6 files changed, 18 insertions(+), 47 deletions(-) delete mode 100644 web/src/ar/pages/version-details/SwiftVersion/pages/artifact-details/SwiftVersionFilesContent.tsx diff --git a/web/src/ar/AR_REPO_STRUCTURE_REFERENCE.md b/web/src/ar/AR_REPO_STRUCTURE_REFERENCE.md index fb66a90ce9..62e3beb50c 100644 --- a/web/src/ar/AR_REPO_STRUCTURE_REFERENCE.md +++ b/web/src/ar/AR_REPO_STRUCTURE_REFERENCE.md @@ -205,7 +205,7 @@ So: **Version list**, **Version details header**, and **Version details tab cont **Tab content examples (by package type)**: - **OVERVIEW**: e.g. **SwiftOverviewPage** → **SwiftVersionGeneralInfo** (card with name, version, package type, size, downloads, uploaded by, description). Other types: **PythonVersionOverviewPage**, **NuGetVersionOverviewPage**, **GoVersionOverviewPage**, etc. -- **ARTIFACT_DETAILS**: e.g. **SwiftArtifactDetailsPage** → tabs Readme / Files / Dependencies (**SwiftVersionFilesContent**, **SwiftVersionDependencyContent**, **ReadmeFileContent**). Other types have their own artifact-details pages (NuGet, Npm, Python, etc.). +- **ARTIFACT_DETAILS**: e.g. **SwiftArtifactDetailsPage** → tabs Readme / Files / Dependencies (**ArtifactFilesContent**, **SwiftVersionDependencyContent**, **ReadmeFileContent**). Other types have their own artifact-details pages (NuGet, Npm, Python, etc.). - **CODE** / **OSS**: Some types render **OSSContentPage** or similar. - **SUPPLY_CHAIN**, **SECURITY_TESTS**, **DEPLOYMENTS**: Enterprise, feature-flagged. @@ -323,7 +323,7 @@ To add a package type (Swift is already added; this is the checklist): - **SwiftVersionType.tsx** – Extend **VersionStep**, implement all render* methods, set `allowedVersionDetailsTabs` (e.g. OVERVIEW, ARTIFACT_DETAILS), `versionListTableColumnConfig`, `allowedActionsOnVersion` / `allowedActionsOnVersionDetailsPage`. - **types.ts** – e.g. **SwiftArtifactDetailsTabEnum**, **SwiftVersionDetailsQueryParams**, **SwiftArtifactDetails** (extends ArtifactDetail with local metadata). - **pages/overview/** – **SwiftOverviewPage**, **SwiftVersionGeneralInfo** (overview card). - - **pages/artifact-details/** – **SwiftArtifactDetailsPage** (tabs: Readme, Files, Dependencies), **SwiftVersionFilesContent**, **SwiftVersionDependencyContent**. + - **pages/artifact-details/** – **SwiftArtifactDetailsPage** (tabs: Readme, Files, Dependencies), **SwiftVersionDependencyContent**. 5. **VersionFactory.tsx** – `versionFactory.registerStep(new SwiftVersionType())`. 6. **Repository type** – Under `pages/repository-details/SwiftRepository/`: - **SwiftRepositoryType.tsx** – Extend **RepositoryStep**, set defaultValues, defaultUpstreamProxyValues, implement render* (create form, config form, setup client, header, tree node, etc.). diff --git a/web/src/ar/MFEAppTypes.ts b/web/src/ar/MFEAppTypes.ts index e4fb586e2d..3c9928398a 100644 --- a/web/src/ar/MFEAppTypes.ts +++ b/web/src/ar/MFEAppTypes.ts @@ -154,5 +154,6 @@ export enum FeatureFlags { HAR_ENABLE_UNTAGGED_IMAGES_SUPPORT = 'HAR_ENABLE_UNTAGGED_IMAGES_SUPPORT', HAR_SUPPORT_LOCAL_REGISTRY_AS_UPSTREAM_PROXY = 'HAR_SUPPORT_LOCAL_REGISTRY_AS_UPSTREAM_PROXY', HAR_SOFT_DELETE_SUPPORT = 'HAR_SOFT_DELETE_SUPPORT', - HAR_DEPENDENCY_FIREWALL = 'HAR_DEPENDENCY_FIREWALL' + HAR_DEPENDENCY_FIREWALL = 'HAR_DEPENDENCY_FIREWALL', + HAR_SWIFT_PACKAGE = 'HAR_SWIFT_PACKAGE' } diff --git a/web/src/ar/hooks/useGetRepositoryTypes.ts b/web/src/ar/hooks/useGetRepositoryTypes.ts index 76303a655e..c2ca410793 100644 --- a/web/src/ar/hooks/useGetRepositoryTypes.ts +++ b/web/src/ar/hooks/useGetRepositoryTypes.ts @@ -16,7 +16,7 @@ import type { IconName } from '@harnessio/icons' -import type { FeatureFlags } from '@ar/MFEAppTypes' +import { FeatureFlags } from '@ar/MFEAppTypes' import type { StringsMap } from '@ar/frameworks/strings' import { Parent, RepositoryPackageType } from '@ar/common/types' import { ThumbnailTagEnum } from '@ar/components/Tag/ThumbnailTags' @@ -98,11 +98,7 @@ const RepositoryTypes: RepositoryTypeListItem[] = [ value: RepositoryPackageType.CARGO, icon: 'rust-logo' }, - { - label: 'repositoryTypes.swift', - value: RepositoryPackageType.SWIFT, - icon: 'swift-logo' - }, + { label: 'repositoryTypes.go', value: RepositoryPackageType.GO, @@ -131,6 +127,15 @@ const RepositoryTypes: RepositoryTypeListItem[] = [ icon: 'php-composer-logo', parent: Parent.Enterprise }, + { + label: 'repositoryTypes.swift', + value: RepositoryPackageType.SWIFT, + icon: 'swift-logo', + disabled:true, + featureFlag: FeatureFlags.HAR_SWIFT_PACKAGE, + parent: Parent.Enterprise, + tooltip: 'Coming Soon!', + }, { label: 'repositoryTypes.debian', value: RepositoryPackageType.DEBIAN, diff --git a/web/src/ar/pages/version-details/SwiftVersion/pages/artifact-details/SwiftArtifactDetailsPage.tsx b/web/src/ar/pages/version-details/SwiftVersion/pages/artifact-details/SwiftArtifactDetailsPage.tsx index f95257087b..606e598c5a 100644 --- a/web/src/ar/pages/version-details/SwiftVersion/pages/artifact-details/SwiftArtifactDetailsPage.tsx +++ b/web/src/ar/pages/version-details/SwiftVersion/pages/artifact-details/SwiftArtifactDetailsPage.tsx @@ -23,8 +23,8 @@ import { ButtonTab, ButtonTabs } from '@ar/components/ButtonTabs/ButtonTabs' import VersionFilesProvider from '@ar/pages/version-details/context/VersionFilesProvider' import { useVersionOverview } from '@ar/pages/version-details/context/VersionOverviewProvider' import ReadmeFileContent from '@ar/pages/version-details/components/ReadmeFileContent/ReadmeFileContent' +import ArtifactFilesContent from '@ar/pages/version-details/components/ArtifactFileListTable/ArtifactFilesContent' -import SwiftVersionFilesContent from './SwiftVersionFilesContent' import SwiftVersionDependencyContent from './SwiftVersionDependencyContent' import { SwiftArtifactDetails, @@ -64,7 +64,7 @@ export default function SwiftArtifactDetailsPage() { iconProps={{ size: 12 }} panel={ - + } title={getString('versionDetails.artifactDetails.tabs.files')} diff --git a/web/src/ar/pages/version-details/SwiftVersion/pages/artifact-details/SwiftVersionFilesContent.tsx b/web/src/ar/pages/version-details/SwiftVersion/pages/artifact-details/SwiftVersionFilesContent.tsx deleted file mode 100644 index 24591bb30a..0000000000 --- a/web/src/ar/pages/version-details/SwiftVersion/pages/artifact-details/SwiftVersionFilesContent.tsx +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2024 Harness, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import React, { useContext } from 'react' - -import { DEFAULT_PAGE_INDEX } from '@ar/constants' -import { VersionFilesContext } from '@ar/pages/version-details/context/VersionFilesProvider' -import ArtifactFileListTable from '@ar/pages/version-details/components/ArtifactFileListTable/ArtifactFileListTable' - -export default function SwiftVersionFilesContent() { - const { data, updateQueryParams, sort } = useContext(VersionFilesContext) - return ( - updateQueryParams({ page: pageNumber })} - setSortBy={sortArr => { - updateQueryParams({ sort: sortArr, page: DEFAULT_PAGE_INDEX }) - }} - sortBy={sort} - /> - ) -} diff --git a/web/yarn.lock b/web/yarn.lock index ab0557409f..d8f0f544eb 100644 --- a/web/yarn.lock +++ b/web/yarn.lock @@ -1921,7 +1921,7 @@ resolved "https://registry.npmjs.org/@harnessio/design-system/-/design-system-2.1.1.tgz#2da3036602ed9b9446d8139c72009e6dc1e25642" integrity sha512-ZwAGM1srOZ49/6YkwyjkczUv4v91CN0rCecRYnV3/g+xdSV5ycrUvkJjl9nHub6jw2eCGC0GdyNgAtAJnLmGfQ== -"@harnessio/icons@^2.1.20": +"@harnessio/icons@^2.1.18": version "2.1.20" resolved "https://registry.yarnpkg.com/@harnessio/icons/-/icons-2.1.20.tgz#e3d95107ff70f635009e87f28d61adaa64d9ebc0" integrity sha512-3wtngGnVltw/Y89cmBRMQVwFO/p+lixHG/ROU/pVtTqCooBr/fiSk6uqkQLzhqde7g7W1FWbdFFdyBeKBG8k2w== From b34e2c6b28f18b15e385bfc56572d4de7bb0861c Mon Sep 17 00:00:00 2001 From: shivang Date: Fri, 20 Feb 2026 12:49:56 +0530 Subject: [PATCH 06/10] feat: [AH-2815]: Added swift support on frontend --- web/src/ar/AR_REPO_STRUCTURE_REFERENCE.md | 382 ---------------------- web/src/ar/SWIFT_ICON_SETUP.md | 144 -------- web/src/ar/SWIFT_REGISTRY_CHECKLIST.md | 123 ------- 3 files changed, 649 deletions(-) delete mode 100644 web/src/ar/AR_REPO_STRUCTURE_REFERENCE.md delete mode 100644 web/src/ar/SWIFT_ICON_SETUP.md delete mode 100644 web/src/ar/SWIFT_REGISTRY_CHECKLIST.md diff --git a/web/src/ar/AR_REPO_STRUCTURE_REFERENCE.md b/web/src/ar/AR_REPO_STRUCTURE_REFERENCE.md deleted file mode 100644 index 62e3beb50c..0000000000 --- a/web/src/ar/AR_REPO_STRUCTURE_REFERENCE.md +++ /dev/null @@ -1,382 +0,0 @@ -# Artifact Registry (AR) – Complete Repo Structure & UI Reference - -This document describes the **entire structure** of the AR (Artifact Registry) frontend with **absolute detail**, mapped to the UI. Use it as a single reference for navigation, routing, pages, factories, and data flow. - ---- - -## 1. Overview - -- **What AR is**: The Artifact Registry module lets users manage **registries** (repositories), **packages/artifacts**, and **versions** for multiple package types (Docker, NPM, Maven, Swift, Go, etc.). -- **Tech**: React, TypeScript, React Router, TanStack Query, Harness UI Core, YAML strings for i18n. -- **Location**: `web/src/ar/` (all paths below are relative to this unless stated). - ---- - -## 2. Entry Point & App Bootstrap - -### 2.1 App entry - -- **File**: `app/App.tsx` -- **Role**: Root component of the AR micro-frontend. It: - - Wraps the app in **QueryClientProvider** (TanStack React Query). - - Provides **AppStoreContext** (scope, baseUrl, matchPath, parent OSS/Enterprise, repository list view type, public access flags). - - Provides **StringsContextProvider** with `strings.en.yaml`. - - Provides **ParentProvider** with hooks and components from the parent (Harness/Gitness) – e.g. `useQueryParams`, `useUpdateQueryParams`, `usePermission`, `RbacButton`, `ModalProvider`, `PageNotPublic`. - - Registers **factories** by importing: - - `@ar/pages/version-details/VersionFactory` – registers all version types (Docker, NPM, Swift, …). - - `@ar/pages/repository-details/RepositoryFactory` – registers all repository types. - - Renders **NavComponent** (or custom) and inside it **AsyncDownloadRequestsProvider** and lazy **RouteDestinations** (the router). - -**UI**: No direct UI; it’s the shell. The first visible UI is either the **Repository List** (list or tree) or a **Redirect** page, depending on the route. - -### 2.2 API client - -- **File**: `app/useOpenApiClient.ts` -- **Role**: Configures OpenAPI clients (HAR Service, SSCA Manager, NG Manager) with interceptors (e.g. 401 handling) and custom headers from parent. Called once in `App.tsx`. - ---- - -## 3. Routing & URL Structure (UI Mapping) - -### 3.1 Route definitions - -- **File**: `routes/RouteDefinitions.ts` -- **Path types**: `routes/types.ts` - -Routes are built by `routeDefinitions` and can be wrapped with a “mode” prefix (e.g. org/project) via `routeDefinitionWithMode` in `routes/utils.ts`. **Hook**: `useRoutes()` (and `useRoutes(true)` for path-only definitions) from `hooks/useRoutes.ts`. - -| Route method | Typical path (relative) | UI | -|--------------|--------------------------|-----| -| `toAR()` | `/` | Redirects to repository list. | -| `toARRedirect()` | `/redirect?...` | Redirect page (e.g. deep links with packageType, registryId, artifactId, versionId). | -| `toARRepositories()` | `/registries` | **Repository list** (list or tree depending on `repositoryListViewType`). | -| `toARRepositoryDetails({ repositoryIdentifier })` | `/registries/:repositoryIdentifier` | **Repository details** – default tab (e.g. Packages). | -| `toARRepositoryDetailsTab({ repositoryIdentifier, tab })` | `/registries/:repositoryIdentifier/:tab` | **Repository details** – specific tab (packages, configuration, webhooks, metadata). | -| `toARArtifacts()` | (context-dependent) | **Global artifact list** (all artifacts across registries). | -| `toARArtifactDetails({ repositoryIdentifier, artifactType, artifactIdentifier })` | `/registries/:repo/:artifactType/:artifactIdentifier` | **Artifact details** – default sub-route (e.g. Versions). | -| `toARArtifactVersions(...)` | `.../versions` | **Artifact details** – **Versions** tab (version list table). | -| `toARArtifactProperties(...)` | `.../properties` | **Artifact details** – **Metadata/Properties** tab. | -| `toARVersionDetails({ ... params, versionIdentifier })` | `.../versions/:versionIdentifier` | **Version details** – default tab (usually Overview). | -| `toARVersionDetailsTab({ ... params, versionTab })` | `.../versions/:versionIdentifier/:versionTab` | **Version details** – specific tab (overview, artifact_details, supply_chain, etc.). | -| `toARRepositoryWebhookDetails(...)` | `/registries/:repo/webhooks/:webhookIdentifier` | **Webhook details**. | -| `toARRepositoryWebhookDetailsTab(...)` | `.../webhooks/:id/:tab` | **Webhook details** – tab. | - -**Note**: In **Gitness** (OSS), route definitions may be under a different base (e.g. space); see `gitness/utils/getARRouteDefinitions.ts` and `giness/RouteDefinitions.ts`. - -### 3.2 Route destinations (what renders where) - -- **File**: `routes/RouteDestinations.tsx` - -**Logic**: - -- **`/`** → redirect to `toARRepositories()`. -- **`/redirect`** → **RedirectPage**. -- **`/registries`** (exact): - - If **Directory** view → **RepositoryListTreeViewPage**. - - If **List** view → **RepositoryListPage**. -- **`/registries/:repositoryIdentifier`** and **`/registries/:repositoryIdentifier/:tab`** → **RepositoryDetailsPage** (public routes). -- **Webhook routes** → **WebhookDetailsPage**. -- **Version details routes** (multiple path variants for org/project/pipeline/ssca) → **VersionDetailsPage** (only when `parent === Enterprise` or `repositoryListViewType === Directory`; i.e. “separate version details route”). -- **Artifact routes** (`.../versions`, `.../properties`, `.../[artifactType]/[artifactIdentifier]`) → **ArtifactDetailsPage** (which internally can show version list or version details in OSS when not using separate version route). - -So: - -- **Repository list** (list or tree) → **RepositoryListPage** or **RepositoryListTreeViewPage**. -- **Repository details** (tabs: Packages/Datasets/Models/Configuration/Webhooks/Metadata) → **RepositoryDetailsPage**. -- **Artifact details** (tabs: Versions, Metadata) → **ArtifactDetailsPage**. -- **Version details** (tabs: Overview, Artifact details, Supply chain, etc.) → **VersionDetailsPage** (when using separate route) or embedded under **ArtifactDetailsPage** (OSS list view). - ---- - -## 4. Page Hierarchy & UI Flow - -High-level flow: - -``` -App - └─ NavComponent - └─ AsyncDownloadRequestsProvider - └─ RouteDestinations (Switch) - ├─ Repository List (list or tree) - ├─ Repository Details (header + tabs) - │ ├─ Packages / Datasets / Models → artifact list for that repo (and type) - │ ├─ Configuration → repo config form - │ ├─ Webhooks → webhook list - │ └─ Metadata → properties form - ├─ Artifact Details (header + tabs) - │ ├─ Versions → version list table (package-type-specific columns/actions) - │ └─ Metadata → properties - │ (When separate version route is used, version details live on VersionDetailsPage.) - ├─ Version Details (header + tabs) - │ ├─ Overview → package-type-specific overview (e.g. SwiftOverviewPage) - │ ├─ Artifact details → package-type-specific artifact details (e.g. readme, files, dependencies) - │ ├─ Supply chain / Security tests / Deployments / Code (Enterprise, feature-flagged) - │ └─ OSS (open source view) - ├─ Webhook Details - └─ Redirect -``` - ---- - -## 5. Factory Pattern (Repository & Version) - -The UI is **package-type-aware** via two factory patterns. Each **package type** (DOCKER, NPM, SWIFT, etc.) has: - -1. A **Repository** type (e.g. `SwiftRepositoryType`) – defines repo creation form, config form, setup client, tabs, tree node, etc. -2. A **Version** type (e.g. `SwiftVersionType`) – defines version list table, version details header, version details tabs (overview, artifact details, etc.), artifact/version actions, tree views, row expand (files). - -### 5.1 Version factory - -- **Framework base**: `frameworks/Version/Version.tsx` – abstract class **VersionStep\**. - - Key abstract props: `packageType`, `allowedVersionDetailsTabs`, `hasArtifactRowSubComponent`. - - Abstract render methods: `renderVersionListTable`, `renderVersionDetailsHeader`, `renderVersionDetailsTab`, `renderArtifactActions`, `renderVersionActions`, `renderArtifactRowSubComponent`, `renderArtifactTreeNodeView`, `renderArtifactTreeNodeDetails`, `renderVersionTreeNodeView`, `renderVersionTreeNodeDetails`. -- **Framework factory**: `frameworks/Version/VersionAbstractFactory.tsx` (base), `frameworks/Version/VersionFactory.tsx` (singleton). -- **Registration**: `pages/version-details/VersionFactory.tsx` – imports **versionFactory** and registers every *VersionType* (Docker, Helm, Generic, Maven, Npm, Python, NuGet, RPM, Cargo, Go, Huggingface, Conda, Dart, Composer, **Swift**). - -**Widgets** (resolve package type and delegate to the registered step): - -- **VersionListTableWidget** – `versionFactory.getVersionType(packageType).renderVersionListTable(...)` → **Version list table** on Artifact Details → Versions tab. -- **VersionDetailsHeaderWidget** – renders **Version details header** (title, breadcrumbs). -- **VersionDetailsTabWidget** – renders **Version details tab content** (Overview, Artifact details, etc.) by `versionTab` from URL. - -So: **Version list**, **Version details header**, and **Version details tab content** are all chosen by `packageType` from the factory. - -### 5.2 Repository factory - -- **Framework base**: `frameworks/RepositoryStep/Repository.tsx` – abstract class **RepositoryStep\**. - - Key abstract props: `packageType`, `repositoryName`, `defaultValues`, `defaultUpstreamProxyValues`, `repositoryIcon`, `supportsUpstreamProxy`, optional `supportedScanners`, `isWebhookSupported`, `supportedRepositoryTabs`, etc. - - Abstract render methods: `renderCreateForm`, `renderCofigurationForm`, `renderActions`, `renderSetupClient`, `renderRepositoryDetailsHeader`, `renderRedirectPage`, `renderTreeNodeView`, `renderTreeNodeDetails`. -- **Framework factory**: `frameworks/RepositoryStep/RepositoryAbstractFactory.tsx`, `frameworks/RepositoryStep/RepositoryFactory.tsx` (singleton). -- **Registration**: `pages/repository-details/RepositoryFactory.tsx` – registers every *RepositoryType* (Docker, Maven, Helm, … Swift). - -**Usage**: - -- **Repository details tabs**: `repositoryFactory.getRepositoryType(data?.packageType)` → `getSupportedRepositoryTabs()` → filters **RepositoryDetailsTabs** (Packages, Configuration, Webhooks, Metadata, etc.). -- **Repository configuration form**: **RepositoryConfigurationFormWidget** uses repository type to render the correct config form. -- **Create repository**: Package type selector and create flow use repository types (e.g. from `hooks/useGetRepositoryTypes.ts`). - ---- - -## 6. Key Pages in Detail (with UI) - -### 6.1 Repository list - -- **List view**: `pages/repository-list/RepositoryListPage.tsx` - - **UI**: Page header (title, breadcrumbs), filters (search, package type, repository type, config type, scope, soft delete), list/table toggle, **RepositoryListTable**, “Create repository” button. - - **Data**: `useLocalGetRegistriesQuery` (or equivalent) with query params (search, page, size, repositoryTypes, configType, scope, softDeleteFilter). -- **Tree view**: `pages/repository-list/RepositoryListTreeViewPage.tsx` - - **UI**: Header, package type / config type filters, **RepositoryListTreeView** (tree of repos → artifacts → versions). Clicking a node navigates (e.g. `toARRepositoryDetailsTab`, `toARArtifactDetails`, `toARVersionDetailsTab`). - -### 6.2 Repository details - -- **Page**: `pages/repository-details/RepositoryDetailsPage.tsx` - - Structure: **RepositoryProvider** → **RepositoryHeader** + **RepositoryDetails**. -- **RepositoryProvider** (`context/RepositoryProvider.tsx`): Fetches registry by `repositoryIdentifier` (and scope), provides `data`, `isReadonly`, `refetch`, `setIsDirty`, `setIsUpdating` to children. -- **RepositoryDetails** (`RepositoryDetails.tsx`): Renders **tabs** (Packages, Datasets, Models, Configuration, Webhooks, Metadata) based on `repositoryFactory.getRepositoryType(data?.packageType).getSupportedRepositoryTabs()` and feature flags / parent. Active tab drives route (`repositoryDetailsTabPathProps`). Tab content is rendered by **RepositoryDetailsTabPage**. -- **RepositoryDetailsTabPage** (`RepositoryDetailsTabPage.tsx`): - - **PACKAGES** → **RegistryArtifactListPage** (artifact list for this repo, `artifactType=ARTIFACTS`). - - **DATASETS** / **MODELS** → same with `artifactType=DATASET` / `MODEL`. - - **CONFIGURATION** → **RepositoryConfigurationFormWidget** (package-type-specific form). - - **WEBHOOKS** → **WebhookListPage**. - - **METADATA** → **PropertiesFormContent**. - -**UI**: Repository name/title in header, breadcrumbs, tab bar. Content = one of the above. - -### 6.3 Artifact details - -- **Page**: `pages/artifact-details/ArtifactDetailsPage.tsx` - - **ArtifactProvider** (repoKey, artifact from path) → **ArtifactDetailsHeader** + **ArtifactDetails**. -- **ArtifactDetails** (`ArtifactDetails.tsx`): Tabs come from `versionFactory.getVersionType(data?.packageType).getSupportedArtifactTabs()` (typically **Versions**, **Metadata**). Tab change updates route (`toARArtifactVersions` / `toARArtifactProperties`). Content: - - **VERSIONS** → **VersionListPage** (which uses **VersionListTableWidget** → package-type-specific **VersionListTable** with columns and actions). - - **METADATA** → **PropertiesFormContent**. - - When **separate version details route** is not used (e.g. OSS list view), version detail can be shown via **OSSVersionDetailsPage** or inline. - -**UI**: Artifact name in header, breadcrumbs, Versions / Metadata tabs. Versions tab = table of versions (name, size, file count, download count, pull command, last modified, actions). Row expand (if `hasArtifactRowSubComponent`) shows e.g. **ArtifactFilesContent** (minimal file list). - -### 6.4 Version details - -- **Page**: `pages/version-details/VersionDetailsPage.tsx` - - **VersionProvider** (repoKey, artifactKey, versionKey from path) → **VersionDetails**. -- **VersionProvider** (`context/VersionProvider.tsx`): Fetches **artifact version summary** by repo/artifact/version (and optional digest). Provides `data`, `isReadonly`, `refetch`, etc., to children. -- **VersionDetails** (`VersionDetails.tsx`): **VersionDetailsHeader** + **VersionDetailsTabs**. - - **VersionDetailsHeader**: Uses **VersionDetailsHeaderWidget** with `data.packageType` and `data` → package-type-specific header content (e.g. **VersionDetailsHeaderContent** for Swift/Generic). - - **VersionDetailsTabs**: Reads `versionTab` from URL; builds tab list from **VersionDetailsTabList** filtered by `versionType.getAllowedVersionDetailsTab()` and feature flags / parent. Each tab navigates to `toARVersionDetailsTab(..., versionTab)`. Tab **content** is rendered by **VersionDetailsTabWidget** → `versionFactory.getVersionType(packageType).renderVersionDetailsTab({ tab })`. - -**Tab content examples (by package type)**: - -- **OVERVIEW**: e.g. **SwiftOverviewPage** → **SwiftVersionGeneralInfo** (card with name, version, package type, size, downloads, uploaded by, description). Other types: **PythonVersionOverviewPage**, **NuGetVersionOverviewPage**, **GoVersionOverviewPage**, etc. -- **ARTIFACT_DETAILS**: e.g. **SwiftArtifactDetailsPage** → tabs Readme / Files / Dependencies (**ArtifactFilesContent**, **SwiftVersionDependencyContent**, **ReadmeFileContent**). Other types have their own artifact-details pages (NuGet, Npm, Python, etc.). -- **CODE** / **OSS**: Some types render **OSSContentPage** or similar. -- **SUPPLY_CHAIN**, **SECURITY_TESTS**, **DEPLOYMENTS**: Enterprise, feature-flagged. - -**UI**: Version identifier in header, breadcrumbs (Repository → Artifact). Tab bar (Overview, Artifact details, …). Content = one of the above. - -### 6.5 Global artifact list - -- **Page**: `pages/artifact-list/ArtifactListPage.tsx` - - **UI**: Header, filters (search, repository, package types, deployed artifacts, soft delete, metadata filter), **ArtifactListTable**. Used when navigating to “Artifacts” (e.g. `toARArtifacts()`). - ---- - -## 7. Contexts & Providers - -| Context / Provider | File | Purpose | -|--------------------|------|---------| -| **AppStoreContext** | `contexts/AppStoreContext.tsx` | Scope (account/org/project/space), baseUrl, matchPath, parent (OSS/Enterprise), repositoryListViewType, setRepositoryListViewType, isPublicAccessEnabledOnResources, isCurrentSessionPublic. | -| **ParentProvider** | `contexts/ParentProvider.tsx` | Injects parent’s hooks (useQueryParams, useUpdateQueryParams, usePermission, useConfirmationDialog, useModalHook, …) and components (RbacButton, ModalProvider, PageNotPublic, …). | -| **RepositoryProviderContext** | `pages/repository-details/context/RepositoryProvider.tsx` | Current repository `data`, isDirty, isUpdating, isReadonly, refetch, setIsDirty, setIsUpdating. | -| **ArtifactProviderContext** | `pages/artifact-details/context/ArtifactProvider.tsx` | Current artifact `data`, isDirty, isUpdating, isReadonly, refetch, setters. | -| **VersionProviderContext** | `pages/version-details/context/VersionProvider.tsx` | Current version summary `data`, isReadonly, refetch, isDirty, isUpdating, setters. | -| **VersionOverviewContext** | `pages/version-details/context/VersionOverviewProvider.tsx` | Used **inside** version details tab content; provides full **artifact details** `data` and refetch (e.g. for Overview and Artifact details tabs that need readme, dependencies, metadata). | -| **VersionFilesContext** | `pages/version-details/context/VersionFilesProvider.tsx` | Paginated/sortable **file list** for a version; used by “Files” tab and expandable row file list. | -| **AsyncDownloadRequestsProvider** | `contexts/AsyncDownloadRequestsProvider/AsyncDownloadRequestsProvider.tsx` | Tracks async download requests (e.g. for bulk download). | - ---- - -## 8. Hooks (main ones) - -- **File**: `hooks/index.ts` (re-exports). - -| Hook | Purpose | -|------|---------| -| **useAppStore** | Access AppStoreContext (scope, parent, repositoryListViewType, etc.). | -| **useRoutes** | Get route builder (toARRepositories, toARVersionDetailsTab, …). | -| **useDecodedParams** | Decode path params (e.g. repositoryIdentifier, artifactIdentifier, versionIdentifier, tab). | -| **useParentHooks** | Parent’s useQueryParams, useUpdateQueryParams, usePreferenceStore, usePermission. | -| **useParentComponents** | Parent’s RbacButton, ModalProvider, PageNotPublic, etc. | -| **useGetSpaceRef** | Space/scope ref for API calls (account/org/project/space). | -| **useGetRepositoryListViewType** | List vs Directory view. | -| **useFeatureFlags** / **useFeatureFlag** | Feature flags (e.g. HAR_CUSTOM_METADATA_ENABLED, HAR_TRIGGERS). | -| **useAllowSoftDelete** | Whether soft-delete filter/actions are allowed. | -| **useGetRepositoryTypes** | List of repository types for selectors (from `hooks/useGetRepositoryTypes.ts` – includes **RepositoryTypes** array with label, value, icon; Swift is here with icon `maven-repository-type` until a Swift icon is added). | - ---- - -## 9. Frameworks (Version & Repository steps) - -### 9.1 Version framework (`frameworks/Version/`) - -- **Version.tsx** – Abstract **VersionStep\** (see section 5.1). -- **VersionAbstractFactory.tsx** – Map of packageType → VersionStep; `registerStep`, `getVersionType`. -- **VersionFactory.tsx** – Singleton factory instance. -- **VersionListTableWidget.tsx** – Resolves version type, renders version list table. -- **VersionDetailsHeaderWidget.tsx** – Resolves version type, renders version details header. -- **VersionDetailsTabWidget.tsx** – Resolves version type, renders version details tab panel. -- **VersionActionsWidget.tsx** – Version actions (e.g. delete, setup client, quarantine, download). -- **ArtifactActionsWidget.tsx**, **ArtifactRowSubComponentWidget.tsx**, **ArtifactTreeNodeViewWidget.tsx**, **ArtifactTreeNodeDetailsWidget.tsx**, **VersionTreeNodeViewWidget.tsx**, **VersionTreeNodeDetailsWidget.tsx** – Delegate to version type for artifact/version tree and row expand. - -### 9.2 Repository framework (`frameworks/RepositoryStep/`) - -- **Repository.tsx** – Abstract **RepositoryStep\** (see section 5.2). -- **RepositoryAbstractFactory.tsx** – Map of packageType → RepositoryStep. -- **RepositoryFactory.tsx** – Singleton. -- **RepositoryConfigurationFormWidget.tsx** – Renders package-type-specific configuration form. -- **RepositoryDetailsHeaderWidget.tsx**, **CreateRepositoryWidget.tsx**, **RepositoryActionsWidget.tsx**, **RepositoryTreeNodeViewWidget.tsx**, **RepositoryTreeNodeDetailsWidget.tsx**, **RepositorySetupClientWidget.tsx**, **RedirectWidget.tsx** – All delegate to repository type. - ---- - -## 10. Shared Components (`components/`) - -Used across pages. Examples: - -- **Breadcrumbs** – Breadcrumb links (e.g. Repositories > Artifacts > Version). -- **ButtonTabs** / **ButtonTab** – Tab UI used in version artifact details (Readme, Files, Dependencies). -- **TabsContainer** – Wraps tab content. -- **RouteProvider** – Wraps a Route; handles public vs non-public (PageNotPublic) and **ParentSyncProvider**. -- **PackageTypeSelector** – Filter by package type (Docker, NPM, Swift, …). -- **MetadataFilterSelector** – Custom metadata filter (e.g. HAR_CUSTOM_METADATA_ENABLED). -- **PropertiesForm** / **PropertiesFormContent** – Metadata/properties form (repository metadata, artifact properties). -- **TreeView** – Tree (e.g. repository tree view). -- **SetupClientButton** – “Setup client” for a package type. -- **CommandBlock** – Copyable command (e.g. pull command). -- **TableCells** – Reusable table cell components. -- **MultiTagsInput**, **NameDescriptionTags**, **LabelsPopover**, **ManageMetadata** – Forms and metadata UI. - ---- - -## 11. Common Types & Constants - -- **common/types.ts**: **RepositoryPackageType** (DOCKER, NPM, SWIFT, …), **RepositoryConfigType** (VIRTUAL, UPSTREAM), **Parent** (OSS, Enterprise), **PageType**, **EntityScope**, **RepositoryScopeType**, **Scanners**, etc. -- **constants** (e.g. `constants/index.ts`): **DEFAULT_PAGE_INDEX**, **PreferenceScope**, **SoftDeleteFilterEnum**, etc. -- **common/permissionTypes**: **PermissionIdentifier**, **ResourceType** (e.g. ARTIFACT_REGISTRY). - ---- - -## 12. Strings & i18n - -- **strings/strings.en.yaml** – All user-facing strings (keys like `repositoryList.pageHeading`, `packageTypes.swiftPackage`, `repositoryTypes.swift`, `versionDetails.tabs.overview`, etc.). -- **strings/types.ts** – **StringsMap** (TypeScript keys for YAML). -- **frameworks/strings/** – **StringsContextProvider**, **String** component, **useStrings** (getString), **languageLoader**. - -Adding a new package type (e.g. Swift) requires: **packageTypes.swiftPackage**, **repositoryTypes.swift**, and any version/artifact tab or label strings. - ---- - -## 13. Package Types & Adding a New One (e.g. Swift) - -To add a package type (Swift is already added; this is the checklist): - -1. **common/types.ts** – Add enum value e.g. `SWIFT = 'SWIFT'` to **RepositoryPackageType**. -2. **strings** – Add `packageTypes.swiftPackage`, `repositoryTypes.swift` and ensure **StringsMap** in `strings/types.ts` includes them. -3. **useGetRepositoryTypes.ts** – Add entry to **RepositoryTypes** array (label, value, icon). (Swift currently uses `maven-repository-type`; see `SWIFT_ICON_SETUP.md` for a dedicated icon.) -4. **Version type** – Under `pages/version-details/SwiftVersion/`: - - **SwiftVersionType.tsx** – Extend **VersionStep**, implement all render* methods, set `allowedVersionDetailsTabs` (e.g. OVERVIEW, ARTIFACT_DETAILS), `versionListTableColumnConfig`, `allowedActionsOnVersion` / `allowedActionsOnVersionDetailsPage`. - - **types.ts** – e.g. **SwiftArtifactDetailsTabEnum**, **SwiftVersionDetailsQueryParams**, **SwiftArtifactDetails** (extends ArtifactDetail with local metadata). - - **pages/overview/** – **SwiftOverviewPage**, **SwiftVersionGeneralInfo** (overview card). - - **pages/artifact-details/** – **SwiftArtifactDetailsPage** (tabs: Readme, Files, Dependencies), **SwiftVersionDependencyContent**. -5. **VersionFactory.tsx** – `versionFactory.registerStep(new SwiftVersionType())`. -6. **Repository type** – Under `pages/repository-details/SwiftRepository/`: - - **SwiftRepositoryType.tsx** – Extend **RepositoryStep**, set defaultValues, defaultUpstreamProxyValues, implement render* (create form, config form, setup client, header, tree node, etc.). -7. **RepositoryFactory.tsx** – `repositoryFactory.registerStep(new SwiftRepositoryType())`. - -Result in UI: Swift appears in package type filter and repository type selector; creating a Swift repo uses Swift repository form; repository details show Swift-specific tabs; artifact versions table and version details (overview, readme, files, dependencies) are Swift-specific. - ---- - -## 14. Directory Structure Summary - -``` -web/src/ar/ -├── app/ # App bootstrap, OpenAPI client -├── routes/ # Route definitions, path params, RouteDestinations -├── contexts/ # AppStoreContext, AsyncDownloadRequestsProvider -├── hooks/ # useRoutes, useDecodedParams, useAppStore, useGetRepositoryTypes, ... -├── common/ # types (RepositoryPackageType, etc.), utils, permissionTypes -├── constants/ # DEFAULT_PAGE_INDEX, PreferenceScope, SoftDeleteFilterEnum -├── frameworks/ -│ ├── Version/ # VersionStep, VersionFactory, *Widget (list, header, tab, actions, tree) -│ ├── RepositoryStep/ # RepositoryStep, RepositoryFactory, *Widget -│ └── strings/ # StringsContextProvider, String, useStrings -├── pages/ -│ ├── repository-list/ # RepositoryListPage, RepositoryListTreeViewPage, table/tree components -│ ├── repository-details/ # RepositoryDetailsPage, RepositoryDetails, RepositoryProvider, tab page, *RepositoryType -│ ├── artifact-list/ # ArtifactListPage (global artifacts) -│ ├── artifact-details/ # ArtifactDetailsPage, ArtifactDetails, ArtifactProvider, constants -│ ├── version-list/ # VersionListPage (versions for one artifact) -│ ├── version-details/ # VersionDetailsPage, VersionDetails, VersionProvider, VersionOverviewProvider, -│ │ │ # VersionFilesProvider, VersionDetailsTabs, VersionDetailsHeader, -│ │ │ # *VersionType (Docker, Npm, Swift, ...), shared version-details components -│ ├── webhook-details/ # WebhookDetailsPage -│ ├── upstream-proxy-details/ -│ ├── manage-registries/ -│ └── redirect-page/ -├── components/ # Breadcrumbs, ButtonTabs, RouteProvider, PackageTypeSelector, TreeView, ... -├── strings/ # strings.en.yaml, types (StringsMap) -├── utils/ # queryClient, customYupValidators, ... -├── __mocks__/ # PageNotPublic, DefaultNavComponent, RbacButton, hooks (useQueryParams, ...) -├── MFEAppTypes.ts # Parent props, Scope, AppstoreContext, ParentContextObj, components/hooks types -└── gitness/ # Gitness-specific route definitions and helpers -``` - ---- - -## 15. Data Flow (short) - -- **Repository list**: Query params (search, type, scope, …) → `useLocalGetRegistriesQuery` → **RepositoryListTable** or tree. -- **Repository details**: `repositoryIdentifier` from URL → **RepositoryProvider** → `useGetRegistryQuery` → context `data` → **RepositoryDetails** tabs → **RepositoryDetailsTabPage** (artifact list / config form / webhooks / metadata). -- **Artifact details**: `repositoryIdentifier`, `artifactIdentifier`, `artifactType` → **ArtifactProvider** → artifact summary → **VersionListPage** → **VersionListTableWidget** → package-type **VersionListTable** (versions query). -- **Version details**: Path params → **VersionProvider** (`useGetArtifactVersionSummaryQuery`) → **VersionOverviewProvider** (`useGetArtifactDetailsQuery` for full artifact details) → **VersionDetailsHeader** + **VersionDetailsTabs** → **VersionDetailsTabWidget** → package-type `renderVersionDetailsTab` → e.g. **SwiftOverviewPage** + **SwiftArtifactDetailsPage** (with **VersionFilesProvider** for files). - ---- - -This document covers the **entire structure** of the AR repo with **reference to the UI**: entry point, routing, every major page, the factory pattern, contexts, hooks, frameworks, components, types, strings, and how adding a package type (e.g. Swift) fits in. Use it as your single reference for navigation and implementation. diff --git a/web/src/ar/SWIFT_ICON_SETUP.md b/web/src/ar/SWIFT_ICON_SETUP.md deleted file mode 100644 index 8b12199849..0000000000 --- a/web/src/ar/SWIFT_ICON_SETUP.md +++ /dev/null @@ -1,144 +0,0 @@ -# Adding Swift logo (SVG) so it appears everywhere in the frontend - -Icons in the AR (Artifact Registry) frontend come from **`@harnessio/icons`**. To have the Swift logo show everywhere (repository type selector, repository/version trees, headers, overview cards, etc.), use one of the two approaches below. - ---- - -## Option A: Add the icon to the Harness Icons package (recommended) - -This makes Swift use the same `` pattern as Docker, Maven, NuGet, etc., so no AR code changes are needed beyond the icon name. - -### 1. Get the Swift SVG - -- Use your Swift logo SVG file (e.g. `swift-logo.svg`). -- Prefer a 24×24 (or square) viewBox so it scales well. -- Keep the file small and valid (no scripts, clean paths). - -### 2. Add it to the Harness Icons package - -The `@harnessio/icons` package is **external** (npm). Its types say: - -- *"This file is auto-generated. Please do not modify this file manually."* -- *"Use the command `yarn ui:icons` to regenerate this file."* - -So you need to add the Swift icon in the **repo that owns the Harness icons** (e.g. a design-system or ui-icons repo), not in gitness. - -Typical steps there: - -1. Clone the Harness icons (or design-system) repo. -2. Add your SVG (e.g. `swift-icon.svg`) in the folder where other icon SVGs live (e.g. `src/icons/` or similar). -3. Register the new icon in the config/list that the icon generator reads (if applicable). -4. Run the icon generation command (e.g. `yarn ui:icons` or the script that generates `HarnessIcons` and `HarnessIconName`). -5. Ensure the new icon gets a **kebab-case name** (e.g. `swift-icon`). -6. Build and publish a new version of `@harnessio/icons`. - -### 3. Use the new icon in gitness (AR) - -1. **Bump the dependency** in `web/package.json`: - - Set `"@harnessio/icons": "^x.y.z"` to the new version that includes the Swift icon. - -2. **Install:** - ```bash - cd web && yarn install - ``` - -3. **Use the new icon name everywhere Swift is referenced:** - - **Repository type list:** - `web/src/ar/hooks/useGetRepositoryTypes.ts` - Set the Swift entry’s `icon` to the new name (e.g. `'swift-icon'`). - - **Swift repository type:** - `web/src/ar/pages/repository-details/SwiftRepository/SwiftRepositoryType.tsx` - Set `protected repositoryIcon: IconName = 'swift-icon'`. - - **Swift version type:** - `web/src/ar/pages/version-details/SwiftVersion/SwiftVersionType.tsx` - Any place that passes an icon (e.g. for tree or header), use `'swift-icon'`. - - **Overview / general info:** - `web/src/ar/pages/version-details/SwiftVersion/pages/overview/SwiftVersionGeneralInfo.tsx` - In `LabelValueContent` for package type, set `icon="swift-icon"`. - -After that, the Swift logo will appear everywhere the app uses `RepositoryIcon` or the same icon name (repository selector, trees, headers, overview, etc.). - ---- - -## Option B: Use a local SVG in gitness only (no change to `@harnessio/icons`) - -If you cannot change the Harness Icons package, you can host the Swift SVG in gitness and render it only where you control the component. - -### 1. Add the SVG in the repo - -- Example: `web/src/ar/assets/swift-logo.svg` - (or `web/src/icons/swift-logo.svg` if you prefer to keep it with other app icons.) - -### 2. Declare SVG module (if needed) - -- The AR app already has in `web/src/ar/global.d.ts`: - ```ts - declare module '*.svg' { - const value: string - export default value - } - ``` -- If you import the SVG as URL (e.g. `import svg from './swift-logo.svg?url'`), ensure your bundler supports `?url` for SVGs (see e.g. `TreeNode.tsx`). - -### 3. Create a small Swift logo component - -Example: `web/src/ar/components/SwiftIcon/SwiftIcon.tsx` - -```tsx -import React from 'react' -import { IconProps } from '@harnessio/icons' - -import swiftLogoSvg from '@ar/assets/swift-logo.svg' // or path you chose - -interface SwiftIconProps { - size?: number - className?: string -} - -export default function SwiftIcon({ size = 24, className }: SwiftIconProps): JSX.Element { - return ( - Swift - ) -} -``` - -(If your setup uses `?url` for SVGs, use `import swiftLogoSvg from '...svg?url'` and same `src={swiftLogoSvg}`.) - -### 4. Use it where you control the UI - -- **RepositoryIcon** - In `web/src/ar/frameworks/RepositoryStep/RepositoryIcon.tsx`, when `packageType === RepositoryPackageType.SWIFT`, return `` instead of ``. For all other types, keep using ``. - -- **SwiftRepositoryType** - `repositoryIcon` is typed as `IconName`, so you can’t pass a component there. You can keep using a placeholder `IconName` (e.g. `'generic-repository-type'`) for the type, and rely on `RepositoryIcon` to show the real Swift logo when it sees `SWIFT`. - -- **Create-repository list** - The list uses `ButtonOption` with `icon: IconName`. So until the icon exists in `@harnessio/icons`, the create-repository grid will keep showing whatever icon name you put in `useGetRepositoryTypes` (e.g. a generic icon). Only after adding the icon to the package (Option A) will that grid show the Swift logo. - -- **Version/artifact trees and headers** - Where the code uses `RepositoryIcon` or a single place that resolves the icon by package type, the Swift logo will appear once `RepositoryIcon` is updated as above. Any place that uses `repositoryType.getIconName()` and then `` will still show the placeholder until the icon is in the package. - -So with Option B you get the Swift logo in: -- RepositoryIcon (headers, trees, any usage of that component) -- Any other spot where you explicitly render `` instead of ``. - -You do **not** get the Swift logo in the create-repository selector grid unless you add the icon to the Harness Icons package (Option A). - ---- - -## Summary - -| Goal | Approach | -|-----------------------------|-----------------------------| -| Swift logo everywhere | Add SVG to Harness Icons (Option A), then use `swift-icon` in AR. | -| Swift logo in AR only | Add local SVG + `SwiftIcon` and use it in `RepositoryIcon` and any custom screens (Option B). | -| Create-repository grid icon | Requires the icon in `@harnessio/icons` (Option A). | - -Recommended: add the Swift SVG to the Harness Icons package, publish a new version, then in gitness bump `@harnessio/icons` and set all Swift-related `icon` / `repositoryIcon` to the new name (e.g. `'swift-icon'`). diff --git a/web/src/ar/SWIFT_REGISTRY_CHECKLIST.md b/web/src/ar/SWIFT_REGISTRY_CHECKLIST.md deleted file mode 100644 index 8d85cf7f52..0000000000 --- a/web/src/ar/SWIFT_REGISTRY_CHECKLIST.md +++ /dev/null @@ -1,123 +0,0 @@ -# Adding Swift as a New Registry Type – Checklist - -Swift is added like existing types (Python, Maven, Generic, etc.): same API usage and UI, with a **Swift-specific icon** only. - ---- - -## 1. New files to create - -### 1.1 Version (artifact/version UI) - -| File | Purpose | -|------|--------| -| `web/src/ar/pages/version-details/SwiftVersion/SwiftVersionType.tsx` | Version type class (copy from `GenericVersion/GenericVersionType.tsx`, set `packageType = RepositoryPackageType.SWIFT`, icon/tree labels as needed). | -| `web/src/ar/pages/version-details/SwiftVersion/types.ts` | Types for Swift version (copy from `GenericVersion/types.ts` if you need artifact-detail types). | -| `web/src/ar/pages/version-details/SwiftVersion/pages/overview/SwiftOverviewPage.tsx` | Overview tab content (copy from `GenericVersion/pages/overview/OverviewPage.tsx`). | -| `web/src/ar/pages/version-details/SwiftVersion/pages/overview/SwiftVersionGeneralInfo.tsx` | General info card showing package type label (use `getString('packageTypes.swiftPackage')` and Swift icon). | -| `web/src/ar/pages/version-details/SwiftVersion/pages/overview/styles.module.scss` | Styles for overview (copy from Generic). | -| `web/src/ar/pages/version-details/SwiftVersion/pages/overview/styles.module.scss.d.ts` | Typings for overview styles. | -| `web/src/ar/pages/version-details/SwiftVersion/pages/artifact-details/SwiftArtifactDetailsPage.tsx` | Files tab / artifact details page (copy from `GenericVersion/pages/artifact-details/GenericArtifactDetailsPage.tsx`). | -| `web/src/ar/pages/version-details/SwiftVersion/pages/oss-details/OSSContentPage.tsx` | OSS tab (if Swift supports it; copy from Generic). | -| `web/src/ar/pages/version-details/SwiftVersion/pages/oss-details/OSSArtifactDetailsContent.tsx` | OSS artifact content (if needed). | -| `web/src/ar/pages/version-details/SwiftVersion/pages/oss-details/OSSGeneralInfoContent.tsx` | OSS general info (if needed). | -| `web/src/ar/pages/version-details/SwiftVersion/pages/oss-details/ossDetails.module.scss` (+ `.d.ts`) | OSS styles (if needed). | - -**Minimal set (same behavior as Generic):** -`SwiftVersionType.tsx`, `types.ts`, overview page + `SwiftVersionGeneralInfo.tsx` + styles, and `SwiftArtifactDetailsPage.tsx`. Add OSS files only if Swift should have the OSS tab. - -### 1.2 Repository (registry setup UI) - -| File | Purpose | -|------|--------| -| `web/src/ar/pages/repository-details/SwiftRepository/SwiftRepositoryType.tsx` | Repository type class (copy from `GenericRepository/GenericRepositoryType.tsx`, set `packageType = RepositoryPackageType.SWIFT`, `repositoryIcon = 'swift-icon'` or chosen icon). | - -Optional (if you add tests): - -- `web/src/ar/pages/repository-details/SwiftRepository/__tests__/__mockData__.ts` -- `web/src/ar/pages/repository-details/SwiftRepository/__tests__/CreateSwiftRegistry.test.tsx` -- `web/src/ar/pages/version-details/SwiftVersion/__tests__/` (e.g. list/overview/artifact details tests, copy from Generic). - ---- - -## 2. Existing files to modify - -### 2.1 Types and enums - -| File | Change | -|------|--------| -| `web/src/ar/common/types.ts` | In `RepositoryPackageType` enum add: `SWIFT = 'SWIFT'`. | - -### 2.2 Upstream proxy (if Swift supports upstream) - -| File | Change | -|------|--------| -| `web/src/ar/pages/upstream-proxy-details/types.ts` | In `UpstreamProxyPackageType` enum add: `SWIFT = 'SWIFT'`. | - -### 2.3 Factories (registration) - -| File | Change | -|------|--------| -| `web/src/ar/pages/version-details/VersionFactory.tsx` | Import `SwiftVersionType`, then `versionFactory.registerStep(new SwiftVersionType())`. | -| `web/src/ar/pages/repository-details/RepositoryFactory.tsx` | Import `SwiftRepositoryType`, then `repositoryFactory.registerStep(new SwiftRepositoryType())`. | - -### 2.4 Repository/package type lists (dropdowns and artifact list “type” column) - -| File | Change | -|------|--------| -| `web/src/ar/hooks/useGetRepositoryTypes.ts` | In `RepositoryTypes` array add: `{ label: 'repositoryTypes.swift', value: RepositoryPackageType.SWIFT, icon: 'swift-icon' }` (or chosen icon name). | -| `web/src/ar/hooks/useGetUpstreamRepositoryPackageTypes.ts` | In `UpstreamProxyPackageTypeList` add same entry with `value: UpstreamProxyPackageType.SWIFT` (if Swift supports upstream). | - -### 2.5 Strings (labels and types) - -| File | Change | -|------|--------| -| `web/src/ar/strings/strings.en.yaml` | Under `packageTypes:` add `swiftPackage: Swift Package`. Under `repositoryTypes:` add `swift: Swift`. | -| `web/src/ar/strings/types.ts` | In `StringsMap` add `'packageTypes.swiftPackage': string` and `'repositoryTypes.swift': string`. | - -### 2.6 Version type implementation details - -- In **`SwiftVersionType.tsx`**: - - Extend the same base as Generic (e.g. `VersionStep`). - - Set `protected packageType = RepositoryPackageType.SWIFT`. - - Set `protected hasArtifactRowSubComponent = true` if the artifact list row should expand (e.g. to show files). - - Point overview tab to `SwiftOverviewPage` and general info to `SwiftVersionGeneralInfo`. - - Point artifact-details tab to a page that uses `VersionFilesProvider` + `ArtifactFilesContent` (or `SwiftArtifactDetailsPage` which does the same). - - Use `renderArtifactTreeNodeView` / `renderVersionTreeNodeView` with your chosen **Swift icon** (e.g. `'swift-icon'`). -- In **`SwiftVersionGeneralInfo.tsx`**: use `getString('packageTypes.swiftPackage')` and the same Swift icon for the package type row. - -### 2.7 Repository type implementation details - -- In **`SwiftRepositoryType.tsx`**: - - Set `protected packageType = RepositoryPackageType.SWIFT`. - - Set `protected repositoryIcon: IconName = 'swift-icon'` (or the icon you use in `@harnessio/icons`). - - Keep the same create/configuration/actions/setup client/redirect/tree methods as Generic (or as needed). - -### 2.8 Icon - -- **Icon name:** Use one of: - - An existing icon in `@harnessio/icons` that fits Swift (e.g. a code/package icon), or - - A new icon (e.g. `swift-icon`) if your design system adds it. -- Replace every `'swift-icon'` in this checklist with the actual icon name you use. - ---- - -## 3. Backend / API - -- Ensure the backend and OpenAPI client accept **`SWIFT`** as a valid `package_type` (or equivalent) for: - - Creating/updating registries - - Listing/filtering artifacts and versions - - Version details and file listing -- If the backend uses an enum, add `SWIFT` there and regenerate the client if needed. - ---- - -## 4. Summary table - -| Category | New files | Modified files | -|----------|-----------|----------------| -| Version (SwiftVersion) | `SwiftVersionType.tsx`, `types.ts`, overview page + GeneralInfo + styles, `SwiftArtifactDetailsPage.tsx`, (optional) OSS pages + styles | — | -| Repository (SwiftRepository) | `SwiftRepositoryType.tsx` | — | -| Registration & types | — | `common/types.ts`, `upstream-proxy-details/types.ts`, `VersionFactory.tsx`, `RepositoryFactory.tsx` | -| Lists & strings | — | `useGetRepositoryTypes.ts`, `useGetUpstreamRepositoryPackageTypes.ts`, `strings.en.yaml`, `strings/types.ts` | - -No changes are required in **routes** or **RouteDestinations**: version/repository resolution is done via `versionFactory.getVersionType(packageType)` and `repositoryFactory.getRepositoryType(packageType)` using the new `SWIFT` enum value and registered types. From 1455fb4b62afd8f416ff69f0dbc5f7d5467f7688 Mon Sep 17 00:00:00 2001 From: shivang Date: Fri, 20 Feb 2026 12:54:45 +0530 Subject: [PATCH 07/10] feat: [AH-2815]: Added swift support on frontend --- web/.npmrc | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 web/.npmrc diff --git a/web/.npmrc b/web/.npmrc deleted file mode 100644 index 4c932be17b..0000000000 --- a/web/.npmrc +++ /dev/null @@ -1,2 +0,0 @@ -# Use public npm registry (avoids host.docker.internal / custom registry when running yarn install locally) -registry=https://registry.npmjs.org/ From c61ea37780358278981f80d6810b12e93f86c976 Mon Sep 17 00:00:00 2001 From: shivang Date: Fri, 20 Feb 2026 12:59:55 +0530 Subject: [PATCH 08/10] feat: [AH-2815]: Added swift support on frontend --- web/src/ar/hooks/useGetRepositoryTypes.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/web/src/ar/hooks/useGetRepositoryTypes.ts b/web/src/ar/hooks/useGetRepositoryTypes.ts index c2ca410793..9511e4d49a 100644 --- a/web/src/ar/hooks/useGetRepositoryTypes.ts +++ b/web/src/ar/hooks/useGetRepositoryTypes.ts @@ -135,6 +135,7 @@ const RepositoryTypes: RepositoryTypeListItem[] = [ featureFlag: FeatureFlags.HAR_SWIFT_PACKAGE, parent: Parent.Enterprise, tooltip: 'Coming Soon!', + tag: ThumbnailTagEnum.ComingSoon }, { label: 'repositoryTypes.debian', From adb3d9b7ba5997d13b6431eb97434c8b38afd5f6 Mon Sep 17 00:00:00 2001 From: shivang Date: Fri, 20 Feb 2026 13:12:20 +0530 Subject: [PATCH 09/10] feat: [AH-2815]: Added swift support on frontend --- web/src/ar/hooks/useGetRepositoryTypes.ts | 5 ++--- .../SwiftRepository/SwiftRepositoryType.tsx | 1 - .../version-details/SwiftVersion/SwiftVersionType.tsx | 3 +-- .../pages/artifact-details/SwiftArtifactDetailsPage.tsx | 9 ++------- 4 files changed, 5 insertions(+), 13 deletions(-) diff --git a/web/src/ar/hooks/useGetRepositoryTypes.ts b/web/src/ar/hooks/useGetRepositoryTypes.ts index 9511e4d49a..810defc118 100644 --- a/web/src/ar/hooks/useGetRepositoryTypes.ts +++ b/web/src/ar/hooks/useGetRepositoryTypes.ts @@ -130,8 +130,8 @@ const RepositoryTypes: RepositoryTypeListItem[] = [ { label: 'repositoryTypes.swift', value: RepositoryPackageType.SWIFT, - icon: 'swift-logo', - disabled:true, + icon: 'swift-logo', + disabled: true, featureFlag: FeatureFlags.HAR_SWIFT_PACKAGE, parent: Parent.Enterprise, tooltip: 'Coming Soon!', @@ -154,4 +154,3 @@ const RepositoryTypes: RepositoryTypeListItem[] = [ tag: ThumbnailTagEnum.ComingSoon } ] - diff --git a/web/src/ar/pages/repository-details/SwiftRepository/SwiftRepositoryType.tsx b/web/src/ar/pages/repository-details/SwiftRepository/SwiftRepositoryType.tsx index 4050170969..9ff3adcf10 100644 --- a/web/src/ar/pages/repository-details/SwiftRepository/SwiftRepositoryType.tsx +++ b/web/src/ar/pages/repository-details/SwiftRepository/SwiftRepositoryType.tsx @@ -50,7 +50,6 @@ export class SwiftRepositoryType extends RepositoryStep protected supportedScanners = [] protected supportsUpstreamProxy = false protected isWebhookSupported = false - protected defaultValues: VirtualRegistryRequest = { packageType: RepositoryPackageType.SWIFT as VirtualRegistryRequest['packageType'], diff --git a/web/src/ar/pages/version-details/SwiftVersion/SwiftVersionType.tsx b/web/src/ar/pages/version-details/SwiftVersion/SwiftVersionType.tsx index 2c63e5cf24..e216a68b1f 100644 --- a/web/src/ar/pages/version-details/SwiftVersion/SwiftVersionType.tsx +++ b/web/src/ar/pages/version-details/SwiftVersion/SwiftVersionType.tsx @@ -64,7 +64,6 @@ export class SwiftVersionType extends VersionStep { [VersionListColumnEnum.PullCommand]: { width: '100%' }, [VersionListColumnEnum.LastModified]: { width: '100%' }, [VersionListColumnEnum.Actions]: { width: '30%' } - } protected allowedActionsOnVersion = [ @@ -73,7 +72,7 @@ export class SwiftVersionType extends VersionStep { VersionAction.ViewVersionDetails, VersionAction.Quarantine, VersionAction.Download, - VersionAction.DownloadCommand, + VersionAction.DownloadCommand ] protected allowedActionsOnVersionDetailsPage = [ VersionAction.Delete, diff --git a/web/src/ar/pages/version-details/SwiftVersion/pages/artifact-details/SwiftArtifactDetailsPage.tsx b/web/src/ar/pages/version-details/SwiftVersion/pages/artifact-details/SwiftArtifactDetailsPage.tsx index 606e598c5a..fac9d6bb12 100644 --- a/web/src/ar/pages/version-details/SwiftVersion/pages/artifact-details/SwiftArtifactDetailsPage.tsx +++ b/web/src/ar/pages/version-details/SwiftVersion/pages/artifact-details/SwiftArtifactDetailsPage.tsx @@ -26,18 +26,13 @@ import ReadmeFileContent from '@ar/pages/version-details/components/ReadmeFileCo import ArtifactFilesContent from '@ar/pages/version-details/components/ArtifactFileListTable/ArtifactFilesContent' import SwiftVersionDependencyContent from './SwiftVersionDependencyContent' -import { - SwiftArtifactDetails, - SwiftArtifactDetailsTabEnum, - type SwiftVersionDetailsQueryParams -} from '../../types' +import { SwiftArtifactDetails, SwiftArtifactDetailsTabEnum, type SwiftVersionDetailsQueryParams } from '../../types' export default function SwiftArtifactDetailsPage() { const { getString } = useStrings() const { useUpdateQueryParams, useQueryParams } = useParentHooks() const { updateQueryParams } = useUpdateQueryParams() - const { detailsTab = SwiftArtifactDetailsTabEnum.ReadMe } = - useQueryParams() + const { detailsTab = SwiftArtifactDetailsTabEnum.ReadMe } = useQueryParams() const { data } = useVersionOverview() const { metadata } = data From b99e55d64ee3ff8199be816a5a676aeeb892f9cb Mon Sep 17 00:00:00 2001 From: shivang Date: Tue, 24 Feb 2026 16:23:13 +0530 Subject: [PATCH 10/10] feat: [AH-2815]: Frontend support for swift --- .../SwiftRepository/SwiftRepositoryType.tsx | 8 ++++---- .../version-details/SwiftVersion/SwiftVersionType.tsx | 2 +- .../pages/overview/SwiftVersionGeneralInfo.tsx | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/web/src/ar/pages/repository-details/SwiftRepository/SwiftRepositoryType.tsx b/web/src/ar/pages/repository-details/SwiftRepository/SwiftRepositoryType.tsx index 9ff3adcf10..cb478fd540 100644 --- a/web/src/ar/pages/repository-details/SwiftRepository/SwiftRepositoryType.tsx +++ b/web/src/ar/pages/repository-details/SwiftRepository/SwiftRepositoryType.tsx @@ -49,10 +49,10 @@ export class SwiftRepositoryType extends RepositoryStep protected repositoryIcon: IconName = 'swift-logo' protected supportedScanners = [] protected supportsUpstreamProxy = false - protected isWebhookSupported = false + protected isWebhookSupported = true protected defaultValues: VirtualRegistryRequest = { - packageType: RepositoryPackageType.SWIFT as VirtualRegistryRequest['packageType'], + packageType: RepositoryPackageType.SWIFT, identifier: '', config: { type: RepositoryConfigType.VIRTUAL @@ -62,7 +62,7 @@ export class SwiftRepositoryType extends RepositoryStep } protected defaultUpstreamProxyValues: UpstreamRegistryRequest = { - packageType: RepositoryPackageType.SWIFT as UpstreamRegistryRequest['packageType'], + packageType: RepositoryPackageType.SWIFT, identifier: '', config: { type: RepositoryConfigType.UPSTREAM, @@ -95,7 +95,7 @@ export class SwiftRepositoryType extends RepositoryStep artifactKey={artifactKey} versionKey={versionKey} onClose={onClose} - packageType={RepositoryPackageType.SWIFT as Parameters[0]['packageType']} + packageType={RepositoryPackageType.SWIFT} /> ) } diff --git a/web/src/ar/pages/version-details/SwiftVersion/SwiftVersionType.tsx b/web/src/ar/pages/version-details/SwiftVersion/SwiftVersionType.tsx index e216a68b1f..cce97d5998 100644 --- a/web/src/ar/pages/version-details/SwiftVersion/SwiftVersionType.tsx +++ b/web/src/ar/pages/version-details/SwiftVersion/SwiftVersionType.tsx @@ -49,7 +49,7 @@ import VersionActions from '../components/VersionActions/VersionActions' import { VersionAction } from '../components/VersionActions/types' export class SwiftVersionType extends VersionStep { - protected packageType = 'SWIFT' as RepositoryPackageType + protected packageType = RepositoryPackageType.SWIFT protected hasArtifactRowSubComponent = true protected allowedVersionDetailsTabs: VersionDetailsTab[] = [ VersionDetailsTab.OVERVIEW, diff --git a/web/src/ar/pages/version-details/SwiftVersion/pages/overview/SwiftVersionGeneralInfo.tsx b/web/src/ar/pages/version-details/SwiftVersion/pages/overview/SwiftVersionGeneralInfo.tsx index d4033e6d72..d998540a71 100644 --- a/web/src/ar/pages/version-details/SwiftVersion/pages/overview/SwiftVersionGeneralInfo.tsx +++ b/web/src/ar/pages/version-details/SwiftVersion/pages/overview/SwiftVersionGeneralInfo.tsx @@ -19,7 +19,7 @@ import { defaultTo, isEmpty } from 'lodash-es' import { FontVariation } from '@harnessio/design-system' import { Card, Container, Layout, Text } from '@harnessio/uicore' -import { useStrings, type StringKeys } from '@ar/frameworks/strings' +import { useStrings } from '@ar/frameworks/strings' import { DEFAULT_DATE_TIME_FORMAT } from '@ar/constants' import { getReadableDateTime } from '@ar/common/dateUtils' import { LabelValueTypeEnum } from '@ar/pages/version-details/components/LabelValueContent/type' @@ -61,7 +61,7 @@ export default function SwiftVersionGeneralInfo(props: SwiftVersionGeneralInfoPr />