diff --git a/common/build.rs b/common/build.rs index 938f402e..fffebf01 100644 --- a/common/build.rs +++ b/common/build.rs @@ -38,6 +38,10 @@ fn main() -> Result<(), Box> { ".komp_ac.table_validation.FieldValidation.locked", "#[serde(default)]", ) + .field_attribute( + ".komp_ac.table_validation.UpdateFieldValidationRequest.update_mask", + "#[serde(skip)]", + ) .field_attribute( ".komp_ac.table_definition.ColumnDefinition.boolean_ledger", "#[serde(default, alias = \"boolean_ledger_operator\")]", diff --git a/common/proto/table_validation.proto b/common/proto/table_validation.proto index c6187bc1..d449f1e0 100644 --- a/common/proto/table_validation.proto +++ b/common/proto/table_validation.proto @@ -2,6 +2,8 @@ syntax = "proto3"; package komp_ac.table_validation; +import "google/protobuf/field_mask.proto"; + // This proto is the canonical server-side storage and distribution contract for // client validation configuration. // @@ -189,6 +191,11 @@ message UpdateFieldValidationRequest { string tableName = 2; string dataKey = 3; FieldValidation validation = 4; + + // Omitted keeps the legacy full-replacement behavior. Otherwise, only the + // selected FieldValidation properties are changed; selecting an absent + // message property deliberately removes it. + google.protobuf.FieldMask update_mask = 5; } message UpdateFieldValidationResponse { diff --git a/common/src/proto/descriptor.bin b/common/src/proto/descriptor.bin index 2e2427d9..d5dd41f1 100644 Binary files a/common/src/proto/descriptor.bin and b/common/src/proto/descriptor.bin differ diff --git a/common/src/proto/komp_ac.table_validation.rs b/common/src/proto/komp_ac.table_validation.rs index 9069662f..5401c5a5 100644 --- a/common/src/proto/komp_ac.table_validation.rs +++ b/common/src/proto/komp_ac.table_validation.rs @@ -159,6 +159,12 @@ pub struct UpdateFieldValidationRequest { pub data_key: ::prost::alloc::string::String, #[prost(message, optional, tag = "4")] pub validation: ::core::option::Option, + /// Omitted keeps the legacy full-replacement behavior. Otherwise, only the + /// selected FieldValidation properties are changed; selecting an absent + /// message property deliberately removes it. + #[prost(message, optional, tag = "5")] + #[serde(skip)] + pub update_mask: ::core::option::Option<::prost_types::FieldMask>, } #[derive(serde::Serialize, serde::Deserialize)] #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] diff --git a/komp-app/src/grpc.rs b/komp-app/src/grpc.rs index a9183764..544a1c2f 100644 --- a/komp-app/src/grpc.rs +++ b/komp-app/src/grpc.rs @@ -257,6 +257,7 @@ impl GrpcClient { table_name, data_key, validation: Some(validation), + update_mask: None, }; let request = self.authenticated_request(req)?; let resp = self diff --git a/server b/server index 825a5bcf..7bb3706e 160000 --- a/server +++ b/server @@ -1 +1 @@ -Subproject commit 825a5bcf321655ba3821718eae817982f1e40e5d +Subproject commit 7bb3706ec6e670e1e7d6495d2f699d50a9bc41e3 diff --git a/web/src/pages/add_validation/state.rs b/web/src/pages/add_validation/state.rs index 3cd3a17c..d3c770a1 100644 --- a/web/src/pages/add_validation/state.rs +++ b/web/src/pages/add_validation/state.rs @@ -109,6 +109,7 @@ impl ValidationForm { table_name, data_key: data_key.clone(), validation: Some(self.validation(locale, data_key)?), + update_mask: None, }) }