update callbacks
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import { UmbDataTypeDetailModel } from '../../types.js';
|
||||
import { UmbDataTypeDetailModel, UmbDataTypePropertyModel } from '../../types.js';
|
||||
import { UmbId } from '@umbraco-cms/backoffice/id';
|
||||
import { UmbDetailDataSource } from '@umbraco-cms/backoffice/repository';
|
||||
import {
|
||||
@@ -49,7 +49,7 @@ export class UmbDataTypeServerDataSource implements UmbDetailDataSource<UmbDataT
|
||||
|
||||
/**
|
||||
* Fetches a Data Type with the given id from the server
|
||||
* @param {string} id
|
||||
* @param {string} unique
|
||||
* @return {*}
|
||||
* @memberof UmbDataTypeServerDataSource
|
||||
*/
|
||||
@@ -58,19 +58,20 @@ export class UmbDataTypeServerDataSource implements UmbDetailDataSource<UmbDataT
|
||||
|
||||
const { data, error } = await tryExecuteAndNotify(this.#host, DataTypeResource.getDataTypeById({ id: unique }));
|
||||
|
||||
if (error) {
|
||||
if (error || !data) {
|
||||
return { error };
|
||||
}
|
||||
|
||||
// map to client model
|
||||
// TODO: investigate why all server fields are optional
|
||||
const dataType = {
|
||||
entityType: 'data-type',
|
||||
unique: data.id,
|
||||
parentUnique: data.parentId,
|
||||
name: data.name,
|
||||
propertyEditorAlias: data.propertyEditorAlias,
|
||||
propertyEditorUiAlias: data.propertyEditorAlias,
|
||||
values: data.values,
|
||||
type: 'data-type',
|
||||
unique: data.id!,
|
||||
parentUnique: data.parentId!,
|
||||
name: data.name!,
|
||||
propertyEditorAlias: data.propertyEditorAlias!,
|
||||
propertyEditorUiAlias: data.propertyEditorAlias!,
|
||||
values: data.values as Array<UmbDataTypePropertyModel>,
|
||||
};
|
||||
|
||||
return { data: dataType };
|
||||
@@ -84,7 +85,7 @@ export class UmbDataTypeServerDataSource implements UmbDetailDataSource<UmbDataT
|
||||
*/
|
||||
async create(dataType: UmbDataTypeDetailModel) {
|
||||
if (!dataType) throw new Error('Data Type is missing');
|
||||
if (!dataType.unique) throw new Error('Data Type id is missing');
|
||||
if (!dataType.unique) throw new Error('Data Type unique is missing');
|
||||
|
||||
// map to server model
|
||||
const requestBody: CreateDataTypeRequestModel = {
|
||||
@@ -107,7 +108,7 @@ export class UmbDataTypeServerDataSource implements UmbDetailDataSource<UmbDataT
|
||||
return { error: createError };
|
||||
}
|
||||
|
||||
// we have to fetch the data type again. The server can have modified the data after creation
|
||||
// We have to fetch the data type again. The server can have modified the data after creation
|
||||
return this.read(dataType.unique);
|
||||
}
|
||||
|
||||
@@ -127,13 +128,20 @@ export class UmbDataTypeServerDataSource implements UmbDetailDataSource<UmbDataT
|
||||
values: data.values,
|
||||
};
|
||||
|
||||
return tryExecuteAndNotify(
|
||||
const { error } = await tryExecuteAndNotify(
|
||||
this.#host,
|
||||
DataTypeResource.putDataTypeById({
|
||||
id: data.unique,
|
||||
requestBody,
|
||||
}),
|
||||
);
|
||||
|
||||
if (error) {
|
||||
return { error };
|
||||
}
|
||||
|
||||
// We have to fetch the data type again. The server can have modified the data after update
|
||||
return this.read(data.unique);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -20,6 +20,7 @@ export class UmbDataTypeTreeStore extends UmbUniqueTreeStore {
|
||||
*/
|
||||
constructor(host: UmbControllerHost) {
|
||||
super(host, UMB_DATA_TYPE_TREE_STORE_CONTEXT.toString());
|
||||
|
||||
new UmbStoreConnector<UmbDataTypeTreeItemModel, UmbDataTypeDetailModel>(
|
||||
host,
|
||||
this,
|
||||
@@ -30,7 +31,6 @@ export class UmbDataTypeTreeStore extends UmbUniqueTreeStore {
|
||||
}
|
||||
|
||||
#createTreeItemMapper = (item: UmbDataTypeDetailModel) => {
|
||||
console.log('create tree item for', item);
|
||||
return {
|
||||
unique: item.unique!,
|
||||
parentUnique: item.parentUnique,
|
||||
@@ -43,8 +43,9 @@ export class UmbDataTypeTreeStore extends UmbUniqueTreeStore {
|
||||
};
|
||||
|
||||
#updateTreeItemMapper = (item: UmbDataTypeDetailModel) => {
|
||||
console.log('update tree item for', item);
|
||||
return item;
|
||||
return {
|
||||
name: item.name,
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,14 @@
|
||||
import { DataTypeResponseModel } from '@umbraco-cms/backoffice/backend-api';
|
||||
|
||||
export type UmbDataTypeDetailModel = Omit<DataTypeResponseModel, 'id' | 'parentId'> & {
|
||||
export type UmbDataTypeDetailModel = {
|
||||
type: string;
|
||||
unique: string | undefined; // TODO - remove this when server doesn't allow undefined
|
||||
parentUnique: string | null | undefined; // TODO - remove this when server doesn't allow undefined
|
||||
unique: string;
|
||||
parentUnique: string | null;
|
||||
name: string;
|
||||
propertyEditorAlias: string | undefined;
|
||||
propertyEditorUiAlias: string | null;
|
||||
values: Array<UmbDataTypePropertyModel>;
|
||||
};
|
||||
|
||||
export interface UmbDataTypePropertyModel {
|
||||
alias: string;
|
||||
value: any;
|
||||
}
|
||||
|
||||
@@ -87,6 +87,10 @@ export class UmbStoreBase<StoreItemType = any> extends EventTarget implements Um
|
||||
return this._data.getValue().filter((item) => uniques.includes(this._data.getUnique(item)));
|
||||
}
|
||||
|
||||
getAll() {
|
||||
return this._data.getValue();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an observable of the entire store
|
||||
* @memberof UmbStoreBase
|
||||
|
||||
@@ -5,21 +5,21 @@ import { UmbContextConsumerController, UmbContextToken } from '@umbraco-cms/back
|
||||
import { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
|
||||
|
||||
export class UmbStoreConnector<StoreType, ConnectedStoreType> {
|
||||
#store: UmbStoreBase;
|
||||
#store: UmbStore<StoreType>;
|
||||
#connectedStore?: UmbStore<ConnectedStoreType>;
|
||||
#createMapperFunction: (item: ConnectedStoreType) => StoreType;
|
||||
#updateMapperFunction?: (item: ConnectedStoreType) => StoreType;
|
||||
#onNewStoreItem: (item: ConnectedStoreType) => StoreType;
|
||||
#onUpdateStoreItem: (item: ConnectedStoreType) => StoreType;
|
||||
|
||||
constructor(
|
||||
host: UmbControllerHost,
|
||||
store: UmbStoreBase,
|
||||
connectToStoreAlias: UmbContextToken<any, any> | string,
|
||||
createMapperFunction: (item: ConnectedStoreType) => StoreType,
|
||||
updateMapperFunction: (item: ConnectedStoreType) => StoreType,
|
||||
onNewStoreItem: (item: ConnectedStoreType) => StoreType,
|
||||
onUpdateStoreItem: (item: ConnectedStoreType) => Partial<StoreType>,
|
||||
) {
|
||||
this.#store = store;
|
||||
this.#createMapperFunction = createMapperFunction;
|
||||
this.#updateMapperFunction = updateMapperFunction;
|
||||
this.#onNewStoreItem = onNewStoreItem;
|
||||
this.#onUpdateStoreItem = onUpdateStoreItem;
|
||||
|
||||
new UmbContextConsumerController(host, connectToStoreAlias, (instance) => {
|
||||
this.#connectedStore = instance;
|
||||
@@ -32,25 +32,25 @@ export class UmbStoreConnector<StoreType, ConnectedStoreType> {
|
||||
|
||||
#listenToConnectedStore = () => {
|
||||
if (!this.#connectedStore) return;
|
||||
this.#connectedStore.addEventListener(UmbStoreCreateEvent.TYPE, this.#onConnectedStoreCreate as EventListener);
|
||||
this.#connectedStore.addEventListener(UmbStoreUpdateEvent.TYPE, this.#onConnectedStoreUpdate as EventListener);
|
||||
this.#connectedStore.addEventListener(UmbStoreDeleteEvent.TYPE, this.#onConnectedStoreDelete as EventListener);
|
||||
this.#connectedStore.addEventListener(UmbStoreCreateEvent.TYPE, this.#updateStoreItems as EventListener);
|
||||
this.#connectedStore.addEventListener(UmbStoreUpdateEvent.TYPE, this.#updateStoreItems as EventListener);
|
||||
this.#connectedStore.addEventListener(UmbStoreDeleteEvent.TYPE, this.#removeStoreItems as EventListener);
|
||||
};
|
||||
|
||||
#onConnectedStoreCreate = (event: UmbStoreCreateEvent) => {
|
||||
const items = this.#connectedStore!.getItems(event.uniques);
|
||||
const mappedItems = items.map((item) => this.#createMapperFunction(item));
|
||||
this.#store.appendItems(mappedItems);
|
||||
#updateStoreItems = (event: UmbStoreCreateEvent | UmbStoreUpdateEvent) => {
|
||||
event.uniques.forEach((unique) => {
|
||||
const storeHasItem = this.#store.getItems([unique]).length > 0;
|
||||
const connectedStoreItem = this.#connectedStore!.getItems([unique])[0];
|
||||
|
||||
if (storeHasItem) {
|
||||
this.#store.updateItem(unique, this.#onUpdateStoreItem(connectedStoreItem!));
|
||||
} else {
|
||||
this.#store.append(this.#onNewStoreItem(connectedStoreItem!));
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
#onConnectedStoreUpdate = (event: UmbStoreUpdateEvent) => {
|
||||
const uniques = event.uniques;
|
||||
const items = this.#connectedStore!.getItems(uniques);
|
||||
const mappedItems = items.map((item) => this.#updateMapperFunction(item));
|
||||
mappedItems.forEach((mappedItem, index) => this.#store.updateItem(uniques[index], mappedItem));
|
||||
};
|
||||
|
||||
#onConnectedStoreDelete = (event: UmbStoreDeleteEvent) => {
|
||||
#removeStoreItems = (event: UmbStoreDeleteEvent) => {
|
||||
this.#store.removeItems(event.uniques);
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user