From d1602201fb4481ff9f952d58e6f6396abedc03e7 Mon Sep 17 00:00:00 2001 From: Scott Olson Jr Date: Sun, 16 Jul 2023 00:07:20 -0700 Subject: [PATCH 1/2] update documentation for OptionObject2023 --- docs/docs/dotnet/changelog/README.md | 4 + .../dotnet/data-model/OptionObject2023.png | Bin 0 -> 40703 bytes .../data-model/{README.mdx => README.md} | 22 +- .../{formobject.mdx => formobject.md} | 4 +- .../{optionobject.mdx => optionobject.md} | 18 +- .../{optionobject2.mdx => optionobject2.md} | 20 +- ...tionobject2015.mdx => optionobject2015.md} | 24 +- .../dotnet/data-model/optionobject2023.md | 390 ++++++++++++++++++ .../{rowobject.mdx => rowobject.md} | 16 +- .../dotnet/getting-started/compatibility.md | 20 +- .../dotnet/getting-started/installation.md | 4 +- docs/docs/dotnet/intro.md | 4 +- docs/sidebars.js | 2 +- .../components/HomepageHelloWorld/index.js | 11 +- .../RarelySimple.AvatarScriptLink/README.md | 2 +- .../RarelySimple.AvatarScriptLink.csproj | 2 +- 16 files changed, 489 insertions(+), 54 deletions(-) create mode 100644 docs/docs/dotnet/data-model/OptionObject2023.png rename docs/docs/dotnet/data-model/{README.mdx => README.md} (89%) rename docs/docs/dotnet/data-model/{formobject.mdx => formobject.md} (99%) rename docs/docs/dotnet/data-model/{optionobject.mdx => optionobject.md} (96%) rename docs/docs/dotnet/data-model/{optionobject2.mdx => optionobject2.md} (95%) rename docs/docs/dotnet/data-model/{optionobject2015.mdx => optionobject2015.md} (96%) create mode 100644 docs/docs/dotnet/data-model/optionobject2023.md rename docs/docs/dotnet/data-model/{rowobject.mdx => rowobject.md} (91%) diff --git a/docs/docs/dotnet/changelog/README.md b/docs/docs/dotnet/changelog/README.md index 724d2c79..70b4e793 100644 --- a/docs/docs/dotnet/changelog/README.md +++ b/docs/docs/dotnet/changelog/README.md @@ -18,6 +18,10 @@ This list is subject to change with some items being descoped or deferred to a l * Enable cross-platform development and build of AvatarScriptLink.NET * Include added Field and Row objects by default in returned OptionObjects. +## 1.3.0 (T.B.D.) + +* Adds support for the new OptionObject2023 object. + ## 1.2.0 (2023-06-25) * Introduce Builder methods for each object to assist with object creation. diff --git a/docs/docs/dotnet/data-model/OptionObject2023.png b/docs/docs/dotnet/data-model/OptionObject2023.png new file mode 100644 index 0000000000000000000000000000000000000000..ca8850eeedd3c62b7295cad4edaf065c2fccaa22 GIT binary patch literal 40703 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 literal 0 HcmV?d00001 diff --git a/docs/docs/dotnet/data-model/README.mdx b/docs/docs/dotnet/data-model/README.md similarity index 89% rename from docs/docs/dotnet/data-model/README.mdx rename to docs/docs/dotnet/data-model/README.md index 793cecdd..8104ecca 100644 --- a/docs/docs/dotnet/data-model/README.mdx +++ b/docs/docs/dotnet/data-model/README.md @@ -12,7 +12,7 @@ Additionally, the AvatarScriptLink.NET library expands on the data model to assi ## Avatar ScriptLink -The request and response payloads consist of an OptionObject2015 as defined in your APIs WSDL. +The request and response payloads consist of an OptionObject2023 as defined in your APIs WSDL. ### Standard @@ -21,13 +21,14 @@ A standard form in myAvatar will include only a single RowObject containing all ```mermaid classDiagram direction LR -class OptionObject2015 { +class OptionObject2023 { +string EntityID +double EpisodeNumber +double ErrorCode +string ErrorMesg +string Facility +List~FormObject~ Forms + +string HistoricUID +string NamespaceName +string OptionId +string OptionStaffId @@ -47,6 +48,7 @@ class FormObject { class RowObject { +List~FieldObject~ Fields + +string HistoricUID +string ParentRowId +string RowAction +string RowId @@ -60,11 +62,11 @@ class FieldObject { +string Required } -OptionObject2015 "1" --o "*" FormObject : Forms +OptionObject2023 "1" --o "*" FormObject : Forms FormObject "1" --o "1" RowObject : CurrentRow RowObject "1" --o "*" FieldObject : Fields -click OptionObject2015 href "./optionobject2015" "Learn more about the OptionObject2015" +click OptionObject2023 href "./optionobject2023" "Learn more about the OptionObject2023" click FormObject href "./formobject" "Learn more about the FormObject" click RowObject href "./rowobject" "Learn more about the RowObject" click FieldObject href "./fieldobject" "Learn more about the FieldObject" @@ -72,19 +74,20 @@ click FieldObject href "./fieldobject" "Learn more about the FieldObject" ### Multiple Iteration -When a myAvatar form (OptionObject2015) includes a multiple iteration table in one or more of the sections (FormObject), the selected RowObject will be in the CurrentRow and any other rows in OtherRows. +When a myAvatar form (OptionObject2023) includes a multiple iteration table in one or more of the sections (FormObject), the selected RowObject will be in the CurrentRow and any other rows in OtherRows. Multiple Iteration Tables can never be ther first section (FormObject) on a myAvatar form. ```mermaid classDiagram direction LR -class OptionObject2015 { +class OptionObject2023 { +string EntityID +double EpisodeNumber +double ErrorCode +string ErrorMesg +string Facility +List~FormObject~ Forms + +string HistoricUID +string NamespaceName +string OptionId +string OptionStaffId @@ -104,6 +107,7 @@ class FormObject { class RowObject { +List~FieldObject~ Fields + +string HistoricUID +string ParentRowId +string RowAction +string RowId @@ -117,12 +121,12 @@ class FieldObject { +string Required } -OptionObject2015 "1" --o "*" FormObject : Forms +OptionObject2023 "1" --o "*" FormObject : Forms FormObject "1" --o "1" RowObject : CurrentRow FormObject "1" --o "*" RowObject : OtherRows RowObject "1" --o "*" FieldObject : Fields -click OptionObject2015 href "./optionobject2015" "Learn more about the OptionObject2015" +click OptionObject2023 href "./optionobject2023" "Learn more about the OptionObject2023" click FormObject href "./formobject" "Learn more about the FormObject" click RowObject href "./rowobject" "Learn more about the RowObject" click FieldObject href "./fieldobject" "Learn more about the FieldObject" @@ -166,4 +170,4 @@ The Parameter class helps to parse the delimited parameter string. The RowAction class is used to help you return valid RowAction values to myAvatar. These values instruct myAvatar to add, edit, or delete a RowObject upon receipt of the response from the ScriptLink API. -[Learn more](./rowaction) \ No newline at end of file +[Learn more](./rowaction) diff --git a/docs/docs/dotnet/data-model/formobject.mdx b/docs/docs/dotnet/data-model/formobject.md similarity index 99% rename from docs/docs/dotnet/data-model/formobject.mdx rename to docs/docs/dotnet/data-model/formobject.md index 2a6b05fd..63b57c8d 100644 --- a/docs/docs/dotnet/data-model/formobject.mdx +++ b/docs/docs/dotnet/data-model/formobject.md @@ -66,6 +66,7 @@ class FormObject { class RowObject { +List~FieldObject~ Fields + +string HistoricUID +string ParentRowId +string RowAction +string RowId @@ -141,7 +142,7 @@ click RowObject href "./rowobject" "Learn more about the RowObject" ## Examples -Most implementations would not require working with the FormObject directly, however here is an example that uses the FormObject to create an [OptionObject2015](../optionobject2015) for Unit Testing. +Most implementations would not require working with the FormObject directly, however here is an example that creates a FormObject for Unit Testing. @@ -291,6 +292,7 @@ class IFormObject { class RowObject { +List~FieldObject~ Fields + +string HistoricUID +string ParentRowId +string RowAction +string RowId diff --git a/docs/docs/dotnet/data-model/optionobject.mdx b/docs/docs/dotnet/data-model/optionobject.md similarity index 96% rename from docs/docs/dotnet/data-model/optionobject.mdx rename to docs/docs/dotnet/data-model/optionobject.md index 0b3db216..2c06cb4a 100644 --- a/docs/docs/dotnet/data-model/optionobject.mdx +++ b/docs/docs/dotnet/data-model/optionobject.md @@ -9,7 +9,7 @@ displayed_sidebar: dotnetSidebar :::tip Legacy Object -A newer version of this object is now available ([OptionObject2015](../optionobject2015)) and is recommended for new projects. +A newer version of this object is now available ([OptionObject2023](../optionobject2023)) and is recommended for new projects. ::: @@ -75,6 +75,7 @@ class OptionObject { +ToOptionObject() OptionObject +ToOptionObject2() OptionObject2 +ToOptionObject2015() OptionObject2015 + +ToOptionObject2023() OptionObject2023 +ToReturnOptionObject() OptionObject +ToReturnOptionObject(bool, string) OptionObject +ToXml() string @@ -161,6 +162,7 @@ The following methods are available on the OptionObject to assist with common ta | ToOptionObject() | Creates a clone of the OptionObject. | | ToOptionObject2() | Transforms the OptionObject2 to an OptionObject2. | | ToOptionObject2015() | Transforms the OptionObject2 as an OptionObject2015. | +| ToOptionObject2023() | Transforms the OptionObject2 as an OptionObject2023. | | ToReturnOptionObject() | Creates an OptionObject with the minimum information required to return. | | ToReturnOptionObject(int, string) | Creates an OptionObject with the minimum information required to return plus the provided Error Code and Message. | | ToXml() | Returns a string with all of the contents of the OptionObject formatted as XML. | @@ -180,6 +182,7 @@ class OptionObject { +ToOptionObject() OptionObject +ToOptionObject2() OptionObject2 +ToOptionObject2015() OptionObject2015 + +ToOptionObject2023() OptionObject2023 +ToReturnOptionObject() OptionObject +ToReturnOptionObject(bool, string) OptionObject +ToXml() string @@ -242,9 +245,10 @@ class OptionObjectBase { +ToHtmlString() string +ToHtmlString(bool) string +ToJson() string - +ToOptionObject()* OptionObject - +ToOptionObject2()* OptionObject2 - +ToOptionObject2015()* OptionObject2015 + +ToOptionObject() OptionObject + +ToOptionObject2() OptionObject2 + +ToOptionObject2015() OptionObject2015 + +ToOptionObject2023() OptionObject2023 +ToReturnOptionObject() OptionObjectBase +ToReturnOptionObject(double, string) OptionObjectBase +ToXml() string @@ -254,6 +258,11 @@ class OptionObjectBase { } <> OptionObjectBase +class IOptionObject2023 { + string HistoricUID +} +<> IOptionObject2023 + class IOptionObject2015 { string SessionToken } @@ -292,6 +301,7 @@ OptionObjectBase "1" --o "*" FormObject : Forms OptionObject --|> OptionObjectBase : inherits OptionObjectBase --|> IEquatable~OptionObjectBase~ : inherits OptionObjectBase --|> IOptionObject2015 : inherits +IOptionObject2023 --|> IOptionObject2015 : inherits IOptionObject2015 --|> IOptionObject2 : inherits IOptionObject2 --|> IOptionObject : inherits diff --git a/docs/docs/dotnet/data-model/optionobject2.mdx b/docs/docs/dotnet/data-model/optionobject2.md similarity index 95% rename from docs/docs/dotnet/data-model/optionobject2.mdx rename to docs/docs/dotnet/data-model/optionobject2.md index 0c590023..4ba2262f 100644 --- a/docs/docs/dotnet/data-model/optionobject2.mdx +++ b/docs/docs/dotnet/data-model/optionobject2.md @@ -9,7 +9,7 @@ displayed_sidebar: dotnetSidebar :::tip Legacy Object -A newer version of this object is now available ([OptionObject2015](../optionobject2015)) and is recommended for new projects. +A newer version of this object is now available ([OptionObject2023](../optionobject2023)) and is recommended for new projects. ::: @@ -78,6 +78,7 @@ class OptionObject2 { +ToOptionObject() OptionObject +ToOptionObject2() OptionObject2 +ToOptionObject2015() OptionObject2015 + +ToOptionObject2023() OptionObject2023 +ToReturnOptionObject() OptionObject2 +ToReturnOptionObject(bool, string) OptionObject2 +ToXml() string @@ -123,7 +124,7 @@ The following methods are available on the OptionObject2 to assist with common t | AddFormObject(string, bool) | Creates a [FormObject](../formobject) with specified FormId and adds to the OptionObject2015. The second parameter specifies whether the [FormObject](../formobject) should be flagged as a Multiple Iteration form. | | AddRowObject(string, [RowObject](../rowobject))| Adds a [RowObject](../rowobject) to the [FormObject](../formobject) with the specified FormId. | | Builder() | Initializes a builder for constructing a OptionObject2. | -| Clone90 | Clones the OptionObject2. | +| Clone() | Clones the OptionObject2. | | DeleteRowObject([RowObject](../rowobject)) | Marks a [RowObject"](../rowobject) for deletion. | | DeleteRowObject(string) | Marks a [RowObject"](../rowobject) for deletion by specified RowId. | | DisableAllFieldObjects() | Sets all [FieldObjects](../fieldobject) as disabled. | @@ -166,6 +167,7 @@ The following methods are available on the OptionObject2 to assist with common t | ToOptionObject() | Transforms the OptionObject2 to an OptionObject. | | ToOptionObject2() | Creates a clone of the OptionObject2. | | ToOptionObject2015() | Transforms the OptionObject2 as an OptionObject2015. | +| ToOptionObject2023() | Transforms the OptionObject2 as an OptionObject2023. | | ToReturnOptionObject() | Creates an OptionObject2 with the minimum information required to return. | | ToReturnOptionObject(int, string) | Creates an OptionObject2 with the minimum information required to return plus the provided Error Code and Message. | | ToXml() | Returns a string with all of the contents of the OptionObject2 formatted as XML. | @@ -185,6 +187,7 @@ class OptionObject2{ +ToOptionObject() OptionObject +ToOptionObject2() OptionObject2 +ToOptionObject2015() OptionObject2015 + +ToOptionObject2023() OptionObject2023 +ToReturnOptionObject() OptionObject2015 +ToReturnOptionObject(bool, string) OptionObject2015 +ToXml() string @@ -247,9 +250,10 @@ class OptionObjectBase { +ToHtmlString() string +ToHtmlString(bool) string +ToJson() string - +ToOptionObject()* OptionObject - +ToOptionObject2()* OptionObject2 - +ToOptionObject2015()* OptionObject2015 + +ToOptionObject() OptionObject + +ToOptionObject2() OptionObject2 + +ToOptionObject2015() OptionObject2015 + +ToOptionObject2023() OptionObject2023 +ToReturnOptionObject() OptionObjectBase +ToReturnOptionObject(double, string) OptionObjectBase +ToXml() string @@ -259,6 +263,11 @@ class OptionObjectBase { } <> OptionObjectBase +class IOptionObject2023 { + string HistoricUID +} +<> IOptionObject2023 + class IOptionObject2015 { string SessionToken } @@ -297,6 +306,7 @@ OptionObjectBase "1" --o "*" FormObject : Forms OptionObject2 --|> OptionObjectBase : inherits OptionObjectBase --|> IEquatable~OptionObjectBase~ : inherits OptionObjectBase --|> IOptionObject2015 : inherits +IOptionObject2023 --|> IOptionObject2015 : inherits IOptionObject2015 --|> IOptionObject2 : inherits IOptionObject2 --|> IOptionObject : inherits diff --git a/docs/docs/dotnet/data-model/optionobject2015.mdx b/docs/docs/dotnet/data-model/optionobject2015.md similarity index 96% rename from docs/docs/dotnet/data-model/optionobject2015.mdx rename to docs/docs/dotnet/data-model/optionobject2015.md index e27924b0..7928ed61 100644 --- a/docs/docs/dotnet/data-model/optionobject2015.mdx +++ b/docs/docs/dotnet/data-model/optionobject2015.md @@ -12,12 +12,9 @@ import TabItem from '@theme/TabItem'; The OptionObject2015 holds all of the content of and metadata describing the calling myAvatar form. AvatarScriptLink.NET adds several utility methods to assist with handlings these objects. -:::note Legacy Support +:::tip Legacy Object -Earlier versions of this object are still supported and available for use in your projects. - -* [OptionObject2](../optionobject2) -* [OptionObject](../optionobject) +A newer version of this object is now available ([OptionObject2023](../optionobject2023)) and is recommended for new projects. ::: @@ -84,6 +81,7 @@ class OptionObject2015 { +ToOptionObject() OptionObject +ToOptionObject2() OptionObject2 +ToOptionObject2015() OptionObject2015 + +ToOptionObject2023() OptionObject2023 +ToReturnOptionObject() OptionObject2015 +ToReturnOptionObject(bool, string) OptionObject2015 +ToXml() string @@ -173,6 +171,7 @@ The following methods are available on the OptionObject2015 to assist with commo | ToOptionObject() | Transforms the OptionObject2015 to an OptionObject. | | ToOptionObject2() | Transforms the OptionObject2015 as an OptionObject2. | | ToOptionObject2015() | Creates a clone of the OptionObject2015. | +| ToOptionObject2023() | Transforms the OptionObject2015 as an OptionObject2023. | | ToReturnOptionObject() | Creates an OptionObject2015 with the minimum information required to return. | | ToReturnOptionObject(int, string) | Creates an OptionObject2015 with the minimum information required to return plus the provided Error Code and Message. | | ToXml() | Returns a string with all of the contents of the OptionObject2015 formatted as XML. | @@ -254,6 +253,7 @@ class OptionObject2015 { +ToOptionObject() OptionObject +ToOptionObject2() OptionObject2 +ToOptionObject2015() OptionObject2015 + +ToOptionObject2023() OptionObject2023 +ToReturnOptionObject() OptionObject2015 +ToReturnOptionObject(bool, string) OptionObject2015 +ToXml() string @@ -266,6 +266,7 @@ class OptionObjectBase { +string ErrorMesg +string Facility +List~FormObject~ Forms + +string HistoricUID +string NamespaceName +string OptionId +string OptionStaffId @@ -316,9 +317,10 @@ class OptionObjectBase { +ToHtmlString() string +ToHtmlString(bool) string +ToJson() string - +ToOptionObject()* OptionObject - +ToOptionObject2()* OptionObject2 - +ToOptionObject2015()* OptionObject2015 + +ToOptionObject() OptionObject + +ToOptionObject2() OptionObject2 + +ToOptionObject2015() OptionObject2015 + +ToOptionObject2023() OptionObject2023 +ToReturnOptionObject() OptionObjectBase +ToReturnOptionObject(double, string) OptionObjectBase +ToXml() string @@ -328,6 +330,11 @@ class OptionObjectBase { } <> OptionObjectBase +class IOptionObject2023 { + string HistoricUID +} +<> IOptionObject2023 + class IOptionObject2015 { string SessionToken } @@ -369,6 +376,7 @@ OptionObjectBase "1" --o "*" FormObject : Forms OptionObject2015 --|> OptionObjectBase : inherits OptionObjectBase --|> IEquatable~OptionObjectBase~ : inherits OptionObjectBase --|> IOptionObject2015 : inherits +IOptionObject2023 --|> IOptionObject2015 : inherits IOptionObject2015 --|> IOptionObject2 : inherits IOptionObject2 --|> IOptionObject : inherits diff --git a/docs/docs/dotnet/data-model/optionobject2023.md b/docs/docs/dotnet/data-model/optionobject2023.md new file mode 100644 index 00000000..99a32784 --- /dev/null +++ b/docs/docs/dotnet/data-model/optionobject2023.md @@ -0,0 +1,390 @@ +--- +title: OptionObject2023 +image: ./OptionObject2023.png +sidebar_position: 1 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# OptionObject2023 + +The OptionObject2023 holds all of the content of and metadata describing the calling myAvatar form. +AvatarScriptLink.NET adds several utility methods to assist with handlings these objects. + +:::note Legacy Support + +Earlier versions of this object are still supported and available for use in your projects. + +* [OptionObject2015](../optionobject2015) +* [OptionObject2](../optionobject2) +* [OptionObject](../optionobject) + +::: + +```mermaid +classDiagram +direction LR +class OptionObject2023 { + +string EntityID + +double EpisodeNumber + +double ErrorCode + +string ErrorMesg + +string Facility + +List~FormObject~ Forms + +string HistoricUID + +string NamespaceName + +string OptionId + +string OptionStaffId + +string OptionUserId + +string ParentNamespace + +string ServerName + +string SystemCode + +string SessionToken + +AddFormObject(FormObject) + +AddFormObject(string, bool) + +AddRowObject(string, RowObject) + +Clone() OptionObject2023 + +DeleteRowObject(RowObject) + +DeleteRowObject(string) + +DisableAllFieldObjects() + +DisableAllFieldObjects(List~string~) + +Equals(OptionObjectBase) bool + +Equals(object) bool + +GetCurrentRowId(string) strings + +GetFieldValue(string) string + +GetFieldValue(string, string, string) string + +GetFieldValues(string) List~string~ + +GetHashCode() int + +GetMultipleIterationStatus(string) bool + +GetParentRowId(string) string + +IsFieldEnabled(string) bool + +IsFieldLocked(string) bool + +IsFieldModified(string) bool + +IsFieldPresent(string) bool + +IsFieldRequired(string) bool + +IsFormPresent(string) bool + +IsRowMarkedForDeletion(string) bool + +IsRowPresent(string) bool + +SetDisabledField(string) + +SetDisabledFields(List~string~) + +SetEnabledField(string) + +SetEnabledFields(List~string~) + +SetFieldValue(string, string) + +SetFieldValue(string, string, string, string) + +SetLockedField(string) + +SetLockedFields(List~string~) + +SetOptionalField(string) + +SetOptionalFields(List~string~) + +SetRequiredField(string) + +SetRequiredFields(List~string~) + +SetUnlockedField(string) + +SetUnlockedFields(List~string~) + +ToHtmlString() string + +ToHtmlString(bool) string + +ToJson() string + +ToOptionObject() OptionObject + +ToOptionObject2() OptionObject2 + +ToOptionObject2015() OptionObject2015 + +ToOptionObject2023() OptionObject2023 + +ToReturnOptionObject() OptionObject2023 + +ToReturnOptionObject(bool, string) OptionObject2023 + +ToXml() string +} + +class FormObject { + +RowObject CurrentRow + +string FormID + +bool MultipleIteration + +List~RowObject~ OtherRows +} + +OptionObject2023 "1" --o "*" FormObject : Forms + +click FormObject href "./formobject" "Learn more about the FormObject" +``` + +## Properties + +| Property | Description | +|:----------------|:------------------------------------------------------------------------------------------------------| +| EntityID | The unique Id of the selected entity. I.e., Patient, Staff, or User. | +| EpisodeNumber | The selected Episode Number. Will be null if the form is non-episodic. | +| ErrorCode | Informs myAvatar of the outcome of the ScriptLink API call. | +| ErrorMesg | Message to display to user with certain error codes. | +| Facility | The Facility Id the user is currently working in. | +| Forms | List of myAvatar form sections including rows and fields. See [FormObject](../formobject). | +| HistoricUID | The Namespace the user is currently working in. | +| NamespaceName | The Namespace the user is currently working in. | +| OptionId | The unique Id of the form that sent this request. | +| OptionStaffId | The Staff Id assigned to the logged on user. May be null/empty if not associated with a Practitioner. | +| OptionUserId | The User Id of the logged on user. | +| ParentNamespace | The Parent Namespace of the Namespace the user is currently logged into. | +| ServerName | The server the request was submitted from. | +| SystemCode | The System Code the user is currently working in. | +| SessionToken | The SessionToken that can be used to authenticate with Avatar Web Services. | + +## Methods + +The following methods are available on the OptionObject2023 to assist with common tasks. + +| Method | Description | +|:-----------------------------------------------|:-----------------------------------------------------------------------------------------------| +| AddFormObject([FormObject](../formobject)) | Adds a [FormObject](../formobject) to the OptionObject2023. | +| AddFormObject(string, bool) | Creates a [FormObject](../formobject) with specified FormId and adds to the OptionObject2023. The second parameter specifies whether the [FormObject](../formobject) should be flagged as a Multiple Iteration form. | +| AddRowObject(string, [RowObject](../rowobject))| Adds a [RowObject](../rowobject) to the [FormObject](../formobject) with the specified FormId. | +| Builder() | Initializes a builder for constructing a OptionObject2023. | +| Clone() | Clones the OptionObject2023. | +| DeleteRowObject([RowObject](../rowobject)) | Marks a for deletion. | +| DeleteRowObject(string) | Marks a for deletion by specified RowId. | +| DisableAllFieldObjects() | Sets all [FieldObjects](../fieldobject) as disabled. | +| DisableAllFieldObjects(List of string) | Sets all [FieldObjects](../fieldobject) as disabled except for any listed to be excluded. | +| Equals(OptionObjectBase) | Used to compare two OptionObject2023 to determine if they are equal. Returns bool. | +| Equals(object) | Used to compare OptionObject2023 to an object to determine if they are equal. Returns bool. | +| GetCurrentRowId(string) | Returns the CurrentRow RowId of the form matching the FormId. | +| GetFieldValue(string) | Returns the first value of the field matching the Field Number. | +| GetFieldValue(string, string, string) | Returns the value of the matching the Field Number on the specified [FormObject](../formobject) and [RowObject](../rowobject). | +| GetFieldValues(string) | Returns the values of the field matching the Field Number. | +| GetHashCode() | Overrides the GetHashCode method for a OptionObjectBase. | +| GetMultipleIterationStatus(string) | Returns the Multiple Iteration Status of the form matching the FormId. | +| GetParentRowId(string) | Returns the CurrentRow ParentRowId of the form matching the FormId. | +| Initialize() | Initializes an empty OptionObject2023. | +| IsFieldEnabled(string) | Returns whether the specified field is enabled. | +| IsFieldLocked(string) | Returns whether the specified field is locked. | +| IsFieldModified(string) | Returns whether the specified field is modified. | +| IsFieldPresent(string) | Returns whether the specified field is present. | +| IsFieldRequired(string) | Returns whether the specified field is required. | +| IsFormPresent(string) | Returns whether the specified form is present. | +| IsRowMarkedForDeletion(string) | Returns whether the specified [RowObject](../rowobject) is marked for deletion. | +| IsRowPresent(string) | Returns whether the specified row is present | +| SetDisabledField(string) | Sets the specified field as disabled. | +| SetDisabledFields(List of string) | Sets the specified fields as disabled. | +| SetEnabledField(string) | Sets the specified field as enabled. | +| SetEnabledFields(List of string) | Sets the specified fields as enabled. | +| SetFieldValue(string, string) | Sets the FieldValue of a [FieldObject](../fieldobject) in the OptionObject2023 on the first form's CurrentRow. | +| SetFieldValue(string, string, string, string) | Sets the FieldValue of a [FieldObject](../fieldobject) in the OptionObject2023. | +| SetLockedField(string) | Sets the specified field as locked. | +| SetLockedFields(List of string) | Sets the specified fields as disabled. | +| SetOptionalField(string) | Set the specified field as not required and enables if disabled. | +| SetOptionalFields(List of string) | Set the specified fields as not required and enables if disabled. | +| SetRequiredField(string) | Sets the specified field as required. | +| SetRequiredFields(List of string) | Sets the specified fields as required. | +| SetUnlockedField(string) | Set the specified field as unlocked. | +| SetUnlockedFields(List of string) | Set the specified fields as unlocked. | +| ToHtmlString() | Returns a string with all of the contents of the OptionObject2023 formatted in HTML. | +| ToHtmlString(bool) | Returns a string with all of the contents of the OptionObject2023 formatted in HTML. Passing true will include HTML header tags. | +| ToJson() | Returns a string with all of the contents of the OptionObject2023 formatted as JSON. | +| ToOptionObject() | Transforms the OptionObject2023 to an OptionObject. | +| ToOptionObject2() | Transforms the OptionObject2023 as an OptionObject2. | +| ToOptionObject2015() | Transforms the OptionObject2023 as an OptionObject2015. | +| ToOptionObject2023() | Creates a clone of the OptionObject2023. | +| ToReturnOptionObject() | Creates an OptionObject2023 with the minimum information required to return. | +| ToReturnOptionObject(int, string) | Creates an OptionObject2023 with the minimum information required to return plus the provided Error Code and Message. | +| ToXml() | Returns a string with all of the contents of the OptionObject2023 formatted as XML. | + +## Examples + +The following code shows how to use OptionObject2023 to construct a web service compatible with myAvatar. + + + + +```cs title="MyScriptLinkDemoService.asmx" +using RarelySimple.AvatarScriptLink.Objects; +using System.Web.Services; + +namespace ScriptLinkDemo.Web.Api +{ + /// + /// Summary description for MyScriptLinkDemoService + /// + [WebService(Namespace = "http://tempuri.org/")] + [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] + [System.ComponentModel.ToolboxItem(false)] + public class MyScriptLinkDemoService : System.Web.Services.WebService + { + [WebMethod] + public string GetVersion() + { + return "v.0.0.1"; + } + + [WebMethod] + public OptionObject2023 RunScript(OptionObject2023 optionObject2023, string parameters) + { + return optionObject2023.ToReturnOptionObject(ErrorCode.Alert, "Hello, World!"); + } + } +} +``` + + + + +```vb title="MyScriptLinkDemoService.asmx" +Imports System.ComponentModel +Imports System.Web.Services +Imports RarelySimple.AvatarScriptLink.Objects + + _ + _ + _ +Public Class MyScriptLinkDemoService + Inherits System.Web.Services.WebService + + + Public Function GetVersion() As String + Return "v.0.0.1" + End Function + + + Public Function RunScript(ByVal optionObject2023 As OptionObject2023, ByVal parameters As String) As OptionObject2023 + Return optionObject2023.ToReturnOptionObject(ErrorCode.Alert, "Hello, World!") + End Function + +End Class +``` + + + + +## Detailed Class Diagram + +```mermaid +classDiagram +class OptionObject2023 { + +Clone() OptionObject2023 + +ToHtmlString() string + +ToHtmlString(bool) string + +ToOptionObject() OptionObject + +ToOptionObject2() OptionObject2 + +ToOptionObject2015() OptionObject2015 + +ToOptionObject2023() OptionObject2023 + +ToReturnOptionObject() OptionObject2023 + +ToReturnOptionObject(bool, string) OptionObject2023 + +ToXml() string +} + +class OptionObjectBase { + +string EntityID + +double EpisodeNumber + +double ErrorCode + +string ErrorMesg + +string Facility + +List~FormObject~ Forms + +string HistoricUID + +string NamespaceName + +string OptionId + +string OptionStaffId + +string OptionUserId + +string ParentNamespace + +string ServerName + +string SystemCode + +string SessionToken + +AddFormObject(FormObject) + +AddFormObject(string, bool) + +AddRowObject(string, RowObject) + +Clone() OptionObjectBase + +DeleteRowObject(RowObject) + +DeleteRowObject(string) + +DisableAllFieldObjects() + +DisableAllFieldObjects(List~string~) + +Equals(OptionObjectBase) bool + +Equals(object) bool + +GetCurrentRowId(string) strings + +GetFieldValue(string) string + +GetFieldValue(string, string, string) string + +GetFieldValues(string) List~string~ + +GetHashCode() int + +GetMultipleIterationStatus(string) bool + +GetParentRowId(string) string + +IsFieldEnabled(string) bool + +IsFieldLocked(string) bool + +IsFieldModified(string) bool + +IsFieldPresent(string) bool + +IsFieldRequired(string) bool + +IsFormPresent(string) bool + +IsRowMarkedForDeletion(string) bool + +IsRowPresent(string) bool + +SetDisabledField(string) + +SetDisabledFields(List~string~) + +SetEnabledField(string) + +SetEnabledFields(List~string~) + +SetFieldValue(string, string) + +SetFieldValue(string, string, string, string) + +SetLockedField(string) + +SetLockedFields(List~string~) + +SetOptionalField(string) + +SetOptionalFields(List~string~) + +SetRequiredField(string) + +SetRequiredFields(List~string~) + +SetUnlockedField(string) + +SetUnlockedFields(List~string~) + +ToHtmlString() string + +ToHtmlString(bool) string + +ToJson() string + +ToOptionObject() OptionObject + +ToOptionObject2() OptionObject2 + +ToOptionObject2015() OptionObject2015 + +ToOptionObject2023() OptionObject2023 + +ToReturnOptionObject() OptionObjectBase + +ToReturnOptionObject(double, string) OptionObjectBase + +ToXml() string + -AreBothEmpty(List~FormObject~, List~FormObject~)$ bool + -AreBothNull(List~FormObject~, List~FormObject~)$ bool + -AreFormsEqual(List~FormObject~, List~FormObject~)$ bool +} +<> OptionObjectBase + +class IOptionObject2023 { + string HistoricUID +} +<> IOptionObject2023 + +class IOptionObject2015 { + string SessionToken +} +<> IOptionObject2015 + +class IOptionObject2 { + string NamespaceName + string ParentNamespace + string ServerName +} +<> IOptionObject2 + +class IOptionObject { + string EntityID + double EpisodeNumber + double ErrorCode + string ErrorMesg + string Facility + List~FormObject~ Forms + string OptionId + string OptionStaffId + string OptionUserId + string SystemCode +} +<> IOptionObject + +class FormObject { + +RowObject CurrentRow + +string FormID + +bool MultipleIteration + +List~RowObject~ OtherRows +} + +class IEquatable~OptionObjectBase~ +<> IEquatable~OptionObjectBase~ + +OptionObjectBase "1" --o "*" FormObject : Forms + +OptionObject2023 --|> OptionObjectBase : inherits +OptionObjectBase --|> IEquatable~OptionObjectBase~ : inherits +OptionObjectBase --|> IOptionObject2023 : inherits +IOptionObject2023 --|> IOptionObject2015 : inherits +IOptionObject2015 --|> IOptionObject2 : inherits +IOptionObject2 --|> IOptionObject : inherits + +click FormObject href "./formobject" "Learn more about the FormObject" +``` diff --git a/docs/docs/dotnet/data-model/rowobject.mdx b/docs/docs/dotnet/data-model/rowobject.md similarity index 91% rename from docs/docs/dotnet/data-model/rowobject.mdx rename to docs/docs/dotnet/data-model/rowobject.md index 5cf6c5a1..c212e3c0 100644 --- a/docs/docs/dotnet/data-model/rowobject.mdx +++ b/docs/docs/dotnet/data-model/rowobject.md @@ -17,6 +17,7 @@ classDiagram direction LR class RowObject { +List~FieldObject~ Fields + +string HistoricUID +string ParentRowId +string RowAction +string RowId @@ -73,12 +74,13 @@ click FieldObject href "./fieldobject" "Learn more about the FieldObject" ## Properties -| Property | Description | -|:----------------|:------------| -| Fields | Gets or sets the Fields value. | -| ParentRowId | Gets or Sets the ParentRowId value. | +| Property | Description | +|:----------------|:--------------------------------------------------------------------------------------------------------------| +| Fields | Gets or sets the Fields value. | +| HistoricUID | Gets or Sets the HistoricUID value. | +| ParentRowId | Gets or Sets the ParentRowId value. | | RowAction | Gets or sets the RowAction value. The supported case-sensitive values are blank, `ADD`, `EDIT`, and `DELETE`. | -| RowId | Gets or set the RowId value. | +| RowId | Gets or set the RowId value. | ## Methods @@ -116,7 +118,7 @@ click FieldObject href "./fieldobject" "Learn more about the FieldObject" ## Examples -Most implementations would not require working with the RowObject directly, however here is an example that uses the RowObject to create an [OptionObject2015](../optionobject2015) for Unit Testing. +Most implementations would not require working with the RowObject directly, however here is an example that creates a RowObject for Unit Testing. @@ -203,6 +205,7 @@ class RowObject { class RowObjectBase { +List~FieldObject~ Fields + +string HistoricUID +string ParentRowId +string RowAction +string RowId @@ -248,6 +251,7 @@ class RowObjectBase { class IRowObject { List~FieldObject~ Fields + string HistoricUID string ParentRowId string RowAction string RowId diff --git a/docs/docs/dotnet/getting-started/compatibility.md b/docs/docs/dotnet/getting-started/compatibility.md index 0dce6539..caae59c8 100644 --- a/docs/docs/dotnet/getting-started/compatibility.md +++ b/docs/docs/dotnet/getting-started/compatibility.md @@ -31,16 +31,16 @@ Check out the Microsoft Docs for more information on [.NET Standard compatibilit Windows Server support is based on the .NET Framework version you choose to use in your ASP.NET Web Application. These are the Windows Servers that can support .NET Framework 4.6.1 or higher. -| Version | Compatible | -|:-----------------------|:-----------| -| Windows Server 2022 | Yes | -| Windows Server 2019 | Yes | -| Windows Server 2016 | Yes | -| Windows Server 2012 R2 | Yes | -| Windows Server 2012 | Yes | -| Windows Server 2008 R2 | Yes, with SP1 | -| Windows Server 2008 SP2 | Maybe, requires .NET Framework 4.6.2 | -| Windows Server 2008 or earlier | No | +| Version | Compatible | +|:-------------------------------|:-------------------------------------| +| Windows Server 2022 | Yes | +| Windows Server 2019 | Yes | +| Windows Server 2016 | Yes | +| Windows Server 2012 R2 | Yes | +| Windows Server 2012 | Yes | +| Windows Server 2008 R2 | Yes, with SP1 | +| Windows Server 2008 SP2 | Maybe, requires .NET Framework 4.6.2 | +| Windows Server 2008 or earlier | No | More information can be found on [Microsoft Docs](https://learn.microsoft.com/en-us/dotnet/framework/get-started/system-requirements#supported-server-operating-systems). diff --git a/docs/docs/dotnet/getting-started/installation.md b/docs/docs/dotnet/getting-started/installation.md index e3596029..605e9a12 100644 --- a/docs/docs/dotnet/getting-started/installation.md +++ b/docs/docs/dotnet/getting-started/installation.md @@ -9,9 +9,11 @@ sidebar_position: 1 AvatarScriptLink.NET can be installed via command line or the Visual Studio Nuget Package Manager. ## Command Line Interface + ``` -dotnet add package RarelySimple.AvatarScriptLink --version 1.2.0 +dotnet add package RarelySimple.AvatarScriptLink --version 1.3.0 ``` + *.NET CLI installation command* Review [other CLI options](https://www.nuget.org/packages/RarelySimple.AvatarScriptLink) diff --git a/docs/docs/dotnet/intro.md b/docs/docs/dotnet/intro.md index 5e92acc3..5fdf2eac 100644 --- a/docs/docs/dotnet/intro.md +++ b/docs/docs/dotnet/intro.md @@ -43,9 +43,9 @@ public OptionObject RunScript(OptionObject optionObject, string parameter) Likewise, to bring this same API up to the latest OptionObject version doesn't require accounting for the new properties. Just update the OptionObject version and import the new/updated WSDL into myAvatar. -```cs title="Upgrading from OptionObject to OptionObject2015" +```cs title="Upgrading from OptionObject to OptionObject2023" [WebMethod] -public OptionObject2015 RunScript(OptionObject2015 optionObject, string parameter) +public OptionObject2023 RunScript(OptionObject2023 optionObject, string parameter) { return optionObject.ToReturnOptionObject(ErrorCode.Informational, "Hello, World!"); } diff --git a/docs/sidebars.js b/docs/sidebars.js index 681fc5c5..a12cbddc 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -37,7 +37,7 @@ const sidebars = { id: 'dotnet/data-model/README' }, items: [ - 'dotnet/data-model/optionobject2015', + 'dotnet/data-model/optionobject2023', 'dotnet/data-model/formobject', 'dotnet/data-model/rowobject', 'dotnet/data-model/fieldobject', diff --git a/docs/src/components/HomepageHelloWorld/index.js b/docs/src/components/HomepageHelloWorld/index.js index e3329564..4a8ed3fd 100644 --- a/docs/src/components/HomepageHelloWorld/index.js +++ b/docs/src/components/HomepageHelloWorld/index.js @@ -21,14 +21,15 @@ export default function HomepageHelloWorld() { {`[WebMethod] -public OptionObject2015 RunScript(OptionObject2015 optionObject, string parameters) +public OptionObject2023 RunScript(OptionObject2023 optionObject, string parameters) { - OptionObject returnOptionObject = new OptionObject(); + OptionObject2023 returnOptionObject = new OptionObject(); returnOptionObject.EntityID = optionObject.EntityID; returnOptionObject.EpisodeNumber = optionObject.EpisodeNumber; returnOptionObject.Facility = optionObject.Facility; returnOptionObject.Forms = optionObject.Forms; + returnOptionObject.HistoricUID = optionObject.HistoricUID; returnOptionObject.NamespaceName = optionObject.NamespaceName; returnOptionObject.OptionId = optionObject.OptionId; returnOptionObject.OptionStaffId = optionObject.OptionStaffId; @@ -58,9 +59,9 @@ public OptionObject2015 RunScript(OptionObject2015 optionObject, string paramete {`[WebMethod] -public OptionObject2015 RunScript(OptionObject2015 incomingOptionObject, string parameters) +public OptionObject2023 RunScript(OptionObject2023 incomingOptionObject, string parameters) { - OptionObject2015 optionObject = incomingOptionObject.Clone(); + OptionObject2023 optionObject = incomingOptionObject.Clone(); // Do work here on the clone of incoming OptionObject to retain original request for later comparison or restore return optionObject.ToReturnOptionObject(ErrorCode.Informational, "Informational message..."); }`} @@ -70,4 +71,4 @@ public OptionObject2015 RunScript(OptionObject2015 incomingOptionObject, string ); -} \ No newline at end of file +} diff --git a/dotnet/RarelySimple.AvatarScriptLink/README.md b/dotnet/RarelySimple.AvatarScriptLink/README.md index 6d6637f8..6e065806 100644 --- a/dotnet/RarelySimple.AvatarScriptLink/README.md +++ b/dotnet/RarelySimple.AvatarScriptLink/README.md @@ -43,7 +43,7 @@ Likewise, to bring this same API up to the latest OptionObject version doesn't r ```c# [WebMethod] -public OptionObject2015 RunScript(OptionObject2015 optionObject, string parameter) +public OptionObject2023 RunScript(OptionObject2023 optionObject, string parameter) { return optionObject.ToReturnOptionObject(ErrorCode.Informational, "Hello, World!"); } diff --git a/dotnet/RarelySimple.AvatarScriptLink/RarelySimple.AvatarScriptLink.csproj b/dotnet/RarelySimple.AvatarScriptLink/RarelySimple.AvatarScriptLink.csproj index a822364e..f5e3bfdc 100644 --- a/dotnet/RarelySimple.AvatarScriptLink/RarelySimple.AvatarScriptLink.csproj +++ b/dotnet/RarelySimple.AvatarScriptLink/RarelySimple.AvatarScriptLink.csproj @@ -18,7 +18,7 @@ RarelySimple.AvatarScriptLink README.md true - 1.2.0 + 1.3.0 $(Version) $(Version) From fb66401321c01bc35a58e37761ad0c79568a4dbc Mon Sep 17 00:00:00 2001 From: Scott Olson Jr Date: Sun, 16 Jul 2023 00:58:59 -0700 Subject: [PATCH 2/2] implement OptionObject2023 --- .../Objects/OptionObject2023Tests.cs | 610 ++++++++++++++++++ ...RarelySimple.AvatarScriptLink.Tests.csproj | 1 + .../Transform/TransformToOptionObject2023.cs | 116 ++++ .../Advanced/Abstracts/OptionObjectBase.cs | 26 +- .../Advanced/Interfaces/IOptionObject2023.cs | 7 + .../Objects/FormObject.cs | 99 +++ .../Objects/OptionObject.cs | 18 +- .../Objects/OptionObject2.cs | 18 +- .../Objects/OptionObject2015.cs | 33 +- .../Objects/OptionObject2023.cs | 380 +++++++++++ 10 files changed, 1292 insertions(+), 16 deletions(-) create mode 100644 dotnet/RarelySimple.AvatarScriptLink.Tests/Objects/OptionObject2023Tests.cs create mode 100644 dotnet/RarelySimple.AvatarScriptLink/Helpers/OptionObject/Transform/TransformToOptionObject2023.cs create mode 100644 dotnet/RarelySimple.AvatarScriptLink/Objects/Advanced/Interfaces/IOptionObject2023.cs create mode 100644 dotnet/RarelySimple.AvatarScriptLink/Objects/OptionObject2023.cs diff --git a/dotnet/RarelySimple.AvatarScriptLink.Tests/Objects/OptionObject2023Tests.cs b/dotnet/RarelySimple.AvatarScriptLink.Tests/Objects/OptionObject2023Tests.cs new file mode 100644 index 00000000..e891567a --- /dev/null +++ b/dotnet/RarelySimple.AvatarScriptLink.Tests/Objects/OptionObject2023Tests.cs @@ -0,0 +1,610 @@ +using System; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using RarelySimple.AvatarScriptLink.Objects; +using System.Collections.Generic; + +namespace RarelySimple.AvatarScriptLink.Tests.ObjectsTests +{ + [TestClass] + public class OptionObject2023Tests + { + private OptionObject2023 configuredOptionObject2023; + + [TestInitialize] + public void TestInitialize() + { + configuredOptionObject2023 = OptionObject2023.Initialize(); + // First Form + FieldObject fieldObject = FieldObject.Builder() + .FieldNumber("123") + .FieldValue("Value") + .Enabled() + .Locked() + .Required() + .Build(); + + FormObject formObject = FormObject.Builder() + .FormId("1") + .CurrentRow() + .RowId("1||1") + .Field(fieldObject) + .AddRow() + .Build(); + // Second Form + RowObject rowObject01 = RowObject.Builder() + .RowId("2||1") + .Field() + .FieldNumber("234") + .FieldValue("MI Value") + .AddField() + .Build(); + + RowObject rowObject02 = RowObject.Builder() + .RowId("2||2") + .Field() + .FieldNumber("234") + .FieldValue("MI Value 2") + .AddField() + .Build(); + + FormObject miFormObject = FormObject.Builder() + .FormId("2") + .CurrentRow(rowObject01) + .MultipleIteration() + .OtherRow(rowObject02) + .Build(); + + configuredOptionObject2023 = OptionObject2023.Builder() + .OptionId("OPT1234") + .Form(formObject) + .Form(miFormObject) + .Build(); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + public void OptionObject2023_HasFormObject() + { + OptionObject2023 optionObject = OptionObject2023.Initialize(); + Assert.IsNotNull(optionObject.Forms); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + public void OptionObject2023_Forms_IsNotEmpty() + { + OptionObject2023 optionObject = OptionObject2023.Initialize(); + var expected = new List(); + var actual = optionObject.Forms; + Assert.AreNotEqual(expected, actual); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + public void OptionObject2023_CanGetHtmlString_WithoutHtmlHeaders() + { + OptionObject2023 optionObject = OptionObject2023.Initialize(); + var actual = optionObject.ToHtmlString(false); + Assert.IsNotNull(actual); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + public void OptionObject2023_CanGetHtmlString_WithHtmlHeaders() + { + OptionObject2023 optionObject = OptionObject2023.Initialize(); + var actual = optionObject.ToHtmlString(true); + Assert.IsNotNull(actual); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + public void OptionObject2023_AddFormObject_FormObject() + { + FormObject formObject1 = FormObject.Builder() + .FormId("1") + .Build(); + FormObject formObject2 = FormObject.Builder() + .FormId("2") + .MultipleIteration() + .Build(); + OptionObject2023 optionObject = OptionObject2023.Initialize(); + optionObject.AddFormObject(formObject1); + Assert.AreEqual(1, optionObject.Forms.Count); + optionObject.AddFormObject(formObject2); + Assert.AreEqual(2, optionObject.Forms.Count); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + [ExpectedException(typeof(System.ArgumentException))] + public void OptionObject2023_AddFormObject_FormObject_Exception() + { + FormObject formObject1 = FormObject.Builder().FormId("1").Build(); + OptionObject2023 optionObject = OptionObject2023.Initialize(); + optionObject.AddFormObject(formObject1); + Assert.AreEqual(1, optionObject.Forms.Count); + optionObject.AddFormObject(formObject1); + Assert.AreEqual(1, optionObject.Forms.Count); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + public void OptionObject2023_AddFormObject_Properties() + { + OptionObject2023 optionObject = OptionObject2023.Initialize(); + optionObject.AddFormObject("1", false); + Assert.AreEqual(1, optionObject.Forms.Count); + optionObject.AddFormObject("2", true); + Assert.AreEqual(2, optionObject.Forms.Count); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + [ExpectedException(typeof(System.ArgumentException))] + public void OptionObject2023_AddFormObject_Properties_Exception() + { + OptionObject2023 optionObject = OptionObject2023.Initialize(); + optionObject.AddFormObject("1", false); + Assert.AreEqual(1, optionObject.Forms.Count); + optionObject.AddFormObject("1", false); + Assert.AreEqual(1, optionObject.Forms.Count); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + [ExpectedException(typeof(System.ArgumentException))] + public void OptionObject2023_GetCurrentRowId_Error() + { + OptionObject2023 optionObject = OptionObject2023.Initialize(); + var actual = optionObject.GetCurrentRowId("1"); + Assert.AreEqual(null, actual); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + public void OptionObject2023_GetCurrentRowId_AreEqual() + { + FormObject formObject = FormObject.Builder() + .FormId("1") + .CurrentRow() + .RowId("1||1") + .AddRow() + .Build(); + OptionObject2023 optionObject = OptionObject2023.Builder() + .OptionId("OPT1234") + .Form(formObject) + .Build(); + var actual = optionObject.GetCurrentRowId("1"); + Assert.AreEqual("1||1", actual); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + public void OptionObject2023_GetFieldValue_AreEqual() + { + var expected = "Value"; + var actual = configuredOptionObject2023.GetFieldValue("123"); + Assert.AreEqual(expected, actual); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + [ExpectedException(typeof(System.ArgumentException))] + public void OptionObject2023_GetFieldValue_AreNotEqual() + { + OptionObject2023 optionObject = OptionObject2023.Initialize(); + var expected = "Value"; + var actual = optionObject.GetFieldValue("123"); + Assert.AreNotEqual(expected, actual); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + public void OptionObject2023_GetFieldValue_MI_AreEqual() + { + var expected = "MI Value"; + var actual = configuredOptionObject2023.GetFieldValue("234"); + Assert.AreEqual(expected, actual); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + [ExpectedException(typeof(ArgumentException))] + public void OptionObject2023_GetFieldValue_MI_AreNotEqual() + { + var expected = "Value"; + var actual = configuredOptionObject2023.GetFieldValue("456"); + Assert.AreNotEqual(expected, actual); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + public void OptionObject2023_GetFieldValues_AreEqual() + { + var expected = "Value"; + var values = configuredOptionObject2023.GetFieldValues("123"); + var actual = values.Count > 0 ? values[0] : null; + Assert.AreEqual(expected, actual); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + public void OptionObject2023_GetFieldValues_MI_AreEqual() + { + var expected = "MI Value"; + var values = configuredOptionObject2023.GetFieldValues("234"); + var actual = values.Count > 0 ? values[0] : null; + Assert.AreEqual(expected, actual); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + public void OptionObject2023_GetFieldValues_AreNotEqual() + { + var expected = "Value"; + var values = configuredOptionObject2023.GetFieldValues("456"); + var actual = values.Count > 0 ? values[0] : null; + Assert.AreNotEqual(expected, actual); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + public void OptionObject2023_GetMultipleIterationStatus_IsFalse() + { + string formId = "1"; + OptionObject2023 optionObject = OptionObject2023.Builder() + .OptionId("OPT1234") + .Form() + .FormId(formId) + .AddForm() + .Build(); + var actual = optionObject.GetMultipleIterationStatus(formId); + Assert.IsFalse(actual); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + [ExpectedException(typeof(System.ArgumentException))] + public void OptionObject2023_GetMultipleIterationStatus_IsNotFound() + { + OptionObject2023 optionObject = OptionObject2023.Initialize(); + var actual = optionObject.GetMultipleIterationStatus("1"); + Assert.IsFalse(actual); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + public void OptionObject2023_GetMultipleIterationStatus_IsTrue() + { + var actual = configuredOptionObject2023.GetMultipleIterationStatus("2"); + Assert.IsTrue(actual); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + [ExpectedException(typeof(System.ArgumentException))] + public void OptionObject2023_GetParentRowId_Error() + { + OptionObject2023 optionObject = new OptionObject2023(); + var actual = optionObject.GetParentRowId("1"); + Assert.AreEqual(null, actual); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + public void OptionObject2023_GetParentRowId_AreEqual() + { + RowObject rowObject = RowObject.Builder().RowId("1||2").ParentRowId("1||1").Build(); + OptionObject2023 optionObject = OptionObject2023.Builder() + .OptionId("USER00") + .Form() + .FormId("1") + .CurrentRow(rowObject) + .AddForm() + .Build(); + var actual = optionObject.GetParentRowId("1"); + Assert.AreEqual(rowObject.ParentRowId, actual); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + public void OptionObject2023_IsFieldPresent_IsTrue() + { + var actual = configuredOptionObject2023.IsFieldPresent("123"); + Assert.IsTrue(actual); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + public void OptionObject2023_IsFieldPresent_IsFalse() + { + var actual = configuredOptionObject2023.IsFieldPresent("456"); + Assert.IsFalse(actual); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + public void OptionObject2023_IsFieldEnabled_IsTrue() + { + var actual = configuredOptionObject2023.IsFieldEnabled("123"); + Assert.IsTrue(actual); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + public void OptionObject2023_IsFieldEnabled_IsFalse() + { + var actual = configuredOptionObject2023.IsFieldEnabled("234"); + Assert.IsFalse(actual); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + [ExpectedException(typeof(System.ArgumentException))] + public void OptionObject2023_IsFieldEnabled_Error() + { + var actual = configuredOptionObject2023.IsFieldEnabled("456"); + Assert.IsFalse(actual); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + public void OptionObject2023_SetDisabledFields_IsTrue() + { + List disabledFields = new List { "123" }; + configuredOptionObject2023.SetDisabledFields(disabledFields); + Assert.IsTrue(!configuredOptionObject2023.IsFieldEnabled("123")); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + public void OptionObject2023_IsFieldLocked_IsTrue() + { + var actual = configuredOptionObject2023.IsFieldLocked("123"); + Assert.IsTrue(actual); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + public void OptionObject2023_IsFieldLocked_IsFalse() + { + var actual = configuredOptionObject2023.IsFieldLocked("234"); + Assert.IsFalse(actual); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + [ExpectedException(typeof(System.ArgumentException))] + public void OptionObject2023_IsFieldLocked_Error() + { + var actual = configuredOptionObject2023.IsFieldLocked("456"); + Assert.IsFalse(actual); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + public void OptionObject2023_SetUnlockedFields_IsTrue() + { + List requiredFields = new List { "123" }; + configuredOptionObject2023.SetUnlockedFields(requiredFields); + Assert.IsTrue(!configuredOptionObject2023.IsFieldLocked("123")); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + public void OptionObject2023_SetLockedFields_IsTrue() + { + List lockedFields = new List { "123" }; + configuredOptionObject2023.SetLockedFields(lockedFields); + Assert.IsTrue(configuredOptionObject2023.IsFieldLocked("123")); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + public void OptionObject2023_IsFieldRequired_IsTrue() + { + var actual = configuredOptionObject2023.IsFieldRequired("123"); + Assert.IsTrue(actual); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + public void OptionObject2023_IsFieldRequired_AreNotEqual() + { + var actual = configuredOptionObject2023.IsFieldRequired("234"); + Assert.IsFalse(actual); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + [ExpectedException(typeof(System.ArgumentException))] + public void OptionObject2023_IsFieldRequired_Error() + { + var actual = configuredOptionObject2023.IsFieldRequired("456"); + Assert.IsFalse(actual); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + public void OptionObject2023_SetOptionalFields_IsTrue() + { + List optionalFields = new List { "123" }; + configuredOptionObject2023.SetOptionalFields(optionalFields); + Assert.IsTrue(configuredOptionObject2023.IsFieldEnabled("123")); + Assert.IsFalse(configuredOptionObject2023.IsFieldRequired("123")); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + public void OptionObject2023_SetRequiredFields_AreEqual() + { + List requiredFields = new List { "123" }; + configuredOptionObject2023.SetRequiredFields(requiredFields); + Assert.IsTrue(configuredOptionObject2023.IsFieldEnabled("123")); + Assert.IsTrue(configuredOptionObject2023.IsFieldRequired("123")); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + public void OptionObject2023_Constructor_NoForms_AreEqual() + { + string entityId = "12345"; + double episodeNumber = 0; + string facility = "1"; + string historicUID = "11111"; + string namespaceName = "AVPM"; + string optionId = "USER37"; + string optionStaffId = ""; + string optionUserId = "username"; + string parentNamespace = "AVPM"; + string serverName = "server"; + string sessionToken = "acb123"; + string systemCode = "UAT"; + int formCount = 0; + + OptionObject2023 optionObject = new OptionObject2023(optionId, optionUserId, optionStaffId + , facility, entityId, episodeNumber + , systemCode, namespaceName, parentNamespace, serverName + , sessionToken, historicUID); + Assert.AreEqual(entityId, optionObject.EntityID); + Assert.AreEqual(episodeNumber, optionObject.EpisodeNumber); + Assert.AreEqual(facility, optionObject.Facility); + Assert.AreEqual(historicUID, optionObject.HistoricUID); + Assert.AreEqual(namespaceName, optionObject.NamespaceName); + Assert.AreEqual(optionId, optionObject.OptionId); + Assert.AreEqual(optionStaffId, optionObject.OptionStaffId); + Assert.AreEqual(optionUserId, optionObject.OptionUserId); + Assert.AreEqual(parentNamespace, optionObject.ParentNamespace); + Assert.AreEqual(serverName, optionObject.ServerName); + Assert.AreEqual(sessionToken, optionObject.SessionToken); + Assert.AreEqual(systemCode, optionObject.SystemCode); + Assert.AreEqual(formCount, optionObject.Forms.Count); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + public void OptionObject2023_Constructor_WithForms_AreEqual() + { + string entityId = "12345"; + double episodeNumber = 0; + string facility = "1"; + string historicUID = "11111"; + string namespaceName = "AVPM"; + string optionId = "USER37"; + string optionStaffId = ""; + string optionUserId = "username"; + string parentNamespace = "AVPM"; + string serverName = "server"; + string sessionToken = "acb123"; + string systemCode = "UAT"; + List forms = new List + { + new FormObject("1"), + new FormObject("2") + }; + int formCount = 2; + + OptionObject2023 optionObject = new OptionObject2023(optionId, optionUserId, optionStaffId + , facility, entityId, episodeNumber + , systemCode, namespaceName, parentNamespace, serverName + , sessionToken, historicUID + , forms); + Assert.AreEqual(entityId, optionObject.EntityID); + Assert.AreEqual(episodeNumber, optionObject.EpisodeNumber); + Assert.AreEqual(facility, optionObject.Facility); + Assert.AreEqual(historicUID, optionObject.HistoricUID); + Assert.AreEqual(namespaceName, optionObject.NamespaceName); + Assert.AreEqual(optionId, optionObject.OptionId); + Assert.AreEqual(optionStaffId, optionObject.OptionStaffId); + Assert.AreEqual(optionUserId, optionObject.OptionUserId); + Assert.AreEqual(parentNamespace, optionObject.ParentNamespace); + Assert.AreEqual(serverName, optionObject.ServerName); + Assert.AreEqual(sessionToken, optionObject.SessionToken); + Assert.AreEqual(systemCode, optionObject.SystemCode); + Assert.AreEqual(formCount, optionObject.Forms.Count); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + public void OptionObject2023_Clone_AreEqual() + { + List fieldObjects = new List + { + new FieldObject("123", "Test") + }; + RowObject rowObject = new RowObject("1||1", fieldObjects); + FormObject formObject = new FormObject("1", rowObject); + OptionObject2023 optionObject = new OptionObject2023("USER00", "userId", "000111", "1", "123456", 1, "UAT", "AVPM", "AVPM", "SERVER", "TOKEN", "HISTORICUID"); + optionObject.AddFormObject(formObject); + + OptionObject2023 cloneOptionObject = optionObject.Clone(); + + Assert.AreEqual(optionObject, cloneOptionObject); + Assert.IsTrue(optionObject.IsFieldPresent("123")); + Assert.IsTrue(cloneOptionObject.IsFieldPresent("123")); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + public void OptionObject2023_ReturnOptionObject_SessionTokenReturned() + { + List fieldObjects = new List + { + new FieldObject("123", "Test") + }; + RowObject rowObject = new RowObject("1||1", fieldObjects); + FormObject formObject = new FormObject("1", rowObject); + OptionObject2023 optionObject = new OptionObject2023("USER00", "userId", "000111", "1", "123456", 1, "UAT", "AVPM", "AVPM", "SERVER", "TOKEN", "HISTORICUID"); + optionObject.AddFormObject(formObject); + + OptionObject2023 returnOptionObject = optionObject.ToReturnOptionObject(); + + Assert.AreEqual(optionObject.SessionToken, returnOptionObject.SessionToken); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + public void OptionObject2023_ReturnOptionObject_AreNotEqual() + { + List fieldObjects = new List + { + new FieldObject("123", "Test") + }; + RowObject rowObject = new RowObject("1||1", fieldObjects); + FormObject formObject = new FormObject("1", rowObject); + OptionObject2023 optionObject = new OptionObject2023("USER00", "userId", "000111", "1", "123456", 1, "UAT", "AVPM", "AVPM", "SERVER", "TOKEN", "HISTORICUID"); + optionObject.AddFormObject(formObject); + + OptionObject2023 returnOptionObject = optionObject.ToReturnOptionObject(); + + Assert.AreNotEqual(optionObject.ToJson(), returnOptionObject.ToJson()); + Assert.IsTrue(optionObject.IsFieldPresent("123")); + Assert.IsFalse(returnOptionObject.IsFieldPresent("123")); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + public void OptionObject2023_ReturnOptionObject_ErrorCodeNotOverwritten() + { + double expected = 3; + OptionObject2023 optionObject = OptionObject2023.Builder().OptionId("USER123").Build(); + optionObject.ErrorCode = expected; + OptionObject2023 returnOptionObject = optionObject.ToReturnOptionObject(); + + Assert.AreEqual(expected, returnOptionObject.ErrorCode); + } + + [TestMethod] + [TestCategory("OptionObject2023")] + public void OptionObject2023_ReturnOptionObject_ErrorMesgNotOverwritten() + { + string expected = "Preset error message"; + OptionObject2023 optionObject = OptionObject2023.Builder().OptionId("USER123").Build(); + optionObject.ErrorMesg = expected; + OptionObject2023 returnOptionObject = optionObject.ToReturnOptionObject(); + + Assert.AreEqual(expected, returnOptionObject.ErrorMesg); + } + } +} diff --git a/dotnet/RarelySimple.AvatarScriptLink.Tests/RarelySimple.AvatarScriptLink.Tests.csproj b/dotnet/RarelySimple.AvatarScriptLink.Tests/RarelySimple.AvatarScriptLink.Tests.csproj index 1ac27139..4fcbd533 100644 --- a/dotnet/RarelySimple.AvatarScriptLink.Tests/RarelySimple.AvatarScriptLink.Tests.csproj +++ b/dotnet/RarelySimple.AvatarScriptLink.Tests/RarelySimple.AvatarScriptLink.Tests.csproj @@ -88,6 +88,7 @@ + diff --git a/dotnet/RarelySimple.AvatarScriptLink/Helpers/OptionObject/Transform/TransformToOptionObject2023.cs b/dotnet/RarelySimple.AvatarScriptLink/Helpers/OptionObject/Transform/TransformToOptionObject2023.cs new file mode 100644 index 00000000..2d766f05 --- /dev/null +++ b/dotnet/RarelySimple.AvatarScriptLink/Helpers/OptionObject/Transform/TransformToOptionObject2023.cs @@ -0,0 +1,116 @@ +using RarelySimple.AvatarScriptLink.Objects.Advanced; +using RarelySimple.AvatarScriptLink.Objects; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Globalization; + +namespace RarelySimple.AvatarScriptLink.Helpers +{ + public static partial class OptionObjectHelpers + { + /// + /// Transforms an to . + /// + /// + /// + public static IOptionObject2023 TransformToOptionObject2023(IOptionObject optionObject) + { + if (optionObject == null) + throw new ArgumentNullException(nameof(optionObject), ScriptLinkHelpers.GetLocalizedString("parameterCannotBeNull", CultureInfo.CurrentCulture)); + if (!IsValidErrorCode(optionObject.ErrorCode)) + throw new ArgumentException(ScriptLinkHelpers.GetLocalizedString("errorCodeIsNotValid", CultureInfo.CurrentCulture)); + var optionObject2023 = new OptionObject2023 + { + EntityID = optionObject.EntityID, + EpisodeNumber = optionObject.EpisodeNumber, + ErrorCode = optionObject.ErrorCode, + ErrorMesg = optionObject.ErrorMesg, + Facility = optionObject.Facility, + OptionId = optionObject.OptionId, + OptionStaffId = optionObject.OptionStaffId, + OptionUserId = optionObject.OptionUserId, + SystemCode = optionObject.SystemCode, + Forms = optionObject.Forms.Any() ? optionObject.Forms : new List() + }; + return optionObject2023; + } + /// + /// Transforms an to . + /// + /// + /// + public static IOptionObject2023 TransformToOptionObject2023(IOptionObject2 optionObject2) + { + if (optionObject2 == null) + throw new ArgumentNullException(nameof(optionObject2), ScriptLinkHelpers.GetLocalizedString("parameterCannotBeNull", CultureInfo.CurrentCulture)); + if (!IsValidErrorCode(optionObject2.ErrorCode)) + throw new ArgumentException(ScriptLinkHelpers.GetLocalizedString("errorCodeIsNotValid", CultureInfo.CurrentCulture)); + var optionObject2023 = new OptionObject2023 + { + EntityID = optionObject2.EntityID, + EpisodeNumber = optionObject2.EpisodeNumber, + ErrorCode = optionObject2.ErrorCode, + ErrorMesg = optionObject2.ErrorMesg, + Facility = optionObject2.Facility, + NamespaceName = optionObject2.NamespaceName, + OptionId = optionObject2.OptionId, + OptionStaffId = optionObject2.OptionStaffId, + OptionUserId = optionObject2.OptionUserId, + ParentNamespace = optionObject2.ParentNamespace, + ServerName = optionObject2.ServerName, + SystemCode = optionObject2.SystemCode, + Forms = optionObject2.Forms.Any() ? optionObject2.Forms : new List() + }; + return optionObject2023; + } + /// + /// Transforms an to . + /// + /// + /// + public static IOptionObject2023 TransformToOptionObject2023(IOptionObject2015 optionObject2015) + { + if (optionObject2015 == null) + throw new ArgumentNullException(nameof(optionObject2015), ScriptLinkHelpers.GetLocalizedString("parameterCannotBeNull", CultureInfo.CurrentCulture)); + if (!IsValidErrorCode(optionObject2015.ErrorCode)) + throw new ArgumentException(ScriptLinkHelpers.GetLocalizedString("errorCodeIsNotValid", CultureInfo.CurrentCulture)); + var optionObject2023 = new OptionObject2023 + { + EntityID = optionObject2015.EntityID, + EpisodeNumber = optionObject2015.EpisodeNumber, + ErrorCode = optionObject2015.ErrorCode, + ErrorMesg = optionObject2015.ErrorMesg, + Facility = optionObject2015.Facility, + NamespaceName = optionObject2015.NamespaceName, + OptionId = optionObject2015.OptionId, + OptionStaffId = optionObject2015.OptionStaffId, + OptionUserId = optionObject2015.OptionUserId, + ParentNamespace = optionObject2015.ParentNamespace, + ServerName = optionObject2015.ServerName, + SystemCode = optionObject2015.SystemCode, + SessionToken = optionObject2015.SessionToken, + Forms = optionObject2015.Forms.Any() ? optionObject2015.Forms : new List() + }; + return optionObject2023; + } + /// + /// Transforms a serialized string to . + /// + /// + /// + public static IOptionObject2023 TransformToOptionObject2023(string serializedString) + { + if (string.IsNullOrEmpty(serializedString)) + throw new ArgumentNullException(nameof(serializedString), ScriptLinkHelpers.GetLocalizedString("parameterCannotBeNull", CultureInfo.CurrentCulture)); + try + { + return ScriptLinkHelpers.DeserializeObject(serializedString); + } + catch + { + throw new ArgumentException(ScriptLinkHelpers.GetLocalizedString("serializedStringIncompatibleFormat", CultureInfo.CurrentCulture), nameof(serializedString)); + } + } + } +} diff --git a/dotnet/RarelySimple.AvatarScriptLink/Objects/Advanced/Abstracts/OptionObjectBase.cs b/dotnet/RarelySimple.AvatarScriptLink/Objects/Advanced/Abstracts/OptionObjectBase.cs index 5bdc2cf4..f3f11f15 100644 --- a/dotnet/RarelySimple.AvatarScriptLink/Objects/Advanced/Abstracts/OptionObjectBase.cs +++ b/dotnet/RarelySimple.AvatarScriptLink/Objects/Advanced/Abstracts/OptionObjectBase.cs @@ -7,7 +7,7 @@ namespace RarelySimple.AvatarScriptLink.Objects.Advanced { - public abstract class OptionObjectBase : IEquatable, IOptionObject2015 + public abstract class OptionObjectBase : IEquatable, IOptionObject2023 { #region Constructors @@ -32,14 +32,16 @@ protected OptionObjectBase() /// /// /// + /// protected OptionObjectBase(string optionId, string optionUserId, string optionStaffId , string facility, string entityId, double episodeNumber , string systemCode, string namespaceName, string parentNamespace, string serverName - , string sessionToken) + , string sessionToken, string historicUID) { EntityID = entityId; EpisodeNumber = episodeNumber; Facility = facility; + HistoricUID = historicUID; NamespaceName = namespaceName; OptionId = optionId; OptionStaffId = optionStaffId; @@ -65,16 +67,18 @@ protected OptionObjectBase(string optionId, string optionUserId, string optionSt /// /// /// + /// /// protected OptionObjectBase(string optionId, string optionUserId, string optionStaffId , string facility, string entityId, double episodeNumber , string systemCode, string namespaceName, string parentNamespace, string serverName - , string sessionToken + , string sessionToken, string historicUID , List forms) { EntityID = entityId; EpisodeNumber = episodeNumber; Facility = facility; + HistoricUID = historicUID; NamespaceName = namespaceName; OptionId = optionId; OptionStaffId = optionStaffId; @@ -118,6 +122,11 @@ protected OptionObjectBase(string optionId, string optionUserId, string optionSt /// The value is a . For most organizations, this value is 1, however more complex security configurations will utilize additional values. public virtual string Facility { get; set; } /// + /// Gets or sets the HistoricUID property of the . + /// + /// The value is a representing this object's historic unique identifier. + public virtual string HistoricUID { get; set; } + /// /// Gets or sets the Forms property of the . /// /// The value is a of . @@ -229,6 +238,7 @@ public override int GetHashCode() + delimiter + this.ErrorCode.ToString(CultureInfo.InvariantCulture) + delimiter + this.ErrorMesg + delimiter + this.Facility + + delimiter + this.HistoricUID + delimiter + this.NamespaceName + delimiter + this.OptionId + delimiter + this.OptionStaffId @@ -269,7 +279,7 @@ private static bool AreFormsEqual(List list1, List list2 public static bool operator ==(OptionObjectBase optionObject1, OptionObjectBase optionObject2) { if (((object)optionObject1) == null || ((object)optionObject2) == null) - return Object.Equals(optionObject1, optionObject2); + return Equals(optionObject1, optionObject2); return optionObject1.Equals(optionObject2); } @@ -277,7 +287,7 @@ private static bool AreFormsEqual(List list1, List list2 public static bool operator !=(OptionObjectBase optionObject1, OptionObjectBase optionObject2) { if (((object)optionObject1) == null || ((object)optionObject2) == null) - return !Object.Equals(optionObject1, optionObject2); + return !Equals(optionObject1, optionObject2); return !(optionObject1.Equals(optionObject2)); } @@ -567,6 +577,12 @@ public virtual OptionObjectBase Clone() /// public abstract OptionObject2015 ToOptionObject2015(); + /// + /// Transforms the to an . + /// + /// + public abstract OptionObject2023 ToOptionObject2023(); + /// /// Creates an with the minimal information required to return. /// diff --git a/dotnet/RarelySimple.AvatarScriptLink/Objects/Advanced/Interfaces/IOptionObject2023.cs b/dotnet/RarelySimple.AvatarScriptLink/Objects/Advanced/Interfaces/IOptionObject2023.cs new file mode 100644 index 00000000..e2670201 --- /dev/null +++ b/dotnet/RarelySimple.AvatarScriptLink/Objects/Advanced/Interfaces/IOptionObject2023.cs @@ -0,0 +1,7 @@ +namespace RarelySimple.AvatarScriptLink.Objects.Advanced +{ + public interface IOptionObject2023: IOptionObject2015 + { + string HistoricUID { get; set; } + } +} diff --git a/dotnet/RarelySimple.AvatarScriptLink/Objects/FormObject.cs b/dotnet/RarelySimple.AvatarScriptLink/Objects/FormObject.cs index 7817fcf6..5288f0d0 100644 --- a/dotnet/RarelySimple.AvatarScriptLink/Objects/FormObject.cs +++ b/dotnet/RarelySimple.AvatarScriptLink/Objects/FormObject.cs @@ -513,5 +513,104 @@ public OptionObject2015FormObjectBuilderMIFinal OtherRow(RowObject rowObject) return this; } } + /// + /// A Faceted Fluent Builder for adding FormObjects to OptionObject2023s + /// + public class OptionObject2023FormObjectBuilder + { + protected readonly OptionObject2023 optionObject; + protected readonly FormObject formObject; + /// + /// Constructs a OptionObjectFormObjectBuilder + /// + /// + public OptionObject2023FormObjectBuilder(OptionObject2023 optionObject) + { + this.optionObject = optionObject; + formObject = new FormObject(); + } + /// + /// Sets the FormId of the . + /// This is required before any other attributes may be set on the built. + /// + /// Required. The FormId to assign to the + /// A + /// + public OptionObject2023FormObjectBuilderFinal FormId(string formId) + { + if (string.IsNullOrEmpty(formId)) + throw new ArgumentNullException(nameof(formId), ScriptLinkHelpers.GetLocalizedString("parameterCannotBeNull", CultureInfo.CurrentCulture)); + formObject.FormId = formId; + return new OptionObject2023FormObjectBuilderFinal(optionObject, formObject); + } + } + /// + /// A Faceted Fluent Builder for the completion of a build. + /// + public class OptionObject2023FormObjectBuilderFinal + { + protected readonly OptionObject2023 optionObject; + protected readonly FormObject formObject; + /// + /// Constructs a OptionObject2015FormObjectBuilderFinal used to add a FormObject to a OptionObject2015 + /// + /// The to add . + /// The to complete. + public OptionObject2023FormObjectBuilderFinal(OptionObject2023 optionObject, FormObject formObject) + { + this.optionObject = optionObject; + this.formObject = formObject; + } + /// + /// Sets the CurrentRow of the . + /// + /// The to set as the CurrentRow. + /// A + /// Thrown if no provided. + public OptionObject2023FormObjectBuilderFinal CurrentRow(RowObject rowObject) + { + formObject.CurrentRow = rowObject ?? throw new ArgumentNullException(nameof(rowObject), ScriptLinkHelpers.GetLocalizedString("parameterCannotBeNull", CultureInfo.CurrentCulture)); + return this; + } + /// + /// Indicate the uses a Multiple-Iteration Table. + /// Must be set to enable the adding of OtherRows to the + /// + /// A + public OptionObject2023FormObjectBuilderMIFinal MultipleIteration() + { + formObject.MultipleIteration = true; + return new OptionObject2023FormObjectBuilderMIFinal(optionObject, formObject); + } + /// + /// Adds FormObject to the . + /// + /// A + public OptionObject2023.OptionObject2023BuilderFinal AddForm() + { + optionObject.AddFormObject(formObject); + return new OptionObject2023.OptionObject2023BuilderFinal(optionObject); + } + } + /// + /// A Faceted Fluent Builder for the completion of a multiple iteration build. + /// + public class OptionObject2023FormObjectBuilderMIFinal : OptionObject2023FormObjectBuilderFinal + { + public OptionObject2023FormObjectBuilderMIFinal(OptionObject2023 optionObject, FormObject formObject) : base(optionObject, formObject) { } + /// + /// Adds another RowObject to the . + /// + /// The to add. + /// A + /// Thrown if no provided. + public OptionObject2023FormObjectBuilderMIFinal OtherRow(RowObject rowObject) + { + if (rowObject == null) + throw new ArgumentNullException(nameof(rowObject), ScriptLinkHelpers.GetLocalizedString("parameterCannotBeNull", CultureInfo.CurrentCulture)); + formObject.OtherRows.Add(rowObject); + return this; + } + } } } \ No newline at end of file diff --git a/dotnet/RarelySimple.AvatarScriptLink/Objects/OptionObject.cs b/dotnet/RarelySimple.AvatarScriptLink/Objects/OptionObject.cs index 700ab040..f07f7569 100644 --- a/dotnet/RarelySimple.AvatarScriptLink/Objects/OptionObject.cs +++ b/dotnet/RarelySimple.AvatarScriptLink/Objects/OptionObject.cs @@ -34,7 +34,7 @@ public OptionObject(string optionId, string optionUserId, string optionStaffId , string facility, string entityId, double episodeNumber , string systemCode) : base(optionId, optionUserId, optionStaffId , facility, entityId, episodeNumber - , systemCode, "", "", "", "") + , systemCode, "", "", "", "", "") { } /// @@ -53,7 +53,7 @@ public OptionObject(string optionId, string optionUserId, string optionStaffId , string systemCode , List forms) : base(optionId, optionUserId, optionStaffId , facility, entityId, episodeNumber - , systemCode, "", "", "", "", forms) + , systemCode, "", "", "", "", "", forms) { } /// /// Initializes a @@ -117,6 +117,14 @@ public OptionObject(string optionId, string optionUserId, string optionStaffId /// The value is a representing the SessionToken. public override string SessionToken { get; set; } + [JsonIgnore] + [XmlIgnore] + /// + /// Gets or sets the HistoricUID object of the . This is not serialized in an + /// + /// The value is a representing the HistoricUID. + public override string HistoricUID { get; set; } + /// /// Clones the . @@ -164,6 +172,12 @@ public OptionObject(string optionId, string optionUserId, string optionStaffId /// public override OptionObject2015 ToOptionObject2015() => (OptionObject2015)OptionObjectHelpers.TransformToOptionObject2015((IOptionObject)this); + /// + /// Transforms the to an . + /// + /// + public override OptionObject2023 ToOptionObject2023() => (OptionObject2023)OptionObjectHelpers.TransformToOptionObject2023((IOptionObject)this); + /// /// Creates an with the minimal information required to return. /// diff --git a/dotnet/RarelySimple.AvatarScriptLink/Objects/OptionObject2.cs b/dotnet/RarelySimple.AvatarScriptLink/Objects/OptionObject2.cs index 7a461bfc..4a80546d 100644 --- a/dotnet/RarelySimple.AvatarScriptLink/Objects/OptionObject2.cs +++ b/dotnet/RarelySimple.AvatarScriptLink/Objects/OptionObject2.cs @@ -38,7 +38,7 @@ public OptionObject2(string optionId, string optionUserId, string optionStaffId , string systemCode, string namespaceName, string parentNamespace, string serverName) : base(optionId, optionUserId, optionStaffId , facility, entityId, episodeNumber , systemCode, namespaceName, parentNamespace, serverName - , "") + , "", "") { } /// @@ -61,7 +61,7 @@ public OptionObject2(string optionId, string optionUserId, string optionStaffId , List forms) : base(optionId, optionUserId, optionStaffId , facility, entityId, episodeNumber , systemCode, namespaceName, parentNamespace, serverName - , "", forms) + , "", "", forms) { } /// /// Initializes a @@ -104,6 +104,14 @@ public OptionObject2(string optionId, string optionUserId, string optionStaffId /// The value is a representing the SessionToken. public override string SessionToken { get; set; } + [JsonIgnore] + [XmlIgnore] + /// + /// Gets or sets the HistoricUID object of the . This is not serialized in an + /// + /// The value is a representing the HistoricUID. + public override string HistoricUID { get; set; } + /// /// Clones the . @@ -151,6 +159,12 @@ public OptionObject2(string optionId, string optionUserId, string optionStaffId /// public override OptionObject2015 ToOptionObject2015() => (OptionObject2015)OptionObjectHelpers.TransformToOptionObject2015(this); + /// + /// Transforms the to an . + /// + /// + public override OptionObject2023 ToOptionObject2023() => (OptionObject2023)OptionObjectHelpers.TransformToOptionObject2023(this); + /// /// Creates an with the minimal information required to return. /// diff --git a/dotnet/RarelySimple.AvatarScriptLink/Objects/OptionObject2015.cs b/dotnet/RarelySimple.AvatarScriptLink/Objects/OptionObject2015.cs index c3d237e2..a81e00b6 100644 --- a/dotnet/RarelySimple.AvatarScriptLink/Objects/OptionObject2015.cs +++ b/dotnet/RarelySimple.AvatarScriptLink/Objects/OptionObject2015.cs @@ -1,8 +1,10 @@ -using RarelySimple.AvatarScriptLink.Helpers; +using Newtonsoft.Json; +using RarelySimple.AvatarScriptLink.Helpers; using RarelySimple.AvatarScriptLink.Objects.Advanced; using System; using System.Collections.Generic; using System.Globalization; +using System.Xml.Serialization; namespace RarelySimple.AvatarScriptLink.Objects { @@ -37,7 +39,7 @@ public OptionObject2015(string optionId, string optionUserId, string optionStaff , string sessionToken) : base(optionId, optionUserId, optionStaffId , facility, entityId, episodeNumber , systemCode, namespaceName, parentNamespace, serverName - , sessionToken) + , sessionToken, "") { } /// @@ -62,7 +64,7 @@ public OptionObject2015(string optionId, string optionUserId, string optionStaff , List forms) : base(optionId, optionUserId, optionStaffId , facility, entityId, episodeNumber , systemCode, namespaceName, parentNamespace, serverName - , sessionToken, forms) + , sessionToken, "", forms) { } /// /// Initializes a @@ -96,6 +98,17 @@ public OptionObject2015(string optionId, string optionUserId, string optionStaff /// /// public static OptionObject2015Builder Builder() { return new OptionObject2015Builder(); } + + + [JsonIgnore] + [XmlIgnore] + /// + /// Gets or sets the HistoricUID object of the . This is not serialized in an + /// + /// The value is a representing the HistoricUID. + public override string HistoricUID { get; set; } + + /// /// Clones the . /// @@ -115,26 +128,26 @@ public OptionObject2015(string optionId, string optionUserId, string optionStaff /// Returns a with all of the contents of the formatted in HTML. /// /// of all of the contents of the formatted in HTML. - public new string ToHtmlString() => OptionObjectHelpers.TransformToHtmlString((IOptionObject2015)this); + public new string ToHtmlString() => OptionObjectHelpers.TransformToHtmlString(this); /// /// Returns a with all of the contents of the formatted in HTML. /// /// Determines whether to include the HTML headers in return. False allows for the embedding of the HTML in another HTML document. /// of all of the contents of the formatted in HTML. - public new string ToHtmlString(bool includeHtmlHeaders) => OptionObjectHelpers.TransformToHtmlString((IOptionObject2015)this, includeHtmlHeaders); + public new string ToHtmlString(bool includeHtmlHeaders) => OptionObjectHelpers.TransformToHtmlString(this, includeHtmlHeaders); /// /// Transforms the to an . /// /// - public override OptionObject ToOptionObject() => (OptionObject)OptionObjectHelpers.TransformToOptionObject((IOptionObject2015)this); + public override OptionObject ToOptionObject() => (OptionObject)OptionObjectHelpers.TransformToOptionObject(this); /// /// Transforms the to an . /// /// - public override OptionObject2 ToOptionObject2() => (OptionObject2)OptionObjectHelpers.TransformToOptionObject2((IOptionObject2015)this); + public override OptionObject2 ToOptionObject2() => (OptionObject2)OptionObjectHelpers.TransformToOptionObject2(this); /// /// Creates a clone of the . @@ -142,6 +155,12 @@ public OptionObject2015(string optionId, string optionUserId, string optionStaff /// public override OptionObject2015 ToOptionObject2015() => Clone(); + /// + /// Transforms the to an . + /// + /// + public override OptionObject2023 ToOptionObject2023() => (OptionObject2023)OptionObjectHelpers.TransformToOptionObject2023(this); + /// /// Creates an with the minimum information required to return. /// diff --git a/dotnet/RarelySimple.AvatarScriptLink/Objects/OptionObject2023.cs b/dotnet/RarelySimple.AvatarScriptLink/Objects/OptionObject2023.cs new file mode 100644 index 00000000..d16490ed --- /dev/null +++ b/dotnet/RarelySimple.AvatarScriptLink/Objects/OptionObject2023.cs @@ -0,0 +1,380 @@ +using RarelySimple.AvatarScriptLink.Helpers; +using RarelySimple.AvatarScriptLink.Objects.Advanced; +using System; +using System.Collections.Generic; +using System.Globalization; + +namespace RarelySimple.AvatarScriptLink.Objects +{ + /// + /// Represents an AvatarScriptLink OptionObject2023. + /// + public sealed class OptionObject2023 : OptionObjectBase + { + /// + /// Creates a new AvatarScriptLink . + /// + public OptionObject2023() : base() + { } + + /// + /// Creates a new AvatarScriptLink . + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public OptionObject2023(string optionId, string optionUserId, string optionStaffId + , string facility, string entityId, double episodeNumber + , string systemCode, string namespaceName, string parentNamespace, string serverName + , string sessionToken, string historicUID) : base(optionId, optionUserId, optionStaffId + , facility, entityId, episodeNumber + , systemCode, namespaceName, parentNamespace, serverName + , sessionToken, historicUID) + { } + + /// + /// Creates a new AvatarScriptLink . + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public OptionObject2023(string optionId, string optionUserId, string optionStaffId + , string facility, string entityId, double episodeNumber + , string systemCode, string namespaceName, string parentNamespace, string serverName + , string sessionToken, string historicUID + , List forms) : base(optionId, optionUserId, optionStaffId + , facility, entityId, episodeNumber + , systemCode, namespaceName, parentNamespace, serverName + , sessionToken, historicUID, forms) + { } + /// + /// Initializes a + /// + /// An + public static OptionObject2023 Initialize() { return new OptionObject2023(); } + /// + /// Initializes an to help construct an + /// + /// // Sample usage + /// OptionObject2023 optionObject = OptionObject2023.Builder() + /// .OptionId("123") + /// .OptionUserId("FLAST") + /// .OptionStaffId("4567") + /// .Facility("1") + /// .EntityId("23") + /// .EpisodeNumber(1) + /// .HistoricUID(111) + /// .SystemCode("SBOX") + /// .NamespaceName("XXX") + /// .ParentNamespace("YYY") + /// .ServerName("avatar.domain.local") + /// .SessionToken("asdfghjkl") + /// .Form("1") + /// .CurrentRow() + /// .Form("2") + /// .CurrentRow() + /// .MultipleIteration() + /// .OtherRow() + /// .Build(); + /// + /// + /// + public static OptionObject2023Builder Builder() { return new OptionObject2023Builder(); } + /// + /// Clones the . + /// + /// + public new OptionObject2023 Clone() + { + var optionObject = (OptionObject2023)MemberwiseClone(); + optionObject.Forms = new List(); + foreach (var form in Forms) + { + optionObject.Forms.Add(form.Clone()); + } + return optionObject; + } + + /// + /// Returns a with all of the contents of the formatted in HTML. + /// + /// of all of the contents of the formatted in HTML. + public new string ToHtmlString() => OptionObjectHelpers.TransformToHtmlString(this); + + /// + /// Returns a with all of the contents of the formatted in HTML. + /// + /// Determines whether to include the HTML headers in return. False allows for the embedding of the HTML in another HTML document. + /// of all of the contents of the formatted in HTML. + public new string ToHtmlString(bool includeHtmlHeaders) => OptionObjectHelpers.TransformToHtmlString(this, includeHtmlHeaders); + + /// + /// Transforms the to an . + /// + /// + public override OptionObject ToOptionObject() => (OptionObject)OptionObjectHelpers.TransformToOptionObject(this); + + /// + /// Transforms the to an . + /// + /// + public override OptionObject2 ToOptionObject2() => (OptionObject2)OptionObjectHelpers.TransformToOptionObject2(this); + + /// + /// Transforms the to an . + /// + /// + public override OptionObject2015 ToOptionObject2015() => (OptionObject2015)OptionObjectHelpers.TransformToOptionObject2015(this); + + /// + /// Creates a clone of the . + /// + /// + public override OptionObject2023 ToOptionObject2023() => Clone(); + + /// + /// Creates an with the minimum information required to return. + /// + /// + public new OptionObject2023 ToReturnOptionObject() => (OptionObject2023)OptionObjectHelpers.GetReturnOptionObject(this); + + /// + /// Creates an with the minimum information required to return plus the provided Error Code and Message. + /// + /// + /// + /// + public new OptionObject2023 ToReturnOptionObject(double errorCode, string errorMessage) => (OptionObject2023)OptionObjectHelpers.GetReturnOptionObject(this, errorCode, errorMessage); + + /// + /// Returns a with all of the contents of the formatted as XML. + /// + /// of all of the contents of the formatted as XML. + public override string ToXml() => OptionObjectHelpers.TransformToXml(this); + + public class OptionObject2023Builder + { + protected readonly OptionObject2023 optionObject; + /// + /// Constructs a OptionObject2023Builder + /// + public OptionObject2023Builder() + { + optionObject = new OptionObject2023(); + } + /// + /// Sets the OptionId of the . + /// + /// + /// An + /// + public OptionObject2023BuilderFinal OptionId(string optionId) + { + if (string.IsNullOrEmpty(optionId)) + throw new ArgumentNullException(nameof(optionId), ScriptLinkHelpers.GetLocalizedString("parameterCannotBeNull", CultureInfo.CurrentCulture)); + optionObject.OptionId = optionId; + return new OptionObject2023BuilderFinal(optionObject); + } + } + public class OptionObject2023BuilderFinal + { + protected readonly OptionObject2023 optionObject; + /// + /// Constructs a OptionObject2023Builder + /// + public OptionObject2023BuilderFinal(OptionObject2023 optionObject) + { + this.optionObject = optionObject ?? throw new ArgumentNullException(nameof(optionObject), ScriptLinkHelpers.GetLocalizedString("parameterCannotBeNull", CultureInfo.CurrentCulture)); + } + /// + /// Sets the EntityId of the . + /// + /// + /// An + /// + public OptionObject2023BuilderFinal EntityId(string entityId) + { + if (string.IsNullOrEmpty(entityId)) + throw new ArgumentNullException(nameof(entityId), ScriptLinkHelpers.GetLocalizedString("parameterCannotBeNull", CultureInfo.CurrentCulture)); + optionObject.EntityID = entityId; + return this; + } + /// + /// Sets the EpisodeNumber of the . + /// + /// + /// An + /// + public OptionObject2023BuilderFinal EpisodeNumber(double episodeNumber) + { + optionObject.EpisodeNumber = episodeNumber; + return this; + } + /// + /// Sets the Facility of the . + /// + /// + /// An + /// + public OptionObject2023BuilderFinal Facility(string facility) + { + if (string.IsNullOrEmpty(facility)) + throw new ArgumentNullException(nameof(facility), ScriptLinkHelpers.GetLocalizedString("parameterCannotBeNull", CultureInfo.CurrentCulture)); + optionObject.Facility = facility; + return this; + } + /// + /// Sets the HistoricUID of the . + /// + /// + /// An + /// + public OptionObject2023BuilderFinal HistoricUID(string historicUID) + { + if (string.IsNullOrEmpty(historicUID)) + throw new ArgumentNullException(nameof(historicUID), ScriptLinkHelpers.GetLocalizedString("parameterCannotBeNull", CultureInfo.CurrentCulture)); + optionObject.HistoricUID = historicUID; + return this; + } + /// + /// Sets the NamespaceName of the . + /// + /// + /// An + /// + public OptionObject2023BuilderFinal NamespaceName(string namespaceName) + { + if (string.IsNullOrEmpty(namespaceName)) + throw new ArgumentNullException(nameof(namespaceName), ScriptLinkHelpers.GetLocalizedString("parameterCannotBeNull", CultureInfo.CurrentCulture)); + optionObject.NamespaceName = namespaceName; + return this; + } + /// + /// Sets the OptionStaffId of the . + /// + /// + /// An + /// + public OptionObject2023BuilderFinal OptionStaffId(string optionStaffId) + { + if (string.IsNullOrEmpty(optionStaffId)) + throw new ArgumentNullException(nameof(optionStaffId), ScriptLinkHelpers.GetLocalizedString("parameterCannotBeNull", CultureInfo.CurrentCulture)); + optionObject.OptionStaffId = optionStaffId; + return this; + } + /// + /// Sets the OptionUserId of the . + /// + /// + /// An + /// + public OptionObject2023BuilderFinal OptionUserId(string optionUserId) + { + if (string.IsNullOrEmpty(optionUserId)) + throw new ArgumentNullException(nameof(optionUserId), ScriptLinkHelpers.GetLocalizedString("parameterCannotBeNull", CultureInfo.CurrentCulture)); + optionObject.OptionUserId = optionUserId; + return this; + } + /// + /// Sets the ParentNamespace of the . + /// + /// + /// An + /// + public OptionObject2023BuilderFinal ParentNamespace(string parentNamespace) + { + if (string.IsNullOrEmpty(parentNamespace)) + throw new ArgumentNullException(nameof(parentNamespace), ScriptLinkHelpers.GetLocalizedString("parameterCannotBeNull", CultureInfo.CurrentCulture)); + optionObject.ParentNamespace = parentNamespace; + return this; + } + /// + /// Sets the ServerName of the . + /// + /// + /// An + /// + public OptionObject2023BuilderFinal ServerName(string serverName) + { + if (string.IsNullOrEmpty(serverName)) + throw new ArgumentNullException(nameof(serverName), ScriptLinkHelpers.GetLocalizedString("parameterCannotBeNull", CultureInfo.CurrentCulture)); + optionObject.ServerName = serverName; + return this; + } + /// + /// Sets the SessionToken of the . + /// + /// + /// An + /// + public OptionObject2023BuilderFinal SessionToken(string sessionToken) + { + if (string.IsNullOrEmpty(sessionToken)) + throw new ArgumentNullException(nameof(sessionToken), ScriptLinkHelpers.GetLocalizedString("parameterCannotBeNull", CultureInfo.CurrentCulture)); + optionObject.SessionToken = sessionToken; + return this; + } + /// + /// Sets the SystemCode of the . + /// + /// + /// An + /// + public OptionObject2023BuilderFinal SystemCode(string systemCode) + { + if (string.IsNullOrEmpty(systemCode)) + throw new ArgumentNullException(nameof(systemCode), ScriptLinkHelpers.GetLocalizedString("parameterCannotBeNull", CultureInfo.CurrentCulture)); + optionObject.SystemCode = systemCode; + return this; + } + /// + /// Initializes a builder to construct a FormObject within the OptionObject2023 builder. + /// + /// A to start build. + public FormObject.OptionObject2023FormObjectBuilder Form() + { + return new FormObject.OptionObject2023FormObjectBuilder(optionObject); + } + /// + /// Adds a of the . + /// + /// + /// An + /// + public OptionObject2023BuilderFinal Form(FormObject formObject) + { + if (optionObject.Forms == null) + { + optionObject.Forms = new List(); + } + optionObject.Forms.Add(formObject); + return this; + } + /// + /// Builds the based on the supplied build parameters. + /// + /// A + public OptionObject2023 Build() + { + return optionObject; + } + } + } +}