Skip to content

Commit 51fb724

Browse files
committed
align member
1 parent 658ae0d commit 51fb724

File tree

5 files changed

+137
-58
lines changed

5 files changed

+137
-58
lines changed

src/packages/documents/documents/workspace/document-workspace.context.ts

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ export class UmbDocumentWorkspaceContext
9191
public readonly repository = new UmbDocumentDetailRepository(this);
9292
public readonly publishingRepository = new UmbDocumentPublishingRepository(this);
9393

94-
#parent = new UmbObjectState<{ entityType: string; unique: string | null } | undefined>(undefined);
94+
#parent = new UmbObjectState<UmbEntityModel | undefined>(undefined);
9595
readonly parentUnique = this.#parent.asObservablePart((parent) => (parent ? parent.unique : undefined));
9696
readonly parentEntityType = this.#parent.asObservablePart((parent) => (parent ? parent.entityType : undefined));
9797

@@ -106,7 +106,7 @@ export class UmbDocumentWorkspaceContext
106106
#serverValidation = new UmbServerModelValidatorContext(this);
107107
#validationRepository?: UmbDocumentValidationRepository;
108108

109-
public readOnlyState = new UmbReadOnlyVariantStateManager(this);
109+
public readonly readOnlyState = new UmbReadOnlyVariantStateManager(this);
110110

111111
public isLoaded() {
112112
return this.#getDataPromise;
@@ -124,9 +124,6 @@ export class UmbDocumentWorkspaceContext
124124

125125
readonly variants = this.#data.createObservablePartOfCurrent((data) => data?.variants ?? []);
126126

127-
readonly urls = this.#data.createObservablePartOfCurrent((data) => data?.urls || []);
128-
readonly templateId = this.#data.createObservablePartOfCurrent((data) => data?.template?.unique || null);
129-
130127
readonly structure = new UmbContentTypeStructureManager(this, new UmbDocumentTypeDetailRepository(this));
131128
readonly variesByCulture = this.structure.ownerContentTypeObservablePart((x) => x?.variesByCulture);
132129
readonly variesBySegment = this.structure.ownerContentTypeObservablePart((x) => x?.variesBySegment);
@@ -137,6 +134,9 @@ export class UmbDocumentWorkspaceContext
137134
#variesByCulture?: boolean;
138135
#variesBySegment?: boolean;
139136

137+
readonly urls = this.#data.createObservablePartOfCurrent((data) => data?.urls || []);
138+
readonly templateId = this.#data.createObservablePartOfCurrent((data) => data?.template?.unique || null);
139+
140140
readonly #dataTypeItemManager = new UmbDataTypeItemRepositoryManager(this);
141141
#dataTypeSchemaAliasMap = new Map<string, string>();
142142

@@ -518,7 +518,6 @@ export class UmbDocumentWorkspaceContext
518518

519519
const { data, error } = await this.repository.create(saveData, parent.unique);
520520
if (!data || error) {
521-
console.error('Error creating document', error);
522521
throw new Error('Error creating document');
523522
}
524523

@@ -547,7 +546,6 @@ export class UmbDocumentWorkspaceContext
547546
// Save:
548547
const { data, error } = await this.repository.save(saveData);
549548
if (!data || error) {
550-
console.error('Error saving document', error);
551549
throw new Error('Error saving document');
552550
}
553551

src/packages/members/member/index.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import './components/index.js';
22

3-
export * from './entity.js';
3+
export * from './collection/index.js';
44
export * from './components/index.js';
5+
export * from './entity.js';
6+
export * from './paths.js';
57
export * from './repository/index.js';
6-
export * from './collection/index.js';
8+
export type * from './types.js';

src/packages/members/member/utils.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import type { UmbMemberVariantOptionModel } from './types.js';
2+
3+
type VariantType = UmbMemberVariantOptionModel;
4+
5+
export const sortVariants = (a: VariantType, b: VariantType) => {
6+
const compareDefault = (a: VariantType, b: VariantType) =>
7+
(a.language?.isDefault ? -1 : 1) - (b.language?.isDefault ? -1 : 1);
8+
9+
// Make sure mandatory variants goes on top.
10+
const compareMandatory = (a: VariantType, b: VariantType) =>
11+
(a.language?.isMandatory ? -1 : 1) - (b.language?.isMandatory ? -1 : 1);
12+
13+
const compareName = (a: VariantType, b: VariantType) => a.variant?.name.localeCompare(b.variant?.name || '') || 99;
14+
15+
return compareDefault(a, b) || compareMandatory(a, b) || compareName(a, b);
16+
};

src/packages/members/member/workspace/member/member-workspace.context.ts

Lines changed: 111 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,26 @@ import type {
66
UmbMemberVariantOptionModel,
77
} from '../../types.js';
88
import { UmbMemberPropertyDatasetContext } from '../../property-dataset-context/member-property-dataset-context.js';
9+
import { UMB_MEMBER_ENTITY_TYPE, UMB_MEMBER_ROOT_ENTITY_TYPE } from '../../entity.js';
10+
import { sortVariants } from '../../utils.js';
11+
import { UMB_MEMBER_MANAGEMENT_SECTION_PATH } from '../../../section/index.js';
912
import { UMB_MEMBER_WORKSPACE_ALIAS } from './manifests.js';
1013
import { UmbMemberWorkspaceEditorElement } from './member-workspace-editor.element.js';
1114
import { UMB_MEMBER_DETAIL_MODEL_VARIANT_SCAFFOLD } from './constants.js';
1215
import { UmbMemberTypeDetailRepository, type UmbMemberTypeDetailModel } from '@umbraco-cms/backoffice/member-type';
1316
import {
1417
UmbSubmittableWorkspaceContextBase,
1518
UmbWorkspaceIsNewRedirectController,
19+
UmbWorkspaceIsNewRedirectControllerAlias,
1620
UmbWorkspaceSplitViewManager,
1721
} from '@umbraco-cms/backoffice/workspace';
1822
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
19-
import { UmbArrayState, appendToFrozenArray, mergeObservables } from '@umbraco-cms/backoffice/observable-api';
23+
import {
24+
UmbArrayState,
25+
UmbObjectState,
26+
appendToFrozenArray,
27+
mergeObservables,
28+
} from '@umbraco-cms/backoffice/observable-api';
2029
import { UmbContentTypeStructureManager } from '@umbraco-cms/backoffice/content-type';
2130
import { UMB_INVARIANT_CULTURE, UmbVariantId } from '@umbraco-cms/backoffice/variant';
2231
import type { UmbLanguageDetailModel } from '@umbraco-cms/backoffice/language';
@@ -25,6 +34,13 @@ import type { UmbDataSourceResponse } from '@umbraco-cms/backoffice/repository';
2534
import { UmbContentWorkspaceDataManager, type UmbContentWorkspaceContext } from '@umbraco-cms/backoffice/content';
2635
import { UmbReadOnlyVariantStateManager } from '@umbraco-cms/backoffice/utils';
2736
import { UmbDataTypeItemRepositoryManager } from '@umbraco-cms/backoffice/data-type';
37+
import { map } from '@umbraco-cms/backoffice/external/rxjs';
38+
import { UmbEntityContext, type UmbEntityModel } from '@umbraco-cms/backoffice/entity';
39+
import {
40+
UmbRequestReloadChildrenOfEntityEvent,
41+
UmbRequestReloadStructureForEntityEvent,
42+
} from '@umbraco-cms/backoffice/entity-action';
43+
import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action';
2844

2945
type EntityModel = UmbMemberDetailModel;
3046
export class UmbMemberWorkspaceContext
@@ -35,6 +51,10 @@ export class UmbMemberWorkspaceContext
3551

3652
public readonly repository = new UmbMemberDetailRepository(this);
3753

54+
#parent = new UmbObjectState<UmbEntityModel | undefined>({ entityType: UMB_MEMBER_ROOT_ENTITY_TYPE, unique: null });
55+
readonly parentUnique = this.#parent.asObservablePart((parent) => (parent ? parent.unique : undefined));
56+
readonly parentEntityType = this.#parent.asObservablePart((parent) => (parent ? parent.entityType : undefined));
57+
3858
readonly #data = new UmbContentWorkspaceDataManager<EntityModel>(this, UMB_MEMBER_DETAIL_MODEL_VARIANT_SCAFFOLD);
3959
#getDataPromise?: Promise<UmbDataSourceResponse<UmbMemberDetailModel>>;
4060

@@ -43,7 +63,7 @@ export class UmbMemberWorkspaceContext
4363
#languages = new UmbArrayState<UmbLanguageDetailModel>([], (x) => x.unique);
4464
public readonly languages = this.#languages.asObservable();
4565

46-
readOnlyState = new UmbReadOnlyVariantStateManager(this);
66+
public readonly readOnlyState = new UmbReadOnlyVariantStateManager(this);
4767

4868
public isLoaded() {
4969
return this.#getDataPromise;
@@ -54,7 +74,8 @@ export class UmbMemberWorkspaceContext
5474
readonly createDate = this.#data.createObservablePartOfCurrent((data) => data?.variants[0].createDate);
5575
readonly updateDate = this.#data.createObservablePartOfCurrent((data) => data?.variants[0].updateDate);
5676
readonly contentTypeUnique = this.#data.createObservablePartOfCurrent((data) => data?.memberType.unique);
57-
readonly kind = this.#data.createObservablePartOfCurrent((data) => data?.kind);
77+
78+
readonly variants = this.#data.createObservablePartOfCurrent((data) => data?.variants ?? []);
5879

5980
readonly structure = new UmbContentTypeStructureManager(this, new UmbMemberTypeDetailRepository(this));
6081
readonly variesByCulture = this.structure.ownerContentTypeObservablePart((x) => x?.variesByCulture);
@@ -66,7 +87,7 @@ export class UmbMemberWorkspaceContext
6687
#variesByCulture?: boolean;
6788
#variesBySegment?: boolean;
6889

69-
readonly variants = this.#data.createObservablePartOfCurrent((data) => data?.variants ?? []);
90+
readonly kind = this.#data.createObservablePartOfCurrent((data) => data?.kind);
7091

7192
readonly #dataTypeItemManager = new UmbDataTypeItemRepositoryManager(this);
7293
#dataTypeSchemaAliasMap = new Map<string, string>();
@@ -102,35 +123,51 @@ export class UmbMemberWorkspaceContext
102123
}
103124
return [] as Array<UmbMemberVariantOptionModel>;
104125
},
105-
);
126+
).pipe(map((results) => results.sort(sortVariants)));
127+
128+
// TODO: this should be set up for all entity workspace contexts in a base class
129+
#entityContext = new UmbEntityContext(this);
106130

107131
constructor(host: UmbControllerHost) {
108132
super(host, UMB_MEMBER_WORKSPACE_ALIAS);
109133

110-
this.observe(this.contentTypeUnique, (unique) => this.structure.loadType(unique));
111-
112-
this.observe(this.variesByCulture, (varies) => {
113-
this.#data.setVariesByCulture(varies);
114-
this.#variesByCulture = varies;
115-
});
116-
this.observe(this.variesBySegment, (varies) => {
117-
this.#data.setVariesBySegment(varies);
118-
this.#variesBySegment = varies;
119-
});
120-
this.observe(this.varies, (varies) => (this.#varies = varies));
121-
122-
this.observe(this.structure.contentTypeDataTypeUniques, (dataTypeUniques: Array<string>) => {
123-
this.#dataTypeItemManager.setUniques(dataTypeUniques);
124-
});
125-
126-
this.observe(this.#dataTypeItemManager.items, (dataTypes) => {
127-
// Make a map of the data type unique and editorAlias:
128-
this.#dataTypeSchemaAliasMap = new Map(
129-
dataTypes.map((dataType) => {
130-
return [dataType.unique, dataType.propertyEditorSchemaAlias];
131-
}),
132-
);
133-
});
134+
this.observe(this.contentTypeUnique, (unique) => this.structure.loadType(unique), null);
135+
this.observe(this.varies, (varies) => (this.#varies = varies), null);
136+
this.observe(
137+
this.variesByCulture,
138+
(varies) => {
139+
this.#data.setVariesByCulture(varies);
140+
this.#variesByCulture = varies;
141+
},
142+
null,
143+
);
144+
this.observe(
145+
this.variesBySegment,
146+
(varies) => {
147+
this.#data.setVariesBySegment(varies);
148+
this.#variesBySegment = varies;
149+
},
150+
null,
151+
);
152+
this.observe(
153+
this.structure.contentTypeDataTypeUniques,
154+
(dataTypeUniques: Array<string>) => {
155+
this.#dataTypeItemManager.setUniques(dataTypeUniques);
156+
},
157+
null,
158+
);
159+
this.observe(
160+
this.#dataTypeItemManager.items,
161+
(dataTypes) => {
162+
// Make a map of the data type unique and editorAlias:
163+
this.#dataTypeSchemaAliasMap = new Map(
164+
dataTypes.map((dataType) => {
165+
return [dataType.unique, dataType.propertyEditorSchemaAlias];
166+
}),
167+
);
168+
},
169+
null,
170+
);
134171
this.loadLanguages();
135172

136173
this.routes.setRoutes([
@@ -152,6 +189,7 @@ export class UmbMemberWorkspaceContext
152189
path: 'edit/:unique',
153190
component: () => new UmbMemberWorkspaceEditorElement(),
154191
setup: (_component, info) => {
192+
this.removeUmbControllerByAlias(UmbWorkspaceIsNewRedirectControllerAlias);
155193
const unique = info.match.params.unique;
156194
this.load(unique);
157195
},
@@ -161,8 +199,7 @@ export class UmbMemberWorkspaceContext
161199

162200
override resetState() {
163201
super.resetState();
164-
this.#data.setPersisted(undefined);
165-
this.#data.setCurrent(undefined);
202+
this.#data.clear();
166203
}
167204

168205
async loadLanguages() {
@@ -178,6 +215,8 @@ export class UmbMemberWorkspaceContext
178215
const { data, asObservable } = (await this.#getDataPromise) as GetDataType;
179216

180217
if (data) {
218+
this.#entityContext.setEntityType(UMB_MEMBER_ENTITY_TYPE);
219+
this.#entityContext.setUnique(unique);
181220
this.setIsNew(false);
182221
this.#data.setPersisted(data);
183222
this.#data.setCurrent(data);
@@ -189,7 +228,7 @@ export class UmbMemberWorkspaceContext
189228
#onMemberStoreChange(member: EntityModel | undefined) {
190229
if (!member) {
191230
//TODO: This solution is alright for now. But reconsider when we introduce signal-r
192-
history.pushState(null, '', 'section/member-management');
231+
history.pushState(null, '', UMB_MEMBER_MANAGEMENT_SECTION_PATH);
193232
}
194233
}
195234

@@ -203,6 +242,8 @@ export class UmbMemberWorkspaceContext
203242
const { data } = await this.#getDataPromise;
204243
if (!data) return undefined;
205244

245+
this.#entityContext.setEntityType(UMB_MEMBER_ENTITY_TYPE);
246+
this.#entityContext.setUnique(data.unique);
206247
this.setIsNew(true);
207248
this.#data.setPersisted(undefined);
208249
this.#data.setCurrent(data);
@@ -214,11 +255,11 @@ export class UmbMemberWorkspaceContext
214255
}
215256

216257
getUnique() {
217-
return this.getData()?.unique || '';
258+
return this.getData()?.unique;
218259
}
219260

220261
getEntityType() {
221-
return 'member';
262+
return UMB_MEMBER_ENTITY_TYPE;
222263
}
223264

224265
getContentTypeId() {
@@ -336,35 +377,56 @@ export class UmbMemberWorkspaceContext
336377
this.#data.finishPropertyValueChange();
337378
};
338379

339-
async submit() {
380+
async #handleSave() {
340381
const current = this.#data.getCurrent();
341382
if (!current) throw new Error('Data is missing');
342383
if (!current.unique) throw new Error('Unique is missing');
343384

344-
let newData = undefined;
345-
346385
if (this.getIsNew()) {
347-
const { data } = await this.repository.create(current);
348-
if (!data) {
386+
// Create:
387+
const parent = this.#parent.getValue();
388+
if (!parent) throw new Error('Parent is not set');
389+
390+
const { data, error } = await this.repository.create(current);
391+
if (!data || error) {
349392
throw new Error('Could not create member.');
350393
}
351-
newData = data;
394+
352395
this.setIsNew(false);
396+
this.#data.setPersisted(data);
397+
// TODO: Missing variant data filtering.
398+
this.#data.setCurrent(data);
399+
400+
const eventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT);
401+
const event = new UmbRequestReloadChildrenOfEntityEvent({
402+
entityType: parent.entityType,
403+
unique: parent.unique,
404+
});
405+
eventContext.dispatchEvent(event);
353406
} else {
354-
const { data } = await this.repository.save(current);
355-
if (!data) {
356-
throw new Error('Could not create member.');
407+
// Save:
408+
const { data, error } = await this.repository.save(current);
409+
if (!data || error) {
410+
throw new Error('Could not update member.');
357411
}
358-
newData = data;
359-
}
412+
this.#data.setPersisted(data);
413+
// TODO: Missing variant data filtering.
414+
this.#data.setCurrent(data);
415+
416+
const eventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT);
417+
const event = new UmbRequestReloadStructureForEntityEvent({
418+
entityType: this.getEntityType(),
419+
unique: this.getUnique()!,
420+
});
360421

361-
if (newData) {
362-
this.#data.setPersisted(newData);
363-
// TODO: Only update the variants that was chosen to be saved:
364-
//this.#data.setCurrentData(newData);
422+
eventContext.dispatchEvent(event);
365423
}
366424
}
367425

426+
async submit() {
427+
return this.#handleSave();
428+
}
429+
368430
async delete() {
369431
const id = this.getUnique();
370432
if (id) {

src/packages/members/section/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
export * from './constants.js';
2+
export * from './paths.js';

0 commit comments

Comments
 (0)