Skip to content

Commit 0dbf2ff

Browse files
authored
Merge pull request #1835 from umbraco/bugfix/reload-collection-on-entity-structure-reload-request
Bugfix: Reload collection on entity structure reload request
2 parents 1502221 + 6f51e2d commit 0dbf2ff

File tree

88 files changed

+623
-260
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

88 files changed

+623
-260
lines changed

src/mocks/data/data-type/data-type.data.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -831,7 +831,6 @@ export const data: Array<UmbMockDataTypeModel> = [
831831
{ alias: 'icon', value: 'icon-layers' },
832832
{ alias: 'tabName', value: 'Children' },
833833
{ alias: 'showContentFirst', value: true },
834-
{ alias: 'useInfiniteEditor', value: true },
835834
],
836835
},
837836
{
@@ -876,7 +875,6 @@ export const data: Array<UmbMockDataTypeModel> = [
876875
{ alias: 'icon', value: 'icon-layers' },
877876
{ alias: 'tabName', value: 'Items' },
878877
{ alias: 'showContentFirst', value: false },
879-
{ alias: 'useInfiniteEditor', value: true },
880878
],
881879
},
882880
{

src/packages/core/collection/collection-alias.condition.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { UMB_COLLECTION_CONTEXT } from './default/collection-default.context.js';
1+
import { UMB_COLLECTION_CONTEXT } from './default/index.js';
22
import type { CollectionAliasConditionConfig } from './collection-alias.manifest.js';
33
import type { UmbConditionControllerArguments, UmbExtensionCondition } from '@umbraco-cms/backoffice/extension-api';
44
import { UmbConditionBase } from '@umbraco-cms/backoffice/extension-registry';

src/packages/core/collection/collection-bulk-action-permission.condition.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { UMB_COLLECTION_CONTEXT } from './default/collection-default.context.js';
1+
import { UMB_COLLECTION_CONTEXT } from './default/index.js';
22
import type { CollectionBulkActionPermissionConditionConfig } from './collection-bulk-action-permission.manifest.js';
33
import type { UmbConditionControllerArguments, UmbExtensionCondition } from '@umbraco-cms/backoffice/extension-api';
44
import { UmbConditionBase } from '@umbraco-cms/backoffice/extension-registry';

src/packages/core/collection/components/collection-selection-actions.element.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import { UMB_COLLECTION_CONTEXT } from '../default/collection-default.context.js';
2-
import type { ManifestEntityBulkAction, MetaEntityBulkAction } from '../../extension-registry/models/index.js';
1+
import { UMB_COLLECTION_CONTEXT } from '../default/index.js';
32
import type { UmbActionExecutedEvent } from '@umbraco-cms/backoffice/event';
43
import { UmbTextStyles } from '@umbraco-cms/backoffice/style';
54
import { css, html, nothing, customElement, state } from '@umbraco-cms/backoffice/external/lit';
65
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
6+
import type { ManifestEntityBulkAction, MetaEntityBulkAction } from '@umbraco-cms/backoffice/extension-registry';
77

88
function apiArgsMethod(manifest: ManifestEntityBulkAction<MetaEntityBulkAction>) {
99
return [{ meta: manifest.meta }] as unknown[];

src/packages/core/collection/components/collection-view-bundle.element.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import type { UmbDefaultCollectionContext } from '../default/collection-default.context.js';
2-
import { UMB_COLLECTION_CONTEXT } from '../default/collection-default.context.js';
1+
import type { UmbDefaultCollectionContext } from '../default/index.js';
2+
import { UMB_COLLECTION_CONTEXT } from '../default/index.js';
33
import type { UmbCollectionLayoutConfiguration } from '../types.js';
44
import { css, html, customElement, state, nothing, repeat, query } from '@umbraco-cms/backoffice/external/lit';
55
import { observeMultiple } from '@umbraco-cms/backoffice/observable-api';

src/packages/core/collection/components/pagination/collection-pagination.element.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { UMB_COLLECTION_CONTEXT } from '../../default/collection-default.context.js';
1+
import { UMB_COLLECTION_CONTEXT } from '../../default/index.js';
22
import type { UUIPaginationEvent } from '@umbraco-cms/backoffice/external/uui';
33
import { UmbTextStyles } from '@umbraco-cms/backoffice/style';
44
import { css, html, customElement, nothing, state } from '@umbraco-cms/backoffice/external/lit';
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import type { UmbDefaultCollectionContext } from './collection-default.context.js';
2+
import { UmbContextToken } from '@umbraco-cms/backoffice/context-api';
3+
4+
export const UMB_COLLECTION_CONTEXT = new UmbContextToken<UmbDefaultCollectionContext>('UmbCollectionContext');

src/packages/core/collection/default/collection-default.context.ts

Lines changed: 74 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,31 @@ import type {
66
UmbCollectionContext,
77
UmbCollectionLayoutConfiguration,
88
} from '../types.js';
9+
import type { UmbCollectionFilterModel } from '../collection-filter-model.interface.js';
10+
import type { UmbCollectionRepository } from '../repository/collection-repository.interface.js';
11+
import { UMB_COLLECTION_CONTEXT } from './collection-default.context-token.js';
912
import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
1013
import { UmbArrayState, UmbNumberState, UmbObjectState } from '@umbraco-cms/backoffice/observable-api';
1114
import { UmbChangeEvent } from '@umbraco-cms/backoffice/event';
1215
import { UmbContextBase } from '@umbraco-cms/backoffice/class-api';
13-
import { UmbContextToken } from '@umbraco-cms/backoffice/context-api';
1416
import { UmbExtensionApiInitializer } from '@umbraco-cms/backoffice/extension-api';
1517
import { UmbSelectionManager, UmbPaginationManager } from '@umbraco-cms/backoffice/utils';
1618
import type { ManifestCollection, ManifestRepository } from '@umbraco-cms/backoffice/extension-registry';
1719
import type { UmbApi } from '@umbraco-cms/backoffice/extension-api';
18-
import type { UmbCollectionFilterModel, UmbCollectionRepository } from '@umbraco-cms/backoffice/collection';
1920
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
21+
import {
22+
UmbRequestReloadChildrenOfEntityEvent,
23+
UmbRequestReloadStructureForEntityEvent,
24+
} from '@umbraco-cms/backoffice/entity-action';
25+
import type { UmbActionEventContext } from '@umbraco-cms/backoffice/action';
26+
import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action';
27+
import { UMB_ENTITY_CONTEXT } from '@umbraco-cms/backoffice/entity';
2028

2129
const LOCAL_STORAGE_KEY = 'umb-collection-view';
2230

2331
export class UmbDefaultCollectionContext<
24-
CollectionItemType = any,
25-
FilterModelType extends UmbCollectionFilterModel = any,
32+
CollectionItemType extends { entityType: string; unique: string } = any,
33+
FilterModelType extends UmbCollectionFilterModel = UmbCollectionFilterModel,
2634
>
2735
extends UmbContextBase<UmbDefaultCollectionContext>
2836
implements UmbCollectionContext, UmbApi
@@ -34,7 +42,7 @@ export class UmbDefaultCollectionContext<
3442
#loading = new UmbObjectState<boolean>(false);
3543
public readonly loading = this.#loading.asObservable();
3644

37-
#items = new UmbArrayState<CollectionItemType>([], (x) => x);
45+
#items = new UmbArrayState<CollectionItemType>([], (x) => x.unique);
3846
public readonly items = this.#items.asObservable();
3947

4048
#totalItems = new UmbNumberState(0);
@@ -63,13 +71,42 @@ export class UmbDefaultCollectionContext<
6371
this.#initialized ? resolve() : (this.#initResolver = resolve);
6472
});
6573

74+
#actionEventContext: UmbActionEventContext | undefined;
75+
6676
constructor(host: UmbControllerHost, defaultViewAlias: string, defaultFilter: Partial<FilterModelType> = {}) {
6777
super(host, UMB_COLLECTION_CONTEXT);
6878

6979
this.#defaultViewAlias = defaultViewAlias;
7080
this.#defaultFilter = defaultFilter;
7181

7282
this.pagination.addEventListener(UmbChangeEvent.TYPE, this.#onPageChange);
83+
this.#listenToEntityEvents();
84+
}
85+
86+
async #listenToEntityEvents() {
87+
this.consumeContext(UMB_ACTION_EVENT_CONTEXT, (context) => {
88+
this.#actionEventContext = context;
89+
90+
context?.removeEventListener(
91+
UmbRequestReloadStructureForEntityEvent.TYPE,
92+
this.#onReloadStructureRequest as unknown as EventListener,
93+
);
94+
95+
context?.removeEventListener(
96+
UmbRequestReloadChildrenOfEntityEvent.TYPE,
97+
this.#onReloadChildrenRequest as unknown as EventListener,
98+
);
99+
100+
context?.addEventListener(
101+
UmbRequestReloadStructureForEntityEvent.TYPE,
102+
this.#onReloadStructureRequest as unknown as EventListener,
103+
);
104+
105+
context?.addEventListener(
106+
UmbRequestReloadChildrenOfEntityEvent.TYPE,
107+
this.#onReloadChildrenRequest as unknown as EventListener,
108+
);
109+
});
73110
}
74111

75112
#configured = false;
@@ -222,11 +259,37 @@ export class UmbDefaultCollectionContext<
222259

223260
localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(layouts));
224261
}
225-
}
226262

227-
export const UMB_COLLECTION_CONTEXT = new UmbContextToken<UmbDefaultCollectionContext>('UmbCollectionContext');
263+
#onReloadStructureRequest = (event: UmbRequestReloadStructureForEntityEvent) => {
264+
const items = this.#items.getValue();
265+
const hasItem = items.some((item) => item.unique === event.getUnique());
266+
if (hasItem) {
267+
this.requestCollection();
268+
}
269+
};
228270

229-
/**
230-
* @deprecated Use UMB_COLLECTION_CONTEXT instead.
231-
*/
232-
export { UMB_COLLECTION_CONTEXT as UMB_DEFAULT_COLLECTION_CONTEXT };
271+
#onReloadChildrenRequest = async (event: UmbRequestReloadChildrenOfEntityEvent) => {
272+
// check if the collection is in the same context as the entity from the event
273+
const entityContext = await this.getContext(UMB_ENTITY_CONTEXT);
274+
const unique = entityContext.getUnique();
275+
const entityType = entityContext.getEntityType();
276+
277+
if (unique === event.getUnique() && entityType === event.getEntityType()) {
278+
this.requestCollection();
279+
}
280+
};
281+
282+
destroy(): void {
283+
this.#actionEventContext?.removeEventListener(
284+
UmbRequestReloadStructureForEntityEvent.TYPE,
285+
this.#onReloadStructureRequest as unknown as EventListener,
286+
);
287+
288+
this.#actionEventContext?.removeEventListener(
289+
UmbRequestReloadChildrenOfEntityEvent.TYPE,
290+
this.#onReloadChildrenRequest as unknown as EventListener,
291+
);
292+
293+
super.destroy();
294+
}
295+
}

src/packages/core/collection/default/collection-default.element.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import { UMB_COLLECTION_CONTEXT, UmbDefaultCollectionContext } from './collection-default.context.js';
1+
import { UmbDefaultCollectionContext } from './collection-default.context.js';
2+
import { UMB_COLLECTION_CONTEXT } from './collection-default.context-token.js';
23
import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit';
34
import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
45
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
56
import { UmbTextStyles } from '@umbraco-cms/backoffice/style';
6-
import type { PropertyValueMap } from '@umbraco-cms/backoffice/external/lit';
77
import type { UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry';
88
import type { UmbRoute } from '@umbraco-cms/backoffice/router';
99

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export { UMB_COLLECTION_CONTEXT } from './collection-default.context-token.js';
2+
export { UmbDefaultCollectionContext } from './collection-default.context.js';

0 commit comments

Comments
 (0)