Skip to content

Commit 7ce4168

Browse files
authored
Merge pull request #2105 from umbraco/v14/bugfix/username-is-email
V14: The option `usernameIsEmail` is not supported
2 parents ed9b0b4 + 65c282c commit 7ce4168

File tree

18 files changed

+360
-7
lines changed

18 files changed

+360
-7
lines changed

src/assets/lang/da-dk.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1861,6 +1861,8 @@ export default {
18611861
lastLogin: 'Seneste login',
18621862
lastPasswordChangeDate: 'Kodeord sidst ændret',
18631863
loginname: 'Brugernavn',
1864+
loginnameRequired: 'Påkrævet - indtast et brugernavn for denne bruger',
1865+
loginnameDescription: 'Brugernavnet bruges til at logge ind og til at identificere brugeren',
18641866
mediastartnode: 'Startnode i mediearkivet',
18651867
mediastartnodehelp: 'Begræns mediebiblioteket til en bestemt startnode',
18661868
mediastartnodes: 'Medie startnoder',
@@ -1963,7 +1965,12 @@ export default {
19631965
'2faCodeInput': 'Indtast din verifikationskode',
19641966
'2faCodeInputHelp': 'Indtast din verifikationskode fra din autentificeringsapp',
19651967
'2faInvalidCode': 'Den indtastede kode er ugyldig',
1966-
emailRequired: 'Required - enter an email address for this user',
1968+
emailRequired: 'Påkrævet - indtast en emailadresse for denne bruger',
1969+
emailDescription: (usernameIsEmail: boolean) => {
1970+
return usernameIsEmail
1971+
? 'Emailadressen bruges som brugernavn og til notifikationer og adgangskode gendannelse'
1972+
: 'Emailadressen bruges til notifikationer og adgangskode gendannelse';
1973+
},
19671974
duplicateLogin: 'A user with this login already exists',
19681975
nameRequired: 'Required - enter a name for this user',
19691976
passwordRequiresDigit: "The password must have at least one digit ('0'-'9')",

src/assets/lang/en-us.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1841,6 +1841,11 @@ export default {
18411841
changePhoto: 'Change photo',
18421842
configureMfa: 'Configure MFA',
18431843
emailRequired: 'Required - enter an email address for this user',
1844+
emailDescription: (usernameIsEmail: boolean) => {
1845+
return usernameIsEmail
1846+
? 'The email address is used for notifications, password recovery, and as the username for logging in'
1847+
: 'The email address is used for notifications and password recovery';
1848+
},
18441849
newPassword: 'New password',
18451850
newPasswordFormatLengthTip: 'Minimum %0% character(s) to go!',
18461851
newPasswordFormatNonAlphaTip: 'There should be at least %0% special character(s) in there.',
@@ -1872,6 +1877,8 @@ export default {
18721877
lastLogin: 'Last login',
18731878
lastPasswordChangeDate: 'Password last changed',
18741879
loginname: 'Username',
1880+
loginnameRequired: 'Required - enter a username for this user',
1881+
loginnameDescription: 'The username is used for logging in',
18751882
mediastartnode: 'Media start node',
18761883
mediastartnodehelp: 'Limit the media library to a specific start node',
18771884
mediastartnodes: 'Media start nodes',

src/assets/lang/en.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1894,6 +1894,11 @@ export default {
18941894
changePhoto: 'Change photo',
18951895
configureMfa: 'Configure MFA',
18961896
emailRequired: 'Required - enter an email address for this user',
1897+
emailDescription: (usernameIsEmail: boolean) => {
1898+
return usernameIsEmail
1899+
? 'The email address is used for notifications, password recovery, and as the username for logging in'
1900+
: 'The email address is used for notifications and password recovery';
1901+
},
18971902
newPassword: 'New password',
18981903
newPasswordFormatLengthTip: 'Minimum %0% character(s) to go!',
18991904
newPasswordFormatNonAlphaTip: 'There should be at least %0% special character(s) in there.',
@@ -1925,6 +1930,8 @@ export default {
19251930
lastLogin: 'Last login',
19261931
lastPasswordChangeDate: 'Password last changed',
19271932
loginname: 'Username',
1933+
loginnameRequired: 'Required - enter a username for this user',
1934+
loginnameDescription: 'The username is used for logging in',
19281935
mediastartnode: 'Media start node',
19291936
mediastartnodehelp: 'Limit the media library to a specific start node',
19301937
mediastartnodes: 'Media start nodes',

src/external/backend-api/src/services.gen.ts

Lines changed: 31 additions & 1 deletion
Large diffs are not rendered by default.

src/external/backend-api/src/types.gen.ts

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,9 @@ export type CultureReponseModel = {
438438

439439
export type CurrenUserConfigurationResponseModel = {
440440
keepUserLoggedIn: boolean;
441+
/**
442+
* @deprecated
443+
*/
441444
usernameIsEmail: boolean;
442445
passwordConfiguration: PasswordConfigurationResponseModel;
443446
};
@@ -633,6 +636,9 @@ export type DocumentConfigurationResponseModel = {
633636
disableUnpublishWhenReferenced: boolean;
634637
allowEditInvariantFromNonDefault: boolean;
635638
allowNonExistingSegmentsCreation: boolean;
639+
/**
640+
* @deprecated
641+
*/
636642
reservedFieldNames: Array<(string)>;
637643
};
638644

@@ -730,6 +736,7 @@ export type DocumentTypeConfigurationResponseModel = {
730736
dataTypesCanBeChanged: DataTypeChangeModeModel;
731737
disableTemplates: boolean;
732738
useSegments: boolean;
739+
reservedFieldNames: Array<(string)>;
733740
};
734741

735742
export type DocumentTypeItemResponseModel = {
@@ -1153,6 +1160,9 @@ export type MediaCollectionResponseModel = {
11531160
export type MediaConfigurationResponseModel = {
11541161
disableDeleteWhenReferenced: boolean;
11551162
disableUnpublishWhenReferenced: boolean;
1163+
/**
1164+
* @deprecated
1165+
*/
11561166
reservedFieldNames: Array<(string)>;
11571167
};
11581168

@@ -1219,6 +1229,10 @@ export type MediaTypeCompositionResponseModel = {
12191229
icon: string;
12201230
};
12211231

1232+
export type MediaTypeConfigurationResponseModel = {
1233+
reservedFieldNames: Array<(string)>;
1234+
};
1235+
12221236
export type MediaTypeItemResponseModel = {
12231237
id: string;
12241238
name: string;
@@ -1319,6 +1333,9 @@ export type MediaVariantResponseModel = {
13191333
};
13201334

13211335
export type MemberConfigurationResponseModel = {
1336+
/**
1337+
* @deprecated
1338+
*/
13221339
reservedFieldNames: Array<(string)>;
13231340
};
13241341

@@ -1372,6 +1389,10 @@ export type MemberTypeCompositionResponseModel = {
13721389
icon: string;
13731390
};
13741391

1392+
export type MemberTypeConfigurationResponseModel = {
1393+
reservedFieldNames: Array<(string)>;
1394+
};
1395+
13751396
export type MemberTypeItemResponseModel = {
13761397
id: string;
13771398
name: string;
@@ -2597,6 +2618,7 @@ export type UpgradeSettingsResponseModel = {
25972618

25982619
export type UserConfigurationResponseModel = {
25992620
canInviteUsers: boolean;
2621+
usernameIsEmail: boolean;
26002622
passwordConfiguration: PasswordConfigurationResponseModel;
26012623
};
26022624

@@ -3850,6 +3872,8 @@ export type PostMediaTypeAvailableCompositionsData = {
38503872

38513873
export type PostMediaTypeAvailableCompositionsResponse = Array<(AvailableMediaTypeCompositionResponseModel)>;
38523874

3875+
export type GetMediaTypeConfigurationResponse = MediaTypeConfigurationResponseModel;
3876+
38533877
export type PostMediaTypeFolderData = {
38543878
requestBody?: CreateFolderRequestModel;
38553879
};
@@ -4190,6 +4214,8 @@ export type PostMemberTypeAvailableCompositionsData = {
41904214

41914215
export type PostMemberTypeAvailableCompositionsResponse = Array<(AvailableMemberTypeCompositionResponseModel)>;
41924216

4217+
export type GetMemberTypeConfigurationResponse = MemberTypeConfigurationResponseModel;
4218+
41934219
export type GetTreeMemberTypeRootData = {
41944220
skip?: number;
41954221
take?: number;
@@ -8784,6 +8810,24 @@ export type $OpenApiTs = {
87848810
};
87858811
};
87868812
};
8813+
'/umbraco/management/api/v1/media-type/configuration': {
8814+
get: {
8815+
res: {
8816+
/**
8817+
* OK
8818+
*/
8819+
200: MediaTypeConfigurationResponseModel;
8820+
/**
8821+
* The resource is protected and requires an authentication token
8822+
*/
8823+
401: unknown;
8824+
/**
8825+
* The authenticated user do not have access to this resource
8826+
*/
8827+
403: unknown;
8828+
};
8829+
};
8830+
};
87878831
'/umbraco/management/api/v1/media-type/folder': {
87888832
post: {
87898833
req: PostMediaTypeFolderData;
@@ -9913,6 +9957,24 @@ export type $OpenApiTs = {
99139957
};
99149958
};
99159959
};
9960+
'/umbraco/management/api/v1/member-type/configuration': {
9961+
get: {
9962+
res: {
9963+
/**
9964+
* OK
9965+
*/
9966+
200: MemberTypeConfigurationResponseModel;
9967+
/**
9968+
* The resource is protected and requires an authentication token
9969+
*/
9970+
401: unknown;
9971+
/**
9972+
* The authenticated user do not have access to this resource
9973+
*/
9974+
403: unknown;
9975+
};
9976+
};
9977+
};
99169978
'/umbraco/management/api/v1/tree/member-type/root': {
99179979
get: {
99189980
req: GetTreeMemberTypeRootData;

src/packages/core/store/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
export * from './store-base.js';
2+
export * from './store-object-base.js';
23
export * from './store.interface.js';
34
export * from './events/index.js';
45

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import { UmbStoreUpdateEvent } from './events/index.js';
2+
import { UmbContextBase } from '@umbraco-cms/backoffice/class-api';
3+
import { type Observable, UmbObjectState } from '@umbraco-cms/backoffice/observable-api';
4+
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
5+
import type { UmbApi } from '@umbraco-cms/backoffice/extension-api';
6+
7+
/**
8+
* The base class for a store that holds an object.
9+
*/
10+
export class UmbStoreObjectBase<T> extends UmbContextBase<never> implements UmbApi {
11+
protected _data;
12+
13+
constructor(host: UmbControllerHost, storeAlias: string, initialData?: T) {
14+
super(host, storeAlias);
15+
this._data = new UmbObjectState<T | null>(initialData ?? null);
16+
}
17+
18+
/**
19+
* Updates the store with the given data
20+
* @param data - The (partial) data to update the store with
21+
* @memberof UmbStoreObjectBase
22+
*/
23+
update(data: Partial<T>) {
24+
this._data.update(data);
25+
this.dispatchEvent(new UmbStoreUpdateEvent([]));
26+
}
27+
28+
/**
29+
* Returns the current state of the store
30+
* @memberof UmbStoreObjectBase
31+
*/
32+
getState() {
33+
return this._data.getValue();
34+
}
35+
36+
/**
37+
* Returns an observable of the store
38+
* @memberof UmbStoreObjectBase
39+
*/
40+
all() {
41+
return this._data.asObservable();
42+
}
43+
44+
/**
45+
* Returns an observable of a part of the store
46+
* @param key - The key of the part to return
47+
* @memberof UmbStoreObjectBase
48+
*/
49+
part<Part extends keyof T>(key: Part): Observable<T[Part]> {
50+
return this._data.asObservablePart((data) => data![key]);
51+
}
52+
53+
/**
54+
* Destroys the store
55+
* @memberof UmbStoreObjectBase
56+
*/
57+
override destroy() {
58+
this._data.destroy();
59+
}
60+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export const UMB_USER_CONFIG_REPOSITORY_ALIAS = 'Umb.Repository.User.Config';
2+
export const UMB_USER_CONFIG_STORE_ALIAS = 'Umb.Store.User.Config';
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export * from './constants.js';
2+
export * from './user-config.repository.js';
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { UMB_USER_CONFIG_REPOSITORY_ALIAS, UMB_USER_CONFIG_STORE_ALIAS } from './constants.js';
2+
import type { ManifestRepository, ManifestStore, ManifestTypes } from '@umbraco-cms/backoffice/extension-registry';
3+
4+
const store: ManifestStore = {
5+
type: 'store',
6+
alias: UMB_USER_CONFIG_STORE_ALIAS,
7+
name: 'User Config Store',
8+
api: () => import('./user-config.store.js'),
9+
};
10+
11+
const repository: ManifestRepository = {
12+
type: 'repository',
13+
alias: UMB_USER_CONFIG_REPOSITORY_ALIAS,
14+
name: 'User Config Repository',
15+
api: () => import('./user-config.repository.js'),
16+
};
17+
18+
export const manifests: Array<ManifestTypes> = [repository, store];

0 commit comments

Comments
 (0)