Skip to content

Commit ead29a2

Browse files
authored
Merge pull request #18221 from umbraco/v15/feature/block-type-element-not-found
Feature: block type element not found
2 parents 59c2205 + fdfbd5f commit ead29a2

File tree

4 files changed

+93
-11
lines changed

4 files changed

+93
-11
lines changed

src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -868,6 +868,7 @@ export default {
868868
next: 'Next',
869869
no: 'No',
870870
nodeName: 'Node Name',
871+
notFound: 'Not found',
871872
of: 'of',
872873
off: 'Off',
873874
ok: 'OK',

src/Umbraco.Web.UI.Client/src/assets/lang/en.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -865,6 +865,7 @@ export default {
865865
next: 'Next',
866866
no: 'No',
867867
nodeName: 'Node Name',
868+
notFound: 'Not found',
868869
of: 'of',
869870
off: 'Off',
870871
ok: 'OK',

src/Umbraco.Web.UI.Client/src/packages/block/block-type/components/block-type-card/block-type-card.element.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,12 +80,17 @@ export class UmbBlockTypeCardElement extends UmbLitElement {
8080
this.#serverUrl = appContext.getServerUrl();
8181
});
8282

83-
this.observe(this.#itemManager.items, (items) => {
84-
const item = items[0];
85-
if (item) {
83+
this.observe(this.#itemManager.statuses, async (statuses) => {
84+
const status = statuses[0];
85+
if (status?.state.type === 'success') {
86+
const item = await this.#itemManager.getItemByUnique(status.unique);
8687
this._fallbackIcon = item.icon;
8788
this._name = item.name ? this.localize.string(item.name) : this.localize.term('general_unknown');
8889
this._description = this.localize.string(item.description);
90+
} else if (status?.state.type === 'error') {
91+
this._fallbackIcon = 'icon-alert';
92+
this._name = this.localize.term('blockEditor_elementTypeDoesNotExistHeadline');
93+
this._description = this.localize.term('blockEditor_elementTypeDoesNotExistDescription');
8994
}
9095
});
9196
}

src/Umbraco.Web.UI.Client/src/packages/core/repository/repository-items.manager.ts

Lines changed: 83 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,14 @@ import { UmbEntityUpdatedEvent } from '@umbraco-cms/backoffice/entity-action';
1010

1111
const ObserveRepositoryAlias = Symbol();
1212

13-
// TODO: v16 - add entityType to the type
13+
interface UmbRepositoryItemsStatus {
14+
state: {
15+
type: 'success' | 'error' | 'loading';
16+
error?: string;
17+
};
18+
unique: string;
19+
}
20+
1421
export class UmbRepositoryItemsManager<ItemType extends { unique: string }> extends UmbControllerBase {
1522
//
1623
repository?: UmbItemRepository<ItemType>;
@@ -31,6 +38,9 @@ export class UmbRepositoryItemsManager<ItemType extends { unique: string }> exte
3138
#items = new UmbArrayState<ItemType>([], (x) => this.#getUnique(x));
3239
items = this.#items.asObservable();
3340

41+
#statuses = new UmbArrayState<UmbRepositoryItemsStatus>([], (x) => x.unique);
42+
statuses = this.#statuses.asObservable();
43+
3444
/**
3545
* Creates an instance of UmbRepositoryItemsManager.
3646
* @param {UmbControllerHost} host - The host for the controller.
@@ -91,13 +101,12 @@ export class UmbRepositoryItemsManager<ItemType extends { unique: string }> exte
91101
);
92102

93103
this.consumeContext(UMB_ACTION_EVENT_CONTEXT, (context) => {
94-
this.#eventContext = context;
95-
96-
this.#eventContext.removeEventListener(
104+
this.#eventContext?.removeEventListener(
97105
UmbEntityUpdatedEvent.TYPE,
98106
this.#onEntityUpdatedEvent as unknown as EventListener,
99107
);
100108

109+
this.#eventContext = context;
101110
this.#eventContext.addEventListener(
102111
UmbEntityUpdatedEvent.TYPE,
103112
this.#onEntityUpdatedEvent as unknown as EventListener,
@@ -133,22 +142,78 @@ export class UmbRepositoryItemsManager<ItemType extends { unique: string }> exte
133142
await this.#init;
134143
if (!this.repository) throw new Error('Repository is not initialized');
135144

145+
const requestedUniques = this.getUniques();
146+
147+
this.#statuses.setValue(
148+
requestedUniques.map((unique) => ({
149+
state: {
150+
type: 'loading',
151+
},
152+
unique,
153+
})),
154+
);
155+
136156
// TODO: Test if its just some items that is gone now, if so then just filter them out. (maybe use code from #removeItem)
137157
// This is where this.#getUnique comes in play. Unless that can come from the repository, but that collides with the idea of having a multi-type repository. If that happens.
138-
const request = this.repository.requestItems(this.getUniques());
158+
const request = this.repository.requestItems(requestedUniques);
139159
this.#currentRequest = request;
140-
const { asObservable } = await request;
160+
const { asObservable, data, error } = await request;
141161

142162
if (this.#currentRequest !== request) {
143163
// You are not the newest request, so please back out.
144164
return;
145165
}
146166

167+
if (error) {
168+
this.#statuses.append(
169+
requestedUniques.map((unique) => ({
170+
state: {
171+
type: 'error',
172+
error: '#general_error',
173+
},
174+
unique,
175+
})),
176+
);
177+
return;
178+
}
179+
180+
// find uniques not resolved:
181+
if (data) {
182+
// find rejected uniques:
183+
const rejectedUniques = requestedUniques.filter(
184+
(unique) => !data.find((item) => this.#getUnique(item) === unique),
185+
);
186+
const resolvedUniques = requestedUniques.filter((unique) => !rejectedUniques.includes(unique));
187+
this.#items.remove(rejectedUniques);
188+
189+
this.#statuses.append([
190+
...rejectedUniques.map(
191+
(unique) =>
192+
({
193+
state: {
194+
type: 'error',
195+
error: '#general_notFound',
196+
},
197+
unique,
198+
}) as UmbRepositoryItemsStatus,
199+
),
200+
...resolvedUniques.map(
201+
(unique) =>
202+
({
203+
state: {
204+
type: 'success',
205+
},
206+
unique,
207+
}) as UmbRepositoryItemsStatus,
208+
),
209+
]);
210+
}
211+
147212
if (asObservable) {
148213
this.observe(
149214
asObservable(),
150215
(data) => {
151-
this.#items.setValue(this.#sortByUniques(data));
216+
this.#items.append(this.#sortByUniques(data));
152217
},
153218
ObserveRepositoryAlias,
154219
);
@@ -159,7 +224,17 @@ export class UmbRepositoryItemsManager<ItemType extends { unique: string }> exte
159224
await this.#init;
160225
if (!this.repository) throw new Error('Repository is not initialized');
161226

162-
const { data } = await this.repository.requestItems([unique]);
227+
const { data, error } = await this.repository.requestItems([unique]);
228+
229+
if (error) {
230+
this.#statuses.appendOne({
231+
state: {
232+
type: 'error',
233+
error: '#general_notFound',
234+
},
235+
unique,
236+
} as UmbRepositoryItemsStatus);
237+
}
163238

164239
if (data) {
165240
const items = this.getItems();

0 commit comments

Comments
 (0)