From 0774f49f9ca459eb3a0c9413a15eaf6c69b0c75c Mon Sep 17 00:00:00 2001 From: Priec Date: Thu, 10 Sep 2026 19:08:49 +0200 Subject: [PATCH] tui-pages changes and enum for what is allowed on a global table that the modules uses --- common/build.rs | 4 ++ common/proto/table_definition.proto | 23 ++++++ common/src/proto/descriptor.bin | Bin 261589 -> 263219 bytes common/src/proto/komp_ac.table_definition.rs | 72 +++++++++++++++++++ server | 2 +- tui-pages | 2 +- 6 files changed, 101 insertions(+), 2 deletions(-) diff --git a/common/build.rs b/common/build.rs index 5cf09342..48f9ef4c 100644 --- a/common/build.rs +++ b/common/build.rs @@ -43,6 +43,10 @@ fn main() -> Result<(), Box> { .type_attribute(".komp_ac.tables_data.GetAdjacentTableDataResponse", serde) .type_attribute(".komp_ac.tables_data.ResolvedTableLinkStatus", serde) .type_attribute(".komp_ac.tables_data.RowNavigationMode", serde) + .field_attribute( + ".komp_ac.table_definition.TableDetail.catalog_features", + "#[serde(default)]", + ) .field_attribute( ".komp_ac.table_validation.FieldValidation.locked", "#[serde(default)]", diff --git a/common/proto/table_definition.proto b/common/proto/table_definition.proto index be2cd259..7bd7b452 100644 --- a/common/proto/table_definition.proto +++ b/common/proto/table_definition.proto @@ -651,6 +651,29 @@ message TableDetail { // True when module-owned storage supports catalog-managed rows and settings. bool catalog_managed = 14; + + // Supported catalog operations, not user permissions or a guarantee that a + // particular request is valid. Column restrictions, locks, existing data and + // optimistic concurrency checks still apply. Unknown values must be ignored. + repeated CatalogFeature catalog_features = 15; +} + +enum CatalogFeature { + CATALOG_FEATURE_UNSPECIFIED = 0; + CATALOG_FEATURE_WRITE_ROWS = 1; + CATALOG_FEATURE_DELETE_ROWS = 2; + CATALOG_FEATURE_ARCHIVE_ROWS = 3; + CATALOG_FEATURE_COLUMN_PRESENTATION = 4; + CATALOG_FEATURE_COLUMN_REQUIRED = 5; + CATALOG_FEATURE_COLUMN_FORM_VISIBILITY = 6; + CATALOG_FEATURE_COLUMN_OPTION_ALIASES = 7; + CATALOG_FEATURE_ROW_DISPLAY_COLUMNS = 8; + CATALOG_FEATURE_VALIDATION = 9; + CATALOG_FEATURE_SCRIPTS = 10; + CATALOG_FEATURE_ADD_COLUMNS = 11; + CATALOG_FEATURE_REPLACE_DEFINITION = 12; + CATALOG_FEATURE_INDEXES = 13; + CATALOG_FEATURE_DELETE_TABLE = 14; } // Server-owned behavior for one logical column returned in table details. diff --git a/common/src/proto/descriptor.bin b/common/src/proto/descriptor.bin index 9e90e777f89454312f034892d6f0d2cf87e8b112..e50d4b008f6d68c182321d7842f9b5b122037b9d 100644 GIT binary patch delta 7979 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 diff --git a/common/src/proto/komp_ac.table_definition.rs b/common/src/proto/komp_ac.table_definition.rs index c14720dc..6c166b4c 100644 --- a/common/src/proto/komp_ac.table_definition.rs +++ b/common/src/proto/komp_ac.table_definition.rs @@ -693,6 +693,12 @@ pub struct TableDetail { /// True when module-owned storage supports catalog-managed rows and settings. #[prost(bool, tag = "14")] pub catalog_managed: bool, + /// Supported catalog operations, not user permissions or a guarantee that a + /// particular request is valid. Column restrictions, locks, existing data and + /// optimistic concurrency checks still apply. Unknown values must be ignored. + #[prost(enumeration = "CatalogFeature", repeated, tag = "15")] + #[serde(default)] + pub catalog_features: ::prost::alloc::vec::Vec, } /// Server-owned behavior for one logical column returned in table details. #[derive(serde::Serialize, serde::Deserialize)] @@ -1234,6 +1240,72 @@ impl ManagedTableKind { } } } +#[derive(serde::Serialize, serde::Deserialize)] +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] +#[repr(i32)] +pub enum CatalogFeature { + Unspecified = 0, + WriteRows = 1, + DeleteRows = 2, + ArchiveRows = 3, + ColumnPresentation = 4, + ColumnRequired = 5, + ColumnFormVisibility = 6, + ColumnOptionAliases = 7, + RowDisplayColumns = 8, + Validation = 9, + Scripts = 10, + AddColumns = 11, + ReplaceDefinition = 12, + Indexes = 13, + DeleteTable = 14, +} +impl CatalogFeature { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Self::Unspecified => "CATALOG_FEATURE_UNSPECIFIED", + Self::WriteRows => "CATALOG_FEATURE_WRITE_ROWS", + Self::DeleteRows => "CATALOG_FEATURE_DELETE_ROWS", + Self::ArchiveRows => "CATALOG_FEATURE_ARCHIVE_ROWS", + Self::ColumnPresentation => "CATALOG_FEATURE_COLUMN_PRESENTATION", + Self::ColumnRequired => "CATALOG_FEATURE_COLUMN_REQUIRED", + Self::ColumnFormVisibility => "CATALOG_FEATURE_COLUMN_FORM_VISIBILITY", + Self::ColumnOptionAliases => "CATALOG_FEATURE_COLUMN_OPTION_ALIASES", + Self::RowDisplayColumns => "CATALOG_FEATURE_ROW_DISPLAY_COLUMNS", + Self::Validation => "CATALOG_FEATURE_VALIDATION", + Self::Scripts => "CATALOG_FEATURE_SCRIPTS", + Self::AddColumns => "CATALOG_FEATURE_ADD_COLUMNS", + Self::ReplaceDefinition => "CATALOG_FEATURE_REPLACE_DEFINITION", + Self::Indexes => "CATALOG_FEATURE_INDEXES", + Self::DeleteTable => "CATALOG_FEATURE_DELETE_TABLE", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "CATALOG_FEATURE_UNSPECIFIED" => Some(Self::Unspecified), + "CATALOG_FEATURE_WRITE_ROWS" => Some(Self::WriteRows), + "CATALOG_FEATURE_DELETE_ROWS" => Some(Self::DeleteRows), + "CATALOG_FEATURE_ARCHIVE_ROWS" => Some(Self::ArchiveRows), + "CATALOG_FEATURE_COLUMN_PRESENTATION" => Some(Self::ColumnPresentation), + "CATALOG_FEATURE_COLUMN_REQUIRED" => Some(Self::ColumnRequired), + "CATALOG_FEATURE_COLUMN_FORM_VISIBILITY" => Some(Self::ColumnFormVisibility), + "CATALOG_FEATURE_COLUMN_OPTION_ALIASES" => Some(Self::ColumnOptionAliases), + "CATALOG_FEATURE_ROW_DISPLAY_COLUMNS" => Some(Self::RowDisplayColumns), + "CATALOG_FEATURE_VALIDATION" => Some(Self::Validation), + "CATALOG_FEATURE_SCRIPTS" => Some(Self::Scripts), + "CATALOG_FEATURE_ADD_COLUMNS" => Some(Self::AddColumns), + "CATALOG_FEATURE_REPLACE_DEFINITION" => Some(Self::ReplaceDefinition), + "CATALOG_FEATURE_INDEXES" => Some(Self::Indexes), + "CATALOG_FEATURE_DELETE_TABLE" => Some(Self::DeleteTable), + _ => None, + } + } +} /// How a column type is spelled in ColumnDefinition.field_type. #[derive(serde::Serialize, serde::Deserialize)] #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] diff --git a/server b/server index 5c98e443..8d7fba32 160000 --- a/server +++ b/server @@ -1 +1 @@ -Subproject commit 5c98e443a2685b2e2b128129f30896121809fab7 +Subproject commit 8d7fba32ddc2aee4d164931708cbf026b47514b0 diff --git a/tui-pages b/tui-pages index ce4bc49f..2e784b63 160000 --- a/tui-pages +++ b/tui-pages @@ -1 +1 @@ -Subproject commit ce4bc49fa64225c8cc3ded9ce9c2e8e68cc32254 +Subproject commit 2e784b636e3df885b31dab802c046f525f22b512