@sassoftware/vi-api
Version:
Types used in the SAS Visual Investigator API
692 lines (691 loc) • 25 kB
TypeScript
import { SearchRepresentation } from "../svi-sand";
import { Comment, DocumentAndLink, Relationship, RelationshipDTO, StoredObjectFieldDTO } from "../svi-datahub";
import { FileOperation } from "../file/file-api";
import { PageModel, PageModelData } from "../page-model/page-model-api";
import { ClientSheet, Sheet } from "../sheet/sheet-api";
import { PageViewerApi } from "../component/bindings";
import { PageDataChange, PageModeChange } from "../control";
export interface ISearchQuery {
text?: string;
additionalModes?: string[];
assistedSearchEnabled?: boolean;
assistedSearchPrompt?: string;
generatedTextQuery?: SearchRepresentation;
}
export type UnknownRecord = Record<string, unknown>;
export type PageModelOrData = PageModel | PageModelData | null;
export type SearchAndCreateNewPageModel = {
model?: PageModelOrData;
};
export interface ObjectIdentifier {
id: string;
type: string;
}
export interface ObjectAccessRules {
canReadObject: Promise<boolean>;
canUpdateObject: Promise<boolean>;
canDeleteObject: Promise<boolean>;
}
export interface FormatObjectFieldsOptions {
skipFormatReferenceData?: boolean;
skipFormatUserGroups?: boolean;
skipFormatBooleans?: boolean;
/**
* A function that will be the last thing called in order to format the object's field values.
* @param fieldValue the current value of the field being formatted.
* @param fieldName the name of the field currently being formatted.
* @param objectFields all of the available fields in the object.
* @param fieldMetadata the current field's metadata.
*/
formatCallback?: (fieldValue: string | number | Date | PageData[], fieldName: string, objectFields: FieldValues, fieldMetadata: StoredObjectFieldDTO) => void;
}
export interface UpdateObjectOptions {
fileOperations?: FileOperation[];
isExternalObject?: boolean;
sheets?: ClientSheet[];
}
export interface CreateObjectOptions {
comments?: Comment[];
fileOperations?: FileOperation[];
sheets?: ClientSheet[];
}
/**
* This API provides the functionality related to objects within SAS Visual Investigator.
*
* Accessed from the window at `window.sas.vi.object`.
*
* @example window.sas.vi.object.getObjectAccessRules(objectType, objectId);
* @category API
*/
export interface ObjectApi {
/**
* @method
* @description Gets the object access rules for an object:
* The three methods that return booleans based on specified object are:
*
* canReadObject,
* canUpdateObject,
* and canDeleteObject.
*
* @param objectType {string} Object type.
* @param objectId {string} Object ID.
* @return Object with three boolean methods which provide boolean data on a specified object.
*/
getObjectAccessRules(objectType: string, objectId: string): ObjectAccessRules;
/**
* @method
* @description Gets the specified object.
* @param objectType {string} Object type.
* @param objectId {string} Object ID.
* @param [includeDisplayLabel = true] {boolean} Checks whether or not to return the object with a display label.
* @param [includeChildObjects = false] {boolean} Checks whether or not to return the child objects associated with this object.
* @return The specified object.
*/
getObject(objectType: string, objectId: string, includeDisplayLabel?: boolean, includeChildObjects?: boolean): Promise<VIObject>;
/**
* @method
* @description Gets the child objects of an object.
* @param objectType {string} Object type.
* @param objectId {string} Gets the child objects relating to the object ID.
* @param childObjectType {string} Child object type.
* @param [limit = 25] {number} Maximum number of child objects to be returned.
* @return A Promise that resolves to an array of objects, that are child objects of the specified object.
*/
getChildObjects(objectType: string, objectId: string, childObjectType: string, limit?: number): Promise<VIObject[]>;
/**
* @method
* @description Updates an existing object with the provided data.
* @param objectType {string} Object type.
* @param objectId {string} Object ID.
* @param objectTypeId {number} Object type ID.
* @param objectTypeVersion {number} Object type version.
* @param fieldValues {FieldValues} Field values of the object.
* @param [options] {UpdateObjectOptions} Optional extra parameters.
* @return A Promise that resolves to the updated object when the object been successfully updated.
*/
updateObject(objectType: string, objectId: string, objectTypeId: number, objectTypeVersion: number, fieldValues: FieldValues, options?: UpdateObjectOptions): Promise<VIObject>;
/**
* @method
* @description Updates an existing object with the provided data.
* @param objectType {string} Object type.
* @param objectId {string} Object ID.
* @param objectTypeId {number} Object type ID.
* @param objectTypeVersion {number} Object type version.
* @param originalFieldValues {FieldValues} Field values before the object was edited
* @param newFieldValues {FieldValues} Field values after the object was edited
* @param objectVersion {number} Object Version
* @param [options] {UpdateObjectOptions} Optional extra parameters.
* @return A Promise that resolves to the updated object when the object has been successfully updated.
*/
patchObject(objectType: string, objectId: string, objectTypeId: number, objectTypeVersion: number, originalFieldValues: FieldValues, newFieldValues: FieldValues, objectVersion: number, options?: UpdateObjectOptions): Promise<VIObject>;
/**
* @method
* @description Deletes an object.
* @param objectType {string} Object type.
* @param objectId {string} Object ID.
* @return A Promise that resolves to void when the specified object is successfully deleted.
*/
deleteObject(objectType: string, objectId: string): Promise<void>;
/**
* @method
* @description Creates an object.
* @param objectType {string} Object type.
* @param objectTypeId {number} Object type ID.
* @param fieldValues {FieldValues} Field values of the object.
* @param [options] {CreateObjectOptions} Optional extra parameters.
* @return A Promise that resolves to the created object when the object has successfully been created.
*/
createObject(objectType: string, objectTypeId: number, fieldValues: FieldValues, options?: CreateObjectOptions): Promise<VIObject>;
/**
* @method
* @description Gets relationship via the relationship ID.
* @param relationshipId {string} Relationship ID.
* @return A Promise that resolves to a relationship.
*/
getObjectRelationship(relationshipId: string): Promise<ObjectRelationship>;
/**
* @method
* @description Updates an existing relationship in SAS Visual Investigator.
* @param relationshipId {string} Relationship ID.
* @param payload {unknown} HTTP request content.
* @return A Promise that resolves to a relationship.
*/
updateObjectRelationship(relationshipId: string, payload: unknown): Promise<ObjectRelationship>;
/**
* @method
* @description Updates an existing relationship in SAS Visual Investigator.
* @param relationshipId {string} Relationship ID.
* @param originalFieldValues {FieldValues} Field values before the relationship was edited
* @param newFieldValues {FieldValues} Field values after the relationship was edited
* @return A Promise that resolves to a relationship.
*/
patchObjectRelationship(relationshipId: string, originalFieldValues: FieldValues, newFieldValues: FieldValues): Promise<ObjectRelationship>;
/**
* @method
* @description Deletes relationship with the specified ID.
* @param relationshipId {string} Relationship ID.
* @return A Promise that resolves to void when the object is successfully deleted.
*/
deleteObjectRelationship(relationshipId: string): Promise<void>;
/**
* @method
* @description Creates a relationship between two objects.
* @param from {LinkObject} Object that relationship is from.
* @param to {LinkObject} Object that relationship is to.
* @param relationship {ObjectRelationship} The relationship.
* @return A Promise that resolves to an object.
*/
relateObject(from: LinkObject, to: LinkObject, relationship: ObjectRelationship): Promise<ObjectRelationship>;
/**
* @method
* @description Gets object summary label.
* @param objectType {string} Object type.
* @param objectId {string} Object ID.
* @return Summary label as a String.
*/
getObjectSummaryLabel(objectType: string, objectId: string): Promise<string>;
/**
* @method
* @description Creates a new object and relates it with an existing one.
* @param from {LinkObject} Existing Object that the relationship is from.
* @param to {NewLinkObject} New Object to be created and related to.
* @param relationship {ObjectRelationship} The relationship.
* @param [includeCreatedObject = false] {boolean} If true, returns both the documentLink and created document details.
* @return A Promise that resolves to the documentLink, or full response containing both documentLink and document.
*/
createAndRelateObject(from: LinkObject, to: NewLinkObject, relationship: ObjectRelationship, includeCreatedObject?: false): Promise<ObjectRelationship>;
createAndRelateObject(from: LinkObject, to: NewLinkObject, relationship: ObjectRelationship, includeCreatedObject: true): Promise<DocumentAndLink>;
createAndRelateObject(from: LinkObject, to: NewLinkObject, relationship: ObjectRelationship, includeCreatedObject?: boolean): Promise<ObjectRelationship | DocumentAndLink>;
/**
* @method
* @description Processes an array of objects and formats them for display.
* @param objects {VIObject[]} Array of objects.
* @param objectType {string} Type of the objects in the array.
* @param [options] {FormatObjectFieldsOptions} Optional parameters to control the formatting. By default, nothing is skipped and there is no formatCallback.
* @return A Promise that resolves to the formatted array of objects.
*/
formatObjectFieldsForDisplay(objects: VIObject[], objectType: string, options?: FormatObjectFieldsOptions): Promise<VIObject[]>;
/**
* @method
* @description Uploads an attachment.
* @param attachmentModel {AttachmentModel} Attachment model.
* @param objectType {string} Object type.
* @param objectId {string} Object ID.
* @return A Promise that resolves to a HttpResponse with a FileAssociationResponse as the data.
*/
uploadAttachment(attachmentModel: AttachmentModel, objectType: string, objectId: string): Promise<FileAssociationResponse>;
/**
* @method
* @description Deletes the specified attachment of the associated object.
* @param objectType {string} Object type.
* @param objectId {string} Object ID.
* @param attachmentId {string} Attachment ID.
* @return A Promise that resolves to an empty HttpResponse when the attachment is successfully deleted.
*/
deleteAttachment(objectType: string, objectId: string, attachmentId: string): Promise<void>;
/**
* @method
* @description Gets an attachment of the associated object.
* @param objectId {string} Object ID.
* @param objectType {string} Object type.
* @param attachmentId {string} Attachment ID.
* @return A Promise that resolves to a HttpResponse with a FileAssociationResponse as the data.
*/
getAttachment(objectType: string, objectId: string, attachmentId: string): Promise<FileAssociationResponse>;
/**
* @method
* @description Validates the fields, controls, and file categories of a child object.
* @param {PageModel} model Page model.
* @param {StoredObjectMetadata} childObject Child object metadata.
* @return An observable that resolves to an array of validation results.
*/
validate(model: PageModel, childObject: StoredObjectMetadata): Promise<ValidationResult[]>;
/**
* @method
* @description Launches a wizard allowing users to create an object/relationship.
* The relationship wizard is determined by the relateToParentLabel or relateToParentName defined in the wizardValues parameter.
* @param wizardValues {CreateDialogModel} Object containing entity and relationship data.
* @returns A Promise that resolves when the dialog box is closed.
*/
openCreateAndLinkDialog(wizardValues: CreateDialogModel): Promise<CreateDialogModel>;
}
export interface PageData {
fieldValues: FieldValues;
id: string;
displayLabel?: string;
}
export interface FieldValues {
[property: string]: string | number | Date | PageData[];
}
export interface ObjectSheetSettings {
id: string;
type: string;
title: string;
allowWorksheets: boolean;
allowWorksheetCreation: boolean;
allowNotesheets: boolean;
allowNotesheetCreation: boolean;
}
export interface VIObject {
fieldValues: FieldValues;
comments?: Comment[];
fileOperations?: FileOperation[];
createdAt: string;
displayLabel?: string;
lastUpdatedAt: string;
objectTypeId: number;
objectTypeName: string;
sheets?: Sheet[];
id: string;
title?: string;
}
export type LinkObject = Pick<VIObject, "id" | "objectTypeName">;
export type NewLinkObject = Pick<VIObject, "objectTypeName" | "fieldValues" | "fileOperations">;
export interface ValidationResult {
isValid: boolean;
message?: string;
}
export interface PageAction {
attrs: {
actionId: number;
actionName: string;
attributes: {
[property: string]: unknown;
displayName: string;
disabled: boolean;
};
controlId?: number;
displayName: string;
};
}
export interface PageActions {
items?: PageAction[];
}
export interface ControlContainer {
childNodes?: ChildNode[];
}
export interface PageTemplateScreen extends ControlContainer {
id: string;
name: string;
locked?: boolean;
}
export interface PageTemplate {
errors?: boolean;
errorDetails?: Error;
showTabs: boolean;
id?: number;
screens: PageTemplateScreen[];
}
export interface FieldRestriction {
maxLength?: number;
required?: boolean;
fieldDataType?: string;
allowMultipleFiles?: boolean;
constrainingListName?: string;
cascadingReferenceDataFilterByCode?: string;
cascadingReferenceDataFilterByField?: string;
}
export interface FieldRestrictions {
[property: string]: FieldRestriction;
}
export interface ObjectFieldRestrictions {
[property: string]: FieldRestrictions;
}
export interface TypeAttributes {
[property: string]: unknown;
}
export interface NodeStates {
readOnly?: boolean;
required?: boolean;
hidden?: boolean;
}
interface GlobalNodeStates extends NodeStates {
conditions?: unknown[];
}
export interface NodeAttributes extends TypeAttributes {
global?: {
state?: GlobalNodeStates;
groupRestrictions?: Array<{
id: string;
name: string;
}>;
};
}
export declare enum ActionState {
Disabled = "disabled",
Hidden = "hidden"
}
export interface ChildNodeAttrs {
attributes?: {
disabled: boolean;
state?: ActionState;
};
id: string;
category: string;
type: string;
states?: NodeStates;
}
export interface ChildNode extends ControlContainer {
id: string;
_fullScreen?: boolean;
attributes?: NodeAttributes;
typeAttributes: TypeAttributes;
inheritedAttributes?: TypeAttributes;
attrs: ChildNodeAttrs;
}
export declare enum ConditionReferenceType {
TemplateControl = "TEMPLATE_CONTROL",
Condition = "CONDITION",
RequiredField = "REQUIRED_FIELD",
ReadOnlyField = "READ_ONLY_FIELD",
NldStyling = "NLD_STYLING"
}
export interface ConditionReference {
association: string;
type: ConditionReferenceType;
}
export declare enum ConditionFactType {
Field = "FIELD",
Condition = "CONDITION_REFERENCE"
}
export interface ConditionFact {
factType: ConditionFactType;
factPlaceholder: string;
factValue: string;
}
export interface Condition {
type: string;
parameters: Array<string | number | boolean | Condition>;
isComplete?: boolean;
}
export interface StoredObjectField {
id: number;
label: string;
name: string;
columnName: string;
dataType: string;
length?: number;
required: boolean;
primaryKeyField: boolean;
unique: boolean;
autoGenerated: boolean;
systemReserved: boolean;
displayIndex: number;
version: number;
primaryKeySeqNo?: number;
readOnly: boolean;
indexedForSearch: boolean;
showTimeZone: boolean;
ownerName: string;
constrainingListName?: string;
cascadingReferenceDataFilterByCode?: string;
cascadingReferenceDataFilterByField?: string;
}
export interface FieldOperand {
type: string;
fieldName: string;
objectName: string;
}
export interface BooleanExpression {
type: string;
leftOperand?: unknown;
operator: string;
rightOperand: unknown;
}
export interface ConditionalExpression extends BooleanExpression {
type: string;
leftOperand: unknown;
operator: string;
rightOperands: unknown[];
}
export interface ObjectIcon {
id: number;
name: string;
imageType: string;
imageLocation: string;
version: number;
}
export interface StoredObjectFileCategory {
name: string;
displayName: string;
allowMultiple?: boolean;
required?: boolean;
documentLockRequired?: boolean;
}
export interface StoredObjectMetadata {
id: number;
label: string;
description: string;
name: string;
tableName: string;
historyEnabled: boolean;
version: number;
lastUpdatedAtTimeFieldName: string;
createdAtTimeFieldName: string;
displayTextFields?: DisplayTextFields[];
dataStoreAssignedTimeZone: string;
type: string;
markerColor: string;
nodeShape: string;
nodeColor: string;
borderColor: string;
borderWidth: number;
indexedForSearch: boolean;
attachmentsIndexedForSearch: boolean;
fields?: StoredObjectField[];
relationshipsFrom?: Relationship[];
defaultRegularIcon: ObjectIcon;
requireSearchBeforeCreate: boolean;
fileCategories?: StoredObjectFileCategory[];
}
export interface ObjectRelationship {
relationshipTypeName?: string;
relationshipTypeLabel?: string;
id?: string;
createdAt?: Date;
lastUpdatedAt?: Date;
validFrom?: Date;
validTo?: Date;
displayLabel?: string;
fromObjectTypeName?: string;
fromObjectTypeVersion?: number;
fromObjectId?: string;
fromObjectDisplayLabel?: string;
toObjectTypeName?: string;
toObjectTypeVersion?: number;
toObjectId?: string;
toObjectDisplayLabel?: string;
fieldValues?: UnknownRecord;
qualifiedTypeName?: string;
}
export interface ObjectRelationshipMultiple extends ObjectRelationship {
fromId?: string;
fromEntityType?: string;
toId?: string;
toEntityType?: string;
operation?: string;
}
export interface AttachmentRow {
description?: string;
location: string;
id: string;
uploadedBy?: string;
name: string;
size: number;
type: string;
}
export interface AttachmentModel {
id: string;
name: string;
type?: string;
description?: string;
location: string;
uploadedBy?: string;
size?: number;
selectedFile: AttachmentRow;
}
export interface RestRepresentationsLink {
method?: string;
rel?: string;
href?: string;
uri?: string;
type?: string;
responseType?: string;
itemType?: string;
responseItemType?: string;
title?: string;
}
export interface FileAssociationResponse {
version?: number;
id?: string;
name?: string;
category?: string;
location?: string;
type?: string;
size?: number;
description?: string;
properties?: UnknownRecord;
uploadedAt?: Date;
uploadedBy?: string;
extractedContent?: string;
displayOrder?: number;
links?: RestRepresentationsLink[];
}
export interface DisplayTextFields {
name: string;
displayIndex: number;
}
export declare enum SearchAndCreateStep {
Search = "search",
SearchResults = "searchResults",
Entity = "entity",
Relationship = "relationship"
}
export interface SearchAndCreatePanelContext {
[SearchAndCreateStep.Search]: {
doSearch: (query: string, additionalModes?: string[]) => void;
updateAssistedSearchEnabled: (assistedSearchEnabled: boolean) => void;
getQuery: () => ISearchQuery;
updateQuery: (query: string) => void;
};
[SearchAndCreateStep.SearchResults]: {
getQuery: () => ISearchQuery;
updateQuery: (query: string) => void;
updateSelection: (results: Array<{
id: string;
type: string;
}>) => void;
};
[SearchAndCreateStep.Entity]: {
setPageViewerApi(api: PageViewerApi): void;
onPageChange(change?: PageDataChange | PageModeChange): void;
newPageModel: SearchAndCreateNewPageModel;
selectedItems: Array<{
id?: string;
type?: string;
title?: string;
}> | null | undefined;
};
[SearchAndCreateStep.Relationship]: {
updateLinkReason: (linkReason: Relationship) => void;
onPageChange(change?: PageDataChange | PageModeChange): void;
setPageViewerApi(api: PageViewerApi): void;
newPageModel: SearchAndCreateNewPageModel;
selectedItems: Array<{
id?: string;
type?: string;
title?: string;
}> | null | undefined;
};
}
export interface SearchAndCreateFooterContext {
query?: ISearchQuery;
selectedItems?: Array<{
id?: string;
type?: string;
title?: string;
}> | null;
linkReason?: Relationship;
newPageModel?: SearchAndCreateNewPageModel;
relationshipValues?: UnknownRecord;
relationshipInfoStepNeeded?: boolean;
doSearch: (queryText?: string) => void;
updateAssistedSearchEnabled?: (assistedSearchEnabled: boolean) => void;
commit: () => void;
relateToSelected: () => void;
relateToNew: () => void;
close: (result?: unknown) => void;
}
interface BaseButton {
label: string;
primary?: boolean;
disabled?: boolean;
}
export type SearchAndCreateDialogButton = (BaseButton & {
onClick: () => void | Promise<void>;
}) | (BaseButton & {
items: Array<{
text: string;
click: () => void;
}>;
});
export interface CustomSearchAndCreateStep<Step extends SearchAndCreateStep> {
panel?: {
render: (container: HTMLDivElement, context: SearchAndCreatePanelContext[Step]) => void | (() => void);
};
footer?: {
getButtons: (context: SearchAndCreateFooterContext) => SearchAndCreateDialogButton[];
};
}
export type CustomSearchAndCreateSteps = {
[Step in SearchAndCreateStep]?: CustomSearchAndCreateStep<Step>;
};
export interface SearchOrCreateAndLinkDialogBase<T> {
entityName: string;
entityLabel: string;
entityNames?: string[];
entityLabels?: string[];
onClose?: (result?: T) => Promise<boolean>;
/**
* Values returned on the close of the dialog box. May be undefined when dialog box is cancelled.
*/
result?: T;
multipleSearchChoice?: boolean;
showPageViewer?: boolean;
customSteps?: CustomSearchAndCreateSteps;
customResult?: unknown;
}
export interface CreateRelationshipDialogModel<T> extends SearchOrCreateAndLinkDialogBase<T> {
relateToParentName: string;
relateToParentLabel: string;
linkReasons?: Relationship[];
}
export type CreateDialogModel = CreateRelationshipDialogModel<CreateDialogResponse>;
export interface CreateDialogResponse {
relateToModel?: CreateRelateToModel;
}
export interface CreateRelationshipDialogResultModel {
linkReason?: Relationship;
}
export interface CreateRelateToModel extends CreateRelationshipDialogResultModel {
newPageModel?: {
model: PageModel;
};
}
export interface IRelationshipWithLabel extends RelationshipDTO {
relationshipLabel: string;
}
export type APISelectedItem = ObjectIdentifier & {
title?: string;
uniqueKey?: string;
typeLabel?: string;
};
export interface RelationshipInformation {
relationshipTypeId?: number;
relationshipValues?: UnknownRecord;
selectedItemTitle?: string;
requiredFieldsStatus?: unknown;
entityIconClass?: string;
entityType?: string;
}
export {};