Skip to content

Commit f2a930d

Browse files
committed
fix: use custom readonly if no target attribute
1 parent 0048e17 commit f2a930d

File tree

5 files changed

+65
-12
lines changed

5 files changed

+65
-12
lines changed

packages/pluggableWidgets/combobox-web/src/Combobox.editorConfig.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ const ASSOCIATION_SOURCE_CONFIG: Array<keyof ComboboxPreviewProps> = [
3636
];
3737

3838
export function getProperties(values: ComboboxPreviewProps, defaultProperties: Properties): Properties {
39+
if (values.source !== "database") {
40+
hidePropertiesIn(defaultProperties, values, ["customEditability", "customEditabilityExpression"]);
41+
}
42+
3943
if (values.source === "context") {
4044
hidePropertiesIn(defaultProperties, values, [
4145
"staticAttribute",
@@ -129,6 +133,13 @@ export function getProperties(values: ComboboxPreviewProps, defaultProperties: P
129133
}
130134
if (values.databaseAttributeString.length === 0) {
131135
hidePropertiesIn(defaultProperties, values, ["optionsSourceDatabaseValueAttribute"]);
136+
// @ts-expect-error ignore error due to the Editability is part of system properties
137+
hidePropertiesIn(defaultProperties, values, ["Editability"]);
138+
if (values.customEditability !== "conditionally") {
139+
hidePropertiesIn(defaultProperties, values, ["customEditabilityExpression"]);
140+
}
141+
} else {
142+
hidePropertiesIn(defaultProperties, values, ["customEditability", "customEditabilityExpression"]);
132143
}
133144
} else if (values.source === "static") {
134145
hidePropertiesIn(defaultProperties, values, [

packages/pluggableWidgets/combobox-web/src/Combobox.xml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,20 @@
286286
</propertyGroup>
287287
<propertyGroup caption="Editability">
288288
<systemProperty key="Editability" />
289+
<property key="customEditability" type="enumeration" defaultValue="default">
290+
<caption>Editable</caption>
291+
<description />
292+
<enumerationValues>
293+
<enumerationValue key="default">Default</enumerationValue>
294+
<enumerationValue key="never">Never</enumerationValue>
295+
<enumerationValue key="conditionally">Conditionally</enumerationValue>
296+
</enumerationValues>
297+
</property>
298+
<property key="customEditabilityExpression" type="expression" defaultValue="false">
299+
<caption>Condition</caption>
300+
<description />
301+
<returnType type="Boolean" />
302+
</property>
289303
<property key="readOnlyStyle" type="enumeration" defaultValue="text">
290304
<caption>Read-only style</caption>
291305
<description>How the combo box will appear in read-only mode.</description>

packages/pluggableWidgets/combobox-web/src/helpers/Database/DatabaseSingleSelectionSelector.ts

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { _valuesIsEqual } from "../utils";
1010
import { DatabaseCaptionsProvider } from "./DatabaseCaptionsProvider";
1111
import { DatabaseOptionsProvider } from "./DatabaseOptionsProvider";
1212
import { DatabaseValuesProvider } from "./DatabaseValuesProvider";
13-
import { extractDatabaseProps } from "./utils";
13+
import { extractDatabaseProps, getReadonly } from "./utils";
1414

1515
export class DatabaseSingleSelectionSelector<T extends string | Big, R extends EditableValue<T>>
1616
implements SingleSelector
@@ -59,15 +59,11 @@ export class DatabaseSingleSelectionSelector<T extends string | Big, R extends E
5959
return;
6060
}
6161
this._attr = targetAttribute as R;
62-
62+
this.readOnly = getReadonly(targetAttribute, props.customEditability, props.customEditabilityExpression);
63+
console.log("readOnly", this.readOnly);
6364
this.lazyLoader.updateProps(ds);
6465
this.lazyLoader.setLimit(
65-
this.lazyLoader.getLimit(
66-
ds.limit,
67-
targetAttribute?.readOnly ?? false,
68-
targetAttribute?.status ?? ds.status,
69-
lazyLoading
70-
)
66+
this.lazyLoader.getLimit(ds.limit, this.readOnly, targetAttribute?.status ?? ds.status, lazyLoading)
7167
);
7268

7369
this.caption.updateProps({
@@ -116,7 +112,7 @@ export class DatabaseSingleSelectionSelector<T extends string | Big, R extends E
116112
}
117113
}
118114
}
119-
this.readOnly = targetAttribute?.readOnly ?? false;
115+
120116
this.status = targetAttribute?.status ?? ds.status;
121117
this.validation = targetAttribute?.validation;
122118
this.selection = props.optionsSourceDatabaseItemSelection as SelectionSingleValue;

packages/pluggableWidgets/combobox-web/src/helpers/Database/utils.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,3 +86,20 @@ export function extractDatabaseProps(props: ComboboxContainerProps): ExtractionR
8686
valueSourceAttribute
8787
};
8888
}
89+
90+
export function getReadonly(
91+
targetAttribute: EditableValue<string | Big> | undefined,
92+
customEditability: ComboboxContainerProps["customEditability"],
93+
customEditabilityExpression: ComboboxContainerProps["customEditabilityExpression"]
94+
): boolean {
95+
if (targetAttribute) {
96+
return targetAttribute.readOnly;
97+
}
98+
if (customEditability === "never") {
99+
return true;
100+
}
101+
if (customEditability === "conditionally") {
102+
return customEditabilityExpression.value ?? false;
103+
}
104+
return false;
105+
}

packages/pluggableWidgets/combobox-web/typings/ComboboxProps.d.ts

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ export type SelectionMethodEnum = "checkbox" | "rowclick";
3131

3232
export type SelectedItemsStyleEnum = "text" | "boxes";
3333

34+
export type CustomEditabilityEnum = "default" | "never" | "conditionally";
35+
3436
export type ReadOnlyStyleEnum = "bordered" | "text";
3537

3638
export type LoadingTypeEnum = "spinner" | "skeleton";
@@ -41,7 +43,10 @@ export type FilterTypeEnum = "contains" | "containsExact" | "startsWith" | "none
4143

4244
export interface OptionsSourceStaticDataSourcePreviewType {
4345
staticDataSourceValue: string;
44-
staticDataSourceCustomContent: { widgetCount: number; renderer: ComponentType<{ children: ReactNode; caption?: string }> };
46+
staticDataSourceCustomContent: {
47+
widgetCount: number;
48+
renderer: ComponentType<{ children: ReactNode; caption?: string }>;
49+
};
4550
staticDataSourceCaption: string;
4651
}
4752

@@ -81,6 +86,8 @@ export interface ComboboxContainerProps {
8186
selectedItemsStyle: SelectedItemsStyleEnum;
8287
selectAllButton: boolean;
8388
selectAllButtonCaption: DynamicValue<string>;
89+
customEditability: CustomEditabilityEnum;
90+
customEditabilityExpression: DynamicValue<boolean>;
8491
readOnlyStyle: ReadOnlyStyleEnum;
8592
onChangeEvent?: ActionValue;
8693
onEnterEvent?: ActionValue;
@@ -123,16 +130,24 @@ export interface ComboboxPreviewProps {
123130
noOptionsText: string;
124131
clearable: boolean;
125132
optionsSourceAssociationCustomContentType: OptionsSourceAssociationCustomContentTypeEnum;
126-
optionsSourceAssociationCustomContent: { widgetCount: number; renderer: ComponentType<{ children: ReactNode; caption?: string }> };
133+
optionsSourceAssociationCustomContent: {
134+
widgetCount: number;
135+
renderer: ComponentType<{ children: ReactNode; caption?: string }>;
136+
};
127137
optionsSourceDatabaseCustomContentType: OptionsSourceDatabaseCustomContentTypeEnum;
128-
optionsSourceDatabaseCustomContent: { widgetCount: number; renderer: ComponentType<{ children: ReactNode; caption?: string }> };
138+
optionsSourceDatabaseCustomContent: {
139+
widgetCount: number;
140+
renderer: ComponentType<{ children: ReactNode; caption?: string }>;
141+
};
129142
staticDataSourceCustomContentType: StaticDataSourceCustomContentTypeEnum;
130143
showFooter: boolean;
131144
menuFooterContent: { widgetCount: number; renderer: ComponentType<{ children: ReactNode; caption?: string }> };
132145
selectionMethod: SelectionMethodEnum;
133146
selectedItemsStyle: SelectedItemsStyleEnum;
134147
selectAllButton: boolean;
135148
selectAllButtonCaption: string;
149+
customEditability: CustomEditabilityEnum;
150+
customEditabilityExpression: string;
136151
readOnlyStyle: ReadOnlyStyleEnum;
137152
onChangeEvent: {} | null;
138153
onChangeDatabaseEvent: {} | null;

0 commit comments

Comments
 (0)