Skip to content

Commit 4d468f9

Browse files
authored
Merge pull request mendix#10751 from stdagkalakis/wtf/WTF-2552-file-image-props-upload
[WTF-2552] Update docs with file and image props with upload capabilities
2 parents 5703786 + c31fa93 commit 4d468f9

2 files changed

Lines changed: 87 additions & 22 deletions

File tree

content/en/docs/apidocs-mxsdk/apidocs/studio-pro-11/pluggable-widgets/pluggable-widgets-client-apis/_index.md

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ Though the type definition above looks complex, it is fairly simply to use becau
121121

122122
### EditableValue {#editable-value}
123123

124-
`EditableValue` is used to represent values, either an attribute or a variable, that can be changed by a pluggable widget client component and is passed only to [attribute properties](/apidocs-mxsdk/apidocs/pluggable-widgets-property-types/#attribute). It is defined as follows:
124+
`EditableValue` is used to represent a value (either an attribute or a variable) that can be changed by a pluggable widget client component and is passed only to [attribute properties](/apidocs-mxsdk/apidocs/pluggable-widgets-property-types/#attribute). It is defined as follows:
125125

126126
```ts
127127
export interface EditableValue<T extends AttributeValue> {
@@ -145,22 +145,67 @@ export interface EditableValue<T extends AttributeValue> {
145145

146146
A component will receive `EditableValue<X>` where `X` depends on the configured `attributeType`.
147147

148-
`status` is similar to one exposed for `DynamicValue`. It indicates if the value's loading has finished and if loading was successful. Similarly to `DynamicValue`, `EditableValue` keeps returning the previous `value` when `status` changes from `Available` to `Loading` to help a widget avoid flickering.
148+
`status` is similar to the one exposed for `DynamicValue`. It indicates if the value's loading has finished, and if loading was successful. Similarly to `DynamicValue`, `EditableValue` keeps returning the previous `value` when `status` changes from `Available` to `Loading` to help a widget avoid flickering.
149149

150150
The flag `readOnly` indicates whether a value can actually be edited. It will be true, for example, when a widget is placed inside a Data view that is not [editable](/refguide/data-view/#editable), or when a selected attribute is not editable due to [access rules](/refguide/access-rules/). The `readOnly` flag is always true when a `status` is not `ValueStatus.Available`. Any attempt to edit a value set to read-only will have no affect and incur a debug-level warning message.
151151

152152
The value can be read from the `value` field and modified using `setValue` function. Note that `setValue` returns nothing and does not guarantee that the value is changed synchronously. But when a change is propagated, a component receives a new prop reflecting the change.
153153

154-
When setting a value, a new value might not satisfy certain validation rules — for example when an attribute is selected and the new value is bigger than the underlying attribute allows. In this case, your change will affect only `value` and `displayValue` received through a prop. Your change will not be propagated to an object’s attribute and will not be visible outside of your component. The component will also receive a validation error text through the `validation` field of `EditableValue`.
154+
When setting a value, a new value might not satisfy certain validation rules — for example, when an attribute is selected and the new value is bigger than the underlying attribute allows. In this case, your change will affect only `value` and `displayValue` received through a prop. Your change will not be propagated to an object’s attribute and will not be visible outside of your component. The component will also receive a validation error text through the `validation` field of `EditableValue`.
155155

156-
It is possible for a component to extend the defined set of validation rules. A new validator a function that checks a passed value and returns a validation message string if any can be provided through the `setValidator` function. A component can have only a single custom validator. The Mendix Platform ensures that custom validators are run whenever necessary, for example when a page is being saved by an end-user. It is best practice to call `setValidator` early in a component's lifecycle — specifically in the [componentDidMount](https://en.reactjs.org/docs/react-component.html#componentdidmount) function.
156+
It is possible for a component to extend the defined set of validation rules. A new validator (a function that checks a passed value and returns a validation message string if any) can be provided through the `setValidator` function. A component can have only a single custom validator. The Mendix Platform ensures that custom validators are run whenever necessary, for example when a page is being saved by an end-user. It is best practice to call `setValidator` early in a component's lifecycle — specifically in the [componentDidMount](https://en.reactjs.org/docs/react-component.html#componentdidmount) function.
157157

158-
In practice, many client components present values as nicely formatted strings which take locale-specific settings into account. To facilitate such cases `EditableValue` exposes a field `displayValue` which is the formatted version of `value`, and a method `setTextValue` a version of `setValue` that takes care of parsing. `setTextValue` also validates that a passed value can be parsed and assigned to the target's value type. Similarly to `setValue`, a change to an invalid value will not be propagated further than the prop itself, but a `validation` is reported. Note that if a value cannot be parsed, the prop will contain only a `displayValue` string and `value` will become undefined.
158+
In practice, many client components present values as nicely formatted strings which take locale-specific settings into account. To facilitate such cases, `EditableValue` exposes a field `displayValue` (which is the formatted version of `value`), and a method `setTextValue` (a version of `setValue` that takes care of parsing). `setTextValue` also validates that a passed value can be parsed and assigned to the target's value type. Similarly to `setValue`, a change to an invalid value will not be propagated further than the prop itself, but a `validation` is reported. Note that if a value cannot be parsed, the prop will contain only a `displayValue` string and `value` will become undefined.
159159

160160
There is a way to use more the convenient `displayValue` and `setTextValue` while retaining control over the format. A component can use a `setFormatter` method passing a formatter object: an object with `format` and `parse` methods. The Mendix Platform provides a convenient way of creating such objects for simple cases. An existing formatter exposed using a `EditableValue.formatter` field can be modified using its `withConfig` method. For complex cases formatters still can be created manually. A formatter can be reset back to default settings by calling `setFormatter(undefined)`.
161161

162162
The optional field `universe` is used to indicate the set of all possible values that can be passed to a `setValue` if a set is limited. Currently, `universe` is provided only when the edited value is of the Boolean or enumeration [types](/refguide/attributes/#type).
163163

164+
### EditableFileValue {#editable-file-value}
165+
166+
`EditableFileValue` is used to represent file values, that can be changed by a pluggable widget client component and is passed only to [file](/apidocs-mxsdk/apidocs/pluggable-widgets-property-types/#file). It is defined as follows:
167+
168+
```ts
169+
export interface EditableFileValue<T = FileValue> {
170+
readonly status: ValueStatus;
171+
readonly readOnly: boolean;
172+
173+
readonly validation: Option<string>;
174+
setValidator: (validator?: (value: Option<T>) => Option<string>) => void;
175+
176+
readonly value: Option<T>;
177+
setValue: (value: Option<T>) => void;
178+
}
179+
```
180+
181+
Member `status` is similar to one exposed for `DynamicValue`. It indicates if the value's loading has finished and if loading was successful. Similarly to `DynamicValue`, `EditableFileValue` keeps returning the previous `value` when `status` changes from `Available` to `Loading` to help a widget avoid flickering.
182+
183+
The flag `readOnly` indicates whether a value can actually be edited. The `readOnly` flag is always true when a `status` is not `ValueStatus.Available`. Any attempt to edit a value set to read-only will have no affect and incur a debug-level warning message.
184+
185+
The value can be read from the `value` field and modified using `setValue` function. Note that `setValue` returns nothing and does not guarantee that the value is changed synchronously. But when a change is propagated, a component receives a new prop reflecting the change.
186+
187+
When setting a value, a new value might not satisfy certain validation rules — for example when a file is selected and the new value is bigger than the underlying file allows, or the file type is not allowed. In this case, your change will affect only `value` received through a prop. Your change will not be propagated to an object and will not be visible outside of youAllowUpload (Optional)
188+
189+
This component. The component will also receive a validation error text through the `validation` field of `EditableFileValue`.
190+
191+
It is possible for a component to extend the defined set of validation rules. A new validator — a function that checks a passed value and returns a validation message string if any — can be provided through the `setValidator` function. A component can have only a single custom validator. The Mendix Platform ensures that custom validators are run whenever necessary, for example when a page is being saved by an end-user. It is best practice to call `setValidator` early in a component's lifecycle — specifically in the [componentDidMount](https://en.reactjs.org/docs/react-component.html#componentdidmount) function.
192+
193+
### EditableImageValue {#editable-image-value}
194+
195+
`EditableImageValue` is used to represent image values, that can be changed by a pluggable widget client component and is passed only to [image](/apidocs-mxsdk/apidocs/pluggable-widgets-property-types/#image). It acts as an extension of [EditableFileValue](#editable-file-value) it is defined as follows:
196+
197+
```ts
198+
export interface EditableImageValue<T extends ImageValue> extends EditableFileValue<T> {
199+
setThumbnailSize: (width: Option<number>, height: Option<number>) => void;
200+
}
201+
```
202+
203+
`EditableImageValue` provides upload capabilities to [`ImageValue`](#imagevalue), similarly to how [`EditableFileValue`](#editable-file-value) for [`FileValue`](#filevalue). Also it adds `setThumbnailSize` method which enables a component to request the Mendix Platform to return an image with specific dimensions. The Mendix Platform will take care of resizing the image while keeping the aspect ratio intact. When a thumbnail size is set, the `value` field of `EditableImageValue` will contain a resized image. When a thumbnail size is not set, the `value` field will contain an original image.
204+
205+
{{% alert color="warning" %}}
206+
`EditableImageValue` does not support `NativeImage`.
207+
{{% /alert %}}
208+
164209
### ModifiableValue {#modifiable-value}
165210

166211
`ModifiableValue` is used to represent values that can be changed by a pluggable widget client component. It is passed only to [association properties](/apidocs-mxsdk/apidocs/pluggable-widgets-property-types/#association), and is defined as follows:

content/en/docs/apidocs-mxsdk/apidocs/studio-pro-11/pluggable-widgets/pluggable-widgets-property-types.md

Lines changed: 37 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,17 @@ The common structure of a property definition is as follows:
2626

2727
This defines the prop `key` in the client component props which are supplied to the widget client component. Each property must have a unique `key` which can contain letters of all cases, digits, or underscores. However, a `key` attribute cannot *start* with a digit.
2828

29-
#### Type (required)
29+
#### AllowUpload (Optional) {#allow-upload}
30+
31+
This optional attribute applies only to [file](#file) and [image](#image) properties and determines whether users can upload and edit files. When set to the default value of `false`, properties use the legacy read-only behavior. Setting it to `true` unlocks upload and edit capabilities by passing `EditableFileValue<FileValue>` and `EditableImageValue<ImageValue>` types, as props to a client component.
32+
33+
{{% alert color="warning" %}} Legacy DynamicValue types for file and image properties are deprecated and will be removed at Mendix 12. Use allowUpload="true" to migrate to the new editable types before Mendix 12. {{% /alert %}}
34+
35+
Be aware of behavioral differences between the legacy read-only mode (`false`) and the new editable mode (`true`).
36+
37+
{{% alert color="info" %}} Editable types are not supported for Native as of now. {{% /alert %}}
38+
39+
#### Type (Required)
3040

3141
This defines a property's type. A `type` must be one of the following:
3242

@@ -257,26 +267,29 @@ Then the Studio Pro UI for the component appears like this:
257267

258268
### Image {#image}
259269

260-
Image allows a user to configure a static image from an [image collection](/refguide/image-collection/). It also allows a user to configure an image from an object that is a specialization of **System.Image**. It is passed as an `DynamicValue<ImageValue>` prop to a client component (for more information, see the [ImageValue](/apidocs-mxsdk/apidocs/pluggable-widgets-client-apis/#imagevalue) section of *Client APIs Available to Pluggable Widgets*). See the [Images Reference Guide](/refguide/images/) for more information about supported image formats.
270+
Image allows a user to configure an image from an object that is a specialization of **System.Image**. It is passed as an [`EditableImageValue<ImageValue>`](/apidocs-mxsdk/apidocs/pluggable-widgets-client-apis/#editable-image-value) prop to a client component. For more information about supported image formats, see the [Images Reference Guide](/refguide/images/).
261271

262-
{{% alert color="warning" %}}
263-
GIF images are not supported in native mobile apps on Android devices.
264-
{{% /alert %}}
272+
The user can use the optional attribute [`allowUpload`](#allow-upload) with default value `false` to use the legacy [`Dynamic<FileValue>`](/apidocs-mxsdk/apidocs/pluggable-widgets-client-apis/#filevalue) prop. Beware of behavioral differences based on the `allowUpload` attribute.
273+
274+
{{% alert color="warning" %}} Legacy DynamicValue types for file and image properties are deprecated and will be removed at Mendix 12. Use allowUpload="true" to migrate to the new editable types before Mendix 12. {{% /alert %}}
275+
276+
{{% alert color="info" %}} Editable types are not supported for Native as of now. {{% /alert %}}
265277

266278
#### XML Attributes
267279

268-
| Attribute | Required | Attribute Type | Description |
269-
|------------|----------|----------------|-----------------------------------------------------------------------|
270-
| `type` | Yes | String | Must be `image` |
271-
| `key` | Yes | String | See [key](#key) |
272-
| `required` | No | Boolean | Whether the property must be specified by the user, `true` by default |
280+
| Attribute | Required | Attribute Type | Description |
281+
|---------------|----------|----------------|-----------------------------------------------------------------------|
282+
| `type` | Yes | String | Must be `image` |
283+
| `key` | Yes | String | See [key](#key) |
284+
| `required` | No | Boolean | Whether the property must be specified by the user, `true` by default |
285+
| `allowUpload` | No | Boolean | See [allowUpload](#allow-upload) |
273286

274287
#### Studio Pro UI
275288

276289
When the component is defined as follows:
277290

278291
```xml
279-
<property key="bgImage" type="image" required="false">
292+
<property key="bgImage" type="image" required="false" allowUpload="true" >
280293
<caption>Background Image</caption>
281294
<description>Image shown blurred in a background</description>
282295
</property>
@@ -699,22 +712,29 @@ Then the Studio Pro UI for the property appears like this:
699712

700713
### File {#file}
701714

702-
The file property type allows a user to configure a file from an object that is a specialization of **System.File**. It is passed as a [`DynamicValue<FileValue>`](/apidocs-mxsdk/apidocs/pluggable-widgets-client-apis/#filevalue) prop to a client component.
715+
The file property type allows a user to configure and edit a file from and to an object that is a specialization of **System.File**. It is passed as a [`EditableFileValue<FileValue>`](/apidocs-mxsdk/apidocs/pluggable-widgets-client-apis/#editable-file-value) prop to a client component.
716+
717+
The user can use the optional attribute [`allowUpload`](#allow-upload) with default value `false` to use the legacy [`Dynamic<FileValue>`](/apidocs-mxsdk/apidocs/pluggable-widgets-client-apis/#filevalue) prop. Beware of behavioral differences based on the `allowUpload` attribute.
718+
719+
{{% alert color="warning" %}} Legacy DynamicValue types for file and image properties are deprecated and will be removed at Mendix 12. Use allowUpload="true" to migrate to the new editable types before Mendix 12. {{% /alert %}}
720+
721+
{{% alert color="info" %}} Editable types are not supported for Native as of now. {{% /alert %}}
703722

704723
#### XML Attributes
705724

706-
| Attribute | Required | Attribute Type | Description |
707-
|-----------|----------|----------------|-----------------|
708-
| `type` | Yes | String | Must be `file` |
709-
| `key` | Yes | String | See [key](#key) |
725+
| Attribute | Required | Attribute Type | Description |
726+
|---------------|----------|----------------|----------------------------------|
727+
| `type` | Yes | String | Must be `file` |
728+
| `key` | Yes | String | See [key](#key) |
729+
| `allowUpload` | No | Boolean | See [allowUpload](#allow-upload) |
710730

711731
#### Studio Pro UI
712732

713733
When the property is defined as follows:
714734

715735
```xml
716736

717-
<property key="file" type="file" required="false">
737+
<property key="file" type="file" required="false" allowUpload="true">
718738
<caption>File</caption>
719739
<description>Sample text file</description>
720740
</property>

0 commit comments

Comments
 (0)