Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions App/Sources/App/ContentViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ final class ContentViewModel {
.metadata(\.displayName, "Float Array Example")
let intArrayVariable = ConfigVariable(key: "int_array", defaultValue: [1, 2, 4, 8, 16, 32])
.metadata(\.displayName, "Int Array Example")
.metadata(\.isEditable, false)
let stringArrayVariable = ConfigVariable(
key: "string_array",
defaultValue: ["Thom", "Jonny", "Ed", "Colin", "Phil"]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ final class ConfigVariableDetailViewModel: ConfigVariableDetailViewModeling {
self.variableTypeName = registeredVariable.destinationTypeName
self.metadataEntries = registeredVariable.metadata.displayTextEntries
self.isSecret = registeredVariable.isSecret
self.editorControl = registeredVariable.editorControl
self.editorControl = registeredVariable.isEditable ? registeredVariable.editorControl : nil

if let content = document.override(forKey: registeredVariable.key) {
self.overrideText = content.editableString
Expand Down
25 changes: 25 additions & 0 deletions Sources/DevConfiguration/Metadata/IsEditableMetadataKey.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
//
// IsEditableMetadataKey.swift
// DevConfiguration
//
// Created by Prachi Gauriar on 3/17/2026.
//

import Foundation

/// The metadata key indicating whether a variable is editable in the variable editor.
private struct IsEditableMetadataKey: ConfigVariableMetadataKey {
static let defaultValue = true
static let keyDisplayText = localizedString("isEditableMetadata.keyDisplayText")
}


extension ConfigVariableMetadata {
/// Whether the configuration variable is editable in the variable editor.
///
/// When `false`, the editor UI hides the override controls for this variable. Defaults to `true`.
public var isEditable: Bool {
get { self[IsEditableMetadataKey.self] }
set { self[IsEditableMetadataKey.self] = newValue }
}
}
10 changes: 10 additions & 0 deletions Sources/DevConfiguration/Resources/Localizable.xcstrings
Original file line number Diff line number Diff line change
Expand Up @@ -361,6 +361,16 @@
}
}
},
"isEditableMetadata.keyDisplayText" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Is Editable"
}
}
}
},
"requiresRelaunchMetadata.keyDisplayText" : {
"localizations" : {
"en" : {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,27 @@ struct ConfigVariableDetailViewModelTests: RandomValueGenerating {
}


@Test
mutating func initSetsEditorControlToNilWhenNotEditable() {
// set up with isEditable = false
var metadata = ConfigVariableMetadata()
metadata.isEditable = false

let variable = randomRegisteredVariable(
metadata: metadata,
editorControl: .textField
)

let document = makeDocument(registeredVariables: [variable])

// exercise
let viewModel = makeViewModel(document: document, registeredVariable: variable)

// expect editorControl is nil because the variable is not editable
#expect(viewModel.editorControl == nil)
}


@Test
mutating func initUsesKeyDescriptionWhenDisplayNameIsNil() {
// set up with no display name metadata
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
//
// IsEditableMetadataKeyTests.swift
// DevConfiguration
//
// Created by Prachi Gauriar on 3/17/2026.
//

import Testing

@testable import DevConfiguration

struct IsEditableMetadataKeyTests {
@Test
func isEditableDefaultsToTrueAndStoresAndRetrievesValue() {
// set up
var metadata = ConfigVariableMetadata()

// expect that unset isEditable returns true
#expect(metadata.isEditable)

// exercise
metadata.isEditable = false

// expect that the value is stored and retrieved correctly
#expect(!metadata.isEditable)
}


@Test
func isEditableDisplayTextShowsValue() throws {
// set up
var metadata = ConfigVariableMetadata()

// exercise
metadata.isEditable = false

// expect that displayTextEntries contains the is editable entry with a localized key
let entries = metadata.displayTextEntries
let entry = try #require(entries.first { $0.value == "false" })
#expect(entry.key != "isEditableMetadata.keyDisplayText")
}
}
Loading