asObservablePart

This commit is contained in:
Niels Lyngsø
2023-06-29 14:56:05 +02:00
parent 9b2f6a6443
commit 42304ef63e
38 changed files with 70 additions and 70 deletions

View File

@@ -83,7 +83,7 @@ describe('ArrayState', () => {
});
it('getObservablePart for a specific entry of array', (done) => {
const subObserver = subject.getObservablePart((data) => data.find((x) => x.key === '2'));
const subObserver = subject.asObservablePart((data) => data.find((x) => x.key === '2'));
subObserver.subscribe((entry) => {
if (entry) {
expect(entry.another).to.be.equal(initialData[1].another);
@@ -96,7 +96,7 @@ describe('ArrayState', () => {
let amountOfCallbacks = 0;
const newItem = { key: '4', another: 'myValue4' };
const subObserver = subject.getObservablePart((data) => data.find((x) => x.key === newItem.key));
const subObserver = subject.asObservablePart((data) => data.find((x) => x.key === newItem.key));
subObserver.subscribe((entry) => {
amountOfCallbacks++;
if (amountOfCallbacks === 1) {
@@ -132,7 +132,7 @@ describe('ArrayState', () => {
const newItem = { key: '2', another: 'myValue4' };
subject.appendOne(newItem);
const subObserver = subject.getObservablePart((data) => data.find((x) => x.key === newItem.key));
const subObserver = subject.asObservablePart((data) => data.find((x) => x.key === newItem.key));
subObserver.subscribe((entry) => {
expect(entry).to.be.equal(newItem); // Second callback should give us the right data:
if (entry) {
@@ -145,7 +145,7 @@ describe('ArrayState', () => {
it('getObservablePart replays existing data to any amount of subscribers.', (done) => {
let amountOfCallbacks = 0;
const subObserver = subject.getObservablePart((data) => data.find((x) => x.key === '2'));
const subObserver = subject.asObservablePart((data) => data.find((x) => x.key === '2'));
subObserver.subscribe((entry) => {
if (entry) {
amountOfCallbacks++;
@@ -166,7 +166,7 @@ describe('ArrayState', () => {
it('getObservablePart replays existing data to any amount of subscribers.', (done) => {
let amountOfCallbacks = 0;
const subObserver = subject.getObservablePart((data) => data.find((x) => x.key === '2'));
const subObserver = subject.asObservablePart((data) => data.find((x) => x.key === '2'));
subObserver.subscribe((entry) => {
if (entry) {
amountOfCallbacks++;

View File

@@ -35,7 +35,7 @@ describe('UmbDeepState', () => {
it('use gObservablePart, updates on its specific change.', (done) => {
let amountOfCallbacks = 0;
const subObserver = subject.getObservablePart((data) => data.another);
const subObserver = subject.asObservablePart((data) => data.another);
subObserver.subscribe((value) => {
amountOfCallbacks++;
if (amountOfCallbacks === 1) {

View File

@@ -17,7 +17,7 @@ export class UmbDeepState<T> extends BehaviorSubject<T> {
super(deepFreeze(initialData));
}
getObservablePart<ReturnType>(
asObservablePart<ReturnType>(
mappingFunction: MappingFunction<T, ReturnType>,
memoizationFunction?: MemoizationFunction<ReturnType>
) {

View File

@@ -26,7 +26,7 @@ describe('UmbObjectState', () => {
it('use getObservablePart, updates on its specific change.', (done) => {
let amountOfCallbacks = 0;
const subObserver = subject.getObservablePart((data) => data.another);
const subObserver = subject.asObservablePart((data) => data.another);
subObserver.subscribe((value) => {
amountOfCallbacks++;
if (amountOfCallbacks === 1) {

View File

@@ -22,7 +22,7 @@ export class UmbEntityTreeStore
* An observable to observe the root items
* @memberof UmbEntityTreeStore
*/
rootItems = this._data.getObservablePart((items) => items.filter((item) => item.parentId === null));
rootItems = this._data.asObservablePart((items) => items.filter((item) => item.parentId === null));
/**
* Returns an observable to observe the children of a given parent
@@ -31,7 +31,7 @@ export class UmbEntityTreeStore
* @memberof UmbEntityTreeStore
*/
childrenOf(parentId: string | null) {
return this._data.getObservablePart((items) => items.filter((item) => item.parentId === parentId));
return this._data.asObservablePart((items) => items.filter((item) => item.parentId === parentId));
}
/**
@@ -41,6 +41,6 @@ export class UmbEntityTreeStore
* @memberof UmbEntityTreeStore
*/
items(ids: Array<string | null>) {
return this._data.getObservablePart((items) => items.filter((item) => ids.includes(item.id ?? '')));
return this._data.asObservablePart((items) => items.filter((item) => ids.includes(item.id ?? '')));
}
}

View File

@@ -22,7 +22,7 @@ export class UmbFileSystemTreeStore
* An observable to observe the root items
* @memberof UmbFileSystemTreeStore
*/
rootItems = this._data.getObservablePart((items) => items.filter((item) => item.path?.includes('/') === false));
rootItems = this._data.asObservablePart((items) => items.filter((item) => item.path?.includes('/') === false));
/**
* Returns an observable to observe the children of a given parent
@@ -31,7 +31,7 @@ export class UmbFileSystemTreeStore
* @memberof UmbFileSystemTreeStore
*/
childrenOf(parentPath: string | null) {
return this._data.getObservablePart((items) =>
return this._data.asObservablePart((items) =>
items.filter((item) => item.path?.startsWith(parentPath + '/') || parentPath === null)
);
}
@@ -43,6 +43,6 @@ export class UmbFileSystemTreeStore
* @memberof UmbFileSystemTreeStore
*/
items(paths: Array<string>) {
return this._data.getObservablePart((items) => items.filter((item) => paths.includes(item.path ?? '')));
return this._data.asObservablePart((items) => items.filter((item) => paths.includes(item.path ?? '')));
}
}

View File

@@ -25,11 +25,11 @@ export class UmbWorkspacePropertyContext<ValueType = any> {
#data = new UmbObjectState<WorkspacePropertyData<ValueType>>({});
public readonly alias = this.#data.getObservablePart((data) => data.alias);
public readonly label = this.#data.getObservablePart((data) => data.label);
public readonly description = this.#data.getObservablePart((data) => data.description);
public readonly value = this.#data.getObservablePart((data) => data.value);
public readonly configValues = this.#data.getObservablePart((data) => data.config);
public readonly alias = this.#data.asObservablePart((data) => data.alias);
public readonly label = this.#data.asObservablePart((data) => data.label);
public readonly description = this.#data.asObservablePart((data) => data.description);
public readonly value = this.#data.asObservablePart((data) => data.value);
public readonly configValues = this.#data.asObservablePart((data) => data.config);
#configCollection = new UmbClassState<UmbDataTypeConfigCollection | undefined>(undefined);
public readonly config = this.#configCollection.asObservable();

View File

@@ -46,7 +46,7 @@ export class UmbWorkspaceSplitViewManager {
}
public activeVariantByIndex(index: number) {
return this.#activeVariantsInfo.getObservablePart((data) => data[index] || undefined);
return this.#activeVariantsInfo.asObservablePart((data) => data[index] || undefined);
}
public switchVariant(index: number, variantId: UmbVariantId) {

View File

@@ -32,9 +32,9 @@ export class UmbWorkspaceVariantContext {
#currentVariant = new UmbObjectState<DocumentVariantResponseModel | undefined>(undefined);
currentVariant = this.#currentVariant.asObservable();
name = this.#currentVariant.getObservablePart((x) => x?.name);
culture = this.#currentVariant.getObservablePart((x) => x?.culture);
segment = this.#currentVariant.getObservablePart((x) => x?.segment);
name = this.#currentVariant.asObservablePart((x) => x?.name);
culture = this.#currentVariant.asObservablePart((x) => x?.culture);
segment = this.#currentVariant.asObservablePart((x) => x?.segment);
#variantId = new UmbClassState<UmbVariantId | undefined>(undefined);
variantId = this.#variantId.asObservable();

View File

@@ -35,7 +35,7 @@ export class UmbDocumentBlueprintStore extends UmbStoreBase {
this._data.append(data);
});
return this._data.getObservablePart((documents) => documents.find((document) => document.id === id));
return this._data.asObservablePart((documents) => documents.find((document) => document.id === id));
}
getScaffold(entityType: string, parentId: string | null) {

View File

@@ -39,7 +39,7 @@ export class UmbDocumentTypeStore extends UmbStoreBase {
* @memberof UmbDocumentTypeStore
*/
byId(id: DocumentTypeResponseModel['id']) {
return this._data.getObservablePart((x) => x.find((y) => y.id === id));
return this._data.asObservablePart((x) => x.find((y) => y.id === id));
}
/**

View File

@@ -35,7 +35,7 @@ export class UmbDocumentStore extends UmbStoreBase {
* @memberof UmbDocumentStore
*/
byId(id: DocumentResponseModel['id']) {
return this._data.getObservablePart((x) => x.find((y) => y.id === id));
return this._data.asObservablePart((x) => x.find((y) => y.id === id));
}
/**

View File

@@ -35,12 +35,12 @@ export class UmbDocumentWorkspaceContext
* The document is the current state/draft version of the document.
*/
#draft = new UmbObjectState<EntityType | undefined>(undefined);
readonly unique = this.#draft.getObservablePart((data) => data?.id);
readonly documentTypeKey = this.#draft.getObservablePart((data) => data?.contentTypeId);
readonly unique = this.#draft.asObservablePart((data) => data?.id);
readonly documentTypeKey = this.#draft.asObservablePart((data) => data?.contentTypeId);
readonly variants = this.#draft.getObservablePart((data) => data?.variants || []);
readonly urls = this.#draft.getObservablePart((data) => data?.urls || []);
readonly templateId = this.#draft.getObservablePart((data) => data?.templateId || null);
readonly variants = this.#draft.asObservablePart((data) => data?.variants || []);
readonly urls = this.#draft.asObservablePart((data) => data?.urls || []);
readonly templateId = this.#draft.asObservablePart((data) => data?.templateId || null);
readonly structure;
readonly splitView;
@@ -125,18 +125,18 @@ export class UmbDocumentWorkspaceContext
}
propertyValuesOf(variantId?: UmbVariantId) {
return this.#draft.getObservablePart((data) =>
return this.#draft.asObservablePart((data) =>
variantId ? data?.values?.filter((x) => variantId.compare(x)) : data?.values
);
}
propertyDataByAlias(propertyAlias: string, variantId?: UmbVariantId) {
return this.#draft.getObservablePart((data) =>
return this.#draft.asObservablePart((data) =>
data?.values?.find((x) => x?.alias === propertyAlias && (variantId ? variantId.compare(x) : true))
);
}
propertyValueByAlias(propertyAlias: string, variantId?: UmbVariantId) {
return this.#draft.getObservablePart(
return this.#draft.asObservablePart(
(data) =>
data?.values?.find((x) => x?.alias === propertyAlias && (variantId ? variantId.compare(x) : true))?.value
);

View File

@@ -11,7 +11,7 @@ export class UmbWorkspaceMediaTypeContext
{
#data = new UmbObjectState<MediaTypeDetails | undefined>(undefined);
data = this.#data.asObservable();
name = this.#data.getObservablePart((data) => data?.name);
name = this.#data.asObservablePart((data) => data?.name);
constructor(host: UmbControllerHostElement) {
super(host, new UmbMediaTypeRepository(host));

View File

@@ -35,7 +35,7 @@ export class UmbMediaStore extends UmbStoreBase {
* @memberof UmbMediaStore
*/
byId(id: MediaDetails['id']) {
return this._data.getObservablePart((x) => x.find((y) => y.id === id));
return this._data.asObservablePart((x) => x.find((y) => y.id === id));
}
/**

View File

@@ -11,7 +11,7 @@ export class UmbMediaWorkspaceContext
{
#data = new UmbObjectState<EntityType | undefined>(undefined);
data = this.#data.asObservable();
name = this.#data.getObservablePart((data) => data?.name);
name = this.#data.asObservablePart((data) => data?.name);
constructor(host: UmbControllerHostElement) {
super(host, new UmbMediaRepository(host));

View File

@@ -31,7 +31,7 @@ export class UmbMemberGroupStore extends UmbStoreBase {
* @memberof UmbMemberGroupStore
*/
byId(id: MemberGroupDetails['id']) {
return this._data.getObservablePart((x) => x.find((y) => y.id === id));
return this._data.asObservablePart((x) => x.find((y) => y.id === id));
}
remove(uniques: string[]) {

View File

@@ -11,7 +11,7 @@ export class UmbWorkspaceMemberGroupContext
{
#data = new UmbObjectState<EntityType | undefined>(undefined);
data = this.#data.asObservable();
name = this.#data.getObservablePart((data) => data?.name);
name = this.#data.asObservablePart((data) => data?.name);
constructor(host: UmbControllerHostElement) {
super(host, new UmbMemberGroupRepository(host));

View File

@@ -25,7 +25,7 @@ export class UmbMemberTypeStore extends UmbStoreBase {
* @memberof UmbMemberTypeStore
*/
byId(id: MemberTypeDetails['id']) {
return this._data.getObservablePart((x) => x.find((y) => y.id === id));
return this._data.asObservablePart((x) => x.find((y) => y.id === id));
}
remove(uniques: string[]) {

View File

@@ -11,7 +11,7 @@ export class UmbMemberTypeWorkspaceContext
implements UmbEntityWorkspaceContextInterface<EntityType | undefined>
{
#data = new UmbObjectState<EntityType | undefined>(undefined);
name = this.#data.getObservablePart((data) => data?.name);
name = this.#data.asObservablePart((data) => data?.name);
constructor(host: UmbControllerHostElement) {
super(host, new UmbMemberTypeRepository(host));

View File

@@ -29,7 +29,7 @@ export class UmbDataTypeItemStore
}
items(ids: Array<string>) {
return this._data.getObservablePart((items) => items.filter((item) => ids.includes(item.id ?? '')));
return this._data.asObservablePart((items) => items.filter((item) => ids.includes(item.id ?? '')));
}
}

View File

@@ -41,7 +41,7 @@ export class UmbDataTypeStore extends UmbStoreBase<DataTypeResponseModel> {
* @memberof UmbDataTypeStore
*/
byId(id: DataTypeResponseModel['id']) {
return this._data.getObservablePart((x) => x.find((y) => y.id === id));
return this._data.asObservablePart((x) => x.find((y) => y.id === id));
}
/**
@@ -55,7 +55,7 @@ export class UmbDataTypeStore extends UmbStoreBase<DataTypeResponseModel> {
withPropertyEditorUiAlias(propertyEditorUiAlias: string) {
// TODO: Use a model for the data-type tree items: ^^Most likely it should be parsed to the UmbEntityTreeStore as a generic type.
return this._data.getObservablePart((items) =>
return this._data.asObservablePart((items) =>
items.filter((item) => (item as any).propertyEditorUiAlias === propertyEditorUiAlias)
);
}

View File

@@ -12,8 +12,8 @@ export class UmbDataTypeWorkspaceContext
#data = new UmbObjectState<DataTypeResponseModel | undefined>(undefined);
data = this.#data.asObservable();
name = this.#data.getObservablePart((data) => data?.name);
id = this.#data.getObservablePart((data) => data?.id);
name = this.#data.asObservablePart((data) => data?.name);
id = this.#data.asObservablePart((data) => data?.id);
constructor(host: UmbControllerHostElement) {
super(host, new UmbDataTypeRepository(host));

View File

@@ -26,6 +26,6 @@ export class UmbLanguageItemStore
}
items(isoCodes: Array<string>) {
return this._data.getObservablePart((items) => items.filter((item) => isoCodes.includes(item.isoCode ?? '')));
return this._data.asObservablePart((items) => items.filter((item) => isoCodes.includes(item.isoCode ?? '')));
}
}

View File

@@ -33,6 +33,6 @@ export class UmbLanguageStore extends UmbStoreBase {
// TODO: how do we best handle this? They might have a smaller data set than the details
items(isoCodes: Array<string>) {
return this._data.getObservablePart((items) => items.filter((item) => isoCodes.includes(item.isoCode ?? '')));
return this._data.asObservablePart((items) => items.filter((item) => isoCodes.includes(item.isoCode ?? '')));
}
}

View File

@@ -41,7 +41,7 @@ export class UmbRelationTypeStore extends UmbStoreBase {
* @memberof UmbRelationTypeStore
*/
byId(id: RelationTypeResponseModel['id']) {
return this._data.getObservablePart((x) => x.find((y) => y.id === id));
return this._data.asObservablePart((x) => x.find((y) => y.id === id));
}
/**

View File

@@ -10,8 +10,8 @@ export class UmbRelationTypeWorkspaceContext
{
#data = new UmbObjectState<RelationTypeResponseModel | undefined>(undefined);
data = this.#data.asObservable();
name = this.#data.getObservablePart((data) => data?.name);
id = this.#data.getObservablePart((data) => data?.id);
name = this.#data.asObservablePart((data) => data?.name);
id = this.#data.asObservablePart((data) => data?.id);
constructor(host: UmbControllerHostElement) {
super(host, new UmbRelationTypeRepository(host));

View File

@@ -38,11 +38,11 @@ export class UmbTagStore extends UmbStoreBase {
* @memberof UmbTagStore
*/
byId(id: TagResponseModel['id']) {
return this._data.getObservablePart((x) => x.find((y) => y.id === id));
return this._data.asObservablePart((x) => x.find((y) => y.id === id));
}
items(group: TagResponseModel['group'], culture: string) {
return this._data.getObservablePart((items) =>
return this._data.asObservablePart((items) =>
items.filter((item) => item.group === group && item.culture === culture)
);
}
@@ -54,7 +54,7 @@ export class UmbTagStore extends UmbStoreBase {
// If we already has picked lets say 4 of them, the list will only show 1 more, even though there is more remaining in the database.
byQuery(group: TagResponseModel['group'], culture: string, query: string) {
return this._data.getObservablePart((items) =>
return this._data.asObservablePart((items) =>
items.filter(
(item) =>
item.group === group &&

View File

@@ -29,7 +29,7 @@ export class UmbTemplateItemStore
}
items(ids: Array<string>) {
return this._data.getObservablePart((items) => items.filter((item) => ids.includes(item.id ?? '')));
return this._data.asObservablePart((items) => items.filter((item) => ids.includes(item.id ?? '')));
}
}

View File

@@ -35,11 +35,11 @@ export class UmbTemplateStore extends UmbStoreBase {
* @memberof UmbTemplateStore
*/
byId(id: TemplateResponseModel['id']) {
return this._data.getObservablePart((x) => x.find((y) => y.id === id));
return this._data.asObservablePart((x) => x.find((y) => y.id === id));
}
items(uniques: string[]) {
return this._data.getObservablePart((x) => x.filter((y) => uniques.includes(y.id)));
return this._data.asObservablePart((x) => x.filter((y) => uniques.includes(y.id)));
}
/**

View File

@@ -29,7 +29,7 @@ export class UmbDictionaryStore extends UmbStoreBase {
* @memberof UmbDictionaryStore
*/
byId(id: DictionaryItemResponseModel['id']) {
return this._data.getObservablePart((x) => x.find((y) => y.id === id));
return this._data.asObservablePart((x) => x.find((y) => y.id === id));
}
remove(uniques: string[]) {

View File

@@ -11,8 +11,8 @@ export class UmbDictionaryWorkspaceContext
#data = new UmbObjectState<DictionaryItemResponseModel | undefined>(undefined);
data = this.#data.asObservable();
name = this.#data.getObservablePart((data) => data?.name);
dictionary = this.#data.getObservablePart((data) => data);
name = this.#data.asObservablePart((data) => data?.name);
dictionary = this.#data.asObservablePart((data) => data);
constructor(host: UmbControllerHostElement) {
super(host, new UmbDictionaryRepository(host));

View File

@@ -13,7 +13,7 @@ export type UmbCurrentUserHistoryItem = {
export class UmbCurrentUserHistoryStore extends UmbStoreBase<UmbCurrentUserHistoryItem> {
public readonly history = this._data.asObservable();
public readonly latestHistory = this._data.getObservablePart((historyItems) => historyItems.slice(-10));
public readonly latestHistory = this._data.asObservablePart((historyItems) => historyItems.slice(-10));
constructor(host: UmbControllerHost) {
super(

View File

@@ -29,7 +29,7 @@ export class UmbUserGroupItemStore
}
items(ids: Array<string>) {
return this._data.getObservablePart((items) => items.filter((item) => ids.includes(item.id ?? '')));
return this._data.asObservablePart((items) => items.filter((item) => ids.includes(item.id ?? '')));
}
}

View File

@@ -58,7 +58,7 @@ export class UmbUserGroupStore extends UmbStoreBase implements UmbEntityDetailSt
this.#groups.append([data]);
});
return this.#groups.getObservablePart((userGroups) => userGroups.find((userGroup) => userGroup.id === id));
return this.#groups.asObservablePart((userGroups) => userGroups.find((userGroup) => userGroup.id === id));
}
async save(userGroups: Array<UserGroupDetails>) {

View File

@@ -29,7 +29,7 @@ export class UmbUserItemStore
}
items(ids: Array<string>) {
return this._data.getObservablePart((items) => items.filter((item) => ids.includes(item.id ?? '')));
return this._data.asObservablePart((items) => items.filter((item) => ids.includes(item.id ?? '')));
}
}

View File

@@ -34,7 +34,7 @@ export class UmbUserStore extends UmbStoreBase {
* @memberof UmbUserStore
*/
byId(id: UserResponseModel['id']) {
return this._data.getObservablePart((x) => x.find((y) => y.id === id));
return this._data.asObservablePart((x) => x.find((y) => y.id === id));
}
/**

View File

@@ -4,8 +4,8 @@ import { Meta } from '@storybook/addon-docs';
# Store
A store is the link between a Resource and a data implementation. A store is mainly taken form as a Context, In other words we will have to Consume the Context(Store) to get the Store.
Generally a Store will be holding one or more RxJS Subjects, each Subject is made available for Subscription via a RxJS Observable.
A store is the link between a Resource and a Repository. A store is mainly taken form as a Context, In other words we will have to Consume the Context(Store) to get the Store.
Generally a Store will be holding one or more State Objects, each Subject is made available for Observation via a Observables.
### A Simple Store:
@@ -75,7 +75,7 @@ class MyProductStore {
});
// Return a Observable part, to listen for this specific product and the future changes of it.
return this.#data.getObservablePart((documents) =>
return this.#data.asObservablePart((documents) =>
documents.find((document) => document.id === id)
);
}
@@ -121,8 +121,8 @@ class MyProductStore {
#products = new UmbArrayState(<Array<MyProductType>>[]);
public readonly products = this.#products.asObservable();
public readonly amountOfProducts = this.#products.getObservablePart((products) => products.length);
public readonly topTenRatedProducts = this.#products.getObservablePart((products) => products.sort((a, b) => b.rating - a.rating).slice(0, 10));
public readonly amountOfProducts = this.#products.asObservablePart((products) => products.length);
public readonly topTenRatedProducts = this.#products.asObservablePart((products) => products.sort((a, b) => b.rating - a.rating).slice(0, 10));
...
}