@vertigis/workflow 5.46.1 → 5.48.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Activator.js +1 -1
- package/Collections.js +1 -1
- package/EnumUtils.js +1 -1
- package/Errors.js +1 -1
- package/Hooks.js +1 -1
- package/IActivityHandler.d.ts +2 -1
- package/IActivityHandler.js +1 -0
- package/LanguageStringUtils.js +1 -1
- package/ProgramInspectorFacility.js +1 -1
- package/Task.js +1 -1
- package/TemplateUtils.js +1 -1
- package/Validation.js +1 -1
- package/activities/app/GetApplicationData.js +1 -1
- package/activities/app/GetApplicationInfo.js +1 -1
- package/activities/app/GetUserInfo.js +1 -1
- package/activities/app/PublishEvent.js +1 -1
- package/activities/app/RemoveApplicationData.d.ts +2 -1
- package/activities/app/RemoveApplicationData.js +1 -1
- package/activities/app/RunCommand.js +1 -1
- package/activities/app/RunOperation.js +1 -1
- package/activities/app/SetApplicationData.js +1 -1
- package/activities/app/applicationData.js +1 -1
- package/activities/arcgis/AddAttachment.js +1 -1
- package/activities/arcgis/AddFeatureLayer.js +1 -1
- package/activities/arcgis/AddFeatures.js +1 -1
- package/activities/arcgis/AddGraphics.js +1 -1
- package/activities/arcgis/ArcadeScript.js +1 -1
- package/activities/arcgis/AreaEngineTask.js +1 -1
- package/activities/arcgis/BufferEngineTask.d.ts +2 -2
- package/activities/arcgis/BufferEngineTask.js +1 -1
- package/activities/arcgis/BufferServiceTask.js +1 -1
- package/activities/arcgis/CastGeometry.d.ts +1 -1
- package/activities/arcgis/CastGeometry.js +1 -1
- package/activities/arcgis/ClearGraphics.js +1 -1
- package/activities/arcgis/ClipEngineTask.d.ts +4 -4
- package/activities/arcgis/ClipEngineTask.js +1 -1
- package/activities/arcgis/ClosestFacilityTask.js +1 -1
- package/activities/arcgis/CompareGeometries.d.ts +3 -3
- package/activities/arcgis/CompareGeometries.js +1 -1
- package/activities/arcgis/ConvertValueToArcGisFieldType.js +1 -1
- package/activities/arcgis/CreateFeatureSet.js +1 -1
- package/activities/arcgis/CreateGraphic.d.ts +1 -1
- package/activities/arcgis/CreateGraphic.js +1 -1
- package/activities/arcgis/CreatePoint.js +1 -1
- package/activities/arcgis/CutEngineTask.d.ts +2 -2
- package/activities/arcgis/CutEngineTask.js +1 -1
- package/activities/arcgis/DeleteAttachments.js +1 -1
- package/activities/arcgis/DeleteFeatures.js +1 -1
- package/activities/arcgis/DensifyEngineTask.d.ts +3 -3
- package/activities/arcgis/DensifyEngineTask.js +1 -1
- package/activities/arcgis/DifferenceEngineTask.d.ts +5 -5
- package/activities/arcgis/DifferenceEngineTask.js +1 -1
- package/activities/arcgis/DistanceEngineTask.d.ts +4 -4
- package/activities/arcgis/DistanceEngineTask.js +1 -1
- package/activities/arcgis/DistanceServiceTask.js +1 -1
- package/activities/arcgis/ExtendedSpatialReferenceInfoEngineTask.js +1 -1
- package/activities/arcgis/FeatureSetFromJson.js +1 -1
- package/activities/arcgis/FlipEngineTask.d.ts +3 -3
- package/activities/arcgis/FlipEngineTask.js +1 -1
- package/activities/arcgis/FromGeoCoordinateStringServiceTask.js +1 -1
- package/activities/arcgis/GeneralizeEngineTask.d.ts +4 -4
- package/activities/arcgis/GeneralizeEngineTask.js +1 -1
- package/activities/arcgis/GenerateArcGisToken.js +1 -1
- package/activities/arcgis/GenerateWebmapForReport.js +1 -1
- package/activities/arcgis/Geocode.js +1 -1
- package/activities/arcgis/GeometryFromJson.js +1 -1
- package/activities/arcgis/Geoprocessing.js +1 -1
- package/activities/arcgis/GeoprocessingAsync.js +1 -1
- package/activities/arcgis/GetAttributeValue.js +1 -1
- package/activities/arcgis/GetAttributeValues.js +1 -1
- package/activities/arcgis/GetCentroid.js +1 -1
- package/activities/arcgis/GetCodedValueDomain.js +1 -1
- package/activities/arcgis/GetCurrentPosition.js +1 -1
- package/activities/arcgis/GetFeatureGeometries.d.ts +2 -2
- package/activities/arcgis/GetFeatureGeometries.js +1 -1
- package/activities/arcgis/GetFeatureGeometry.d.ts +1 -1
- package/activities/arcgis/GetFeatureGeometry.js +1 -1
- package/activities/arcgis/GetFeatureLayerInfo.js +1 -1
- package/activities/arcgis/GetFeatureSetExtent.js +1 -1
- package/activities/arcgis/GetFeatureSetObjectIds.js +1 -1
- package/activities/arcgis/GetFormElementItemsFromFeatures.js +1 -1
- package/activities/arcgis/GetGeometryExtent.js +1 -1
- package/activities/arcgis/GetGraphics.js +1 -1
- package/activities/arcgis/GetLayer.js +1 -1
- package/activities/arcgis/GetLayerDefinitionExpression.js +1 -1
- package/activities/arcgis/GetLayerProperty.js +1 -1
- package/activities/arcgis/GetLayerVisibility.js +1 -1
- package/activities/arcgis/GetMapScreenshot.js +1 -1
- package/activities/arcgis/GetPortalUser.js +1 -1
- package/activities/arcgis/GetTable.js +1 -1
- package/activities/arcgis/IntersectEngineTask.d.ts +5 -5
- package/activities/arcgis/IntersectEngineTask.js +1 -1
- package/activities/arcgis/LabelPointsServiceTask.js +1 -1
- package/activities/arcgis/LengthEngineTask.d.ts +2 -2
- package/activities/arcgis/LengthEngineTask.js +1 -1
- package/activities/arcgis/MapProvider.d.ts +10 -10
- package/activities/arcgis/MapProvider.js +1 -1
- package/activities/arcgis/NearestCoordinateEngineTask.d.ts +2 -2
- package/activities/arcgis/NearestCoordinateEngineTask.js +1 -1
- package/activities/arcgis/NearestVertexEngineTask.d.ts +2 -2
- package/activities/arcgis/NearestVertexEngineTask.js +1 -1
- package/activities/arcgis/NearestVerticesEngineTask.d.ts +2 -2
- package/activities/arcgis/NearestVerticesEngineTask.js +1 -1
- package/activities/arcgis/OffsetEngineTask.d.ts +4 -4
- package/activities/arcgis/OffsetEngineTask.js +1 -1
- package/activities/arcgis/ProjectServiceTask.d.ts +3 -3
- package/activities/arcgis/ProjectServiceTask.js +1 -1
- package/activities/arcgis/QueryAttachmentInfos.js +1 -1
- package/activities/arcgis/QueryTask.d.ts +1 -1
- package/activities/arcgis/QueryTask.js +1 -1
- package/activities/arcgis/RefreshLayer.js +1 -1
- package/activities/arcgis/RegisterCorsUrl.js +1 -1
- package/activities/arcgis/RelateEngineTask.d.ts +2 -2
- package/activities/arcgis/RelateEngineTask.js +1 -1
- package/activities/arcgis/RelationServiceTask.d.ts +2 -2
- package/activities/arcgis/RelationServiceTask.js +1 -1
- package/activities/arcgis/RelationshipQueryTask.js +1 -1
- package/activities/arcgis/RemoveFeatureSetFields.js +1 -1
- package/activities/arcgis/RemoveGraphics.js +1 -1
- package/activities/arcgis/RemoveLayer.js +1 -1
- package/activities/arcgis/RendererFromJson.js +1 -1
- package/activities/arcgis/ResetAllLayerDefinitionExpressions.js +1 -1
- package/activities/arcgis/ResetLayerDefinitionExpression.js +1 -1
- package/activities/arcgis/ReshapeServiceTask.d.ts +1 -1
- package/activities/arcgis/ReshapeServiceTask.js +1 -1
- package/activities/arcgis/ReverseGeocode.js +1 -1
- package/activities/arcgis/RotateEngineTask.d.ts +2 -2
- package/activities/arcgis/RotateEngineTask.js +1 -1
- package/activities/arcgis/RouteTask.js +1 -1
- package/activities/arcgis/RunPrint.js +1 -1
- package/activities/arcgis/RunReport.d.ts +8 -2
- package/activities/arcgis/RunReport.js +1 -1
- package/activities/arcgis/RunWorkflow.js +1 -1
- package/activities/arcgis/SendLayerToAttributeTable.js +1 -1
- package/activities/arcgis/ServiceAreaTask.js +1 -1
- package/activities/arcgis/SetFeatureAttribute.js +1 -1
- package/activities/arcgis/SetFeatureGeometry.d.ts +1 -1
- package/activities/arcgis/SetFeatureGeometry.js +1 -1
- package/activities/arcgis/SetFeaturePopup.js +1 -1
- package/activities/arcgis/SetFeatureSymbol.d.ts +1 -1
- package/activities/arcgis/SetFeatureSymbol.js +1 -1
- package/activities/arcgis/SetImageryLayerOptions.js +1 -1
- package/activities/arcgis/SetLayerDefinitionExpression.js +1 -1
- package/activities/arcgis/SetLayerPopup.js +1 -1
- package/activities/arcgis/SetLayerProperty.js +1 -1
- package/activities/arcgis/SetLayerVisibility.js +1 -1
- package/activities/arcgis/SetMap.js +1 -1
- package/activities/arcgis/SetViewExtent.js +1 -1
- package/activities/arcgis/SetViewpoint.js +1 -1
- package/activities/arcgis/ShowFeaturePopup.js +1 -1
- package/activities/arcgis/ShowResults.js +1 -1
- package/activities/arcgis/SimplifyEngineTask.d.ts +3 -3
- package/activities/arcgis/SimplifyEngineTask.js +1 -1
- package/activities/arcgis/SortFeatureSet.js +1 -1
- package/activities/arcgis/SymbolFromJson.js +1 -1
- package/activities/arcgis/ToGeoCoordinateStringServiceTask.js +1 -1
- package/activities/arcgis/TypeChecking.js +1 -1
- package/activities/arcgis/UnionEngineTask.d.ts +4 -4
- package/activities/arcgis/UnionEngineTask.js +1 -1
- package/activities/arcgis/UnionServiceTask.d.ts +3 -3
- package/activities/arcgis/UnionServiceTask.js +1 -1
- package/activities/arcgis/UpdateAttachment.js +1 -1
- package/activities/arcgis/UpdateFeatures.js +1 -1
- package/activities/arcgis/libs/arcGisRestApi.js +1 -0
- package/activities/arcgis/printing.d.ts +13 -12
- package/activities/arcgis/printing.js +1 -1
- package/activities/arcgis/printingFields.d.ts +2 -63
- package/activities/arcgis/printingFields.js +1 -1
- package/activities/arcgis/runUtils.d.ts +0 -18
- package/activities/arcgis/runUtils.js +1 -1
- package/activities/arcgis/shared.d.ts +1 -0
- package/activities/arcgis/shared.js +1 -1
- package/activities/arcgis/tools.d.ts +2 -22
- package/activities/arcgis/tools.js +1 -1
- package/activities/browser/GetBrowserInfo.js +1 -1
- package/activities/browser/InjectCss.js +1 -1
- package/activities/constants.js +1 -1
- package/activities/core/AddItem.js +1 -1
- package/activities/core/AddItems.js +1 -1
- package/activities/core/Annotation.js +1 -1
- package/activities/core/AwaitAsyncActivity.d.ts +9 -0
- package/activities/core/AwaitAsyncActivity.js +1 -0
- package/activities/core/CalculateDate.js +1 -1
- package/activities/core/Cast.js +1 -1
- package/activities/core/ChannelProvider.d.ts +3 -2
- package/activities/core/ChannelProvider.js +1 -1
- package/activities/core/ClearItems.js +1 -1
- package/activities/core/Container.js +1 -1
- package/activities/core/ConvertBytesToText.js +1 -1
- package/activities/core/ConvertDataTableToFeatureSet.js +1 -1
- package/activities/core/ConvertTextToBytes.js +1 -1
- package/activities/core/ConvertToJson.js +1 -1
- package/activities/core/CreateFile.js +1 -1
- package/activities/core/CreateValue.js +1 -1
- package/activities/core/DecodeUriComponent.js +1 -1
- package/activities/core/Delay.js +1 -1
- package/activities/core/EncodeUriComponent.js +1 -1
- package/activities/core/Evaluate.js +1 -1
- package/activities/core/EvaluateAsync.js +1 -1
- package/activities/core/ExecuteFunction.js +1 -1
- package/activities/core/Exit.js +1 -1
- package/activities/core/ForEach.js +1 -1
- package/activities/core/FormatDate.js +1 -1
- package/activities/core/Function.js +1 -1
- package/activities/core/GetBase64StringFromBytes.js +1 -1
- package/activities/core/GetBase64StringFromFile.js +1 -1
- package/activities/core/GetBytesFromBase64String.js +1 -1
- package/activities/core/GetFirstItem.js +1 -1
- package/activities/core/GetItemAtIndex.js +1 -1
- package/activities/core/GetLastItem.js +1 -1
- package/activities/core/GetLogLevel.js +1 -1
- package/activities/core/GetTextFromFile.js +1 -1
- package/activities/core/GetWorkflowInputs.js +1 -1
- package/activities/core/If.js +1 -1
- package/activities/core/Log.js +1 -1
- package/activities/core/Loop.js +1 -1
- package/activities/core/ParseJson.js +1 -1
- package/activities/core/ParseNumber.js +1 -1
- package/activities/core/ParseUrl.js +1 -1
- package/activities/core/Placeholder.js +1 -1
- package/activities/core/RegexMatches.js +1 -1
- package/activities/core/RegexReplace.js +1 -1
- package/activities/core/RemoveItem.js +1 -1
- package/activities/core/RunActivity.js +1 -1
- package/activities/core/SetLogLevel.js +1 -1
- package/activities/core/SetProperty.js +1 -1
- package/activities/core/SetWorkflowOutput.js +1 -1
- package/activities/core/Switch.js +1 -1
- package/activities/core/TextReplace.js +1 -1
- package/activities/core/Throw.js +1 -1
- package/activities/core/TryCatch.js +1 -1
- package/activities/core/WebRequest.js +1 -1
- package/activities/core/converters.js +1 -1
- package/activities/csv/ConvertCsvToDataTable.js +1 -1
- package/activities/csv/ConvertDataTableToCsv.js +1 -1
- package/activities/csv/ParseCsv.js +1 -1
- package/activities/essentials/GetEssentialsSite.d.ts +15 -14
- package/activities/essentials/GetEssentialsSite.js +1 -1
- package/activities/essentials/RunEssentialsWorkflow.js +1 -1
- package/activities/essentials/RunEssentialsWorkflowActivity.js +1 -1
- package/activities/forms/ActivateFormElement.js +1 -1
- package/activities/forms/AddFormElement.js +1 -1
- package/activities/forms/ClearFormElementError.js +1 -1
- package/activities/forms/CompleteForm.js +1 -1
- package/activities/forms/DisplayForm.js +1 -1
- package/activities/forms/Errors.js +1 -1
- package/activities/forms/FilterFormElementItems.js +1 -1
- package/activities/forms/FormActor.d.ts +1 -2
- package/activities/forms/FormActor.js +1 -1
- package/activities/forms/FormElementMap.js +1 -1
- package/activities/forms/FormRenderer.js +1 -1
- package/activities/forms/GetFormElementItemsFromCollection.js +1 -1
- package/activities/forms/GetFormElementProperty.js +1 -1
- package/activities/forms/GetFormElementValue.js +1 -1
- package/activities/forms/GetFormEventData.js +1 -1
- package/activities/forms/HideFormElement.js +1 -1
- package/activities/forms/PropagateFormEvent.js +1 -1
- package/activities/forms/SetCurrentFormElementItem.js +1 -1
- package/activities/forms/SetFormElementError.js +1 -1
- package/activities/forms/SetFormElementEvent.js +1 -1
- package/activities/forms/SetFormElementItemProperty.js +1 -1
- package/activities/forms/SetFormElementItems.js +1 -1
- package/activities/forms/SetFormElementLimits.js +1 -1
- package/activities/forms/SetFormElementProperty.js +1 -1
- package/activities/forms/ShowFormElement.js +1 -1
- package/activities/image/GetImageMetadata.js +1 -1
- package/activities/image/RotateImage.js +1 -1
- package/activities/index.js +1 -1
- package/activities/main.js +1 -1
- package/activities/math/Abs.js +1 -1
- package/activities/math/Cos.js +1 -1
- package/activities/math/Max.js +1 -1
- package/activities/math/Min.js +1 -1
- package/activities/math/Pow.js +1 -1
- package/activities/math/Random.js +1 -1
- package/activities/math/Sin.js +1 -1
- package/activities/math/Sqrt.js +1 -1
- package/activities/math/Tan.js +1 -1
- package/activities/pdf/AddGeoreferenceToPdf.js +1 -1
- package/activities/pdf/AddImageToPdf.js +1 -1
- package/activities/pdf/AddTextToPdf.js +1 -1
- package/activities/pdf/CreatePdf.js +1 -1
- package/activities/pdf/ExtractPdfPages.js +1 -1
- package/activities/pdf/MergePdfs.js +1 -1
- package/activities/server/CopyFile.js +1 -1
- package/activities/server/CreateDirectory.js +1 -1
- package/activities/server/CreateDownload.js +1 -1
- package/activities/server/CreateEmailAttachment.js +1 -1
- package/activities/server/CreateZipFromDirectory.js +1 -1
- package/activities/server/DeleteDirectory.js +1 -1
- package/activities/server/DeleteFile.js +1 -1
- package/activities/server/DirectoryExists.js +1 -1
- package/activities/server/ExtractZipToDirectory.js +1 -1
- package/activities/server/FileExists.js +1 -1
- package/activities/server/GetDirectoriesInDirectory.js +1 -1
- package/activities/server/GetFilesInDirectory.js +1 -1
- package/activities/server/MoveFile.js +1 -1
- package/activities/server/ReadFile.js +1 -1
- package/activities/server/ReadFileBytes.js +1 -1
- package/activities/server/RunApplication.js +1 -1
- package/activities/server/RunPython.js +1 -1
- package/activities/server/SendEmail.js +1 -1
- package/activities/server/SqlNonQuery.js +1 -1
- package/activities/server/SqlQuery.js +1 -1
- package/activities/server/SqlQueryUnsafe.js +1 -1
- package/activities/server/WriteFile.js +1 -1
- package/activities/server/WriteFileBytes.js +1 -1
- package/activities/ui/Alert.js +1 -1
- package/activities/ui/Confirm.js +1 -1
- package/activities/ui/DialogContent.js +1 -1
- package/activities/ui/DialogProvider.js +1 -1
- package/activities/ui/Prompt.js +1 -1
- package/activities/wab/OpenWidget.js +1 -1
- package/activities/wab/PublishWidgetData.js +1 -1
- package/activities/xlsx/ConvertDataTableToXlsx.js +1 -1
- package/activities/xlsx/ConvertXlsxToDataSet.js +1 -1
- package/constants.js +1 -1
- package/definition/Activity.js +1 -0
- package/definition/ActivityInput.js +1 -1
- package/definition/Component.js +1 -0
- package/definition/DeploymentConfig.js +1 -0
- package/definition/Form.js +1 -0
- package/definition/Program.js +1 -0
- package/definition/ProgramInspector.js +1 -1
- package/definition/Reference.js +1 -0
- package/definition/Resource.js +1 -0
- package/definition/Step.d.ts +1 -1
- package/definition/Step.js +1 -0
- package/definition/Transition.js +1 -0
- package/diagnostics/ConsoleDebugLogger.js +1 -1
- package/diagnostics/logging.js +1 -0
- package/execution/ActivityContext.js +1 -1
- package/execution/ActivityLoader.js +1 -1
- package/execution/AmbientState.d.ts +2 -0
- package/execution/AmbientState.js +1 -1
- package/execution/AsyncContext.d.ts +4 -0
- package/execution/AsyncContext.js +1 -1
- package/execution/Engine.js +1 -1
- package/execution/ExternalEvent.js +1 -0
- package/execution/IDebugSession.js +1 -0
- package/execution/ModuleLoader.js +1 -1
- package/execution/ProgramRunner.js +1 -1
- package/execution/Proxy.js +1 -1
- package/execution/StepContext.js +1 -1
- package/execution/TransitionContext.js +1 -1
- package/execution/util.js +1 -1
- package/forms/ExclusiveTimer.js +1 -1
- package/forms/FormComponent.d.ts +1 -1
- package/forms/FormComponent.js +1 -1
- package/forms/FormDefinition.d.ts +30 -2
- package/forms/FormDefinition.js +1 -1
- package/forms/FormHost.d.ts +55 -9
- package/forms/FormHost.js +1 -1
- package/forms/FormPresenterHost.js +1 -0
- package/forms/MutuallyExclusiveSectionGroup.js +1 -1
- package/forms/NumberParser.js +1 -1
- package/forms/branding/WorkflowColor.d.ts +17 -0
- package/forms/branding/WorkflowColor.js +1 -0
- package/forms/branding/colors.d.ts +15 -0
- package/forms/branding/colors.js +1 -0
- package/forms/branding/createPalette.d.ts +21 -0
- package/forms/branding/createPalette.js +1 -0
- package/forms/components/AccordionGroup.js +1 -1
- package/forms/components/AutoComplete.d.ts +1 -1
- package/forms/components/AutoComplete.js +1 -1
- package/forms/components/Button.d.ts +15 -0
- package/forms/components/Button.js +1 -0
- package/forms/components/ButtonBar.d.ts +1 -1
- package/forms/components/ButtonBar.js +1 -1
- package/forms/components/CheckBox.d.ts +1 -1
- package/forms/components/CheckBox.js +1 -1
- package/forms/components/CheckGroup.d.ts +1 -1
- package/forms/components/CheckGroup.js +1 -1
- package/forms/components/Custom.d.ts +1 -1
- package/forms/components/Custom.js +1 -1
- package/forms/components/DatePicker.d.ts +1 -1
- package/forms/components/DatePicker.js +1 -1
- package/forms/components/DateRangePicker.d.ts +1 -1
- package/forms/components/DateRangePicker.js +1 -1
- package/forms/components/DateTimePicker.d.ts +1 -1
- package/forms/components/DateTimePicker.js +1 -1
- package/forms/components/DateTimeTextField.js +1 -1
- package/forms/components/DropDownList.d.ts +1 -1
- package/forms/components/DropDownList.js +1 -1
- package/forms/components/FilePicker.d.ts +1 -1
- package/forms/components/FilePicker.js +1 -1
- package/forms/components/Form.js +1 -1
- package/forms/components/FormElement.js +1 -1
- package/forms/components/FormLabelNumberField.d.ts +2 -0
- package/forms/components/FormLabelNumberField.js +1 -1
- package/forms/components/GeometryPicker.d.ts +1 -1
- package/forms/components/GeometryPicker.js +1 -1
- package/forms/components/HorizontalRule.d.ts +1 -1
- package/forms/components/HorizontalRule.js +1 -1
- package/forms/components/Image.d.ts +1 -1
- package/forms/components/Image.js +1 -1
- package/forms/components/ItemPicker.d.ts +3 -3
- package/forms/components/ItemPicker.js +1 -1
- package/forms/components/ListBox.d.ts +1 -1
- package/forms/components/ListBox.js +1 -1
- package/forms/components/Markdown.js +1 -1
- package/forms/components/Number.d.ts +1 -1
- package/forms/components/Number.js +1 -1
- package/forms/components/NumberRangeSlider.d.ts +1 -1
- package/forms/components/NumberRangeSlider.js +1 -1
- package/forms/components/NumberSlider.d.ts +1 -1
- package/forms/components/NumberSlider.js +1 -1
- package/forms/components/RadioGroup.d.ts +1 -1
- package/forms/components/RadioGroup.js +1 -1
- package/forms/components/Scanner.d.ts +1 -2
- package/forms/components/Scanner.js +1 -1
- package/forms/components/Section.d.ts +1 -1
- package/forms/components/Section.js +1 -1
- package/forms/components/Signature.d.ts +1 -1
- package/forms/components/Signature.js +1 -1
- package/forms/components/SignatureDialog.js +1 -1
- package/forms/components/Sketch.d.ts +1 -1
- package/forms/components/Sketch.js +1 -1
- package/forms/components/SketchDialog.js +1 -1
- package/forms/components/TabGroup.js +1 -1
- package/forms/components/Text.d.ts +1 -1
- package/forms/components/Text.js +1 -1
- package/forms/components/TextArea.d.ts +1 -1
- package/forms/components/TextArea.js +1 -1
- package/forms/components/TextBox.d.ts +1 -1
- package/forms/components/TextBox.js +1 -1
- package/forms/components/TimePicker.d.ts +1 -1
- package/forms/components/TimePicker.js +1 -1
- package/forms/components/common.js +1 -1
- package/forms/constants.js +1 -1
- package/forms/customNumberFormat.js +1 -1
- package/forms/dateUtilities.d.ts +4 -6
- package/forms/dateUtilities.js +1 -1
- package/forms/elements/AutoComplete.js +1 -1
- package/forms/elements/ButtonBar.d.ts +3 -0
- package/forms/elements/ButtonBar.js +1 -0
- package/forms/elements/CheckBox.js +1 -0
- package/forms/elements/CheckGroup.js +1 -0
- package/forms/elements/Custom.js +1 -0
- package/forms/elements/DatePicker.js +1 -0
- package/forms/elements/DateRangePicker.js +1 -0
- package/forms/elements/DateTimePicker.js +1 -0
- package/forms/elements/DropDownList.js +1 -0
- package/forms/elements/FilePicker.js +1 -0
- package/forms/elements/GeometryPicker.js +1 -0
- package/forms/elements/Header.js +1 -0
- package/forms/elements/HorizontalRule.js +1 -0
- package/forms/elements/Image.js +1 -0
- package/forms/elements/ItemPicker.js +1 -0
- package/forms/elements/ListBox.js +1 -0
- package/forms/elements/Number.js +1 -1
- package/forms/elements/NumberRangeSlider.js +1 -1
- package/forms/elements/NumberSlider.js +1 -0
- package/forms/elements/PasswordBox.js +1 -0
- package/forms/elements/RadioGroup.js +1 -0
- package/forms/elements/Scanner.js +1 -1
- package/forms/elements/Section.js +1 -0
- package/forms/elements/Signature.js +1 -1
- package/forms/elements/Sketch.js +1 -0
- package/forms/elements/Text.js +1 -0
- package/forms/elements/TextArea.js +1 -0
- package/forms/elements/TextBox.js +1 -0
- package/forms/elements/TimePicker.js +1 -0
- package/forms/elements/types.js +1 -0
- package/forms/hostContext.d.ts +0 -1
- package/forms/hostContext.js +1 -1
- package/forms/index.d.ts +0 -1
- package/forms/keyboard.d.ts +0 -1
- package/forms/keyboard.js +1 -1
- package/forms/listUtilities.js +1 -1
- package/forms/manifest.js +1 -1
- package/forms/numberFormatter.js +1 -1
- package/forms/numberUtilities.js +1 -1
- package/forms/presenter.d.ts +1 -1
- package/forms/presenter.js +1 -1
- package/forms/renderers.js +1 -1
- package/forms/textUtilities.js +1 -1
- package/forms/utils.d.ts +28 -7
- package/forms/utils.js +1 -1
- package/index.d.ts +1 -1
- package/index.js +1 -0
- package/libs/version.d.ts +1 -1
- package/libs/version.js +1 -1
- package/licensing/LicenseChecker.js +1 -1
- package/licensing/Watermark.js +1 -1
- package/package.json +23 -13
- package/ui/UIService.js +1 -1
- package/activities/arcgis/FeatureTableMap.d.ts +0 -12
- package/activities/arcgis/FeatureTableMap.js +0 -1
- package/forms/Calendar.d.ts +0 -89
- package/forms/Calendar.js +0 -1
|
@@ -13,7 +13,7 @@ export type ContainerRef = "default" | "modal" | {
|
|
|
13
13
|
region?: string;
|
|
14
14
|
};
|
|
15
15
|
/** References the date/time format criteria. */
|
|
16
|
-
export type DateTimeFormat =
|
|
16
|
+
export type DateTimeFormat = {
|
|
17
17
|
/** Indicates the locale for the date/time value. */
|
|
18
18
|
locale: string;
|
|
19
19
|
/** Indicates the time zone for the date/time value. */
|
|
@@ -231,7 +231,6 @@ export interface Size {
|
|
|
231
231
|
/** The width. */
|
|
232
232
|
width?: number;
|
|
233
233
|
}
|
|
234
|
-
export type SizePropertyName = keyof Size;
|
|
235
234
|
/**
|
|
236
235
|
* Defines a form.
|
|
237
236
|
* @product This is intended for internal use only within VertiGIS Studio products.
|
|
@@ -365,11 +364,40 @@ export interface Element {
|
|
|
365
364
|
/** Indicates how the control wraps text. */
|
|
366
365
|
wrap?: "hard" | "soft" | "off";
|
|
367
366
|
}
|
|
367
|
+
/** The style of border on an item. */
|
|
368
|
+
export type BorderStyle = "rounded" | "square";
|
|
369
|
+
/** The level of emphasis on an item. */
|
|
370
|
+
export type Emphasis = "low" | "medium" | "high";
|
|
371
|
+
/** The position of an item's icon relative to the text. */
|
|
372
|
+
export type IconPosition = "above" | "below" | "before" | "after";
|
|
373
|
+
/** The size of an item. */
|
|
374
|
+
export type ItemSize = "small" | "medium" | "large";
|
|
375
|
+
/** Details of the appearance of an item. */
|
|
376
|
+
export interface ItemAppearance {
|
|
377
|
+
/** The background color of the item. */
|
|
378
|
+
backgroundColor?: string;
|
|
379
|
+
/** The style of the button. */
|
|
380
|
+
borderStyle?: BorderStyle;
|
|
381
|
+
/** The emphasis of the button. This affects border and colours. */
|
|
382
|
+
emphasis?: Emphasis | "custom";
|
|
383
|
+
/** The foreground color of the item. */
|
|
384
|
+
foregroundColor?: string;
|
|
385
|
+
/** The name of the icon to be shown on this item. */
|
|
386
|
+
icon?: string;
|
|
387
|
+
/** Where the icon should be shown on this item, if {@link icon} is set. Default is "before". */
|
|
388
|
+
iconPosition?: IconPosition;
|
|
389
|
+
/** Set whether the item should show a border. */
|
|
390
|
+
showBorder?: boolean;
|
|
391
|
+
/** The size of the button. */
|
|
392
|
+
size?: ItemSize;
|
|
393
|
+
}
|
|
368
394
|
/**
|
|
369
395
|
* Defines an ad hoc item.
|
|
370
396
|
* @product This is intended for internal use only within VertiGIS Studio products.
|
|
371
397
|
*/
|
|
372
398
|
export interface Item {
|
|
399
|
+
/** Settings controlling the appearance of the item. */
|
|
400
|
+
appearance?: ItemAppearance;
|
|
373
401
|
/** Indicates the placement of the item. */
|
|
374
402
|
index?: number;
|
|
375
403
|
/** Indicates the label for the item. */
|
package/forms/FormDefinition.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const DEFAULT_SECTION_FORMAT="unstyled-section";var PreSelectionAction;!function(e){e[e.None=0]="None",e[e.RetrieveSuggestions=1]="RetrieveSuggestions",e[e.SelectFirstItem=2]="SelectFirstItem"}(PreSelectionAction=
|
|
1
|
+
export const DEFAULT_SECTION_FORMAT="unstyled-section";export var PreSelectionAction;!function(e){e[e.None=0]="None",e[e.RetrieveSuggestions=1]="RetrieveSuggestions",e[e.SelectFirstItem=2]="SelectFirstItem"}(PreSelectionAction||(PreSelectionAction={}));
|
package/forms/FormHost.d.ts
CHANGED
|
@@ -13,6 +13,23 @@ interface FormEventSubscription {
|
|
|
13
13
|
interface FormEventHandler {
|
|
14
14
|
(event: defs.Event): void;
|
|
15
15
|
}
|
|
16
|
+
/**
|
|
17
|
+
* Details about the most recently focused DOM element.
|
|
18
|
+
* This might be assigned programmatically or automatically
|
|
19
|
+
* via observing the focus events of the container.
|
|
20
|
+
*/
|
|
21
|
+
interface LastFocusInfo {
|
|
22
|
+
/** True or false based on the error property of the element, if known. */
|
|
23
|
+
isInvalid?: boolean;
|
|
24
|
+
/** The name of the form element that `target` belongs to, if known. */
|
|
25
|
+
name?: string;
|
|
26
|
+
/** The position within the row of the form element, if known. */
|
|
27
|
+
rowIndex?: number;
|
|
28
|
+
/** The row of the form element, if known. */
|
|
29
|
+
rowNumber?: number;
|
|
30
|
+
/** The DOM element that was focused. */
|
|
31
|
+
target: HTMLElement;
|
|
32
|
+
}
|
|
16
33
|
/** Exposes functionality for driving a form. */
|
|
17
34
|
export declare abstract class FormHost implements FormPresenterHost {
|
|
18
35
|
/** Indicates the overall state of the form. */
|
|
@@ -36,6 +53,12 @@ export declare abstract class FormHost implements FormPresenterHost {
|
|
|
36
53
|
protected eventIndex: number;
|
|
37
54
|
/** The event queue. */
|
|
38
55
|
protected eventQueue: defs.Event[];
|
|
56
|
+
/**
|
|
57
|
+
* We keep track of the outermost DOM element for each form element here
|
|
58
|
+
* so that when any DOM element gains focus in the form we can determine which element
|
|
59
|
+
* it belongs to. This helps with deciding where to move focus to when validation fails.
|
|
60
|
+
*/
|
|
61
|
+
protected domContainers: Record<string, HTMLElement>;
|
|
39
62
|
/** The event promise, for when the consumer is waiting. */
|
|
40
63
|
private eventTask;
|
|
41
64
|
/**
|
|
@@ -50,12 +73,7 @@ export declare abstract class FormHost implements FormPresenterHost {
|
|
|
50
73
|
/** The timer handler for idle/busy handling. */
|
|
51
74
|
protected timerHandle: (() => void) | undefined;
|
|
52
75
|
/** Indicates a method to restore the last focus. */
|
|
53
|
-
protected lastFocus:
|
|
54
|
-
target: HTMLElement;
|
|
55
|
-
name?: string;
|
|
56
|
-
rowIndex?: number;
|
|
57
|
-
rowNumber?: number;
|
|
58
|
-
} | undefined;
|
|
76
|
+
protected lastFocus: LastFocusInfo | undefined;
|
|
59
77
|
/** Indicates the next element that should receive focus. */
|
|
60
78
|
protected nextFocus: boolean | string;
|
|
61
79
|
/** Indicates the next element that should receive a refresh. */
|
|
@@ -68,7 +86,15 @@ export declare abstract class FormHost implements FormPresenterHost {
|
|
|
68
86
|
protected mount(): void;
|
|
69
87
|
/** Removes the form from the DOM. */
|
|
70
88
|
protected unmount(): void;
|
|
71
|
-
/**
|
|
89
|
+
/**
|
|
90
|
+
* Intelligently tracks the last focus, in response to focus events within
|
|
91
|
+
* the form container. We attempt to determine which form element `target` belongs to,
|
|
92
|
+
* so that we can have a better idea where we are in the order of elements.
|
|
93
|
+
*
|
|
94
|
+
* This comes into play later when we might want to decide where to move focus
|
|
95
|
+
* based on where we currently are.
|
|
96
|
+
* @param target The DOM element that has just gained focus.
|
|
97
|
+
*/
|
|
72
98
|
protected observeFocus(target: EventTarget): void;
|
|
73
99
|
/** Focuses the form. */
|
|
74
100
|
focus(): void;
|
|
@@ -87,7 +113,10 @@ export declare abstract class FormHost implements FormPresenterHost {
|
|
|
87
113
|
hide(): boolean;
|
|
88
114
|
/** Disposes the form. */
|
|
89
115
|
dispose(): boolean;
|
|
90
|
-
/**
|
|
116
|
+
/**
|
|
117
|
+
* This method renders focus for just rendered elements.
|
|
118
|
+
* It also moves focus to another element when `nextFocus` is the name of an element.
|
|
119
|
+
*/
|
|
91
120
|
renderFocus(target: HTMLElement, name?: string): boolean;
|
|
92
121
|
/** Renders form text as plain text. */
|
|
93
122
|
renderText(content: defs.Text | undefined): string;
|
|
@@ -113,7 +142,7 @@ export declare abstract class FormHost implements FormPresenterHost {
|
|
|
113
142
|
*/
|
|
114
143
|
translateText(content: defs.Text | undefined): string | defs.MarkdownRef | undefined;
|
|
115
144
|
/** Renders the form component. */
|
|
116
|
-
renderVisual(component:
|
|
145
|
+
renderVisual(component: FormComponent): any;
|
|
117
146
|
/** Qualifies an event with defaults. */
|
|
118
147
|
protected qualifyDefault(event: defs.Event): string | undefined;
|
|
119
148
|
/** Qualifies an event. */
|
|
@@ -230,7 +259,24 @@ export declare abstract class FormHost implements FormPresenterHost {
|
|
|
230
259
|
renderState(name: string, type: string, state?: object): boolean;
|
|
231
260
|
private getParentSection;
|
|
232
261
|
private isSectionCollapsed;
|
|
262
|
+
/**
|
|
263
|
+
* This method checks if the specified element is considered before the current value of `this.lastFocus`.
|
|
264
|
+
* When the form is initially loading, we focus the first visible element in the form, regardless of error state.
|
|
265
|
+
* When validating the form, we focus the first _invalid_ element.
|
|
266
|
+
* @param elementName The name of a Form Element.
|
|
267
|
+
* @param invalidOnly True if we only care about invalid elements, false otherwise.
|
|
268
|
+
* @returns True if the named element is considered before the one specified in `this.lastFocus`.
|
|
269
|
+
*/
|
|
233
270
|
private isElementPositionBeforeLastFocused;
|
|
271
|
+
/**
|
|
272
|
+
*
|
|
273
|
+
* @param target The DOM element that was focused
|
|
274
|
+
* @param name The name of the element that contains `target`. (if known)
|
|
275
|
+
* @param isInvalid True or false if the invalid state is known. Otherwise we check the element itself.
|
|
276
|
+
* This is necessary as some functions like `verify()` will use `this.errors` to track errors before
|
|
277
|
+
* we update `element.error` later.
|
|
278
|
+
* @returns
|
|
279
|
+
*/
|
|
234
280
|
private setLastFocus;
|
|
235
281
|
private getAllSectionElements;
|
|
236
282
|
private getMutuallyExclusiveSectionGroup;
|
package/forms/FormHost.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import Bluebird from"bluebird";import{Task}from"../Task.js";import{DEFAULT_LOCALE}from"../constants.js";import*as defs from"./FormDefinition.js";import MutuallyExclusiveSectionGroup from"./MutuallyExclusiveSectionGroup.js";import NumberParser from"./NumberParser.js";import{FormElementTypes}from"./constants.js";import{format}from"./numberFormatter.js";import*as presenter from"./presenter.js";import{isCollapsibleSection,isMutuallyExclusiveSection,isSection,sortAndFilter,text}from"./utils.js";const guid="C0166F74-982A-464E-9FB6-9605CB7649C1:",eventName=guid+"FormEvent";function createEvent(e,t){return new CustomEvent(e,{bubbles:!1,cancelable:!1,detail:t})}function overlay(s,i){switch(typeof s){case"boolean":case"number":case"string":return s;case"object":break;default:return i}if(null===s)return i;if(s instanceof Array){let e=i;void 0!==e&&null!==e||(e=[]);let t=0;for(const r of s){var n=overlay(r,e[t]);void 0!==n&&(t<s.length?e[t]=n:e.push(n),++t)}return e}let e=i;void 0===e&&(e={});for(const t in s)e[t]=overlay(s[t],e[t]);return e}function createSubscription(e){function t(){return void 0!==e&&(t.active=!1,e(),!0)}return t.active=!0,t}class FormHost{constructor(){this.form={defaults:{},elements:{}},this.errors={},this.refs={},this.enabled=!1,this.visible=!1,this.dismiss=!1,this.custom=!1,this.container=document.createElement("div"),this.eventIndex=0,this.eventQueue=[],this.mutuallyExclusiveSections={},this.nextFocus=!1,this.nextRefresh=!1,this.enqueueExternalEvent=e=>{e={type:`external$${e.name}`,name:"header",argument:e};this.enqueue(e.type,e)}}deriveLocale(){return DEFAULT_LOCALE}mount(){var e=this.container,t=e.parentNode;null==t&&document.body.appendChild(e),this.update()}unmount(){var e=this.container;const t=e.parentNode;void 0!==t&&null!==t&&t.removeChild(e)}observeFocus(e){this.enabled&&e instanceof HTMLElement&&(this.lastFocus&&this.lastFocus.target===e||this.setLastFocus(e))}focus(e){!0===(e=null==e?!1:e)&&(this.lastFocus=void 0),!1===e&&!1===(e=this.nextFocus)&&(e=!0),this.nextFocus=e,this.invalidate(!0!==e?e:void 0)}show(){const e=this.container;if(void 0===e)return!1;this.custom||void 0!==this.focusObserver||e.addEventListener("focus",this.focusObserver=e=>this.observeFocus(e.target),!0),this.enabled||(this.nextRefresh=!0,this.focus()),this.enforceMutuallyExclusiveConstraints();var t=this.errors;for(const s in t){const i=this.form.elements[s];void 0!==i&&null!==i&&(i.error=t[s],this.invalidate(s))}return this.idle(),!1!==this.nextRefresh&&(this.enabled=!0,this.visible=!0,this.mount()),this.enabled}isInvalid(e){return!!e.error&&!1!==e.visible}getInvalidElements(){return Object.keys(this.form.elements).map(e=>this.form.elements[e]).filter(this.isInvalid)}hasInvalidChild(e){for(const s in this.form.elements){var t=this.form.elements[s];if(this.isInvalid(t)&&this.getParentSection(t)===e)return!0}return!1}spin(){return void 0!==this.container&&(this.idle(),this.visible&&!this.enabled||(this.nextRefresh=!0,this.enabled=!1,this.visible=!0,this.mount()),this.visible)}hide(){return void 0!==this.container&&(this.idle(),this.visible&&(this.enabled=!1,this.visible=!1,this.unmount()),!0)}dispose(){if(this.dismiss)return!1;{this.dismiss=!0;const t=this.container;t.dispatchEvent(createEvent(eventName));var e=this.focusObserver;return void 0!==e&&t.removeEventListener("focus",e,!0),this.idle(),this.unmount(),this.refs={},presenter.releaseForm(this.container),this.container=void 0,this.lastFocus=void 0,!(this.eventTask=void 0)}}renderFocus(e,t){var s=this.nextFocus;if(this.enabled&&e instanceof HTMLElement)if(!1!==s)if(void 0!==t){if(t===s||!0===s&&void 0===this.lastFocus)return this.nextFocus=!1,this.setLastFocus(e,t),e.focus(),!0}else{const i=this.lastFocus?.target;if(!0===s&&i instanceof HTMLElement&&e.contains(i))return this.nextFocus=!1,i.focus(),!0}else if(!1===s&&t&&t!==this.lastFocus?.name&&this.isElementPositionBeforeLastFocused(t))return this.setLastFocus(e,t),e.focus(),!0;return!1}renderText(e){return"string"==typeof e?e:text.isMarkdown(e)?text.markdownToText(e.markdown):""}translateText(e){return"string"==typeof e||text.isMarkdown(e)?e:text.isStatus(e)?e.status:void 0}renderVisual(e){return presenter.render(e)||presenter.renderNone(e)}qualifyDefault(e){var t=sortAndFilter(this.form.elements);for(const r in t){var s=t[r];if(null!=s&&!1!==s.visible&&s.enabled){if(s.default)return e.value=s.value,r;var i=sortAndFilter(s.items);if(null!=i)for(const o in i){var n=i[o];if(null!=n&&n.visible&&n.enabled&&n.default)return e.item=o,e.value=n.value,r}}}}qualify(e,t){var s;return null==t&&(t={}),"clicked"===e&&void 0===t.name&&(t.name=this.qualifyDefault(t)),t.type=e,void 0===t.routingKey&&(s=t.name,t.routingKey=void 0!==s?e+"$"+s:e),t}post(e,t){t=this.publish(e,t);const s=this.container;void 0!==s&&s.dispatchEvent(createEvent(eventName,t))}subscribe(e){let s=e;const t=this.container;if(void 0===t)return createSubscription();const i=function(){s=void 0,t.removeEventListener(eventName,n)},n=function(e){const t=e.detail;void 0!==t?Bluebird.resolve().then(function(){"function"==typeof s&&s(t)}):i()};return t.addEventListener(eventName,n),createSubscription(i)}refresh(e){this.custom||("string"==typeof e?(e=this.refs[e],presenter.refresh(e)):(this.refs={},presenter.refreshForm(this,this.container)))}invalidate(e){const t=this.nextRefresh;"string"==typeof e&&!0!==t&&(!1===t?this.nextRefresh={[e]:!0}:t[e]=!0),void 0!==e&&!0!==e||(this.nextRefresh=!0),!1===e&&!1===t&&(this.nextRefresh={})}update(){var e=this.nextRefresh;if(!0===e&&(this.nextRefresh=!1,this.refresh()),"object"==typeof e){this.nextRefresh=!1;for(const t in e)!0===e[t]&&this.refresh(t)}}idle(){const e=this.timerHandle;void 0!==e&&(this.timerHandle=void 0,e())}busy(){if(void 0===this.timerHandle&&void 0!==this.container){let e=setTimeout(()=>this.spin());this.timerHandle=function(){void 0!==e&&(clearTimeout(e),e=void 0)}}}publish(e,t){return this.enabled?(t=this.enqueue(e,t),0<this.eventQueue.length&&this.spin(),t):this.qualify(e,t)}enqueue(e,t){return t=this.qualify(e,t),void 0!==this.eventTask?(this.resolveEvent(t),this.eventTask=void 0):this.eventQueue.push(t),t}dequeue(){const e=this.eventQueue;if(0<e.length){var t=this.eventIndex,s=e[t++];return t>=e.length?e.length=this.eventIndex=0:this.eventIndex=t,s}}observe(){return Bluebird.attempt(()=>{if(void 0!==this.eventTask)return this.eventTask;var e=this.dequeue();return void 0!==e?e:this.show()?(this.eventTask=new Task(e=>{this.resolveEvent=e}),this.eventTask):void 0})}load(e,t){if(void 0===this.container)return!1;if(this.eventQueue.length=this.eventIndex=0,this.eventTask=void 0,this.errors={},this.lastFocus=void 0,this.nextFocus=!0,this.nextRefresh=!0,this.enqueue("load"),this.enqueue("prepare"),null!=e){e=overlay(e,e={defaults:{},elements:{}});this.form=overlay(t,e);for(const s in this.form.elements){let e=this.form.elements[s];if(e=overlay(e,{showFilter:!1,checked:!1,enabled:!0,hoisted:!1,visible:!0,overlay:!1,default:!1,validates:!1,readOnly:!1,require:!1,autoActivate:!1}),e.items)for(const i in e.items)e.items[i]=overlay(e.items[i],{enabled:!0,checked:!1,visible:!0,default:!1,validates:!1});this.form.elements[s]=e}}return!0}route(e){switch(e.type){case"changed":return this.cascade(e.name);case"checked":return this.changed(e);case"clicked":return this.click(e);case"prepare":return this.hydrate(e);case"suggest":return this.suggest(e);case"validate":return this.verify(e);case"verify":return this.submit(e)}return!1}changed(e){return this.enqueue("changed",{name:e.name,item:e.item,value:e.value}),!0}isElementValid(e,t=!0,s={status:void 0}){return null!=e&&(s.status=void 0,text.isInvalidError(e.error)?!(s.status="invalid"):!0!==e.require||(this.isElementEffectivelyVisible(e)?!!this.isElementValueDefined(e)||!(s.status="missing"):t))}isElementEffectivelyVisible(e){return null!=e&&(!1!==this.getParentSection(e)?.visible&&!1!==e.visible)}isElementValueDefined(e){if(null==e)return!1;if(e.type===FormElementTypes.CHECKBOX)return!0;var t=e.current;if(null!=t)return!0;t=e.value;if(null!=t&&""!==t)return!0;var s=e.items;if(null!=s)for(const n in s){var i=s[n];if(null!=i&&!0===i.checked)return!0}return!1}trap(e){switch(e.type){case"populate":case"load":case"suggest":break;default:return!1}var t=e.name;const s=this.find(t);if(void 0===s||null===s)return!1;e=s.dependsOn;if("string"!=typeof e)return!1;e=this.find(e);return s.enabled=this.isElementEffectivelyVisible(e)&&this.isElementValueDefined(e),this.invalidate(t),!s.enabled}cascade(e){var t=this.find(e);if(null==t||!1===t.dependsOn)return!1;const s={[e]:!0};var i=sortAndFilter(this.form.elements);for(const r in i){const o=i[r];var n=o.dependsOn;if("string"==typeof n){const l=this.find(n);void 0!==l&&"string"!=typeof l.dependsOn&&(l.dependsOn=!0),!0===s[n]&&(s[r]=!0,o.checked=!1,o.current=void 0,o.label=void 0,o.items=void 0,o.value=void 0,this.invalidate(r),o.dependsOn===e&&this.enqueue("populate",{name:r}))}else o.dependsOn=!1}return!0}click(e){var t=this.form.elements[e.name];return null!=t&&t.type==FormElementTypes.BUTTONBAR&&this.validate(e)}hasInitialSelectionToDependOn(e){e=this.form.elements[e];return e.type===FormElementTypes.DROPDOWNLIST&&(void 0!==e.current&&null!==e.current)}hydrate(e){for(const s in sortAndFilter(this.form.elements)){var t=this.form.elements[s].dependsOn;"string"==typeof t&&!this.hasInitialSelectionToDependOn(t)||this.enqueue("populate",{name:s}),this.enqueue("load",{name:s})}return!0}shouldTriggerValidation(e){var t=this.find(e.name);if(null!=t&&"string"==typeof e.value){e=e.item;if("string"!=typeof e)return!0===t.validates;t=t.items;if(null!=t){e=t[e];if(null!=e)return!0===e.validates}}}validate(e){var t=this.shouldTriggerValidation(e);if(!0!==t)return!1===t&&(this.enqueue("end",{name:e.name,item:e.item,value:e.value,routingKey:"end"}),!0);{const n=this.errors={};var s=sortAndFilter(this.form.elements);for(const r in s){var i=s[r];null!=i&&(n[r]=void 0,this.enqueue("validate",{name:r}))}return this.enqueue("verify",{name:e.name,item:e.item,value:e.value,routingKey:"verify"}),!0}}verify(e){var t=e.name,s=this.form.elements[t],e={status:void 0};return!this.isElementValid(s,!0,e)&&(e.status&&(this.errors[t]={status:e.status}),!1===this.nextFocus&&this.focus(t),!0)}suggest(e){const t=this.form.elements[e.name];return void 0!==t&&null!==t&&(t.items={message:{label:{status:"trivial"},enabled:!1}},this.invalidate(e.name),!0)}submit(e){if(!this.hasErrors()){for(const r in this.form.elements)this.form.elements[r].error=void 0;return this.enqueue("submit",{name:e.name,item:e.item,value:e.value}),!0}var t=this.errors;for(const o in t){const l=this.form.elements[o];void 0!==l&&null!==l&&(l.error=t[o],this.invalidate(o))}const s=[];let i=!1;for(const u of this.getInvalidElements()){const a=this.getParentSection(u);if(isMutuallyExclusiveSection(a)){var n=this.findName(a);const h=this.getMutuallyExclusiveSectionGroup(n);if(h){const c=s.find(e=>e.group===h);c?c.element.rowNumber>a.rowNumber&&(c.element=a):(s.push({group:h,element:a}),i=!0)}}else this.isSectionCollapsed(a)&&(a.collapsed=!1,i=!0)}for(const m of s)m.group.expandedSection=m.element;return i&&this.invalidate(),!(this.errors={})}hasErrors(){var e=this.errors;for(const s in e){var t=e[s];if(null!=t)return!0}return!1}find(e){if(null!=e)return"string"==typeof(e="object"==typeof e?e.name:e)?this.form.elements[e]:void 0}findName(e){for(const t in this.form.elements)if(this.form.elements[t]===e)return t}coerceNumber(e,t){return t=t||this.deriveLocale(),new NumberParser(t).parse(e)}formatNumber(e,t){return t=t||{locale:this.deriveLocale()},format(t,e)}renderState(e,t,s){return!1}getParentSection(e){e=e.section;if(e){e="string"==typeof e?e:e.name;return this.form.elements[e]}}isSectionCollapsed(e){return!(!e||e.type!==FormElementTypes.SECTION||!isCollapsibleSection(e)&&!isMutuallyExclusiveSection(e))&&!0===e.collapsed}isElementPositionBeforeLastFocused(e){var t=this.lastFocus;if(!t)return!0;if("footer"===e)return!1;if("footer"===t.name)return!0;if(e&&void 0!==t?.rowNumber&&void 0!==t.rowIndex){e=this.form.elements?.[e];if(e)return void 0!==e.rowNumber&&void 0!==e.rowIndex?e.rowNumber<t.rowNumber||e.rowNumber===t.rowNumber&&e.rowIndex<t.rowIndex:e.index<t.rowNumber||e.index===t.rowNumber&&0<t.rowIndex}return!1}setLastFocus(e,t){this.lastFocus={target:e},t&&(this.lastFocus.name=t,(t=this.form.elements?.[t])&&(void 0!==t.rowNumber&&void 0!==t.rowIndex?(this.lastFocus.rowNumber=t.rowNumber,this.lastFocus.rowIndex=t.rowIndex):(this.lastFocus.rowNumber=t.index,this.lastFocus.rowIndex=0)))}getAllSectionElements(){const e={};for(const s in this.form.elements){var t=this.form.elements[s];isSection(t)&&(e[s]=t)}return e}getMutuallyExclusiveSectionGroup(t){let s=this.mutuallyExclusiveSections[t];if(!s){var e=this.find(t);if(!e||!isMutuallyExclusiveSection(e))return;s=new MutuallyExclusiveSectionGroup({elementName:t,element:e});var i=e.format,e=this.getAllSectionElements();const o=Object.keys(sortAndFilter(e,e=>e.rowNumber));t=o.indexOf(t);for(let e=t-1;0<=e;e--){const l=o[e];var n=this.find(l);if(n.format!==i)break;s.unshift({elementName:l,element:n})}for(let e=t+1;e<o.length;e++){const l=o[e];var r=this.find(l);if(r.format!==i)break;s.push({elementName:l,element:r})}s.forEach(e=>{this.mutuallyExclusiveSections[e.elementName]=s})}return s}updateMutuallyExclusiveSections(t){const e=this.getMutuallyExclusiveSectionGroup(t);e.forEach(e=>{e.element.collapsed=e.elementName!==t}),this.refresh()}enforceMutuallyExclusiveConstraints(){const e=[];for(const s of Object.keys(this.form.elements).map(e=>({elementName:e,element:this.form.elements[e]})).filter(e=>isMutuallyExclusiveSection(e.element)&&!1!==e.element.visible&&!0!==e.element.collapsed).sort((e,t)=>e.element.rowNumber-t.element.rowNumber)){var t=this.getMutuallyExclusiveSectionGroup(s.elementName);-1===e.indexOf(t)?e.push(t):s.element.collapsed=!0}}async displayDialog(e,t){await Promise.resolve()}}export{defs,FormHost};
|
|
1
|
+
import Bluebird from"bluebird";import{Task}from"../Task.js";import{DEFAULT_LOCALE}from"../constants.js";import*as defs from"./FormDefinition.js";import MutuallyExclusiveSectionGroup from"./MutuallyExclusiveSectionGroup.js";import NumberParser from"./NumberParser.js";import{FormElementTypes}from"./constants.js";import{format}from"./numberFormatter.js";import*as presenter from"./presenter.js";import{isCollapsibleSection,isMutuallyExclusiveSection,isSection,sortAndFilter,text}from"./utils.js";export{defs};const guid="C0166F74-982A-464E-9FB6-9605CB7649C1:",eventName=guid+"FormEvent";function createEvent(e,t){return new CustomEvent(e,{bubbles:!1,cancelable:!1,detail:t})}function overlay(e,t){switch(typeof e){case"boolean":case"number":case"string":return e;case"object":break;default:return t}if(null===e)return t;if(e instanceof Array){let s=t;null==s&&(s=[]);let i=0;for(const t of e){const n=overlay(t,s[i]);void 0!==n&&(i<e.length?s[i]=n:s.push(n),++i)}return s}let s=t;void 0===s&&(s={});for(const t in e)s[t]=overlay(e[t],s[t]);return s}function createSubscription(e){const t=function(){return void 0!==e&&(t.active=!1,e(),!0)};return t.active=!0,t}export class FormHost{constructor(){this.form={defaults:{},elements:{}},this.errors={},this.refs={},this.enabled=!1,this.visible=!1,this.dismiss=!1,this.custom=!1,this.container=document.createElement("div"),this.eventIndex=0,this.eventQueue=[],this.domContainers={},this.mutuallyExclusiveSections={},this.nextFocus=!1,this.nextRefresh=!1,this.enqueueExternalEvent=e=>{const t={type:`external$${e.name}`,name:"header",argument:e};this.enqueue(t.type,t)}}deriveLocale(){return DEFAULT_LOCALE}mount(){const e=this.container,t=e.parentNode;null==t&&document.body.appendChild(e),this.update()}unmount(){const e=this.container,t=e.parentNode;null!=t&&t.removeChild(e)}observeFocus(e){if(this.enabled&&e instanceof HTMLElement&&(!this.lastFocus||this.lastFocus.target!==e)){let t=Object.entries(this.domContainers).filter(t=>t[1].contains(e));t.length>1&&(t=t.filter(e=>this.form.elements[e[0]].type!==FormElementTypes.SECTION));const s=t.length>0?t[0][0]:void 0;this.setLastFocus(e,s)}}focus(e){null==e&&(e=!1),!0===e&&(this.lastFocus=void 0),!1===e&&!1===(e=this.nextFocus)&&(e=!0),this.nextFocus=e,this.invalidate(!0!==e?e:void 0)}show(){const e=this.container;if(void 0===e)return!1;this.custom||void 0!==this.focusObserver||e.addEventListener("focus",this.focusObserver=e=>this.observeFocus(e.target),!0),this.enabled||(this.nextRefresh=!0,this.focus()),this.enforceMutuallyExclusiveConstraints();const t=this.errors;for(const e in t){const s=this.form.elements[e];null!=s&&(s.error=t[e],this.invalidate(e))}return this.idle(),!1!==this.nextRefresh&&(this.enabled=!0,this.visible=!0,this.mount()),this.enabled}isInvalid(e){return!!e.error&&!1!==e.visible}getInvalidElements(){return Object.keys(this.form.elements).map(e=>this.form.elements[e]).filter(this.isInvalid)}hasInvalidChild(e){for(const t in this.form.elements){const s=this.form.elements[t];if(this.isInvalid(s)&&this.getParentSection(s)===e)return!0}return!1}spin(){return void 0!==this.container&&(this.idle(),this.visible&&!this.enabled||(this.nextRefresh=!0,this.enabled=!1,this.visible=!0,this.mount()),this.visible)}hide(){return void 0!==this.container&&(this.idle(),this.visible&&(this.enabled=!1,this.visible=!1,this.unmount()),!0)}dispose(){if(!this.dismiss){this.dismiss=!0;const e=this.container;e.dispatchEvent(createEvent(eventName));let t=this.focusObserver;return void 0!==t&&(e.removeEventListener("focus",t,!0),t=void 0),this.idle(),this.unmount(),this.refs={},presenter.releaseForm(this.container),this.container=void 0,this.lastFocus=void 0,this.eventTask=void 0,!0}return!1}renderFocus(e,t){if(!(this.enabled&&e instanceof HTMLElement&&!1!==this.nextFocus))return!1;const s=this.nextFocus;if(void 0!==t){if(t===s||!0===s&&void 0===this.lastFocus)return this.nextFocus=!1,this.setLastFocus(e,t),e.focus(),!0}else{const t=this.lastFocus?.target;if(!0===s&&t instanceof HTMLElement&&e.contains(t))return this.nextFocus=!1,t.focus(),!0}return!1}renderText(e){return"string"==typeof e?e:text.isMarkdown(e)?text.markdownToText(e.markdown):""}translateText(e){return"string"==typeof e||text.isMarkdown(e)?e:text.isStatus(e)?e.status:void 0}renderVisual(e){return presenter.render(e,t=>{t&&e.props.name&&(this.domContainers[e.props.name]=t)})||presenter.renderNone(e)}qualifyDefault(e){const t=sortAndFilter(this.form.elements);for(const s in t){const i=t[s];if(null!=i&&!1!==i.visible&&i.enabled){if(i.default)return e.value=i.value,s;const t=sortAndFilter(i.items);if(null!=t)for(const i in t){const n=t[i];if(null!=n&&n.visible&&n.enabled&&n.default)return e.item=i,e.value=n.value,s}}}}qualify(e,t){if(null==t&&(t={}),"clicked"===e&&void 0===t.name&&(t.name=this.qualifyDefault(t)),t.type=e,void 0===t.routingKey){const s=t.name;t.routingKey=void 0!==s?e+"$"+s:e}return t}post(e,t){t=this.publish(e,t);const s=this.container;void 0!==s&&s.dispatchEvent(createEvent(eventName,t))}subscribe(e){let t=e;const s=this.container;if(void 0===s)return createSubscription();const i=function(){t=void 0,s.removeEventListener(eventName,n)},n=function(e){const s=e.detail;void 0!==s?Bluebird.resolve().then(function(){"function"==typeof t&&t(s)}):i()};return s.addEventListener(eventName,n),createSubscription(i)}refresh(e){if(!this.custom)if("string"==typeof e){const t=this.refs[e];presenter.refresh(t)}else this.refs={},presenter.refreshForm(this,this.container)}invalidate(e){const t=this.nextRefresh;"string"==typeof e&&!0!==t&&(!1===t?this.nextRefresh={[e]:!0}:t[e]=!0),void 0!==e&&!0!==e||(this.nextRefresh=!0),!1===e&&!1===t&&(this.nextRefresh={})}update(){const e=this.nextRefresh;if(!0===e&&(this.nextRefresh=!1,this.refresh()),"object"==typeof e){this.nextRefresh=!1;for(const t in e)!0===e[t]&&this.refresh(t)}}idle(){const e=this.timerHandle;void 0!==e&&(this.timerHandle=void 0,e())}busy(){if(void 0===this.timerHandle&&void 0!==this.container){let e=setTimeout(()=>this.spin());this.timerHandle=function(){void 0!==e&&(clearTimeout(e),e=void 0)}}}publish(e,t){return this.enabled?(t=this.enqueue(e,t),this.eventQueue.length>0&&this.spin(),t):this.qualify(e,t)}enqueue(e,t){return t=this.qualify(e,t),void 0!==this.eventTask?(this.resolveEvent(t),this.eventTask=void 0,t):(this.eventQueue.push(t),t)}dequeue(){const e=this.eventQueue;if(e.length>0){let t=this.eventIndex;const s=e[t++];return t>=e.length?e.length=this.eventIndex=0:this.eventIndex=t,s}}observe(){return Bluebird.attempt(()=>{if(void 0!==this.eventTask)return this.eventTask;const e=this.dequeue();return void 0!==e?e:this.show()?(this.eventTask=new Task(e=>{this.resolveEvent=e}),this.eventTask):void 0})}load(e,t){if(void 0===this.container)return!1;if(this.eventQueue.length=this.eventIndex=0,this.eventTask=void 0,this.errors={},this.lastFocus=void 0,this.nextFocus=!0,this.nextRefresh=!0,this.enqueue("load"),this.enqueue("prepare"),null!=e){let s={defaults:{},elements:{}};s=overlay(e,s),this.form=overlay(t,s);for(const e in this.form.elements){const t={showFilter:!1,checked:!1,enabled:!0,hoisted:!1,visible:!0,overlay:!1,default:!1,validates:!1,readOnly:!1,require:!1,autoActivate:!1};let s=this.form.elements[e];if(s=overlay(s,t),s.items)for(const e in s.items){const t={enabled:!0,checked:!1,visible:!0,default:!1,validates:!1};s.items[e]=overlay(s.items[e],t)}this.form.elements[e]=s}}return!0}route(e){switch(e.type){case"changed":return this.cascade(e.name);case"checked":return this.changed(e);case"clicked":return this.click(e);case"prepare":return this.hydrate(e);case"suggest":return this.suggest(e);case"validate":return this.verify(e);case"verify":return this.submit(e)}return!1}changed(e){return this.enqueue("changed",{name:e.name,item:e.item,value:e.value}),!0}isElementValid(e,t=!0,s={status:void 0}){return null!=e&&(s.status=void 0,text.isInvalidError(e.error)?(s.status="invalid",!1):!0!==e.require||(this.isElementEffectivelyVisible(e)?!!this.isElementValueDefined(e)||(s.status="missing",!1):t))}isElementEffectivelyVisible(e){if(null==e)return!1;const t=this.getParentSection(e);return!1!==t?.visible&&!1!==e.visible}isElementValueDefined(e){if(null==e)return!1;if(e.type===FormElementTypes.CHECKBOX)return!0;const t=e.current;if(null!=t)return!0;const s=e.value;if(null!=s&&""!==s)return!0;const i=e.items;if(null!=i)for(const e in i){const t=i[e];if(null!=t&&!0===t.checked)return!0}return!1}trap(e){switch(e.type){case"populate":case"load":case"suggest":break;default:return!1}const t=e.name,s=this.find(t);if(null==s)return!1;const i=s.dependsOn;if("string"!=typeof i)return!1;const n=this.find(i);return s.enabled=this.isElementEffectivelyVisible(n)&&this.isElementValueDefined(n),this.invalidate(t),!s.enabled}cascade(e){const t=this.find(e);if(null==t||!1===t.dependsOn)return!1;const s={[e]:!0},i=sortAndFilter(this.form.elements);for(const t in i){const n=i[t],r=n.dependsOn;if("string"==typeof r){const i=this.find(r);void 0!==i&&"string"!=typeof i.dependsOn&&(i.dependsOn=!0),!0===s[r]&&(s[t]=!0,n.checked=!1,n.current=void 0,n.label=void 0,n.items=void 0,n.value=void 0,this.invalidate(t),n.dependsOn===e&&this.enqueue("populate",{name:t}))}else n.dependsOn=!1}return!0}click(e){const t=this.form.elements[e.name];return null!=t&&t.type==FormElementTypes.BUTTONBAR&&this.validate(e)}hasInitialSelectionToDependOn(e){const t=this.form.elements[e];return t.type===FormElementTypes.DROPDOWNLIST&&(void 0!==t.current&&null!==t.current)}hydrate(e){const t=sortAndFilter(this.form.elements);for(const e in t){const t=this.form.elements[e].dependsOn;("string"!=typeof t||this.hasInitialSelectionToDependOn(t))&&this.enqueue("populate",{name:e}),this.enqueue("load",{name:e})}return!0}shouldTriggerValidation(e){const t=this.find(e.name);if(null!=t&&"string"==typeof e.value){const s=e.item;if("string"==typeof s){const e=t.items;if(null!=e){const t=e[s];if(null!=t)return!0===t.validates}return}return!0===t.validates}}validate(e){const t=this.shouldTriggerValidation(e);if(!0===t){const t=this.errors={},s=sortAndFilter(this.form.elements);for(const e in s){const i=s[e];null!=i&&(t[e]=void 0,this.enqueue("validate",{name:e}))}return this.enqueue("verify",{name:e.name,item:e.item,value:e.value,routingKey:"verify"}),!0}return!1===t&&(this.enqueue("end",{name:e.name,item:e.item,value:e.value,routingKey:"end"}),!0)}verify(e){const t=e.name,s=this.form.elements[t],i={status:void 0},n=this.isElementValid(s,!0,i);return t===this.lastFocus?.name&&(this.lastFocus.isInvalid=!n),!n&&(i.status&&(this.errors[t]={status:i.status}),!1===this.nextFocus&&t!==this.lastFocus?.name&&this.isElementPositionBeforeLastFocused(t,!0)&&this.focus(t),!0)}suggest(e){const t=this.form.elements[e.name];return null!=t&&(t.items={message:{label:{status:"trivial"},enabled:!1}},this.invalidate(e.name),!0)}submit(e){if(!this.hasErrors()){for(const e in this.form.elements)this.form.elements[e].error=void 0;return this.enqueue("submit",{name:e.name,item:e.item,value:e.value}),!0}const t=this.errors;for(const e in t){const s=this.form.elements[e];null!=s&&(s.error=t[e],this.invalidate(e))}const s=this.getInvalidElements(),i=[];let n=!1;for(const e of s){const t=this.getParentSection(e);if(isMutuallyExclusiveSection(t)){const e=this.findName(t),s=this.getMutuallyExclusiveSectionGroup(e);if(s){const e=i.find(e=>e.group===s);e?e.element.rowNumber>t.rowNumber&&(e.element=t):(i.push({group:s,element:t}),n=!0)}}else this.isSectionCollapsed(t)&&(t.collapsed=!1,n=!0)}for(const e of i)e.group.expandedSection=e.element;return n&&this.invalidate(),this.errors={},!1}hasErrors(){const e=this.errors;for(const t in e){const s=e[t];if(null!=s)return!0}return!1}find(e){if(null!=e)return"object"==typeof e&&(e=e.name),"string"==typeof e?this.form.elements[e]:void 0}findName(e){for(const t in this.form.elements)if(this.form.elements[t]===e)return t}coerceNumber(e,t){return t=t||this.deriveLocale(),new NumberParser(t).parse(e)}formatNumber(e,t){return t||(t={locale:this.deriveLocale()}),format(t,e)}renderState(e,t,s){return!1}getParentSection(e){const t=e.section;if(!t)return;const s="string"==typeof t?t:t.name;return this.form.elements[s]}isSectionCollapsed(e){return!(!e||e.type!==FormElementTypes.SECTION||!isCollapsibleSection(e)&&!isMutuallyExclusiveSection(e))&&!0===e.collapsed}isElementPositionBeforeLastFocused(e,t=!1){const s=this.lastFocus;if(!s)return!0;if(t&&!s.isInvalid)return!0;if("footer"===e)return!1;if("footer"===s.name)return!0;if(e&&void 0!==s.rowNumber&&void 0!==s.rowIndex){const t=this.form.elements?.[e];if(t)return void 0!==t.rowNumber&&void 0!==t.rowIndex?t.rowNumber<s.rowNumber||t.rowNumber===s.rowNumber&&t.rowIndex<s.rowIndex:t.index<s.rowNumber||t.index===s.rowNumber&&s.rowIndex>0}return!1}setLastFocus(e,t,s){if(this.lastFocus={target:e},!t)return;this.lastFocus.name=t;const i=this.form.elements?.[t];i&&(void 0!==i.rowNumber&&void 0!==i.rowIndex?(this.lastFocus.rowNumber=i.rowNumber,this.lastFocus.rowIndex=i.rowIndex):(this.lastFocus.rowNumber=i.index,this.lastFocus.rowIndex=0),this.lastFocus.isInvalid=s??!!i.error)}getAllSectionElements(){const e={};for(const t in this.form.elements){const s=this.form.elements[t];isSection(s)&&(e[t]=s)}return e}getMutuallyExclusiveSectionGroup(e){let t=this.mutuallyExclusiveSections[e];if(!t){const s=this.find(e);if(!s||!isMutuallyExclusiveSection(s))return;t=new MutuallyExclusiveSectionGroup({elementName:e,element:s});const i=s.format,n=this.getAllSectionElements(),r=Object.keys(sortAndFilter(n,e=>e.rowNumber)),o=r.indexOf(e);for(let e=o-1;e>=0;e--){const s=r[e],n=this.find(s);if(n.format!==i)break;t.unshift({elementName:s,element:n})}for(let e=o+1;e<r.length;e++){const s=r[e],n=this.find(s);if(n.format!==i)break;t.push({elementName:s,element:n})}t.forEach(e=>{this.mutuallyExclusiveSections[e.elementName]=t})}return t}updateMutuallyExclusiveSections(e){this.getMutuallyExclusiveSectionGroup(e).forEach(t=>{t.element.collapsed=t.elementName!==e}),this.refresh()}enforceMutuallyExclusiveConstraints(){const e=Object.keys(this.form.elements).map(e=>({elementName:e,element:this.form.elements[e]})).filter(e=>isMutuallyExclusiveSection(e.element)&&!1!==e.element.visible&&!0!==e.element.collapsed).sort((e,t)=>e.element.rowNumber-t.element.rowNumber),t=[];for(const s of e){const e=this.getMutuallyExclusiveSectionGroup(s.elementName);-1===t.indexOf(e)?t.push(e):s.element.collapsed=!0}}async displayDialog(e,t){await Promise.resolve()}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export default class MutuallyExclusiveSectionGroup extends Array{get expandedSection(){return this.find(e=>!0!==e.element.collapsed)?.element}set expandedSection(
|
|
1
|
+
export default class MutuallyExclusiveSectionGroup extends Array{get expandedSection(){return this.find(e=>!0!==e.element.collapsed)?.element}set expandedSection(e){const t=this.find(t=>t.element===e);if(!t)throw new Error("Element is not present in the group.");this.forEach(e=>e.element.collapsed=e!==t)}getElement(e){return this.find(t=>t.elementName===e)?.element}get hasExpandedSection(){return void 0!==this.expandedSection}}
|
package/forms/NumberParser.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export default class NumberParser{constructor(e){this._biDirectionalChars=/[\u061c\u200E\u200F]/;const r=new Intl.NumberFormat(e).formatToParts(-12345.6),
|
|
1
|
+
export default class NumberParser{constructor(e){this._biDirectionalChars=/[\u061c\u200E\u200F]/;const r=new Intl.NumberFormat(e).formatToParts(-12345.6),t=Array.from(new Intl.NumberFormat(e,{useGrouping:!1}).format(9876543210)).reverse(),i=new Map(t.map((e,r)=>[e,r.toString()]));this._group=new RegExp(`[${r.find(e=>"group"===e.type).value}]`,"g"),this._decimal=new RegExp(`[${r.find(e=>"decimal"===e.type).value}]`),this._minus=new RegExp(`[${r.find(e=>"minusSign"===e.type).value}]`),this._numeral=new RegExp(`[${t.join("")}]`,"g"),this._index=e=>i.get(e)}parse(e){const r=e.trim().replace(this._biDirectionalChars,"").replace(this._group,"").replace(this._decimal,".").replace(this._minus,"-").replace(this._numeral,this._index);return r?+r:NaN}}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This implementation is intended to replace @arcgis/core/Color which we don't use elsewhere in Designer.
|
|
3
|
+
*/
|
|
4
|
+
export default class WorkflowColor {
|
|
5
|
+
private values;
|
|
6
|
+
get r(): number;
|
|
7
|
+
get g(): number;
|
|
8
|
+
get b(): number;
|
|
9
|
+
get a(): number;
|
|
10
|
+
constructor(value: number[] | string);
|
|
11
|
+
clone(): WorkflowColor;
|
|
12
|
+
equals(other: WorkflowColor): boolean;
|
|
13
|
+
toCss(): string;
|
|
14
|
+
toJSON(): number[];
|
|
15
|
+
toString(): string;
|
|
16
|
+
static fromJSON(value: number[]): WorkflowColor;
|
|
17
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import rgba from"color-rgba";export default class WorkflowColor{get r(){return this.values[0]}get g(){return this.values[1]}get b(){return this.values[2]}get a(){return this.values[3]}constructor(t){if(this.values=[0,0,0,1],"string"==typeof t){if(this.values=rgba(t),0===this.values.length)throw new Error("Invalid rgb value: "+t)}else this.values=[...t]}clone(){return new WorkflowColor(this.values)}equals(t){const{r:r,g:s,b:e,a:i}=t;return this.r===r&&this.g===s&&this.b===e&&this.a===i}toCss(){return 1===this.a?`rgb(${this.r},${this.g},${this.b})`:`rgba(${this.r},${this.g},${this.b},${this.a})`}toJSON(){return[...this.values]}toString(){return`rgba(${this.r},${this.g},${this.b},${this.a})`}static fromJSON(t){if(4!==t.length)throw new Error("Invalid JSON. The array must contain four values.");return new WorkflowColor(t)}}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import WorkflowColor from "./WorkflowColor";
|
|
2
|
+
/**
|
|
3
|
+
* Darkens the color by an amount and returns the new color.
|
|
4
|
+
*
|
|
5
|
+
* @param amount Ranges from 0..1.
|
|
6
|
+
* @param color The color to darken.
|
|
7
|
+
*/
|
|
8
|
+
export declare function darken(amount: number, color: WorkflowColor): WorkflowColor;
|
|
9
|
+
/**
|
|
10
|
+
* Lightens the color by an amount and returns the new color.
|
|
11
|
+
*
|
|
12
|
+
* @param amount Ranges from 0..1.
|
|
13
|
+
* @param color The color to lighten.
|
|
14
|
+
*/
|
|
15
|
+
export declare function lighten(amount: number, color: WorkflowColor): WorkflowColor;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import WorkflowColor from"./WorkflowColor.js";export function darken(o,r){const a=colorToHsv(r);return a.v=a.v*(1-clamp(o,0,1)),hsvToColor(a)}export function lighten(o,r){const a=clamp(o,0,1),t=colorToHsv(r);return t.v=t.v+(1-t.v)*a,t.s=t.s*(1-a),hsvToColor(t)}function clamp(o,r,a){return Math.min(Math.max(o,r),a)}function hsvToRgb(o){let r=0,a=0,t=0;const n=o.s*o.v,c=6*o.h,e=n*(1-Math.abs(c%2-1)),s=o.v-n;switch(Math.floor(c)%6){case 0:r=n+s,a=e+s,t=s;break;case 1:r=e+s,a=n+s,t=s;break;case 2:r=s,a=n+s,t=e+s;break;case 3:r=s,a=e+s,t=n+s;break;case 4:r=e+s,a=s,t=n+s;break;case 5:r=n+s,a=s,t=e+s}return{r:r,g:a,b:t,a:o.a}}function hsvToColor(o){const r=hsvToRgb(o);return r.r=Math.round(255*r.r),r.g=Math.round(255*r.g),r.b=Math.round(255*r.b),r.a=r.a||1,new WorkflowColor(`rgba(${r.r},${r.g},${r.b},${r.a})`)}function colorToHsv(o){return decimalRgbToHsv(colorToDecimalRgb(o))}function colorToDecimalRgb(o){return[o.r/255,o.g/255,o.b/255,o.a]}function decimalRgbToHsv(o){let r;const a=Math.max(o[0],o[1],o[2]),t=a-Math.min(o[0],o[1],o[2]);let n;n=0===t?0:a===o[0]?(o[1]-o[2])/t:a===o[1]?2+(o[2]-o[0])/t:4+(o[0]-o[1])/t,r=n/6,r<0&&(r+=1);return{h:r,s:0===t?0:t/a,v:a,a:o.length>3?o[3]:1}}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import WorkflowColor from "./WorkflowColor";
|
|
2
|
+
/**
|
|
3
|
+
* Creates a colour palette from a provided accent color.
|
|
4
|
+
*
|
|
5
|
+
* @param accentColor The accent colour to be used in the palette.
|
|
6
|
+
*/
|
|
7
|
+
export declare function createPalette(accentColor: WorkflowColor): {
|
|
8
|
+
accentIconForeground: WorkflowColor;
|
|
9
|
+
buttonBackgroundDisabled: WorkflowColor;
|
|
10
|
+
buttonBorderDisabled: WorkflowColor;
|
|
11
|
+
buttonBorderHover: WorkflowColor;
|
|
12
|
+
buttonForegroundDisabled: WorkflowColor;
|
|
13
|
+
buttonIcon: WorkflowColor;
|
|
14
|
+
buttonIconDisabled: WorkflowColor;
|
|
15
|
+
buttonIconHover: WorkflowColor;
|
|
16
|
+
emphasizedButtonBackgroundDisabled: WorkflowColor;
|
|
17
|
+
emphasizedButtonBorderDisabled: WorkflowColor;
|
|
18
|
+
emphasizedButtonBorderHover: WorkflowColor;
|
|
19
|
+
emphasizedButtonForegroundDisabled: WorkflowColor;
|
|
20
|
+
primaryBackground: WorkflowColor;
|
|
21
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import WorkflowColor from"./WorkflowColor.js";import{darken,lighten}from"./colors.js";const graySteps=generateSteps(new WorkflowColor("#323232")),white=new WorkflowColor("#ffffff");export function createPalette(e){const o=generateSteps(e);return{accentIconForeground:o[500],buttonBackgroundDisabled:graySteps[100],buttonBorderDisabled:graySteps[300],buttonBorderHover:white,buttonForegroundDisabled:graySteps[400],buttonIcon:o[500],buttonIconDisabled:graySteps[400],buttonIconHover:white,emphasizedButtonBackgroundDisabled:o[100],emphasizedButtonBorderDisabled:o[100],emphasizedButtonBorderHover:o[500],emphasizedButtonForegroundDisabled:o[700],primaryBackground:white}}function generateSteps(e){const o=.18;return{50:lighten(5*o,e),100:lighten(.72,e),200:lighten(.54,e),300:lighten(.36,e),400:lighten(o,e),500:e,600:darken(.126,e),700:darken(.252,e),800:darken(.378,e),900:darken(.504,e)}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import Box from"@vertigis/react-ui/Box";import{styled}from"@vertigis/react-ui/styles";import*as React from"react";const StyledBox=styled(Box)(({theme:{spacing:
|
|
1
|
+
import Box from"@vertigis/react-ui/Box";import{styled}from"@vertigis/react-ui/styles";import*as React from"react";const StyledBox=styled(Box)(({theme:{spacing:o}})=>({marginBottom:o(2),marginTop:o(2)})),AccordionGroup=({className:o,component:t})=>{const{children:e}=t.props;return React.createElement(StyledBox,{className:o},e)};export default AccordionGroup;
|
|
@@ -4,5 +4,5 @@ import type { defs } from "../FormHost";
|
|
|
4
4
|
/**
|
|
5
5
|
* The component for the "Auto Complete" Form Element.
|
|
6
6
|
*/
|
|
7
|
-
declare const AutoComplete:
|
|
7
|
+
declare const AutoComplete: React.ForwardRefExoticComponent<FormElementProps<defs.Value | undefined> & React.RefAttributes<HTMLDivElement>>;
|
|
8
8
|
export default AutoComplete;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import BaseAutoComplete,{autocompleteClasses,HighlightOption}from"@vertigis/react-ui/Autocomplete";import FormLabelTextField from"@vertigis/react-ui/FormLabelTextField";import Popper from"@vertigis/react-ui/Popper";import Skeleton from"@vertigis/react-ui/Skeleton";import{styled}from"@vertigis/react-ui/styles";import clsx from"clsx";import{useContext,useEffect,useMemo,useRef,useState}from"react";import*as React from"react";import{ExclusiveTimer}from"../ExclusiveTimer.js";import{autoCompletePropertyConstraints}from"../elements/AutoComplete.js";import HostContext from"../hostContext.js";import{getKeyString}from"../keyboard.js";import{getItemId,inspectItems,makeSafeClassName}from"../utils.js";import FormElement from"./FormElement.js";import{useFocusCallback}from"./common.js";const StyledAutoComplete=styled(BaseAutoComplete)(()=>({[`.${autocompleteClasses.endAdornment}`]:{right:1}})),popperClasses={skeletonOption:"skeleton-option"},StyledPopper=styled(Popper)(()=>({[`.${autocompleteClasses.listbox}`]:{[`.${autocompleteClasses.option}`]:{display:"block",[`&.${popperClasses.skeletonOption}`]:{'&[data-option-index="0"]':{span:{width:"70%"}},'&[data-option-index="1"]':{span:{width:"85%"}},'&[data-option-index="2"]':{span:{width:"55%"}}}}}})),StyledSkeleton=styled(Skeleton)(()=>({fontSize:"1.25rem",lineHeight:"inherit"})),pendingOption={enabled:!1,label:""},pendingOptions=[pendingOption,pendingOption,pendingOption],AutoComplete=({className:e,component:t,current:
|
|
1
|
+
import BaseAutoComplete,{autocompleteClasses,HighlightOption}from"@vertigis/react-ui/Autocomplete";import FormLabelTextField from"@vertigis/react-ui/FormLabelTextField";import Popper from"@vertigis/react-ui/Popper";import Skeleton from"@vertigis/react-ui/Skeleton";import{styled}from"@vertigis/react-ui/styles";import clsx from"clsx";import{forwardRef,useContext,useEffect,useMemo,useRef,useState}from"react";import*as React from"react";import{ExclusiveTimer}from"../ExclusiveTimer.js";import{autoCompletePropertyConstraints}from"../elements/AutoComplete.js";import HostContext from"../hostContext.js";import{getKeyString}from"../keyboard.js";import{getItemId,inspectItems,makeSafeClassName}from"../utils.js";import FormElement from"./FormElement.js";import{useFocusCallback}from"./common.js";const StyledAutoComplete=styled(BaseAutoComplete)(()=>({[`.${autocompleteClasses.endAdornment}`]:{right:1}})),popperClasses={skeletonOption:"skeleton-option"},StyledPopper=styled(Popper)(()=>({[`.${autocompleteClasses.listbox}`]:{[`.${autocompleteClasses.option}`]:{display:"block",[`&.${popperClasses.skeletonOption}`]:{'&[data-option-index="0"]':{span:{width:"70%"}},'&[data-option-index="1"]':{span:{width:"85%"}},'&[data-option-index="2"]':{span:{width:"55%"}}}}}})),StyledSkeleton=styled(Skeleton)(()=>({fontSize:"1.25rem",lineHeight:"inherit"})),pendingOption={enabled:!1,label:""},pendingOptions=[pendingOption,pendingOption,pendingOption],AutoComplete=forwardRef(({className:e,component:t,current:o,delay:r,element:n,enabled:l,error:s,items:a,label:i,minLength:p,name:u,prompt:m,tooltip:c,raiseEvent:d,setProperty:f,setValue:x,value:g},C)=>{const y=useContext(HostContext),[v,T]=useState(),[b,h]=useState(""),[O,S]=useState([]),[E,k]=useState(null),P=useRef(!1),R=useRef(),I=useRef(!1),N=useFocusCallback(l,u,y),F=useRef({}),w=useRef({}),A=useMemo(()=>{let e=r;return("number"!=typeof e||isNaN(e))&&(e=autoCompletePropertyConstraints.delay.default),Math.max(e,autoCompletePropertyConstraints.delay.minimum)},[r]),L=useMemo(()=>{let e=p;return("number"!=typeof e||isNaN(e))&&(e=autoCompletePropertyConstraints.minLength.default),Math.max(e,autoCompletePropertyConstraints.minLength.minimum)},[p]),{clearText:j,closeText:M,noOptionsText:H,openText:B,placeholder:K,title:$}=useMemo(()=>({clearText:y.renderText("@common-clear"),closeText:y.renderText("@common-close"),noOptionsText:y.renderText({status:"trivial"}),openText:y.renderText("@common-open"),placeholder:y.renderText(m),title:y.renderText(c)}),[y,m,c]),V=t.timer||(t.timer=new ExclusiveTimer),D=()=>{d("suggest",g,b,void 0,V.cancellationToken),S(pendingOptions)},z=()=>{f("items",{}),f("label",void 0)};useEffect(()=>{"clear"===v?z():"input"===v&&(i&&f("label",void 0),P.current=!0,b.length>=L?(f("current",void 0),V.reset(),V.start(A,D)):Object.keys(a||{}).length>0&&z())},[v,b]),useEffect(()=>{const e=E?.value;if(g!==e){const t=getItemId(E,F.current),o=t?w.current[t]:void 0;f("current",t),f("label",o),x(e,{argument:o})}},[E]),useEffect(()=>{const{current:e,items:t,label:r,value:n}=inspectItems(o,a,g);f("current",e),f("label",r||i),f("value",n,!1);const l={};let s=null;const p=[];for(const o in t){const r=t[o];p.push(r);const n=y.renderText(r.label).trim();l[o]=n,e&&o===e&&(s=r)}w.current=l,F.current=t,S(p),k(s)},[a]),useEffect(()=>{const e="string"==typeof o?o:void 0,t=e?F.current[e]:void 0,r=e?w.current[e]:void 0;t?(f("label",r),f("value",t.value),h(r||"")):(f("value",void 0),P.current||h("")),k(t||null)},[o]),useEffect(()=>{P.current||I.current||h(""),P.current=!1,I.current=!1},[i]);const W=y.renderText(i);return React.createElement(FormElement,{className:e,element:n,inputId:R.current,name:u,ref:C},e=>React.createElement(StyledAutoComplete,{autoSelect:!0,clearOnBlur:!1,clearOnEscape:!0,clearText:j,closeText:M,disabled:!l,filterOptions:e=>e,getOptionDisabled:e=>!1===e.enabled,getOptionKey:e=>getItemId(e,F.current)||"",getOptionLabel:e=>{const t=getItemId(e,F.current);return t?w.current[t]:""},inputValue:b,noOptionsText:H,onBlur:()=>{1===O.length&&b.toLowerCase()===w.current[0]?.toLowerCase()?(h(w.current[0]),k(O[0])):f("label",b)},onChange:(e,t)=>{I.current=!0,k(t)},onInputChange:(e,t,o)=>{h(t),T(o)},onKeyDown:e=>{"enter"===getKeyString(e)&&e.stopPropagation()},openText:B,options:O,renderOption:(e,t,{inputValue:o})=>{if(t===pendingOption){const t=clsx(e.className,popperClasses.skeletonOption);return React.createElement("li",{...e,className:t,key:e.id},React.createElement(StyledSkeleton,null))}const r=getItemId(t,F.current),n={...e,className:clsx(e.className,t.styleName?makeSafeClassName(t.styleName):void 0),title:t.tooltip?y.renderText(t.tooltip):void 0,inputText:o,optionText:r?w.current[r]:""};return React.createElement(HighlightOption,{...n})},renderInput:t=>(t.inputProps={...t.inputProps,...e,value:t.inputProps.value||W,placeholder:K,title:$},R.current=t.id,React.createElement(FormLabelTextField,{error:!!s,...t,fullWidth:!0,inputRef:N})),slotProps:{popper:{component:StyledPopper}},value:E}))});export default AutoComplete;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import type { Item } from "../FormDefinition";
|
|
3
|
+
import type { ButtonProps as MuiButtonProps } from "@vertigis/react-ui/Button";
|
|
4
|
+
export declare const buttonClasses: {
|
|
5
|
+
iconOnly: string;
|
|
6
|
+
iconStacked: string;
|
|
7
|
+
styleRounded: string;
|
|
8
|
+
border: string;
|
|
9
|
+
noBorder: string;
|
|
10
|
+
};
|
|
11
|
+
interface ButtonProps extends MuiButtonProps {
|
|
12
|
+
item: Item;
|
|
13
|
+
}
|
|
14
|
+
declare const _default: React.ForwardRefExoticComponent<Omit<ButtonProps, "ref"> & React.RefAttributes<HTMLButtonElement>>;
|
|
15
|
+
export default _default;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import Button from"@vertigis/react-ui/Button";import{NoIcon}from"@vertigis/react-ui/icons";import{styled,useTheme}from"@vertigis/react-ui/styles";import clsx from"clsx";import*as React from"react";import{forwardRef,Children,useMemo,Suspense,lazy}from"react";import WorkflowColor from"../branding/WorkflowColor.js";import{createPalette}from"../branding/createPalette.js";import{getBorderStyle,getEmphasis,getIconPosition,getItemColors,getItemSize,getShowBorder}from"../utils.js";function emphasisToButtonProps(e,o){switch(o&&(e="high"),e){case"low":return{variant:"text",color:"inherit"};case"custom":case"medium":return{variant:"outlined",color:"inherit"};case"high":return{variant:"contained",color:"primary"};default:throw new Error(`Invalid value "${e}" for Emphasis.`)}}function generateButtonOverrides(e,o){const t=e=>Object.fromEntries(Object.entries(e).map(([e,o])=>[e,o.toCss()])),r=e&&t(createPalette(e)),n=o&&t(createPalette(o)),{accentIconForeground:s,buttonForegroundDisabled:a,buttonIcon:i,buttonIconDisabled:d,buttonIconHover:u,buttonBorderDisabled:l,buttonBorderHover:c,emphasizedButtonBackgroundDisabled:m}=r??{},{buttonBackgroundDisabled:b,emphasizedButtonBorderDisabled:g,emphasizedButtonBorderHover:B,emphasizedButtonForegroundDisabled:p,primaryBackground:h}=n??{};return{accentIconForeground:s,buttonBackground:o?.toCss(),buttonBackgroundDisabled:b,buttonBackgroundHover:e?.toCss(),buttonBorder:e?.toCss(),buttonBorderDisabled:l,buttonBorderHover:c,buttonForeground:e?.toCss(),buttonForegroundDisabled:a,buttonForegroundHover:o?.toCss(),buttonIcon:i,buttonIconDisabled:d,buttonIconHover:u,emphasizedButtonBackground:e?.toCss(),emphasizedButtonBackgroundDisabled:m,emphasizedButtonBackgroundHover:o?.toCss(),emphasizedButtonBorder:o?.toCss(),emphasizedButtonBorderDisabled:g,emphasizedButtonBorderHover:B,emphasizedButtonForeground:o?.toCss(),emphasizedButtonForegroundDisabled:p,emphasizedButtonForegroundHover:e?.toCss(),primaryBackground:h}}const PREFIX="WorkflowButton";export const buttonClasses={iconOnly:`${PREFIX}-icon-only`,iconStacked:`${PREFIX}-icon-stacked`,styleRounded:`${PREFIX}-rounded`,border:`${PREFIX}-border`,noBorder:`${PREFIX}-noBorder`};export default forwardRef(({children:e,className:o,disabled:t,item:r,onClick:n,title:s},a)=>{const i=useTheme(),d=r.appearance??{},{backgroundColor:u,foregroundColor:l}=getItemColors(d,i),c=useMemo(()=>{const e=u||l?generateButtonOverrides(l?new WorkflowColor(l):void 0,u?new WorkflowColor(u):void 0):void 0,o=e?Object.fromEntries(Object.keys(e).map(o=>e[o]&&[[`--${o}`],e[o]]).filter(e=>!!e)):{};return styled(Button)({[`&.${buttonClasses.iconOnly}`]:{minWidth:"auto",padding:8,lineHeight:0,"&.MuiButton-sizeSmall":{padding:6},"&.MuiButton-sizeLarge":{padding:10},"& .MuiButton-startIcon":{margin:0},"& .MuiButton-endIcon":{margin:0}},[`&.${buttonClasses.iconStacked}`]:{flexDirection:"column","& .MuiButton-startIcon":{marginTop:6,marginRight:0,marginLeft:0},"& .MuiButton-endIcon":{marginBottom:6,marginRight:0,marginLeft:0}},[`&.${buttonClasses.styleRounded}`]:{borderRadius:"1000px"},[`&.${buttonClasses.noBorder}`]:{border:0,outline:0},[`&.${buttonClasses.border}`]:{border:1,borderStyle:"solid"},[`&.${buttonClasses.border}:hover`]:{border:1,borderStyle:"solid",borderColor:"transparent"},...o})},[u,l]),{icon:m}=d,b=getIconPosition(d.iconPosition),g=useMemo(()=>{let e;return m&&(e=lazy(()=>import("@vertigis/react-ui/icons").then(e=>Promise.resolve({default:e[m]??NoIcon})))),e},[m]);let B,p;if(g){const e=React.createElement(Suspense,{fallback:m},React.createElement(g,null));switch(b){case"above":case"before":B=e;break;case"below":case"after":p=e}}const h=getEmphasis(d.emphasis),f=getShowBorder(h,d.showBorder),C=getItemSize(d.size),I=getBorderStyle(d.borderStyle),v=(B??p)&&0===Children.toArray(e).length,k=clsx({classNameProp:o,[buttonClasses.iconOnly]:v,[buttonClasses.iconStacked]:!v&&("above"===b||"below"===b),[buttonClasses.styleRounded]:"rounded"===I,[buttonClasses.border]:f,[buttonClasses.noBorder]:!f});return React.createElement(c,{className:k,disabled:t,endIcon:p,onClick:n,ref:a,size:C,startIcon:B,title:s,...emphasisToButtonProps(h,r.default)},e)});
|
|
@@ -4,5 +4,5 @@ import type { defs } from "../FormHost";
|
|
|
4
4
|
/**
|
|
5
5
|
* The component for the "Button Bar" Form Element.
|
|
6
6
|
*/
|
|
7
|
-
declare const ButtonBar:
|
|
7
|
+
declare const ButtonBar: React.ForwardRefExoticComponent<FormElementProps<defs.Value | undefined> & React.RefAttributes<HTMLDivElement>>;
|
|
8
8
|
export default ButtonBar;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import Stack,{stackClasses}from"@vertigis/react-ui/Stack";import{styled}from"@vertigis/react-ui/styles";import*as React from"react";import{forwardRef,useContext}from"react";import{Orientation}from"../constants.js";import HostContext from"../hostContext.js";import{makeSafeClassName,sortAndFilter}from"../utils.js";import Button from"./Button.js";import FormElement from"./FormElement.js";import Markdown from"./Markdown.js";import{useFocusCallback}from"./common.js";const StyledFormElement=styled(FormElement)(({theme:{spacing:e}})=>({[`.${stackClasses.root}`]:{alignItems:"flex-start",flexWrap:"wrap",marginTop:e(1),marginBottom:e(1)}})),ButtonBar=forwardRef(({className:e,element:t,enabled:o,items:r,name:a,orientation:n,raiseEvent:s},m)=>{const l=useContext(HostContext),i=sortAndFilter(r),c=useFocusCallback(o,a,l),d=o?Object.entries(i).filter(e=>!1!==e[1].enabled&&!1!==e[1].visible)[0]:void 0,f=d?d[0]:void 0,u=(e,t)=>function(){s("clicked",t,void 0,e)};return React.createElement(StyledFormElement,{className:e,component:"fieldset",element:t,name:a,ref:m},React.createElement(Stack,{direction:n===Orientation.VERTICAL?"column":"row",spacing:1},Object.keys(i).map(e=>{const t=i[e],r=!1!==t.visible;if(!r)return null;const a=t.styleName?makeSafeClassName(t.styleName):void 0,n=o&&!1!==t.enabled&&r,s=l.renderText(t.tooltip),{value:m}=i[e],d=t.label?React.createElement(Markdown,{inline:!0,text:t.label||""}):null;return React.createElement(Button,{className:a,disabled:!n,item:t,key:e,onClick:u(e,m),ref:f&&e===f?c:void 0,title:s},d)})))});export default ButtonBar;
|
|
@@ -3,5 +3,5 @@ import type { FormElementProps } from "../..";
|
|
|
3
3
|
/**
|
|
4
4
|
* The component for the "Check Box" Form Element.
|
|
5
5
|
*/
|
|
6
|
-
declare const CheckBox:
|
|
6
|
+
declare const CheckBox: React.ForwardRefExoticComponent<FormElementProps<undefined> & React.RefAttributes<HTMLDivElement>>;
|
|
7
7
|
export default CheckBox;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import Checkbox from"@vertigis/react-ui/Checkbox";import FormControlLabel from"@vertigis/react-ui/FormControlLabel";import*as React from"react";import{useContext}from"react";import HostContext from"../hostContext.js";import FormElement from"./FormElement.js";import Markdown from"./Markdown.js";import{useFocusCallback}from"./common.js";const CheckBox=({checked:
|
|
1
|
+
import Checkbox from"@vertigis/react-ui/Checkbox";import FormControlLabel from"@vertigis/react-ui/FormControlLabel";import*as React from"react";import{forwardRef,useContext}from"react";import HostContext from"../hostContext.js";import FormElement from"./FormElement.js";import Markdown from"./Markdown.js";import{useFocusCallback}from"./common.js";const CheckBox=forwardRef(({checked:e,className:t,element:o,enabled:r,label:a,name:c,raiseEvent:m,setProperty:n,tooltip:l,value:s},i)=>{const d=useContext(HostContext),C=d.renderText(l),f=useFocusCallback(r,c,d),k=e=>{const t=e.target.checked;n("checked",t),m("changed",t?s:void 0,t)};return React.createElement(FormElement,{className:t,element:o,name:c,ref:i},t=>React.createElement(FormControlLabel,{control:React.createElement(Checkbox,{checked:e,onChange:k,slotProps:{input:{...t,ref:f}}}),disabled:!r,label:React.createElement(Markdown,{text:a}),title:C}))});export default CheckBox;
|
|
@@ -4,5 +4,5 @@ import type { defs } from "../FormHost";
|
|
|
4
4
|
/**
|
|
5
5
|
* The component for the "Check Group" Form Element.
|
|
6
6
|
*/
|
|
7
|
-
declare const CheckGroup:
|
|
7
|
+
declare const CheckGroup: React.ForwardRefExoticComponent<FormElementProps<defs.ItemsRef | undefined> & React.RefAttributes<HTMLDivElement>>;
|
|
8
8
|
export default CheckGroup;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import Checkbox from"@vertigis/react-ui/Checkbox";import FormControlLabel from"@vertigis/react-ui/FormControlLabel";import FormGroup,{formGroupClasses}from"@vertigis/react-ui/FormGroup";import{styled}from"@vertigis/react-ui/styles";import*as React from"react";import{useContext,useEffect,useState}from"react";import{Orientation}from"../constants.js";import HostContext from"../hostContext.js";import{arrayEqual}from"../listUtilities.js";import{makeSafeClassName,inspectItems}from"../utils.js";import FormElement from"./FormElement.js";import Markdown from"./Markdown.js";import{useFocusCallback}from"./common.js";const StyledFormElement=styled(FormElement)(({theme:{spacing:e}})=>({[`.${formGroupClasses.root}`]:{paddingBottom:e(2)}})),CheckGroup=({className:e,current:
|
|
1
|
+
import Checkbox from"@vertigis/react-ui/Checkbox";import FormControlLabel from"@vertigis/react-ui/FormControlLabel";import FormGroup,{formGroupClasses}from"@vertigis/react-ui/FormGroup";import{styled}from"@vertigis/react-ui/styles";import*as React from"react";import{forwardRef,useContext,useEffect,useState}from"react";import{Orientation}from"../constants.js";import HostContext from"../hostContext.js";import{arrayEqual}from"../listUtilities.js";import{makeSafeClassName,inspectItems}from"../utils.js";import FormElement from"./FormElement.js";import Markdown from"./Markdown.js";import{useFocusCallback}from"./common.js";const StyledFormElement=styled(FormElement)(({theme:{spacing:e}})=>({[`.${formGroupClasses.root}`]:{paddingBottom:e(2)}})),CheckGroup=forwardRef(({className:e,current:t,element:o,enabled:r,items:s,name:a,orientation:n,raiseEvent:m,setProperty:c,setValue:i,value:l},u)=>{const f=useContext(HostContext),[p,d]=useState([]),[h,C]=useState();useEffect(()=>{const{items:e}=inspectItems(t,s,l);C(e);const o=[],r=[];for(const t in e){const s=e[t];s.checked&&(o.push(t),r.push(s))}arrayEqual(p,o)||d(o);const a=0===r.length?void 0:{refValueType:"items",items:r};i(a,!1)},[s]),useEffect(()=>{const e=[];if(l)for(const t in s)l.items.includes(s[t])&&e.push(t);arrayEqual(p,e)||d(e)},[l]);const k=useFocusCallback(r,a,f);const E=(e,t)=>function(o){const r=h?h[e]:void 0;if(!r)return;const s=r.checked=o.currentTarget.checked;!function(){const e=[],t=[];for(const o in h){const r=h[o];r.checked&&(e.push(r),t.push(o))}const o=0===e.length?void 0:{refValueType:"items",items:e};i(o,!1),c("current",void 0),arrayEqual(t,p)||d(t)}(),m("changed",s?t:void 0,s,e)},y=[];for(const e in h){const t=h[e],o=-1!==p.indexOf(e),s=r&&!1!==t.enabled,a=f.renderText(t.tooltip),n=t.styleName?makeSafeClassName(t.styleName):void 0;y.push(React.createElement(FormControlLabel,{className:n,control:React.createElement(Checkbox,{checked:o,onChange:E(e,t.value),slotProps:{input:{ref:k}}}),disabled:!s,key:e,label:React.createElement(Markdown,{text:t.label}),title:a}))}return React.createElement(StyledFormElement,{className:e,component:"fieldset",element:o,name:a,ref:u},React.createElement(FormGroup,{row:n===Orientation.HORIZONTAL},y))});export default CheckGroup;
|
|
@@ -3,5 +3,5 @@ import type { FormElementProps } from "../..";
|
|
|
3
3
|
/**
|
|
4
4
|
* The component for the "Custom" Form Element.
|
|
5
5
|
*/
|
|
6
|
-
declare const Custom:
|
|
6
|
+
declare const Custom: React.ForwardRefExoticComponent<FormElementProps<undefined> & React.RefAttributes<HTMLDivElement>>;
|
|
7
7
|
export default Custom;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import*as React from"react";import{createElement}from"react";import{getElementProps}from"../utils.js";import FormElement from"./FormElement.js";const Custom=({className:e,component:t,customType:m,element:o,name:n
|
|
1
|
+
import*as React from"react";import{createElement,forwardRef}from"react";import{getElementProps}from"../utils.js";import FormElement from"./FormElement.js";const Custom=forwardRef(({className:e,component:t,customType:m,element:o,name:r},n)=>{let a;return m&&t.elementRegistration&&(a=createElement(t.elementRegistration.component,getElementProps(t,o))),a||(console.warn(`Unable to render custom form element '${r}' of type '${m}'.`),a=`--- ${m} ---`),React.createElement(FormElement,{className:e,name:r,element:o,ref:n},a)});export default Custom;
|
|
@@ -4,5 +4,5 @@ import type { defs } from "../FormHost";
|
|
|
4
4
|
/**
|
|
5
5
|
* The component for the "Date Picker" Form Element.
|
|
6
6
|
*/
|
|
7
|
-
declare const DatePicker:
|
|
7
|
+
declare const DatePicker: React.ForwardRefExoticComponent<FormElementProps<defs.DateTimeRef | undefined> & React.RefAttributes<HTMLDivElement>>;
|
|
8
8
|
export default DatePicker;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import BaseDatePicker from"@vertigis/react-ui/DatePicker";import FormHelperText from"@vertigis/react-ui/FormHelperText";import*as React from"react";import{useContext,useEffect,useMemo,useRef,useState}from"react";import{
|
|
1
|
+
import BaseDatePicker from"@vertigis/react-ui/DatePicker";import FormHelperText from"@vertigis/react-ui/FormHelperText";import*as React from"react";import{forwardRef,useContext,useEffect,useMemo,useRef,useState}from"react";import{areValuesEqual,getDateBounds,getNewElementValue,makeProperValue}from"../dateUtilities.js";import HostContext from"../hostContext.js";import{getKeyString}from"../keyboard.js";import{isInvalidError}from"../textUtilities.js";import{isDateTimeRef,makeUniqueId}from"../utils.js";import DateTimeTextField from"./DateTimeTextField.js";import FormElement from"./FormElement.js";import{useFocusCallback}from"./common.js";const DatePicker=forwardRef(({className:e,element:t,enabled:r,error:o,format:a,name:s,prompt:i,setProperty:n,setValue:l,tooltip:m,value:u},c)=>{const d=useContext(HostContext),[f,p]=useState(!1),[x,E]=useState(!1),[g,D]=useState(!1),[F,k]=useState(null),v=useRef(),R=useRef(!0),T=useFocusCallback(r,s,d),P=d.renderText(m),S={locale:d.deriveLocale(),timezone:(new Intl.DateTimeFormat).resolvedOptions().timeZone},w="date",C=isInvalidError(o),V=()=>{let e=F||void 0;if(e&&isDateTimeRef(u)){const t=new Date(u.value);e=new Date(e),e.setHours(t.getHours()),e.setMinutes(t.getMinutes()),e.setSeconds(t.getSeconds()),e.setMilliseconds(t.getMilliseconds())}const t=getNewElementValue(e,w,S);areValuesEqual(u,t)||l(t)};useEffect(()=>{const e=makeProperValue(u),t=getNewElementValue(e,w,S);areValuesEqual(u,t)||l(t,!1),k(e||null)},[u]),useEffect(()=>{if(!g&&!x)if(f)C||n("error",{status:"invalid"});else{if(C&&n("error",void 0),R.current)return void(R.current=!1);V()}R.current=!1},[f,x,g]);const{min:j,max:H}=getDateBounds(a),y=useMemo(()=>`${makeUniqueId(s)}-input`,[s]),I=d.renderText(i),M=e=>{"enter"!==getKeyString(e)||V()};return React.createElement(FormElement,{className:e,element:t,inputId:y,name:s,ref:c},e=>React.createElement(React.Fragment,null,C&&React.createElement(FormHelperText,{component:"div",error:!0,role:"alert"},v.current),React.createElement(BaseDatePicker,{disabled:!r,inputRef:e=>{T(e),e&&(v.current=e.dataset.formatString)},key:"date-picker",maxDate:H,minDate:j,onChange:e=>k(e),onClose:()=>D(!1),onError:e=>p(!!e),onOpen:()=>D(!0),slots:{textField:DateTimeTextField},slotProps:{textField:{error:!!o,id:y,inputProps:{...e,placeholder:I},onBlur:()=>E(!1),onFocus:()=>E(!0),onKeyDown:M,title:P}},value:F})))});export default DatePicker;
|
|
@@ -8,5 +8,5 @@ export declare const dateRangePickerClasses: {
|
|
|
8
8
|
/**
|
|
9
9
|
* The component for the "Date Range Picker" Form Element.
|
|
10
10
|
*/
|
|
11
|
-
declare const DateRangePicker:
|
|
11
|
+
declare const DateRangePicker: React.ForwardRefExoticComponent<FormElementProps<DateRangeRef | undefined> & React.RefAttributes<HTMLDivElement>>;
|
|
12
12
|
export default DateRangePicker;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import BaseDateRangePicker from"@vertigis/react-ui/DateRangePicker";import FormHelperText from"@vertigis/react-ui/FormHelperText";import{styled}from"@vertigis/react-ui/styles";import clsx from"clsx";import{useContext,useEffect,useMemo,useRef,useState}from"react";import*as React from"react";import{areValuesEqual,convertToDateRangeRef,getDateBounds}from"../dateUtilities.js";import HostContext from"../hostContext.js";import{isInvalidError}from"../textUtilities.js";import{makeUniqueId}from"../utils.js";import DateTimeTextField from"./DateTimeTextField.js";import FormElement from"./FormElement.js";import{useFocusCallback}from"./common.js";const DateRangePickerField=e=>{const{FormHelperTextProps:t,InputProps:r,InputLabelProps:a,inputProps:o,SelectProps:s,...n}=e,l=n.slotProps??{};return delete n.slotProps,l.formHelperText={...t,...l.formHelperText},l.input={...r,...l.input},l.inputLabel={...a,...l.inputLabel},l.htmlInput={...o,...l.htmlInput},l.select={...s,...l.select},n.error=n.error||l.htmlInput["data-elementError"],delete l.htmlInput["data-elementError"],React.createElement(DateTimeTextField,{...n,slotProps:l})},PREFIX="DateRangePicker"
|
|
1
|
+
import BaseDateRangePicker from"@vertigis/react-ui/DateRangePicker";import FormHelperText from"@vertigis/react-ui/FormHelperText";import{styled}from"@vertigis/react-ui/styles";import clsx from"clsx";import{forwardRef,useContext,useEffect,useMemo,useRef,useState}from"react";import*as React from"react";import{areValuesEqual,convertToDateRangeRef,getDateBounds}from"../dateUtilities.js";import HostContext from"../hostContext.js";import{isInvalidError}from"../textUtilities.js";import{makeUniqueId}from"../utils.js";import DateTimeTextField from"./DateTimeTextField.js";import FormElement from"./FormElement.js";import{useFocusCallback}from"./common.js";const DateRangePickerField=e=>{const{FormHelperTextProps:t,InputProps:r,InputLabelProps:a,inputProps:o,SelectProps:s,...n}=e,l=n.slotProps??{};return delete n.slotProps,l.formHelperText={...t,...l.formHelperText},l.input={...r,...l.input},l.inputLabel={...a,...l.inputLabel},l.htmlInput={...o,...l.htmlInput},l.select={...s,...l.select},n.error=n.error||l.htmlInput["data-elementError"],delete l.htmlInput["data-elementError"],React.createElement(DateTimeTextField,{...n,slotProps:l})},PREFIX="DateRangePicker";export const dateRangePickerClasses={root:`${PREFIX}-root`,toLabel:`${PREFIX}-toLabel`};const StyledDateRangePicker=styled(BaseDateRangePicker)({alignItems:"center"}),StyledFormElement=styled(FormElement)(({theme:{spacing:e}})=>({[`.${dateRangePickerClasses.toLabel}`]:{paddingTop:e(3)}})),DateRangePicker=forwardRef(({className:e,element:t,enabled:r,error:a,format:o,name:s,setProperty:n,setValue:l,tooltip:i,value:m},u)=>{const c=useContext(HostContext),[d,p]=useState([null,null]),[f,R]=useState(-1),[x,g]=useState([!1,!1]),[P,E]=useState(!1),[D,F]=useState([null,null]),k=useRef(),I=useRef(!0),T=isInvalidError(a);useEffect(()=>{const e=convertToDateRangeRef(m),t=[e?.startDate||null,e?.endDate||null],r=C(t);areValuesEqual(m,r)||l(r,!1),F(t)},[m]),useEffect(()=>{const e=0===f?x[0]:!!d[0],t=1===f?x[1]:!!d[1];g([e,t]);const r=e||t;if(r?T||n("error",{status:"invalid"}):T&&n("error",void 0),!P&&-1===f&&!r){if(I.current)return void(I.current=!1);const e=C(D);areValuesEqual(m,e)||l(e)}I.current=!1},[d,f,P]);const v=c.renderText(i),b=useFocusCallback(r,s,c),C=e=>{if(e[0]&&e[1])return{refValueType:"daterange",startDate:e[0],endDate:e[1]}},S=useMemo(()=>`${makeUniqueId(s)}-input`,[s]),y=x[0]||x[1],{min:h,max:H}=getDateBounds(o);return React.createElement(StyledFormElement,{className:clsx(e,dateRangePickerClasses.root),element:t,inputId:S,name:s,ref:u},y&&React.createElement(FormHelperText,{component:"div",error:!0,role:"alert"},k.current),React.createElement(StyledDateRangePicker,{disabled:!r,maxDate:H,minDate:h,onChange:e=>F(e),onClose:()=>E(!1),onError:e=>p(e),onOpen:()=>E(!0),slots:{textField:DateRangePickerField},slotProps:{fieldSeparator:{children:c.renderText("@common-to"),className:dateRangePickerClasses.toLabel},textField:({position:e})=>({inputRef:e=>{b(e),"0"===e?.dataset.index&&(k.current=e.dataset.formatString)},onBlur:e=>{Number.parseInt(e.target.dataset.index)===f&&R(-1)},onFocus:e=>{const t=Number.parseInt(e.target.dataset.index);R(t)},slotProps:{htmlInput:{id:"start"===e?S:void 0,"data-elementError":!!a,"data-index":"start"===e?0:1}},title:v})},value:D}))});export default DateRangePicker;
|
|
@@ -4,5 +4,5 @@ import type { defs } from "../FormHost";
|
|
|
4
4
|
/**
|
|
5
5
|
* The component for the "Date Time Picker" Form Element.
|
|
6
6
|
*/
|
|
7
|
-
declare const DateTimePicker:
|
|
7
|
+
declare const DateTimePicker: React.ForwardRefExoticComponent<FormElementProps<defs.DateTimeRef | undefined> & React.RefAttributes<HTMLDivElement>>;
|
|
8
8
|
export default DateTimePicker;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{buttonBaseClasses}from"@vertigis/react-ui/ButtonBase";import BaseDateTimePicker from"@vertigis/react-ui/DateTimePicker";import FormHelperText from"@vertigis/react-ui/FormHelperText";import{clockClasses}from"@vertigis/react-ui/TimeClock";import{styled}from"@vertigis/react-ui/styles";import*as React from"react";import{useContext,useEffect,useMemo,useRef,useState}from"react";import{
|
|
1
|
+
import{buttonBaseClasses}from"@vertigis/react-ui/ButtonBase";import BaseDateTimePicker from"@vertigis/react-ui/DateTimePicker";import FormHelperText from"@vertigis/react-ui/FormHelperText";import{clockClasses}from"@vertigis/react-ui/TimeClock";import{styled}from"@vertigis/react-ui/styles";import*as React from"react";import{forwardRef,useContext,useEffect,useMemo,useRef,useState}from"react";import{areValuesEqual,getAmPm,getDateBounds,getNewElementValue,makeProperValue}from"../dateUtilities.js";import HostContext from"../hostContext.js";import{getKeyString}from"../keyboard.js";import{isInvalidError}from"../textUtilities.js";import{makeUniqueId}from"../utils.js";import DateTimeTextField from"./DateTimeTextField.js";import FormElement from"./FormElement.js";import{useFocusCallback}from"./common.js";const StylableDateTimePicker=e=>{const{className:t,slotProps:r,...o}=e;return React.createElement(BaseDateTimePicker,{slotProps:{...r,actionBar:{sx:{display:"none"}},popper:{...r?.popper,className:t}},...o})},StyledDateTimePicker=styled(StylableDateTimePicker)(({theme:{palette:e}})=>({[`& .${clockClasses.amButton}, .${clockClasses.pmButton}`]:{[`&.${buttonBaseClasses.focusVisible}`]:{color:e.action.active}}})),DateTimePicker=forwardRef(({className:e,element:t,enabled:r,error:o,format:a,name:s,prompt:i,setProperty:l,setValue:m,tooltip:n,value:c},u)=>{const p=useContext(HostContext),[d,f]=useState(!1),[T,k]=useState(!1),[g,x]=useState(!1),[E,D]=useState(null),P=useRef(),v=p.deriveLocale();console.log(`DateTimePicker: locale ${v}`);const F={locale:v,timezone:(new Intl.DateTimeFormat).resolvedOptions().timeZone},C=useRef(!0),y=useFocusCallback(r,s,p),R=p.renderText(n),B="datetime",S=isInvalidError(o);useEffect(()=>{const e=makeProperValue(c),t=getNewElementValue(e,B,F);areValuesEqual(c,t)||m(t,!1),D(e||null)},[c]),useEffect(()=>{if(!g&&!T)if(d)S||l("error",{status:"invalid"});else{if(S&&l("error",void 0),C.current)return void(C.current=!1);b()}C.current=!1},[d,T,g]);const b=()=>{const e=getNewElementValue(E,B,F);areValuesEqual(c,e)||m(e)},V=e=>{"enter"!==getKeyString(e)||b()},{min:j,max:w}=getDateBounds(a),N=getAmPm(a),I=useMemo(()=>`${makeUniqueId(s)}-input`,[s]),q=p.renderText(i);return React.createElement(FormElement,{className:e,element:t,inputId:I,name:s,ref:u},e=>React.createElement(React.Fragment,null,S&&React.createElement(FormHelperText,{component:"div",error:!0,role:"alert"},P.current),React.createElement(StyledDateTimePicker,{ampm:N,disabled:!r,key:"date-picker",inputRef:e=>{y(e),e&&(P.current=e.dataset.formatString)},maxDateTime:w,minDateTime:j,onChange:e=>D(e),onClose:()=>x(!1),onError:e=>f(!!e),onOpen:()=>x(!0),open:g,slots:{textField:DateTimeTextField},slotProps:{textField:{error:!!o,id:I,inputProps:{...e,placeholder:q},onBlur:()=>k(!1),onFocus:()=>k(!0),onKeyDown:V,title:R}},value:E})))});export default DateTimePicker;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import FormLabelTextField from"@vertigis/react-ui/FormLabelTextField";import*as React from"react";const DateTimeTextField=t=>{const{placeholder:e,inputProps:
|
|
1
|
+
import FormLabelTextField from"@vertigis/react-ui/FormLabelTextField";import*as React from"react";const DateTimeTextField=t=>{const{placeholder:e,inputProps:l,InputProps:r,...o}=t,p=o.slotProps??{},{htmlInput:a,input:i}=p;return p.htmlInput={...l,...a,"data-format-string":e},p.htmlInput.placeholder||(p.htmlInput.placeholder=e),p.input={...r,...i},delete o.slotProps,React.createElement(FormLabelTextField,{...o,slotProps:p})};export default DateTimeTextField;
|