{{ 'PAC.KEY_WORDS.Plugins' | translate: { Default: 'Plugins' } }}
{{ 'PAC.Plugin.Installed' | translate: { Default: 'Installed' } }}
{{ plugins().length }}
{{ 'PAC.Plugin.ExploreMarketplace' | translate: { Default: 'Explore Marketplace' } }}
@if (category() === 'marketplace') { @if (isSuperAdmin()) {
}
}
@if (category() === 'marketplace') { } @else {
@if (pluginsLoading()) {
{{ 'PAC.Plugin.LoadingPlugins' | translate: { Default: 'Loading plugins...' } }}
{{ 'PAC.Plugin.LoadingPluginsHelp' | translate: { Default: 'Installed plugins and health information are being loaded.' } }}
} @else if (pluginsError()) {
{{ 'PAC.Plugin.LoadPluginsFailed' | translate: { Default: 'Failed to load plugins' } }}
{{ pluginsError() }}
} @else if (!filteredPlugins().length) {
{{ 'PAC.Plugin.NoPluginsFound' | translate: { Default: 'No plugins found' } }}
{{ 'PAC.Plugin.NoPluginsFoundHelp' | translate: { Default: 'Try adjusting the search, category, or keyword filters.' } }}
} @else {
@for (group of pluginCategoryGroups(); track group.value) {
{{ group.labelKey | translate: { Default: group.defaultLabel } }}
{{ group.descriptionKey | translate: { Default: group.defaultDescription } }}
{{ group.plugins.length }}
@if ( group.value === 'developer-tools' && showDeveloperToolSubcategoryFilter() && developerToolSubcategoryOptions().length ) {
{{ 'PAC.Plugin.DeveloperToolsSubcategories' | translate: { Default: 'Developer Tools Categories' } }}
}
@for (plugin of group.plugins; track plugin.__trackId) {
@if (plugin.loadStatus === 'failed') {
{{ 'PAC.Plugin.LoadFailed' | translate: { Default: 'Load failed' } }}
} @else {
{{ 'PAC.Plugin.Category_' + plugin.meta.category | translate: { Default: plugin.meta.category } }}
}
@if (plugin.meta.deprecated) { } @if (plugin.loadStatus === 'failed') { } @else if (plugin.sdkCompatibilityWarnings?.length) { } @else { }
{{ plugin.currentVersion || plugin.meta.version || '-' }}
{{ (plugin.isGlobal ? 'PAC.Plugin.ScopeGlobal' : 'PAC.Plugin.ScopeOrganization') | translate: { Default: plugin.isGlobal ? 'Global' : 'Organization' } }}
{{ plugin.meta.description }}
@if (plugin.loadStatus === 'failed') {
{{ 'PAC.Plugin.LoadFailureReason' | translate : { Default: 'This plugin is in the database but was not loaded.' } }}
{{ plugin.loadError || ('PAC.Plugin.LoadFailureReasonUnknown' | translate: { Default: 'No detailed error was captured.' }) }}
} @if (plugin.loadStatus !== 'failed' && plugin.sdkCompatibilityWarnings?.length) {
{{ 'PAC.Plugin.SdkCompatibilityWarning' | translate: { Default: 'SDK compatibility warning' } }}
} @if (plugin.configurationStatus === 'invalid') {
{{ 'PAC.Plugin.RequiresConfiguration' | translate : { Default: 'This plugin needs configuration before it can be used.' } }}
}
@for (item of componentSummaryItems(plugin); track item.key) {
{{ item.label | translate: { Default: item.defaultLabel } }} {{ item.count }}
} @if (plugin.scopeRelation === 'overrides-global') {
{{ 'PAC.Plugin.OverridesGlobal' | translate: { Default: 'Overrides global' } }}
} @else if (plugin.scopeRelation === 'shadowed-by-organization') {
{{ 'PAC.Plugin.ShadowedByOrganization' | translate: { Default: 'Shadowed by organization' } }}
}
@if (hasInstallablePluginContent(plugin)) { } @if (plugin.canConfigure && plugin.configSchema) { } @if (plugin.canUpdate && plugin.hasUpdate) { } @if (isDevEnvironment && plugin.canRefresh) { } @if (plugin.canUninstall) { }
{{ plugin.meta.author }} / {{ plugin.meta.name }}
@if (plugin.loadStatus !== 'failed') { @for (keyword of plugin.meta.keywords; track keyword) {
# {{ keyword }}
} }
@if (removing() === plugin.name || updating() === plugin.name || refreshing() === plugin.name) { }
}
}
}
}
{{ 'PAC.Plugin.InstallSource' | translate: { Default: 'Install Source' } }}
{{ 'PAC.Plugin.NpmSource' | translate: { Default: 'NPM' } }}
{{ 'PAC.Plugin.ArchiveSource' | translate: { Default: 'Archive file' } }}
@if (isDevEnvironment) {
{{ 'PAC.Plugin.LocalSource' | translate: { Default: 'Local workspace' } }}
}
{{ 'PAC.Plugin.InstallFromNpm' | translate: { Default: 'Install from NPM' } }}
@if (npmInstallError()) {
{{ npmInstallError() }}
} @if (npmInstalling()) { }
{{ 'PAC.Plugin.InstallFromArchive' | translate: { Default: 'Install from Archive' } }}
{{ 'PAC.Plugin.ArchiveInstallHint' | translate : { Default: 'Upload a plugin package archive (.zip, .tgz, .tar.gz, or .tar). The archive must contain one package.json and a built dist/ or src/index.ts entry.' } }}
@if (archiveFile()) { {{ archiveFile()?.name }} } @else { {{ 'PAC.Plugin.NoArchiveFileSelected' | translate: { Default: 'No file selected' } }} }
@if (archiveFile()) { }
@if (archiveInstallError()) {
{{ archiveInstallError() }}
} @if (archiveInstalling()) { }
{{ 'PAC.Plugin.InstallFromLocal' | translate: { Default: 'Install from Local Workspace' } }}
{{ 'PAC.Plugin.LocalInstallHint' | translate : { Default: 'Development only. workspacePath must be an absolute path on the API host and inside PLUGIN_WORKSPACE_ROOTS. Xpert copies the workspace into the host plugin directory for loading.' } }}
{{ 'PAC.Plugin.LocalWorkspacePathHint' | translate : { Default: 'Add the plugin workspace path to the PLUGIN_WORKSPACE_ROOTS environment variable first.' } }}
@if (localInstallError()) {
{{ localInstallError() }}
} @if (localInstalling()) { }