UNPKG

@arcgis/core

Version:

ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API

284 lines (281 loc) • 18.2 kB
import type Graphic from "../../Graphic.js"; import type EsriMap from "../../Map.js"; import type Collection from "../../core/Collection.js"; import type BatchFormInputs from "./inputs/BatchFormInputs.js"; import type FieldInput from "./inputs/FieldInput.js"; import type { EventedAccessor } from "../../core/Evented.js"; import type { FieldValue } from "../../layers/support/fieldUtils.js"; import type { TimeZone } from "../../time/types.js"; import type { AttributeFormSupportedLayerInfo, AttributeFormSupportedLayerUnion, BatchAttributeFormMode, BatchAttributeFormState, ValueChangeEvent, SubmitEvent } from "./types.js"; import type { FormInput } from "./inputs/types.js"; import type { EditType } from "../support/forms/types.js"; export interface BatchAttributeFormViewModelProperties extends Partial<Pick<BatchAttributeFormViewModel, "activeFeatureIndex" | "disabled" | "editType" | "features" | "layerInfos" | "map" | "readOnly" | "submitHasBeenAttempted" | "timeZone" | "userHasChangedValues">> {} export interface BatchAttributeFormViewModelEvents { /** * Fires when field values are updated. * * @example * form.on("value-change", (event) => { * const result = {}; * for (const feature of form.features) { * const value = form.viewModel.getValues(feature)[event.fieldName]; * result[feature.getObjectId()] = typeof value === "number" ? new Date(value).toISOString() : value; * } * console.log(`Values for field ${event.fieldName}`, result); * }); */ "value-change": ValueChangeEvent; /** Fires when the [BatchAttributeForm.submit()](https://developers.arcgis.com/javascript/latest/references/core/widgets/BatchAttributeForm/#submit) method is called. */ submit: SubmitEvent; } /** * Provides the logic for the [BatchAttributeForm](https://developers.arcgis.com/javascript/latest/references/core/widgets/BatchAttributeForm/) widget. * * > [!WARNING] * > * > **Known Limitations** * > * > Currently, [relationship elements](https://developers.arcgis.com/javascript/latest/references/core/form/elements/RelationshipElement/) and [associations elements](https://developers.arcgis.com/javascript/latest/references/core/form/elements/UtilityNetworkAssociationsElement/) are not supported within the [BatchAttributeForm](https://developers.arcgis.com/javascript/latest/references/core/widgets/BatchAttributeForm/) widget. Users can individually edit related records and association fields using the [FeatureForm](https://developers.arcgis.com/javascript/latest/references/core/widgets/FeatureForm/) widget. * * @since 4.33 * @see [Editor](https://developers.arcgis.com/javascript/latest/references/core/widgets/Editor/) * @see [BatchAttributeForm](https://developers.arcgis.com/javascript/latest/references/core/widgets/BatchAttributeForm/) * @example * let batchAttributeForm = new BatchAttributeForm({ * viewModel: { // Autocasts as new BatchAttributeFormViewModel() * map: map, // Required if using Arcade expressions that use the global $map variable * features: featureCollection, * }, * container: "formDiv" * }); */ export default class BatchAttributeFormViewModel extends EventedAccessor { /** * @deprecated * Do not directly reference this property. * Use EventNames and EventTypes helpers from \@arcgis/core/Evented */ "@eventTypes": BatchAttributeFormViewModelEvents; constructor(properties?: BatchAttributeFormViewModelProperties); /** The active feature in the form, which is the feature that is currently being edited while in `single`[mode](https://developers.arcgis.com/javascript/latest/references/core/widgets/BatchAttributeForm/BatchAttributeFormViewModel/#mode). If the `mode` is `batch`, this property will be `null`. */ get activeFeature(): Graphic | null | undefined; /** * The index of the active feature that is currently being edited. This will be `-1` when [mode](https://developers.arcgis.com/javascript/latest/references/core/widgets/BatchAttributeForm/BatchAttributeFormViewModel/#mode) is `batch`. * To enter `single` mode, set this property to the index in the [features](https://developers.arcgis.com/javascript/latest/references/core/widgets/BatchAttributeForm/BatchAttributeFormViewModel/#features) array of the feature you wish to edit individually. To enter `batch` mode, set this property to `-1`. * * @default -1 */ accessor activeFeatureIndex: number; /** * Returns the [batch attribute form inputs](https://developers.arcgis.com/javascript/latest/references/core/widgets/BatchAttributeForm/inputs/BatchFormInputs/) that are currently being edited. This is * dependent on the form's [mode](https://developers.arcgis.com/javascript/latest/references/core/widgets/BatchAttributeForm/BatchAttributeFormViewModel/#mode). If the [mode](https://developers.arcgis.com/javascript/latest/references/core/widgets/BatchAttributeForm/BatchAttributeFormViewModel/#mode) is * `batch`, it returns the [shared form](https://developers.arcgis.com/javascript/latest/references/core/widgets/BatchAttributeForm/BatchAttributeFormViewModel/#sharedForm) inputs. If `single`, it * returns the form inputs for the [active feature](https://developers.arcgis.com/javascript/latest/references/core/widgets/BatchAttributeForm/BatchAttributeFormViewModel/#activeFeature). * This property is read-only and should not be modified directly. * To change which form is active, see [activeFeatureIndex](https://developers.arcgis.com/javascript/latest/references/core/widgets/BatchAttributeForm/BatchAttributeFormViewModel/#activeFeatureIndex). */ get activeForm(): BatchFormInputs; /** * Indicates whether the form is currently evaluating [Arcade expressions](https://developers.arcgis.com/javascript/latest/arcade/). It returns `true` when the form is evaluating expressions or when it is waiting for a response from the server. * * @see [Arcade Form Constraint profile](https://developers.arcgis.com/arcade/profiles/form-constraint/) * @see [Arcade Form Calculation - profile variables](https://developers.arcgis.com/arcade/profiles/form-calculation/#profile-variables) */ get calculating(): boolean; /** * Indicates whether the associated view should be in `read-only` mode. * When `true`, the associated view should display the form in a read-only * mode, disabling any editing. * * @default false */ accessor disabled: boolean; /** * Specifies the type of edit operation being performed by the form (for example, add, update, or delete). * This property can affect whether certain fields are editable, depending on the layer's capabilities. * Its value is also used for the `$editcontext.editType` variable in Arcade expressions. * The value "NA" is always permitted when checking if a layer supports the current edit type. * * @default "NA" * @see [Arcade Form Calculation - profile variables](https://developers.arcgis.com/arcade/profiles/form-calculation/#profile-variables) */ accessor editType: EditType; /** * Indicates whether any of the Arcade expressions in the form have * failed to evaluate. * * @see [Arcade expressions](https://developers.arcgis.com/javascript/latest/arcade/) */ get expressionEvaluationFailed(): boolean; /** * The set of features whose attributes are being edited by the form. * This collection is intended to be immutable: do not add, remove, or reorder features in place, as this may cause unexpected behavior. * To update the features, assign a new collection to this property. Doing so will regenerate the form inputs and discard any unsaved changes. */ accessor features: Collection<Graphic>; /** Indicates whether the form cannot load because there are too many features whose forms have complex [Arcade](https://developers.arcgis.com/javascript/latest/arcade/) expressions. These are expressions that that involve advanced logic, calculations, or asynchronous operations, such as accessing data from other layers, performing network requests, or using functions that require waiting for a response. These expressions go beyond simple field value lookups or basic calculations. */ get hasTooManyComplexFeatures(): boolean; /** Indicates whether the form has too many features to be loaded. */ get hasTooManyFeatures(): boolean; /** * Indicates whether there are any visible inputs in the form. * This is `true` if there are any inputs that are visible to the user, meaning they are not hidden by a visibility expression or group visibility expression. */ get hasVisibleInputs(): boolean; /** Returns an array of features that are invalid, meaning they have at least one invalid attribute value. */ get invalidFeatures(): Graphic[]; /** * An array of objects containing a [FormTemplate](https://developers.arcgis.com/javascript/latest/references/core/form/FormTemplate/) and its corresponding layer. * This allows per-layer overrides which provides a [FormTemplate](https://developers.arcgis.com/javascript/latest/references/core/form/FormTemplate/) for building batch form templates. The `formTemplate` defined here overrides any `formTemplate` defined on the layer itself. Otherwise, the layer's own `formTemplate` is used if it exists. * * @example * // Query for features * const { features } = await featureLayer.queryFeatures(); * * // Initialize BatchAttributeFormViewModel * const batchAttributeFormViewModel = new BatchAttributeFormViewModel({ * features: features, * layerInfos: [{ * layer: featureLayer, * formTemplate: { // autocasts to FormTemplate * elements: [ * { // autocasts to FieldElement * type: "field", * fieldName: "fulladdr", * label: "Full Address" * } * ] * }, * }] * }); */ accessor layerInfos: AttributeFormSupportedLayerInfo[] | null | undefined; /** * An array of layers included in the batch attribute form. Each layer must support feature editing and field access. * * The following layer types are supported: * - [FeatureLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/) * - [GeoJSONLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/GeoJSONLayer/) * - [SceneLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/SceneLayer/) (with `featureLayer` property) * - [SubtypeSublayer](https://developers.arcgis.com/javascript/latest/references/core/layers/support/SubtypeSublayer/) * - [OrientedImageryLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/OrientedImageryLayer/) * - [KnowledgeGraphSublayer](https://developers.arcgis.com/javascript/latest/references/core/layers/knowledgeGraph/KnowledgeGraphSublayer/) */ get layers(): AttributeFormSupportedLayerUnion[]; /** * A reference to the associated [Map](https://developers.arcgis.com/javascript/latest/references/core/Map/). * * > [!WARNING] * > * > This property is required if working with [Arcade expressions](https://developers.arcgis.com/javascript/latest/arcade/) in the `BatchAttributeForm` that make use of the `$map` global variable. */ accessor map: EsriMap | null | undefined; /** * The mode of the form, which can be either `"single"` or `"batch"`. * In `"single"` mode, the form is editing a single feature at a time, while in * `"batch"` mode, it is editing all of the features in the [features](https://developers.arcgis.com/javascript/latest/references/core/widgets/BatchAttributeForm/BatchAttributeFormViewModel/#features) collection. To change the mode, set the [activeFeatureIndex](https://developers.arcgis.com/javascript/latest/references/core/widgets/BatchAttributeForm/BatchAttributeFormViewModel/#activeFeatureIndex) property. */ get mode(): BatchAttributeFormMode; /** * Indicates whether the form is in a read-only state. When `true`, the user * cannot modify any attribute values in the form. This is different from * [disabled](https://developers.arcgis.com/javascript/latest/references/core/widgets/BatchAttributeForm/BatchAttributeFormViewModel/#disabled), which indicates whether the entire form is * disabled, including any UI controls. * * @default false */ accessor readOnly: boolean; /** The set of form inputs used in `batch` editing [mode](https://developers.arcgis.com/javascript/latest/references/core/widgets/BatchAttributeForm/BatchAttributeFormViewModel/#mode). */ get sharedForm(): BatchFormInputs; /** * Indicates whether the view model is ready to be used. Upon construction, * and then again any time the `features` Collection is modified or * re-assigned, the view model must perform certain asynchronous tasks in * order to compile the shared attribute form. Use the `status` property to * determine when this processing occurs. * * Value | Description * ------|------------ * not-loaded | The [features](https://developers.arcgis.com/javascript/latest/references/core/widgets/BatchAttributeForm/BatchAttributeFormViewModel/#features) property has not been initialized or is an empty [Collection](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/). * loading | The [features](https://developers.arcgis.com/javascript/latest/references/core/widgets/BatchAttributeForm/BatchAttributeFormViewModel/#features) property has been set or modified, and the view model is compiling the shared form. Certain properties, like [activeForm](https://developers.arcgis.com/javascript/latest/references/core/widgets/BatchAttributeForm/BatchAttributeFormViewModel/#activeForm), should not be accessed yet. * loaded | The view model is ready to use. * failed | An error occurred while compiling the shared form. */ get status(): BatchAttributeFormState; /** * Indicates whether the user has attempted to submit the form. * * @default false */ accessor submitHasBeenAttempted: boolean; /** * The time zone used to interpret date values in the form. If this property is `null` or set to `"unknown"`, date values are displayed in the time zone specified by the layer's [FeatureLayer.preferredTimeZone](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/#preferredTimeZone). If none is provided there, date values are interpreted in UTC. * * @see [FeatureLayer.preferredTimeZone](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/#preferredTimeZone) * @see [View2D.timeZone](https://developers.arcgis.com/javascript/latest/references/core/views/View2D/#timeZone) */ accessor timeZone: TimeZone | null | undefined; /** * Indicates whether the form is updating or calculating expressions. * * @see [Arcade expressions](https://developers.arcgis.com/javascript/latest/arcade/). */ get updating(): boolean; /** * Indicates whether any values, for any features, have been modified by the * user. This property does not take into account changes to attribute values * that resulted from [calculated value expressions](https://developers.arcgis.com/javascript/latest/references/core/form/elements/FieldElement/#valueExpression). * * @default false */ accessor userHasChangedValues: boolean; /** Returns true if all fields for all features in the form are valid, with no validation errors present. */ get valid(): boolean; /** * An array of inputs in the active form that are currently visible to the user. * This array includes only those inputs that are not hidden by visibility settings or expressions. */ get visibleInputs(): FormInput[]; /** * Finds the field input with the specified `elementId` in the active form. * * @param elementId - The elementId of the input field to find. * @returns Returns an instance of the FieldInput. */ findFieldInput(elementId: string | null | undefined): FieldInput | null | undefined; /** * Gets the updated value for the specified field in the active form. * * @param elementId - The id of the target field where the value is accessed. * @returns Returns the associated field value, or `undefined` if there is no matching attribute. */ getFieldInputValue(elementId: string): FieldValue | undefined; /** * Gets the updated attribute values for the specified feature. * * @param feature * @returns The current attribute values for the given feature. */ getValues(feature: Graphic): Graphic["attributes"]; /** * This method triggers the `"submit"` event, and causes [submitHasBeenAttempted](https://developers.arcgis.com/javascript/latest/references/core/widgets/BatchAttributeForm/BatchAttributeFormViewModel/#submitHasBeenAttempted) to become `true`. It does _not_ do anything to persist the updated values. It is up to the client to verify if these values are appropriate. For example, calling [FeatureLayer.applyEdits()](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/#applyEdits) method to update the features' attributes. * * @example * // Listen for when 'submit' is called on the form. * // Once it is fired, update the feature. * form.on("submit", updateFeatures); * // When the DOM's button (btnUpdate) is clicked, * // execute the 'submit()' method. * document.getElementById("btnUpdate").addEventListener("click", () => form.submit()); */ submit(): void; /** * Determines if user input has caused the given feature to become invalid. Only returns `true` if _all_ of the following three conditions are true of the given feature: * 1. It had no validation errors at the start of the editing session. * 2. It currently has validation errors. * 3. At least one of the validation errors was caused by user input, as opposed to a [value expression](https://developers.arcgis.com/javascript/latest/references/core/form/elements/FieldElement/#valueExpression). * * @param feature */ userChangesHaveMadeFeatureInvalid(feature: Graphic): boolean; }