@acorex-platform/extension-source-control-core-client 0.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/acorex-platform-extension-source-control-core-client-contracts.mjs +69 -0
- package/fesm2022/acorex-platform-extension-source-control-core-client-contracts.mjs.map +1 -0
- package/fesm2022/acorex-platform-extension-source-control-core-client-source-control-page.component-DOALkPKo.mjs +749 -0
- package/fesm2022/acorex-platform-extension-source-control-core-client-source-control-page.component-DOALkPKo.mjs.map +1 -0
- package/fesm2022/acorex-platform-extension-source-control-core-client.mjs +322 -0
- package/fesm2022/acorex-platform-extension-source-control-core-client.mjs.map +1 -0
- package/package.json +28 -0
- package/types/acorex-platform-extension-source-control-core-client-contracts.d.ts +136 -0
- package/types/acorex-platform-extension-source-control-core-client.d.ts +9 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-extension-source-control-core-client-source-control-page.component-DOALkPKo.mjs","sources":["../../../../libs/extensions/source-control/core/client/src/lib/features/link-repository/source-control-repo-search.client.ts","../../../../libs/extensions/source-control/core/client/src/lib/features/project-management/source-control-project-link.service.ts","../../../../libs/extensions/source-control/core/client/src/lib/features/project-management/repository-commits-panel/source-control-repository-browse.client.ts","../../../../libs/extensions/source-control/core/client/src/lib/features/project-management/repository-commits-panel/source-control-repository-hooks.service.ts","../../../../libs/extensions/source-control/core/client/src/lib/features/project-management/repository-commits-panel/repository-commits-panel.component.ts","../../../../libs/extensions/source-control/core/client/src/lib/features/project-management/repository-commits-panel/repository-commits-panel.component.html","../../../../libs/extensions/source-control/core/client/src/lib/features/project-management/source-control-page/source-control-page.component.ts","../../../../libs/extensions/source-control/core/client/src/lib/features/project-management/source-control-page/source-control-page.component.html"],"sourcesContent":["//#region ----- Imports -----\n\nimport { AXPQueryService } from '@acorex-platform/framework-client/runtime';\nimport { runtimeQueryPayloadData } from '@acorex-platform/framework-shared/core';\nimport {\n AXE_SC_PROVIDER_GITHUB,\n AXE_SC_PROVIDER_GITLAB,\n type AXESourceControlRemoteRepoDto,\n type AXESourceControlSearchReposRequest,\n type AXESourceControlSearchReposResponse,\n} from '@acorex-platform/extension-source-control-core-client/contracts';\nimport { AXEGithubQueryKeys } from '@acorex-platform/extension-github-client/contracts';\nimport { AXEGitLabQueryKeys } from '@acorex-platform/extension-gitlab-client/contracts';\nimport { inject, Injectable } from '@angular/core';\n\n//#endregion\n\n//#region ----- Service -----\n\n@Injectable({ providedIn: 'root' })\nexport class AXESourceControlRepoSearchClient {\n private readonly queryService = inject(AXPQueryService);\n\n async search(input: AXESourceControlSearchReposRequest): Promise<AXESourceControlRemoteRepoDto[]> {\n const key = this.resolveQueryKey(input.providerId);\n const result = await this.queryService.fetch<AXESourceControlSearchReposRequest, AXESourceControlSearchReposResponse>(\n key,\n input,\n );\n return runtimeQueryPayloadData(result)?.items ?? [];\n }\n\n private resolveQueryKey(providerId: string): string {\n if (providerId === AXE_SC_PROVIDER_GITHUB) {\n return AXEGithubQueryKeys.RepoSearch;\n }\n if (providerId === AXE_SC_PROVIDER_GITLAB) {\n return AXEGitLabQueryKeys.RepoSearch;\n }\n throw new Error(`Unsupported source-control provider: ${providerId}`);\n }\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { AXMIntegrationConnectionManager } from '@acorex-platform/module-integration-management-client';\nimport type { AXMIntegrationManagementIntegrationConnectionEntityModel } from '@acorex-platform/module-integration-management-client/contracts';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport { Injectable, inject } from '@angular/core';\nimport { trim } from 'lodash-es';\nimport {\n AXE_SC_PROVIDER_IDS,\n RootConfig,\n type AXESourceControlProjectSourceControlLinkEntityModel,\n type AXESourceControlRemoteRepoDto,\n} from '@acorex-platform/extension-source-control-core-client/contracts';\nimport { AXESourceControlRepoSearchClient } from '../link-repository/source-control-repo-search.client';\n\n//#endregion\n\n//#region ----- Types -----\n\nexport interface AXESourceControlSaveLinkInput {\n projectId: string;\n connection: AXMIntegrationManagementIntegrationConnectionEntityModel;\n repo: AXESourceControlRemoteRepoDto;\n}\n\n//#endregion\n\n//#region ----- Service -----\n\n@Injectable({ providedIn: 'root' })\nexport class AXESourceControlProjectLinkService {\n //#region ----- Services & Dependencies -----\n\n private readonly connectionManager = inject(AXMIntegrationConnectionManager);\n private readonly entityService = inject(AXPEntityService);\n private readonly repoSearch = inject(AXESourceControlRepoSearchClient);\n\n //#endregion\n\n //#region ----- Connections -----\n\n async listConnections(): Promise<AXMIntegrationManagementIntegrationConnectionEntityModel[]> {\n const connections = await this.connectionManager.listForCurrentUser('tenant');\n return connections.filter(\n (item) =>\n AXE_SC_PROVIDER_IDS.includes(item.providerId as (typeof AXE_SC_PROVIDER_IDS)[number]) &&\n !item.isRevoked &&\n !item.isDisabled,\n );\n }\n\n //#endregion\n\n //#region ----- Link persistence -----\n\n async findLinkByProjectId(projectId: string): Promise<AXESourceControlProjectSourceControlLinkEntityModel | null> {\n const id = trim(projectId);\n if (!id) {\n return null;\n }\n\n const result = await this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.projectSourceControlLink.name)\n .data<string, AXESourceControlProjectSourceControlLinkEntityModel>()\n .query({\n skip: 0,\n take: 1,\n filter: {\n field: 'projectId',\n operator: { type: 'equal' },\n value: id,\n },\n });\n\n return result.items?.[0] ?? null;\n }\n\n async saveLink(input: AXESourceControlSaveLinkInput): Promise<AXESourceControlProjectSourceControlLinkEntityModel> {\n const projectId = trim(input.projectId);\n if (!projectId) {\n throw new Error('Project id is required.');\n }\n\n const accessor = this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.projectSourceControlLink.name)\n .data<string, AXESourceControlProjectSourceControlLinkEntityModel>();\n\n const existing = await this.findLinkByProjectId(projectId);\n const linkedAt = new Date().toISOString();\n const payload = {\n projectId,\n providerId: input.connection.providerId,\n connectionId: input.connection.id,\n remoteId: input.repo.remoteId,\n fullName: input.repo.fullName,\n webUrl: input.repo.webUrl,\n defaultBranch: input.repo.defaultBranch,\n linkedAt,\n };\n\n if (existing) {\n await accessor.update(existing.id, payload);\n return { ...existing, ...payload };\n }\n\n const createdId = await accessor.create(payload);\n return {\n id: String(createdId),\n ...payload,\n };\n }\n\n async removeLink(projectId: string): Promise<void> {\n const existing = await this.findLinkByProjectId(projectId);\n if (!existing) {\n return;\n }\n\n await this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.projectSourceControlLink.name)\n .data<string, AXESourceControlProjectSourceControlLinkEntityModel>()\n .delete(existing.id);\n }\n\n //#endregion\n\n //#region ----- Repository search -----\n\n async searchRepositories(\n connection: AXMIntegrationManagementIntegrationConnectionEntityModel,\n query?: string,\n ): Promise<AXESourceControlRemoteRepoDto[]> {\n return this.repoSearch.search({\n providerId: connection.providerId,\n connectionId: connection.id,\n query: trim(query),\n });\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { AXEGithubQueryKeys } from '@acorex-platform/extension-github-client/contracts';\nimport { AXEGitLabQueryKeys } from '@acorex-platform/extension-gitlab-client/contracts';\nimport {\n AXE_SC_PROVIDER_GITHUB,\n AXE_SC_PROVIDER_GITLAB,\n type AXESourceControlBranchDto,\n type AXESourceControlCommitDto,\n type AXESourceControlListBranchesRequest,\n type AXESourceControlListBranchesResponse,\n type AXESourceControlListCommitsRequest,\n type AXESourceControlListCommitsResponse,\n type AXESourceControlProjectSourceControlLinkEntityModel,\n} from '@acorex-platform/extension-source-control-core-client/contracts';\nimport { AXPQueryService } from '@acorex-platform/framework-client/runtime';\nimport { runtimeQueryPayloadData } from '@acorex-platform/framework-shared/core';\nimport { inject, Injectable } from '@angular/core';\n\n//#endregion\n\n//#region ----- Service -----\n\n@Injectable({ providedIn: 'root' })\nexport class AXESourceControlRepositoryBrowseClient {\n private readonly queryService = inject(AXPQueryService);\n\n async listBranches(link: AXESourceControlProjectSourceControlLinkEntityModel): Promise<AXESourceControlBranchDto[]> {\n const input: AXESourceControlListBranchesRequest = {\n providerId: link.providerId,\n connectionId: link.connectionId,\n fullName: link.fullName,\n };\n const result = await this.queryService.fetch<AXESourceControlListBranchesRequest, AXESourceControlListBranchesResponse>(this.resolveBranchesQueryKey(link.providerId), input);\n return runtimeQueryPayloadData(result)?.items ?? [];\n }\n\n async listCommits(link: AXESourceControlProjectSourceControlLinkEntityModel, branch: string, take = 30): Promise<AXESourceControlCommitDto[]> {\n const input: AXESourceControlListCommitsRequest = {\n providerId: link.providerId,\n connectionId: link.connectionId,\n fullName: link.fullName,\n branch,\n take,\n };\n const result = await this.queryService.fetch<AXESourceControlListCommitsRequest, AXESourceControlListCommitsResponse>(this.resolveCommitsQueryKey(link.providerId), input);\n return runtimeQueryPayloadData(result)?.items ?? [];\n }\n\n private resolveBranchesQueryKey(providerId: string): string {\n if (providerId === AXE_SC_PROVIDER_GITHUB) {\n return AXEGithubQueryKeys.ListBranches;\n }\n if (providerId === AXE_SC_PROVIDER_GITLAB) {\n return AXEGitLabQueryKeys.ListBranches;\n }\n throw new Error(`Unsupported source-control provider: ${providerId}`);\n }\n\n private resolveCommitsQueryKey(providerId: string): string {\n if (providerId === AXE_SC_PROVIDER_GITHUB) {\n return AXEGithubQueryKeys.ListCommits;\n }\n if (providerId === AXE_SC_PROVIDER_GITLAB) {\n return AXEGitLabQueryKeys.ListCommits;\n }\n throw new Error(`Unsupported source-control provider: ${providerId}`);\n }\n}\n\n//#endregion\n","//#region ----- Imports -----\r\r\n\r\r\nimport { AXPHookService } from '@acorex-platform/framework-client/core';\r\r\nimport type { AXPActionMenuItem } from '@acorex-platform/framework-shared/core';\r\r\nimport {\r\r\n AXESourceControlHookKeys,\r\r\n type AXESourceControlBranchActionsHookPayload,\r\r\n type AXESourceControlCommitActionsHookPayload,\r\r\n type AXESourceControlCommitDto,\r\r\n type AXESourceControlProjectSourceControlLinkEntityModel,\r\r\n} from '@acorex-platform/extension-source-control-core-client/contracts';\r\r\nimport { inject, Injectable } from '@angular/core';\r\r\n\r\r\n//#endregion\r\r\n\r\r\n//#region ----- Service -----\r\r\n\r\r\n@Injectable({ providedIn: 'root' })\r\r\nexport class AXESourceControlRepositoryHooksService {\r\r\n private readonly hooks = inject(AXPHookService);\r\r\n\r\r\n async resolveCommitActions(input: {\r\r\n projectId: string;\r\r\n link: AXESourceControlProjectSourceControlLinkEntityModel;\r\r\n branch: string;\r\r\n commit: AXESourceControlCommitDto;\r\r\n }): Promise<AXPActionMenuItem[]> {\r\r\n const payload: AXESourceControlCommitActionsHookPayload = {\r\r\n projectId: input.projectId,\r\r\n link: input.link,\r\r\n branch: input.branch,\r\r\n commit: input.commit,\r\r\n actions: [],\r\r\n };\r\r\n const result = await this.hooks.runAsync<AXESourceControlCommitActionsHookPayload>(\r\r\n AXESourceControlHookKeys.CommitActions,\r\r\n payload,\r\r\n );\r\r\n return result?.actions ?? [];\r\r\n }\r\r\n\r\r\n async resolveBranchActions(input: {\r\r\n projectId: string;\r\r\n link: AXESourceControlProjectSourceControlLinkEntityModel;\r\r\n branch: string;\r\r\n baseBranch: string;\r\r\n }): Promise<AXPActionMenuItem[]> {\r\r\n const payload: AXESourceControlBranchActionsHookPayload = {\r\r\n projectId: input.projectId,\r\r\n link: input.link,\r\r\n branch: input.branch,\r\r\n baseBranch: input.baseBranch,\r\r\n actions: [],\r\r\n };\r\r\n const result = await this.hooks.runAsync<AXESourceControlBranchActionsHookPayload>(\r\r\n AXESourceControlHookKeys.BranchActions,\r\r\n payload,\r\r\n );\r\r\n return result?.actions ?? [];\r\r\n }\r\r\n}\r\r\n\r\r\n//#endregion\r\r\n","//#region ----- Imports -----\n\n\n\nimport { AsyncPipe } from '@angular/common';\n\nimport {\n\n ChangeDetectionStrategy,\n\n Component,\n\n computed,\n\n effect,\n\n inject,\n\n input,\n\n signal,\n\n untracked,\n\n} from '@angular/core';\n\nimport { FormsModule } from '@angular/forms';\n\nimport { AXBadgeModule } from '@acorex/components/badge';\n\nimport { AXButtonModule } from '@acorex/components/button';\n\nimport { AXDecoratorModule } from '@acorex/components/decorators';\n\nimport { AXLoadingModule } from '@acorex/components/loading';\n\nimport { AXSelectBoxModule } from '@acorex/components/select-box';\n\nimport { AXTranslationModule } from '@acorex/core/translation';\n\nimport { AXPSettingsService } from '@acorex-platform/framework-client/common';\n\nimport { AXPStateMessageComponent } from '@acorex-platform/framework-client/layout/components';\n\nimport { AXPCommandExecutor } from '@acorex-platform/framework-client/runtime';\n\nimport type { AXPActionMenuItem } from '@acorex-platform/framework-shared/core';\n\nimport { AXPRegionalSetting } from '@acorex-platform/framework-shared/core';\n\nimport type {\n\n AXESourceControlBranchDto,\n\n AXESourceControlCommitDto,\n\n AXESourceControlProjectSourceControlLinkEntityModel,\n\n} from '@acorex-platform/extension-source-control-core-client/contracts';\n\nimport { AXFormatService } from '@acorex/core/format';\n\nimport { defaultTo, trim } from 'lodash-es';\n\nimport { AXESourceControlRepositoryBrowseClient } from './source-control-repository-browse.client';\n\nimport { AXESourceControlRepositoryHooksService } from './source-control-repository-hooks.service';\n\n\n\n//#endregion\n\n\n\n//#region ----- Constants -----\n\n\n\nconst I18N = '@extensions-source-control:pages.repository.commits';\n\n\n\n//#endregion\n\n\n\n//#region ----- Component -----\n\n\n\n@Component({\n\n selector: 'axe-repository-commits-panel',\n\n templateUrl: './repository-commits-panel.component.html',\n\n imports: [\n\n AsyncPipe,\n\n FormsModule,\n\n AXBadgeModule,\n\n AXButtonModule,\n\n AXDecoratorModule,\n\n AXLoadingModule,\n\n AXSelectBoxModule,\n\n AXTranslationModule,\n\n AXPStateMessageComponent,\n\n ],\n\n changeDetection: ChangeDetectionStrategy.OnPush,\n\n})\n\nexport class AXERepositoryCommitsPanelComponent {\n\n //#region ----- Inputs -----\n\n\n\n projectId = input.required<string>();\n\n link = input.required<AXESourceControlProjectSourceControlLinkEntityModel>();\n\n\n\n //#endregion\n\n\n\n //#region ----- Services & Dependencies -----\n\n\n\n protected readonly i18n = I18N;\n\n private readonly browseClient = inject(AXESourceControlRepositoryBrowseClient);\n\n private readonly hooksService = inject(AXESourceControlRepositoryHooksService);\n\n private readonly commandExecutor = inject(AXPCommandExecutor);\n\n private readonly settingsService = inject(AXPSettingsService);\n\n private readonly formatService = inject(AXFormatService);\n\n\n\n //#endregion\n\n\n\n //#region ----- State Signals -----\n\n\n\n protected readonly loading = signal(false);\n\n protected readonly branches = signal<AXESourceControlBranchDto[]>([]);\n\n protected readonly selectedBranch = signal('');\n\n protected readonly commits = signal<AXESourceControlCommitDto[]>([]);\n\n protected readonly branchActions = signal<AXPActionMenuItem[]>([]);\n\n protected readonly commitActionsBySha = signal<Record<string, AXPActionMenuItem[]>>({});\n\n private readonly datetimeFormat = signal('');\n\n\n\n //#endregion\n\n\n\n //#region ----- Computed Properties -----\n\n\n\n protected readonly baseBranch = computed(() => {\n\n const link = this.link();\n\n const defaultBranch = trim(link.defaultBranch ?? '');\n\n if (defaultBranch) {\n\n return defaultBranch;\n\n }\n\n const branches = this.branches();\n\n const markedDefault = branches.find((branch) => branch.isDefault)?.name;\n\n return markedDefault ?? branches[0]?.name ?? 'main';\n\n });\n\n\n\n protected readonly branchOptions = computed(() =>\n\n this.branches().map((branch) => ({\n\n name: branch.name,\n\n title: branch.name,\n\n })),\n\n );\n\n\n\n //#endregion\n\n\n\n //#region ----- Lifecycle -----\n\n\n\n constructor() {\n\n effect(() => {\n\n const link = this.link();\n\n const projectId = trim(this.projectId());\n\n if (!link || !projectId) {\n\n return;\n\n }\n\n untracked(() => {\n\n void this.initialize(link, projectId);\n\n });\n\n });\n\n\n\n effect(() => {\n\n const link = this.link();\n\n const projectId = trim(this.projectId());\n\n const branch = trim(this.selectedBranch());\n\n if (!link || !projectId || !branch) {\n\n return;\n\n }\n\n untracked(() => {\n\n void this.loadBranchData(link, projectId, branch);\n\n });\n\n });\n\n }\n\n\n\n //#endregion\n\n\n\n //#region ----- Event Handlers -----\n\n\n\n protected onBranchChange(branch: string | null | undefined): void {\n\n this.selectedBranch.set(trim(branch ?? ''));\n\n }\n\n\n\n protected commitActions(sha: string): AXPActionMenuItem[] {\n\n return this.commitActionsBySha()[sha] ?? [];\n\n }\n\n\n\n protected commitMessage(commit: AXESourceControlCommitDto): string {\n\n const message = trim(commit.message);\n\n if (!message) {\n\n return '—';\n\n }\n\n const firstLine = message.split('\\n')[0]?.trim();\n\n return firstLine || message;\n\n }\n\n\n\n protected formatCommittedAt(value: string): string {\n\n const iso = trim(value);\n\n if (!iso) {\n\n return '—';\n\n }\n\n const format = this.datetimeFormat();\n\n if (!format) {\n\n return iso;\n\n }\n\n return this.formatService.format(new Date(iso), 'datetime', { format });\n\n }\n\n\n\n protected actionTextKey(action: AXPActionMenuItem): string {\n\n const title = action.title;\n\n return typeof title === 'string' ? title : '';\n\n }\n\n\n\n protected async onActionClick(action: AXPActionMenuItem): Promise<void> {\n\n const command = action.command;\n\n if (!command?.name) {\n\n return;\n\n }\n\n await this.commandExecutor.execute(command.name, command.options ?? {});\n\n }\n\n\n\n protected onViewCommit(commit: AXESourceControlCommitDto): void {\n\n const url = trim(commit.webUrl);\n\n if (url) {\n\n window.open(url, '_blank', 'noopener,noreferrer');\n\n }\n\n }\n\n\n\n //#endregion\n\n\n\n //#region ----- Data Loading -----\n\n\n\n private async initialize(\n\n link: AXESourceControlProjectSourceControlLinkEntityModel,\n\n projectId: string,\n\n ): Promise<void> {\n\n this.loading.set(true);\n\n try {\n\n await this.loadDatetimeFormat();\n\n const branches = await this.browseClient.listBranches(link);\n\n this.branches.set(branches);\n\n const initialBranch = this.resolveInitialBranch(link, branches);\n\n this.selectedBranch.set(initialBranch);\n\n if (!initialBranch) {\n\n this.commits.set([]);\n\n this.branchActions.set([]);\n\n this.commitActionsBySha.set({});\n\n }\n\n } catch (error: unknown) {\n\n this.handleError(error, 'Failed to load repository branches.');\n\n this.branches.set([]);\n\n this.selectedBranch.set('');\n\n } finally {\n\n this.loading.set(false);\n\n }\n\n }\n\n\n\n private async loadBranchData(\n\n link: AXESourceControlProjectSourceControlLinkEntityModel,\n\n projectId: string,\n\n branch: string,\n\n ): Promise<void> {\n\n this.loading.set(true);\n\n try {\n\n const [commits, branchActions] = await Promise.all([\n\n this.browseClient.listCommits(link, branch),\n\n this.hooksService.resolveBranchActions({\n\n projectId,\n\n link,\n\n branch,\n\n baseBranch: this.baseBranch(),\n\n }),\n\n ]);\n\n this.commits.set(commits);\n\n this.branchActions.set(branchActions);\n\n const commitActionsEntries = await Promise.all(\n\n commits.map(async (commit) => {\n\n const actions = await this.hooksService.resolveCommitActions({\n\n projectId,\n\n link,\n\n branch,\n\n commit,\n\n });\n\n return [commit.sha, actions] as const;\n\n }),\n\n );\n\n this.commitActionsBySha.set(Object.fromEntries(commitActionsEntries));\n\n } catch (error: unknown) {\n\n this.handleError(error, 'Failed to load repository commits.');\n\n this.commits.set([]);\n\n this.branchActions.set([]);\n\n this.commitActionsBySha.set({});\n\n } finally {\n\n this.loading.set(false);\n\n }\n\n }\n\n\n\n private resolveInitialBranch(\n\n link: AXESourceControlProjectSourceControlLinkEntityModel,\n\n branches: AXESourceControlBranchDto[],\n\n ): string {\n\n const preferred = trim(link.defaultBranch ?? '');\n\n if (preferred && branches.some((branch) => branch.name === preferred)) {\n\n return preferred;\n\n }\n\n const markedDefault = branches.find((branch) => branch.isDefault)?.name;\n\n if (markedDefault) {\n\n return markedDefault;\n\n }\n\n return defaultTo(branches[0]?.name, '');\n\n }\n\n\n\n private async loadDatetimeFormat(): Promise<void> {\n\n const dateFormat = await this.settingsService.get(AXPRegionalSetting.ShortDate);\n\n const timeFormat = await this.settingsService.get(AXPRegionalSetting.ShortTime);\n\n this.datetimeFormat.set(`${dateFormat} ${timeFormat}`.trim());\n\n }\n\n\n\n private handleError(error: unknown, fallback: string): void {\n\n const message = error instanceof Error ? error.message : fallback;\n\n console.error(message, error);\n\n }\n\n\n\n //#endregion\n\n}\n\n\n\n//#endregion\n\n","<section class=\"flex flex-col gap-4 rounded-lg border border-surface bg-lighter-surface p-4\">\n\n <div class=\"flex flex-wrap items-start justify-between gap-3\">\n\n <div>\n\n <div class=\"font-medium\">{{ (i18n + '.title' | translate | async) ?? '' }}</div>\n\n <div class=\"text-sm opacity-70\">{{ (i18n + '.description' | translate | async) ?? '' }}</div>\n\n </div>\n\n <!-- ----- Branch filter ----- -->\n\n @if (branchOptions().length) {\n\n <ax-select-box\n\n class=\"min-w-[12rem]\"\n\n [dataSource]=\"branchOptions()\"\n\n [ngModel]=\"selectedBranch()\"\n\n (ngModelChange)=\"onBranchChange($event)\"\n\n valueField=\"name\"\n\n textField=\"title\"\n\n [placeholder]=\"(i18n + '.branch.placeholder' | translate | async) ?? ''\"\n\n ></ax-select-box>\n\n }\n\n </div>\n\n\n\n <!-- ----- Branch-level hook actions ----- -->\n\n @if (branchActions().length) {\n\n <div class=\"flex flex-wrap gap-2\">\n\n @for (action of branchActions(); track action.name ?? action.title) {\n\n <ax-button\n\n look=\"outline\"\n\n color=\"primary\"\n\n size=\"sm\"\n\n [text]=\"(actionTextKey(action) | translate | async) ?? ''\"\n\n (onClick)=\"onActionClick(action)\"\n\n >\n\n @if (action.icon) {\n\n <ax-prefix>\n\n <ax-icon [icon]=\"action.icon\"></ax-icon>\n\n </ax-prefix>\n\n }\n\n </ax-button>\n\n }\n\n </div>\n\n }\n\n\n\n <!-- ----- Commits loading indicator ----- -->\n\n @if (loading()) {\n\n <ax-loading></ax-loading>\n\n }\n\n <!-- ----- Empty commits state ----- -->\n\n @else if (!commits().length) {\n\n <axp-state-message\n\n icon=\"fa-light fa-code-commit\"\n\n [title]=\"i18n + '.empty.title'\"\n\n [description]=\"i18n + '.empty.description'\"\n\n look=\"minimal\"\n\n ></axp-state-message>\n\n }\n\n <!-- ----- Commits list ----- -->\n\n @else {\n\n <div class=\"flex flex-col gap-2\">\n\n @for (commit of commits(); track commit.sha) {\n\n <article class=\"flex flex-wrap items-start justify-between gap-3 rounded-lg border border-surface bg-surface p-3\">\n\n <div class=\"min-w-0 flex-1\">\n\n <div class=\"flex flex-wrap items-center gap-2\">\n\n <ax-badge\n\n size=\"sm\"\n\n look=\"twotone\"\n\n color=\"primary\"\n\n [text]=\"commit.shortSha ?? commit.sha.slice(0, 7)\"\n\n ></ax-badge>\n\n <span class=\"font-medium\">{{ commitMessage(commit) }}</span>\n\n </div>\n\n <div class=\"mt-1 flex flex-wrap gap-x-4 gap-y-1 text-sm opacity-70\">\n\n <span>{{ commit.authorName }}</span>\n\n <span>{{ formatCommittedAt(commit.committedAt) }}</span>\n\n </div>\n\n </div>\n\n <div class=\"flex shrink-0 flex-wrap items-center gap-2\">\n\n <ax-button\n\n look=\"blank\"\n\n size=\"sm\"\n\n [text]=\"(i18n + '.actions.view' | translate | async) ?? ''\"\n\n (onClick)=\"onViewCommit(commit)\"\n\n >\n\n <ax-prefix>\n\n <ax-icon icon=\"fa-light fa-arrow-up-right-from-square\"></ax-icon>\n\n </ax-prefix>\n\n </ax-button>\n\n <!-- ----- Commit-level hook actions ----- -->\n\n @for (action of commitActions(commit.sha); track action.name ?? action.title) {\n\n <ax-button\n\n look=\"outline\"\n\n size=\"sm\"\n\n color=\"primary\"\n\n [text]=\"(actionTextKey(action) | translate | async) ?? ''\"\n\n (onClick)=\"onActionClick(action)\"\n\n >\n\n @if (action.icon) {\n\n <ax-prefix>\n\n <ax-icon [icon]=\"action.icon\"></ax-icon>\n\n </ax-prefix>\n\n }\n\n </ax-button>\n\n }\n\n </div>\n\n </article>\n\n }\n\n </div>\n\n }\n\n</section>\n\n","//#region ----- Imports -----\n\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n OnDestroy,\n signal,\n untracked,\n} from '@angular/core';\nimport { AXBadgeModule } from '@acorex/components/badge';\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXDialogService } from '@acorex/components/dialog';\nimport { AXLoadingModule } from '@acorex/components/loading';\nimport { AXSearchBoxModule } from '@acorex/components/search-box';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { AXPPageLayoutBase, AXPPageLayoutBaseComponent } from '@acorex-platform/framework-client/layout/views';\nimport {\n AXE_SC_PROVIDER_GITHUB,\n AXE_SC_PROVIDER_GITLAB,\n type AXESourceControlProjectSourceControlLinkEntityModel,\n type AXESourceControlRemoteRepoDto,\n} from '@acorex-platform/extension-source-control-core-client/contracts';\nimport type { AXMIntegrationManagementIntegrationConnectionEntityModel } from '@acorex-platform/module-integration-management-client/contracts';\nimport { defaultTo, trim } from 'lodash-es';\nimport { AXESourceControlProjectLinkService } from '../source-control-project-link.service';\nimport { AXERepositoryCommitsPanelComponent } from '../repository-commits-panel/repository-commits-panel.component';\n\n//#endregion\n\n//#region ----- Types -----\n\ntype SourceControlPageStep = 'provider' | 'repositories';\n\ninterface ProviderPresentation {\n providerId: string;\n icon: string;\n titleKey: string;\n}\n\n//#endregion\n\n//#region ----- Constants -----\n\nconst I18N = '@extensions-source-control:pages.repository';\n\nconst PROVIDER_PRESENTATION: Record<string, ProviderPresentation> = {\n [AXE_SC_PROVIDER_GITHUB]: {\n providerId: AXE_SC_PROVIDER_GITHUB,\n icon: 'fa-brands fa-github',\n titleKey: '@extensions-github:integration.display-name',\n },\n [AXE_SC_PROVIDER_GITLAB]: {\n providerId: AXE_SC_PROVIDER_GITLAB,\n icon: 'fa-brands fa-gitlab',\n titleKey: '@extensions-gitlab:integration.display-name',\n },\n};\n\n//#endregion\n\n//#region ----- Component -----\n\n@Component({\n selector: 'axe-source-control-page',\n templateUrl: './source-control-page.component.html',\n imports: [\n CommonModule,\n AXBadgeModule,\n AXButtonModule,\n AXDecoratorModule,\n AXLoadingModule,\n AXSearchBoxModule,\n AXTranslationModule,\n AXERepositoryCommitsPanelComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: AXPPageLayoutBase,\n useExisting: AXESourceControlPageComponent,\n },\n ],\n})\nexport class AXESourceControlPageComponent extends AXPPageLayoutBaseComponent implements OnDestroy {\n //#region ----- Inputs -----\n\n rootContext = input<Record<string, unknown>>({});\n pageConfig = input<Record<string, unknown>>();\n\n //#endregion\n\n //#region ----- Services & Dependencies -----\n\n protected readonly i18n = I18N;\n private readonly linkService = inject(AXESourceControlProjectLinkService);\n private readonly dialogService = inject(AXDialogService);\n private readonly translationService = inject(AXTranslationService);\n\n //#endregion\n\n //#region ----- State Signals -----\n\n protected readonly loading = signal(true);\n protected readonly linking = signal(false);\n protected readonly reposLoading = signal(false);\n protected readonly step = signal<SourceControlPageStep>('provider');\n protected readonly connections = signal<AXMIntegrationManagementIntegrationConnectionEntityModel[]>([]);\n protected readonly selectedConnection = signal<AXMIntegrationManagementIntegrationConnectionEntityModel | null>(null);\n protected readonly repositories = signal<AXESourceControlRemoteRepoDto[]>([]);\n protected readonly searchQuery = signal('');\n protected readonly existingLink = signal<AXESourceControlProjectSourceControlLinkEntityModel | null>(null);\n protected readonly selectingNewLink = signal(false);\n\n //#endregion\n\n //#region ----- Computed Properties -----\n\n protected readonly projectId = computed(() => {\n const id = this.rootContext()?.['id'];\n return typeof id === 'string' ? trim(id) : '';\n });\n\n protected readonly hasConnections = computed(() => this.connections().length > 0);\n\n protected readonly showLinkedSummary = computed(() => Boolean(this.existingLink()) && !this.selectingNewLink());\n\n protected readonly linkedRepository = computed(() => (this.showLinkedSummary() ? this.existingLink() : null));\n\n //#endregion\n\n //#region ----- Lifecycle -----\n\n private searchDebounce?: ReturnType<typeof setTimeout>;\n\n constructor() {\n super();\n effect(() => {\n const projectId = this.projectId();\n if (!projectId) {\n return;\n }\n untracked(() => {\n void this.initialize(projectId);\n });\n });\n }\n\n ngOnDestroy(): void {\n clearTimeout(this.searchDebounce);\n }\n\n //#endregion\n\n //#region ----- Event Handlers -----\n\n protected providerTitle(connection: AXMIntegrationManagementIntegrationConnectionEntityModel): string {\n const presentation = PROVIDER_PRESENTATION[connection.providerId];\n if (presentation?.titleKey) {\n return presentation.titleKey;\n }\n return defaultTo(connection.displayName, connection.providerId);\n }\n\n protected providerIcon(connection: AXMIntegrationManagementIntegrationConnectionEntityModel): string {\n return PROVIDER_PRESENTATION[connection.providerId]?.icon ?? 'fa-light fa-code-branch';\n }\n\n protected async onSelectConnection(connection: AXMIntegrationManagementIntegrationConnectionEntityModel): Promise<void> {\n this.selectedConnection.set(connection);\n this.step.set('repositories');\n this.searchQuery.set('');\n await this.loadRepositories();\n }\n\n protected onBackToProviders(): void {\n if (this.existingLink()) {\n this.onCancelChange();\n return;\n }\n this.step.set('provider');\n this.selectedConnection.set(null);\n this.repositories.set([]);\n this.searchQuery.set('');\n }\n\n protected onSearchChange(value: string | null | undefined): void {\n this.searchQuery.set(value ?? '');\n clearTimeout(this.searchDebounce);\n this.searchDebounce = setTimeout(() => {\n void this.loadRepositories();\n }, 350);\n }\n\n protected async onSelectRepository(repo: AXESourceControlRemoteRepoDto): Promise<void> {\n const connection = this.selectedConnection();\n const projectId = this.projectId();\n if (!connection || !projectId) {\n return;\n }\n\n const confirmed = await this.confirmLink(repo);\n if (!confirmed) {\n return;\n }\n\n this.linking.set(true);\n try {\n const link = await this.linkService.saveLink({ projectId, connection, repo });\n this.existingLink.set(link);\n this.selectingNewLink.set(false);\n this.step.set('provider');\n this.selectedConnection.set(null);\n this.repositories.set([]);\n this.searchQuery.set('');\n await this.showLinkedToast(repo.fullName);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to link repository.';\n this.toastService.show({ color: 'danger', content: message });\n } finally {\n this.linking.set(false);\n }\n }\n\n protected async onChangeRepository(): Promise<void> {\n this.selectingNewLink.set(true);\n this.step.set('provider');\n this.selectedConnection.set(null);\n this.repositories.set([]);\n this.searchQuery.set('');\n }\n\n protected onCancelChange(): void {\n this.selectingNewLink.set(false);\n this.step.set('provider');\n this.selectedConnection.set(null);\n this.repositories.set([]);\n this.searchQuery.set('');\n }\n\n protected async onUnlinkRepository(): Promise<void> {\n const link = this.existingLink();\n const projectId = this.projectId();\n if (!link || !projectId) {\n return;\n }\n\n const confirmed = await this.confirmUnlink(link.fullName);\n if (!confirmed) {\n return;\n }\n\n this.linking.set(true);\n try {\n await this.linkService.removeLink(projectId);\n this.existingLink.set(null);\n this.step.set('provider');\n const message = await this.translationService.translateAsync(`${I18N}.messages.unlinked`);\n this.toastService.show({ color: 'success', content: message ?? 'Repository unlinked.' });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to unlink repository.';\n this.toastService.show({ color: 'danger', content: message });\n } finally {\n this.linking.set(false);\n }\n }\n\n //#endregion\n\n //#region ----- Data Loading -----\n\n private async initialize(projectId: string): Promise<void> {\n this.loading.set(true);\n try {\n const [connections, link] = await Promise.all([\n this.linkService.listConnections(),\n this.linkService.findLinkByProjectId(projectId),\n ]);\n this.connections.set(connections);\n this.existingLink.set(link);\n if (!link) {\n this.step.set('provider');\n }\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to load source-control data.';\n this.toastService.show({ color: 'danger', content: message });\n } finally {\n this.loading.set(false);\n }\n }\n\n private async loadRepositories(): Promise<void> {\n const connection = this.selectedConnection();\n if (!connection) {\n this.repositories.set([]);\n return;\n }\n\n this.reposLoading.set(true);\n try {\n const items = await this.linkService.searchRepositories(connection, this.searchQuery());\n this.repositories.set(items);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to search repositories.';\n this.toastService.show({ color: 'danger', content: message });\n this.repositories.set([]);\n } finally {\n this.reposLoading.set(false);\n }\n }\n\n //#endregion\n\n //#region ----- Dialogs -----\n\n private async confirmLink(repo: AXESourceControlRemoteRepoDto): Promise<boolean> {\n const title = await this.translationService.translateAsync(`${I18N}.dialogs.link.title`);\n const message = await this.translationService.translateAsync(`${I18N}.dialogs.link.message`, {\n params: { fullName: repo.fullName },\n });\n return Boolean(await this.dialogService.confirm(title ?? 'Link Repository', message ?? 'Link this repository?'));\n }\n\n private async confirmUnlink(fullName: string): Promise<boolean> {\n const title = await this.translationService.translateAsync(`${I18N}.dialogs.unlink.title`);\n const message = await this.translationService.translateAsync(`${I18N}.dialogs.unlink.message`, {\n params: { fullName },\n });\n return Boolean(await this.dialogService.confirm(title ?? 'Unlink Repository', message ?? 'Unlink this repository?'));\n }\n\n private async showLinkedToast(fullName: string): Promise<void> {\n const message = await this.translationService.translateAsync(`${I18N}.messages.linked`, {\n params: { fullName },\n });\n this.toastService.show({ color: 'success', content: message ?? 'Repository linked.' });\n }\n\n //#endregion\n}\n\n//#endregion\n","<div class=\"flex w-full flex-col gap-4\">\n <!-- ----- Loading indicator while page data is fetched ----- -->\n @if (loading()) {\n <ax-loading></ax-loading>\n }\n <!-- ----- Linked repository summary ----- -->\n @else if (linkedRepository(); as link) {\n <section class=\"flex flex-col gap-4 rounded-lg border border-surface bg-lighter-surface p-4\">\n <div class=\"flex flex-wrap items-start justify-between gap-3\">\n <div class=\"min-w-0\">\n <div class=\"text-sm opacity-70\">\n {{ (i18n + '.linked.summary' | translate | async) ?? '' }}\n </div>\n <div class=\"mt-1 text-lg font-medium\">{{ link.fullName }}</div>\n </div>\n <ax-badge\n size=\"sm\"\n look=\"twotone\"\n color=\"success\"\n [text]=\"(i18n + '.linked.badge' | translate | async) ?? ''\"\n ></ax-badge>\n </div>\n\n <div class=\"grid gap-3 md:grid-cols-2\">\n <div>\n <div class=\"text-sm opacity-70\">{{ (i18n + '.fields.provider' | translate | async) ?? '' }}</div>\n <div class=\"font-medium\">{{ link.providerId }}</div>\n </div>\n <!-- ----- Default branch when configured ----- -->\n @if (link.defaultBranch) {\n <div>\n <div class=\"text-sm opacity-70\">{{ (i18n + '.fields.default-branch' | translate | async) ?? '' }}</div>\n <div class=\"font-medium\">{{ link.defaultBranch }}</div>\n </div>\n }\n <div class=\"md:col-span-2\">\n <div class=\"text-sm opacity-70\">{{ (i18n + '.fields.web-url' | translate | async) ?? '' }}</div>\n <a class=\"font-medium text-primary hover:underline\" [href]=\"link.webUrl\" target=\"_blank\" rel=\"noopener noreferrer\">\n {{ link.webUrl }}\n </a>\n </div>\n </div>\n\n <div class=\"flex flex-wrap gap-2\">\n <ax-button\n look=\"outline\"\n color=\"primary\"\n [disabled]=\"linking()\"\n [text]=\"(i18n + '.actions.change' | translate | async) ?? ''\"\n (onClick)=\"onChangeRepository()\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-arrow-right-arrow-left\"></ax-icon>\n </ax-prefix>\n </ax-button>\n <ax-button\n look=\"outline\"\n color=\"danger\"\n [disabled]=\"linking()\"\n [text]=\"(i18n + '.actions.unlink' | translate | async) ?? ''\"\n (onClick)=\"onUnlinkRepository()\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-link-slash\"></ax-icon>\n </ax-prefix>\n </ax-button>\n </div>\n </section>\n\n <axe-repository-commits-panel [projectId]=\"projectId()\" [link]=\"link\"></axe-repository-commits-panel>\n }\n <!-- ----- No provider connection configured ----- -->\n @else if (!hasConnections()) {\n <section class=\"rounded-lg border border-dashed border-surface bg-lighter-surface p-6 text-center\">\n <ax-icon class=\"mb-3 text-3xl opacity-60\">\n <i class=\"fa-light fa-plug-circle-xmark\"></i>\n </ax-icon>\n <div class=\"font-medium\">{{ (i18n + '.empty.no-connection.title' | translate | async) ?? '' }}</div>\n <div class=\"mt-2 text-sm opacity-70\">{{ (i18n + '.empty.no-connection.description' | translate | async) ?? '' }}</div>\n </section>\n }\n <!-- ----- Provider selection step ----- -->\n @else if (step() === 'provider') {\n <section class=\"flex flex-col gap-3\">\n <div class=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <div class=\"font-medium\">{{ (i18n + '.steps.provider.title' | translate | async) ?? '' }}</div>\n <div class=\"text-sm opacity-70\">{{ (i18n + '.steps.provider.description' | translate | async) ?? '' }}</div>\n </div>\n <!-- ----- Cancel change when a repository is already linked ----- -->\n @if (selectingNewLink()) {\n <ax-button\n look=\"blank\"\n size=\"sm\"\n [disabled]=\"linking()\"\n [text]=\"(i18n + '.actions.back' | translate | async) ?? ''\"\n (onClick)=\"onCancelChange()\"\n ></ax-button>\n }\n </div>\n\n <div class=\"grid gap-3 md:grid-cols-2\">\n @for (connection of connections(); track connection.id) {\n <button\n type=\"button\"\n class=\"flex items-start gap-3 rounded-lg border border-surface bg-lighter-surface p-4 text-start transition hover:border-primary hover:shadow-sm\"\n [disabled]=\"linking()\"\n (click)=\"onSelectConnection(connection)\"\n >\n <ax-icon class=\"mt-0.5 text-2xl\">\n <i [class]=\"providerIcon(connection)\"></i>\n </ax-icon>\n <div class=\"min-w-0 flex-1\">\n <div class=\"font-medium\">\n @if (providerTitle(connection).startsWith('@')) {\n {{ providerTitle(connection) | translate | async }}\n }\n <!-- ----- Fallback when provider title is a plain display name ----- -->\n @else {\n {{ providerTitle(connection) }}\n }\n </div>\n <div class=\"mt-1 truncate text-sm opacity-70\">\n {{ connection.displayName || connection.providerId }}\n </div>\n </div>\n <ax-icon class=\"opacity-50\">\n <i class=\"fa-light fa-chevron-right\"></i>\n </ax-icon>\n </button>\n }\n </div>\n </section>\n }\n <!-- ----- Repository search and selection step ----- -->\n @else {\n <section class=\"flex flex-col gap-4\">\n <div class=\"flex flex-wrap items-center justify-between gap-3\">\n <div class=\"flex min-w-0 items-center gap-3\">\n <ax-button\n look=\"blank\"\n size=\"sm\"\n [disabled]=\"linking()\"\n [text]=\"(i18n + '.actions.back' | translate | async) ?? ''\"\n (onClick)=\"onBackToProviders()\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-arrow-left\"></ax-icon>\n </ax-prefix>\n </ax-button>\n <div class=\"min-w-0\">\n <div class=\"font-medium\">{{ (i18n + '.steps.repositories.title' | translate | async) ?? '' }}</div>\n @if (selectedConnection(); as connection) {\n <div class=\"truncate text-sm opacity-70\">\n @if (providerTitle(connection).startsWith('@')) {\n {{ providerTitle(connection) | translate | async }}\n }\n <!-- ----- Fallback when provider title is a plain display name ----- -->\n @else {\n {{ providerTitle(connection) }}\n }\n · {{ connection.displayName || connection.providerId }}\n </div>\n }\n </div>\n </div>\n </div>\n\n <ax-search-box\n [value]=\"searchQuery()\"\n [disabled]=\"linking()\"\n (valueChange)=\"onSearchChange($event)\"\n [placeholder]=\"(i18n + '.steps.repositories.search-placeholder' | translate | async) ?? ''\"\n ></ax-search-box>\n\n <!-- ----- Repository list loading indicator ----- -->\n @if (reposLoading()) {\n <ax-loading></ax-loading>\n }\n <!-- ----- Empty repository search results ----- -->\n @else if (!repositories().length) {\n <div class=\"rounded-lg border border-dashed border-surface p-6 text-center text-sm opacity-70\">\n {{ (i18n + '.steps.repositories.empty' | translate | async) ?? '' }}\n </div>\n }\n <!-- ----- Repository results ----- -->\n @else {\n <div class=\"flex flex-col gap-2\">\n @for (repo of repositories(); track repo.remoteId) {\n <button\n type=\"button\"\n class=\"flex items-start justify-between gap-3 rounded-lg border border-surface bg-lighter-surface p-4 text-start transition hover:border-primary hover:shadow-sm\"\n [disabled]=\"linking()\"\n (click)=\"onSelectRepository(repo)\"\n >\n <div class=\"min-w-0\">\n <div class=\"font-medium\">{{ repo.fullName }}</div>\n <!-- ----- Repository description when available ----- -->\n @if (repo.description) {\n <div class=\"mt-1 line-clamp-2 text-sm opacity-70\">{{ repo.description }}</div>\n }\n <!-- ----- Default branch metadata ----- -->\n @if (repo.defaultBranch) {\n <div class=\"mt-2 text-xs opacity-60\">\n {{ (i18n + '.fields.default-branch' | translate | async) ?? '' }}: {{ repo.defaultBranch }}\n </div>\n }\n </div>\n <ax-icon class=\"shrink-0 opacity-50\">\n <i class=\"fa-light fa-link\"></i>\n </ax-icon>\n </button>\n }\n </div>\n }\n </section>\n }\n</div>\n"],"names":["I18N","i2","i3","i4","i5","i6"],"mappings":"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"}
|
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
import { AXPSettingsService, AXPIntegrationRuntimeService, AXP_SETTING_DEFINITION_PROVIDER, AXP_INTEGRATION_DOMAIN_PROVIDER } from '@acorex-platform/framework-client/common';
|
|
2
|
+
import { AXP_MODULE_MANIFEST_PROVIDER, AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER } from '@acorex-platform/framework-client/core';
|
|
3
|
+
import { AXPEntityService, AXP_ENTITY_DEFINITION_LOADER, AXP_ENTITY_MODIFIER } from '@acorex-platform/framework-client/layout/entity';
|
|
4
|
+
import { AXP_PAGE_COMPONENT_PROVIDER } from '@acorex-platform/framework-client/layout/components';
|
|
5
|
+
import * as i0 from '@angular/core';
|
|
6
|
+
import { Injectable, inject, NgModule } from '@angular/core';
|
|
7
|
+
import { RootConfig, AXE_SC_DEFAULT_ENABLED_PROJECT_TYPE_ID, AXESourceControlExtensionSettings, AXE_SC_PROVIDER_IDS } from '@acorex-platform/extension-source-control-core-client/contracts';
|
|
8
|
+
import { AXP_INTEGRATION_CAPABILITY, AXP_INTEGRATION_CATEGORY, AXPWidgetsList } from '@acorex-platform/framework-shared/core';
|
|
9
|
+
import { AXPSessionService } from '@acorex-platform/framework-client/auth';
|
|
10
|
+
import { RootConfig as RootConfig$1 } from '@acorex-platform/module-project-management-client/contracts';
|
|
11
|
+
|
|
12
|
+
//#endregion
|
|
13
|
+
//#region ----- Entity Provider -----
|
|
14
|
+
class AXESourceControlEntityProvider {
|
|
15
|
+
preload() {
|
|
16
|
+
const module = RootConfig.module.name;
|
|
17
|
+
return Object.values(RootConfig.entities).map((entity) => ({
|
|
18
|
+
module,
|
|
19
|
+
entity: entity.name,
|
|
20
|
+
}));
|
|
21
|
+
}
|
|
22
|
+
async get(moduleName, entityName) {
|
|
23
|
+
if (moduleName !== RootConfig.module.name) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
if (entityName === RootConfig.entities.projectSourceControlLink.name) {
|
|
27
|
+
return (await import('@acorex-platform/extension-source-control-core-domain')).projectSourceControlLinkFactory();
|
|
28
|
+
}
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
async list() {
|
|
32
|
+
const module = RootConfig.module.name;
|
|
33
|
+
return Object.values(RootConfig.entities).map((entity) => ({
|
|
34
|
+
name: entity.name,
|
|
35
|
+
module,
|
|
36
|
+
}));
|
|
37
|
+
}
|
|
38
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXESourceControlEntityProvider, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
39
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXESourceControlEntityProvider }); }
|
|
40
|
+
}
|
|
41
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXESourceControlEntityProvider, decorators: [{
|
|
42
|
+
type: Injectable
|
|
43
|
+
}] });
|
|
44
|
+
|
|
45
|
+
//#region ----- Imports -----
|
|
46
|
+
//#endregion
|
|
47
|
+
//#region ----- Constants -----
|
|
48
|
+
const I18N$1 = `@${RootConfig.config.i18n}:integration.domain`;
|
|
49
|
+
//#endregion
|
|
50
|
+
//#region ----- Domain Provider -----
|
|
51
|
+
class AXESourceControlIntegrationDomainProvider {
|
|
52
|
+
async provide(context) {
|
|
53
|
+
context.register({
|
|
54
|
+
id: AXP_INTEGRATION_CATEGORY.SourceControl,
|
|
55
|
+
module: RootConfig.module.name,
|
|
56
|
+
displayName: `${I18N$1}.title`,
|
|
57
|
+
description: `${I18N$1}.description`,
|
|
58
|
+
icon: RootConfig.module.icon,
|
|
59
|
+
category: AXP_INTEGRATION_CATEGORY.SourceControl,
|
|
60
|
+
capabilities: [AXP_INTEGRATION_CAPABILITY.Sync, AXP_INTEGRATION_CAPABILITY.Import],
|
|
61
|
+
sortOrder: 30,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXESourceControlIntegrationDomainProvider, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
65
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXESourceControlIntegrationDomainProvider }); }
|
|
66
|
+
}
|
|
67
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXESourceControlIntegrationDomainProvider, decorators: [{
|
|
68
|
+
type: Injectable
|
|
69
|
+
}] });
|
|
70
|
+
|
|
71
|
+
//#region ----- Imports -----
|
|
72
|
+
//#endregion
|
|
73
|
+
//#region ----- Constants -----
|
|
74
|
+
const SC_SETTINGS_GROUP = 'source-control';
|
|
75
|
+
const I18N = `@${RootConfig.config.i18n}:settings.source-control`;
|
|
76
|
+
//#endregion
|
|
77
|
+
//#region ----- Settings Provider -----
|
|
78
|
+
class AXESourceControlSettingsProvider {
|
|
79
|
+
constructor() {
|
|
80
|
+
this.sessionService = inject(AXPSessionService);
|
|
81
|
+
}
|
|
82
|
+
async provide(context) {
|
|
83
|
+
// Only register when the edition entitles Source Control (e.g. not Safetyminder).
|
|
84
|
+
if (!this.sessionService.isModuleEnabled(RootConfig.module.name)) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (context.hasGroup(SC_SETTINGS_GROUP)) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
context
|
|
91
|
+
.addGroup(SC_SETTINGS_GROUP, `${I18N}.group.nav-title`, `${I18N}.group.description`, RootConfig.module.icon, `${I18N}.group.title`, 47)
|
|
92
|
+
.addSection('configuration', `${I18N}.section-title`, `${I18N}.section-description`)
|
|
93
|
+
.addSetting({
|
|
94
|
+
key: AXESourceControlExtensionSettings.EnabledProjectTypeIds,
|
|
95
|
+
title: `${I18N}.enabled-project-types.title`,
|
|
96
|
+
scope: 'T',
|
|
97
|
+
overridableAt: [],
|
|
98
|
+
isInherited: false,
|
|
99
|
+
defaultValue: [AXE_SC_DEFAULT_ENABLED_PROJECT_TYPE_ID],
|
|
100
|
+
widget: {
|
|
101
|
+
type: AXPWidgetsList.Editors.LookupBox,
|
|
102
|
+
options: {
|
|
103
|
+
entity: `${RootConfig$1.module.name}.${RootConfig$1.entities.projectType.name}`,
|
|
104
|
+
look: 'select',
|
|
105
|
+
multiple: true,
|
|
106
|
+
textField: 'title',
|
|
107
|
+
valueField: 'id',
|
|
108
|
+
hasClearButton: true,
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
description: `${I18N}.enabled-project-types.description`,
|
|
112
|
+
})
|
|
113
|
+
.endSection()
|
|
114
|
+
.endGroup();
|
|
115
|
+
}
|
|
116
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXESourceControlSettingsProvider, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
117
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXESourceControlSettingsProvider }); }
|
|
118
|
+
}
|
|
119
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXESourceControlSettingsProvider, decorators: [{
|
|
120
|
+
type: Injectable
|
|
121
|
+
}] });
|
|
122
|
+
|
|
123
|
+
//#region ----- Imports -----
|
|
124
|
+
//#endregion
|
|
125
|
+
//#region ----- Constants -----
|
|
126
|
+
/** Expression scope namespace (no hyphens — safe for `with (scope)` eval). */
|
|
127
|
+
const AXE_SOURCE_CONTROL_EXPRESSION_SCOPE = 'SourceControlExtension';
|
|
128
|
+
//#endregion
|
|
129
|
+
//#region ----- Provider -----
|
|
130
|
+
class AXESourceControlProjectLinkExpressionEvaluatorScopeProvider {
|
|
131
|
+
constructor() {
|
|
132
|
+
this.entityService = inject(AXPEntityService);
|
|
133
|
+
this.settingsService = inject(AXPSettingsService);
|
|
134
|
+
this.integrationRuntime = inject(AXPIntegrationRuntimeService);
|
|
135
|
+
}
|
|
136
|
+
async provide(context) {
|
|
137
|
+
context.addScope(AXE_SOURCE_CONTROL_EXPRESSION_SCOPE, {
|
|
138
|
+
isEnabledForProject: async (platformProjectIdRaw) => {
|
|
139
|
+
const projectTypeId = await this.resolveProjectTypeId(platformProjectIdRaw);
|
|
140
|
+
if (!projectTypeId) {
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
const enabledIds = await this.resolveEnabledProjectTypeIds();
|
|
144
|
+
return enabledIds.includes(projectTypeId);
|
|
145
|
+
},
|
|
146
|
+
hasRepoLink: async (platformProjectIdRaw) => {
|
|
147
|
+
const platformProjectId = typeof platformProjectIdRaw === 'string' ? platformProjectIdRaw.trim() : '';
|
|
148
|
+
if (!platformProjectId) {
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
const link = await this.findLinkByProjectId(platformProjectId);
|
|
152
|
+
return Boolean(link);
|
|
153
|
+
},
|
|
154
|
+
hasAnyConnection: async () => {
|
|
155
|
+
for (const providerId of AXE_SC_PROVIDER_IDS) {
|
|
156
|
+
try {
|
|
157
|
+
await this.integrationRuntime.getConnection({ providerId, connectionScope: 'tenant' });
|
|
158
|
+
return true;
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
// try next provider
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return false;
|
|
165
|
+
},
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
async resolveProjectTypeId(platformProjectIdRaw) {
|
|
169
|
+
const platformProjectId = typeof platformProjectIdRaw === 'string' ? platformProjectIdRaw.trim() : '';
|
|
170
|
+
if (!platformProjectId) {
|
|
171
|
+
return '';
|
|
172
|
+
}
|
|
173
|
+
const project = (await this.entityService
|
|
174
|
+
.withEntity(RootConfig$1.module.name, RootConfig$1.entities.project.name)
|
|
175
|
+
.data()
|
|
176
|
+
.byKey(platformProjectId));
|
|
177
|
+
return String(project?.projectTypeId ?? '').trim();
|
|
178
|
+
}
|
|
179
|
+
async resolveEnabledProjectTypeIds() {
|
|
180
|
+
const raw = await this.settingsService.get(AXESourceControlExtensionSettings.EnabledProjectTypeIds);
|
|
181
|
+
if (!Array.isArray(raw)) {
|
|
182
|
+
return [];
|
|
183
|
+
}
|
|
184
|
+
return raw.map((item) => String(item).trim()).filter(Boolean);
|
|
185
|
+
}
|
|
186
|
+
async findLinkByProjectId(projectId) {
|
|
187
|
+
const result = await this.entityService
|
|
188
|
+
.withEntity(RootConfig.module.name, RootConfig.entities.projectSourceControlLink.name)
|
|
189
|
+
.data()
|
|
190
|
+
.query({
|
|
191
|
+
skip: 0,
|
|
192
|
+
take: 1,
|
|
193
|
+
filter: {
|
|
194
|
+
field: 'projectId',
|
|
195
|
+
operator: { type: 'equal' },
|
|
196
|
+
value: projectId,
|
|
197
|
+
},
|
|
198
|
+
});
|
|
199
|
+
return result.items?.[0] ?? null;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
//#endregion
|
|
203
|
+
|
|
204
|
+
//#region ----- Constants -----
|
|
205
|
+
/** Component key for the project source-control repository page tab. */
|
|
206
|
+
const SOURCE_CONTROL_PAGE_COMPONENT_KEY = 'entity-source-control-page';
|
|
207
|
+
//#endregion
|
|
208
|
+
|
|
209
|
+
//#region ----- Imports -----
|
|
210
|
+
//#endregion
|
|
211
|
+
//#region ----- Constants -----
|
|
212
|
+
const SOURCE_CONTROL_PAGE_ORDER = 145_000;
|
|
213
|
+
//#endregion
|
|
214
|
+
//#region ----- Modifier -----
|
|
215
|
+
/** Adds a source-control repository tab to ProjectManagement.Project detail views. */
|
|
216
|
+
const AXESourceControlProjectEntityModifier = {
|
|
217
|
+
entityName: RootConfig$1.entities.project.name,
|
|
218
|
+
order: 55,
|
|
219
|
+
modifier: (ctx) => {
|
|
220
|
+
if (ctx.module.get() !== RootConfig$1.module.name) {
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
ctx.entity.pages ??= [];
|
|
224
|
+
const pageExists = ctx.entity.pages.some((page) => page.componentKey === SOURCE_CONTROL_PAGE_COMPONENT_KEY);
|
|
225
|
+
if (pageExists) {
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
ctx.entity.pages.push({
|
|
229
|
+
componentKey: SOURCE_CONTROL_PAGE_COMPONENT_KEY,
|
|
230
|
+
title: '@extensions-source-control:pages.repository.title',
|
|
231
|
+
icon: 'fa-light fa-code-branch',
|
|
232
|
+
layout: { order: SOURCE_CONTROL_PAGE_ORDER },
|
|
233
|
+
hidden: `{{ !(await ${AXE_SOURCE_CONTROL_EXPRESSION_SCOPE}.isEnabledForProject(context.eval("id"))) }}`,
|
|
234
|
+
});
|
|
235
|
+
},
|
|
236
|
+
};
|
|
237
|
+
//#endregion
|
|
238
|
+
|
|
239
|
+
//#endregion
|
|
240
|
+
//#region ----- Provider -----
|
|
241
|
+
class AXESourceControlPageComponentProvider {
|
|
242
|
+
async components() {
|
|
243
|
+
return [
|
|
244
|
+
{
|
|
245
|
+
key: SOURCE_CONTROL_PAGE_COMPONENT_KEY,
|
|
246
|
+
loader: () => import('./acorex-platform-extension-source-control-core-client-source-control-page.component-DOALkPKo.mjs').then((m) => m.AXESourceControlPageComponent),
|
|
247
|
+
},
|
|
248
|
+
];
|
|
249
|
+
}
|
|
250
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXESourceControlPageComponentProvider, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
251
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXESourceControlPageComponentProvider }); }
|
|
252
|
+
}
|
|
253
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXESourceControlPageComponentProvider, decorators: [{
|
|
254
|
+
type: Injectable
|
|
255
|
+
}] });
|
|
256
|
+
|
|
257
|
+
//#region ----- Manifest -----
|
|
258
|
+
const SourceControlExtensionManifest = {
|
|
259
|
+
name: RootConfig.module.name,
|
|
260
|
+
version: '1.0.0',
|
|
261
|
+
title: RootConfig.module.title,
|
|
262
|
+
icon: RootConfig.module.icon,
|
|
263
|
+
i18n: RootConfig.config.i18n,
|
|
264
|
+
type: 'integration',
|
|
265
|
+
domain: 'source-control',
|
|
266
|
+
dependencies: [],
|
|
267
|
+
};
|
|
268
|
+
//#endregion
|
|
269
|
+
|
|
270
|
+
//#region ----- Imports -----
|
|
271
|
+
//#endregion
|
|
272
|
+
//#region ----- Module -----
|
|
273
|
+
class AXESourceControlExtensionModule {
|
|
274
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXESourceControlExtensionModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
275
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.8", ngImport: i0, type: AXESourceControlExtensionModule }); }
|
|
276
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXESourceControlExtensionModule, providers: [
|
|
277
|
+
{ provide: AXP_MODULE_MANIFEST_PROVIDER, useValue: SourceControlExtensionManifest, multi: true },
|
|
278
|
+
{ provide: AXP_SETTING_DEFINITION_PROVIDER, useClass: AXESourceControlSettingsProvider, multi: true },
|
|
279
|
+
{ provide: AXP_INTEGRATION_DOMAIN_PROVIDER, useClass: AXESourceControlIntegrationDomainProvider, multi: true },
|
|
280
|
+
{ provide: AXP_ENTITY_DEFINITION_LOADER, useClass: AXESourceControlEntityProvider, multi: true },
|
|
281
|
+
{ provide: AXP_ENTITY_MODIFIER, useValue: AXESourceControlProjectEntityModifier, multi: true },
|
|
282
|
+
{
|
|
283
|
+
provide: AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER,
|
|
284
|
+
useClass: AXESourceControlProjectLinkExpressionEvaluatorScopeProvider,
|
|
285
|
+
multi: true,
|
|
286
|
+
},
|
|
287
|
+
{
|
|
288
|
+
provide: AXP_PAGE_COMPONENT_PROVIDER,
|
|
289
|
+
useClass: AXESourceControlPageComponentProvider,
|
|
290
|
+
multi: true,
|
|
291
|
+
},
|
|
292
|
+
] }); }
|
|
293
|
+
}
|
|
294
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXESourceControlExtensionModule, decorators: [{
|
|
295
|
+
type: NgModule,
|
|
296
|
+
args: [{
|
|
297
|
+
providers: [
|
|
298
|
+
{ provide: AXP_MODULE_MANIFEST_PROVIDER, useValue: SourceControlExtensionManifest, multi: true },
|
|
299
|
+
{ provide: AXP_SETTING_DEFINITION_PROVIDER, useClass: AXESourceControlSettingsProvider, multi: true },
|
|
300
|
+
{ provide: AXP_INTEGRATION_DOMAIN_PROVIDER, useClass: AXESourceControlIntegrationDomainProvider, multi: true },
|
|
301
|
+
{ provide: AXP_ENTITY_DEFINITION_LOADER, useClass: AXESourceControlEntityProvider, multi: true },
|
|
302
|
+
{ provide: AXP_ENTITY_MODIFIER, useValue: AXESourceControlProjectEntityModifier, multi: true },
|
|
303
|
+
{
|
|
304
|
+
provide: AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER,
|
|
305
|
+
useClass: AXESourceControlProjectLinkExpressionEvaluatorScopeProvider,
|
|
306
|
+
multi: true,
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
provide: AXP_PAGE_COMPONENT_PROVIDER,
|
|
310
|
+
useClass: AXESourceControlPageComponentProvider,
|
|
311
|
+
multi: true,
|
|
312
|
+
},
|
|
313
|
+
],
|
|
314
|
+
}]
|
|
315
|
+
}] });
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* Generated bundle index. Do not edit.
|
|
319
|
+
*/
|
|
320
|
+
|
|
321
|
+
export { AXESourceControlExtensionModule };
|
|
322
|
+
//# sourceMappingURL=acorex-platform-extension-source-control-core-client.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-extension-source-control-core-client.mjs","sources":["../../../../libs/extensions/source-control/core/client/src/lib/entity.provider.ts","../../../../libs/extensions/source-control/core/client/src/lib/integration/source-control.integration-domain.provider.ts","../../../../libs/extensions/source-control/core/client/src/lib/settings.provider.ts","../../../../libs/extensions/source-control/core/client/src/lib/features/project-management/source-control-project-link-expression-evaluator-scope.provider.ts","../../../../libs/extensions/source-control/core/client/src/lib/features/project-management/source-control-page/source-control-page.constants.ts","../../../../libs/extensions/source-control/core/client/src/lib/features/project-management/project-source-control.entity-modifier.ts","../../../../libs/extensions/source-control/core/client/src/lib/features/project-management/source-control-page/source-control-page-component.provider.ts","../../../../libs/extensions/source-control/core/client/src/lib/manifest.ts","../../../../libs/extensions/source-control/core/client/src/lib/source-control-extension.module.ts","../../../../libs/extensions/source-control/core/client/src/acorex-platform-extension-source-control-core-client.ts"],"sourcesContent":["//#region ----- Imports -----\n\nimport { AXPEntity } from '@acorex-platform/framework-shared/entity';\nimport { AXPEntityDefinitionLoader, AXPEntityPreloadEntity } from '@acorex-platform/framework-client/layout/entity';\nimport { Injectable } from '@angular/core';\nimport { RootConfig } from '@acorex-platform/extension-source-control-core-client/contracts';\n\n//#endregion\n\n//#region ----- Entity Provider -----\n\n@Injectable()\nexport class AXESourceControlEntityProvider implements AXPEntityDefinitionLoader {\n preload(): AXPEntityPreloadEntity[] {\n const module = RootConfig.module.name;\n return Object.values(RootConfig.entities).map((entity) => ({\n module,\n entity: entity.name,\n }));\n }\n\n async get(moduleName: string, entityName: string): Promise<AXPEntity | null> {\n if (moduleName !== RootConfig.module.name) {\n return null;\n }\n\n if (entityName === RootConfig.entities.projectSourceControlLink.name) {\n return (await import('@acorex-platform/extension-source-control-core-domain')).projectSourceControlLinkFactory();\n }\n\n return null;\n }\n\n async list(): Promise<{ name: string; module: string }[]> {\n const module = RootConfig.module.name;\n return Object.values(RootConfig.entities).map((entity) => ({\n name: entity.name,\n module,\n }));\n }\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport {\n AXP_INTEGRATION_CAPABILITY,\n AXP_INTEGRATION_CATEGORY,\n} from '@acorex-platform/framework-shared/core';\nimport {\n type AXPIntegrationDomainProvider,\n AXPIntegrationDomainProviderContext,\n} from '@acorex-platform/framework-client/common';\nimport { Injectable } from '@angular/core';\nimport { RootConfig } from '@acorex-platform/extension-source-control-core-client/contracts';\n\n//#endregion\n\n//#region ----- Constants -----\n\nconst I18N = `@${RootConfig.config.i18n}:integration.domain`;\n\n//#endregion\n\n//#region ----- Domain Provider -----\n\n@Injectable()\nexport class AXESourceControlIntegrationDomainProvider implements AXPIntegrationDomainProvider {\n async provide(context: AXPIntegrationDomainProviderContext): Promise<void> {\n context.register({\n id: AXP_INTEGRATION_CATEGORY.SourceControl,\n module: RootConfig.module.name,\n displayName: `${I18N}.title`,\n description: `${I18N}.description`,\n icon: RootConfig.module.icon,\n category: AXP_INTEGRATION_CATEGORY.SourceControl,\n capabilities: [AXP_INTEGRATION_CAPABILITY.Sync, AXP_INTEGRATION_CAPABILITY.Import],\n sortOrder: 30,\n });\n }\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport {\n AXPSettingDefinitionProvider,\n AXPSettingDefinitionProviderContext,\n} from '@acorex-platform/framework-client/common';\nimport { AXPWidgetsList } from '@acorex-platform/framework-shared/core';\nimport { Injectable, inject } from '@angular/core';\nimport {\n AXE_SC_DEFAULT_ENABLED_PROJECT_TYPE_ID,\n AXESourceControlExtensionSettings,\n RootConfig,\n} from '@acorex-platform/extension-source-control-core-client/contracts';\nimport { RootConfig as PmRootConfig } from '@acorex-platform/module-project-management-client/contracts';\n\n//#endregion\n\n//#region ----- Constants -----\n\nconst SC_SETTINGS_GROUP = 'source-control';\nconst I18N = `@${RootConfig.config.i18n}:settings.source-control`;\n\n//#endregion\n\n//#region ----- Settings Provider -----\n\n@Injectable()\nexport class AXESourceControlSettingsProvider implements AXPSettingDefinitionProvider {\n private readonly sessionService = inject(AXPSessionService);\n\n async provide(context: AXPSettingDefinitionProviderContext): Promise<void> {\n // Only register when the edition entitles Source Control (e.g. not Safetyminder).\n if (!this.sessionService.isModuleEnabled(RootConfig.module.name)) {\n return;\n }\n\n if (context.hasGroup(SC_SETTINGS_GROUP)) {\n return;\n }\n\n context\n .addGroup(\n SC_SETTINGS_GROUP,\n `${I18N}.group.nav-title`,\n `${I18N}.group.description`,\n RootConfig.module.icon,\n `${I18N}.group.title`,\n 47,\n )\n .addSection('configuration', `${I18N}.section-title`, `${I18N}.section-description`)\n .addSetting({\n key: AXESourceControlExtensionSettings.EnabledProjectTypeIds,\n title: `${I18N}.enabled-project-types.title`,\n scope: 'T',\n overridableAt: [],\n isInherited: false,\n defaultValue: [AXE_SC_DEFAULT_ENABLED_PROJECT_TYPE_ID],\n widget: {\n type: AXPWidgetsList.Editors.LookupBox,\n options: {\n entity: `${PmRootConfig.module.name}.${PmRootConfig.entities.projectType.name}`,\n look: 'select',\n multiple: true,\n textField: 'title',\n valueField: 'id',\n hasClearButton: true,\n },\n },\n description: `${I18N}.enabled-project-types.description`,\n })\n .endSection()\n .endGroup();\n }\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { AXPExpressionEvaluatorScopeProvider, AXPExpressionEvaluatorScopeProviderContext } from '@acorex-platform/framework-shared/core';\nimport { AXPIntegrationRuntimeService, AXPSettingsService } from '@acorex-platform/framework-client/common';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport { inject } from '@angular/core';\nimport {\n AXE_SC_PROVIDER_IDS,\n AXESourceControlExtensionSettings,\n RootConfig,\n type AXESourceControlProjectSourceControlLinkEntityModel,\n} from '@acorex-platform/extension-source-control-core-client/contracts';\nimport { RootConfig as PmRootConfig } from '@acorex-platform/module-project-management-client/contracts';\nimport type { AXMProjectManagementProjectEntityModel } from '@acorex-platform/module-project-management-client/contracts';\n\n//#endregion\n\n//#region ----- Constants -----\n\n/** Expression scope namespace (no hyphens — safe for `with (scope)` eval). */\nexport const AXE_SOURCE_CONTROL_EXPRESSION_SCOPE = 'SourceControlExtension';\n\n//#endregion\n\n//#region ----- Provider -----\n\nexport class AXESourceControlProjectLinkExpressionEvaluatorScopeProvider implements AXPExpressionEvaluatorScopeProvider {\n private readonly entityService = inject(AXPEntityService);\n private readonly settingsService = inject(AXPSettingsService);\n private readonly integrationRuntime = inject(AXPIntegrationRuntimeService);\n\n async provide(context: AXPExpressionEvaluatorScopeProviderContext): Promise<void> {\n context.addScope(AXE_SOURCE_CONTROL_EXPRESSION_SCOPE, {\n isEnabledForProject: async (platformProjectIdRaw?: unknown): Promise<boolean> => {\n const projectTypeId = await this.resolveProjectTypeId(platformProjectIdRaw);\n if (!projectTypeId) {\n return false;\n }\n\n const enabledIds = await this.resolveEnabledProjectTypeIds();\n return enabledIds.includes(projectTypeId);\n },\n hasRepoLink: async (platformProjectIdRaw?: unknown): Promise<boolean> => {\n const platformProjectId = typeof platformProjectIdRaw === 'string' ? platformProjectIdRaw.trim() : '';\n if (!platformProjectId) {\n return false;\n }\n\n const link = await this.findLinkByProjectId(platformProjectId);\n return Boolean(link);\n },\n hasAnyConnection: async (): Promise<boolean> => {\n for (const providerId of AXE_SC_PROVIDER_IDS) {\n try {\n await this.integrationRuntime.getConnection({ providerId, connectionScope: 'tenant' });\n return true;\n } catch {\n // try next provider\n }\n }\n return false;\n },\n });\n }\n\n private async resolveProjectTypeId(platformProjectIdRaw?: unknown): Promise<string> {\n const platformProjectId = typeof platformProjectIdRaw === 'string' ? platformProjectIdRaw.trim() : '';\n if (!platformProjectId) {\n return '';\n }\n\n const project = (await this.entityService\n .withEntity(PmRootConfig.module.name, PmRootConfig.entities.project.name)\n .data<string, AXMProjectManagementProjectEntityModel>()\n .byKey(platformProjectId)) as AXMProjectManagementProjectEntityModel | null;\n\n return String(project?.projectTypeId ?? '').trim();\n }\n\n private async resolveEnabledProjectTypeIds(): Promise<string[]> {\n const raw = await this.settingsService.get(AXESourceControlExtensionSettings.EnabledProjectTypeIds);\n if (!Array.isArray(raw)) {\n return [];\n }\n return raw.map((item) => String(item).trim()).filter(Boolean);\n }\n\n private async findLinkByProjectId(\n projectId: string,\n ): Promise<AXESourceControlProjectSourceControlLinkEntityModel | null> {\n const result = await this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.projectSourceControlLink.name)\n .data<string, AXESourceControlProjectSourceControlLinkEntityModel>()\n .query({\n skip: 0,\n take: 1,\n filter: {\n field: 'projectId',\n operator: { type: 'equal' },\n value: projectId,\n },\n });\n\n return result.items?.[0] ?? null;\n }\n}\n\n//#endregion\n","//#region ----- Constants -----\n\n/** Component key for the project source-control repository page tab. */\nexport const SOURCE_CONTROL_PAGE_COMPONENT_KEY = 'entity-source-control-page';\n\n//#endregion\n","//#region ----- Imports -----\r\r\n\r\r\nimport { AXPEntityModifierProvider } from '@acorex-platform/framework-client/layout/entity';\r\r\nimport { RootConfig as PmRootConfig } from '@acorex-platform/module-project-management-client/contracts';\r\r\nimport { AXE_SOURCE_CONTROL_EXPRESSION_SCOPE } from './source-control-project-link-expression-evaluator-scope.provider';\r\r\nimport { SOURCE_CONTROL_PAGE_COMPONENT_KEY } from './source-control-page/source-control-page.constants';\r\r\n\r\r\n//#endregion\r\r\n\r\r\n//#region ----- Constants -----\r\r\n\r\r\nconst SOURCE_CONTROL_PAGE_ORDER = 145_000;\r\r\n\r\r\n//#endregion\r\r\n\r\r\n//#region ----- Modifier -----\r\r\n\r\r\n/** Adds a source-control repository tab to ProjectManagement.Project detail views. */\r\r\nexport const AXESourceControlProjectEntityModifier: AXPEntityModifierProvider = {\r\r\n entityName: PmRootConfig.entities.project.name,\r\r\n order: 55,\r\r\n modifier: (ctx) => {\r\r\n if (ctx.module.get() !== PmRootConfig.module.name) {\r\r\n return;\r\r\n }\r\r\n\r\r\n ctx.entity.pages ??= [];\r\r\n const pageExists = ctx.entity.pages.some((page) => page.componentKey === SOURCE_CONTROL_PAGE_COMPONENT_KEY);\r\r\n if (pageExists) {\r\r\n return;\r\r\n }\r\r\n\r\r\n ctx.entity.pages.push({\r\r\n componentKey: SOURCE_CONTROL_PAGE_COMPONENT_KEY,\r\r\n title: '@extensions-source-control:pages.repository.title',\r\r\n icon: 'fa-light fa-code-branch',\r\r\n layout: { order: SOURCE_CONTROL_PAGE_ORDER },\r\r\n hidden: `{{ !(await ${AXE_SOURCE_CONTROL_EXPRESSION_SCOPE}.isEnabledForProject(context.eval(\"id\"))) }}`,\r\r\n });\r\r\n },\r\r\n};\r\r\n\r\r\n//#endregion\r\r\n","//#region ----- Imports -----\n\nimport {\n AXPPageComponentDefinition,\n AXPPageComponentProvider,\n} from '@acorex-platform/framework-client/layout/components';\nimport { Injectable } from '@angular/core';\nimport { SOURCE_CONTROL_PAGE_COMPONENT_KEY } from './source-control-page.constants';\n\n//#endregion\n\n//#region ----- Provider -----\n\n@Injectable()\nexport class AXESourceControlPageComponentProvider implements AXPPageComponentProvider {\n async components(): Promise<AXPPageComponentDefinition[]> {\n return [\n {\n key: SOURCE_CONTROL_PAGE_COMPONENT_KEY,\n loader: () =>\n import('./source-control-page.component').then((m) => m.AXESourceControlPageComponent),\n },\n ];\n }\n}\n\n//#endregion\n","//#region ----- Manifest -----\n\nimport { AXPModuleManifest } from '@acorex-platform/framework-client/core';\nimport { RootConfig } from '@acorex-platform/extension-source-control-core-client/contracts';\n\nexport const SourceControlExtensionManifest: AXPModuleManifest = {\n name: RootConfig.module.name,\n version: '1.0.0',\n title: RootConfig.module.title,\n icon: RootConfig.module.icon,\n i18n: RootConfig.config.i18n,\n type: 'integration',\n domain: 'source-control',\n dependencies: [],\n};\n\n//#endregion\n","//#region ----- Imports -----\r\r\n\r\r\nimport {\r\r\n AXP_INTEGRATION_DOMAIN_PROVIDER,\r\r\n AXP_SETTING_DEFINITION_PROVIDER,\r\r\n} from '@acorex-platform/framework-client/common';\r\r\nimport { AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER, AXP_MODULE_MANIFEST_PROVIDER } from '@acorex-platform/framework-client/core';\r\r\nimport { AXP_ENTITY_DEFINITION_LOADER, AXP_ENTITY_MODIFIER } from '@acorex-platform/framework-client/layout/entity';\r\r\nimport { AXP_PAGE_COMPONENT_PROVIDER } from '@acorex-platform/framework-client/layout/components';\r\r\nimport { RootConfig } from '@acorex-platform/extension-source-control-core-client/contracts';\r\r\nimport { NgModule } from '@angular/core';\r\r\nimport { AXESourceControlEntityProvider } from './entity.provider';\r\r\nimport { AXESourceControlIntegrationDomainProvider } from './integration/source-control.integration-domain.provider';\r\r\nimport { AXESourceControlSettingsProvider } from './settings.provider';\r\r\nimport { AXESourceControlProjectLinkExpressionEvaluatorScopeProvider } from './features/project-management/source-control-project-link-expression-evaluator-scope.provider';\r\r\nimport { AXESourceControlProjectEntityModifier } from './features/project-management/project-source-control.entity-modifier';\r\r\nimport { AXESourceControlPageComponentProvider } from './features/project-management/source-control-page/source-control-page-component.provider';\r\r\nimport { SourceControlExtensionManifest } from './manifest';\r\r\n\r\r\n//#endregion\r\r\n\r\r\n//#region ----- Module -----\r\r\n\r\r\n@NgModule({\r\r\n providers: [\r\r\n { provide: AXP_MODULE_MANIFEST_PROVIDER, useValue: SourceControlExtensionManifest, multi: true },\r\r\n { provide: AXP_SETTING_DEFINITION_PROVIDER, useClass: AXESourceControlSettingsProvider, multi: true },\r\r\n { provide: AXP_INTEGRATION_DOMAIN_PROVIDER, useClass: AXESourceControlIntegrationDomainProvider, multi: true },\r\r\n { provide: AXP_ENTITY_DEFINITION_LOADER, useClass: AXESourceControlEntityProvider, multi: true },\r\r\n { provide: AXP_ENTITY_MODIFIER, useValue: AXESourceControlProjectEntityModifier, multi: true },\r\r\n {\r\r\n provide: AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER,\r\r\n useClass: AXESourceControlProjectLinkExpressionEvaluatorScopeProvider,\r\r\n multi: true,\r\r\n },\r\r\n {\r\r\n provide: AXP_PAGE_COMPONENT_PROVIDER,\r\r\n useClass: AXESourceControlPageComponentProvider,\r\r\n multi: true,\r\r\n },\r\r\n ],\r\r\n})\r\r\nexport class AXESourceControlExtensionModule {}\r\r\n\r\r\n//#endregion\r\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["I18N","PmRootConfig"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@acorex-platform/extension-source-control-core-client",
|
|
3
|
+
"version": "0.0.21",
|
|
4
|
+
"sideEffects": false,
|
|
5
|
+
"peerDependencies": {
|
|
6
|
+
"@angular/common": "^21.0.0",
|
|
7
|
+
"@angular/core": "^21.0.0"
|
|
8
|
+
},
|
|
9
|
+
"dependencies": {
|
|
10
|
+
"tslib": "^2.3.0"
|
|
11
|
+
},
|
|
12
|
+
"module": "fesm2022/acorex-platform-extension-source-control-core-client.mjs",
|
|
13
|
+
"typings": "types/acorex-platform-extension-source-control-core-client.d.ts",
|
|
14
|
+
"exports": {
|
|
15
|
+
"./package.json": {
|
|
16
|
+
"default": "./package.json"
|
|
17
|
+
},
|
|
18
|
+
".": {
|
|
19
|
+
"types": "./types/acorex-platform-extension-source-control-core-client.d.ts",
|
|
20
|
+
"default": "./fesm2022/acorex-platform-extension-source-control-core-client.mjs"
|
|
21
|
+
},
|
|
22
|
+
"./contracts": {
|
|
23
|
+
"types": "./types/acorex-platform-extension-source-control-core-client-contracts.d.ts",
|
|
24
|
+
"default": "./fesm2022/acorex-platform-extension-source-control-core-client-contracts.mjs"
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"type": "module"
|
|
28
|
+
}
|