Skip to content

Commit c52f298

Browse files
authored
Merge pull request #270 from docker/fix-required-secrets-parameters
Fix required parameters
2 parents eb21fde + 710fb2e commit c52f298

File tree

3 files changed

+33
-13
lines changed

3 files changed

+33
-13
lines changed

src/extension/ui/src/components/tile/Modal.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,7 @@ const ConfigurationModal = ({
418418
}
419419
disabled={secret.assigned}
420420
key={secret.name}
421-
label={secret.name}
421+
label={`${secret.name} (required)`}
422422
value={localSecrets[secret.name]}
423423
fullWidth
424424
onChange={(e) => {

src/extension/ui/src/queries/useCatalog.ts

+21-8
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
11
import { v1 } from '@docker/extension-api-client-types';
22
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
3+
import { isEmpty, isEqual } from 'lodash-es';
34
import { useCallback, useEffect, useMemo, useState } from 'react';
45
import { parse, stringify } from 'yaml';
6+
57
import { CATALOG_URL, REGISTRY_YAML } from '../Constants';
68
import { getRegistry, syncRegistryWithConfig } from '../Registry';
79
import Secrets from '../Secrets';
810
import { CatalogItemRichened, CatalogItemWithName } from '../types/catalog';
911
import { writeToPromptsVolume } from '../utils/Files';
10-
import { getTemplateForItem, useConfig } from './useConfig';
12+
import {
13+
getRequiredParameters,
14+
getTemplateForItem,
15+
useConfig,
16+
} from './useConfig';
1117
import { useSecrets } from './useSecrets';
1218

1319
const STORAGE_KEYS = {
@@ -33,11 +39,18 @@ function useCatalog(client: v1.DockerDesktopClient) {
3339
);
3440
const configTemplate = getTemplateForItem(item, itemConfigValue);
3541
const baseConfigTemplate = getTemplateForItem(item, {});
36-
const unConfigured =
37-
Boolean(item.config) &&
38-
(neverOnceConfigured ||
39-
JSON.stringify(itemConfigValue) ===
40-
JSON.stringify(baseConfigTemplate));
42+
const requiredParameters = getRequiredParameters(item);
43+
44+
// Check if any required parameters are not configured
45+
const missingConfig =
46+
!isEmpty(item.config) &&
47+
requiredParameters.some((key) => {
48+
const isMissing = isEqual(
49+
itemConfigValue[key],
50+
baseConfigTemplate[key],
51+
);
52+
return isMissing;
53+
});
4154

4255
const missingASecret = secretsWithAssignment.some(
4356
(secret) => !secret.assigned,
@@ -48,10 +61,10 @@ function useCatalog(client: v1.DockerDesktopClient) {
4861
configValue: itemConfigValue,
4962
configSchema: item.config || {},
5063
configTemplate,
51-
missingConfig: unConfigured,
64+
missingConfig,
5265
missingSecrets: missingASecret,
5366
registered: !!registryItems?.[item.name],
54-
canRegister: !missingASecret && !unConfigured,
67+
canRegister: !missingASecret && !missingConfig,
5568
name: item.name,
5669
};
5770
return enrichedItem;

src/extension/ui/src/queries/useConfig.ts

+11-4
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,22 @@ import { writeToPromptsVolume } from '../utils/Files';
1010

1111
export const getTemplateForItem = (
1212
item: CatalogItemWithName,
13-
existingConfigForItem: { [key: string]: any } = {}
13+
existingConfigForItem: { [key: string]: any } = {},
1414
) => {
1515
const config = item.config;
1616
if (!config) return {};
1717
const schema = new JsonSchemaLibrary.Draft2019(config[0]);
18-
const template = schema.getTemplate(existingConfigForItem);
18+
const template = schema.getTemplate(existingConfigForItem) ?? {};
1919
return template;
2020
};
2121

22+
export function getRequiredParameters(item: CatalogItemWithName): string[] {
23+
const config = item.config;
24+
if (!config) return [];
25+
const schema = new JsonSchemaLibrary.Draft2019(config[0]);
26+
return (schema.rootSchema.required || []) as string[];
27+
}
28+
2229
export function useConfig(client: v1.DockerDesktopClient) {
2330
const queryClient = useQueryClient();
2431

@@ -59,7 +66,7 @@ export function useConfig(client: v1.DockerDesktopClient) {
5966
await writeToPromptsVolume(
6067
client,
6168
CONFIG_YAML,
62-
stringify(updatedConfig)
69+
stringify(updatedConfig),
6370
);
6471

6572
const updatedConfigRef = JSON.parse(JSON.stringify(updatedConfig));
@@ -91,7 +98,7 @@ export function useConfig(client: v1.DockerDesktopClient) {
9198

9299
const saveConfig = async (
93100
itemName: string,
94-
newConfig: { [key: string]: any }
101+
newConfig: { [key: string]: any },
95102
) => {
96103
try {
97104
await saveConfigMutation.mutateAsync({ itemName, newConfig });

0 commit comments

Comments
 (0)