diff --git a/src/ComponentFramework-Mock-Generator/Metadata.db/SQLQueries/Metadata.Attribute.ts b/src/ComponentFramework-Mock-Generator/Metadata.db/SQLQueries/Metadata.Attribute.ts index 11e080c..51c6f32 100644 --- a/src/ComponentFramework-Mock-Generator/Metadata.db/SQLQueries/Metadata.Attribute.ts +++ b/src/ComponentFramework-Mock-Generator/Metadata.db/SQLQueries/Metadata.Attribute.ts @@ -3,7 +3,7 @@ Licensed under the MIT license. */ -import type { ShkoOnline } from '@shko.online/componentframework-mock/ShkoOnline'; +import type { ShkoOnline } from '../../../ShkoOnline'; import alasql from 'alasql'; export const CREATE_TABLE_METADATA_ATTRIBUTE = ` diff --git a/src/ComponentFramework-Mock-Generator/mockRefreshDatasets.ts b/src/ComponentFramework-Mock-Generator/mockRefreshDatasets.ts index bdc999c..d0d105e 100644 --- a/src/ComponentFramework-Mock-Generator/mockRefreshDatasets.ts +++ b/src/ComponentFramework-Mock-Generator/mockRefreshDatasets.ts @@ -3,8 +3,6 @@ Licensed under the MIT license. */ -/// - import type { PropertyToMock } from '../ComponentFramework-Mock'; import type { MockGenerator } from './MockGenerator'; import type { ShkoOnline } from '../ShkoOnline'; diff --git a/src/ComponentFramework-Mock-Generator/mockRefreshParameters.ts b/src/ComponentFramework-Mock-Generator/mockRefreshParameters.ts index 7d58dac..285a95b 100644 --- a/src/ComponentFramework-Mock-Generator/mockRefreshParameters.ts +++ b/src/ComponentFramework-Mock-Generator/mockRefreshParameters.ts @@ -3,8 +3,6 @@ Licensed under the MIT license. */ -/// - import type { MockGenerator } from './MockGenerator'; import type { ShkoOnline } from '../ShkoOnline'; import { stub } from 'sinon'; diff --git a/src/ComponentFramework-Mock/Context.mock.ts b/src/ComponentFramework-Mock/Context.mock.ts index ccc4632..9dd2163 100644 --- a/src/ComponentFramework-Mock/Context.mock.ts +++ b/src/ComponentFramework-Mock/Context.mock.ts @@ -89,3 +89,9 @@ export class ContextMock> this.webAPI = new WebApiMock(db, this.formatting); } } + +declare global { + interface ObjectConstructor { + getOwnPropertyNames(o: T): (keyof T)[]; + } +} \ No newline at end of file diff --git a/src/ComponentFramework-Mock/PropertyTypes/DataSet.mock.ts b/src/ComponentFramework-Mock/PropertyTypes/DataSet.mock.ts index 6424113..1cbeb32 100644 --- a/src/ComponentFramework-Mock/PropertyTypes/DataSet.mock.ts +++ b/src/ComponentFramework-Mock/PropertyTypes/DataSet.mock.ts @@ -252,3 +252,115 @@ export class DataSetMock implements ComponentFramework.PropertyTypes.DataSet { }); } } + +declare global{ + namespace ComponentFramework { + namespace PropertyTypes { + /** + * The structure of a dataset property as it would be passed to a control + */ + interface DataSet { + /** + * Delete the records from data source. + * @param ids Array of IDs to be deleted. + * @todo Overloaded by Shko Online + */ + delete: (ids: string[]) => Promise; + + /** + * The capabilities for the dataset. + * @todo Overloaded by Shko Online + */ + getDataSetCapabilities: () => DataProviderCapabilities; + + /** + * Initialize a local record object for control to set the value. The control needs to invoke the {@link ComponentFramework.PropertyHelper.DataSetApi.EntityRecord.save save()} method on the newly created record to persist the change. + * @todo Overloaded by Shko Online + */ + newRecord: () => ComponentFramework.PropertyHelper.DataSetApi.EntityRecord; + } + + /** + * Provides access to all the properties of a file. + * @todo Overloaded by Shko Online + */ + interface DataProviderCapabilities { + /** + * Whether adding new records is supported or not. + */ + canCreateNewRecords: boolean; + /** + * If the dataset records can be paged. + */ + canPaginate: boolean; + /** + * Whether image info for record columns can be retrieved. + */ + hasCellImageInfo: boolean; + /** + * Whether the dataset supports record navigation for lookup and primary fields. + */ + hasRecordNavigation: boolean; + /** + * If the data provider has edit capabilities. + */ + isEditable: boolean; + /** + * If the dataset can be filtered. + */ + isFilterable: boolean; + /** + * If the dataset can be sorted. + */ + isSortable: boolean; + } + } + namespace PropertyHelper { + namespace DataSetApi { + /** + * Base interface for dataset record result. Supports value retrival by column name. + */ + interface EntityRecord { + /** + * Whether this record is dirty. Only applicable if the dataset is editable and this record has dirty values. + * @todo Overloaded by Shko Online + */ + isDirty(): boolean; + + /** + * Whether this record is valid. Only applicable if the dataset is editable and this record has invalid values. + * @todo Overloaded by Shko Online + */ + isValid(): boolean; + + /** + * Saves the record + * @throws You can get an error saying `Invalid snapshot with id undefined` when the incorrect column name parameter was used with {@link ComponentFramework.PropertyHelper.DataSetApi.EntityRecord.setValue setValue}. Make sure to use the logical name of the column. + * @todo Overloaded by Shko Online + */ + save(): Promise; + + /** + * Set value for the column. + * @param columnName The logical name of the column. + * @param value New value for the record. + * @todo Overloaded by Shko Online + */ + setValue( + columnName: string, + value: + | string + | Date + | number + | number[] + | boolean + | ComponentFramework.EntityReference + | ComponentFramework.EntityReference[] + | ComponentFramework.LookupValue + | ComponentFramework.LookupValue[], + ): Promise; + } + } + } + } +} diff --git a/src/global.d.ts b/src/global.d.ts deleted file mode 100644 index f844af3..0000000 --- a/src/global.d.ts +++ /dev/null @@ -1,120 +0,0 @@ -/* - Copyright (c) 2022 Betim Beja and Shko Online LLC - Licensed under the MIT license. -*/ - -/// - -declare namespace ComponentFramework { - namespace PropertyTypes { - /** - * The structure of a dataset property as it would be passed to a control - */ - interface DataSet { - /** - * Delete the records from data source. - * @param ids Array of IDs to be deleted. - * @todo Overloaded by Shko Online - */ - delete: (ids: string[]) => Promise; - - /** - * The capabilities for the dataset. - * @todo Overloaded by Shko Online - */ - getDataSetCapabilities: () => DataProviderCapabilities; - - /** - * Initialize a local record object for control to set the value. The control needs to invoke the {@link ComponentFramework.PropertyHelper.DataSetApi.EntityRecord.save save()} method on the newly created record to persist the change. - * @todo Overloaded by Shko Online - */ - newRecord: () => ComponentFramework.PropertyHelper.DataSetApi.EntityRecord; - } - - /** - * Provides access to all the properties of a file. - * @todo Overloaded by Shko Online - */ - interface DataProviderCapabilities { - /** - * Whether adding new records is supported or not. - */ - canCreateNewRecords: boolean; - /** - * If the dataset records can be paged. - */ - canPaginate: boolean; - /** - * Whether image info for record columns can be retrieved. - */ - hasCellImageInfo: boolean; - /** - * Whether the dataset supports record navigation for lookup and primary fields. - */ - hasRecordNavigation: boolean; - /** - * If the data provider has edit capabilities. - */ - isEditable: boolean; - /** - * If the dataset can be filtered. - */ - isFilterable: boolean; - /** - * If the dataset can be sorted. - */ - isSortable: boolean; - } - } - namespace PropertyHelper { - namespace DataSetApi { - /** - * Base interface for dataset record result. Supports value retrival by column name. - */ - interface EntityRecord { - /** - * Whether this record is dirty. Only applicable if the dataset is editable and this record has dirty values. - * @todo Overloaded by Shko Online - */ - isDirty(): boolean; - - /** - * Whether this record is valid. Only applicable if the dataset is editable and this record has invalid values. - * @todo Overloaded by Shko Online - */ - isValid(): boolean; - - /** - * Saves the record - * @throws You can get an error saying `Invalid snapshot with id undefined` when the incorrect column name parameter was used with {@link ComponentFramework.PropertyHelper.DataSetApi.EntityRecord.setValue setValue}. Make sure to use the logical name of the column. - * @todo Overloaded by Shko Online - */ - save(): Promise; - - /** - * Set value for the column. - * @param columnName The logical name of the column. - * @param value New value for the record. - * @todo Overloaded by Shko Online - */ - setValue( - columnName: string, - value: - | string - | Date - | number - | number[] - | boolean - | ComponentFramework.EntityReference - | ComponentFramework.EntityReference[] - | ComponentFramework.LookupValue - | ComponentFramework.LookupValue[], - ): Promise; - } - } - } -} - -interface ObjectConstructor { - getOwnPropertyNames(o: T): (keyof T)[]; -} diff --git a/storybook/stories/ComplexComponent.stories.ts b/storybook/stories/ComplexComponent.stories.ts index e7f94d6..719c14d 100644 --- a/storybook/stories/ComplexComponent.stories.ts +++ b/storybook/stories/ComplexComponent.stories.ts @@ -29,7 +29,7 @@ export default { } as Meta; const renderGenerator = () => { - let container: HTMLDivElement; + let container: HTMLDivElement | null; let mockGenerator: ComponentFrameworkMockGenerator; return function () { diff --git a/storybook/stories/ContainerSize.stories.ts b/storybook/stories/ContainerSize.stories.ts index 4cdcf46..888c0c3 100644 --- a/storybook/stories/ContainerSize.stories.ts +++ b/storybook/stories/ContainerSize.stories.ts @@ -27,7 +27,7 @@ interface StoryArgs { } const renderGenerator = () => { - let container: HTMLDivElement; + let container: HTMLDivElement | null; let mockGenerator: ComponentFrameworkMockGenerator; return function () { diff --git a/storybook/stories/ContainerSizeVirtual.stories.ts b/storybook/stories/ContainerSizeVirtual.stories.ts index f7a5966..521c065 100644 --- a/storybook/stories/ContainerSizeVirtual.stories.ts +++ b/storybook/stories/ContainerSizeVirtual.stories.ts @@ -8,7 +8,7 @@ import { ComponentFrameworkMockGeneratorReact, TwoOptionsPropertyMock } from '.. export default { title: "Shko Online's ComponentFramework-Mock/ContainerSizeReact", - argTypes: { + argTypes: { trackContainer: { defaultValue: false, name: 'Track Container', @@ -28,11 +28,11 @@ interface StoryArgs { } const renderGenerator = () => { - let container: HTMLDivElement; + let container: HTMLDivElement | null; let mockGenerator: ComponentFrameworkMockGeneratorReact; return function () { - const [args] = useArgs(); + const [args, updateArgs] = useArgs(); useEffect( () => () => { container = null; diff --git a/storybook/stories/MultiSelectOptionSet.stories.ts b/storybook/stories/MultiSelectOptionSet.stories.ts index 1ac0229..f0511ed 100644 --- a/storybook/stories/MultiSelectOptionSet.stories.ts +++ b/storybook/stories/MultiSelectOptionSet.stories.ts @@ -37,7 +37,7 @@ interface StoryArgs { } const renderGenerator = () => { - let container: HTMLDivElement; + let container: HTMLDivElement | null; let mockGenerator: ComponentFrameworkMockGenerator; return function () { @@ -78,8 +78,8 @@ const renderGenerator = () => { selection: args.selection, }); - mockGenerator.onOutputChanged.callsFake(()=>{ - updateArgs({selection: mockGenerator.context._parameters.selection.raw}); + mockGenerator.onOutputChanged.callsFake(() => { + updateArgs({ selection: mockGenerator.context._parameters.selection.raw }); }); mockGenerator.ExecuteInit(); @@ -89,9 +89,9 @@ const renderGenerator = () => { mockGenerator.context.mode.isVisible = args.isVisible; mockGenerator.context.mode.isControlDisabled = args.isDisabled; mockGenerator.UpdateValues({ - selection: args.selection + selection: args.selection, }); - + mockGenerator.ExecuteUpdateView(); } diff --git a/storybook/stories/OwnerLookup.stories.ts b/storybook/stories/OwnerLookup.stories.ts index 1363089..6af1f06 100644 --- a/storybook/stories/OwnerLookup.stories.ts +++ b/storybook/stories/OwnerLookup.stories.ts @@ -22,7 +22,7 @@ export default { } as Meta; const renderGenerator = () => { - let container: HTMLDivElement; + let container: HTMLDivElement | null; let mockGenerator: ComponentFrameworkMockGenerator; return function () { @@ -50,12 +50,10 @@ const renderGenerator = () => { value: { entityType: 'account', id: 'my-id' }, }); - mockGenerator.onOutputChanged.callsFake(({value}) => { + mockGenerator.onOutputChanged.callsFake(({ value }) => { mockGenerator.context._parameters.value._Refresh(); updateArgs({ - value: value - ? value[0] - : undefined, + value: value ? value[0] : undefined, }); }); @@ -66,9 +64,9 @@ const renderGenerator = () => { mockGenerator.context.mode.isVisible = args.isVisible; mockGenerator.context.mode.isControlDisabled = args.isDisabled; mockGenerator.UpdateValues({ - value: args.value + value: args.value, }); - + mockGenerator.ExecuteUpdateView(); } return container; diff --git a/storybook/stories/WebAPIControl.stories.ts b/storybook/stories/WebAPIControl.stories.ts index 71da989..db338f7 100644 --- a/storybook/stories/WebAPIControl.stories.ts +++ b/storybook/stories/WebAPIControl.stories.ts @@ -16,7 +16,7 @@ interface StoryArgs { } const renderGenerator = () => { - let container: HTMLDivElement; + let container: HTMLDivElement | null; let mockGenerator: ComponentFrameworkMockGenerator; return function () { @@ -40,23 +40,29 @@ const renderGenerator = () => { ); mockGenerator.metadata.initMetadata([ - { LogicalName: 'account', EntitySetName: 'accounts', PrimaryIdAttribute: 'accountid', PrimaryNameAttribute: 'name', Attributes: [ - { - AttributeType: AttributeType.Uniqueidentifier, - LogicalName: 'accountid', - SchemaName: 'AccountId' - } as ShkoOnline.AttributeMetadata, - { - AttributeType: AttributeType.String, - LogicalName: 'name', - SchemaName: 'Name' - } as ShkoOnline.StringAttributeMetadata, - { - AttributeType: AttributeType.Money, - LogicalName: 'revenue', - SchemaName: 'revenue' - } as ShkoOnline.AttributeMetadata - ] }, + { + LogicalName: 'account', + EntitySetName: 'accounts', + PrimaryIdAttribute: 'accountid', + PrimaryNameAttribute: 'name', + Attributes: [ + { + AttributeType: AttributeType.Uniqueidentifier, + LogicalName: 'accountid', + SchemaName: 'AccountId', + } as ShkoOnline.AttributeMetadata, + { + AttributeType: AttributeType.String, + LogicalName: 'name', + SchemaName: 'Name', + } as ShkoOnline.StringAttributeMetadata, + { + AttributeType: AttributeType.Money, + LogicalName: 'revenue', + SchemaName: 'revenue', + } as ShkoOnline.AttributeMetadata, + ], + }, ]); mockGenerator.context.mode.isControlDisabled = args.isDisabled; @@ -81,7 +87,5 @@ const renderGenerator = () => { export const WebAPIControl = { render: renderGenerator(), - args: { - - }, + args: {}, } as StoryObj;