Use managed secret controls for Files connectors

This commit is contained in:
2026-07-21 12:13:00 +02:00
parent f2dfb6c90e
commit 8826cf2890
5 changed files with 27 additions and 78 deletions

View File

@@ -116,8 +116,6 @@ export type FileConnectorCredentialsPayload = {
username?: string | null; username?: string | null;
password?: string | null; password?: string | null;
token?: string | null; token?: string | null;
password_env?: string | null;
token_env?: string | null;
secret_ref?: string | null; secret_ref?: string | null;
}; };

View File

@@ -15,6 +15,8 @@ import {
LoadingFrame, LoadingFrame,
mergeDeltaRows, mergeDeltaRows,
SegmentedControl, SegmentedControl,
StatusBadge,
TableActionGroup,
ToggleSwitch, ToggleSwitch,
useDeltaWatermarks, useDeltaWatermarks,
useUnsavedDraftGuard, useUnsavedDraftGuard,
@@ -65,8 +67,6 @@ type ConnectorProfileDraft = {
username: string; username: string;
password: string; password: string;
token: string; token: string;
passwordEnv: string;
tokenEnv: string;
secretRef: string; secretRef: string;
canBrowse: boolean; canBrowse: boolean;
canImport: boolean; canImport: boolean;
@@ -91,8 +91,6 @@ type ConnectorCredentialDraft = {
username: string; username: string;
password: string; password: string;
token: string; token: string;
passwordEnv: string;
tokenEnv: string;
secretRef: string; secretRef: string;
policyMode: PolicyMode; policyMode: PolicyMode;
allowedPaths: string; allowedPaths: string;
@@ -491,8 +489,6 @@ export default function FileConnectorSettingsPanel({
username: cleanOrNull(credentialDraft.username), username: cleanOrNull(credentialDraft.username),
password: cleanOrUndefined(credentialDraft.password), password: cleanOrUndefined(credentialDraft.password),
token: cleanOrUndefined(credentialDraft.token), token: cleanOrUndefined(credentialDraft.token),
password_env: cleanOrNull(credentialDraft.passwordEnv),
token_env: cleanOrNull(credentialDraft.tokenEnv),
secret_ref: cleanOrNull(credentialDraft.secretRef) secret_ref: cleanOrNull(credentialDraft.secretRef)
}; };
const sharedPayload = { const sharedPayload = {
@@ -633,8 +629,6 @@ export default function FileConnectorSettingsPanel({
username: cleanOrNull(draft.username), username: cleanOrNull(draft.username),
password: cleanOrUndefined(draft.password), password: cleanOrUndefined(draft.password),
token: cleanOrUndefined(draft.token), token: cleanOrUndefined(draft.token),
password_env: cleanOrNull(draft.passwordEnv),
token_env: cleanOrNull(draft.tokenEnv),
secret_ref: cleanOrNull(draft.secretRef) secret_ref: cleanOrNull(draft.secretRef)
}, },
metadata: metadataFromDraft(draft) metadata: metadataFromDraft(draft)
@@ -680,8 +674,6 @@ export default function FileConnectorSettingsPanel({
username: cleanOrNull(credentialDraft.username), username: cleanOrNull(credentialDraft.username),
password: cleanOrUndefined(credentialDraft.password), password: cleanOrUndefined(credentialDraft.password),
token: cleanOrUndefined(credentialDraft.token), token: cleanOrUndefined(credentialDraft.token),
password_env: cleanOrNull(credentialDraft.passwordEnv),
token_env: cleanOrNull(credentialDraft.tokenEnv),
secret_ref: cleanOrNull(credentialDraft.secretRef) secret_ref: cleanOrNull(credentialDraft.secretRef)
}, },
metadata: profile.metadata ?? {}, metadata: profile.metadata ?? {},
@@ -756,7 +748,7 @@ export default function FileConnectorSettingsPanel({
width: "120px", width: "120px",
render: (row) => { render: (row) => {
const enabled = row.kind === "profile" ? row.profile.enabled : row.credential.enabled; const enabled = row.kind === "profile" ? row.profile.enabled : row.credential.enabled;
return <span className={`status-badge ${enabled ? "success" : "neutral"}`}>{enabled ? "i18n:govoplan-files.enabled.df174a3f" : "i18n:govoplan-files.disabled.f4f4473d"}</span>; return <StatusBadge status={enabled ? "success" : "inactive"} label={enabled ? "i18n:govoplan-files.enabled.df174a3f" : "i18n:govoplan-files.disabled.f4f4473d"} />;
} }
}]; }];
@@ -771,21 +763,19 @@ export default function FileConnectorSettingsPanel({
function renderConnectorActions(row: ConnectorTreeRow) { function renderConnectorActions(row: ConnectorTreeRow) {
if (row.kind === "credential") { if (row.kind === "credential") {
const readOnly = row.credential.source_kind !== "database"; const readOnly = row.credential.source_kind !== "database";
return ( return <TableActionGroup actions={[
<div className="admin-icon-actions"> { id: "edit", label: i18nMessage("i18n:govoplan-files.edit_value.fad75899", { value0: row.credential.label }), icon: <Edit3 size={15} />, disabled: !canWrite || readOnly || saving, onClick: () => startCredentialEdit(row.credential) },
<Button type="button" className="admin-icon-button" title={i18nMessage("i18n:govoplan-files.edit_value.fad75899", { value0: row.credential.label })} aria-label={i18nMessage("i18n:govoplan-files.edit_value.fad75899", { value0: row.credential.label })} onClick={() => startCredentialEdit(row.credential)} disabled={!canWrite || readOnly || saving}><Edit3 size={15} /></Button> { id: "disable", label: i18nMessage("i18n:govoplan-files.disable_value.09485f7f", { value0: row.credential.label }), icon: <Trash2 size={15} />, variant: "danger", applicable: row.credential.enabled, disabled: !canWrite || readOnly || saving, onClick: () => setPendingCredentialDeactivate(row.credential) }
<Button type="button" variant="danger" className="admin-icon-button" title={i18nMessage("i18n:govoplan-files.disable_value.09485f7f", { value0: row.credential.label })} aria-label={i18nMessage("i18n:govoplan-files.disable_value.09485f7f", { value0: row.credential.label })} onClick={() => setPendingCredentialDeactivate(row.credential)} disabled={!canWrite || readOnly || saving || !row.credential.enabled}><Trash2 size={15} /></Button> ]} />;
</div>);
} }
const readOnly = row.profile.source_kind !== "database"; const readOnly = row.profile.source_kind !== "database";
return ( return <TableActionGroup actions={[
<div className="admin-icon-actions"> { id: "test", label: i18nMessage("i18n:govoplan-files.test_value.6a5d10a5", { value0: row.profile.label }), icon: <RefreshCw size={15} />, applicable: row.profile.enabled, disabled: saving || testingProfileId === row.profile.id, onClick: () => void testBrowse(row.profile) },
<Button type="button" className="admin-icon-button" title={i18nMessage("i18n:govoplan-files.test_value.6a5d10a5", { value0: row.profile.label })} aria-label={i18nMessage("i18n:govoplan-files.test_value.6a5d10a5", { value0: row.profile.label })} onClick={() => void testBrowse(row.profile)} disabled={saving || testingProfileId === row.profile.id || !row.profile.enabled}><RefreshCw size={15} /></Button> { id: "add-credential", label: i18nMessage("i18n:govoplan-files.add_credential_for_value.0fa9c1fe", { value0: row.profile.label }), icon: <UserRoundKey size={15} />, variant: "primary", disabled: !canWrite || saving, onClick: () => startCredentialCreate(row.profile) },
<Button type="button" variant="primary" className="admin-icon-button" title={i18nMessage("i18n:govoplan-files.add_credential_for_value.0fa9c1fe", { value0: row.profile.label })} aria-label={i18nMessage("i18n:govoplan-files.add_credential_for_value.0fa9c1fe", { value0: row.profile.label })} onClick={() => startCredentialCreate(row.profile)} disabled={!canWrite || saving}><UserRoundKey size={15} /></Button> { id: "edit", label: i18nMessage("i18n:govoplan-files.edit_value.fad75899", { value0: row.profile.label }), icon: <Edit3 size={15} />, disabled: !canWrite || readOnly || saving, onClick: () => startEdit(row.profile) },
<Button type="button" className="admin-icon-button" title={i18nMessage("i18n:govoplan-files.edit_value.fad75899", { value0: row.profile.label })} aria-label={i18nMessage("i18n:govoplan-files.edit_value.fad75899", { value0: row.profile.label })} onClick={() => startEdit(row.profile)} disabled={!canWrite || readOnly || saving}><Edit3 size={15} /></Button> { id: "disable", label: i18nMessage("i18n:govoplan-files.disable_value.09485f7f", { value0: row.profile.label }), icon: <Trash2 size={15} />, variant: "danger", applicable: row.profile.enabled, disabled: !canWrite || readOnly || saving, onClick: () => setPendingDeactivate(row.profile) }
<Button type="button" variant="danger" className="admin-icon-button" title={i18nMessage("i18n:govoplan-files.disable_value.09485f7f", { value0: row.profile.label })} aria-label={i18nMessage("i18n:govoplan-files.disable_value.09485f7f", { value0: row.profile.label })} onClick={() => setPendingDeactivate(row.profile)} disabled={!canWrite || readOnly || saving || !row.profile.enabled}><Trash2 size={15} /></Button> ]} />;
</div>);
} }
@@ -865,7 +855,7 @@ export default function FileConnectorSettingsPanel({
<LoadingFrame loading={loading} label="i18n:govoplan-files.loading_connector_policy.f12ab285"> <LoadingFrame loading={loading} label="i18n:govoplan-files.loading_connector_policy.f12ab285">
<> <>
<div className="form-grid two-column-form-grid"> <div className="form-grid two">
<FormField label="i18n:govoplan-files.allowed_connection_ids.0df854c8"> <FormField label="i18n:govoplan-files.allowed_connection_ids.0df854c8">
<textarea value={policyDraft.allowedConnectors} disabled={saving || !canWrite} onChange={(event) => patchPolicyDraft({ allowedConnectors: event.target.value })} rows={3} placeholder={"tenant-webdav\nseafile-*"} /> <textarea value={policyDraft.allowedConnectors} disabled={saving || !canWrite} onChange={(event) => patchPolicyDraft({ allowedConnectors: event.target.value })} rows={3} placeholder={"tenant-webdav\nseafile-*"} />
</FormField> </FormField>
@@ -940,7 +930,7 @@ export default function FileConnectorSettingsPanel({
<h3>Credential</h3> <h3>Credential</h3>
<p>Choose where this credential can be used and how it signs in.</p> <p>Choose where this credential can be used and how it signs in.</p>
</header> </header>
<div className="form-grid two-column-form-grid"> <div className="form-grid two">
<FormField label="i18n:govoplan-files.credential_id.9432a6e1"> <FormField label="i18n:govoplan-files.credential_id.9432a6e1">
<input className={!editingCredentialId && !credentialDraft.id.trim() ? "field-input-missing" : undefined} aria-invalid={!editingCredentialId && !credentialDraft.id.trim() || undefined} value={credentialDraft.id} disabled={Boolean(editingCredentialId) || saving} onChange={(event) => patchCredentialDraft({ id: event.target.value })} placeholder={`${scopeType}-webdav-credentials`} /> <input className={!editingCredentialId && !credentialDraft.id.trim() ? "field-input-missing" : undefined} aria-invalid={!editingCredentialId && !credentialDraft.id.trim() || undefined} value={credentialDraft.id} disabled={Boolean(editingCredentialId) || saving} onChange={(event) => patchCredentialDraft({ id: event.target.value })} placeholder={`${scopeType}-webdav-credentials`} />
</FormField> </FormField>
@@ -1018,7 +1008,7 @@ export default function FileConnectorSettingsPanel({
onChange={patchCredentialValues} onChange={patchCredentialValues}
disabled={saving} disabled={saving}
showPassword={false} /> showPassword={false} />
<div className="form-grid two-column-form-grid"> <div className="form-grid two">
<FormField label="i18n:govoplan-files.secret_reference.04ed2221"> <FormField label="i18n:govoplan-files.secret_reference.04ed2221">
<input value={credentialDraft.secretRef} disabled={saving} onChange={(event) => patchCredentialDraft({ secretRef: event.target.value })} /> <input value={credentialDraft.secretRef} disabled={saving} onChange={(event) => patchCredentialDraft({ secretRef: event.target.value })} />
</FormField> </FormField>
@@ -1049,16 +1039,6 @@ export default function FileConnectorSettingsPanel({
{credentialLoginResult.message} {credentialLoginResult.message}
</DismissibleAlert> </DismissibleAlert>
} }
<AdvancedOptionsPanel title="Environment and fallback secrets" summary="Use these only when the deployment injects secrets outside the database.">
<div className="form-grid two-column-form-grid">
<FormField label="i18n:govoplan-files.password_environment_variable.0e77673f">
<input value={credentialDraft.passwordEnv} disabled={saving} onChange={(event) => patchCredentialDraft({ passwordEnv: event.target.value })} />
</FormField>
<FormField label="i18n:govoplan-files.token_environment_variable.5af4a79e">
<input value={credentialDraft.tokenEnv} disabled={saving} onChange={(event) => patchCredentialDraft({ tokenEnv: event.target.value })} />
</FormField>
</div>
</AdvancedOptionsPanel>
</section> </section>
<section className="adaptive-config-section"> <section className="adaptive-config-section">
@@ -1066,7 +1046,7 @@ export default function FileConnectorSettingsPanel({
<h3>Policy</h3> <h3>Policy</h3>
<p>Limit where lower levels may use this credential.</p> <p>Limit where lower levels may use this credential.</p>
</header> </header>
<div className="form-grid two-column-form-grid"> <div className="form-grid two">
<FormField label="i18n:govoplan-files.policy.bb9cf141"> <FormField label="i18n:govoplan-files.policy.bb9cf141">
<select value={credentialDraft.policyMode} disabled={saving} onChange={(event) => patchCredentialDraft({ policyMode: event.target.value as PolicyMode })}> <select value={credentialDraft.policyMode} disabled={saving} onChange={(event) => patchCredentialDraft({ policyMode: event.target.value as PolicyMode })}>
<option value="allow-provider">i18n:govoplan-files.can_use_this_credential.f4a41971</option> <option value="allow-provider">i18n:govoplan-files.can_use_this_credential.f4a41971</option>
@@ -1118,7 +1098,7 @@ export default function FileConnectorSettingsPanel({
<h3>Connection</h3> <h3>Connection</h3>
<p>Name the file server connection and choose the provider.</p> <p>Name the file server connection and choose the provider.</p>
</header> </header>
<div className="form-grid two-column-form-grid"> <div className="form-grid two">
<FormField label="i18n:govoplan-files.profile_id.25961d68"> <FormField label="i18n:govoplan-files.profile_id.25961d68">
<input className={!editingProfileId && !draft.id.trim() ? "field-input-missing" : undefined} aria-invalid={!editingProfileId && !draft.id.trim() || undefined} value={draft.id} disabled={Boolean(editingProfileId) || saving} onChange={(event) => patchDraft({ id: event.target.value })} placeholder={`${scopeType}-webdav`} /> <input className={!editingProfileId && !draft.id.trim() ? "field-input-missing" : undefined} aria-invalid={!editingProfileId && !draft.id.trim() || undefined} value={draft.id} disabled={Boolean(editingProfileId) || saving} onChange={(event) => patchDraft({ id: event.target.value })} placeholder={`${scopeType}-webdav`} />
</FormField> </FormField>
@@ -1151,7 +1131,7 @@ export default function FileConnectorSettingsPanel({
<h3>Location and credentials</h3> <h3>Location and credentials</h3>
<p>Only fields relevant for the selected provider and credential mode are shown.</p> <p>Only fields relevant for the selected provider and credential mode are shown.</p>
</header> </header>
<div className="form-grid two-column-form-grid"> <div className="form-grid two">
<FormField label="i18n:govoplan-files.endpoint_url.65aaaa45"> <FormField label="i18n:govoplan-files.endpoint_url.65aaaa45">
<input value={draft.endpointUrl} disabled={saving} onChange={(event) => patchDraft({ endpointUrl: event.target.value })} placeholder={ENDPOINT_PLACEHOLDERS[draft.provider]} /> <input value={draft.endpointUrl} disabled={saving} onChange={(event) => patchDraft({ endpointUrl: event.target.value })} placeholder={ENDPOINT_PLACEHOLDERS[draft.provider]} />
</FormField> </FormField>
@@ -1188,7 +1168,7 @@ export default function FileConnectorSettingsPanel({
</DismissibleAlert> </DismissibleAlert>
} }
<AdvancedOptionsPanel title="Protocol and compatibility options" summary="Change these only when the provider or network requires an override."> <AdvancedOptionsPanel title="Protocol and compatibility options" summary="Change these only when the provider or network requires an override.">
<div className="form-grid two-column-form-grid"> <div className="form-grid two">
<FormField label="i18n:govoplan-files.browse_protocol.d1f27c90"> <FormField label="i18n:govoplan-files.browse_protocol.d1f27c90">
<select value={draft.browseProtocol} disabled={saving} onChange={(event) => patchDraft({ browseProtocol: event.target.value })}> <select value={draft.browseProtocol} disabled={saving} onChange={(event) => patchDraft({ browseProtocol: event.target.value })}>
<option value="">i18n:govoplan-files.native_default.ba32f7b6</option> <option value="">i18n:govoplan-files.native_default.ba32f7b6</option>
@@ -1222,7 +1202,7 @@ export default function FileConnectorSettingsPanel({
<ToggleSwitch label="i18n:govoplan-files.import.d6fbc9d2" checked={draft.canImport} disabled={saving} onChange={(canImport) => patchDraft({ canImport })} /> <ToggleSwitch label="i18n:govoplan-files.import.d6fbc9d2" checked={draft.canImport} disabled={saving} onChange={(canImport) => patchDraft({ canImport })} />
<ToggleSwitch label="i18n:govoplan-files.sync.905f6309" checked={draft.canSync} disabled={saving} onChange={(canSync) => patchDraft({ canSync })} /> <ToggleSwitch label="i18n:govoplan-files.sync.905f6309" checked={draft.canSync} disabled={saving} onChange={(canSync) => patchDraft({ canSync })} />
</div> </div>
<div className="form-grid two-column-form-grid"> <div className="form-grid two">
<FormField label="i18n:govoplan-files.policy.bb9cf141"> <FormField label="i18n:govoplan-files.policy.bb9cf141">
<select value={draft.policyMode} disabled={saving} onChange={(event) => patchDraft({ policyMode: event.target.value as PolicyMode })}> <select value={draft.policyMode} disabled={saving} onChange={(event) => patchDraft({ policyMode: event.target.value as PolicyMode })}>
<option value="allow-provider">i18n:govoplan-files.can_use_this_connection.5091a74c</option> <option value="allow-provider">i18n:govoplan-files.can_use_this_connection.5091a74c</option>
@@ -1373,8 +1353,6 @@ function emptyDraft(scopeType: ConnectorScope): ConnectorProfileDraft {
username: "", username: "",
password: "", password: "",
token: "", token: "",
passwordEnv: "",
tokenEnv: "",
secretRef: "", secretRef: "",
canBrowse: true, canBrowse: true,
canImport: true, canImport: true,
@@ -1437,8 +1415,6 @@ function emptyCredentialDraft(scopeType: ConnectorScope): ConnectorCredentialDra
username: "", username: "",
password: "", password: "",
token: "", token: "",
passwordEnv: "",
tokenEnv: "",
secretRef: "", secretRef: "",
policyMode: "allow-provider", policyMode: "allow-provider",
allowedPaths: "", allowedPaths: "",

View File

@@ -2433,7 +2433,7 @@ export default function FilesPage({ settings, auth }: {settings: ApiSettings;aut
{dialog === "transfer" && transferDialogState && {dialog === "transfer" && transferDialogState &&
<FileDialog title={`${transferMode === "copy" ? "i18n:govoplan-files.copy.af74f7c5" : "i18n:govoplan-files.move.76cdb950"} selection`} onClose={closeDialog}> <FileDialog title={`${transferMode === "copy" ? "i18n:govoplan-files.copy.af74f7c5" : "i18n:govoplan-files.move.76cdb950"} selection`} onClose={closeDialog}>
<p className="muted">i18n:govoplan-files.choose_a_destination_space_and_folder_folders_ar.45158643</p> <p className="muted">i18n:govoplan-files.choose_a_destination_space_and_folder_folders_ar.45158643</p>
<div className="form-grid two-column-form-grid"> <div className="form-grid two">
<FormField label="i18n:govoplan-files.destination_space.92b63970" help="i18n:govoplan-files.select_the_space_that_will_receive_the_selected_.0a8bea8f"> <FormField label="i18n:govoplan-files.destination_space.92b63970" help="i18n:govoplan-files.select_the_space_that_will_receive_the_selected_.0a8bea8f">
<select value={transferDialogState.targetSpaceId} onChange={(event) => setTransferDialogState((current) => current ? { ...current, targetSpaceId: event.target.value, targetFolder: "" } : current)}> <select value={transferDialogState.targetSpaceId} onChange={(event) => setTransferDialogState((current) => current ? { ...current, targetSpaceId: event.target.value, targetFolder: "" } : current)}>
{spaces.filter((space) => !isConnectorSpace(space)).map((space) => <option key={space.id} value={space.id}>{space.label}</option>)} {spaces.filter((space) => !isConnectorSpace(space)).map((space) => <option key={space.id} value={space.id}>{space.label}</option>)}
@@ -2472,7 +2472,7 @@ export default function FilesPage({ settings, auth }: {settings: ApiSettings;aut
{dialog === "rename" && {dialog === "rename" &&
<FileDialog title="i18n:govoplan-files.bulk_rename_selected_items.5e79d694" onClose={closeDialog}> <FileDialog title="i18n:govoplan-files.bulk_rename_selected_items.5e79d694" onClose={closeDialog}>
<p className="muted">i18n:govoplan-files.bulk_rename_changes_managed_display_paths_only_i.8cf34a6b</p> <p className="muted">i18n:govoplan-files.bulk_rename_changes_managed_display_paths_only_i.8cf34a6b</p>
<div className="form-grid two-column-form-grid"> <div className="form-grid two">
<FormField label="i18n:govoplan-files.mode.a7b93d21" help="i18n:govoplan-files.choose_how_the_selected_names_should_be_changed.0231854f"> <FormField label="i18n:govoplan-files.mode.a7b93d21" help="i18n:govoplan-files.choose_how_the_selected_names_should_be_changed.0231854f">
<select value={renameMode} onChange={(event) => setRenameMode(event.target.value as RenameMode)}> <select value={renameMode} onChange={(event) => setRenameMode(event.target.value as RenameMode)}>
<option value="prefix">i18n:govoplan-files.add_prefix.672452bc</option> <option value="prefix">i18n:govoplan-files.add_prefix.672452bc</option>

View File

@@ -252,7 +252,6 @@ export const generatedTranslations: PlatformTranslations = {
"i18n:govoplan-files.overwrite.0625c54e": "Overwrite", "i18n:govoplan-files.overwrite.0625c54e": "Overwrite",
"i18n:govoplan-files.owner_space.364c4b62": "Owner space", "i18n:govoplan-files.owner_space.364c4b62": "Owner space",
"i18n:govoplan-files.parent_folder.d8ed4c2a": "Parent folder", "i18n:govoplan-files.parent_folder.d8ed4c2a": "Parent folder",
"i18n:govoplan-files.password_environment_variable.0e77673f": "Password environment variable",
"i18n:govoplan-files.password.8be3c943": "Password", "i18n:govoplan-files.password.8be3c943": "Password",
"i18n:govoplan-files.path_limited.d32cbef0": "Path-limited", "i18n:govoplan-files.path_limited.d32cbef0": "Path-limited",
"i18n:govoplan-files.pattern_preview_results.56cea56c": "Pattern preview results", "i18n:govoplan-files.pattern_preview_results.56cea56c": "Pattern preview results",
@@ -318,7 +317,6 @@ export const generatedTranslations: PlatformTranslations = {
"i18n:govoplan-files.this_file_credential.695efb90": "this file credential", "i18n:govoplan-files.this_file_credential.695efb90": "this file credential",
"i18n:govoplan-files.this_folder_is_empty_upload_files_in_the_top_lev.cb6c3a1a": "This folder is empty. Upload files in the top-level Files module.", "i18n:govoplan-files.this_folder_is_empty_upload_files_in_the_top_lev.cb6c3a1a": "This folder is empty. Upload files in the top-level Files module.",
"i18n:govoplan-files.this_folder_is_empty_use_upload_or_create_folder.5977d784": "This folder is empty. Use Upload or Create Folder to add content.", "i18n:govoplan-files.this_folder_is_empty_use_upload_or_create_folder.5977d784": "This folder is empty. Use Upload or Create Folder to add content.",
"i18n:govoplan-files.token_environment_variable.5af4a79e": "Token environment variable",
"i18n:govoplan-files.token.a1141eb9": "Token", "i18n:govoplan-files.token.a1141eb9": "Token",
"i18n:govoplan-files.unpack_zip_uploads.256fead4": "Unpack ZIP uploads", "i18n:govoplan-files.unpack_zip_uploads.256fead4": "Unpack ZIP uploads",
"i18n:govoplan-files.unpacking_zip_archive.698095f4": "Unpacking ZIP archive", "i18n:govoplan-files.unpacking_zip_archive.698095f4": "Unpacking ZIP archive",
@@ -609,7 +607,6 @@ export const generatedTranslations: PlatformTranslations = {
"i18n:govoplan-files.overwrite.0625c54e": "Overwrite", "i18n:govoplan-files.overwrite.0625c54e": "Overwrite",
"i18n:govoplan-files.owner_space.364c4b62": "Owner space", "i18n:govoplan-files.owner_space.364c4b62": "Owner space",
"i18n:govoplan-files.parent_folder.d8ed4c2a": "Parent folder", "i18n:govoplan-files.parent_folder.d8ed4c2a": "Parent folder",
"i18n:govoplan-files.password_environment_variable.0e77673f": "Password environment variable",
"i18n:govoplan-files.password.8be3c943": "Passwort", "i18n:govoplan-files.password.8be3c943": "Passwort",
"i18n:govoplan-files.path_limited.d32cbef0": "Path-limited", "i18n:govoplan-files.path_limited.d32cbef0": "Path-limited",
"i18n:govoplan-files.pattern_preview_results.56cea56c": "Pattern preview results", "i18n:govoplan-files.pattern_preview_results.56cea56c": "Pattern preview results",
@@ -675,7 +672,6 @@ export const generatedTranslations: PlatformTranslations = {
"i18n:govoplan-files.this_file_credential.695efb90": "this file credential", "i18n:govoplan-files.this_file_credential.695efb90": "this file credential",
"i18n:govoplan-files.this_folder_is_empty_upload_files_in_the_top_lev.cb6c3a1a": "This folder is empty. Upload files in the top-level Files module.", "i18n:govoplan-files.this_folder_is_empty_upload_files_in_the_top_lev.cb6c3a1a": "This folder is empty. Upload files in the top-level Files module.",
"i18n:govoplan-files.this_folder_is_empty_use_upload_or_create_folder.5977d784": "This folder is empty. Use Upload or Create Folder to add content.", "i18n:govoplan-files.this_folder_is_empty_use_upload_or_create_folder.5977d784": "This folder is empty. Use Upload or Create Folder to add content.",
"i18n:govoplan-files.token_environment_variable.5af4a79e": "Token environment variable",
"i18n:govoplan-files.token.a1141eb9": "Token", "i18n:govoplan-files.token.a1141eb9": "Token",
"i18n:govoplan-files.unpack_zip_uploads.256fead4": "Unpack ZIP uploads", "i18n:govoplan-files.unpack_zip_uploads.256fead4": "Unpack ZIP uploads",
"i18n:govoplan-files.unpacking_zip_archive.698095f4": "Unpacking ZIP archive", "i18n:govoplan-files.unpacking_zip_archive.698095f4": "Unpacking ZIP archive",

View File

@@ -960,7 +960,7 @@
border: 1px solid transparent; border: 1px solid transparent;
border-radius: 9px; border-radius: 9px;
background: transparent; background: transparent;
color: var(--ink); color: var(--text-strong);
text-align: left; text-align: left;
cursor: pointer; cursor: pointer;
} }
@@ -1038,7 +1038,7 @@
border: 0; border: 0;
border-radius: 6px; border-radius: 6px;
background: transparent; background: transparent;
color: var(--ink); color: var(--text-strong);
padding: 5px 6px; padding: 5px 6px;
cursor: pointer; cursor: pointer;
} }
@@ -1137,7 +1137,7 @@
} }
.managed-file-entry:disabled { .managed-file-entry:disabled {
color: var(--ink); color: var(--text-strong);
opacity: 1; opacity: 1;
cursor: default; cursor: default;
} }
@@ -1245,7 +1245,7 @@
border-right: 0; border-right: 0;
border-left: 0; border-left: 0;
background: transparent; background: transparent;
color: var(--ink); color: var(--text-strong);
text-align: left; text-align: left;
font: inherit; font: inherit;
cursor: pointer; cursor: pointer;
@@ -1272,27 +1272,6 @@
color: var(--muted); color: var(--muted);
} }
.split-field-action {
gap: 0;
}
.split-field-action > input,
.split-field-action > select,
.split-field-action > textarea {
border-top-right-radius: 0 !important;
border-bottom-right-radius: 0 !important;
}
.split-field-action > button,
.split-field-action > .button,
.split-field-action > .btn {
align-self: stretch;
margin-left: -1px;
border-top-left-radius: 0;
border-bottom-left-radius: 0;
box-shadow: none;
}
@media (max-width: 850px) { @media (max-width: 850px) {
.managed-file-entry-head, .managed-file-entry-head,
.managed-file-entry { .managed-file-entry {