diff --git a/src/Umbraco.Web.UI.Client/.eslintrc.json b/src/Umbraco.Web.UI.Client/.eslintrc.json index 62976c7e21..88caa66773 100644 --- a/src/Umbraco.Web.UI.Client/.eslintrc.json +++ b/src/Umbraco.Web.UI.Client/.eslintrc.json @@ -2,6 +2,12 @@ "ignorePatterns": ["vite.*.ts"], "root": true, "plugins": ["eslint-plugin-local-rules"], + "parserOptions": { + "ecmaVersion": "latest" + }, + "env": { + "es6": true + }, "overrides": [ { "files": ["**/*.ts"], @@ -37,6 +43,7 @@ "local-rules/prefer-import-aliases": "error", "local-rules/enforce-element-suffix-on-element-class-name": "error", "local-rules/prefer-umbraco-cms-imports": "error", + "local-rules/no-external-imports": "error", "@typescript-eslint/no-non-null-assertion": "off" }, "settings": { diff --git a/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs b/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs index eb0fb35f03..ed1c5036cd 100644 --- a/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs +++ b/src/Umbraco.Web.UI.Client/eslint-local-rules.cjs @@ -43,7 +43,7 @@ module.exports = { type: 'suggestion', docs: { description: - 'Ensures that any API resources from the `@umbraco-cms/backend-api` module are not used directly. Instead you should use the `tryExecuteAndNotify` function from the `@umbraco-cms/resources` module.', + 'Ensures that any API resources from the `@umbraco-cms/backoffice/backend-api` module are not used directly. Instead you should use the `tryExecuteAndNotify` function from the `@umbraco-cms/resources` module.', category: 'Best Practices', recommended: true, }, @@ -107,6 +107,7 @@ module.exports = { }; }, }, + /** @type {import('eslint').Rule.RuleModule} */ 'enforce-element-suffix-on-element-class-name': { meta: { @@ -116,6 +117,7 @@ module.exports = { category: 'Naming', recommended: true, }, + schema: [], }, create: function (context) { return { @@ -137,6 +139,7 @@ module.exports = { }; }, }, + // TODO: Its not bullet proof, but it will catch most/some cases. /** @type {import('eslint').Rule.RuleModule} */ 'prefer-umbraco-cms-imports': { @@ -171,4 +174,35 @@ module.exports = { }; }, }, + + /** @type {import('eslint').Rule.RuleModule} */ + 'no-external-imports': { + meta: { + type: 'problem', + docs: { + description: + 'Ensures that the application does not rely on imports from external packages. Instead, use the @umbraco-cms/backoffice libs.', + recommended: true, + }, + fixable: 'code', + schema: [], + }, + create: function (context) { + return { + ImportDeclaration: function (node) { + // Check for imports from "router-slot" + if (node.source.value.startsWith('router-slot')) { + context.report({ + node, + message: + 'Use the `@umbraco-cms/backoffice/router` package instead of importing directly from "router-slot" because we might change that dependency in the future.', + fix: (fixer) => { + return fixer.replaceTextRange(node.source.range, `'@umbraco-cms/backoffice/router'`); + }, + }); + } + }, + }; + }, + }, }; diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/index.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/index.ts index 5e9a463517..9919e60217 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/index.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/index.ts @@ -10,6 +10,7 @@ export type { AuditLogBaseModel } from './models/AuditLogBaseModel'; export type { AuditLogResponseModel } from './models/AuditLogResponseModel'; export type { AuditLogWithUsernameResponseModel } from './models/AuditLogWithUsernameResponseModel'; export { AuditTypeModel } from './models/AuditTypeModel'; +export type { ChangePasswordUserRequestModel } from './models/ChangePasswordUserRequestModel'; export type { ConsentLevelPresentationModel } from './models/ConsentLevelPresentationModel'; export type { ContentResponseModelBaseDocumentValueModelDocumentVariantResponseModel } from './models/ContentResponseModelBaseDocumentValueModelDocumentVariantResponseModel'; export { ContentStateModel } from './models/ContentStateModel'; @@ -33,22 +34,31 @@ export type { CreateMediaRequestModel } from './models/CreateMediaRequestModel'; export type { CreatePackageRequestModel } from './models/CreatePackageRequestModel'; export type { CreateRelationTypeRequestModel } from './models/CreateRelationTypeRequestModel'; export type { CreateTemplateRequestModel } from './models/CreateTemplateRequestModel'; +export type { CreateUserRequestModel } from './models/CreateUserRequestModel'; +export type { CreateUserResponseModel } from './models/CreateUserResponseModel'; export type { CultureReponseModel } from './models/CultureReponseModel'; export type { DatabaseInstallResponseModel } from './models/DatabaseInstallResponseModel'; export type { DatabaseSettingsPresentationModel } from './models/DatabaseSettingsPresentationModel'; +export type { DataTypeItemResponseModel } from './models/DataTypeItemResponseModel'; export type { DataTypeModelBaseModel } from './models/DataTypeModelBaseModel'; export type { DataTypePropertyPresentationModel } from './models/DataTypePropertyPresentationModel'; export type { DataTypePropertyReferenceModel } from './models/DataTypePropertyReferenceModel'; export type { DataTypeReferenceResponseModel } from './models/DataTypeReferenceResponseModel'; export type { DataTypeResponseModel } from './models/DataTypeResponseModel'; +export type { DictionaryItemItemResponseModel } from './models/DictionaryItemItemResponseModel'; export type { DictionaryItemModelBaseModel } from './models/DictionaryItemModelBaseModel'; export type { DictionaryItemResponseModel } from './models/DictionaryItemResponseModel'; export type { DictionaryItemTranslationModel } from './models/DictionaryItemTranslationModel'; export type { DictionaryOverviewResponseModel } from './models/DictionaryOverviewResponseModel'; export { DirectionModel } from './models/DirectionModel'; +export type { DisableUserRequestModel } from './models/DisableUserRequestModel'; +export type { DocumentBlueprintResponseModel } from './models/DocumentBlueprintResponseModel'; export type { DocumentBlueprintTreeItemResponseModel } from './models/DocumentBlueprintTreeItemResponseModel'; +export type { DocumentItemResponseModel } from './models/DocumentItemResponseModel'; +export type { DocumentNotificationResponseModel } from './models/DocumentNotificationResponseModel'; export type { DocumentResponseModel } from './models/DocumentResponseModel'; export type { DocumentTreeItemResponseModel } from './models/DocumentTreeItemResponseModel'; +export type { DocumentTypeItemResponseModel } from './models/DocumentTypeItemResponseModel'; export type { DocumentTypePropertyTypeContainerResponseModel } from './models/DocumentTypePropertyTypeContainerResponseModel'; export type { DocumentTypePropertyTypeResponseModel } from './models/DocumentTypePropertyTypeResponseModel'; export type { DocumentTypeResponseModel } from './models/DocumentTypeResponseModel'; @@ -59,8 +69,10 @@ export type { DocumentVariantResponseModel } from './models/DocumentVariantRespo export type { DomainPresentationModel } from './models/DomainPresentationModel'; export type { DomainsPresentationModelBaseModel } from './models/DomainsPresentationModelBaseModel'; export type { DomainsResponseModel } from './models/DomainsResponseModel'; +export type { EnableUserRequestModel } from './models/EnableUserRequestModel'; export type { EntityTreeItemResponseModel } from './models/EntityTreeItemResponseModel'; export type { FieldPresentationModel } from './models/FieldPresentationModel'; +export type { FileItemResponseModelBaseModel } from './models/FileItemResponseModelBaseModel'; export type { FileSystemTreeItemPresentationModel } from './models/FileSystemTreeItemPresentationModel'; export type { FolderModelBaseModel } from './models/FolderModelBaseModel'; export type { FolderReponseModel } from './models/FolderReponseModel'; @@ -76,11 +88,13 @@ export type { HealthCheckResultResponseModel } from './models/HealthCheckResultR export type { HealthCheckWithResultPresentationModel } from './models/HealthCheckWithResultPresentationModel'; export { HealthStatusModel } from './models/HealthStatusModel'; export type { HelpPageResponseModel } from './models/HelpPageResponseModel'; -export type { ImportDictionaryItemsPresentationModel } from './models/ImportDictionaryItemsPresentationModel'; export type { ImportDictionaryRequestModel } from './models/ImportDictionaryRequestModel'; export type { IndexResponseModel } from './models/IndexResponseModel'; export type { InstallSettingsResponseModel } from './models/InstallSettingsResponseModel'; export type { InstallVResponseModel } from './models/InstallVResponseModel'; +export type { InviteUserRequestModel } from './models/InviteUserRequestModel'; +export type { ItemResponseModelBaseModel } from './models/ItemResponseModelBaseModel'; +export type { LanguageItemResponseModel } from './models/LanguageItemResponseModel'; export type { LanguageModelBaseModel } from './models/LanguageModelBaseModel'; export type { LanguageResponseModel } from './models/LanguageResponseModel'; export type { LoggerResponseModel } from './models/LoggerResponseModel'; @@ -89,12 +103,16 @@ export { LogLevelModel } from './models/LogLevelModel'; export type { LogMessagePropertyPresentationModel } from './models/LogMessagePropertyPresentationModel'; export type { LogMessageResponseModel } from './models/LogMessageResponseModel'; export type { LogTemplateResponseModel } from './models/LogTemplateResponseModel'; +export type { MediaItemResponseModel } from './models/MediaItemResponseModel'; +export type { MediaTypeItemResponseModel } from './models/MediaTypeItemResponseModel'; export type { MediaTypePropertyTypeContainerResponseModel } from './models/MediaTypePropertyTypeContainerResponseModel'; export type { MediaTypePropertyTypeResponseModel } from './models/MediaTypePropertyTypeResponseModel'; export type { MediaTypeResponseModel } from './models/MediaTypeResponseModel'; export type { MediaValueModel } from './models/MediaValueModel'; export type { MediaVariantRequestModel } from './models/MediaVariantRequestModel'; export type { MediaVariantResponseModel } from './models/MediaVariantResponseModel'; +export type { MemberGroupItemReponseModel } from './models/MemberGroupItemReponseModel'; +export type { MemberTypeItemResponseModel } from './models/MemberTypeItemResponseModel'; export type { ModelsBuilderResponseModel } from './models/ModelsBuilderResponseModel'; export { ModelsModeModel } from './models/ModelsModeModel'; export type { MoveDataTypeRequestModel } from './models/MoveDataTypeRequestModel'; @@ -138,6 +156,8 @@ export type { PagedSearcherResponseModel } from './models/PagedSearcherResponseM export type { PagedSearchResultResponseModel } from './models/PagedSearchResultResponseModel'; export type { PagedTelemetryResponseModel } from './models/PagedTelemetryResponseModel'; export type { PagedUserGroupPresentationModel } from './models/PagedUserGroupPresentationModel'; +export type { PagedUserResponseModel } from './models/PagedUserResponseModel'; +export type { PartialViewItemResponseModel } from './models/PartialViewItemResponseModel'; export type { ProblemDetailsModel } from './models/ProblemDetailsModel'; export type { ProfilingStatusRequestModel } from './models/ProfilingStatusRequestModel'; export type { ProfilingStatusResponseModel } from './models/ProfilingStatusResponseModel'; @@ -152,20 +172,26 @@ export type { RedirectUrlStatusResponseModel } from './models/RedirectUrlStatusR export type { RelationItemResponseModel } from './models/RelationItemResponseModel'; export type { RelationResponseModel } from './models/RelationResponseModel'; export type { RelationTypeBaseModel } from './models/RelationTypeBaseModel'; +export type { RelationTypeItemResponseModel } from './models/RelationTypeItemResponseModel'; export type { RelationTypeResponseModel } from './models/RelationTypeResponseModel'; export { RuntimeLevelModel } from './models/RuntimeLevelModel'; export type { SavedLogSearchPresenationBaseModel } from './models/SavedLogSearchPresenationBaseModel'; export type { SavedLogSearchRequestModel } from './models/SavedLogSearchRequestModel'; export type { SavedLogSearchResponseModel } from './models/SavedLogSearchResponseModel'; export type { SaveUserGroupRequestModel } from './models/SaveUserGroupRequestModel'; +export type { ScriptItemResponseModel } from './models/ScriptItemResponseModel'; export type { SearcherResponseModel } from './models/SearcherResponseModel'; export type { SearchResultResponseModel } from './models/SearchResultResponseModel'; export type { ServerStatusResponseModel } from './models/ServerStatusResponseModel'; +export type { SetAvatarRequestModel } from './models/SetAvatarRequestModel'; +export type { StaticFileItemResponseModel } from './models/StaticFileItemResponseModel'; export { StatusResultTypeModel } from './models/StatusResultTypeModel'; +export type { StylesheetItemResponseModel } from './models/StylesheetItemResponseModel'; export { TelemetryLevelModel } from './models/TelemetryLevelModel'; export type { TelemetryRepresentationBaseModel } from './models/TelemetryRepresentationBaseModel'; export type { TelemetryRequestModel } from './models/TelemetryRequestModel'; export type { TelemetryResponseModel } from './models/TelemetryResponseModel'; +export type { TemplateItemResponseModel } from './models/TemplateItemResponseModel'; export type { TemplateModelBaseModel } from './models/TemplateModelBaseModel'; export type { TemplateQueryExecuteFilterPresentationModel } from './models/TemplateQueryExecuteFilterPresentationModel'; export type { TemplateQueryExecuteModel } from './models/TemplateQueryExecuteModel'; @@ -178,11 +204,14 @@ export type { TemplateQueryResultResponseModel } from './models/TemplateQueryRes export type { TemplateQuerySettingsResponseModel } from './models/TemplateQuerySettingsResponseModel'; export type { TemplateResponseModel } from './models/TemplateResponseModel'; export type { TemplateScaffoldResponseModel } from './models/TemplateScaffoldResponseModel'; +export type { TemporaryFileResponseModel } from './models/TemporaryFileResponseModel'; export type { TreeItemPresentationModel } from './models/TreeItemPresentationModel'; +export type { UnlockUsersRequestModel } from './models/UnlockUsersRequestModel'; export type { UpdateContentRequestModelBaseDocumentValueModelDocumentVariantRequestModel } from './models/UpdateContentRequestModelBaseDocumentValueModelDocumentVariantRequestModel'; export type { UpdateContentRequestModelBaseMediaValueModelMediaVariantRequestModel } from './models/UpdateContentRequestModelBaseMediaValueModelMediaVariantRequestModel'; export type { UpdateDataTypeRequestModel } from './models/UpdateDataTypeRequestModel'; export type { UpdateDictionaryItemRequestModel } from './models/UpdateDictionaryItemRequestModel'; +export type { UpdateDocumentNotificationsRequestModel } from './models/UpdateDocumentNotificationsRequestModel'; export type { UpdateDocumentRequestModel } from './models/UpdateDocumentRequestModel'; export type { UpdateDomainsRequestModel } from './models/UpdateDomainsRequestModel'; export type { UpdateFolderReponseModel } from './models/UpdateFolderReponseModel'; @@ -192,12 +221,17 @@ export type { UpdatePackageRequestModel } from './models/UpdatePackageRequestMod export type { UpdateRelationTypeRequestModel } from './models/UpdateRelationTypeRequestModel'; export type { UpdateTemplateRequestModel } from './models/UpdateTemplateRequestModel'; export type { UpdateUserGroupRequestModel } from './models/UpdateUserGroupRequestModel'; +export type { UpdateUserGroupsOnUserRequestModel } from './models/UpdateUserGroupsOnUserRequestModel'; +export type { UpdateUserRequestModel } from './models/UpdateUserRequestModel'; export type { UpgradeSettingsResponseModel } from './models/UpgradeSettingsResponseModel'; -export type { UploadDictionaryResponseModel } from './models/UploadDictionaryResponseModel'; export type { UserGroupBaseModel } from './models/UserGroupBaseModel'; export type { UserGroupPresentationModel } from './models/UserGroupPresentationModel'; export type { UserInstallResponseModel } from './models/UserInstallResponseModel'; +export { UserOrderModel } from './models/UserOrderModel'; +export type { UserPresentationBaseModel } from './models/UserPresentationBaseModel'; +export type { UserResponseModel } from './models/UserResponseModel'; export type { UserSettingsModel } from './models/UserSettingsModel'; +export { UserStateModel } from './models/UserStateModel'; export type { ValueModelBaseModel } from './models/ValueModelBaseModel'; export type { VariantModelBaseModel } from './models/VariantModelBaseModel'; export type { VariantResponseModelBaseModel } from './models/VariantResponseModelBaseModel'; @@ -237,6 +271,9 @@ export { StaticFileResource } from './services/StaticFileResource'; export { StylesheetResource } from './services/StylesheetResource'; export { TelemetryResource } from './services/TelemetryResource'; export { TemplateResource } from './services/TemplateResource'; +export { TemporaryFileResource } from './services/TemporaryFileResource'; export { TrackedReferenceResource } from './services/TrackedReferenceResource'; export { UpgradeResource } from './services/UpgradeResource'; export { UserGroupsResource } from './services/UserGroupsResource'; +export { UsersResource } from './services/UsersResource'; +export { V1Resource } from './services/V1Resource'; diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/AuditLogBaseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/AuditLogBaseModel.ts index 1e56192c01..92a6024151 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/AuditLogBaseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/AuditLogBaseModel.ts @@ -5,11 +5,12 @@ import type { AuditTypeModel } from './AuditTypeModel'; export type AuditLogBaseModel = { - userKey?: string; - entityKey?: string | null; + userId?: string; + entityId?: string | null; timestamp?: string; logType?: AuditTypeModel; entityType?: string | null; comment?: string | null; parameters?: string | null; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/AuditLogResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/AuditLogResponseModel.ts index 150aed42b7..53aaafdb87 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/AuditLogResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/AuditLogResponseModel.ts @@ -5,3 +5,4 @@ import type { AuditLogBaseModel } from './AuditLogBaseModel'; export type AuditLogResponseModel = AuditLogBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/AuditLogWithUsernameResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/AuditLogWithUsernameResponseModel.ts index 3cc6f615f3..eb768a7c43 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/AuditLogWithUsernameResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/AuditLogWithUsernameResponseModel.ts @@ -5,6 +5,7 @@ import type { AuditLogBaseModel } from './AuditLogBaseModel'; export type AuditLogWithUsernameResponseModel = (AuditLogBaseModel & { -userName?: string | null; -userAvatars?: Array | null; + userName?: string | null; + userAvatars?: Array | null; }); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ChangePasswordUserRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ChangePasswordUserRequestModel.ts new file mode 100644 index 0000000000..450bc06538 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ChangePasswordUserRequestModel.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type ChangePasswordUserRequestModel = { + newPassword?: string; + oldPassword?: string | null; +}; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ConsentLevelPresentationModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ConsentLevelPresentationModel.ts index f8481a3c36..b9a1283ad5 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ConsentLevelPresentationModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ConsentLevelPresentationModel.ts @@ -8,3 +8,4 @@ export type ConsentLevelPresentationModel = { level?: TelemetryLevelModel; description?: string; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ContentResponseModelBaseDocumentValueModelDocumentVariantResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ContentResponseModelBaseDocumentValueModelDocumentVariantResponseModel.ts index ed77830467..7ad34d5e3e 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ContentResponseModelBaseDocumentValueModelDocumentVariantResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ContentResponseModelBaseDocumentValueModelDocumentVariantResponseModel.ts @@ -8,6 +8,7 @@ import type { DocumentVariantResponseModel } from './DocumentVariantResponseMode export type ContentResponseModelBaseDocumentValueModelDocumentVariantResponseModel = { values?: Array; variants?: Array; - key?: string; - contentTypeKey?: string; + id?: string; + contentTypeId?: string; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ContentTreeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ContentTreeItemResponseModel.ts index d87dbd5e82..630fb6ae84 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ContentTreeItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ContentTreeItemResponseModel.ts @@ -5,7 +5,8 @@ import type { EntityTreeItemResponseModel } from './EntityTreeItemResponseModel'; export type ContentTreeItemResponseModel = (EntityTreeItemResponseModel & { -$type: string; -noAccess?: boolean; -isTrashed?: boolean; + $type: string; + noAccess?: boolean; + isTrashed?: boolean; }); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ContentTypeCleanupModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ContentTypeCleanupModel.ts index 6d5a4bdf54..7ea186e255 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ContentTypeCleanupModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ContentTypeCleanupModel.ts @@ -7,3 +7,4 @@ export type ContentTypeCleanupModel = { keepAllVersionsNewerThanDays?: number | null; keepLatestVersionPerDayForDays?: number | null; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ContentTypeCompositionModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ContentTypeCompositionModel.ts index 55cd2c0c03..d704a9fcf9 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ContentTypeCompositionModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ContentTypeCompositionModel.ts @@ -5,6 +5,7 @@ import type { ContentTypeCompositionTypeModel } from './ContentTypeCompositionTypeModel'; export type ContentTypeCompositionModel = { - key?: string; + id?: string; compositionType?: ContentTypeCompositionTypeModel; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ContentTypeResponseModelBaseDocumentTypePropertyTypeResponseModelDocumentTypePropertyTypeContainerResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ContentTypeResponseModelBaseDocumentTypePropertyTypeResponseModelDocumentTypePropertyTypeContainerResponseModel.ts index 34a78a67b9..8427bc56c6 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ContentTypeResponseModelBaseDocumentTypePropertyTypeResponseModelDocumentTypePropertyTypeContainerResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ContentTypeResponseModelBaseDocumentTypePropertyTypeResponseModelDocumentTypePropertyTypeContainerResponseModel.ts @@ -8,7 +8,7 @@ import type { DocumentTypePropertyTypeContainerResponseModel } from './DocumentT import type { DocumentTypePropertyTypeResponseModel } from './DocumentTypePropertyTypeResponseModel'; export type ContentTypeResponseModelBaseDocumentTypePropertyTypeResponseModelDocumentTypePropertyTypeContainerResponseModel = { - key?: string; + id?: string; alias?: string; name?: string; description?: string | null; @@ -22,3 +22,4 @@ export type ContentTypeResponseModelBaseDocumentTypePropertyTypeResponseModelDoc allowedContentTypes?: Array; compositions?: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ContentTypeResponseModelBaseMediaTypePropertyTypeResponseModelMediaTypePropertyTypeContainerResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ContentTypeResponseModelBaseMediaTypePropertyTypeResponseModelMediaTypePropertyTypeContainerResponseModel.ts index 0cae4423f3..c8285cef7b 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ContentTypeResponseModelBaseMediaTypePropertyTypeResponseModelMediaTypePropertyTypeContainerResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ContentTypeResponseModelBaseMediaTypePropertyTypeResponseModelMediaTypePropertyTypeContainerResponseModel.ts @@ -8,7 +8,7 @@ import type { MediaTypePropertyTypeContainerResponseModel } from './MediaTypePro import type { MediaTypePropertyTypeResponseModel } from './MediaTypePropertyTypeResponseModel'; export type ContentTypeResponseModelBaseMediaTypePropertyTypeResponseModelMediaTypePropertyTypeContainerResponseModel = { - key?: string; + id?: string; alias?: string; name?: string; description?: string | null; @@ -22,3 +22,4 @@ export type ContentTypeResponseModelBaseMediaTypePropertyTypeResponseModelMediaT allowedContentTypes?: Array; compositions?: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ContentTypeSortModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ContentTypeSortModel.ts index bf4f78b7d6..02c537079a 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ContentTypeSortModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ContentTypeSortModel.ts @@ -3,6 +3,7 @@ /* eslint-disable */ export type ContentTypeSortModel = { - key?: string; + id?: string; sortOrder?: number; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ContentUrlInfoModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ContentUrlInfoModel.ts index 0afeb120d3..aabc5314c5 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ContentUrlInfoModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ContentUrlInfoModel.ts @@ -6,3 +6,4 @@ export type ContentUrlInfoModel = { culture?: string | null; url?: string; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CopyDataTypeRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CopyDataTypeRequestModel.ts index d15502deef..eb76506716 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CopyDataTypeRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CopyDataTypeRequestModel.ts @@ -3,5 +3,6 @@ /* eslint-disable */ export type CopyDataTypeRequestModel = { - targetKey?: string | null; + targetId?: string | null; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateContentRequestModelBaseDocumentValueModelDocumentVariantRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateContentRequestModelBaseDocumentValueModelDocumentVariantRequestModel.ts index 6e7608eca4..bb5147ecc2 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateContentRequestModelBaseDocumentValueModelDocumentVariantRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateContentRequestModelBaseDocumentValueModelDocumentVariantRequestModel.ts @@ -8,5 +8,6 @@ import type { DocumentVariantRequestModel } from './DocumentVariantRequestModel' export type CreateContentRequestModelBaseDocumentValueModelDocumentVariantRequestModel = { values?: Array; variants?: Array; - parentKey?: string | null; + parentId?: string | null; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateContentRequestModelBaseMediaValueModelMediaVariantRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateContentRequestModelBaseMediaValueModelMediaVariantRequestModel.ts index a8ecb5c7bb..3a0e270428 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateContentRequestModelBaseMediaValueModelMediaVariantRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateContentRequestModelBaseMediaValueModelMediaVariantRequestModel.ts @@ -8,5 +8,6 @@ import type { MediaVariantRequestModel } from './MediaVariantRequestModel'; export type CreateContentRequestModelBaseMediaValueModelMediaVariantRequestModel = { values?: Array; variants?: Array; - parentKey?: string | null; + parentId?: string | null; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateDataTypeRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateDataTypeRequestModel.ts index df4380d8ad..a3b6c50157 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateDataTypeRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateDataTypeRequestModel.ts @@ -5,5 +5,7 @@ import type { DataTypeModelBaseModel } from './DataTypeModelBaseModel'; export type CreateDataTypeRequestModel = (DataTypeModelBaseModel & { -parentKey?: string | null; + id?: string | null; + parentId?: string | null; }); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateDictionaryItemRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateDictionaryItemRequestModel.ts index fb32c43da5..95b723fb43 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateDictionaryItemRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateDictionaryItemRequestModel.ts @@ -5,5 +5,6 @@ import type { DictionaryItemModelBaseModel } from './DictionaryItemModelBaseModel'; export type CreateDictionaryItemRequestModel = (DictionaryItemModelBaseModel & { -parentKey?: string | null; + parentId?: string | null; }); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateDocumentRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateDocumentRequestModel.ts index a789b2c4fa..645d204832 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateDocumentRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateDocumentRequestModel.ts @@ -5,6 +5,7 @@ import type { CreateContentRequestModelBaseDocumentValueModelDocumentVariantRequestModel } from './CreateContentRequestModelBaseDocumentValueModelDocumentVariantRequestModel'; export type CreateDocumentRequestModel = (CreateContentRequestModelBaseDocumentValueModelDocumentVariantRequestModel & { -contentTypeKey?: string; -templateKey?: string | null; + contentTypeId?: string; + templateId?: string | null; }); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateFolderRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateFolderRequestModel.ts index 6f23857001..e4af10670e 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateFolderRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateFolderRequestModel.ts @@ -5,5 +5,7 @@ import type { FolderModelBaseModel } from './FolderModelBaseModel'; export type CreateFolderRequestModel = (FolderModelBaseModel & { -parentKey?: string | null; + id?: string | null; + parentId?: string | null; }); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateLanguageRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateLanguageRequestModel.ts index 4eed24634f..16326ad62f 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateLanguageRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateLanguageRequestModel.ts @@ -5,5 +5,6 @@ import type { LanguageModelBaseModel } from './LanguageModelBaseModel'; export type CreateLanguageRequestModel = (LanguageModelBaseModel & { -isoCode?: string; + isoCode?: string; }); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateMediaRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateMediaRequestModel.ts index bf4333b9da..723fe2ecfc 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateMediaRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateMediaRequestModel.ts @@ -5,5 +5,6 @@ import type { CreateContentRequestModelBaseMediaValueModelMediaVariantRequestModel } from './CreateContentRequestModelBaseMediaValueModelMediaVariantRequestModel'; export type CreateMediaRequestModel = (CreateContentRequestModelBaseMediaValueModelMediaVariantRequestModel & { -contentTypeKey?: string; + contentTypeId?: string; }); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreatePackageRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreatePackageRequestModel.ts index 2cfedb1c03..a88367acca 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreatePackageRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreatePackageRequestModel.ts @@ -5,3 +5,4 @@ import type { PackageModelBaseModel } from './PackageModelBaseModel'; export type CreatePackageRequestModel = PackageModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateRelationTypeRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateRelationTypeRequestModel.ts index de6232ee5c..fb75ae7736 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateRelationTypeRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateRelationTypeRequestModel.ts @@ -5,5 +5,6 @@ import type { RelationTypeBaseModel } from './RelationTypeBaseModel'; export type CreateRelationTypeRequestModel = (RelationTypeBaseModel & { -key?: string | null; + id?: string | null; }); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateTemplateRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateTemplateRequestModel.ts index e2d8afb847..e5aa227ac5 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateTemplateRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateTemplateRequestModel.ts @@ -5,3 +5,4 @@ import type { TemplateModelBaseModel } from './TemplateModelBaseModel'; export type CreateTemplateRequestModel = TemplateModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateUserRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateUserRequestModel.ts new file mode 100644 index 0000000000..0166c949fa --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateUserRequestModel.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { UserPresentationBaseModel } from './UserPresentationBaseModel'; + +export type CreateUserRequestModel = UserPresentationBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateUserResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateUserResponseModel.ts new file mode 100644 index 0000000000..0d3678436e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CreateUserResponseModel.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type CreateUserResponseModel = { + userId?: string; + initialPassword?: string | null; +}; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CultureReponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CultureReponseModel.ts index 3b17cfc739..cf18c8883e 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CultureReponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CultureReponseModel.ts @@ -6,3 +6,4 @@ export type CultureReponseModel = { name?: string; englishName?: string; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DataTypeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DataTypeItemResponseModel.ts new file mode 100644 index 0000000000..e277363f47 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DataTypeItemResponseModel.ts @@ -0,0 +1,10 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { ItemResponseModelBaseModel } from './ItemResponseModelBaseModel'; + +export type DataTypeItemResponseModel = (ItemResponseModelBaseModel & { + icon?: string | null; +}); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DataTypeModelBaseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DataTypeModelBaseModel.ts index 9c8b59ed42..c7fa61f661 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DataTypeModelBaseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DataTypeModelBaseModel.ts @@ -10,3 +10,4 @@ export type DataTypeModelBaseModel = { propertyEditorUiAlias?: string | null; values?: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DataTypePropertyPresentationModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DataTypePropertyPresentationModel.ts index 10ca3bc30c..30bcddd9a3 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DataTypePropertyPresentationModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DataTypePropertyPresentationModel.ts @@ -6,3 +6,4 @@ export type DataTypePropertyPresentationModel = { alias?: string; value?: any; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DataTypePropertyReferenceModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DataTypePropertyReferenceModel.ts index d78ee8d9f8..f891dd3af0 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DataTypePropertyReferenceModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DataTypePropertyReferenceModel.ts @@ -6,3 +6,4 @@ export type DataTypePropertyReferenceModel = { name?: string; alias?: string; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DataTypeReferenceResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DataTypeReferenceResponseModel.ts index 4586e124d8..9855622b89 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DataTypeReferenceResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DataTypeReferenceResponseModel.ts @@ -5,7 +5,8 @@ import type { DataTypePropertyReferenceModel } from './DataTypePropertyReferenceModel'; export type DataTypeReferenceResponseModel = { - key?: string; + id?: string; type?: string; properties?: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DataTypeResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DataTypeResponseModel.ts index ab8d3cef09..ed9934a1b5 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DataTypeResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DataTypeResponseModel.ts @@ -4,8 +4,8 @@ import type { DataTypeModelBaseModel } from './DataTypeModelBaseModel'; -export type DataTypeResponseModel = (DataTypeModelBaseModel & { -$type: string; -key?: string; -parentKey?: string | null; -}); +export type DataTypeResponseModel = DataTypeModelBaseModel & { + $type: string; + id?: string; + parentId?: string | null; +}; diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DatabaseInstallResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DatabaseInstallResponseModel.ts index 48dac68577..233df53325 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DatabaseInstallResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DatabaseInstallResponseModel.ts @@ -12,3 +12,4 @@ export type DatabaseInstallResponseModel = { useIntegratedAuthentication?: boolean; connectionString?: string | null; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DatabaseSettingsPresentationModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DatabaseSettingsPresentationModel.ts index ed0057f69f..8046700e30 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DatabaseSettingsPresentationModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DatabaseSettingsPresentationModel.ts @@ -15,3 +15,4 @@ export type DatabaseSettingsPresentationModel = { supportsIntegratedAuthentication?: boolean; requiresConnectionTest?: boolean; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DictionaryItemItemResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DictionaryItemItemResponseModel.ts new file mode 100644 index 0000000000..bcc5a02867 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DictionaryItemItemResponseModel.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { ItemResponseModelBaseModel } from './ItemResponseModelBaseModel'; + +export type DictionaryItemItemResponseModel = ItemResponseModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DictionaryItemModelBaseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DictionaryItemModelBaseModel.ts index 1ffac7af64..cd1a89d95a 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DictionaryItemModelBaseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DictionaryItemModelBaseModel.ts @@ -8,3 +8,4 @@ export type DictionaryItemModelBaseModel = { name?: string; translations?: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DictionaryItemResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DictionaryItemResponseModel.ts index b691fd7c96..f5da8949f1 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DictionaryItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DictionaryItemResponseModel.ts @@ -5,6 +5,7 @@ import type { DictionaryItemModelBaseModel } from './DictionaryItemModelBaseModel'; export type DictionaryItemResponseModel = (DictionaryItemModelBaseModel & { -$type: string; -key?: string; + $type: string; + id?: string; }); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DictionaryItemTranslationModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DictionaryItemTranslationModel.ts index 37e5189a01..9bc10a302f 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DictionaryItemTranslationModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DictionaryItemTranslationModel.ts @@ -6,3 +6,4 @@ export type DictionaryItemTranslationModel = { isoCode?: string; translation?: string; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DictionaryOverviewResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DictionaryOverviewResponseModel.ts index f0744047dc..abc3190425 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DictionaryOverviewResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DictionaryOverviewResponseModel.ts @@ -4,7 +4,8 @@ export type DictionaryOverviewResponseModel = { name?: string | null; - key?: string; - parentKey?: string | null; + id?: string; + parentId?: string | null; translatedIsoCodes?: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DisableUserRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DisableUserRequestModel.ts new file mode 100644 index 0000000000..1074d06b75 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DisableUserRequestModel.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type DisableUserRequestModel = { + userIds?: Array; +}; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentBlueprintResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentBlueprintResponseModel.ts new file mode 100644 index 0000000000..fd6b735c5b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentBlueprintResponseModel.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { ItemResponseModelBaseModel } from './ItemResponseModelBaseModel'; + +export type DocumentBlueprintResponseModel = ItemResponseModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentBlueprintTreeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentBlueprintTreeItemResponseModel.ts index 6821ca9675..0dc6c99953 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentBlueprintTreeItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentBlueprintTreeItemResponseModel.ts @@ -5,8 +5,9 @@ import type { EntityTreeItemResponseModel } from './EntityTreeItemResponseModel'; export type DocumentBlueprintTreeItemResponseModel = (EntityTreeItemResponseModel & { -$type: string; -documentTypeKey?: string; -documentTypeAlias?: string; -documentTypeName?: string | null; + $type: string; + documentTypeId?: string; + documentTypeAlias?: string; + documentTypeName?: string | null; }); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentItemResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentItemResponseModel.ts new file mode 100644 index 0000000000..3bf495dc8d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentItemResponseModel.ts @@ -0,0 +1,10 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { ItemResponseModelBaseModel } from './ItemResponseModelBaseModel'; + +export type DocumentItemResponseModel = (ItemResponseModelBaseModel & { + icon?: string | null; +}); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentNotificationResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentNotificationResponseModel.ts new file mode 100644 index 0000000000..e898c96eda --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentNotificationResponseModel.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type DocumentNotificationResponseModel = { + actionId?: string; + subscribed?: boolean; +}; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentResponseModel.ts index af1dbfa151..ce053d9297 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentResponseModel.ts @@ -6,6 +6,7 @@ import type { ContentResponseModelBaseDocumentValueModelDocumentVariantResponseM import type { ContentUrlInfoModel } from './ContentUrlInfoModel'; export type DocumentResponseModel = (ContentResponseModelBaseDocumentValueModelDocumentVariantResponseModel & { -urls?: Array; -templateKey?: string | null; + urls?: Array; + templateId?: string | null; }); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentTreeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentTreeItemResponseModel.ts index 2f49967d81..d9d187c704 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentTreeItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentTreeItemResponseModel.ts @@ -5,8 +5,9 @@ import type { ContentTreeItemResponseModel } from './ContentTreeItemResponseModel'; export type DocumentTreeItemResponseModel = (ContentTreeItemResponseModel & { -$type: string; -isProtected?: boolean; -isPublished?: boolean; -isEdited?: boolean; + $type: string; + isProtected?: boolean; + isPublished?: boolean; + isEdited?: boolean; }); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentTypeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentTypeItemResponseModel.ts new file mode 100644 index 0000000000..f085ce11bc --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentTypeItemResponseModel.ts @@ -0,0 +1,11 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { ItemResponseModelBaseModel } from './ItemResponseModelBaseModel'; + +export type DocumentTypeItemResponseModel = (ItemResponseModelBaseModel & { + isElement?: boolean; + icon?: string | null; +}); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentTypePropertyTypeContainerResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentTypePropertyTypeContainerResponseModel.ts index 0aa23dce56..83aa9e6459 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentTypePropertyTypeContainerResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentTypePropertyTypeContainerResponseModel.ts @@ -5,3 +5,4 @@ import type { PropertyTypeContainerResponseModelBaseModel } from './PropertyTypeContainerResponseModelBaseModel'; export type DocumentTypePropertyTypeContainerResponseModel = PropertyTypeContainerResponseModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentTypePropertyTypeResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentTypePropertyTypeResponseModel.ts index 2cd2e32d6e..c74873bb1b 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentTypePropertyTypeResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentTypePropertyTypeResponseModel.ts @@ -5,3 +5,4 @@ import type { PropertyTypeResponseModelBaseModel } from './PropertyTypeResponseModelBaseModel'; export type DocumentTypePropertyTypeResponseModel = PropertyTypeResponseModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentTypeResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentTypeResponseModel.ts index 7e0adcb071..8712b46d1f 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentTypeResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentTypeResponseModel.ts @@ -6,7 +6,8 @@ import type { ContentTypeCleanupModel } from './ContentTypeCleanupModel'; import type { ContentTypeResponseModelBaseDocumentTypePropertyTypeResponseModelDocumentTypePropertyTypeContainerResponseModel } from './ContentTypeResponseModelBaseDocumentTypePropertyTypeResponseModelDocumentTypePropertyTypeContainerResponseModel'; export type DocumentTypeResponseModel = (ContentTypeResponseModelBaseDocumentTypePropertyTypeResponseModelDocumentTypePropertyTypeContainerResponseModel & { -allowedTemplateKeys?: Array; -defaultTemplateKey?: string | null; -cleanup?: ContentTypeCleanupModel; + allowedTemplateIds?: Array; + defaultTemplateId?: string | null; + cleanup?: ContentTypeCleanupModel; }); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentTypeTreeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentTypeTreeItemResponseModel.ts index f6737ab3af..d211b01020 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentTypeTreeItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentTypeTreeItemResponseModel.ts @@ -5,6 +5,7 @@ import type { FolderTreeItemResponseModel } from './FolderTreeItemResponseModel'; export type DocumentTypeTreeItemResponseModel = (FolderTreeItemResponseModel & { -$type: string; -isElement?: boolean; + $type: string; + isElement?: boolean; }); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentValueModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentValueModel.ts index 3f856dc060..497bb7255a 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentValueModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentValueModel.ts @@ -5,5 +5,6 @@ import type { ValueModelBaseModel } from './ValueModelBaseModel'; export type DocumentValueModel = (ValueModelBaseModel & { -$type: string; + $type: string; }); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentVariantRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentVariantRequestModel.ts index a362a5d53c..8377863391 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentVariantRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentVariantRequestModel.ts @@ -5,5 +5,6 @@ import type { VariantModelBaseModel } from './VariantModelBaseModel'; export type DocumentVariantRequestModel = (VariantModelBaseModel & { -$type: string; + $type: string; }); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentVariantResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentVariantResponseModel.ts index 1ec48739e2..2c19f50dd9 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentVariantResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DocumentVariantResponseModel.ts @@ -6,7 +6,8 @@ import type { ContentStateModel } from './ContentStateModel'; import type { VariantResponseModelBaseModel } from './VariantResponseModelBaseModel'; export type DocumentVariantResponseModel = (VariantResponseModelBaseModel & { -$type: string; -state?: ContentStateModel; -publishDate?: string | null; + $type: string; + state?: ContentStateModel; + publishDate?: string | null; }); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DomainPresentationModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DomainPresentationModel.ts index 05f340dbb8..237c3037f4 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DomainPresentationModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DomainPresentationModel.ts @@ -6,3 +6,4 @@ export type DomainPresentationModel = { domainName?: string; isoCode?: string; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DomainsPresentationModelBaseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DomainsPresentationModelBaseModel.ts index 0109e12809..597b473ad7 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DomainsPresentationModelBaseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DomainsPresentationModelBaseModel.ts @@ -8,3 +8,4 @@ export type DomainsPresentationModelBaseModel = { defaultIsoCode?: string | null; domains?: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DomainsResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DomainsResponseModel.ts index 4ef04f4c24..aeec02fb3d 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DomainsResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DomainsResponseModel.ts @@ -5,3 +5,4 @@ import type { DomainsPresentationModelBaseModel } from './DomainsPresentationModelBaseModel'; export type DomainsResponseModel = DomainsPresentationModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/EnableUserRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/EnableUserRequestModel.ts new file mode 100644 index 0000000000..6230b2469f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/EnableUserRequestModel.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type EnableUserRequestModel = { + userIds?: Array; +}; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/EntityTreeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/EntityTreeItemResponseModel.ts index 7efeefad1e..6cff369186 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/EntityTreeItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/EntityTreeItemResponseModel.ts @@ -5,8 +5,9 @@ import type { TreeItemPresentationModel } from './TreeItemPresentationModel'; export type EntityTreeItemResponseModel = (TreeItemPresentationModel & { -$type: string; -key?: string; -isContainer?: boolean; -parentKey?: string | null; + $type: string; + id?: string; + isContainer?: boolean; + parentId?: string | null; }); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/FieldPresentationModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/FieldPresentationModel.ts index 14255377d9..73dd10d3b0 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/FieldPresentationModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/FieldPresentationModel.ts @@ -6,3 +6,4 @@ export type FieldPresentationModel = { name?: string; values?: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/FileItemResponseModelBaseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/FileItemResponseModelBaseModel.ts new file mode 100644 index 0000000000..6867fcab7f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/FileItemResponseModelBaseModel.ts @@ -0,0 +1,10 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type FileItemResponseModelBaseModel = { + name?: string; + path?: string; + icon?: string; +}; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/FileSystemTreeItemPresentationModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/FileSystemTreeItemPresentationModel.ts index 98c014b13c..9b82bc2e4a 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/FileSystemTreeItemPresentationModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/FileSystemTreeItemPresentationModel.ts @@ -5,6 +5,7 @@ import type { TreeItemPresentationModel } from './TreeItemPresentationModel'; export type FileSystemTreeItemPresentationModel = (TreeItemPresentationModel & { -path?: string; -isFolder?: boolean; + path?: string; + isFolder?: boolean; }); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/FolderModelBaseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/FolderModelBaseModel.ts index f4fa285d6a..bb5a9dab5b 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/FolderModelBaseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/FolderModelBaseModel.ts @@ -5,3 +5,4 @@ export type FolderModelBaseModel = { name?: string; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/FolderReponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/FolderReponseModel.ts index c3606779e5..dede400904 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/FolderReponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/FolderReponseModel.ts @@ -5,7 +5,8 @@ import type { FolderModelBaseModel } from './FolderModelBaseModel'; export type FolderReponseModel = (FolderModelBaseModel & { -$type: string; -key?: string; -parentKey?: string | null; + $type: string; + id?: string; + parentId?: string | null; }); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/FolderTreeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/FolderTreeItemResponseModel.ts index 25c0f50fd2..207186fdc1 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/FolderTreeItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/FolderTreeItemResponseModel.ts @@ -5,6 +5,7 @@ import type { EntityTreeItemResponseModel } from './EntityTreeItemResponseModel'; export type FolderTreeItemResponseModel = (EntityTreeItemResponseModel & { -$type: string; -isFolder?: boolean; + $type: string; + isFolder?: boolean; }); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HealthCheckActionRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HealthCheckActionRequestModel.ts index 0a64ed3f60..05f50ef3c6 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HealthCheckActionRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HealthCheckActionRequestModel.ts @@ -3,7 +3,7 @@ /* eslint-disable */ export type HealthCheckActionRequestModel = { - healthCheckKey?: string; + healthCheckId?: string; alias?: string | null; name?: string | null; description?: string | null; @@ -12,3 +12,4 @@ export type HealthCheckActionRequestModel = { providedValueValidation?: string | null; providedValueValidationRegex?: string | null; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HealthCheckGroupPresentationBaseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HealthCheckGroupPresentationBaseModel.ts index fbc62be4ff..22073b3a22 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HealthCheckGroupPresentationBaseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HealthCheckGroupPresentationBaseModel.ts @@ -5,3 +5,4 @@ export type HealthCheckGroupPresentationBaseModel = { name?: string; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HealthCheckGroupPresentationModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HealthCheckGroupPresentationModel.ts index dfdf778e12..8029327431 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HealthCheckGroupPresentationModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HealthCheckGroupPresentationModel.ts @@ -6,5 +6,6 @@ import type { HealthCheckGroupPresentationBaseModel } from './HealthCheckGroupPr import type { HealthCheckModel } from './HealthCheckModel'; export type HealthCheckGroupPresentationModel = (HealthCheckGroupPresentationBaseModel & { -checks?: Array; + checks?: Array; }); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HealthCheckGroupResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HealthCheckGroupResponseModel.ts index 5a038bd74e..46704d9f25 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HealthCheckGroupResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HealthCheckGroupResponseModel.ts @@ -5,3 +5,4 @@ import type { HealthCheckGroupPresentationBaseModel } from './HealthCheckGroupPresentationBaseModel'; export type HealthCheckGroupResponseModel = HealthCheckGroupPresentationBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HealthCheckGroupWithResultResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HealthCheckGroupWithResultResponseModel.ts index 45f3b948df..e3a7841939 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HealthCheckGroupWithResultResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HealthCheckGroupWithResultResponseModel.ts @@ -7,3 +7,4 @@ import type { HealthCheckWithResultPresentationModel } from './HealthCheckWithRe export type HealthCheckGroupWithResultResponseModel = { checks?: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HealthCheckModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HealthCheckModel.ts index 56ca3e0121..9a85add96d 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HealthCheckModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HealthCheckModel.ts @@ -5,6 +5,7 @@ import type { HealthCheckModelBaseModel } from './HealthCheckModelBaseModel'; export type HealthCheckModel = (HealthCheckModelBaseModel & { -name?: string; -description?: string | null; + name?: string; + description?: string | null; }); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HealthCheckModelBaseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HealthCheckModelBaseModel.ts index 55f41c4618..0cee4aca31 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HealthCheckModelBaseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HealthCheckModelBaseModel.ts @@ -3,5 +3,6 @@ /* eslint-disable */ export type HealthCheckModelBaseModel = { - key?: string; + id?: string; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HealthCheckResultResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HealthCheckResultResponseModel.ts index d5a99706b5..c0c237a43c 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HealthCheckResultResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HealthCheckResultResponseModel.ts @@ -11,3 +11,4 @@ export type HealthCheckResultResponseModel = { actions?: Array | null; readMoreLink?: string | null; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HealthCheckWithResultPresentationModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HealthCheckWithResultPresentationModel.ts index 12929e62f8..5028107875 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HealthCheckWithResultPresentationModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HealthCheckWithResultPresentationModel.ts @@ -6,5 +6,6 @@ import type { HealthCheckModelBaseModel } from './HealthCheckModelBaseModel'; import type { HealthCheckResultResponseModel } from './HealthCheckResultResponseModel'; export type HealthCheckWithResultPresentationModel = (HealthCheckModelBaseModel & { -results?: Array | null; + results?: Array | null; }); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HelpPageResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HelpPageResponseModel.ts index 43a41c82c6..a3cb83ead7 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HelpPageResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/HelpPageResponseModel.ts @@ -8,3 +8,4 @@ export type HelpPageResponseModel = { url?: string | null; type?: string | null; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ImportDictionaryItemsPresentationModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ImportDictionaryItemsPresentationModel.ts deleted file mode 100644 index ae77e85dbc..0000000000 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ImportDictionaryItemsPresentationModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type ImportDictionaryItemsPresentationModel = { - key?: string; - name?: string | null; - parentKey?: string | null; -}; diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ImportDictionaryRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ImportDictionaryRequestModel.ts index f08dd2599a..4e29abf47a 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ImportDictionaryRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ImportDictionaryRequestModel.ts @@ -3,6 +3,7 @@ /* eslint-disable */ export type ImportDictionaryRequestModel = { - fileName?: string; - parentKey?: string | null; + temporaryFileId?: string; + parentId?: string | null; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/IndexResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/IndexResponseModel.ts index befb90a467..68c87f9aa0 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/IndexResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/IndexResponseModel.ts @@ -13,3 +13,4 @@ export type IndexResponseModel = { fieldCount: number; providerProperties?: Record | null; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/InstallSettingsResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/InstallSettingsResponseModel.ts index 2b432cb901..100bb5b12f 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/InstallSettingsResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/InstallSettingsResponseModel.ts @@ -9,3 +9,4 @@ export type InstallSettingsResponseModel = { user?: UserSettingsModel; databases?: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/InstallVResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/InstallVResponseModel.ts index 0754a817a4..ada168bb74 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/InstallVResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/InstallVResponseModel.ts @@ -11,3 +11,4 @@ export type InstallVResponseModel = { database: DatabaseInstallResponseModel; telemetryLevel?: TelemetryLevelModel; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/InviteUserRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/InviteUserRequestModel.ts new file mode 100644 index 0000000000..e0e7e9ad62 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/InviteUserRequestModel.ts @@ -0,0 +1,10 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { CreateUserRequestModel } from './CreateUserRequestModel'; + +export type InviteUserRequestModel = (CreateUserRequestModel & { + message?: string | null; +}); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ItemResponseModelBaseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ItemResponseModelBaseModel.ts new file mode 100644 index 0000000000..486b5df6f8 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ItemResponseModelBaseModel.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type ItemResponseModelBaseModel = { + name?: string; + id?: string; +}; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/LanguageItemResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/LanguageItemResponseModel.ts new file mode 100644 index 0000000000..f9a7e78419 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/LanguageItemResponseModel.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type LanguageItemResponseModel = { + name?: string; + isoCode?: string; +}; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/LanguageModelBaseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/LanguageModelBaseModel.ts index b7dd8054d4..eaff3e8d4e 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/LanguageModelBaseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/LanguageModelBaseModel.ts @@ -8,3 +8,4 @@ export type LanguageModelBaseModel = { isMandatory?: boolean; fallbackIsoCode?: string | null; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/LanguageResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/LanguageResponseModel.ts index 77993ea4ae..5d17bf3842 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/LanguageResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/LanguageResponseModel.ts @@ -5,5 +5,6 @@ import type { LanguageModelBaseModel } from './LanguageModelBaseModel'; export type LanguageResponseModel = (LanguageModelBaseModel & { -isoCode?: string; + isoCode?: string; }); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/LogLevelCountsReponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/LogLevelCountsReponseModel.ts index 8a423396d7..a1064cc7a4 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/LogLevelCountsReponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/LogLevelCountsReponseModel.ts @@ -9,3 +9,4 @@ export type LogLevelCountsReponseModel = { error?: number; fatal?: number; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/LogMessagePropertyPresentationModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/LogMessagePropertyPresentationModel.ts index 51a22a6a2b..dd9be7aa49 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/LogMessagePropertyPresentationModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/LogMessagePropertyPresentationModel.ts @@ -6,3 +6,4 @@ export type LogMessagePropertyPresentationModel = { name?: string; value?: string | null; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/LogMessageResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/LogMessageResponseModel.ts index 38e9321909..ad67dd8483 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/LogMessageResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/LogMessageResponseModel.ts @@ -13,3 +13,4 @@ export type LogMessageResponseModel = { properties?: Array; exception?: string | null; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/LogTemplateResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/LogTemplateResponseModel.ts index 2731cd2df8..1aeece3a0a 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/LogTemplateResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/LogTemplateResponseModel.ts @@ -6,3 +6,4 @@ export type LogTemplateResponseModel = { messageTemplate?: string | null; count?: number; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/LoggerResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/LoggerResponseModel.ts index 6615168857..552470c462 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/LoggerResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/LoggerResponseModel.ts @@ -8,3 +8,4 @@ export type LoggerResponseModel = { name?: string; level?: LogLevelModel; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MediaItemResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MediaItemResponseModel.ts new file mode 100644 index 0000000000..1b28cf9a1d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MediaItemResponseModel.ts @@ -0,0 +1,10 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { ItemResponseModelBaseModel } from './ItemResponseModelBaseModel'; + +export type MediaItemResponseModel = (ItemResponseModelBaseModel & { + icon?: string | null; +}); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MediaTypeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MediaTypeItemResponseModel.ts new file mode 100644 index 0000000000..536d0ce369 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MediaTypeItemResponseModel.ts @@ -0,0 +1,10 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { ItemResponseModelBaseModel } from './ItemResponseModelBaseModel'; + +export type MediaTypeItemResponseModel = (ItemResponseModelBaseModel & { + icon?: string | null; +}); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MediaTypePropertyTypeContainerResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MediaTypePropertyTypeContainerResponseModel.ts index dea0899aee..f8a0b7ba60 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MediaTypePropertyTypeContainerResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MediaTypePropertyTypeContainerResponseModel.ts @@ -5,3 +5,4 @@ import type { PropertyTypeContainerResponseModelBaseModel } from './PropertyTypeContainerResponseModelBaseModel'; export type MediaTypePropertyTypeContainerResponseModel = PropertyTypeContainerResponseModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MediaTypePropertyTypeResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MediaTypePropertyTypeResponseModel.ts index 30de030f1a..a4d992c86a 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MediaTypePropertyTypeResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MediaTypePropertyTypeResponseModel.ts @@ -5,3 +5,4 @@ import type { PropertyTypeResponseModelBaseModel } from './PropertyTypeResponseModelBaseModel'; export type MediaTypePropertyTypeResponseModel = PropertyTypeResponseModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MediaTypeResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MediaTypeResponseModel.ts index ba0ca6251c..71d255850e 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MediaTypeResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MediaTypeResponseModel.ts @@ -5,3 +5,4 @@ import type { ContentTypeResponseModelBaseMediaTypePropertyTypeResponseModelMediaTypePropertyTypeContainerResponseModel } from './ContentTypeResponseModelBaseMediaTypePropertyTypeResponseModelMediaTypePropertyTypeContainerResponseModel'; export type MediaTypeResponseModel = ContentTypeResponseModelBaseMediaTypePropertyTypeResponseModelMediaTypePropertyTypeContainerResponseModel; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MediaValueModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MediaValueModel.ts index 3df317dfed..a8ba985e23 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MediaValueModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MediaValueModel.ts @@ -5,5 +5,6 @@ import type { ValueModelBaseModel } from './ValueModelBaseModel'; export type MediaValueModel = (ValueModelBaseModel & { -$type: string; + $type: string; }); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MediaVariantRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MediaVariantRequestModel.ts index 49b8b7b4e6..66baded663 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MediaVariantRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MediaVariantRequestModel.ts @@ -5,5 +5,6 @@ import type { VariantModelBaseModel } from './VariantModelBaseModel'; export type MediaVariantRequestModel = (VariantModelBaseModel & { -$type: string; + $type: string; }); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MediaVariantResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MediaVariantResponseModel.ts index b76e970304..739ae9bd33 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MediaVariantResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MediaVariantResponseModel.ts @@ -5,5 +5,6 @@ import type { VariantResponseModelBaseModel } from './VariantResponseModelBaseModel'; export type MediaVariantResponseModel = (VariantResponseModelBaseModel & { -$type: string; + $type: string; }); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MemberGroupItemReponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MemberGroupItemReponseModel.ts new file mode 100644 index 0000000000..d42cc718f6 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MemberGroupItemReponseModel.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { ItemResponseModelBaseModel } from './ItemResponseModelBaseModel'; + +export type MemberGroupItemReponseModel = ItemResponseModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MemberTypeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MemberTypeItemResponseModel.ts new file mode 100644 index 0000000000..8d42b882cb --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MemberTypeItemResponseModel.ts @@ -0,0 +1,10 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { ItemResponseModelBaseModel } from './ItemResponseModelBaseModel'; + +export type MemberTypeItemResponseModel = (ItemResponseModelBaseModel & { + icon?: string | null; +}); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ModelsBuilderResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ModelsBuilderResponseModel.ts index cb7477ebdf..5f9962c2fa 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ModelsBuilderResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ModelsBuilderResponseModel.ts @@ -13,3 +13,4 @@ export type ModelsBuilderResponseModel = { modelsNamespace?: string | null; trackingOutOfDateModels?: boolean; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MoveDataTypeRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MoveDataTypeRequestModel.ts index 2470cac98c..3e318c9479 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MoveDataTypeRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MoveDataTypeRequestModel.ts @@ -3,5 +3,6 @@ /* eslint-disable */ export type MoveDataTypeRequestModel = { - targetKey?: string | null; + targetId?: string | null; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MoveDictionaryRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MoveDictionaryRequestModel.ts index 742605cfcc..0973241bc6 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MoveDictionaryRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MoveDictionaryRequestModel.ts @@ -3,5 +3,6 @@ /* eslint-disable */ export type MoveDictionaryRequestModel = { - targetKey?: string | null; + targetId?: string | null; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ObjectTypeResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ObjectTypeResponseModel.ts index 4b5b44cb19..d160dfceb5 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ObjectTypeResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ObjectTypeResponseModel.ts @@ -6,3 +6,4 @@ export type ObjectTypeResponseModel = { name?: string | null; id?: string; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/OkResultModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/OkResultModel.ts index 0b041f81ee..886e643b17 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/OkResultModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/OkResultModel.ts @@ -5,3 +5,4 @@ export type OkResultModel = { statusCode?: number; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/OutOfDateStatusResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/OutOfDateStatusResponseModel.ts index 3525c5b9a3..6d527b9a78 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/OutOfDateStatusResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/OutOfDateStatusResponseModel.ts @@ -7,3 +7,4 @@ import type { OutOfDateTypeModel } from './OutOfDateTypeModel'; export type OutOfDateStatusResponseModel = { status?: OutOfDateTypeModel; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PackageDefinitionResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PackageDefinitionResponseModel.ts index 1e40334b1d..d86f8ba651 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PackageDefinitionResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PackageDefinitionResponseModel.ts @@ -5,6 +5,7 @@ import type { PackageModelBaseModel } from './PackageModelBaseModel'; export type PackageDefinitionResponseModel = (PackageModelBaseModel & { -key?: string; -packagePath?: string; + id?: string; + packagePath?: string; }); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PackageManifestResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PackageManifestResponseModel.ts index 1ac843ab9b..269793340b 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PackageManifestResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PackageManifestResponseModel.ts @@ -7,3 +7,4 @@ export type PackageManifestResponseModel = { version?: string | null; extensions?: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PackageMigrationStatusResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PackageMigrationStatusResponseModel.ts index f2aa442a61..d003e467e2 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PackageMigrationStatusResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PackageMigrationStatusResponseModel.ts @@ -6,3 +6,4 @@ export type PackageMigrationStatusResponseModel = { packageName?: string; hasPendingMigrations?: boolean; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PackageModelBaseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PackageModelBaseModel.ts index 4ccfb1eacf..fa68538ec2 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PackageModelBaseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PackageModelBaseModel.ts @@ -6,7 +6,7 @@ export type PackageModelBaseModel = { name?: string; contentNodeId?: string | null; contentLoadChildNodes?: boolean; - mediaKeys?: Array; + mediaIds?: Array; mediaLoadChildNodes?: boolean; documentTypes?: Array; mediaTypes?: Array; @@ -18,3 +18,4 @@ export type PackageModelBaseModel = { languages?: Array; dictionaryItems?: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedAuditLogResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedAuditLogResponseModel.ts index 4d8cbdd238..28e4883e9d 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedAuditLogResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedAuditLogResponseModel.ts @@ -8,3 +8,4 @@ export type PagedAuditLogResponseModel = { total: number; items: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedAuditLogWithUsernameResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedAuditLogWithUsernameResponseModel.ts index 32531185f4..2faa8a352c 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedAuditLogWithUsernameResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedAuditLogWithUsernameResponseModel.ts @@ -8,3 +8,4 @@ export type PagedAuditLogWithUsernameResponseModel = { total: number; items: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedContentTreeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedContentTreeItemResponseModel.ts index baa7dc3c36..9b01050dc0 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedContentTreeItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedContentTreeItemResponseModel.ts @@ -9,3 +9,4 @@ export type PagedContentTreeItemResponseModel = { total: number; items: Array<(ContentTreeItemResponseModel | DocumentTreeItemResponseModel)>; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedCultureReponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedCultureReponseModel.ts index 266daa8cd2..b75368444a 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedCultureReponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedCultureReponseModel.ts @@ -8,3 +8,4 @@ export type PagedCultureReponseModel = { total: number; items: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedDictionaryOverviewResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedDictionaryOverviewResponseModel.ts index 990d186c40..416064523d 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedDictionaryOverviewResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedDictionaryOverviewResponseModel.ts @@ -8,3 +8,4 @@ export type PagedDictionaryOverviewResponseModel = { total: number; items: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedDocumentBlueprintTreeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedDocumentBlueprintTreeItemResponseModel.ts index 8dc4a5165e..f5fb88fbf5 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedDocumentBlueprintTreeItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedDocumentBlueprintTreeItemResponseModel.ts @@ -8,3 +8,4 @@ export type PagedDocumentBlueprintTreeItemResponseModel = { total: number; items: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedDocumentTreeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedDocumentTreeItemResponseModel.ts index d8dd2f0fc6..3364678fac 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedDocumentTreeItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedDocumentTreeItemResponseModel.ts @@ -8,3 +8,4 @@ export type PagedDocumentTreeItemResponseModel = { total: number; items: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedDocumentTypeTreeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedDocumentTypeTreeItemResponseModel.ts index ba0f93c358..cfa8e9eb1d 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedDocumentTypeTreeItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedDocumentTypeTreeItemResponseModel.ts @@ -8,3 +8,4 @@ export type PagedDocumentTypeTreeItemResponseModel = { total: number; items: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedEntityTreeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedEntityTreeItemResponseModel.ts index 9df2b4b601..ac8b646854 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedEntityTreeItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedEntityTreeItemResponseModel.ts @@ -13,3 +13,4 @@ export type PagedEntityTreeItemResponseModel = { total: number; items: Array<(EntityTreeItemResponseModel | ContentTreeItemResponseModel | DocumentBlueprintTreeItemResponseModel | DocumentTreeItemResponseModel | DocumentTypeTreeItemResponseModel | FolderTreeItemResponseModel)>; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedFileSystemTreeItemPresentationModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedFileSystemTreeItemPresentationModel.ts index be96ca744e..3297c3ab40 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedFileSystemTreeItemPresentationModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedFileSystemTreeItemPresentationModel.ts @@ -8,3 +8,4 @@ export type PagedFileSystemTreeItemPresentationModel = { total: number; items: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedFolderTreeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedFolderTreeItemResponseModel.ts index 3543ba5636..deafb5c398 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedFolderTreeItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedFolderTreeItemResponseModel.ts @@ -9,3 +9,4 @@ export type PagedFolderTreeItemResponseModel = { total: number; items: Array<(FolderTreeItemResponseModel | DocumentTypeTreeItemResponseModel)>; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedHealthCheckGroupResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedHealthCheckGroupResponseModel.ts index 8bcb42c1d8..bcd0a47ba7 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedHealthCheckGroupResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedHealthCheckGroupResponseModel.ts @@ -8,3 +8,4 @@ export type PagedHealthCheckGroupResponseModel = { total: number; items: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedHelpPageResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedHelpPageResponseModel.ts index fb379bf641..963dcbbc72 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedHelpPageResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedHelpPageResponseModel.ts @@ -8,3 +8,4 @@ export type PagedHelpPageResponseModel = { total: number; items: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedIndexResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedIndexResponseModel.ts index a84e061c7c..7798b6b5a2 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedIndexResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedIndexResponseModel.ts @@ -8,3 +8,4 @@ export type PagedIndexResponseModel = { total: number; items: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedLanguageResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedLanguageResponseModel.ts index d749a241cb..0fba24b689 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedLanguageResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedLanguageResponseModel.ts @@ -8,3 +8,4 @@ export type PagedLanguageResponseModel = { total: number; items: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedLogMessageResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedLogMessageResponseModel.ts index 88457e9701..0a9e2324f3 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedLogMessageResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedLogMessageResponseModel.ts @@ -8,3 +8,4 @@ export type PagedLogMessageResponseModel = { total: number; items: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedLogTemplateResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedLogTemplateResponseModel.ts index 801c440db4..0118ef7d9b 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedLogTemplateResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedLogTemplateResponseModel.ts @@ -8,3 +8,4 @@ export type PagedLogTemplateResponseModel = { total: number; items: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedLoggerResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedLoggerResponseModel.ts index 273205e323..18d7c7d708 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedLoggerResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedLoggerResponseModel.ts @@ -8,3 +8,4 @@ export type PagedLoggerResponseModel = { total: number; items: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedObjectTypeResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedObjectTypeResponseModel.ts index e72657d180..c8eaf672f7 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedObjectTypeResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedObjectTypeResponseModel.ts @@ -8,3 +8,4 @@ export type PagedObjectTypeResponseModel = { total: number; items: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedPackageDefinitionResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedPackageDefinitionResponseModel.ts index 8582af874a..af37046ae9 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedPackageDefinitionResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedPackageDefinitionResponseModel.ts @@ -8,3 +8,4 @@ export type PagedPackageDefinitionResponseModel = { total: number; items: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedPackageMigrationStatusResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedPackageMigrationStatusResponseModel.ts index 114244e919..759633f03b 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedPackageMigrationStatusResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedPackageMigrationStatusResponseModel.ts @@ -8,3 +8,4 @@ export type PagedPackageMigrationStatusResponseModel = { total: number; items: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedRecycleBinItemResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedRecycleBinItemResponseModel.ts index 4077e2d0d5..de0221c66d 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedRecycleBinItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedRecycleBinItemResponseModel.ts @@ -8,3 +8,4 @@ export type PagedRecycleBinItemResponseModel = { total: number; items: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedRedirectUrlResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedRedirectUrlResponseModel.ts index 3026d71af4..efa56add27 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedRedirectUrlResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedRedirectUrlResponseModel.ts @@ -8,3 +8,4 @@ export type PagedRedirectUrlResponseModel = { total: number; items: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedRelationItemResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedRelationItemResponseModel.ts index 4ad8badc22..2340e59dbc 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedRelationItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedRelationItemResponseModel.ts @@ -8,3 +8,4 @@ export type PagedRelationItemResponseModel = { total: number; items: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedRelationResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedRelationResponseModel.ts index 5a4d95e4c1..a93d16ea07 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedRelationResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedRelationResponseModel.ts @@ -8,3 +8,4 @@ export type PagedRelationResponseModel = { total: number; items: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedSavedLogSearchResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedSavedLogSearchResponseModel.ts index 6f5b02d4f3..994d6a2f99 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedSavedLogSearchResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedSavedLogSearchResponseModel.ts @@ -8,3 +8,4 @@ export type PagedSavedLogSearchResponseModel = { total: number; items: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedSearchResultResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedSearchResultResponseModel.ts index 2a95a2d85b..faaad892f6 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedSearchResultResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedSearchResultResponseModel.ts @@ -8,3 +8,4 @@ export type PagedSearchResultResponseModel = { total: number; items: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedSearcherResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedSearcherResponseModel.ts index b8c9c60dab..f59af076ae 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedSearcherResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedSearcherResponseModel.ts @@ -8,3 +8,4 @@ export type PagedSearcherResponseModel = { total: number; items: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedTelemetryResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedTelemetryResponseModel.ts index 6a8ddbabfd..dfff74e1ff 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedTelemetryResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedTelemetryResponseModel.ts @@ -8,3 +8,4 @@ export type PagedTelemetryResponseModel = { total: number; items: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedUserGroupPresentationModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedUserGroupPresentationModel.ts index 8a01377edf..7000915e7e 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedUserGroupPresentationModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedUserGroupPresentationModel.ts @@ -8,3 +8,4 @@ export type PagedUserGroupPresentationModel = { total: number; items: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedUserResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedUserResponseModel.ts new file mode 100644 index 0000000000..0b658bd8df --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedUserResponseModel.ts @@ -0,0 +1,11 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { UserResponseModel } from './UserResponseModel'; + +export type PagedUserResponseModel = { + total: number; + items: Array; +}; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PartialViewItemResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PartialViewItemResponseModel.ts new file mode 100644 index 0000000000..545b2ebdd8 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PartialViewItemResponseModel.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { FileItemResponseModelBaseModel } from './FileItemResponseModelBaseModel'; + +export type PartialViewItemResponseModel = FileItemResponseModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ProfilingStatusRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ProfilingStatusRequestModel.ts index cc933cc8d4..c1998e149e 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ProfilingStatusRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ProfilingStatusRequestModel.ts @@ -5,3 +5,4 @@ export type ProfilingStatusRequestModel = { enabled?: boolean; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ProfilingStatusResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ProfilingStatusResponseModel.ts index 98b69d1149..b78df9baf7 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ProfilingStatusResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ProfilingStatusResponseModel.ts @@ -5,3 +5,4 @@ export type ProfilingStatusResponseModel = { enabled?: boolean; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PropertyTypeAppearanceModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PropertyTypeAppearanceModel.ts index cdbf7325af..e8138d4992 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PropertyTypeAppearanceModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PropertyTypeAppearanceModel.ts @@ -5,3 +5,4 @@ export type PropertyTypeAppearanceModel = { labelOnTop?: boolean; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PropertyTypeContainerResponseModelBaseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PropertyTypeContainerResponseModelBaseModel.ts index 44c151e3a4..e57942bc53 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PropertyTypeContainerResponseModelBaseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PropertyTypeContainerResponseModelBaseModel.ts @@ -3,9 +3,10 @@ /* eslint-disable */ export type PropertyTypeContainerResponseModelBaseModel = { - key?: string; - parentKey?: string | null; + id?: string; + parentId?: string | null; name?: string | null; type?: string; sortOrder?: number; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PropertyTypeResponseModelBaseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PropertyTypeResponseModelBaseModel.ts index 57f4f6c6dd..ad3a59bbbf 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PropertyTypeResponseModelBaseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PropertyTypeResponseModelBaseModel.ts @@ -6,14 +6,15 @@ import type { PropertyTypeAppearanceModel } from './PropertyTypeAppearanceModel' import type { PropertyTypeValidationModel } from './PropertyTypeValidationModel'; export type PropertyTypeResponseModelBaseModel = { - key?: string; - containerKey?: string | null; + id?: string; + containerId?: string | null; alias?: string; name?: string; description?: string | null; - dataTypeKey?: string; + dataTypeId?: string; variesByCulture?: boolean; variesBySegment?: boolean; validation?: PropertyTypeValidationModel; appearance?: PropertyTypeAppearanceModel; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PropertyTypeValidationModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PropertyTypeValidationModel.ts index efdc5b51ec..6966054e27 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PropertyTypeValidationModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PropertyTypeValidationModel.ts @@ -8,3 +8,4 @@ export type PropertyTypeValidationModel = { regEx?: string | null; regExMessage?: string | null; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/RecycleBinItemResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/RecycleBinItemResponseModel.ts index 203b715fb4..baa8488713 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/RecycleBinItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/RecycleBinItemResponseModel.ts @@ -4,11 +4,12 @@ export type RecycleBinItemResponseModel = { $type: string; - key?: string; + id?: string; name?: string; type?: string; icon?: string; hasChildren?: boolean; isContainer?: boolean; - parentKey?: string | null; + parentId?: string | null; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/RedirectUrlResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/RedirectUrlResponseModel.ts index d2c743ba79..7e50854125 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/RedirectUrlResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/RedirectUrlResponseModel.ts @@ -3,10 +3,11 @@ /* eslint-disable */ export type RedirectUrlResponseModel = { - key?: string; + id?: string; originalUrl?: string; destinationUrl?: string; created?: string; - contentKey?: string; + contentId?: string; culture?: string | null; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/RedirectUrlStatusResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/RedirectUrlStatusResponseModel.ts index 6ef9f24316..3c24019ae5 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/RedirectUrlStatusResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/RedirectUrlStatusResponseModel.ts @@ -8,3 +8,4 @@ export type RedirectUrlStatusResponseModel = { status?: RedirectStatusModel; userIsAdmin?: boolean; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/RelationItemResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/RelationItemResponseModel.ts index 2b261d21d2..544ea5831d 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/RelationItemResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/RelationItemResponseModel.ts @@ -3,7 +3,7 @@ /* eslint-disable */ export type RelationItemResponseModel = { - nodeKey?: string; + nodeId?: string; nodeName?: string | null; nodeType?: string | null; nodePublished?: boolean | null; @@ -14,3 +14,4 @@ export type RelationItemResponseModel = { relationTypeIsBidirectional?: boolean; relationTypeIsDependency?: boolean; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/RelationResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/RelationResponseModel.ts index 4fe5555e69..7e6546465f 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/RelationResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/RelationResponseModel.ts @@ -10,3 +10,4 @@ export type RelationResponseModel = { createDate?: string; comment?: string | null; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/RelationTypeBaseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/RelationTypeBaseModel.ts index e7de6f1945..0213197525 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/RelationTypeBaseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/RelationTypeBaseModel.ts @@ -9,3 +9,4 @@ export type RelationTypeBaseModel = { childObjectType?: string | null; isDependency?: boolean; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/RelationTypeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/RelationTypeItemResponseModel.ts new file mode 100644 index 0000000000..8458385428 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/RelationTypeItemResponseModel.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { ItemResponseModelBaseModel } from './ItemResponseModelBaseModel'; + +export type RelationTypeItemResponseModel = ItemResponseModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/RelationTypeResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/RelationTypeResponseModel.ts index dab718bbf1..cc2461d0ce 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/RelationTypeResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/RelationTypeResponseModel.ts @@ -5,10 +5,11 @@ import type { RelationTypeBaseModel } from './RelationTypeBaseModel'; export type RelationTypeResponseModel = (RelationTypeBaseModel & { -key?: string; -alias?: string | null; -path?: string; -isSystemRelationType?: boolean; -parentObjectTypeName?: string | null; -childObjectTypeName?: string | null; + id?: string; + alias?: string | null; + path?: string; + isSystemRelationType?: boolean; + parentObjectTypeName?: string | null; + childObjectTypeName?: string | null; }); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/SaveUserGroupRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/SaveUserGroupRequestModel.ts index 14466b644d..33d58dc4aa 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/SaveUserGroupRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/SaveUserGroupRequestModel.ts @@ -5,3 +5,4 @@ import type { UserGroupBaseModel } from './UserGroupBaseModel'; export type SaveUserGroupRequestModel = UserGroupBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/SavedLogSearchPresenationBaseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/SavedLogSearchPresenationBaseModel.ts index 2cc7b02658..c187d78876 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/SavedLogSearchPresenationBaseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/SavedLogSearchPresenationBaseModel.ts @@ -6,3 +6,4 @@ export type SavedLogSearchPresenationBaseModel = { name?: string; query?: string; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/SavedLogSearchRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/SavedLogSearchRequestModel.ts index e2e7aecf61..3ef1732e4e 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/SavedLogSearchRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/SavedLogSearchRequestModel.ts @@ -5,3 +5,4 @@ import type { SavedLogSearchPresenationBaseModel } from './SavedLogSearchPresenationBaseModel'; export type SavedLogSearchRequestModel = SavedLogSearchPresenationBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/SavedLogSearchResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/SavedLogSearchResponseModel.ts index 1a89ce91c6..54f039e1b9 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/SavedLogSearchResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/SavedLogSearchResponseModel.ts @@ -5,3 +5,4 @@ import type { SavedLogSearchPresenationBaseModel } from './SavedLogSearchPresenationBaseModel'; export type SavedLogSearchResponseModel = SavedLogSearchPresenationBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ScriptItemResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ScriptItemResponseModel.ts new file mode 100644 index 0000000000..1092e37cb1 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ScriptItemResponseModel.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { FileItemResponseModelBaseModel } from './FileItemResponseModelBaseModel'; + +export type ScriptItemResponseModel = FileItemResponseModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/SearchResultResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/SearchResultResponseModel.ts index 9706011ad7..3d84badc22 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/SearchResultResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/SearchResultResponseModel.ts @@ -10,3 +10,4 @@ export type SearchResultResponseModel = { readonly fieldCount?: number; fields?: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/SearcherResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/SearcherResponseModel.ts index 898a4172a8..bf0ec4ed22 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/SearcherResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/SearcherResponseModel.ts @@ -5,3 +5,4 @@ export type SearcherResponseModel = { name?: string; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ServerStatusResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ServerStatusResponseModel.ts index 5ba10b5849..a93b8e36ac 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ServerStatusResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ServerStatusResponseModel.ts @@ -7,3 +7,4 @@ import type { RuntimeLevelModel } from './RuntimeLevelModel'; export type ServerStatusResponseModel = { serverStatus?: RuntimeLevelModel; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/SetAvatarRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/SetAvatarRequestModel.ts new file mode 100644 index 0000000000..ccf61568d0 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/SetAvatarRequestModel.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type SetAvatarRequestModel = { + fileId?: string; +}; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/StaticFileItemResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/StaticFileItemResponseModel.ts new file mode 100644 index 0000000000..793190a8b7 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/StaticFileItemResponseModel.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { FileItemResponseModelBaseModel } from './FileItemResponseModelBaseModel'; + +export type StaticFileItemResponseModel = FileItemResponseModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/StylesheetItemResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/StylesheetItemResponseModel.ts new file mode 100644 index 0000000000..6b09804191 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/StylesheetItemResponseModel.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { FileItemResponseModelBaseModel } from './FileItemResponseModelBaseModel'; + +export type StylesheetItemResponseModel = FileItemResponseModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TelemetryRepresentationBaseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TelemetryRepresentationBaseModel.ts index 1734020f3e..e1040f19bb 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TelemetryRepresentationBaseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TelemetryRepresentationBaseModel.ts @@ -7,3 +7,4 @@ import type { TelemetryLevelModel } from './TelemetryLevelModel'; export type TelemetryRepresentationBaseModel = { telemetryLevel?: TelemetryLevelModel; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TelemetryRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TelemetryRequestModel.ts index 08f54adf7c..ed7ed14981 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TelemetryRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TelemetryRequestModel.ts @@ -5,3 +5,4 @@ import type { TelemetryRepresentationBaseModel } from './TelemetryRepresentationBaseModel'; export type TelemetryRequestModel = TelemetryRepresentationBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TelemetryResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TelemetryResponseModel.ts index 3ddf37ec02..2ab7ab6087 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TelemetryResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TelemetryResponseModel.ts @@ -5,3 +5,4 @@ import type { TelemetryRepresentationBaseModel } from './TelemetryRepresentationBaseModel'; export type TelemetryResponseModel = TelemetryRepresentationBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateItemResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateItemResponseModel.ts new file mode 100644 index 0000000000..023262e3b2 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateItemResponseModel.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { ItemResponseModelBaseModel } from './ItemResponseModelBaseModel'; + +export type TemplateItemResponseModel = ItemResponseModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateModelBaseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateModelBaseModel.ts index 11e0260809..7471d8b826 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateModelBaseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateModelBaseModel.ts @@ -7,3 +7,4 @@ export type TemplateModelBaseModel = { alias?: string; content?: string | null; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateQueryExecuteFilterPresentationModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateQueryExecuteFilterPresentationModel.ts index 83a2625447..336c8dcc51 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateQueryExecuteFilterPresentationModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateQueryExecuteFilterPresentationModel.ts @@ -9,3 +9,4 @@ export type TemplateQueryExecuteFilterPresentationModel = { constraintValue?: string; operator?: OperatorModel; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateQueryExecuteModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateQueryExecuteModel.ts index 29ad0c52ae..a1711fce8f 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateQueryExecuteModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateQueryExecuteModel.ts @@ -6,9 +6,10 @@ import type { TemplateQueryExecuteFilterPresentationModel } from './TemplateQuer import type { TemplateQueryExecuteSortModel } from './TemplateQueryExecuteSortModel'; export type TemplateQueryExecuteModel = { - rootContentKey?: string | null; + rootContentId?: string | null; contentTypeAlias?: string | null; filters?: Array | null; sort?: TemplateQueryExecuteSortModel | null; take?: number; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateQueryExecuteSortModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateQueryExecuteSortModel.ts index a733632dcc..d3a1b6cf56 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateQueryExecuteSortModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateQueryExecuteSortModel.ts @@ -6,3 +6,4 @@ export type TemplateQueryExecuteSortModel = { propertyAlias?: string; direction?: string | null; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateQueryOperatorModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateQueryOperatorModel.ts index df264e1646..5b24f440a5 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateQueryOperatorModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateQueryOperatorModel.ts @@ -9,3 +9,4 @@ export type TemplateQueryOperatorModel = { operator?: OperatorModel; applicableTypes?: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateQueryPropertyPresentationModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateQueryPropertyPresentationModel.ts index dfd201f49e..63f89b6fbd 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateQueryPropertyPresentationModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateQueryPropertyPresentationModel.ts @@ -8,3 +8,4 @@ export type TemplateQueryPropertyPresentationModel = { alias?: string; type?: TemplateQueryPropertyTypeModel; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateQueryResultItemPresentationModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateQueryResultItemPresentationModel.ts index a2082853e0..101a71f87f 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateQueryResultItemPresentationModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateQueryResultItemPresentationModel.ts @@ -6,3 +6,4 @@ export type TemplateQueryResultItemPresentationModel = { icon?: string; name?: string; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateQueryResultResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateQueryResultResponseModel.ts index c32ff1d249..128ba29cd6 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateQueryResultResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateQueryResultResponseModel.ts @@ -10,3 +10,4 @@ export type TemplateQueryResultResponseModel = { resultCount?: number; executionTime?: number; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateQuerySettingsResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateQuerySettingsResponseModel.ts index b49bbae056..724e4113eb 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateQuerySettingsResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateQuerySettingsResponseModel.ts @@ -10,3 +10,4 @@ export type TemplateQuerySettingsResponseModel = { properties?: Array; operators?: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateResponseModel.ts index 1044f35131..4163616f8f 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateResponseModel.ts @@ -5,6 +5,7 @@ import type { TemplateModelBaseModel } from './TemplateModelBaseModel'; export type TemplateResponseModel = (TemplateModelBaseModel & { -$type: string; -key?: string; + $type: string; + id?: string; }); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateScaffoldResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateScaffoldResponseModel.ts index d616c8c655..78ea2b296d 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateScaffoldResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemplateScaffoldResponseModel.ts @@ -5,3 +5,4 @@ export type TemplateScaffoldResponseModel = { content?: string; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemporaryFileResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemporaryFileResponseModel.ts new file mode 100644 index 0000000000..117d1376ea --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TemporaryFileResponseModel.ts @@ -0,0 +1,10 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type TemporaryFileResponseModel = { + id?: string; + availableUntil?: string | null; + fileName?: string; +}; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TreeItemPresentationModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TreeItemPresentationModel.ts index e62a6043a5..385278eba9 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TreeItemPresentationModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TreeItemPresentationModel.ts @@ -8,3 +8,4 @@ export type TreeItemPresentationModel = { icon?: string; hasChildren?: boolean; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UnlockUsersRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UnlockUsersRequestModel.ts new file mode 100644 index 0000000000..78c63357bd --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UnlockUsersRequestModel.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type UnlockUsersRequestModel = { + userIds?: Array; +}; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateContentRequestModelBaseDocumentValueModelDocumentVariantRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateContentRequestModelBaseDocumentValueModelDocumentVariantRequestModel.ts index c2d856a916..be30b01b27 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateContentRequestModelBaseDocumentValueModelDocumentVariantRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateContentRequestModelBaseDocumentValueModelDocumentVariantRequestModel.ts @@ -9,3 +9,4 @@ export type UpdateContentRequestModelBaseDocumentValueModelDocumentVariantReques values?: Array; variants?: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateContentRequestModelBaseMediaValueModelMediaVariantRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateContentRequestModelBaseMediaValueModelMediaVariantRequestModel.ts index 5c95019eb1..303415adef 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateContentRequestModelBaseMediaValueModelMediaVariantRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateContentRequestModelBaseMediaValueModelMediaVariantRequestModel.ts @@ -9,3 +9,4 @@ export type UpdateContentRequestModelBaseMediaValueModelMediaVariantRequestModel values?: Array; variants?: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateDataTypeRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateDataTypeRequestModel.ts index fce11fbc4e..b221f60b1f 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateDataTypeRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateDataTypeRequestModel.ts @@ -5,3 +5,4 @@ import type { DataTypeModelBaseModel } from './DataTypeModelBaseModel'; export type UpdateDataTypeRequestModel = DataTypeModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateDictionaryItemRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateDictionaryItemRequestModel.ts index 2c4af9822a..e145ccd319 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateDictionaryItemRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateDictionaryItemRequestModel.ts @@ -5,3 +5,4 @@ import type { DictionaryItemModelBaseModel } from './DictionaryItemModelBaseModel'; export type UpdateDictionaryItemRequestModel = DictionaryItemModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateDocumentNotificationsRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateDocumentNotificationsRequestModel.ts new file mode 100644 index 0000000000..37066167b2 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateDocumentNotificationsRequestModel.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type UpdateDocumentNotificationsRequestModel = { + subscribedActionIds?: Array; +}; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateDocumentRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateDocumentRequestModel.ts index 2b10730abb..6382ef989d 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateDocumentRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateDocumentRequestModel.ts @@ -5,5 +5,6 @@ import type { UpdateContentRequestModelBaseDocumentValueModelDocumentVariantRequestModel } from './UpdateContentRequestModelBaseDocumentValueModelDocumentVariantRequestModel'; export type UpdateDocumentRequestModel = (UpdateContentRequestModelBaseDocumentValueModelDocumentVariantRequestModel & { -templateKey?: string | null; + templateId?: string | null; }); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateDomainsRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateDomainsRequestModel.ts index 06caa5c458..a2cb1b6fe4 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateDomainsRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateDomainsRequestModel.ts @@ -5,3 +5,4 @@ import type { DomainsPresentationModelBaseModel } from './DomainsPresentationModelBaseModel'; export type UpdateDomainsRequestModel = DomainsPresentationModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateFolderReponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateFolderReponseModel.ts index 1644854933..cc79576144 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateFolderReponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateFolderReponseModel.ts @@ -5,3 +5,4 @@ import type { FolderModelBaseModel } from './FolderModelBaseModel'; export type UpdateFolderReponseModel = FolderModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateLanguageRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateLanguageRequestModel.ts index 45f9f1a76c..dd2e81b5f5 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateLanguageRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateLanguageRequestModel.ts @@ -5,3 +5,4 @@ import type { LanguageModelBaseModel } from './LanguageModelBaseModel'; export type UpdateLanguageRequestModel = LanguageModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateMediaRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateMediaRequestModel.ts index 8363477f55..3214fd055c 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateMediaRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateMediaRequestModel.ts @@ -5,3 +5,4 @@ import type { UpdateContentRequestModelBaseMediaValueModelMediaVariantRequestModel } from './UpdateContentRequestModelBaseMediaValueModelMediaVariantRequestModel'; export type UpdateMediaRequestModel = UpdateContentRequestModelBaseMediaValueModelMediaVariantRequestModel; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdatePackageRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdatePackageRequestModel.ts index ab91b916f3..95e1518519 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdatePackageRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdatePackageRequestModel.ts @@ -5,5 +5,6 @@ import type { PackageModelBaseModel } from './PackageModelBaseModel'; export type UpdatePackageRequestModel = (PackageModelBaseModel & { -packagePath?: string; + packagePath?: string; }); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateRelationTypeRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateRelationTypeRequestModel.ts index df64f4fb41..d4ec475f57 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateRelationTypeRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateRelationTypeRequestModel.ts @@ -5,3 +5,4 @@ import type { RelationTypeBaseModel } from './RelationTypeBaseModel'; export type UpdateRelationTypeRequestModel = RelationTypeBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateTemplateRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateTemplateRequestModel.ts index a95046e2f9..6011f0a108 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateTemplateRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateTemplateRequestModel.ts @@ -5,3 +5,4 @@ import type { TemplateModelBaseModel } from './TemplateModelBaseModel'; export type UpdateTemplateRequestModel = TemplateModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateUserGroupRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateUserGroupRequestModel.ts index 7e357408c1..f1810a85c5 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateUserGroupRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateUserGroupRequestModel.ts @@ -5,3 +5,4 @@ import type { UserGroupBaseModel } from './UserGroupBaseModel'; export type UpdateUserGroupRequestModel = UserGroupBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateUserGroupsOnUserRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateUserGroupsOnUserRequestModel.ts new file mode 100644 index 0000000000..0e552a780b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateUserGroupsOnUserRequestModel.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type UpdateUserGroupsOnUserRequestModel = { + userIds?: Array; + userGroupIds?: Array; +}; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateUserRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateUserRequestModel.ts new file mode 100644 index 0000000000..928742c00d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpdateUserRequestModel.ts @@ -0,0 +1,12 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { UserPresentationBaseModel } from './UserPresentationBaseModel'; + +export type UpdateUserRequestModel = (UserPresentationBaseModel & { + languageIsoCode?: string; + contentStartNodeIds?: Array; + mediaStartNodeIds?: Array; +}); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpgradeSettingsResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpgradeSettingsResponseModel.ts index 8331fa652a..c59279f453 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpgradeSettingsResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UpgradeSettingsResponseModel.ts @@ -9,3 +9,4 @@ export type UpgradeSettingsResponseModel = { oldVersion?: string; readonly reportUrl?: string; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UploadDictionaryResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UploadDictionaryResponseModel.ts deleted file mode 100644 index 3394ac66c7..0000000000 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UploadDictionaryResponseModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ImportDictionaryItemsPresentationModel } from './ImportDictionaryItemsPresentationModel'; - -export type UploadDictionaryResponseModel = { - dictionaryItems?: Array; - fileName?: string | null; -}; diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UserGroupBaseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UserGroupBaseModel.ts index 5da0876910..eaf8e83aa0 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UserGroupBaseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UserGroupBaseModel.ts @@ -8,7 +8,8 @@ export type UserGroupBaseModel = { sections?: Array; languages?: Array; hasAccessToAllLanguages?: boolean; - documentStartNodeKey?: string | null; - mediaStartNodeKey?: string | null; + documentStartNodeId?: string | null; + mediaStartNodeId?: string | null; permissions?: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UserGroupPresentationModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UserGroupPresentationModel.ts index e812fc9384..ee3a34c477 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UserGroupPresentationModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UserGroupPresentationModel.ts @@ -5,6 +5,7 @@ import type { UserGroupBaseModel } from './UserGroupBaseModel'; export type UserGroupPresentationModel = (UserGroupBaseModel & { -$type: string; -key?: string; + $type: string; + id?: string; }); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UserInstallResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UserInstallResponseModel.ts index c107963227..a1807e8bcd 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UserInstallResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UserInstallResponseModel.ts @@ -8,3 +8,4 @@ export type UserInstallResponseModel = { password: string; readonly subscribeToNewsletter?: boolean; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UserOrderModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UserOrderModel.ts new file mode 100644 index 0000000000..3c668a8c97 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UserOrderModel.ts @@ -0,0 +1,16 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export enum UserOrderModel { + USER_NAME = 'UserName', + LANGUAGE = 'Language', + NAME = 'Name', + EMAIL = 'Email', + ID = 'Id', + CREATE_DATE = 'CreateDate', + UPDATE_DATE = 'UpdateDate', + IS_APPROVED = 'IsApproved', + IS_LOCKED_OUT = 'IsLockedOut', + LAST_LOGIN_DATE = 'LastLoginDate', +} diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UserPresentationBaseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UserPresentationBaseModel.ts new file mode 100644 index 0000000000..687e34bde7 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UserPresentationBaseModel.ts @@ -0,0 +1,11 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type UserPresentationBaseModel = { + email?: string; + userName?: string; + name?: string; + userGroupIds?: Array; +}; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UserResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UserResponseModel.ts new file mode 100644 index 0000000000..69fabaf972 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UserResponseModel.ts @@ -0,0 +1,23 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { UserPresentationBaseModel } from './UserPresentationBaseModel'; +import type { UserStateModel } from './UserStateModel'; + +export type UserResponseModel = (UserPresentationBaseModel & { + $type: string; + id?: string; + languageIsoCode?: string | null; + contentStartNodeIds?: Array; + mediaStartNodeIds?: Array; + avatarUrls?: Array; + state?: UserStateModel; + failedLoginAttempts?: number; + createDate?: string; + updateDate?: string; + lastLoginDate?: string | null; + lastlockoutDate?: string | null; + lastPasswordChangeDate?: string | null; +}); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UserSettingsModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UserSettingsModel.ts index e5837a651d..0179397099 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UserSettingsModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UserSettingsModel.ts @@ -9,3 +9,4 @@ export type UserSettingsModel = { minNonAlphaNumericLength?: number; consentLevels?: Array; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UserStateModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UserStateModel.ts new file mode 100644 index 0000000000..7e1858868f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UserStateModel.ts @@ -0,0 +1,12 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export enum UserStateModel { + ACTIVE = 'Active', + DISABLED = 'Disabled', + LOCKED_OUT = 'LockedOut', + INVITED = 'Invited', + INACTIVE = 'Inactive', + ALL = 'All', +} diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ValueModelBaseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ValueModelBaseModel.ts index ef9d722992..8167e5e124 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ValueModelBaseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/ValueModelBaseModel.ts @@ -9,3 +9,4 @@ export type ValueModelBaseModel = { alias?: string; value?: any; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/VariantModelBaseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/VariantModelBaseModel.ts index b2227d9a71..599a5fd749 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/VariantModelBaseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/VariantModelBaseModel.ts @@ -8,3 +8,4 @@ export type VariantModelBaseModel = { segment?: string | null; name?: string; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/VariantResponseModelBaseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/VariantResponseModelBaseModel.ts index a0b2fa88a5..8add15bf08 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/VariantResponseModelBaseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/VariantResponseModelBaseModel.ts @@ -10,3 +10,4 @@ export type VariantResponseModelBaseModel = { createDate?: string; updateDate?: string; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/VersionResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/VersionResponseModel.ts index b454174231..e545e2d0d9 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/VersionResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/VersionResponseModel.ts @@ -5,3 +5,4 @@ export type VersionResponseModel = { version?: string; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/AuditLogResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/AuditLogResource.ts index f1c3b47e92..96065a5663 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/AuditLogResource.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/AuditLogResource.ts @@ -17,16 +17,16 @@ export class AuditLogResource { * @throws ApiError */ public static getAuditLog({ -orderDirection, -sinceDate, -skip, -take = 100, -}: { -orderDirection?: DirectionModel, -sinceDate?: string, -skip?: number, -take?: number, -}): CancelablePromise { + orderDirection, + sinceDate, + skip, + take = 100, + }: { + orderDirection?: DirectionModel, + sinceDate?: string, + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/audit-log', @@ -43,24 +43,24 @@ take?: number, * @returns PagedAuditLogResponseModel Success * @throws ApiError */ - public static getAuditLogByKey({ -key, -orderDirection, -sinceDate, -skip, -take = 100, -}: { -key: string, -orderDirection?: DirectionModel, -sinceDate?: string, -skip?: number, -take?: number, -}): CancelablePromise { + public static getAuditLogById({ + id, + orderDirection, + sinceDate, + skip, + take = 100, + }: { + id: string, + orderDirection?: DirectionModel, + sinceDate?: string, + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/audit-log/{key}', + url: '/umbraco/management/api/v1/audit-log/{id}', path: { - 'key': key, + 'id': id, }, query: { 'orderDirection': orderDirection, @@ -76,16 +76,16 @@ take?: number, * @throws ApiError */ public static getAuditLogTypeByLogType({ -logType, -sinceDate, -skip, -take = 100, -}: { -logType: AuditTypeModel, -sinceDate?: string, -skip?: number, -take?: number, -}): CancelablePromise { + logType, + sinceDate, + skip, + take = 100, + }: { + logType: AuditTypeModel, + sinceDate?: string, + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/audit-log/type/{logType}', diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/CultureResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/CultureResource.ts index 16fe49b915..4e357c7e3f 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/CultureResource.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/CultureResource.ts @@ -14,12 +14,12 @@ export class CultureResource { * @throws ApiError */ public static getCulture({ -skip, -take = 100, -}: { -skip?: number, -take?: number, -}): CancelablePromise { + skip, + take = 100, + }: { + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/culture', diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/DataTypeResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/DataTypeResource.ts index dddb4cd14f..ccf865111c 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/DataTypeResource.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/DataTypeResource.ts @@ -4,11 +4,10 @@ import type { CopyDataTypeRequestModel } from '../models/CopyDataTypeRequestModel'; import type { CreateDataTypeRequestModel } from '../models/CreateDataTypeRequestModel'; import type { CreateFolderRequestModel } from '../models/CreateFolderRequestModel'; +import type { DataTypeItemResponseModel } from '../models/DataTypeItemResponseModel'; import type { DataTypeReferenceResponseModel } from '../models/DataTypeReferenceResponseModel'; import type { DataTypeResponseModel } from '../models/DataTypeResponseModel'; -import type { DocumentTypeTreeItemResponseModel } from '../models/DocumentTypeTreeItemResponseModel'; import type { FolderReponseModel } from '../models/FolderReponseModel'; -import type { FolderTreeItemResponseModel } from '../models/FolderTreeItemResponseModel'; import type { MoveDataTypeRequestModel } from '../models/MoveDataTypeRequestModel'; import type { PagedFolderTreeItemResponseModel } from '../models/PagedFolderTreeItemResponseModel'; import type { UpdateDataTypeRequestModel } from '../models/UpdateDataTypeRequestModel'; @@ -25,10 +24,10 @@ export class DataTypeResource { * @throws ApiError */ public static postDataType({ -requestBody, -}: { -requestBody?: CreateDataTypeRequestModel, -}): CancelablePromise { + requestBody, + }: { + requestBody?: CreateDataTypeRequestModel, + }): CancelablePromise { return __request(OpenAPI, { method: 'POST', url: '/umbraco/management/api/v1/data-type', @@ -46,16 +45,16 @@ requestBody?: CreateDataTypeRequestModel, * @returns any Success * @throws ApiError */ - public static getDataTypeByKey({ -key, -}: { -key: string, -}): CancelablePromise { + public static getDataTypeById({ + id, + }: { + id: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/data-type/{key}', + url: '/umbraco/management/api/v1/data-type/{id}', path: { - 'key': key, + 'id': id, }, errors: { 404: `Not Found`, @@ -67,16 +66,16 @@ key: string, * @returns any Success * @throws ApiError */ - public static deleteDataTypeByKey({ -key, -}: { -key: string, -}): CancelablePromise { + public static deleteDataTypeById({ + id, + }: { + id: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'DELETE', - url: '/umbraco/management/api/v1/data-type/{key}', + url: '/umbraco/management/api/v1/data-type/{id}', path: { - 'key': key, + 'id': id, }, errors: { 400: `Bad Request`, @@ -89,18 +88,18 @@ key: string, * @returns any Success * @throws ApiError */ - public static putDataTypeByKey({ -key, -requestBody, -}: { -key: string, -requestBody?: UpdateDataTypeRequestModel, -}): CancelablePromise { + public static putDataTypeById({ + id, + requestBody, + }: { + id: string, + requestBody?: UpdateDataTypeRequestModel, + }): CancelablePromise { return __request(OpenAPI, { method: 'PUT', - url: '/umbraco/management/api/v1/data-type/{key}', + url: '/umbraco/management/api/v1/data-type/{id}', path: { - 'key': key, + 'id': id, }, body: requestBody, mediaType: 'application/json', @@ -115,18 +114,18 @@ requestBody?: UpdateDataTypeRequestModel, * @returns string Created * @throws ApiError */ - public static postDataTypeByKeyCopy({ -key, -requestBody, -}: { -key: string, -requestBody?: CopyDataTypeRequestModel, -}): CancelablePromise { + public static postDataTypeByIdCopy({ + id, + requestBody, + }: { + id: string, + requestBody?: CopyDataTypeRequestModel, + }): CancelablePromise { return __request(OpenAPI, { method: 'POST', - url: '/umbraco/management/api/v1/data-type/{key}/copy', + url: '/umbraco/management/api/v1/data-type/{id}/copy', path: { - 'key': key, + 'id': id, }, body: requestBody, mediaType: 'application/json', @@ -141,18 +140,18 @@ requestBody?: CopyDataTypeRequestModel, * @returns any Success * @throws ApiError */ - public static postDataTypeByKeyMove({ -key, -requestBody, -}: { -key: string, -requestBody?: MoveDataTypeRequestModel, -}): CancelablePromise { + public static postDataTypeByIdMove({ + id, + requestBody, + }: { + id: string, + requestBody?: MoveDataTypeRequestModel, + }): CancelablePromise { return __request(OpenAPI, { method: 'POST', - url: '/umbraco/management/api/v1/data-type/{key}/move', + url: '/umbraco/management/api/v1/data-type/{id}/move', path: { - 'key': key, + 'id': id, }, body: requestBody, mediaType: 'application/json', @@ -166,16 +165,16 @@ requestBody?: MoveDataTypeRequestModel, * @returns any Success * @throws ApiError */ - public static getDataTypeByKeyReferences({ -key, -}: { -key: string, -}): CancelablePromise> { + public static getDataTypeByIdReferences({ + id, + }: { + id: string, + }): CancelablePromise> { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/data-type/{key}/references', + url: '/umbraco/management/api/v1/data-type/{id}/references', path: { - 'key': key, + 'id': id, }, errors: { 404: `Not Found`, @@ -188,10 +187,10 @@ key: string, * @throws ApiError */ public static postDataTypeFolder({ -requestBody, -}: { -requestBody?: CreateFolderRequestModel, -}): CancelablePromise { + requestBody, + }: { + requestBody?: CreateFolderRequestModel, + }): CancelablePromise { return __request(OpenAPI, { method: 'POST', url: '/umbraco/management/api/v1/data-type/folder', @@ -205,16 +204,16 @@ requestBody?: CreateFolderRequestModel, * @returns any Success * @throws ApiError */ - public static getDataTypeFolderByKey({ -key, -}: { -key: string, -}): CancelablePromise { + public static getDataTypeFolderById({ + id, + }: { + id: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/data-type/folder/{key}', + url: '/umbraco/management/api/v1/data-type/folder/{id}', path: { - 'key': key, + 'id': id, }, errors: { 404: `Not Found`, @@ -226,16 +225,16 @@ key: string, * @returns any Success * @throws ApiError */ - public static deleteDataTypeFolderByKey({ -key, -}: { -key: string, -}): CancelablePromise { + public static deleteDataTypeFolderById({ + id, + }: { + id: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'DELETE', - url: '/umbraco/management/api/v1/data-type/folder/{key}', + url: '/umbraco/management/api/v1/data-type/folder/{id}', path: { - 'key': key, + 'id': id, }, errors: { 404: `Not Found`, @@ -247,18 +246,18 @@ key: string, * @returns any Success * @throws ApiError */ - public static putDataTypeFolderByKey({ -key, -requestBody, -}: { -key: string, -requestBody?: UpdateFolderReponseModel, -}): CancelablePromise { + public static putDataTypeFolderById({ + id, + requestBody, + }: { + id: string, + requestBody?: UpdateFolderReponseModel, + }): CancelablePromise { return __request(OpenAPI, { method: 'PUT', - url: '/umbraco/management/api/v1/data-type/folder/{key}', + url: '/umbraco/management/api/v1/data-type/folder/{id}', path: { - 'key': key, + 'id': id, }, body: requestBody, mediaType: 'application/json', @@ -269,46 +268,46 @@ requestBody?: UpdateFolderReponseModel, } /** - * @returns PagedFolderTreeItemResponseModel Success + * @returns any Success * @throws ApiError */ - public static getTreeDataTypeChildren({ -parentKey, -skip, -take = 100, -foldersOnly = false, -}: { -parentKey?: string, -skip?: number, -take?: number, -foldersOnly?: boolean, -}): CancelablePromise { + public static getDataTypeItem({ + id, + }: { + id?: Array, + }): CancelablePromise> { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/tree/data-type/children', + url: '/umbraco/management/api/v1/data-type/item', query: { - 'parentKey': parentKey, - 'skip': skip, - 'take': take, - 'foldersOnly': foldersOnly, + 'id': id, }, }); } /** - * @returns any Success + * @returns PagedFolderTreeItemResponseModel Success * @throws ApiError */ - public static getTreeDataTypeItem({ -key, -}: { -key?: Array, -}): CancelablePromise> { + public static getTreeDataTypeChildren({ + parentId, + skip, + take = 100, + foldersOnly = false, + }: { + parentId?: string, + skip?: number, + take?: number, + foldersOnly?: boolean, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/tree/data-type/item', + url: '/umbraco/management/api/v1/tree/data-type/children', query: { - 'key': key, + 'parentId': parentId, + 'skip': skip, + 'take': take, + 'foldersOnly': foldersOnly, }, }); } @@ -318,14 +317,14 @@ key?: Array, * @throws ApiError */ public static getTreeDataTypeRoot({ -skip, -take = 100, -foldersOnly = false, -}: { -skip?: number, -take?: number, -foldersOnly?: boolean, -}): CancelablePromise { + skip, + take = 100, + foldersOnly = false, + }: { + skip?: number, + take?: number, + foldersOnly?: boolean, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/tree/data-type/root', diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/DictionaryResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/DictionaryResource.ts index b2a18ac44d..bbc8823aa0 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/DictionaryResource.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/DictionaryResource.ts @@ -2,15 +2,13 @@ /* tslint:disable */ /* eslint-disable */ import type { CreateDictionaryItemRequestModel } from '../models/CreateDictionaryItemRequestModel'; +import type { DictionaryItemItemResponseModel } from '../models/DictionaryItemItemResponseModel'; import type { DictionaryItemResponseModel } from '../models/DictionaryItemResponseModel'; -import type { DocumentTypeTreeItemResponseModel } from '../models/DocumentTypeTreeItemResponseModel'; -import type { FolderTreeItemResponseModel } from '../models/FolderTreeItemResponseModel'; import type { ImportDictionaryRequestModel } from '../models/ImportDictionaryRequestModel'; import type { MoveDictionaryRequestModel } from '../models/MoveDictionaryRequestModel'; import type { PagedDictionaryOverviewResponseModel } from '../models/PagedDictionaryOverviewResponseModel'; import type { PagedEntityTreeItemResponseModel } from '../models/PagedEntityTreeItemResponseModel'; import type { UpdateDictionaryItemRequestModel } from '../models/UpdateDictionaryItemRequestModel'; -import type { UploadDictionaryResponseModel } from '../models/UploadDictionaryResponseModel'; import type { CancelablePromise } from '../core/CancelablePromise'; import { OpenAPI } from '../core/OpenAPI'; @@ -23,12 +21,12 @@ export class DictionaryResource { * @throws ApiError */ public static getDictionary({ -skip, -take = 100, -}: { -skip?: number, -take?: number, -}): CancelablePromise { + skip, + take = 100, + }: { + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/dictionary', @@ -44,10 +42,10 @@ take?: number, * @throws ApiError */ public static postDictionary({ -requestBody, -}: { -requestBody?: CreateDictionaryItemRequestModel, -}): CancelablePromise { + requestBody, + }: { + requestBody?: CreateDictionaryItemRequestModel, + }): CancelablePromise { return __request(OpenAPI, { method: 'POST', url: '/umbraco/management/api/v1/dictionary', @@ -66,16 +64,16 @@ requestBody?: CreateDictionaryItemRequestModel, * @returns any Success * @throws ApiError */ - public static getDictionaryByKey({ -key, -}: { -key: string, -}): CancelablePromise { + public static getDictionaryById({ + id, + }: { + id: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/dictionary/{key}', + url: '/umbraco/management/api/v1/dictionary/{id}', path: { - 'key': key, + 'id': id, }, errors: { 404: `Not Found`, @@ -87,16 +85,16 @@ key: string, * @returns any Success * @throws ApiError */ - public static deleteDictionaryByKey({ -key, -}: { -key: string, -}): CancelablePromise { + public static deleteDictionaryById({ + id, + }: { + id: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'DELETE', - url: '/umbraco/management/api/v1/dictionary/{key}', + url: '/umbraco/management/api/v1/dictionary/{id}', path: { - 'key': key, + 'id': id, }, errors: { 400: `Bad Request`, @@ -109,18 +107,18 @@ key: string, * @returns any Success * @throws ApiError */ - public static putDictionaryByKey({ -key, -requestBody, -}: { -key: string, -requestBody?: UpdateDictionaryItemRequestModel, -}): CancelablePromise { + public static putDictionaryById({ + id, + requestBody, + }: { + id: string, + requestBody?: UpdateDictionaryItemRequestModel, + }): CancelablePromise { return __request(OpenAPI, { method: 'PUT', - url: '/umbraco/management/api/v1/dictionary/{key}', + url: '/umbraco/management/api/v1/dictionary/{id}', path: { - 'key': key, + 'id': id, }, body: requestBody, mediaType: 'application/json', @@ -135,18 +133,18 @@ requestBody?: UpdateDictionaryItemRequestModel, * @returns binary Success * @throws ApiError */ - public static getDictionaryByKeyExport({ -key, -includeChildren = false, -}: { -key: string, -includeChildren?: boolean, -}): CancelablePromise { + public static getDictionaryByIdExport({ + id, + includeChildren = false, + }: { + id: string, + includeChildren?: boolean, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/dictionary/{key}/export', + url: '/umbraco/management/api/v1/dictionary/{id}/export', path: { - 'key': key, + 'id': id, }, query: { 'includeChildren': includeChildren, @@ -161,18 +159,18 @@ includeChildren?: boolean, * @returns any Success * @throws ApiError */ - public static postDictionaryByKeyMove({ -key, -requestBody, -}: { -key: string, -requestBody?: MoveDictionaryRequestModel, -}): CancelablePromise { + public static postDictionaryByIdMove({ + id, + requestBody, + }: { + id: string, + requestBody?: MoveDictionaryRequestModel, + }): CancelablePromise { return __request(OpenAPI, { method: 'POST', - url: '/umbraco/management/api/v1/dictionary/{key}/move', + url: '/umbraco/management/api/v1/dictionary/{id}/move', path: { - 'key': key, + 'id': id, }, body: requestBody, mediaType: 'application/json', @@ -188,10 +186,10 @@ requestBody?: MoveDictionaryRequestModel, * @throws ApiError */ public static postDictionaryImport({ -requestBody, -}: { -requestBody?: ImportDictionaryRequestModel, -}): CancelablePromise { + requestBody, + }: { + requestBody?: ImportDictionaryRequestModel, + }): CancelablePromise { return __request(OpenAPI, { method: 'POST', url: '/umbraco/management/api/v1/dictionary/import', @@ -209,17 +207,16 @@ requestBody?: ImportDictionaryRequestModel, * @returns any Success * @throws ApiError */ - public static postDictionaryUpload({ -requestBody, -}: { -requestBody?: any, -}): CancelablePromise { + public static getDictionaryItem({ + id, + }: { + id?: Array, + }): CancelablePromise> { return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/dictionary/upload', - body: requestBody, - errors: { - 400: `Bad Request`, + method: 'GET', + url: '/umbraco/management/api/v1/dictionary/item', + query: { + 'id': id, }, }); } @@ -229,54 +226,36 @@ requestBody?: any, * @throws ApiError */ public static getTreeDictionaryChildren({ -parentKey, -skip, -take = 100, -}: { -parentKey?: string, -skip?: number, -take?: number, -}): CancelablePromise { + parentId, + skip, + take = 100, + }: { + parentId?: string, + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/tree/dictionary/children', query: { - 'parentKey': parentKey, + 'parentId': parentId, 'skip': skip, 'take': take, }, }); } - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeDictionaryItem({ -key, -}: { -key?: Array, -}): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/dictionary/item', - query: { - 'key': key, - }, - }); - } - /** * @returns PagedEntityTreeItemResponseModel Success * @throws ApiError */ public static getTreeDictionaryRoot({ -skip, -take = 100, -}: { -skip?: number, -take?: number, -}): CancelablePromise { + skip, + take = 100, + }: { + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/tree/dictionary/root', diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/DocumentBlueprintResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/DocumentBlueprintResource.ts index 5a31940e98..1708739c36 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/DocumentBlueprintResource.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/DocumentBlueprintResource.ts @@ -1,7 +1,7 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { DocumentBlueprintTreeItemResponseModel } from '../models/DocumentBlueprintTreeItemResponseModel'; +import type { DocumentBlueprintResponseModel } from '../models/DocumentBlueprintResponseModel'; import type { PagedDocumentBlueprintTreeItemResponseModel } from '../models/PagedDocumentBlueprintTreeItemResponseModel'; import type { CancelablePromise } from '../core/CancelablePromise'; @@ -14,16 +14,16 @@ export class DocumentBlueprintResource { * @returns any Success * @throws ApiError */ - public static getTreeDocumentBlueprintItem({ -key, -}: { -key?: Array, -}): CancelablePromise> { + public static getDocumentBlueprintItem({ + id, + }: { + id?: Array, + }): CancelablePromise> { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/tree/document-blueprint/item', + url: '/umbraco/management/api/v1/document-blueprint/item', query: { - 'key': key, + 'id': id, }, }); } @@ -33,12 +33,12 @@ key?: Array, * @throws ApiError */ public static getTreeDocumentBlueprintRoot({ -skip, -take = 100, -}: { -skip?: number, -take?: number, -}): CancelablePromise { + skip, + take = 100, + }: { + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/tree/document-blueprint/root', diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/DocumentResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/DocumentResource.ts index 8d30863d05..5758389b26 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/DocumentResource.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/DocumentResource.ts @@ -2,10 +2,12 @@ /* tslint:disable */ /* eslint-disable */ import type { CreateDocumentRequestModel } from '../models/CreateDocumentRequestModel'; +import type { DocumentItemResponseModel } from '../models/DocumentItemResponseModel'; +import type { DocumentNotificationResponseModel } from '../models/DocumentNotificationResponseModel'; import type { DocumentResponseModel } from '../models/DocumentResponseModel'; -import type { DocumentTreeItemResponseModel } from '../models/DocumentTreeItemResponseModel'; import type { PagedDocumentTreeItemResponseModel } from '../models/PagedDocumentTreeItemResponseModel'; import type { PagedRecycleBinItemResponseModel } from '../models/PagedRecycleBinItemResponseModel'; +import type { UpdateDocumentNotificationsRequestModel } from '../models/UpdateDocumentNotificationsRequestModel'; import type { UpdateDocumentRequestModel } from '../models/UpdateDocumentRequestModel'; import type { UpdateDomainsRequestModel } from '../models/UpdateDomainsRequestModel'; @@ -20,10 +22,10 @@ export class DocumentResource { * @throws ApiError */ public static postDocument({ -requestBody, -}: { -requestBody?: CreateDocumentRequestModel, -}): CancelablePromise { + requestBody, + }: { + requestBody?: CreateDocumentRequestModel, + }): CancelablePromise { return __request(OpenAPI, { method: 'POST', url: '/umbraco/management/api/v1/document', @@ -41,16 +43,16 @@ requestBody?: CreateDocumentRequestModel, * @returns any Success * @throws ApiError */ - public static getDocumentByKey({ -key, -}: { -key: string, -}): CancelablePromise { + public static getDocumentById({ + id, + }: { + id: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/document/{key}', + url: '/umbraco/management/api/v1/document/{id}', path: { - 'key': key, + 'id': id, }, errors: { 404: `Not Found`, @@ -62,16 +64,16 @@ key: string, * @returns any Success * @throws ApiError */ - public static deleteDocumentByKey({ -key, -}: { -key: string, -}): CancelablePromise { + public static deleteDocumentById({ + id, + }: { + id: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'DELETE', - url: '/umbraco/management/api/v1/document/{key}', + url: '/umbraco/management/api/v1/document/{id}', path: { - 'key': key, + 'id': id, }, errors: { 400: `Bad Request`, @@ -84,18 +86,18 @@ key: string, * @returns any Success * @throws ApiError */ - public static putDocumentByKey({ -key, -requestBody, -}: { -key: string, -requestBody?: UpdateDocumentRequestModel, -}): CancelablePromise { + public static putDocumentById({ + id, + requestBody, + }: { + id: string, + requestBody?: UpdateDocumentRequestModel, + }): CancelablePromise { return __request(OpenAPI, { method: 'PUT', - url: '/umbraco/management/api/v1/document/{key}', + url: '/umbraco/management/api/v1/document/{id}', path: { - 'key': key, + 'id': id, }, body: requestBody, mediaType: 'application/json', @@ -110,16 +112,16 @@ requestBody?: UpdateDocumentRequestModel, * @returns any Success * @throws ApiError */ - public static getDocumentByKeyDomains({ -key, -}: { -key: string, -}): CancelablePromise { + public static getDocumentByIdDomains({ + id, + }: { + id: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/document/{key}/domains', + url: '/umbraco/management/api/v1/document/{id}/domains', path: { - 'key': key, + 'id': id, }, }); } @@ -128,42 +130,112 @@ key: string, * @returns any Success * @throws ApiError */ - public static putDocumentByKeyDomains({ -key, -requestBody, -}: { -key: string, -requestBody?: UpdateDomainsRequestModel, -}): CancelablePromise { + public static putDocumentByIdDomains({ + id, + requestBody, + }: { + id: string, + requestBody?: UpdateDomainsRequestModel, + }): CancelablePromise { return __request(OpenAPI, { method: 'PUT', - url: '/umbraco/management/api/v1/document/{key}/domains', + url: '/umbraco/management/api/v1/document/{id}/domains', path: { - 'key': key, + 'id': id, }, body: requestBody, mediaType: 'application/json', }); } + /** + * @returns any Success + * @throws ApiError + */ + public static getDocumentByIdNotifications({ + id, + }: { + id: string, + }): CancelablePromise> { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/document/{id}/notifications', + path: { + 'id': id, + }, + errors: { + 404: `Not Found`, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static putDocumentByIdNotifications({ + id, + requestBody, + }: { + id: string, + requestBody?: UpdateDocumentNotificationsRequestModel, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/document/{id}/notifications', + path: { + 'id': id, + }, + body: requestBody, + mediaType: 'application/json', + errors: { + 404: `Not Found`, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static getDocumentItem({ + id, + dataTypeId, + culture, + }: { + id?: Array, + dataTypeId?: string, + culture?: string, + }): CancelablePromise> { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/document/item', + query: { + 'id': id, + 'dataTypeId': dataTypeId, + 'culture': culture, + }, + }); + } + /** * @returns PagedRecycleBinItemResponseModel Success * @throws ApiError */ public static getRecycleBinDocumentChildren({ -parentKey, -skip, -take = 100, -}: { -parentKey?: string, -skip?: number, -take?: number, -}): CancelablePromise { + parentId, + skip, + take = 100, + }: { + parentId?: string, + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/recycle-bin/document/children', query: { - 'parentKey': parentKey, + 'parentId': parentId, 'skip': skip, 'take': take, }, @@ -178,12 +250,12 @@ take?: number, * @throws ApiError */ public static getRecycleBinDocumentRoot({ -skip, -take = 100, -}: { -skip?: number, -take?: number, -}): CancelablePromise { + skip, + take = 100, + }: { + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/recycle-bin/document/root', @@ -202,50 +274,26 @@ take?: number, * @throws ApiError */ public static getTreeDocumentChildren({ -parentKey, -skip, -take = 100, -dataTypeKey, -culture, -}: { -parentKey?: string, -skip?: number, -take?: number, -dataTypeKey?: string, -culture?: string, -}): CancelablePromise { + parentId, + skip, + take = 100, + dataTypeId, + culture, + }: { + parentId?: string, + skip?: number, + take?: number, + dataTypeId?: string, + culture?: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/tree/document/children', query: { - 'parentKey': parentKey, + 'parentId': parentId, 'skip': skip, 'take': take, - 'dataTypeKey': dataTypeKey, - 'culture': culture, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeDocumentItem({ -key, -dataTypeKey, -culture, -}: { -key?: Array, -dataTypeKey?: string, -culture?: string, -}): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/document/item', - query: { - 'key': key, - 'dataTypeKey': dataTypeKey, + 'dataTypeId': dataTypeId, 'culture': culture, }, }); @@ -256,23 +304,23 @@ culture?: string, * @throws ApiError */ public static getTreeDocumentRoot({ -skip, -take = 100, -dataTypeKey, -culture, -}: { -skip?: number, -take?: number, -dataTypeKey?: string, -culture?: string, -}): CancelablePromise { + skip, + take = 100, + dataTypeId, + culture, + }: { + skip?: number, + take?: number, + dataTypeId?: string, + culture?: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/tree/document/root', query: { 'skip': skip, 'take': take, - 'dataTypeKey': dataTypeKey, + 'dataTypeId': dataTypeId, 'culture': culture, }, }); diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/DocumentTypeResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/DocumentTypeResource.ts index 5d034deb83..430d840e9d 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/DocumentTypeResource.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/DocumentTypeResource.ts @@ -1,8 +1,8 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import type { DocumentTypeItemResponseModel } from '../models/DocumentTypeItemResponseModel'; import type { DocumentTypeResponseModel } from '../models/DocumentTypeResponseModel'; -import type { DocumentTypeTreeItemResponseModel } from '../models/DocumentTypeTreeItemResponseModel'; import type { PagedDocumentTypeTreeItemResponseModel } from '../models/PagedDocumentTypeTreeItemResponseModel'; import type { CancelablePromise } from '../core/CancelablePromise'; @@ -15,16 +15,16 @@ export class DocumentTypeResource { * @returns any Success * @throws ApiError */ - public static getDocumentTypeByKey({ -key, -}: { -key: string, -}): CancelablePromise { + public static getDocumentTypeById({ + id, + }: { + id: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/document-type/{key}', + url: '/umbraco/management/api/v1/document-type/{id}', path: { - 'key': key, + 'id': id, }, errors: { 404: `Not Found`, @@ -32,26 +32,44 @@ key: string, }); } + /** + * @returns any Success + * @throws ApiError + */ + public static getDocumentTypeItem({ + id, + }: { + id?: Array, + }): CancelablePromise> { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/document-type/item', + query: { + 'id': id, + }, + }); + } + /** * @returns PagedDocumentTypeTreeItemResponseModel Success * @throws ApiError */ public static getTreeDocumentTypeChildren({ -parentKey, -skip, -take = 100, -foldersOnly = false, -}: { -parentKey?: string, -skip?: number, -take?: number, -foldersOnly?: boolean, -}): CancelablePromise { + parentId, + skip, + take = 100, + foldersOnly = false, + }: { + parentId?: string, + skip?: number, + take?: number, + foldersOnly?: boolean, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/tree/document-type/children', query: { - 'parentKey': parentKey, + 'parentId': parentId, 'skip': skip, 'take': take, 'foldersOnly': foldersOnly, @@ -59,37 +77,19 @@ foldersOnly?: boolean, }); } - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeDocumentTypeItem({ -key, -}: { -key?: Array, -}): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/document-type/item', - query: { - 'key': key, - }, - }); - } - /** * @returns PagedDocumentTypeTreeItemResponseModel Success * @throws ApiError */ public static getTreeDocumentTypeRoot({ -skip, -take = 100, -foldersOnly = false, -}: { -skip?: number, -take?: number, -foldersOnly?: boolean, -}): CancelablePromise { + skip, + take = 100, + foldersOnly = false, + }: { + skip?: number, + take?: number, + foldersOnly?: boolean, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/tree/document-type/root', diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/HealthCheckResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/HealthCheckResource.ts index d7100791c1..6ec8cf2917 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/HealthCheckResource.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/HealthCheckResource.ts @@ -18,12 +18,12 @@ export class HealthCheckResource { * @throws ApiError */ public static getHealthCheckGroup({ -skip, -take = 100, -}: { -skip?: number, -take?: number, -}): CancelablePromise { + skip, + take = 100, + }: { + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/health-check-group', @@ -39,10 +39,10 @@ take?: number, * @throws ApiError */ public static getHealthCheckGroupByName({ -name, -}: { -name: string, -}): CancelablePromise { + name, + }: { + name: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/health-check-group/{name}', @@ -60,10 +60,10 @@ name: string, * @throws ApiError */ public static postHealthCheckGroupByNameCheck({ -name, -}: { -name: string, -}): CancelablePromise { + name, + }: { + name: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'POST', url: '/umbraco/management/api/v1/health-check-group/{name}/check', @@ -81,10 +81,10 @@ name: string, * @throws ApiError */ public static postHealthCheckExecuteAction({ -requestBody, -}: { -requestBody?: HealthCheckActionRequestModel, -}): CancelablePromise { + requestBody, + }: { + requestBody?: HealthCheckActionRequestModel, + }): CancelablePromise { return __request(OpenAPI, { method: 'POST', url: '/umbraco/management/api/v1/health-check/execute-action', diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/HelpResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/HelpResource.ts index c9377a09fc..e3a76d04ae 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/HelpResource.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/HelpResource.ts @@ -14,18 +14,18 @@ export class HelpResource { * @throws ApiError */ public static getHelp({ -section, -tree, -skip, -take, -baseUrl = 'https://our.umbraco.com', -}: { -section?: string, -tree?: string, -skip?: number, -take?: number, -baseUrl?: string, -}): CancelablePromise { + section, + tree, + skip, + take, + baseUrl = 'https://our.umbraco.com', + }: { + section?: string, + tree?: string, + skip?: number, + take?: number, + baseUrl?: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/help', diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/IndexerResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/IndexerResource.ts index 0ba53cc918..3b8485e122 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/IndexerResource.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/IndexerResource.ts @@ -16,12 +16,12 @@ export class IndexerResource { * @throws ApiError */ public static getIndexer({ -skip, -take, -}: { -skip?: number, -take?: number, -}): CancelablePromise { + skip, + take, + }: { + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/indexer', @@ -37,10 +37,10 @@ take?: number, * @throws ApiError */ public static getIndexerByIndexName({ -indexName, -}: { -indexName: string, -}): CancelablePromise { + indexName, + }: { + indexName: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/indexer/{indexName}', @@ -58,10 +58,10 @@ indexName: string, * @throws ApiError */ public static postIndexerByIndexNameRebuild({ -indexName, -}: { -indexName: string, -}): CancelablePromise { + indexName, + }: { + indexName: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'POST', url: '/umbraco/management/api/v1/indexer/{indexName}/rebuild', diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/InstallResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/InstallResource.ts index dcf826bbcf..927209fa7d 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/InstallResource.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/InstallResource.ts @@ -31,10 +31,10 @@ export class InstallResource { * @throws ApiError */ public static postInstallSetup({ -requestBody, -}: { -requestBody?: InstallVResponseModel, -}): CancelablePromise { + requestBody, + }: { + requestBody?: InstallVResponseModel, + }): CancelablePromise { return __request(OpenAPI, { method: 'POST', url: '/umbraco/management/api/v1/install/setup', @@ -52,10 +52,10 @@ requestBody?: InstallVResponseModel, * @throws ApiError */ public static postInstallValidateDatabase({ -requestBody, -}: { -requestBody?: DatabaseInstallResponseModel, -}): CancelablePromise { + requestBody, + }: { + requestBody?: DatabaseInstallResponseModel, + }): CancelablePromise { return __request(OpenAPI, { method: 'POST', url: '/umbraco/management/api/v1/install/validate-database', diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/LanguageResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/LanguageResource.ts index 51967f3fce..cc77a2ee60 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/LanguageResource.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/LanguageResource.ts @@ -2,6 +2,7 @@ /* tslint:disable */ /* eslint-disable */ import type { CreateLanguageRequestModel } from '../models/CreateLanguageRequestModel'; +import type { LanguageItemResponseModel } from '../models/LanguageItemResponseModel'; import type { LanguageResponseModel } from '../models/LanguageResponseModel'; import type { PagedLanguageResponseModel } from '../models/PagedLanguageResponseModel'; import type { UpdateLanguageRequestModel } from '../models/UpdateLanguageRequestModel'; @@ -17,12 +18,12 @@ export class LanguageResource { * @throws ApiError */ public static getLanguage({ -skip, -take = 100, -}: { -skip?: number, -take?: number, -}): CancelablePromise { + skip, + take = 100, + }: { + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/language', @@ -38,10 +39,10 @@ take?: number, * @throws ApiError */ public static postLanguage({ -requestBody, -}: { -requestBody?: CreateLanguageRequestModel, -}): CancelablePromise { + requestBody, + }: { + requestBody?: CreateLanguageRequestModel, + }): CancelablePromise { return __request(OpenAPI, { method: 'POST', url: '/umbraco/management/api/v1/language', @@ -60,10 +61,10 @@ requestBody?: CreateLanguageRequestModel, * @throws ApiError */ public static getLanguageByIsoCode({ -isoCode, -}: { -isoCode: string, -}): CancelablePromise { + isoCode, + }: { + isoCode: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/language/{isoCode}', @@ -81,10 +82,10 @@ isoCode: string, * @throws ApiError */ public static deleteLanguageByIsoCode({ -isoCode, -}: { -isoCode: string, -}): CancelablePromise { + isoCode, + }: { + isoCode: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'DELETE', url: '/umbraco/management/api/v1/language/{isoCode}', @@ -103,12 +104,12 @@ isoCode: string, * @throws ApiError */ public static putLanguageByIsoCode({ -isoCode, -requestBody, -}: { -isoCode: string, -requestBody?: UpdateLanguageRequestModel, -}): CancelablePromise { + isoCode, + requestBody, + }: { + isoCode: string, + requestBody?: UpdateLanguageRequestModel, + }): CancelablePromise { return __request(OpenAPI, { method: 'PUT', url: '/umbraco/management/api/v1/language/{isoCode}', @@ -124,4 +125,22 @@ requestBody?: UpdateLanguageRequestModel, }); } + /** + * @returns any Success + * @throws ApiError + */ + public static getLanguageItem({ + isoCode, + }: { + isoCode?: Array, + }): CancelablePromise> { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/language/item', + query: { + 'isoCode': isoCode, + }, + }); + } + } diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/LogViewerResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/LogViewerResource.ts index ef9b3cbf79..dc8cf7baa1 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/LogViewerResource.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/LogViewerResource.ts @@ -22,12 +22,12 @@ export class LogViewerResource { * @throws ApiError */ public static getLogViewerLevel({ -skip, -take = 100, -}: { -skip?: number, -take?: number, -}): CancelablePromise { + skip, + take = 100, + }: { + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/log-viewer/level', @@ -43,12 +43,12 @@ take?: number, * @throws ApiError */ public static getLogViewerLevelCount({ -startDate, -endDate, -}: { -startDate?: string, -endDate?: string, -}): CancelablePromise { + startDate, + endDate, + }: { + startDate?: string, + endDate?: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/log-viewer/level-count', @@ -67,22 +67,22 @@ endDate?: string, * @throws ApiError */ public static getLogViewerLog({ -skip, -take = 100, -orderDirection, -filterExpression, -logLevel, -startDate, -endDate, -}: { -skip?: number, -take?: number, -orderDirection?: DirectionModel, -filterExpression?: string, -logLevel?: Array, -startDate?: string, -endDate?: string, -}): CancelablePromise { + skip, + take = 100, + orderDirection, + filterExpression, + logLevel, + startDate, + endDate, + }: { + skip?: number, + take?: number, + orderDirection?: DirectionModel, + filterExpression?: string, + logLevel?: Array, + startDate?: string, + endDate?: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/log-viewer/log', @@ -103,16 +103,16 @@ endDate?: string, * @throws ApiError */ public static getLogViewerMessageTemplate({ -skip, -take = 100, -startDate, -endDate, -}: { -skip?: number, -take?: number, -startDate?: string, -endDate?: string, -}): CancelablePromise { + skip, + take = 100, + startDate, + endDate, + }: { + skip?: number, + take?: number, + startDate?: string, + endDate?: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/log-viewer/message-template', @@ -133,12 +133,12 @@ endDate?: string, * @throws ApiError */ public static getLogViewerSavedSearch({ -skip, -take = 100, -}: { -skip?: number, -take?: number, -}): CancelablePromise { + skip, + take = 100, + }: { + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/log-viewer/saved-search', @@ -154,10 +154,10 @@ take?: number, * @throws ApiError */ public static postLogViewerSavedSearch({ -requestBody, -}: { -requestBody?: SavedLogSearchRequestModel, -}): CancelablePromise { + requestBody, + }: { + requestBody?: SavedLogSearchRequestModel, + }): CancelablePromise { return __request(OpenAPI, { method: 'POST', url: '/umbraco/management/api/v1/log-viewer/saved-search', @@ -175,10 +175,10 @@ requestBody?: SavedLogSearchRequestModel, * @throws ApiError */ public static getLogViewerSavedSearchByName({ -name, -}: { -name: string, -}): CancelablePromise { + name, + }: { + name: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/log-viewer/saved-search/{name}', @@ -196,10 +196,10 @@ name: string, * @throws ApiError */ public static deleteLogViewerSavedSearchByName({ -name, -}: { -name: string, -}): CancelablePromise { + name, + }: { + name: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'DELETE', url: '/umbraco/management/api/v1/log-viewer/saved-search/{name}', @@ -217,12 +217,12 @@ name: string, * @throws ApiError */ public static getLogViewerValidateLogsSize({ -startDate, -endDate, -}: { -startDate?: string, -endDate?: string, -}): CancelablePromise { + startDate, + endDate, + }: { + startDate?: string, + endDate?: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/log-viewer/validate-logs-size', diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/MediaResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/MediaResource.ts index bd2f3e59d6..4e0385a534 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/MediaResource.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/MediaResource.ts @@ -5,6 +5,7 @@ import type { ContentTreeItemResponseModel } from '../models/ContentTreeItemResp import type { CreateMediaRequestModel } from '../models/CreateMediaRequestModel'; import type { DocumentResponseModel } from '../models/DocumentResponseModel'; import type { DocumentTreeItemResponseModel } from '../models/DocumentTreeItemResponseModel'; +import type { MediaItemResponseModel } from '../models/MediaItemResponseModel'; import type { PagedContentTreeItemResponseModel } from '../models/PagedContentTreeItemResponseModel'; import type { PagedRecycleBinItemResponseModel } from '../models/PagedRecycleBinItemResponseModel'; import type { UpdateMediaRequestModel } from '../models/UpdateMediaRequestModel'; @@ -20,10 +21,10 @@ export class MediaResource { * @throws ApiError */ public static postMedia({ -requestBody, -}: { -requestBody?: CreateMediaRequestModel, -}): CancelablePromise { + requestBody, + }: { + requestBody?: CreateMediaRequestModel, + }): CancelablePromise { return __request(OpenAPI, { method: 'POST', url: '/umbraco/management/api/v1/media', @@ -41,16 +42,16 @@ requestBody?: CreateMediaRequestModel, * @returns any Success * @throws ApiError */ - public static getMediaByKey({ -key, -}: { -key: string, -}): CancelablePromise { + public static getMediaById({ + id, + }: { + id: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/media/{key}', + url: '/umbraco/management/api/v1/media/{id}', path: { - 'key': key, + 'id': id, }, errors: { 404: `Not Found`, @@ -62,16 +63,16 @@ key: string, * @returns any Success * @throws ApiError */ - public static deleteMediaByKey({ -key, -}: { -key: string, -}): CancelablePromise { + public static deleteMediaById({ + id, + }: { + id: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'DELETE', - url: '/umbraco/management/api/v1/media/{key}', + url: '/umbraco/management/api/v1/media/{id}', path: { - 'key': key, + 'id': id, }, errors: { 400: `Bad Request`, @@ -84,18 +85,18 @@ key: string, * @returns any Success * @throws ApiError */ - public static putMediaByKey({ -key, -requestBody, -}: { -key: string, -requestBody?: UpdateMediaRequestModel, -}): CancelablePromise { + public static putMediaById({ + id, + requestBody, + }: { + id: string, + requestBody?: UpdateMediaRequestModel, + }): CancelablePromise { return __request(OpenAPI, { method: 'PUT', - url: '/umbraco/management/api/v1/media/{key}', + url: '/umbraco/management/api/v1/media/{id}', path: { - 'key': key, + 'id': id, }, body: requestBody, mediaType: 'application/json', @@ -106,24 +107,45 @@ requestBody?: UpdateMediaRequestModel, }); } + /** + * @returns any Success + * @throws ApiError + */ + public static getMediaItem({ + id, + dataTypeId, + }: { + id?: Array, + dataTypeId?: string, + }): CancelablePromise> { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/media/item', + query: { + 'id': id, + 'dataTypeId': dataTypeId, + }, + }); + } + /** * @returns PagedRecycleBinItemResponseModel Success * @throws ApiError */ public static getRecycleBinMediaChildren({ -parentKey, -skip, -take = 100, -}: { -parentKey?: string, -skip?: number, -take?: number, -}): CancelablePromise { + parentId, + skip, + take = 100, + }: { + parentId?: string, + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/recycle-bin/media/children', query: { - 'parentKey': parentKey, + 'parentId': parentId, 'skip': skip, 'take': take, }, @@ -138,12 +160,12 @@ take?: number, * @throws ApiError */ public static getRecycleBinMediaRoot({ -skip, -take = 100, -}: { -skip?: number, -take?: number, -}): CancelablePromise { + skip, + take = 100, + }: { + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/recycle-bin/media/root', @@ -162,24 +184,24 @@ take?: number, * @throws ApiError */ public static getTreeMediaChildren({ -parentKey, -skip, -take = 100, -dataTypeKey, -}: { -parentKey?: string, -skip?: number, -take?: number, -dataTypeKey?: string, -}): CancelablePromise { + parentId, + skip, + take = 100, + dataTypeId, + }: { + parentId?: string, + skip?: number, + take?: number, + dataTypeId?: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/tree/media/children', query: { - 'parentKey': parentKey, + 'parentId': parentId, 'skip': skip, 'take': take, - 'dataTypeKey': dataTypeKey, + 'dataTypeId': dataTypeId, }, }); } @@ -189,18 +211,18 @@ dataTypeKey?: string, * @throws ApiError */ public static getTreeMediaItem({ -key, -dataTypeKey, -}: { -key?: Array, -dataTypeKey?: string, -}): CancelablePromise> { + id, + dataTypeId, + }: { + id?: Array, + dataTypeId?: string, + }): CancelablePromise> { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/tree/media/item', query: { - 'key': key, - 'dataTypeKey': dataTypeKey, + 'id': id, + 'dataTypeId': dataTypeId, }, }); } @@ -210,21 +232,21 @@ dataTypeKey?: string, * @throws ApiError */ public static getTreeMediaRoot({ -skip, -take = 100, -dataTypeKey, -}: { -skip?: number, -take?: number, -dataTypeKey?: string, -}): CancelablePromise { + skip, + take = 100, + dataTypeId, + }: { + skip?: number, + take?: number, + dataTypeId?: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/tree/media/root', query: { 'skip': skip, 'take': take, - 'dataTypeKey': dataTypeKey, + 'dataTypeId': dataTypeId, }, }); } diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/MediaTypeResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/MediaTypeResource.ts index e8cd962868..c86145f403 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/MediaTypeResource.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/MediaTypeResource.ts @@ -1,8 +1,7 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { DocumentTypeTreeItemResponseModel } from '../models/DocumentTypeTreeItemResponseModel'; -import type { FolderTreeItemResponseModel } from '../models/FolderTreeItemResponseModel'; +import type { MediaTypeItemResponseModel } from '../models/MediaTypeItemResponseModel'; import type { MediaTypeResponseModel } from '../models/MediaTypeResponseModel'; import type { PagedFolderTreeItemResponseModel } from '../models/PagedFolderTreeItemResponseModel'; @@ -16,16 +15,16 @@ export class MediaTypeResource { * @returns any Success * @throws ApiError */ - public static getMediaTypeByKey({ -key, -}: { -key: string, -}): CancelablePromise { + public static getMediaTypeById({ + id, + }: { + id: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/media-type/{key}', + url: '/umbraco/management/api/v1/media-type/{id}', path: { - 'key': key, + 'id': id, }, errors: { 404: `Not Found`, @@ -33,26 +32,44 @@ key: string, }); } + /** + * @returns any Success + * @throws ApiError + */ + public static getMediaTypeItem({ + id, + }: { + id?: Array, + }): CancelablePromise> { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/media-type/item', + query: { + 'id': id, + }, + }); + } + /** * @returns PagedFolderTreeItemResponseModel Success * @throws ApiError */ public static getTreeMediaTypeChildren({ -parentKey, -skip, -take = 100, -foldersOnly = false, -}: { -parentKey?: string, -skip?: number, -take?: number, -foldersOnly?: boolean, -}): CancelablePromise { + parentId, + skip, + take = 100, + foldersOnly = false, + }: { + parentId?: string, + skip?: number, + take?: number, + foldersOnly?: boolean, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/tree/media-type/children', query: { - 'parentKey': parentKey, + 'parentId': parentId, 'skip': skip, 'take': take, 'foldersOnly': foldersOnly, @@ -60,37 +77,19 @@ foldersOnly?: boolean, }); } - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeMediaTypeItem({ -key, -}: { -key?: Array, -}): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/media-type/item', - query: { - 'key': key, - }, - }); - } - /** * @returns PagedFolderTreeItemResponseModel Success * @throws ApiError */ public static getTreeMediaTypeRoot({ -skip, -take = 100, -foldersOnly = false, -}: { -skip?: number, -take?: number, -foldersOnly?: boolean, -}): CancelablePromise { + skip, + take = 100, + foldersOnly = false, + }: { + skip?: number, + take?: number, + foldersOnly?: boolean, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/tree/media-type/root', diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/MemberGroupResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/MemberGroupResource.ts index d0845c8968..3ef4601fe2 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/MemberGroupResource.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/MemberGroupResource.ts @@ -1,12 +1,7 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ContentTreeItemResponseModel } from '../models/ContentTreeItemResponseModel'; -import type { DocumentBlueprintTreeItemResponseModel } from '../models/DocumentBlueprintTreeItemResponseModel'; -import type { DocumentTreeItemResponseModel } from '../models/DocumentTreeItemResponseModel'; -import type { DocumentTypeTreeItemResponseModel } from '../models/DocumentTypeTreeItemResponseModel'; -import type { EntityTreeItemResponseModel } from '../models/EntityTreeItemResponseModel'; -import type { FolderTreeItemResponseModel } from '../models/FolderTreeItemResponseModel'; +import type { MemberGroupItemReponseModel } from '../models/MemberGroupItemReponseModel'; import type { PagedEntityTreeItemResponseModel } from '../models/PagedEntityTreeItemResponseModel'; import type { CancelablePromise } from '../core/CancelablePromise'; @@ -19,16 +14,16 @@ export class MemberGroupResource { * @returns any Success * @throws ApiError */ - public static getTreeMemberGroupItem({ -key, -}: { -key?: Array, -}): CancelablePromise> { + public static getMemberGroupItem({ + id, + }: { + id?: Array, + }): CancelablePromise> { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/tree/member-group/item', + url: '/umbraco/management/api/v1/member-group/item', query: { - 'key': key, + 'id': id, }, }); } @@ -38,12 +33,12 @@ key?: Array, * @throws ApiError */ public static getTreeMemberGroupRoot({ -skip, -take = 100, -}: { -skip?: number, -take?: number, -}): CancelablePromise { + skip, + take = 100, + }: { + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/tree/member-group/root', diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/MemberTypeResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/MemberTypeResource.ts index 3336953d5a..3545cb4bca 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/MemberTypeResource.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/MemberTypeResource.ts @@ -1,12 +1,7 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ContentTreeItemResponseModel } from '../models/ContentTreeItemResponseModel'; -import type { DocumentBlueprintTreeItemResponseModel } from '../models/DocumentBlueprintTreeItemResponseModel'; -import type { DocumentTreeItemResponseModel } from '../models/DocumentTreeItemResponseModel'; -import type { DocumentTypeTreeItemResponseModel } from '../models/DocumentTypeTreeItemResponseModel'; -import type { EntityTreeItemResponseModel } from '../models/EntityTreeItemResponseModel'; -import type { FolderTreeItemResponseModel } from '../models/FolderTreeItemResponseModel'; +import type { MemberTypeItemResponseModel } from '../models/MemberTypeItemResponseModel'; import type { PagedEntityTreeItemResponseModel } from '../models/PagedEntityTreeItemResponseModel'; import type { CancelablePromise } from '../core/CancelablePromise'; @@ -19,16 +14,16 @@ export class MemberTypeResource { * @returns any Success * @throws ApiError */ - public static getTreeMemberTypeItem({ -key, -}: { -key?: Array, -}): CancelablePromise> { + public static getMemberTypeItem({ + id, + }: { + id?: Array, + }): CancelablePromise> { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/tree/member-type/item', + url: '/umbraco/management/api/v1/member-type/item', query: { - 'key': key, + 'id': id, }, }); } @@ -38,12 +33,12 @@ key?: Array, * @throws ApiError */ public static getTreeMemberTypeRoot({ -skip, -take = 100, -}: { -skip?: number, -take?: number, -}): CancelablePromise { + skip, + take = 100, + }: { + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/tree/member-type/root', diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/ObjectTypesResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/ObjectTypesResource.ts index c87823f5aa..b25a8644ce 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/ObjectTypesResource.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/ObjectTypesResource.ts @@ -14,12 +14,12 @@ export class ObjectTypesResource { * @throws ApiError */ public static getObjectTypes({ -skip, -take = 100, -}: { -skip?: number, -take?: number, -}): CancelablePromise { + skip, + take = 100, + }: { + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/object-types', diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/PackageResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/PackageResource.ts index d33c63d582..0d64af3fd7 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/PackageResource.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/PackageResource.ts @@ -19,10 +19,10 @@ export class PackageResource { * @throws ApiError */ public static postPackageByNameRunMigration({ -name, -}: { -name: string, -}): CancelablePromise { + name, + }: { + name: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'POST', url: '/umbraco/management/api/v1/package/{name}/run-migration', @@ -41,12 +41,12 @@ name: string, * @throws ApiError */ public static getPackageCreated({ -skip, -take = 100, -}: { -skip?: number, -take?: number, -}): CancelablePromise { + skip, + take = 100, + }: { + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/package/created', @@ -62,10 +62,10 @@ take?: number, * @throws ApiError */ public static postPackageCreated({ -requestBody, -}: { -requestBody?: CreatePackageRequestModel, -}): CancelablePromise { + requestBody, + }: { + requestBody?: CreatePackageRequestModel, + }): CancelablePromise { return __request(OpenAPI, { method: 'POST', url: '/umbraco/management/api/v1/package/created', @@ -83,16 +83,16 @@ requestBody?: CreatePackageRequestModel, * @returns any Success * @throws ApiError */ - public static getPackageCreatedByKey({ -key, -}: { -key: string, -}): CancelablePromise { + public static getPackageCreatedById({ + id, + }: { + id: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/package/created/{key}', + url: '/umbraco/management/api/v1/package/created/{id}', path: { - 'key': key, + 'id': id, }, errors: { 404: `Not Found`, @@ -104,16 +104,16 @@ key: string, * @returns any Success * @throws ApiError */ - public static deletePackageCreatedByKey({ -key, -}: { -key: string, -}): CancelablePromise { + public static deletePackageCreatedById({ + id, + }: { + id: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'DELETE', - url: '/umbraco/management/api/v1/package/created/{key}', + url: '/umbraco/management/api/v1/package/created/{id}', path: { - 'key': key, + 'id': id, }, errors: { 404: `Not Found`, @@ -125,18 +125,18 @@ key: string, * @returns any Success * @throws ApiError */ - public static putPackageCreatedByKey({ -key, -requestBody, -}: { -key: string, -requestBody?: UpdatePackageRequestModel, -}): CancelablePromise { + public static putPackageCreatedById({ + id, + requestBody, + }: { + id: string, + requestBody?: UpdatePackageRequestModel, + }): CancelablePromise { return __request(OpenAPI, { method: 'PUT', - url: '/umbraco/management/api/v1/package/created/{key}', + url: '/umbraco/management/api/v1/package/created/{id}', path: { - 'key': key, + 'id': id, }, body: requestBody, mediaType: 'application/json', @@ -150,16 +150,16 @@ requestBody?: UpdatePackageRequestModel, * @returns binary Success * @throws ApiError */ - public static getPackageCreatedByKeyDownload({ -key, -}: { -key: string, -}): CancelablePromise { + public static getPackageCreatedByIdDownload({ + id, + }: { + id: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/package/created/{key}/download', + url: '/umbraco/management/api/v1/package/created/{id}/download', path: { - 'key': key, + 'id': id, }, errors: { 404: `Not Found`, @@ -183,12 +183,12 @@ key: string, * @throws ApiError */ public static getPackageMigrationStatus({ -skip, -take = 100, -}: { -skip?: number, -take?: number, -}): CancelablePromise { + skip, + take = 100, + }: { + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/package/migration-status', diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/PartialViewResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/PartialViewResource.ts index f249b42346..3bceafadbc 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/PartialViewResource.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/PartialViewResource.ts @@ -1,8 +1,8 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { FileSystemTreeItemPresentationModel } from '../models/FileSystemTreeItemPresentationModel'; import type { PagedFileSystemTreeItemPresentationModel } from '../models/PagedFileSystemTreeItemPresentationModel'; +import type { PartialViewItemResponseModel } from '../models/PartialViewItemResponseModel'; import type { CancelablePromise } from '../core/CancelablePromise'; import { OpenAPI } from '../core/OpenAPI'; @@ -10,19 +10,37 @@ import { request as __request } from '../core/request'; export class PartialViewResource { + /** + * @returns any Success + * @throws ApiError + */ + public static getPartialViewItem({ + id, + }: { + id?: Array, + }): CancelablePromise> { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/partial-view/item', + query: { + 'id': id, + }, + }); + } + /** * @returns PagedFileSystemTreeItemPresentationModel Success * @throws ApiError */ public static getTreePartialViewChildren({ -path, -skip, -take = 100, -}: { -path?: string, -skip?: number, -take?: number, -}): CancelablePromise { + path, + skip, + take = 100, + }: { + path?: string, + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/tree/partial-view/children', @@ -34,35 +52,17 @@ take?: number, }); } - /** - * @returns any Success - * @throws ApiError - */ - public static getTreePartialViewItem({ -path, -}: { -path?: Array, -}): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/partial-view/item', - query: { - 'path': path, - }, - }); - } - /** * @returns PagedFileSystemTreeItemPresentationModel Success * @throws ApiError */ public static getTreePartialViewRoot({ -skip, -take = 100, -}: { -skip?: number, -take?: number, -}): CancelablePromise { + skip, + take = 100, + }: { + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/tree/partial-view/root', diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/ProfilingResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/ProfilingResource.ts index ddd5d31988..81422ff13b 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/ProfilingResource.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/ProfilingResource.ts @@ -26,10 +26,10 @@ export class ProfilingResource { * @throws ApiError */ public static putProfilingStatus({ -requestBody, -}: { -requestBody?: ProfilingStatusRequestModel, -}): CancelablePromise { + requestBody, + }: { + requestBody?: ProfilingStatusRequestModel, + }): CancelablePromise { return __request(OpenAPI, { method: 'PUT', url: '/umbraco/management/api/v1/profiling/status', diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/RedirectManagementResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/RedirectManagementResource.ts index 2c82d24fcd..2d12b27858 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/RedirectManagementResource.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/RedirectManagementResource.ts @@ -16,14 +16,14 @@ export class RedirectManagementResource { * @throws ApiError */ public static getRedirectManagement({ -filter, -skip, -take, -}: { -filter?: string, -skip?: number, -take?: number, -}): CancelablePromise { + filter, + skip, + take, + }: { + filter?: string, + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/redirect-management', @@ -42,20 +42,20 @@ take?: number, * @returns PagedRedirectUrlResponseModel Success * @throws ApiError */ - public static getRedirectManagementByKey({ -key, -skip, -take, -}: { -key: string, -skip?: number, -take?: number, -}): CancelablePromise { + public static getRedirectManagementById({ + id, + skip, + take, + }: { + id: string, + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/redirect-management/{key}', + url: '/umbraco/management/api/v1/redirect-management/{id}', path: { - 'key': key, + 'id': id, }, query: { 'skip': skip, @@ -68,16 +68,16 @@ take?: number, * @returns any Success * @throws ApiError */ - public static deleteRedirectManagementByKey({ -key, -}: { -key: string, -}): CancelablePromise { + public static deleteRedirectManagementById({ + id, + }: { + id: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'DELETE', - url: '/umbraco/management/api/v1/redirect-management/{key}', + url: '/umbraco/management/api/v1/redirect-management/{id}', path: { - 'key': key, + 'id': id, }, }); } @@ -98,10 +98,10 @@ key: string, * @throws ApiError */ public static postRedirectManagementStatus({ -status, -}: { -status?: RedirectStatusModel, -}): CancelablePromise { + status, + }: { + status?: RedirectStatusModel, + }): CancelablePromise { return __request(OpenAPI, { method: 'POST', url: '/umbraco/management/api/v1/redirect-management/status', diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/RelationResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/RelationResource.ts index 69d6c06860..3c5ef6f3c7 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/RelationResource.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/RelationResource.ts @@ -15,10 +15,10 @@ export class RelationResource { * @throws ApiError */ public static getRelationById({ -id, -}: { -id: number, -}): CancelablePromise { + id, + }: { + id: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/relation/{id}', @@ -36,16 +36,16 @@ id: number, * @throws ApiError */ public static getRelationChildRelationByChildId({ -childId, -skip, -take, -relationTypeAlias = '', -}: { -childId: number, -skip?: number, -take?: number, -relationTypeAlias?: string, -}): CancelablePromise { + childId, + skip, + take, + relationTypeAlias = '', + }: { + childId: number, + skip?: number, + take?: number, + relationTypeAlias?: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/relation/child-relation/{childId}', @@ -64,20 +64,20 @@ relationTypeAlias?: string, * @returns PagedRelationResponseModel Success * @throws ApiError */ - public static getRelationTypeByKey({ -key, -skip, -take = 100, -}: { -key: string, -skip?: number, -take?: number, -}): CancelablePromise { + public static getRelationTypeById({ + id, + skip, + take = 100, + }: { + id: string, + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/relation/type/{key}', + url: '/umbraco/management/api/v1/relation/type/{id}', path: { - 'key': key, + 'id': id, }, query: { 'skip': skip, diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/RelationTypeResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/RelationTypeResource.ts index 1c9c7bb266..76f60d04a6 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/RelationTypeResource.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/RelationTypeResource.ts @@ -2,9 +2,8 @@ /* tslint:disable */ /* eslint-disable */ import type { CreateRelationTypeRequestModel } from '../models/CreateRelationTypeRequestModel'; -import type { DocumentTypeTreeItemResponseModel } from '../models/DocumentTypeTreeItemResponseModel'; -import type { FolderTreeItemResponseModel } from '../models/FolderTreeItemResponseModel'; import type { PagedEntityTreeItemResponseModel } from '../models/PagedEntityTreeItemResponseModel'; +import type { RelationTypeItemResponseModel } from '../models/RelationTypeItemResponseModel'; import type { RelationTypeResponseModel } from '../models/RelationTypeResponseModel'; import type { UpdateRelationTypeRequestModel } from '../models/UpdateRelationTypeRequestModel'; @@ -19,10 +18,10 @@ export class RelationTypeResource { * @throws ApiError */ public static postRelationType({ -requestBody, -}: { -requestBody?: CreateRelationTypeRequestModel, -}): CancelablePromise { + requestBody, + }: { + requestBody?: CreateRelationTypeRequestModel, + }): CancelablePromise { return __request(OpenAPI, { method: 'POST', url: '/umbraco/management/api/v1/relation-type', @@ -39,16 +38,16 @@ requestBody?: CreateRelationTypeRequestModel, * @returns any Success * @throws ApiError */ - public static getRelationTypeByKey({ -key, -}: { -key: string, -}): CancelablePromise { + public static getRelationTypeById({ + id, + }: { + id: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/relation-type/{key}', + url: '/umbraco/management/api/v1/relation-type/{id}', path: { - 'key': key, + 'id': id, }, errors: { 404: `Not Found`, @@ -60,16 +59,16 @@ key: string, * @returns any Success * @throws ApiError */ - public static deleteRelationTypeByKey({ -key, -}: { -key: string, -}): CancelablePromise { + public static deleteRelationTypeById({ + id, + }: { + id: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'DELETE', - url: '/umbraco/management/api/v1/relation-type/{key}', + url: '/umbraco/management/api/v1/relation-type/{id}', path: { - 'key': key, + 'id': id, }, errors: { 404: `Not Found`, @@ -81,18 +80,18 @@ key: string, * @returns any Success * @throws ApiError */ - public static putRelationTypeByKey({ -key, -requestBody, -}: { -key: string, -requestBody?: UpdateRelationTypeRequestModel, -}): CancelablePromise { + public static putRelationTypeById({ + id, + requestBody, + }: { + id: string, + requestBody?: UpdateRelationTypeRequestModel, + }): CancelablePromise { return __request(OpenAPI, { method: 'PUT', - url: '/umbraco/management/api/v1/relation-type/{key}', + url: '/umbraco/management/api/v1/relation-type/{id}', path: { - 'key': key, + 'id': id, }, body: requestBody, mediaType: 'application/json', @@ -107,16 +106,16 @@ requestBody?: UpdateRelationTypeRequestModel, * @returns any Success * @throws ApiError */ - public static getTreeRelationTypeItem({ -key, -}: { -key?: Array, -}): CancelablePromise> { + public static getRelationTypeItem({ + id, + }: { + id?: Array, + }): CancelablePromise> { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/tree/relation-type/item', + url: '/umbraco/management/api/v1/relation-type/item', query: { - 'key': key, + 'id': id, }, }); } @@ -126,12 +125,12 @@ key?: Array, * @throws ApiError */ public static getTreeRelationTypeRoot({ -skip, -take = 100, -}: { -skip?: number, -take?: number, -}): CancelablePromise { + skip, + take = 100, + }: { + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/tree/relation-type/root', diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/ScriptResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/ScriptResource.ts index db3cb6e256..7804889dd5 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/ScriptResource.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/ScriptResource.ts @@ -1,8 +1,8 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { FileSystemTreeItemPresentationModel } from '../models/FileSystemTreeItemPresentationModel'; import type { PagedFileSystemTreeItemPresentationModel } from '../models/PagedFileSystemTreeItemPresentationModel'; +import type { ScriptItemResponseModel } from '../models/ScriptItemResponseModel'; import type { CancelablePromise } from '../core/CancelablePromise'; import { OpenAPI } from '../core/OpenAPI'; @@ -10,19 +10,37 @@ import { request as __request } from '../core/request'; export class ScriptResource { + /** + * @returns any Success + * @throws ApiError + */ + public static getScriptItem({ + path, + }: { + path?: Array, + }): CancelablePromise> { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/script/item', + query: { + 'path': path, + }, + }); + } + /** * @returns PagedFileSystemTreeItemPresentationModel Success * @throws ApiError */ public static getTreeScriptChildren({ -path, -skip, -take = 100, -}: { -path?: string, -skip?: number, -take?: number, -}): CancelablePromise { + path, + skip, + take = 100, + }: { + path?: string, + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/tree/script/children', @@ -34,35 +52,17 @@ take?: number, }); } - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeScriptItem({ -path, -}: { -path?: Array, -}): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/script/item', - query: { - 'path': path, - }, - }); - } - /** * @returns PagedFileSystemTreeItemPresentationModel Success * @throws ApiError */ public static getTreeScriptRoot({ -skip, -take = 100, -}: { -skip?: number, -take?: number, -}): CancelablePromise { + skip, + take = 100, + }: { + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/tree/script/root', diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/SearcherResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/SearcherResource.ts index b284454529..68b20fe3ee 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/SearcherResource.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/SearcherResource.ts @@ -15,12 +15,12 @@ export class SearcherResource { * @throws ApiError */ public static getSearcher({ -skip, -take, -}: { -skip?: number, -take?: number, -}): CancelablePromise { + skip, + take, + }: { + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/searcher', @@ -36,16 +36,16 @@ take?: number, * @throws ApiError */ public static getSearcherBySearcherNameQuery({ -searcherName, -term, -skip, -take, -}: { -searcherName: string, -term?: string, -skip?: number, -take?: number, -}): CancelablePromise { + searcherName, + term, + skip, + take, + }: { + searcherName: string, + term?: string, + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/searcher/{searcherName}/query', diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/StaticFileResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/StaticFileResource.ts index 240af80ee8..83645d7d1f 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/StaticFileResource.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/StaticFileResource.ts @@ -1,7 +1,6 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { FileSystemTreeItemPresentationModel } from '../models/FileSystemTreeItemPresentationModel'; import type { PagedFileSystemTreeItemPresentationModel } from '../models/PagedFileSystemTreeItemPresentationModel'; import type { CancelablePromise } from '../core/CancelablePromise'; @@ -15,14 +14,14 @@ export class StaticFileResource { * @throws ApiError */ public static getTreeStaticFileChildren({ -path, -skip, -take = 100, -}: { -path?: string, -skip?: number, -take?: number, -}): CancelablePromise { + path, + skip, + take = 100, + }: { + path?: string, + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/tree/static-file/children', @@ -34,35 +33,17 @@ take?: number, }); } - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeStaticFileItem({ -path, -}: { -path?: Array, -}): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/static-file/item', - query: { - 'path': path, - }, - }); - } - /** * @returns PagedFileSystemTreeItemPresentationModel Success * @throws ApiError */ public static getTreeStaticFileRoot({ -skip, -take = 100, -}: { -skip?: number, -take?: number, -}): CancelablePromise { + skip, + take = 100, + }: { + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/tree/static-file/root', diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/StylesheetResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/StylesheetResource.ts index b504ba6aab..f219e34cfd 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/StylesheetResource.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/StylesheetResource.ts @@ -1,8 +1,8 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { FileSystemTreeItemPresentationModel } from '../models/FileSystemTreeItemPresentationModel'; import type { PagedFileSystemTreeItemPresentationModel } from '../models/PagedFileSystemTreeItemPresentationModel'; +import type { ScriptItemResponseModel } from '../models/ScriptItemResponseModel'; import type { CancelablePromise } from '../core/CancelablePromise'; import { OpenAPI } from '../core/OpenAPI'; @@ -10,19 +10,37 @@ import { request as __request } from '../core/request'; export class StylesheetResource { + /** + * @returns any Success + * @throws ApiError + */ + public static getStylesheetItem({ + path, + }: { + path?: Array, + }): CancelablePromise> { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/stylesheet/item', + query: { + 'path': path, + }, + }); + } + /** * @returns PagedFileSystemTreeItemPresentationModel Success * @throws ApiError */ public static getTreeStylesheetChildren({ -path, -skip, -take = 100, -}: { -path?: string, -skip?: number, -take?: number, -}): CancelablePromise { + path, + skip, + take = 100, + }: { + path?: string, + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/tree/stylesheet/children', @@ -34,35 +52,17 @@ take?: number, }); } - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeStylesheetItem({ -path, -}: { -path?: Array, -}): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/stylesheet/item', - query: { - 'path': path, - }, - }); - } - /** * @returns PagedFileSystemTreeItemPresentationModel Success * @throws ApiError */ public static getTreeStylesheetRoot({ -skip, -take = 100, -}: { -skip?: number, -take?: number, -}): CancelablePromise { + skip, + take = 100, + }: { + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/tree/stylesheet/root', diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/TelemetryResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/TelemetryResource.ts index 289f0f8e46..19975410d0 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/TelemetryResource.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/TelemetryResource.ts @@ -16,12 +16,12 @@ export class TelemetryResource { * @throws ApiError */ public static getTelemetry({ -skip, -take, -}: { -skip?: number, -take?: number, -}): CancelablePromise { + skip, + take, + }: { + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/telemetry', @@ -48,10 +48,10 @@ take?: number, * @throws ApiError */ public static postTelemetryLevel({ -requestBody, -}: { -requestBody?: TelemetryRequestModel, -}): CancelablePromise { + requestBody, + }: { + requestBody?: TelemetryRequestModel, + }): CancelablePromise { return __request(OpenAPI, { method: 'POST', url: '/umbraco/management/api/v1/telemetry/level', diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/TemplateResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/TemplateResource.ts index d5133dc6a7..b7568d4a24 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/TemplateResource.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/TemplateResource.ts @@ -1,14 +1,9 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ContentTreeItemResponseModel } from '../models/ContentTreeItemResponseModel'; import type { CreateTemplateRequestModel } from '../models/CreateTemplateRequestModel'; -import type { DocumentBlueprintTreeItemResponseModel } from '../models/DocumentBlueprintTreeItemResponseModel'; -import type { DocumentTreeItemResponseModel } from '../models/DocumentTreeItemResponseModel'; -import type { DocumentTypeTreeItemResponseModel } from '../models/DocumentTypeTreeItemResponseModel'; -import type { EntityTreeItemResponseModel } from '../models/EntityTreeItemResponseModel'; -import type { FolderTreeItemResponseModel } from '../models/FolderTreeItemResponseModel'; import type { PagedEntityTreeItemResponseModel } from '../models/PagedEntityTreeItemResponseModel'; +import type { TemplateItemResponseModel } from '../models/TemplateItemResponseModel'; import type { TemplateQueryExecuteModel } from '../models/TemplateQueryExecuteModel'; import type { TemplateQueryResultResponseModel } from '../models/TemplateQueryResultResponseModel'; import type { TemplateQuerySettingsResponseModel } from '../models/TemplateQuerySettingsResponseModel'; @@ -27,10 +22,10 @@ export class TemplateResource { * @throws ApiError */ public static postTemplate({ -requestBody, -}: { -requestBody?: CreateTemplateRequestModel, -}): CancelablePromise { + requestBody, + }: { + requestBody?: CreateTemplateRequestModel, + }): CancelablePromise { return __request(OpenAPI, { method: 'POST', url: '/umbraco/management/api/v1/template', @@ -48,16 +43,16 @@ requestBody?: CreateTemplateRequestModel, * @returns any Success * @throws ApiError */ - public static getTemplateByKey({ -key, -}: { -key: string, -}): CancelablePromise { + public static getTemplateById({ + id, + }: { + id: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/template/{key}', + url: '/umbraco/management/api/v1/template/{id}', path: { - 'key': key, + 'id': id, }, errors: { 404: `Not Found`, @@ -69,16 +64,16 @@ key: string, * @returns any Success * @throws ApiError */ - public static deleteTemplateByKey({ -key, -}: { -key: string, -}): CancelablePromise { + public static deleteTemplateById({ + id, + }: { + id: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'DELETE', - url: '/umbraco/management/api/v1/template/{key}', + url: '/umbraco/management/api/v1/template/{id}', path: { - 'key': key, + 'id': id, }, errors: { 400: `Bad Request`, @@ -91,18 +86,18 @@ key: string, * @returns any Success * @throws ApiError */ - public static putTemplateByKey({ -key, -requestBody, -}: { -key: string, -requestBody?: UpdateTemplateRequestModel, -}): CancelablePromise { + public static putTemplateById({ + id, + requestBody, + }: { + id: string, + requestBody?: UpdateTemplateRequestModel, + }): CancelablePromise { return __request(OpenAPI, { method: 'PUT', - url: '/umbraco/management/api/v1/template/{key}', + url: '/umbraco/management/api/v1/template/{id}', path: { - 'key': key, + 'id': id, }, body: requestBody, mediaType: 'application/json', @@ -113,15 +108,33 @@ requestBody?: UpdateTemplateRequestModel, }); } + /** + * @returns any Success + * @throws ApiError + */ + public static getTemplateItem({ + id, + }: { + id?: Array, + }): CancelablePromise> { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/template/item', + query: { + 'id': id, + }, + }); + } + /** * @returns any Success * @throws ApiError */ public static postTemplateQueryExecute({ -requestBody, -}: { -requestBody?: TemplateQueryExecuteModel, -}): CancelablePromise { + requestBody, + }: { + requestBody?: TemplateQueryExecuteModel, + }): CancelablePromise { return __request(OpenAPI, { method: 'POST', url: '/umbraco/management/api/v1/template/query/execute', @@ -160,54 +173,36 @@ requestBody?: TemplateQueryExecuteModel, * @throws ApiError */ public static getTreeTemplateChildren({ -parentKey, -skip, -take = 100, -}: { -parentKey?: string, -skip?: number, -take?: number, -}): CancelablePromise { + parentId, + skip, + take = 100, + }: { + parentId?: string, + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/tree/template/children', query: { - 'parentKey': parentKey, + 'parentId': parentId, 'skip': skip, 'take': take, }, }); } - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeTemplateItem({ -key, -}: { -key?: Array, -}): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/template/item', - query: { - 'key': key, - }, - }); - } - /** * @returns PagedEntityTreeItemResponseModel Success * @throws ApiError */ public static getTreeTemplateRoot({ -skip, -take = 100, -}: { -skip?: number, -take?: number, -}): CancelablePromise { + skip, + take = 100, + }: { + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/tree/template/root', diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/TemporaryFileResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/TemporaryFileResource.ts new file mode 100644 index 0000000000..44dc7b5f19 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/TemporaryFileResource.ts @@ -0,0 +1,80 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { TemporaryFileResponseModel } from '../models/TemporaryFileResponseModel'; + +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; + +export class TemporaryFileResource { + + /** + * @returns string Created + * @throws ApiError + */ + public static postTemporaryfile({ + formData, + }: { + formData?: { + Id?: string; + File?: Blob; + }, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/temporaryfile', + formData: formData, + mediaType: 'multipart/form-data', + responseHeader: 'Location', + errors: { + 400: `Bad Request`, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static getTemporaryfileById({ + id, + }: { + id: string, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/temporaryfile/{id}', + path: { + 'id': id, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static deleteTemporaryfileById({ + id, + }: { + id: string, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/temporaryfile/{id}', + path: { + 'id': id, + }, + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + +} diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/TrackedReferenceResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/TrackedReferenceResource.ts index 3c1a145658..2ba114f3a2 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/TrackedReferenceResource.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/TrackedReferenceResource.ts @@ -13,22 +13,22 @@ export class TrackedReferenceResource { * @returns PagedRelationItemResponseModel Success * @throws ApiError */ - public static getTrackedReferenceByKey({ -key, -skip, -take = 20, -filterMustBeIsDependency = false, -}: { -key: string, -skip?: number, -take?: number, -filterMustBeIsDependency?: boolean, -}): CancelablePromise { + public static getTrackedReferenceById({ + id, + skip, + take = 20, + filterMustBeIsDependency = false, + }: { + id: string, + skip?: number, + take?: number, + filterMustBeIsDependency?: boolean, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/tracked-reference/{key}', + url: '/umbraco/management/api/v1/tracked-reference/{id}', path: { - 'key': key, + 'id': id, }, query: { 'skip': skip, @@ -42,22 +42,22 @@ filterMustBeIsDependency?: boolean, * @returns PagedRelationItemResponseModel Success * @throws ApiError */ - public static getTrackedReferenceDescendantsByParentKey({ -parentKey, -skip, -take, -filterMustBeIsDependency = true, -}: { -parentKey: string, -skip?: number, -take?: number, -filterMustBeIsDependency?: boolean, -}): CancelablePromise { + public static getTrackedReferenceDescendantsByParentId({ + parentId, + skip, + take, + filterMustBeIsDependency = true, + }: { + parentId: string, + skip?: number, + take?: number, + filterMustBeIsDependency?: boolean, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/tracked-reference/descendants/{parentKey}', + url: '/umbraco/management/api/v1/tracked-reference/descendants/{parentId}', path: { - 'parentKey': parentKey, + 'parentId': parentId, }, query: { 'skip': skip, @@ -72,21 +72,21 @@ filterMustBeIsDependency?: boolean, * @throws ApiError */ public static getTrackedReferenceItem({ -key, -skip, -take = 20, -filterMustBeIsDependency = true, -}: { -key?: Array, -skip?: number, -take?: number, -filterMustBeIsDependency?: boolean, -}): CancelablePromise { + id, + skip, + take = 20, + filterMustBeIsDependency = true, + }: { + id?: Array, + skip?: number, + take?: number, + filterMustBeIsDependency?: boolean, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/tracked-reference/item', query: { - 'key': key, + 'id': id, 'skip': skip, 'take': take, 'filterMustBeIsDependency': filterMustBeIsDependency, diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/UserGroupsResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/UserGroupsResource.ts index 4c9f40614a..c161c4e304 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/UserGroupsResource.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/UserGroupsResource.ts @@ -17,10 +17,10 @@ export class UserGroupsResource { * @throws ApiError */ public static postUserGroups({ -requestBody, -}: { -requestBody?: SaveUserGroupRequestModel, -}): CancelablePromise { + requestBody, + }: { + requestBody?: SaveUserGroupRequestModel, + }): CancelablePromise { return __request(OpenAPI, { method: 'POST', url: '/umbraco/management/api/v1/user-groups', @@ -38,12 +38,12 @@ requestBody?: SaveUserGroupRequestModel, * @throws ApiError */ public static getUserGroups({ -skip, -take = 100, -}: { -skip?: number, -take?: number, -}): CancelablePromise { + skip, + take = 100, + }: { + skip?: number, + take?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/user-groups', @@ -58,16 +58,16 @@ take?: number, * @returns any Success * @throws ApiError */ - public static getUserGroupsByKey({ -key, -}: { -key: string, -}): CancelablePromise { + public static getUserGroupsById({ + id, + }: { + id: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/user-groups/{key}', + url: '/umbraco/management/api/v1/user-groups/{id}', path: { - 'key': key, + 'id': id, }, errors: { 404: `Not Found`, @@ -79,16 +79,16 @@ key: string, * @returns any Success * @throws ApiError */ - public static deleteUserGroupsByKey({ -key, -}: { -key: string, -}): CancelablePromise { + public static deleteUserGroupsById({ + id, + }: { + id: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'DELETE', - url: '/umbraco/management/api/v1/user-groups/{key}', + url: '/umbraco/management/api/v1/user-groups/{id}', path: { - 'key': key, + 'id': id, }, errors: { 404: `Not Found`, @@ -100,18 +100,18 @@ key: string, * @returns any Success * @throws ApiError */ - public static putUserGroupsByKey({ -key, -requestBody, -}: { -key: string, -requestBody?: UpdateUserGroupRequestModel, -}): CancelablePromise { + public static putUserGroupsById({ + id, + requestBody, + }: { + id: string, + requestBody?: UpdateUserGroupRequestModel, + }): CancelablePromise { return __request(OpenAPI, { method: 'PUT', - url: '/umbraco/management/api/v1/user-groups/{key}', + url: '/umbraco/management/api/v1/user-groups/{id}', path: { - 'key': key, + 'id': id, }, body: requestBody, mediaType: 'application/json', diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/UsersResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/UsersResource.ts new file mode 100644 index 0000000000..e2b78bae8a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/UsersResource.ts @@ -0,0 +1,323 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ChangePasswordUserRequestModel } from '../models/ChangePasswordUserRequestModel'; +import type { CreateUserRequestModel } from '../models/CreateUserRequestModel'; +import type { CreateUserResponseModel } from '../models/CreateUserResponseModel'; +import type { DirectionModel } from '../models/DirectionModel'; +import type { DisableUserRequestModel } from '../models/DisableUserRequestModel'; +import type { EnableUserRequestModel } from '../models/EnableUserRequestModel'; +import type { InviteUserRequestModel } from '../models/InviteUserRequestModel'; +import type { PagedUserResponseModel } from '../models/PagedUserResponseModel'; +import type { SetAvatarRequestModel } from '../models/SetAvatarRequestModel'; +import type { UnlockUsersRequestModel } from '../models/UnlockUsersRequestModel'; +import type { UpdateUserGroupsOnUserRequestModel } from '../models/UpdateUserGroupsOnUserRequestModel'; +import type { UpdateUserRequestModel } from '../models/UpdateUserRequestModel'; +import type { UserOrderModel } from '../models/UserOrderModel'; +import type { UserResponseModel } from '../models/UserResponseModel'; +import type { UserStateModel } from '../models/UserStateModel'; + +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; + +export class UsersResource { + + /** + * @returns any Success + * @throws ApiError + */ + public static postUsers({ + requestBody, + }: { + requestBody?: (CreateUserRequestModel | InviteUserRequestModel), + }): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/users', + body: requestBody, + mediaType: 'application/json', + errors: { + 400: `Bad Request`, + }, + }); + } + + /** + * @returns PagedUserResponseModel Success + * @throws ApiError + */ + public static getUsers({ + skip, + take = 100, + }: { + skip?: number, + take?: number, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/users', + query: { + 'skip': skip, + 'take': take, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static getUsersById({ + id, + }: { + id: string, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/users/{id}', + path: { + 'id': id, + }, + errors: { + 404: `Not Found`, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static deleteUsersById({ + id, + }: { + id: string, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/users/{id}', + path: { + 'id': id, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static putUsersById({ + id, + requestBody, + }: { + id: string, + requestBody?: UpdateUserRequestModel, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/users/{id}', + path: { + 'id': id, + }, + body: requestBody, + mediaType: 'application/json', + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static deleteUsersAvatarById({ + id, + }: { + id: string, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/users/avatar/{id}', + path: { + 'id': id, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static postUsersAvatarById({ + id, + requestBody, + }: { + id: string, + requestBody?: SetAvatarRequestModel, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/users/avatar/{id}', + path: { + 'id': id, + }, + body: requestBody, + mediaType: 'application/json', + errors: { + 400: `Bad Request`, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static postUsersChangePasswordById({ + id, + requestBody, + }: { + id: string, + requestBody?: ChangePasswordUserRequestModel, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/users/change-password/{id}', + path: { + 'id': id, + }, + body: requestBody, + mediaType: 'application/json', + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static postUsersDisable({ + requestBody, + }: { + requestBody?: DisableUserRequestModel, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/users/disable', + body: requestBody, + mediaType: 'application/json', + errors: { + 400: `Bad Request`, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static postUsersEnable({ + requestBody, + }: { + requestBody?: EnableUserRequestModel, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/users/enable', + body: requestBody, + mediaType: 'application/json', + errors: { + 400: `Bad Request`, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static getUsersFilter({ + skip, + take = 100, + orderBy, + orderDirection, + userGroupIds, + userStates, + filter = '', + }: { + skip?: number, + take?: number, + orderBy?: UserOrderModel, + orderDirection?: DirectionModel, + userGroupIds?: Array, + userStates?: Array, + filter?: string, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/users/filter', + query: { + 'skip': skip, + 'take': take, + 'orderBy': orderBy, + 'orderDirection': orderDirection, + 'userGroupIds': userGroupIds, + 'userStates': userStates, + 'filter': filter, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static postUsersInvite({ + requestBody, + }: { + requestBody?: InviteUserRequestModel, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/users/invite', + body: requestBody, + mediaType: 'application/json', + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static postUsersSetUserGroups({ + requestBody, + }: { + requestBody?: UpdateUserGroupsOnUserRequestModel, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/users/set-user-groups', + body: requestBody, + mediaType: 'application/json', + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static postUsersUnlock({ + requestBody, + }: { + requestBody?: UnlockUsersRequestModel, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/users/unlock', + body: requestBody, + mediaType: 'application/json', + errors: { + 400: `Bad Request`, + }, + }); + } + +} diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/V1Resource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/V1Resource.ts new file mode 100644 index 0000000000..d63c01efe2 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/V1Resource.ts @@ -0,0 +1,30 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { StaticFileItemResponseModel } from '../models/StaticFileItemResponseModel'; + +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; + +export class V1Resource { + + /** + * @returns any Success + * @throws ApiError + */ + public static getItem({ + path, + }: { + path?: Array, + }): CancelablePromise> { + return __request(OpenAPI, { + method: 'GET', + url: '/item', + query: { + 'path': path, + }, + }); + } + +} diff --git a/src/Umbraco.Web.UI.Client/libs/context-api/debug/context-data.function.ts b/src/Umbraco.Web.UI.Client/libs/context-api/debug/context-data.function.ts index 1834d95002..a2a8179474 100644 --- a/src/Umbraco.Web.UI.Client/libs/context-api/debug/context-data.function.ts +++ b/src/Umbraco.Web.UI.Client/libs/context-api/debug/context-data.function.ts @@ -1,3 +1,4 @@ +/* eslint-disable no-case-declarations */ /** * Change the collection of Contexts into a simplified array of data * @@ -39,10 +40,36 @@ function contextItemData(contextInstance:any):DebugContextItemData { } const value = contextInstance[key]; - if (typeof value === 'string' || typeof value === 'boolean') { - props.push({ key: key, value: value, type: typeof value }); - } else { - props.push({ key: key, type: typeof value }); + const valueType = typeof value; + + switch (valueType) { + case 'string': + case 'boolean': + case 'number': + props.push({ key: key, value: value, type: typeof value }); + break; + + case 'object': + + // Check if the object is an observable (by checking if it has a subscribe method/function) + const isSubscribeLike = 'subscribe' in value && typeof value['subscribe'] === 'function'; + const isWebComponent = value instanceof HTMLElement; + + let valueToDisplay = "Complex Object"; + if(isWebComponent){ + const tagName = value.tagName.toLowerCase(); + + valueToDisplay = `Web Component <${tagName}>`; + } else if(isSubscribeLike){ + valueToDisplay = "Subscribable"; + } + + props.push({ key: key, type: typeof value, value: valueToDisplay }); + break; + + default: + props.push({ key: key, type: typeof value }); + break; } } diff --git a/src/Umbraco.Web.UI.Client/libs/controller/controller-host.mixin.ts b/src/Umbraco.Web.UI.Client/libs/controller/controller-host.mixin.ts index 221da8d54b..fc5df147a6 100644 --- a/src/Umbraco.Web.UI.Client/libs/controller/controller-host.mixin.ts +++ b/src/Umbraco.Web.UI.Client/libs/controller/controller-host.mixin.ts @@ -5,6 +5,7 @@ export declare class UmbControllerHostElement extends HTMLElement { hasController(controller: UmbControllerInterface): boolean; getControllers(filterMethod: (ctrl: UmbControllerInterface) => boolean): UmbControllerInterface[]; addController(controller: UmbControllerInterface): void; + removeControllerByUnique(unique: UmbControllerInterface['unique']): void; removeController(controller: UmbControllerInterface): void; } @@ -43,13 +44,7 @@ export const UmbControllerHostMixin = (superCl */ addController(ctrl: UmbControllerInterface): void { // Check if there is one already with same unique - if (ctrl.unique) { - this.#controllers.forEach((x) => { - if (x.unique === ctrl.unique) { - this.removeController(x); - } - }); - } + this.removeControllerByUnique(ctrl.unique); this.#controllers.push(ctrl); if (this.#attached) { @@ -57,6 +52,20 @@ export const UmbControllerHostMixin = (superCl } } + /** + * Remove a controller from this element, by its unique/alias. + * @param {unknown} unique/alias + */ + removeControllerByUnique(unique: UmbControllerInterface['unique']): void { + if (unique) { + this.#controllers.forEach((x) => { + if (x.unique === unique) { + this.removeController(x); + } + }); + } + } + /** * Remove a controller from this element. * Notice this will also destroy the controller. diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-api/create-extension-element.function.ts b/src/Umbraco.Web.UI.Client/libs/extensions-api/create-extension-element.function.ts index 4da597bcb4..ccb92df877 100644 --- a/src/Umbraco.Web.UI.Client/libs/extensions-api/create-extension-element.function.ts +++ b/src/Umbraco.Web.UI.Client/libs/extensions-api/create-extension-element.function.ts @@ -3,8 +3,9 @@ import { isManifestElementNameType } from './is-manifest-element-name-type.funct import { loadExtension } from './load-extension.function'; import type { HTMLElementConstructor } from '@umbraco-cms/backoffice/models'; import type { ManifestElement } from '@umbraco-cms/backoffice/extensions-registry'; +import type { PageComponent } from '@umbraco-cms/backoffice/router'; -export async function createExtensionElement(manifest: ManifestElement): Promise { +export async function createExtensionElement(manifest: ManifestElement): Promise { //TODO: Write tests for these extension options: const js = await loadExtension(manifest); diff --git a/src/Umbraco.Web.UI.Client/libs/modal/modal-route-registration.ts b/src/Umbraco.Web.UI.Client/libs/modal/modal-route-registration.ts index 095da5f546..3c7f7e7557 100644 --- a/src/Umbraco.Web.UI.Client/libs/modal/modal-route-registration.ts +++ b/src/Umbraco.Web.UI.Client/libs/modal/modal-route-registration.ts @@ -1,8 +1,8 @@ -import type { Params } from 'router-slot'; import { v4 as uuidv4 } from 'uuid'; import { UmbModalHandler } from './modal-handler'; import { UmbModalConfig, UmbModalContext } from './modal.context'; import { UmbModalToken } from './token/modal-token'; +import type { Params } from '@umbraco-cms/backoffice/router'; export type UmbModalRouteBuilder = (params: { [key: string]: string | number }) => string; diff --git a/src/Umbraco.Web.UI.Client/libs/modal/token/allowed-document-types-modal.token.ts b/src/Umbraco.Web.UI.Client/libs/modal/token/allowed-document-types-modal.token.ts index 74e37ca564..c4f7631758 100644 --- a/src/Umbraco.Web.UI.Client/libs/modal/token/allowed-document-types-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/libs/modal/token/allowed-document-types-modal.token.ts @@ -1,7 +1,7 @@ import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; export interface UmbAllowedDocumentTypesModalData { - key: string | null; + id: string | null; } export interface UmbAllowedDocumentTypesModalResult { diff --git a/src/Umbraco.Web.UI.Client/libs/modal/token/import-dictionary-modal.token.ts b/src/Umbraco.Web.UI.Client/libs/modal/token/import-dictionary-modal.token.ts index 745279c619..c420afa120 100644 --- a/src/Umbraco.Web.UI.Client/libs/modal/token/import-dictionary-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/libs/modal/token/import-dictionary-modal.token.ts @@ -7,8 +7,8 @@ export interface UmbImportDictionaryModalData { } export interface UmbImportDictionaryModalResult { - fileName?: string; - parentKey?: string; + temporaryFileId?: string; + parentId?: string; } export const UMB_IMPORT_DICTIONARY_MODAL = new UmbModalToken< diff --git a/src/Umbraco.Web.UI.Client/libs/modal/token/template-modal.token.ts b/src/Umbraco.Web.UI.Client/libs/modal/token/template-modal.token.ts index e4957c444a..55901ab786 100644 --- a/src/Umbraco.Web.UI.Client/libs/modal/token/template-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/libs/modal/token/template-modal.token.ts @@ -1,12 +1,12 @@ import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; export interface UmbTemplateModalData { - key: string; + id: string; language?: 'razor' | 'typescript' | 'javascript' | 'css' | 'markdown' | 'json' | 'html'; } export interface UmbTemplateModalResult { - key: string; + id: string; } export const UMB_TEMPLATE_MODAL = new UmbModalToken( diff --git a/src/Umbraco.Web.UI.Client/libs/models/index.ts b/src/Umbraco.Web.UI.Client/libs/models/index.ts index f52c407311..0d96ea3bff 100644 --- a/src/Umbraco.Web.UI.Client/libs/models/index.ts +++ b/src/Umbraco.Web.UI.Client/libs/models/index.ts @@ -11,19 +11,19 @@ export type HTMLElementConstructor = new (...args: any[]) => T; export type ClassConstructor = new (...args: any[]) => T; // Users -// TODO: would the right name be Node? as entity is just something with a Key. But node is something in a content structure, aka. with hasChildren and parentKey. +// TODO: would the right name be Node? as entity is just something with a Key. But node is something in a content structure, aka. with hasChildren and parentId. export interface Entity { - key: string; + id: string; name: string; icon: string; type: string; hasChildren: boolean; - parentKey: string | null; + parentId: string | null; } /** Tried to find a common base of our entities — used by Entity Workspace Context */ export type BaseEntity = { - key?: string; + id?: string; //alias?: string; name?: string; //icon?: string; @@ -63,7 +63,7 @@ export interface UserGroupDetails extends UserGroupEntity { // TODO: Make sure Entity Type/interface. export interface MemberTypeDetails extends EntityTreeItemResponseModel { - key: string; // TODO: Remove this when the backend is fixed + id: string; // TODO: Remove this when the backend is fixed alias: string; properties: []; } @@ -71,23 +71,23 @@ export interface MemberTypeDetails extends EntityTreeItemResponseModel { // Media Types export interface MediaTypeDetails extends FolderTreeItemResponseModel { - key: string; // TODO: Remove this when the backend is fixed + id: string; // TODO: Remove this when the backend is fixed alias: string; properties: []; } // Member Groups export interface MemberGroupDetails extends EntityTreeItemResponseModel { - key: string; // TODO: Remove this when the backend is fixed + id: string; // TODO: Remove this when the backend is fixed } export interface MemberDetails extends EntityTreeItemResponseModel { - key: string; // TODO: Remove this when the backend is fixed + id: string; // TODO: Remove this when the backend is fixed } // Document Blueprint export interface DocumentBlueprintDetails { - key: string; + id: string; name: string; type: 'document-blueprint'; properties: Array; diff --git a/src/Umbraco.Web.UI.Client/libs/observable-api/append-to-frozen-array.function.ts b/src/Umbraco.Web.UI.Client/libs/observable-api/append-to-frozen-array.function.ts index 1e5c060f00..97ff56848c 100644 --- a/src/Umbraco.Web.UI.Client/libs/observable-api/append-to-frozen-array.function.ts +++ b/src/Umbraco.Web.UI.Client/libs/observable-api/append-to-frozen-array.function.ts @@ -6,8 +6,8 @@ * @param {(previousResult: R, currentResult: R) => boolean} [memoizationFunction] - Method to Compare if the data has changed. Should return true when data is different. * @description - Creates a RxJS Observable from RxJS Subject. * @example Example append new entry for a ArrayState or a part of DeepState/ObjectState it which is an array. Where the key is unique and the item will be updated if matched with existing. - * const entry = {key: 'myKey', value: 'myValue'}; - * const newDataSet = appendToFrozenArray(mySubject.getValue(), entry, x => x.key === key); + * const entry = {id: 'myKey', value: 'myValue'}; + * const newDataSet = appendToFrozenArray(mySubject.getValue(), entry, x => x.id === id); * mySubject.next(newDataSet); */ export function appendToFrozenArray(data: T[], entry: T, getUniqueMethod?: (entry: T) => unknown): T[] { diff --git a/src/Umbraco.Web.UI.Client/libs/observable-api/array-state.ts b/src/Umbraco.Web.UI.Client/libs/observable-api/array-state.ts index 5c06539f36..7572f89d8b 100644 --- a/src/Umbraco.Web.UI.Client/libs/observable-api/array-state.ts +++ b/src/Umbraco.Web.UI.Client/libs/observable-api/array-state.ts @@ -12,11 +12,37 @@ import { pushToUniqueArray } from './push-to-unique-array.function'; * The ArrayState provides methods to append data when the data is an Object. */ export class ArrayState extends DeepState { - private _getUnique?: (entry: T) => unknown; + #getUnique?: (entry: T) => unknown; + #sortMethod?: (a: T, b: T) => number; constructor(initialData: T[], getUniqueMethod?: (entry: T) => unknown) { super(initialData); - this._getUnique = getUniqueMethod; + this.#getUnique = getUniqueMethod; + } + + /** + * @method sortBy + * @param {(a: T, b: T) => number} sortMethod - A method to be used for sorting everytime data is set. + * @description - A sort method to this Subject. + * @example Example add sort method + * const data = [ + * { key: 1, value: 'foo'}, + * { key: 2, value: 'bar'} + * ]; + * const myState = new ArrayState(data, (x) => x.key); + * myState.sortBy((a, b) => (a.sortOrder || 0) - (b.sortOrder || 0)); + */ + sortBy(sortMethod?: (a: T, b: T) => number) { + this.#sortMethod = sortMethod; + return this; + } + + next(value: T[]) { + if (this.#sortMethod) { + super.next(value.sort(this.#sortMethod)); + } else { + super.next(value); + } } /** @@ -24,22 +50,22 @@ export class ArrayState extends DeepState { * @param {unknown[]} uniques - The unique values to remove. * @return {ArrayState} Reference to it self. * @description - Remove some new data of this Subject. - * @example Example remove entry with key '1' and '2' + * @example Example remove entry with id '1' and '2' * const data = [ - * { key: 1, value: 'foo'}, - * { key: 2, value: 'bar'} + * { id: 1, value: 'foo'}, + * { id: 2, value: 'bar'} * ]; - * const myState = new ArrayState(data, (x) => x.key); + * const myState = new ArrayState(data, (x) => x.id); * myState.remove([1, 2]); */ remove(uniques: unknown[]) { let next = this.getValue(); - if (this._getUnique) { + if (this.#getUnique) { uniques.forEach((unique) => { next = next.filter((x) => { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore - return this._getUnique(x) !== unique; + return this.#getUnique(x) !== unique; }); }); @@ -53,21 +79,21 @@ export class ArrayState extends DeepState { * @param {unknown} unique - The unique value to remove. * @return {ArrayState} Reference to it self. * @description - Remove some new data of this Subject. - * @example Example remove entry with key '1' + * @example Example remove entry with id '1' * const data = [ - * { key: 1, value: 'foo'}, - * { key: 2, value: 'bar'} + * { id: 1, value: 'foo'}, + * { id: 2, value: 'bar'} * ]; - * const myState = new ArrayState(data, (x) => x.key); + * const myState = new ArrayState(data, (x) => x.id); * myState.removeOne(1); */ removeOne(unique: unknown) { let next = this.getValue(); - if (this._getUnique) { + if (this.#getUnique) { next = next.filter((x) => { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore - return this._getUnique(x) !== unique; + return this.#getUnique(x) !== unique; }); this.next(next); @@ -116,8 +142,8 @@ export class ArrayState extends DeepState { */ appendOne(entry: T) { const next = [...this.getValue()]; - if (this._getUnique) { - pushToUniqueArray(next, entry, this._getUnique); + if (this.#getUnique) { + pushToUniqueArray(next, entry, this.#getUnique); } else { next.push(entry); } @@ -142,10 +168,10 @@ export class ArrayState extends DeepState { * ]); */ append(entries: T[]) { - if (this._getUnique) { + if (this.#getUnique) { const next = [...this.getValue()]; entries.forEach((entry) => { - pushToUniqueArray(next, entry, this._getUnique!); + pushToUniqueArray(next, entry, this.#getUnique!); }); this.next(next); } else { @@ -169,16 +195,10 @@ export class ArrayState extends DeepState { * myState.updateOne(2, {value: 'updated-bar'}); */ updateOne(unique: unknown, entry: Partial) { - if (!this._getUnique) { + if (!this.#getUnique) { throw new Error("Can't partial update an ArrayState without a getUnique method provided when constructed."); } - this.next( - partialUpdateFrozenArray( - this.getValue(), - entry, - (x) => unique === (this._getUnique as Exclude)(x) - ) - ); + this.next(partialUpdateFrozenArray(this.getValue(), entry, (x) => unique === this.#getUnique!(x))); return this; } } diff --git a/src/Umbraco.Web.UI.Client/libs/repository/data-source/data-source.interface.ts b/src/Umbraco.Web.UI.Client/libs/repository/data-source/data-source.interface.ts index 13cfbfe7a5..1721ce3e47 100644 --- a/src/Umbraco.Web.UI.Client/libs/repository/data-source/data-source.interface.ts +++ b/src/Umbraco.Web.UI.Client/libs/repository/data-source/data-source.interface.ts @@ -1,7 +1,7 @@ import type { DataSourceResponse } from '@umbraco-cms/backoffice/repository'; export interface UmbDataSource { - createScaffold(parentKey: string | null): Promise>; + createScaffold(parentId: string | null): Promise>; get(unique: string): Promise>; insert(data: CreateRequestType): Promise; update(unique: string, data: UpdateRequestType): Promise>; diff --git a/src/Umbraco.Web.UI.Client/libs/repository/data-source/folder-data-source.interface.ts b/src/Umbraco.Web.UI.Client/libs/repository/data-source/folder-data-source.interface.ts index c07bf208f5..0998583c9f 100644 --- a/src/Umbraco.Web.UI.Client/libs/repository/data-source/folder-data-source.interface.ts +++ b/src/Umbraco.Web.UI.Client/libs/repository/data-source/folder-data-source.interface.ts @@ -6,7 +6,7 @@ import { } from '@umbraco-cms/backoffice/backend-api'; export interface UmbFolderDataSource { - createScaffold(parentKey: string | null): Promise>; + createScaffold(parentId: string | null): Promise>; get(unique: string): Promise>; insert(data: CreateFolderRequestModel): Promise>; update(unique: string, data: CreateFolderRequestModel): Promise>; diff --git a/src/Umbraco.Web.UI.Client/libs/repository/detail-repository.interface.ts b/src/Umbraco.Web.UI.Client/libs/repository/detail-repository.interface.ts index 11862c979b..cb70ab8dd2 100644 --- a/src/Umbraco.Web.UI.Client/libs/repository/detail-repository.interface.ts +++ b/src/Umbraco.Web.UI.Client/libs/repository/detail-repository.interface.ts @@ -1,25 +1,16 @@ import type { ProblemDetailsModel } from '@umbraco-cms/backoffice/backend-api'; -export interface UmbDetailRepository { - createScaffold(parentKey: string | null): Promise<{ - data?: DetailType; - error?: ProblemDetailsModel; - }>; - - requestByKey(key: string): Promise<{ - data?: DetailType; - error?: ProblemDetailsModel; - }>; - - create(data: DetailType): Promise<{ - error?: ProblemDetailsModel; - }>; - - save(data: DetailType): Promise<{ - error?: ProblemDetailsModel; - }>; - - delete(key: string): Promise<{ - error?: ProblemDetailsModel; - }>; +export interface UmbRepositoryErrorResponse { + error?: ProblemDetailsModel; +} +export interface UmbRepositoryResponse extends UmbRepositoryErrorResponse { + data?: T; +} + +export interface UmbDetailRepository { + createScaffold(parentId: string | null): Promise>; + requestById(id: string): Promise>; + create(data: CreateRequestType): Promise; + save(id: string, data: UpdateRequestType): Promise; + delete(id: string): Promise; } diff --git a/src/Umbraco.Web.UI.Client/libs/repository/folder-repository.interface.ts b/src/Umbraco.Web.UI.Client/libs/repository/folder-repository.interface.ts index 4a021f2bd0..3d9559bb2b 100644 --- a/src/Umbraco.Web.UI.Client/libs/repository/folder-repository.interface.ts +++ b/src/Umbraco.Web.UI.Client/libs/repository/folder-repository.interface.ts @@ -7,7 +7,7 @@ import type { } from '@umbraco-cms/backoffice/backend-api'; export interface UmbFolderRepository { - createFolderScaffold(parentKey: string | null): Promise<{ + createFolderScaffold(parentId: string | null): Promise<{ data?: FolderReponseModel; error?: ProblemDetailsModel; }>; @@ -29,7 +29,7 @@ export interface UmbFolderRepository { error?: ProblemDetailsModel; }>; - deleteFolder(key: string): Promise<{ + deleteFolder(id: string): Promise<{ error?: ProblemDetailsModel; }>; } diff --git a/src/Umbraco.Web.UI.Client/libs/resources/resource.controller.ts b/src/Umbraco.Web.UI.Client/libs/resources/resource.controller.ts index c323c76d2a..2432b6fe96 100644 --- a/src/Umbraco.Web.UI.Client/libs/resources/resource.controller.ts +++ b/src/Umbraco.Web.UI.Client/libs/resources/resource.controller.ts @@ -39,8 +39,17 @@ export class UmbResourceController extends UmbController { */ static toProblemDetailsModel(error: unknown): ProblemDetailsModel | undefined { if (error instanceof ApiError) { - const errorDetails = error.body as ProblemDetailsModel; - return errorDetails; + try { + const errorDetails = ( + typeof error.body === 'string' ? JSON.parse(error.body) : error.body + ) as ProblemDetailsModel; + return errorDetails; + } catch { + return { + title: error.name, + detail: error.message, + }; + } } else if (error instanceof Error) { return { title: error.name, diff --git a/src/Umbraco.Web.UI.Client/libs/router/generate-route-path-builder.function.ts b/src/Umbraco.Web.UI.Client/libs/router/generate-route-path-builder.function.ts new file mode 100644 index 0000000000..5fee139a5c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/router/generate-route-path-builder.function.ts @@ -0,0 +1,13 @@ +/* eslint-disable */ +import { stripSlash } from 'router-slot/util'; // This must only include the util to avoid side effects of registering the route element. + +const PARAM_IDENTIFIER = /:([^\\/]+)/g; + +export function generateRoutePathBuilder(path: string) { + return (params: { [key: string]: string | number }) => + stripSlash( + path.replace(PARAM_IDENTIFIER, (substring: string, ...args: string[]) => { + return params[args[0]].toString(); + }) + ); +} diff --git a/src/Umbraco.Web.UI.Client/libs/router/index.ts b/src/Umbraco.Web.UI.Client/libs/router/index.ts index 5a49b1769d..3cfb67ff4a 100644 --- a/src/Umbraco.Web.UI.Client/libs/router/index.ts +++ b/src/Umbraco.Web.UI.Client/libs/router/index.ts @@ -1,3 +1,6 @@ +export type * from 'router-slot/model'; +export * from 'router-slot/util'; export * from './route-location.interface'; export * from './route.context'; export * from './route.interface'; +export * from './generate-route-path-builder.function'; diff --git a/src/Umbraco.Web.UI.Client/libs/router/route.context.ts b/src/Umbraco.Web.UI.Client/libs/router/route.context.ts index da5364d1df..3e2b4cdab8 100644 --- a/src/Umbraco.Web.UI.Client/libs/router/route.context.ts +++ b/src/Umbraco.Web.UI.Client/libs/router/route.context.ts @@ -1,26 +1,17 @@ -import type { IRoutingInfo, ISlashOptions } from 'router-slot'; -import { UmbRoute } from './route.interface'; +// eslint-disable-next-line local-rules/no-external-imports +import type { IRoutingInfo } from 'router-slot/model'; +import type { UmbRoute } from './route.interface'; +import { generateRoutePathBuilder } from './generate-route-path-builder.function'; import { UmbContextConsumerController, UmbContextProviderController, UmbContextToken, } from '@umbraco-cms/backoffice/context-api'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UMB_MODAL_CONTEXT_TOKEN, UmbModalRouteRegistration } from '@umbraco-cms/backoffice/modal'; const EmptyDiv = document.createElement('div'); -const PARAM_IDENTIFIER = /:([^\\/]+)/g; - -function stripSlash(path: string): string { - return slashify(path, { start: false, end: false }); -} - -function slashify(path: string, { start = true, end = true }: Partial = {}): string { - path = start && !path.startsWith('/') ? `/${path}` : !start && path.startsWith('/') ? path.slice(1) : path; - return end && !path.endsWith('/') ? `${path}/` : !end && path.endsWith('/') ? path.slice(0, path.length - 1) : path; -} - export class UmbRouteContext { #modalRegistrations: UmbModalRouteRegistration[] = []; #modalContext?: typeof UMB_MODAL_CONTEXT_TOKEN.TYPE; @@ -58,7 +49,7 @@ export class UmbRouteContext { return { path: this.#getModalRoutePath(modalRegistration), component: EmptyDiv, - setup: (component: HTMLElement, info: IRoutingInfo) => { + setup: (component, info) => { if (!this.#modalContext) return; const modalHandler = modalRegistration.routeSetup(this.#modalContext, info.match.params); if (modalHandler) { @@ -125,16 +116,9 @@ export class UmbRouteContext { if (!this.#routerBasePath) return; const routeBasePath = this.#routerBasePath.endsWith('/') ? this.#routerBasePath : this.#routerBasePath + '/'; - const localPath = `modal/${modalRegistration.alias.toString()}/${modalRegistration.path}`; + const localPath = routeBasePath + `modal/${modalRegistration.alias.toString()}/${modalRegistration.path}`; - const urlBuilder = (params: { [key: string]: string | number }) => { - const localRoutePath = stripSlash( - localPath.replace(PARAM_IDENTIFIER, (substring: string, ...args: string[]) => { - return params[args[0]].toString(); - }) - ); - return routeBasePath + localRoutePath; - }; + const urlBuilder = generateRoutePathBuilder(localPath); modalRegistration._internal_setRouteBuilder(urlBuilder); }; diff --git a/src/Umbraco.Web.UI.Client/libs/router/route.interface.ts b/src/Umbraco.Web.UI.Client/libs/router/route.interface.ts index b76705bd13..8c7f94ac63 100644 --- a/src/Umbraco.Web.UI.Client/libs/router/route.interface.ts +++ b/src/Umbraco.Web.UI.Client/libs/router/route.interface.ts @@ -1,3 +1 @@ -import type { IRoute } from 'router-slot/model'; - -export type UmbRoute = IRoute; +export type { IRoute as UmbRoute } from 'router-slot/model'; diff --git a/src/Umbraco.Web.UI.Client/libs/store/entity-tree-store.ts b/src/Umbraco.Web.UI.Client/libs/store/entity-tree-store.ts index 1e82f6acaa..ea94db043a 100644 --- a/src/Umbraco.Web.UI.Client/libs/store/entity-tree-store.ts +++ b/src/Umbraco.Web.UI.Client/libs/store/entity-tree-store.ts @@ -9,7 +9,7 @@ import { UmbStoreBase, UmbTreeStore } from '@umbraco-cms/backoffice/store'; * @description - General Tree Data Store */ export class UmbEntityTreeStore extends UmbStoreBase implements UmbTreeStore { - #data = new ArrayState([], (x) => x.key); + #data = new ArrayState([], (x) => x.id); /** * Appends items to the store @@ -22,46 +22,46 @@ export class UmbEntityTreeStore extends UmbStoreBase implements UmbTreeStore} data * @memberof UmbEntityTreeStore */ - updateItem(key: string, data: Partial) { - this.#data.next(partialUpdateFrozenArray(this.#data.getValue(), data, (entry) => entry.key === key)); + updateItem(id: string, data: Partial) { + this.#data.next(partialUpdateFrozenArray(this.#data.getValue(), data, (entry) => entry.id === id)); } /** * Removes an item from the store - * @param {string} key + * @param {string} id * @memberof UmbEntityTreeStore */ - removeItem(key: string) { - this.#data.removeOne(key); + removeItem(id: string) { + this.#data.removeOne(id); } /** * An observable to observe the root items * @memberof UmbEntityTreeStore */ - rootItems = this.#data.getObservablePart((items) => items.filter((item) => item.parentKey === null)); + rootItems = this.#data.getObservablePart((items) => items.filter((item) => item.parentId === null)); /** * Returns an observable to observe the children of a given parent - * @param {(string | null)} parentKey + * @param {(string | null)} parentId * @return {*} * @memberof UmbEntityTreeStore */ - childrenOf(parentKey: string | null) { - return this.#data.getObservablePart((items) => items.filter((item) => item.parentKey === parentKey)); + childrenOf(parentId: string | null) { + return this.#data.getObservablePart((items) => items.filter((item) => item.parentId === parentId)); } /** - * Returns an observable to observe the items with the given keys - * @param {Array} keys + * Returns an observable to observe the items with the given ids + * @param {Array} ids * @return {*} * @memberof UmbEntityTreeStore */ - items(keys: Array) { - return this.#data.getObservablePart((items) => items.filter((item) => keys.includes(item.key ?? ''))); + items(ids: Array) { + return this.#data.getObservablePart((items) => items.filter((item) => ids.includes(item.id ?? ''))); } } diff --git a/src/Umbraco.Web.UI.Client/libs/store/file-system-tree.store.ts b/src/Umbraco.Web.UI.Client/libs/store/file-system-tree.store.ts index 384ff4d883..8afa8ca62e 100644 --- a/src/Umbraco.Web.UI.Client/libs/store/file-system-tree.store.ts +++ b/src/Umbraco.Web.UI.Client/libs/store/file-system-tree.store.ts @@ -27,7 +27,7 @@ export class UmbFileSystemTreeStore extends UmbStoreBase implements UmbTreeStore * @memberof UmbFileSystemTreeStore */ updateItem(path: string, data: Partial) { - this.#data.appendOne(data) + this.#data.appendOne(data); } /** @@ -56,7 +56,7 @@ export class UmbFileSystemTreeStore extends UmbStoreBase implements UmbTreeStore } /** - * Returns an observable to observe the items with the given keys + * Returns an observable to observe the items with the given ids * @param {Array} paths * @return {*} * @memberof UmbFileSystemTreeStore diff --git a/src/Umbraco.Web.UI.Client/libs/store/store-base.ts b/src/Umbraco.Web.UI.Client/libs/store/store-base.ts index a934ab6871..4021307cd6 100644 --- a/src/Umbraco.Web.UI.Client/libs/store/store-base.ts +++ b/src/Umbraco.Web.UI.Client/libs/store/store-base.ts @@ -1,6 +1,7 @@ import { UmbContextProviderController } from '@umbraco-cms/backoffice/context-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +// TODO: Make a Store interface? export class UmbStoreBase { constructor(protected _host: UmbControllerHostElement, public readonly storeAlias: string) { new UmbContextProviderController(_host, storeAlias, this); diff --git a/src/Umbraco.Web.UI.Client/libs/store/store.ts b/src/Umbraco.Web.UI.Client/libs/store/store.ts index d4af9c2275..4961162767 100644 --- a/src/Umbraco.Web.UI.Client/libs/store/store.ts +++ b/src/Umbraco.Web.UI.Client/libs/store/store.ts @@ -16,7 +16,7 @@ export interface UmbEntityDetailStore extends UmbDataStore { * @return {*} {T} * @memberof UmbEntityDetailStore */ - getScaffold: (entityType: string, parentKey: string | null) => T; + getScaffold: (entityType: string, parentId: string | null) => T; /** * @description - Request data by key. The data is added to the store and is returned as an Observable. diff --git a/src/Umbraco.Web.UI.Client/libs/utils/generate-guid.ts b/src/Umbraco.Web.UI.Client/libs/utils/generate-guid.ts new file mode 100644 index 0000000000..b0b7f6b981 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/utils/generate-guid.ts @@ -0,0 +1,4 @@ +import { v4 as uuid } from 'uuid'; +export function generateGuid() { + return uuid(); +} diff --git a/src/Umbraco.Web.UI.Client/libs/utils/index.ts b/src/Umbraco.Web.UI.Client/libs/utils/index.ts index b7439f0c3a..d16b3e3261 100644 --- a/src/Umbraco.Web.UI.Client/libs/utils/index.ts +++ b/src/Umbraco.Web.UI.Client/libs/utils/index.ts @@ -1,3 +1,4 @@ export * from './utils'; export * from './umbraco-path'; export * from './udi-service'; +export * from './generate-guid'; diff --git a/src/Umbraco.Web.UI.Client/libs/workspace/actions/save/save.action.ts b/src/Umbraco.Web.UI.Client/libs/workspace/actions/save/save.action.ts index b2f986912f..6a3919d116 100644 --- a/src/Umbraco.Web.UI.Client/libs/workspace/actions/save/save.action.ts +++ b/src/Umbraco.Web.UI.Client/libs/workspace/actions/save/save.action.ts @@ -6,6 +6,9 @@ import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controlle export class UmbSaveWorkspaceAction extends UmbWorkspaceActionBase { constructor(host: UmbControllerHostElement) { super(host); + + // TODO: Could we make change label depending on the state? + // So its called 'Create' when the workspace is new and 'Save' when the workspace is not new. } /* TODO: we need a solution for all actions to notify the system that is has been executed. @@ -14,35 +17,6 @@ export class UmbSaveWorkspaceAction extends UmbWorkspaceActionBase { host: UmbControllerHostElement; repository: any; // TODO: add type - isNew: Observable; - getIsNew(): boolean; + isNew: Observable; + getIsNew(): boolean | undefined; setIsNew(value: boolean): void; // TODO: should we consider another name than entity type. File system files are not entities but still have this type. getEntityType(): string; getData(): DataType | undefined; + save(): Promise; destroy(): void; // TODO: temp solution to bubble validation errors to the UI setValidationErrors?(errorMap: any): void; diff --git a/src/Umbraco.Web.UI.Client/libs/workspace/context/workspace-entity-context.interface.ts b/src/Umbraco.Web.UI.Client/libs/workspace/context/workspace-entity-context.interface.ts index 338e893545..878f050818 100644 --- a/src/Umbraco.Web.UI.Client/libs/workspace/context/workspace-entity-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/libs/workspace/context/workspace-entity-context.interface.ts @@ -2,7 +2,7 @@ import type { UmbWorkspaceContextInterface } from '@umbraco-cms/backoffice/works export interface UmbEntityWorkspaceContextInterface extends UmbWorkspaceContextInterface { - getEntityKey(): string | undefined; // COnsider if this should go away now that we have getUnique() + getEntityId(): string | undefined; // COnsider if this should go away now that we have getUnique() getEntityType(): string; // TODO: consider of this should be on the repository because a repo is responsible for one entity type //getData(): EntityType | undefined; save(): Promise; diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index 77a30f411a..f257dae220 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -12,10 +12,10 @@ "@umbraco-ui/uui": "^1.2.0-rc.2", "@umbraco-ui/uui-css": "^1.2.0-rc.2", "element-internals-polyfill": "^1.1.19", - "lit": "^2.6.1", + "lit": "^2.7.0", "lodash-es": "4.17.21", "monaco-editor": "^0.36.1", - "router-slot": "file:router-slot-1.6.1.tgz", + "router-slot": "file:router-slot-2.0.0.tgz", "rxjs": "^7.8.0", "uuid": "^9.0.0" }, @@ -26,19 +26,19 @@ "@playwright/test": "^1.30.0", "@rollup/plugin-json": "^6.0.0", "@rollup/plugin-node-resolve": "^15.0.1", - "@storybook/addon-a11y": "^7.0.0-rc.3", - "@storybook/addon-actions": "^7.0.0-rc.3", - "@storybook/addon-essentials": "^7.0.0-rc.3", - "@storybook/addon-links": "^7.0.0-rc.3", - "@storybook/mdx2-csf": "^1.0.0-next.5", - "@storybook/web-components": "^7.0.0-rc.3", - "@storybook/web-components-vite": "^7.0.0-rc.3", + "@storybook/addon-a11y": "^7.0.2", + "@storybook/addon-actions": "^7.0.2", + "@storybook/addon-essentials": "^7.0.2", + "@storybook/addon-links": "^7.0.2", + "@storybook/mdx2-csf": "^1.0.0", + "@storybook/web-components": "^7.0.2", + "@storybook/web-components-vite": "^7.0.2", "@types/chai": "^4.3.4", "@types/lodash-es": "^4.17.6", "@types/mocha": "^10.0.0", "@types/uuid": "^9.0.0", "@typescript-eslint/eslint-plugin": "^5.50.0", - "@typescript-eslint/parser": "^5.54.0", + "@typescript-eslint/parser": "^5.57.0", "@web/dev-server-esbuild": "^0.3.3", "@web/dev-server-import-maps": "^0.0.7", "@web/dev-server-rollup": "^0.3.21", @@ -46,7 +46,7 @@ "@web/test-runner-playwright": "^0.9.0", "babel-loader": "^9.1.2", "eslint": "^8.32.0", - "eslint-config-prettier": "^8.6.0", + "eslint-config-prettier": "^8.8.0", "eslint-import-resolver-typescript": "^3.5.3", "eslint-plugin-import": "^2.27.4", "eslint-plugin-lit": "^1.8.2", @@ -55,7 +55,7 @@ "eslint-plugin-storybook": "^0.6.11", "eslint-plugin-wc": "^1.4.0", "msw": "^1.1.0", - "msw-storybook-addon": "^1.7.0", + "msw-storybook-addon": "^1.8.0", "openapi-typescript-codegen": "^0.23.0", "playwright-msw": "^2.1.0", "plop": "^3.1.1", @@ -66,10 +66,10 @@ "rollup-plugin-dts": "^5.2.0", "rollup-plugin-esbuild": "^5.0.0", "rollup-plugin-url": "^3.0.1", - "storybook": "^7.0.0-rc.3", + "storybook": "^7.0.2", "tiny-glob": "^0.2.9", - "typescript": "^4.9.5", - "vite": "^4.1.4", + "typescript": "^5.0.3", + "vite": "^4.2.1", "vite-plugin-static-copy": "^0.13.0", "vite-tsconfig-paths": "^4.0.5", "web-component-analyzer": "^2.0.0-next.4" @@ -147,9 +147,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", - "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz", + "integrity": "sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==", "dev": true, "engines": { "node": ">=6.9.0" @@ -240,13 +240,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz", + "integrity": "sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", + "@babel/compat-data": "^7.21.4", + "@babel/helper-validator-option": "^7.21.0", "browserslist": "^4.21.3", "lru-cache": "^5.1.1", "semver": "^6.3.0" @@ -259,9 +259,9 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz", - "integrity": "sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.4.tgz", + "integrity": "sha512-46QrX2CQlaFRF4TkwfTt6nJD7IHq8539cCL7SDpqWSDeJKY1xylKKY5F/33mJhLZ3mFvKv2gGrVS6NkyF6qs+Q==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", @@ -281,9 +281,9 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.0.tgz", - "integrity": "sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.4.tgz", + "integrity": "sha512-M00OuhU+0GyZ5iBBN9czjugzWrEq2vDpf/zCYHxxf93ul/Q5rv+a5h+/+0WnI1AebHNVtl5bFV0qsJoH23DbfA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", @@ -921,12 +921,12 @@ } }, "node_modules/@babel/plugin-syntax-flow": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz", - "integrity": "sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.21.4.tgz", + "integrity": "sha512-l9xd3N+XG4fZRxEP3vXdK6RW7vN1Uf5dxzRC/09wV86wqZ/YYQooBIGNsiRdfNR3/q2/5pPzV4B54J/9ctX5jw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" @@ -963,12 +963,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", + "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" @@ -1080,12 +1080,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", - "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", + "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" @@ -1196,9 +1196,9 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz", - "integrity": "sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", + "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.20.2" @@ -1450,9 +1450,9 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz", - "integrity": "sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz", + "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.20.2" @@ -1606,11 +1606,12 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.0.tgz", - "integrity": "sha512-xo///XTPp3mDzTtrqXoBlK9eiAYW3wv9JXglcn/u1bi60RW11dEUxIgA8cbnDhutS1zacjMRmAwxE0gMklLnZg==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.3.tgz", + "integrity": "sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw==", "dev": true, "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-create-class-features-plugin": "^7.21.0", "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-typescript": "^7.20.0" @@ -1654,31 +1655,31 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", - "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.4.tgz", + "integrity": "sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.20.1", - "@babel/helper-compilation-targets": "^7.20.0", + "@babel/compat-data": "^7.21.4", + "@babel/helper-compilation-targets": "^7.21.4", "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-option": "^7.18.6", + "@babel/helper-validator-option": "^7.21.0", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.20.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.20.7", + "@babel/plugin-proposal-async-generator-functions": "^7.20.7", "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.21.0", "@babel/plugin-proposal-dynamic-import": "^7.18.6", "@babel/plugin-proposal-export-namespace-from": "^7.18.9", "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", + "@babel/plugin-proposal-logical-assignment-operators": "^7.20.7", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.2", + "@babel/plugin-proposal-object-rest-spread": "^7.20.7", "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-optional-chaining": "^7.21.0", "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.21.0", "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", @@ -1695,40 +1696,40 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.20.7", + "@babel/plugin-transform-async-to-generator": "^7.20.7", "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.20.2", - "@babel/plugin-transform-classes": "^7.20.2", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.20.2", + "@babel/plugin-transform-block-scoping": "^7.21.0", + "@babel/plugin-transform-classes": "^7.21.0", + "@babel/plugin-transform-computed-properties": "^7.20.7", + "@babel/plugin-transform-destructuring": "^7.21.3", "@babel/plugin-transform-dotall-regex": "^7.18.6", "@babel/plugin-transform-duplicate-keys": "^7.18.9", "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-for-of": "^7.21.0", "@babel/plugin-transform-function-name": "^7.18.9", "@babel/plugin-transform-literals": "^7.18.9", "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.19.6", - "@babel/plugin-transform-modules-commonjs": "^7.19.6", - "@babel/plugin-transform-modules-systemjs": "^7.19.6", + "@babel/plugin-transform-modules-amd": "^7.20.11", + "@babel/plugin-transform-modules-commonjs": "^7.21.2", + "@babel/plugin-transform-modules-systemjs": "^7.20.11", "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.20.5", "@babel/plugin-transform-new-target": "^7.18.6", "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.20.1", + "@babel/plugin-transform-parameters": "^7.21.3", "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.20.5", "@babel/plugin-transform-reserved-words": "^7.18.6", "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.19.0", + "@babel/plugin-transform-spread": "^7.20.7", "@babel/plugin-transform-sticky-regex": "^7.18.6", "@babel/plugin-transform-template-literals": "^7.18.9", "@babel/plugin-transform-typeof-symbol": "^7.18.9", "@babel/plugin-transform-unicode-escapes": "^7.18.10", "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.20.2", + "@babel/types": "^7.21.4", "babel-plugin-polyfill-corejs2": "^0.3.3", "babel-plugin-polyfill-corejs3": "^0.6.0", "babel-plugin-polyfill-regenerator": "^0.4.1", @@ -1743,14 +1744,14 @@ } }, "node_modules/@babel/preset-flow": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.18.6.tgz", - "integrity": "sha512-E7BDhL64W6OUqpuyHnSroLnqyRTcG6ZdOBl1OKI/QK/HJfplqK/S3sq1Cckx7oTodJ5yOXyfw7rEADJ6UjoQDQ==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.21.4.tgz", + "integrity": "sha512-F24cSq4DIBmhq4OzK3dE63NHagb27OPE3eWR+HLekt4Z3Y5MzIIUGF3LlLgV0gN8vzbDViSY7HnrReNVCJXTeA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-transform-flow-strip-types": "^7.18.6" + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-option": "^7.21.0", + "@babel/plugin-transform-flow-strip-types": "^7.21.0" }, "engines": { "node": ">=6.9.0" @@ -1776,14 +1777,16 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.0.tgz", - "integrity": "sha512-myc9mpoVA5m1rF8K8DgLEatOYFDpwC+RkMkjZ0Du6uI62YvDe8uxIEYVs/VCdSJ097nlALiU/yBC7//3nI+hNg==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.4.tgz", + "integrity": "sha512-sMLNWY37TCdRH/bJ6ZeeOH1nPuanED7Ai9Y/vH31IPqalioJ6ZNFUWONsakhv4r4n+I6gm5lmoE0olkgib/j/A==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-validator-option": "^7.21.0", - "@babel/plugin-transform-typescript": "^7.21.0" + "@babel/plugin-syntax-jsx": "^7.21.4", + "@babel/plugin-transform-modules-commonjs": "^7.21.2", + "@babel/plugin-transform-typescript": "^7.21.3" }, "engines": { "node": ">=6.9.0" @@ -1974,9 +1977,9 @@ } }, "node_modules/@babel/types": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz", - "integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", + "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.19.4", @@ -2015,10 +2018,74 @@ "react": ">=16.8.0" } }, + "node_modules/@esbuild/android-arm": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.15.tgz", + "integrity": "sha512-sRSOVlLawAktpMvDyJIkdLI/c/kdRTOqo8t6ImVxg8yT7LQDUYV5Rp2FKeEosLr6ZCja9UjYAzyRSxGteSJPYg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.15.tgz", + "integrity": "sha512-0kOB6Y7Br3KDVgHeg8PRcvfLkq+AccreK///B4Z6fNZGr/tNHX0z2VywCc7PTeWp+bPvjA5WMvNXltHw5QjAIA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.15.tgz", + "integrity": "sha512-MzDqnNajQZ63YkaUWVl9uuhcWyEyh69HGpMIrf+acR4otMkfLJ4sUCxqwbCyPGicE9dVlrysI3lMcDBjGiBBcQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.15.tgz", + "integrity": "sha512-7siLjBc88Z4+6qkMDxPT2juf2e8SJxmsbNVKFY2ifWCDT72v5YJz9arlvBw5oB4W/e61H1+HDB/jnu8nNg0rLA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@esbuild/darwin-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz", - "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==", + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.15.tgz", + "integrity": "sha512-NbImBas2rXwYI52BOKTW342Tm3LTeVlaOQ4QPZ7XuWNKiO226DisFk/RyPk3T0CKZkKMuU69yOvlapJEmax7cg==", "cpu": [ "x64" ], @@ -2031,6 +2098,278 @@ "node": ">=12" } }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.15.tgz", + "integrity": "sha512-Xk9xMDjBVG6CfgoqlVczHAdJnCs0/oeFOspFap5NkYAmRCT2qTn1vJWA2f419iMtsHSLm+O8B6SLV/HlY5cYKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.15.tgz", + "integrity": "sha512-3TWAnnEOdclvb2pnfsTWtdwthPfOz7qAfcwDLcfZyGJwm1SRZIMOeB5FODVhnM93mFSPsHB9b/PmxNNbSnd0RQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.15.tgz", + "integrity": "sha512-MLTgiXWEMAMr8nmS9Gigx43zPRmEfeBfGCwxFQEMgJ5MC53QKajaclW6XDPjwJvhbebv+RzK05TQjvH3/aM4Xw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.15.tgz", + "integrity": "sha512-T0MVnYw9KT6b83/SqyznTs/3Jg2ODWrZfNccg11XjDehIved2oQfrX/wVuev9N936BpMRaTR9I1J0tdGgUgpJA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.15.tgz", + "integrity": "sha512-wp02sHs015T23zsQtU4Cj57WiteiuASHlD7rXjKUyAGYzlOKDAjqK6bk5dMi2QEl/KVOcsjwL36kD+WW7vJt8Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.15.tgz", + "integrity": "sha512-k7FsUJjGGSxwnBmMh8d7IbObWu+sF/qbwc+xKZkBe/lTAF16RqxRCnNHA7QTd3oS2AfGBAnHlXL67shV5bBThQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.15.tgz", + "integrity": "sha512-ZLWk6czDdog+Q9kE/Jfbilu24vEe/iW/Sj2d8EVsmiixQ1rM2RKH2n36qfxK4e8tVcaXkvuV3mU5zTZviE+NVQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.15.tgz", + "integrity": "sha512-mY6dPkIRAiFHRsGfOYZC8Q9rmr8vOBZBme0/j15zFUKM99d4ILY4WpOC7i/LqoY+RE7KaMaSfvY8CqjJtuO4xg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.15.tgz", + "integrity": "sha512-EcyUtxffdDtWjjwIH8sKzpDRLcVtqANooMNASO59y+xmqqRYBBM7xVLQhqF7nksIbm2yHABptoioS9RAbVMWVA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.15.tgz", + "integrity": "sha512-BuS6Jx/ezxFuHxgsfvz7T4g4YlVrmCmg7UAwboeyNNg0OzNzKsIZXpr3Sb/ZREDXWgt48RO4UQRDBxJN3B9Rbg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.15.tgz", + "integrity": "sha512-JsdS0EgEViwuKsw5tiJQo9UdQdUJYuB+Mf6HxtJSPN35vez1hlrNb1KajvKWF5Sa35j17+rW1ECEO9iNrIXbNg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.15.tgz", + "integrity": "sha512-R6fKjtUysYGym6uXf6qyNephVUQAGtf3n2RCsOST/neIwPqRWcnc3ogcielOd6pT+J0RDR1RGcy0ZY7d3uHVLA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.15.tgz", + "integrity": "sha512-mVD4PGc26b8PI60QaPUltYKeSX0wxuy0AltC+WCTFwvKCq2+OgLP4+fFd+hZXzO2xW1HPKcytZBdjqL6FQFa7w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.15.tgz", + "integrity": "sha512-U6tYPovOkw3459t2CBwGcFYfFRjivcJJc1WC8Q3funIwX8x4fP+R6xL/QuTPNGOblbq/EUDxj9GU+dWKX0oWlQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.15.tgz", + "integrity": "sha512-W+Z5F++wgKAleDABemiyXVnzXgvRFs+GVKThSI+mGgleLWluv0D7Diz4oQpgdpNzh4i2nNDzQtWbjJiqutRp6Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.15.tgz", + "integrity": "sha512-Muz/+uGgheShKGqSVS1KsHtCyEzcdOn/W/Xbh6H91Etm+wiIfwZaBn1W58MeGtfI8WA961YMHFYTthBdQs4t+w==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.15.tgz", + "integrity": "sha512-DjDa9ywLUUmjhV2Y9wUTIF+1XsmuFGvZoCmOWkli1XcNAh5t25cc7fgsCx4Zi/Uurep3TTLyDiKATgGEg61pkA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@eslint/eslintrc": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.0.tgz", @@ -2473,9 +2812,9 @@ "dev": true }, "node_modules/@lit-labs/ssr-dom-shim": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.0.0.tgz", - "integrity": "sha512-ic93MBXfApIFTrup4a70M/+ddD8xdt2zxxj9sRwHQzhS9ag/syqkD8JPdTXsc1gUy2K8TTirhlCqyTEM/sifNw==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.1.0.tgz", + "integrity": "sha512-92uQ5ARf7UXYrzaFcAX3T2rTvaS9Z1//ukV+DqjACM4c8s0ZBQd7ayJU5Dh2AFLD/Ayuyz4uMmxQec8q3U4Ong==" }, "node_modules/@lit/reactive-element": { "version": "1.6.1", @@ -2783,21 +3122,21 @@ "dev": true }, "node_modules/@storybook/addon-a11y": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-7.0.0-rc.3.tgz", - "integrity": "sha512-V/wl19IzsOA0OkUofKKbL09Qj93ywRHW3Pjq3pOLRE178zCumWuBKxpr+dS4C1lNwecIU1ffp8408RSzZ4K5sA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-7.0.2.tgz", + "integrity": "sha512-PCJaLdp/3MypMYQufLIaKL4gzZjDgU8fTW45O7feXwiUZzFUVZamBwBw5BHcHAPsDOr5CmebGvJ9+l2gByWL/g==", "dev": true, "dependencies": { - "@storybook/addon-highlight": "7.0.0-rc.3", - "@storybook/channels": "7.0.0-rc.3", - "@storybook/client-logger": "7.0.0-rc.3", - "@storybook/components": "7.0.0-rc.3", - "@storybook/core-events": "7.0.0-rc.3", + "@storybook/addon-highlight": "7.0.2", + "@storybook/channels": "7.0.2", + "@storybook/client-logger": "7.0.2", + "@storybook/components": "7.0.2", + "@storybook/core-events": "7.0.2", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.0-rc.3", - "@storybook/preview-api": "7.0.0-rc.3", - "@storybook/theming": "7.0.0-rc.3", - "@storybook/types": "7.0.0-rc.3", + "@storybook/manager-api": "7.0.2", + "@storybook/preview-api": "7.0.2", + "@storybook/theming": "7.0.2", + "@storybook/types": "7.0.2", "axe-core": "^4.2.0", "lodash": "^4.17.21", "react-resize-detector": "^7.1.2" @@ -2820,19 +3159,19 @@ } }, "node_modules/@storybook/addon-actions": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-7.0.0-rc.3.tgz", - "integrity": "sha512-kyPuSN/PzBnW3w9D/KBEmMqfeGpBeY6Ha2VVPz3BBqcWSHfw0AbHFqvnqluubaHZl1VokE88QT6RxkdyBg33uw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-7.0.2.tgz", + "integrity": "sha512-rcj39u9MrmzsrDWYt1zsoVxrogZ1Amrv9xkEofEY/QKUr2R3xpHhTALveY9BKIlG1GoE8zLlLoP2k4nz3sNNwQ==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.0.0-rc.3", - "@storybook/components": "7.0.0-rc.3", - "@storybook/core-events": "7.0.0-rc.3", + "@storybook/client-logger": "7.0.2", + "@storybook/components": "7.0.2", + "@storybook/core-events": "7.0.2", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.0-rc.3", - "@storybook/preview-api": "7.0.0-rc.3", - "@storybook/theming": "7.0.0-rc.3", - "@storybook/types": "7.0.0-rc.3", + "@storybook/manager-api": "7.0.2", + "@storybook/preview-api": "7.0.2", + "@storybook/theming": "7.0.2", + "@storybook/types": "7.0.2", "dequal": "^2.0.2", "lodash": "^4.17.21", "polished": "^4.2.2", @@ -2860,19 +3199,19 @@ } }, "node_modules/@storybook/addon-backgrounds": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-7.0.0-rc.3.tgz", - "integrity": "sha512-6qIwuNwzLFdsLCjj5rO6TCaBvAGUYbrLpw2EQyKg5J/5GxqhMU/HsinCViok2VEn/z45vji9FI1W6bmo7t4LNQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-7.0.2.tgz", + "integrity": "sha512-yRNHQ4PPRJ+HIORQPhDGxn5xolw1xW0ByQZoNRpMD+AMEyfUNFdWbCsRQAOWjNhawxVMHM7EeA2Exrb41zhEjA==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.0.0-rc.3", - "@storybook/components": "7.0.0-rc.3", - "@storybook/core-events": "7.0.0-rc.3", + "@storybook/client-logger": "7.0.2", + "@storybook/components": "7.0.2", + "@storybook/core-events": "7.0.2", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.0-rc.3", - "@storybook/preview-api": "7.0.0-rc.3", - "@storybook/theming": "7.0.0-rc.3", - "@storybook/types": "7.0.0-rc.3", + "@storybook/manager-api": "7.0.2", + "@storybook/preview-api": "7.0.2", + "@storybook/theming": "7.0.2", + "@storybook/types": "7.0.2", "memoizerific": "^1.11.3", "ts-dedent": "^2.0.0" }, @@ -2894,20 +3233,20 @@ } }, "node_modules/@storybook/addon-controls": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-7.0.0-rc.3.tgz", - "integrity": "sha512-16E0AJ1+psFDbL6abOfLFg0zWhUQeJjcM3RKEzJjYZEBuKKL86LAvKhnlkyCUW3VlLN23V0akY6Gev81DR/BfA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-7.0.2.tgz", + "integrity": "sha512-dMpRtj5cmfC9vEMve5ncvbWCEC+WD9YuzJ+grdc48E/Hd//p+O2FE6klSkrz5FAjrc+rHINixdyssekpEL6nYQ==", "dev": true, "dependencies": { - "@storybook/blocks": "7.0.0-rc.3", - "@storybook/client-logger": "7.0.0-rc.3", - "@storybook/components": "7.0.0-rc.3", - "@storybook/core-common": "7.0.0-rc.3", - "@storybook/manager-api": "7.0.0-rc.3", - "@storybook/node-logger": "7.0.0-rc.3", - "@storybook/preview-api": "7.0.0-rc.3", - "@storybook/theming": "7.0.0-rc.3", - "@storybook/types": "7.0.0-rc.3", + "@storybook/blocks": "7.0.2", + "@storybook/client-logger": "7.0.2", + "@storybook/components": "7.0.2", + "@storybook/core-common": "7.0.2", + "@storybook/manager-api": "7.0.2", + "@storybook/node-logger": "7.0.2", + "@storybook/preview-api": "7.0.2", + "@storybook/theming": "7.0.2", + "@storybook/types": "7.0.2", "lodash": "^4.17.21", "ts-dedent": "^2.0.0" }, @@ -2929,28 +3268,28 @@ } }, "node_modules/@storybook/addon-docs": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-7.0.0-rc.3.tgz", - "integrity": "sha512-UPy+o7IBly2TgCQ7hviaExq++KQSPS7/+/8iLUdv81mtRm3hMBMARmom+wjXfciGHp1re1bazQQYoDsOcorDhA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-7.0.2.tgz", + "integrity": "sha512-q3rDWoZEym6Lkmhqc/HBNfLDAmTY8l0WINGUZo/nF98eP5iu4B7Nk7V6BRGYGQt6Y6ZyIQ8WKH0e/eJww2zIog==", "dev": true, "dependencies": { "@babel/core": "^7.20.2", "@babel/plugin-transform-react-jsx": "^7.19.0", "@jest/transform": "^29.3.1", "@mdx-js/react": "^2.1.5", - "@storybook/blocks": "7.0.0-rc.3", - "@storybook/client-logger": "7.0.0-rc.3", - "@storybook/components": "7.0.0-rc.3", - "@storybook/csf-plugin": "7.0.0-rc.3", - "@storybook/csf-tools": "7.0.0-rc.3", + "@storybook/blocks": "7.0.2", + "@storybook/client-logger": "7.0.2", + "@storybook/components": "7.0.2", + "@storybook/csf-plugin": "7.0.2", + "@storybook/csf-tools": "7.0.2", "@storybook/global": "^5.0.0", - "@storybook/mdx2-csf": "next", - "@storybook/node-logger": "7.0.0-rc.3", - "@storybook/postinstall": "7.0.0-rc.3", - "@storybook/preview-api": "7.0.0-rc.3", - "@storybook/react-dom-shim": "7.0.0-rc.3", - "@storybook/theming": "7.0.0-rc.3", - "@storybook/types": "7.0.0-rc.3", + "@storybook/mdx2-csf": "^1.0.0", + "@storybook/node-logger": "7.0.2", + "@storybook/postinstall": "7.0.2", + "@storybook/preview-api": "7.0.2", + "@storybook/react-dom-shim": "7.0.2", + "@storybook/theming": "7.0.2", + "@storybook/types": "7.0.2", "fs-extra": "^11.1.0", "remark-external-links": "^8.0.0", "remark-slug": "^6.0.0", @@ -2972,24 +3311,24 @@ } }, "node_modules/@storybook/addon-essentials": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-7.0.0-rc.3.tgz", - "integrity": "sha512-RLA1RgjwuDsRKp2QjBAx2XsgTZ+Dura2k8xCTyBLf0yxnleC8hiAxLwTJSSdDEUuiXxWsBbu0vhHzYnCCVTDnw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-7.0.2.tgz", + "integrity": "sha512-LAsWsXa/Pp2B4Ve2WVgc990FtsiHpFDRsq7S3V7xRrZP8DYRbtJIVdszPMDS5uKC+yzbswFEXz08lqbGvq8zgQ==", "dev": true, "dependencies": { - "@storybook/addon-actions": "7.0.0-rc.3", - "@storybook/addon-backgrounds": "7.0.0-rc.3", - "@storybook/addon-controls": "7.0.0-rc.3", - "@storybook/addon-docs": "7.0.0-rc.3", - "@storybook/addon-highlight": "7.0.0-rc.3", - "@storybook/addon-measure": "7.0.0-rc.3", - "@storybook/addon-outline": "7.0.0-rc.3", - "@storybook/addon-toolbars": "7.0.0-rc.3", - "@storybook/addon-viewport": "7.0.0-rc.3", - "@storybook/core-common": "7.0.0-rc.3", - "@storybook/manager-api": "7.0.0-rc.3", - "@storybook/node-logger": "7.0.0-rc.3", - "@storybook/preview-api": "7.0.0-rc.3", + "@storybook/addon-actions": "7.0.2", + "@storybook/addon-backgrounds": "7.0.2", + "@storybook/addon-controls": "7.0.2", + "@storybook/addon-docs": "7.0.2", + "@storybook/addon-highlight": "7.0.2", + "@storybook/addon-measure": "7.0.2", + "@storybook/addon-outline": "7.0.2", + "@storybook/addon-toolbars": "7.0.2", + "@storybook/addon-viewport": "7.0.2", + "@storybook/core-common": "7.0.2", + "@storybook/manager-api": "7.0.2", + "@storybook/node-logger": "7.0.2", + "@storybook/preview-api": "7.0.2", "ts-dedent": "^2.0.0" }, "funding": { @@ -3002,14 +3341,14 @@ } }, "node_modules/@storybook/addon-highlight": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-7.0.0-rc.3.tgz", - "integrity": "sha512-MeFIKfDpFrF33TPdl2ko2rie485AhfG2n0MFXA73L8Yzj5JPV+LVNa5eIKUUFyOMUGSkVjfFS6n63F08eqHbCw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-7.0.2.tgz", + "integrity": "sha512-9BkL1OOanguuy73S6nLK0isUb045tOkFONd/PQldOJ0PV3agCvKxKHyzlBz7Hsba8KZhY5jQs+nVW2NiREyGYg==", "dev": true, "dependencies": { - "@storybook/core-events": "7.0.0-rc.3", + "@storybook/core-events": "7.0.2", "@storybook/global": "^5.0.0", - "@storybook/preview-api": "7.0.0-rc.3" + "@storybook/preview-api": "7.0.2" }, "funding": { "type": "opencollective", @@ -3017,19 +3356,19 @@ } }, "node_modules/@storybook/addon-links": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-7.0.0-rc.3.tgz", - "integrity": "sha512-K2PMxVooGAgb8hCEU2oGUMzKjPLEPACH8NcRLs/fz9PKadepmijY0hBDC50SGkZd2HWSxXxyt6d5WaXTxhP8aw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-7.0.2.tgz", + "integrity": "sha512-lPtfy2MqrcI9YjupBM2eRKGPdFKVPCz7WgO/JQQakGugORJTEGCyJrNJNtWY9jDenv8ynLZ40OxtPBZi54Sr6Q==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.0.0-rc.3", - "@storybook/core-events": "7.0.0-rc.3", - "@storybook/csf": "next", + "@storybook/client-logger": "7.0.2", + "@storybook/core-events": "7.0.2", + "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.0-rc.3", - "@storybook/preview-api": "7.0.0-rc.3", - "@storybook/router": "7.0.0-rc.3", - "@storybook/types": "7.0.0-rc.3", + "@storybook/manager-api": "7.0.2", + "@storybook/preview-api": "7.0.2", + "@storybook/router": "7.0.2", + "@storybook/types": "7.0.2", "prop-types": "^15.7.2", "ts-dedent": "^2.0.0" }, @@ -3051,18 +3390,18 @@ } }, "node_modules/@storybook/addon-measure": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-7.0.0-rc.3.tgz", - "integrity": "sha512-N0HjObHjktlgWvOQcOqyC6/vFXERHzH7aP8L1RRrSnz+mP0XDO+62eBZunlnDGu4uAECH+AV/7LO+bmTMohulg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-7.0.2.tgz", + "integrity": "sha512-cf/d5MXpHAjyUiDIVfc8pLn79CPHgnryDmNNlSiP2zEFKcivrRWiu8Rmrad8pGqLkuAh+PXLKCGn9uiqDvg7QQ==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.0.0-rc.3", - "@storybook/components": "7.0.0-rc.3", - "@storybook/core-events": "7.0.0-rc.3", + "@storybook/client-logger": "7.0.2", + "@storybook/components": "7.0.2", + "@storybook/core-events": "7.0.2", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.0-rc.3", - "@storybook/preview-api": "7.0.0-rc.3", - "@storybook/types": "7.0.0-rc.3" + "@storybook/manager-api": "7.0.2", + "@storybook/preview-api": "7.0.2", + "@storybook/types": "7.0.2" }, "funding": { "type": "opencollective", @@ -3082,18 +3421,18 @@ } }, "node_modules/@storybook/addon-outline": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-7.0.0-rc.3.tgz", - "integrity": "sha512-SocPRmzzu2wR3SiqMsPskfFumOd0Ph8MUTeJ2cwnaonqqHjjqxaEaFYio8AGmGaHLpY8PKtW0s75jU0oDh9Ezg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-7.0.2.tgz", + "integrity": "sha512-thVISO4NM22xlETisBvAPvz2yFD3qLGOjgzBmj8l8r9Rv0IEdwdPrwm5j0WTv8OtbhC4A8lPpvMsn5FhY5mDXg==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.0.0-rc.3", - "@storybook/components": "7.0.0-rc.3", - "@storybook/core-events": "7.0.0-rc.3", + "@storybook/client-logger": "7.0.2", + "@storybook/components": "7.0.2", + "@storybook/core-events": "7.0.2", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.0-rc.3", - "@storybook/preview-api": "7.0.0-rc.3", - "@storybook/types": "7.0.0-rc.3", + "@storybook/manager-api": "7.0.2", + "@storybook/preview-api": "7.0.2", + "@storybook/types": "7.0.2", "ts-dedent": "^2.0.0" }, "funding": { @@ -3114,16 +3453,16 @@ } }, "node_modules/@storybook/addon-toolbars": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-7.0.0-rc.3.tgz", - "integrity": "sha512-qnvMWZAa3ELRNiVjj1sy0dJb2GzE5fga9SbsbVQQT2zBvou2e8XbiPRw0WHdwUU2Zj9t9/PVjz2+av7P8B+Cqg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-7.0.2.tgz", + "integrity": "sha512-tAxZ2+nUYsJdT1sx3BrmoMAZFM19+OzWJY6qSnbEq5zoRgvGZaXGR6tLMKydDoHQBU9Ta9YHGo7N7u7h1C23yg==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.0.0-rc.3", - "@storybook/components": "7.0.0-rc.3", - "@storybook/manager-api": "7.0.0-rc.3", - "@storybook/preview-api": "7.0.0-rc.3", - "@storybook/theming": "7.0.0-rc.3" + "@storybook/client-logger": "7.0.2", + "@storybook/components": "7.0.2", + "@storybook/manager-api": "7.0.2", + "@storybook/preview-api": "7.0.2", + "@storybook/theming": "7.0.2" }, "funding": { "type": "opencollective", @@ -3143,18 +3482,18 @@ } }, "node_modules/@storybook/addon-viewport": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-7.0.0-rc.3.tgz", - "integrity": "sha512-GXBi7f4WNeM4yvKXKYNAMLDHauTOcLpimzf1wtyVapBLpwzcJHBaJTCHQ02yIcm6mU2TFbKXMmzC1uBZcCa+5w==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-7.0.2.tgz", + "integrity": "sha512-TaHJWIIazPM/TerRbka9RqjMPNpwaRsGRdVRBtVoVosy1FzsEjAdQSO7RBMe4G03m5CacSqdsDiJCblI2AXaew==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.0.0-rc.3", - "@storybook/components": "7.0.0-rc.3", - "@storybook/core-events": "7.0.0-rc.3", + "@storybook/client-logger": "7.0.2", + "@storybook/components": "7.0.2", + "@storybook/core-events": "7.0.2", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.0-rc.3", - "@storybook/preview-api": "7.0.0-rc.3", - "@storybook/theming": "7.0.0-rc.3", + "@storybook/manager-api": "7.0.2", + "@storybook/preview-api": "7.0.2", + "@storybook/theming": "7.0.2", "memoizerific": "^1.11.3", "prop-types": "^15.7.2" }, @@ -3175,292 +3514,23 @@ } } }, - "node_modules/@storybook/addons": { - "version": "6.5.16", - "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.5.16.tgz", - "integrity": "sha512-p3DqQi+8QRL5k7jXhXmJZLsE/GqHqyY6PcoA1oNTJr0try48uhTGUOYkgzmqtDaa/qPFO5LP+xCPzZXckGtquQ==", - "dev": true, - "dependencies": { - "@storybook/api": "6.5.16", - "@storybook/channels": "6.5.16", - "@storybook/client-logger": "6.5.16", - "@storybook/core-events": "6.5.16", - "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/router": "6.5.16", - "@storybook/theming": "6.5.16", - "@types/webpack-env": "^1.16.0", - "core-js": "^3.8.2", - "global": "^4.4.0", - "regenerator-runtime": "^0.13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@storybook/addons/node_modules/@storybook/channels": { - "version": "6.5.16", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.5.16.tgz", - "integrity": "sha512-VylzaWQZaMozEwZPJdyJoz+0jpDa8GRyaqu9TGG6QGv+KU5POoZaGLDkRE7TzWkyyP0KQLo80K99MssZCpgSeg==", - "dev": true, - "dependencies": { - "core-js": "^3.8.2", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/addons/node_modules/@storybook/client-logger": { - "version": "6.5.16", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.5.16.tgz", - "integrity": "sha512-pxcNaCj3ItDdicPTXTtmYJE3YC1SjxFrBmHcyrN+nffeNyiMuViJdOOZzzzucTUG0wcOOX8jaSyak+nnHg5H1Q==", - "dev": true, - "dependencies": { - "core-js": "^3.8.2", - "global": "^4.4.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/addons/node_modules/@storybook/core-events": { - "version": "6.5.16", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.5.16.tgz", - "integrity": "sha512-qMZQwmvzpH5F2uwNUllTPg6eZXr2OaYZQRRN8VZJiuorZzDNdAFmiVWMWdkThwmyLEJuQKXxqCL8lMj/7PPM+g==", - "dev": true, - "dependencies": { - "core-js": "^3.8.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/addons/node_modules/@storybook/csf": { - "version": "0.0.2--canary.4566f4d.1", - "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.0.2--canary.4566f4d.1.tgz", - "integrity": "sha512-9OVvMVh3t9znYZwb0Svf/YQoxX2gVOeQTGe2bses2yj+a3+OJnCrUF3/hGv6Em7KujtOdL2LL+JnG49oMVGFgQ==", - "dev": true, - "dependencies": { - "lodash": "^4.17.15" - } - }, - "node_modules/@storybook/addons/node_modules/@storybook/router": { - "version": "6.5.16", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.5.16.tgz", - "integrity": "sha512-ZgeP8a5YV/iuKbv31V8DjPxlV4AzorRiR8OuSt/KqaiYXNXlOoQDz/qMmiNcrshrfLpmkzoq7fSo4T8lWo2UwQ==", - "dev": true, - "dependencies": { - "@storybook/client-logger": "6.5.16", - "core-js": "^3.8.2", - "memoizerific": "^1.11.3", - "qs": "^6.10.0", - "regenerator-runtime": "^0.13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@storybook/addons/node_modules/@storybook/theming": { - "version": "6.5.16", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.5.16.tgz", - "integrity": "sha512-hNLctkjaYLRdk1+xYTkC1mg4dYz2wSv6SqbLpcKMbkPHTE0ElhddGPHQqB362md/w9emYXNkt1LSMD8Xk9JzVQ==", - "dev": true, - "dependencies": { - "@storybook/client-logger": "6.5.16", - "core-js": "^3.8.2", - "memoizerific": "^1.11.3", - "regenerator-runtime": "^0.13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@storybook/api": { - "version": "6.5.16", - "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.5.16.tgz", - "integrity": "sha512-HOsuT8iomqeTMQJrRx5U8nsC7lJTwRr1DhdD0SzlqL4c80S/7uuCy4IZvOt4sYQjOzW5fOo/kamcoBXyLproTA==", - "dev": true, - "dependencies": { - "@storybook/channels": "6.5.16", - "@storybook/client-logger": "6.5.16", - "@storybook/core-events": "6.5.16", - "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/router": "6.5.16", - "@storybook/semver": "^7.3.2", - "@storybook/theming": "6.5.16", - "core-js": "^3.8.2", - "fast-deep-equal": "^3.1.3", - "global": "^4.4.0", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3", - "regenerator-runtime": "^0.13.7", - "store2": "^2.12.0", - "telejson": "^6.0.8", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@storybook/api/node_modules/@storybook/channels": { - "version": "6.5.16", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.5.16.tgz", - "integrity": "sha512-VylzaWQZaMozEwZPJdyJoz+0jpDa8GRyaqu9TGG6QGv+KU5POoZaGLDkRE7TzWkyyP0KQLo80K99MssZCpgSeg==", - "dev": true, - "dependencies": { - "core-js": "^3.8.2", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/api/node_modules/@storybook/client-logger": { - "version": "6.5.16", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.5.16.tgz", - "integrity": "sha512-pxcNaCj3ItDdicPTXTtmYJE3YC1SjxFrBmHcyrN+nffeNyiMuViJdOOZzzzucTUG0wcOOX8jaSyak+nnHg5H1Q==", - "dev": true, - "dependencies": { - "core-js": "^3.8.2", - "global": "^4.4.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/api/node_modules/@storybook/core-events": { - "version": "6.5.16", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.5.16.tgz", - "integrity": "sha512-qMZQwmvzpH5F2uwNUllTPg6eZXr2OaYZQRRN8VZJiuorZzDNdAFmiVWMWdkThwmyLEJuQKXxqCL8lMj/7PPM+g==", - "dev": true, - "dependencies": { - "core-js": "^3.8.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/api/node_modules/@storybook/csf": { - "version": "0.0.2--canary.4566f4d.1", - "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.0.2--canary.4566f4d.1.tgz", - "integrity": "sha512-9OVvMVh3t9znYZwb0Svf/YQoxX2gVOeQTGe2bses2yj+a3+OJnCrUF3/hGv6Em7KujtOdL2LL+JnG49oMVGFgQ==", - "dev": true, - "dependencies": { - "lodash": "^4.17.15" - } - }, - "node_modules/@storybook/api/node_modules/@storybook/router": { - "version": "6.5.16", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.5.16.tgz", - "integrity": "sha512-ZgeP8a5YV/iuKbv31V8DjPxlV4AzorRiR8OuSt/KqaiYXNXlOoQDz/qMmiNcrshrfLpmkzoq7fSo4T8lWo2UwQ==", - "dev": true, - "dependencies": { - "@storybook/client-logger": "6.5.16", - "core-js": "^3.8.2", - "memoizerific": "^1.11.3", - "qs": "^6.10.0", - "regenerator-runtime": "^0.13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@storybook/api/node_modules/@storybook/theming": { - "version": "6.5.16", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.5.16.tgz", - "integrity": "sha512-hNLctkjaYLRdk1+xYTkC1mg4dYz2wSv6SqbLpcKMbkPHTE0ElhddGPHQqB362md/w9emYXNkt1LSMD8Xk9JzVQ==", - "dev": true, - "dependencies": { - "@storybook/client-logger": "6.5.16", - "core-js": "^3.8.2", - "memoizerific": "^1.11.3", - "regenerator-runtime": "^0.13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@storybook/api/node_modules/isobject": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", - "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/api/node_modules/telejson": { - "version": "6.0.8", - "resolved": "https://registry.npmjs.org/telejson/-/telejson-6.0.8.tgz", - "integrity": "sha512-nerNXi+j8NK1QEfBHtZUN/aLdDcyupA//9kAboYLrtzZlPLpUfqbVGWb9zz91f/mIjRbAYhbgtnJHY8I1b5MBg==", - "dev": true, - "dependencies": { - "@types/is-function": "^1.0.0", - "global": "^4.4.0", - "is-function": "^1.0.2", - "is-regex": "^1.1.2", - "is-symbol": "^1.0.3", - "isobject": "^4.0.0", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3" - } - }, "node_modules/@storybook/blocks": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-7.0.0-rc.3.tgz", - "integrity": "sha512-mh4LQk2f/Q9n7Sqo6t02CspHubXmSgDY4S5vF3dTgVBM/sD0OxkAY3Pv+HTsXH36lQHYYUft7U7OfhZapgS4ng==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-7.0.2.tgz", + "integrity": "sha512-JzHmU8jZLzeQ6bunzci8j/2Ji18GBTyhrPFLk5RjEbMNGWpGjvER/yR127tZOdbPguVNr4iVbRfGzd1wGHlrzA==", "dev": true, "dependencies": { - "@storybook/channels": "7.0.0-rc.3", - "@storybook/client-logger": "7.0.0-rc.3", - "@storybook/components": "7.0.0-rc.3", - "@storybook/core-events": "7.0.0-rc.3", - "@storybook/csf": "next", - "@storybook/docs-tools": "7.0.0-rc.3", + "@storybook/channels": "7.0.2", + "@storybook/client-logger": "7.0.2", + "@storybook/components": "7.0.2", + "@storybook/core-events": "7.0.2", + "@storybook/csf": "^0.1.0", + "@storybook/docs-tools": "7.0.2", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.0-rc.3", - "@storybook/preview-api": "7.0.0-rc.3", - "@storybook/theming": "7.0.0-rc.3", - "@storybook/types": "7.0.0-rc.3", + "@storybook/manager-api": "7.0.2", + "@storybook/preview-api": "7.0.2", + "@storybook/theming": "7.0.2", + "@storybook/types": "7.0.2", "@types/lodash": "^4.14.167", "color-convert": "^2.0.1", "dequal": "^2.0.2", @@ -3483,27 +3553,26 @@ } }, "node_modules/@storybook/builder-manager": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/builder-manager/-/builder-manager-7.0.0-rc.3.tgz", - "integrity": "sha512-aScwYA9MWtqgiD39SkcwUlrR9RFbngv7jPoOaVMdXuMgNabMNz9417L9bCwSPwgO4XZ5a/nSEbGNLfOHfBemsw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/builder-manager/-/builder-manager-7.0.2.tgz", + "integrity": "sha512-Oej/n8D7eaWgmWF7nN2hXLRM53lcYOdh6umSN8Mh/LcYUfxB+dvUBFzUjoLE0xjhW6xRinrKrENT5LcP/f/HBQ==", "dev": true, "dependencies": { "@fal-works/esbuild-plugin-global-externals": "^2.1.2", - "@storybook/core-common": "7.0.0-rc.3", - "@storybook/manager": "7.0.0-rc.3", - "@storybook/node-logger": "7.0.0-rc.3", + "@storybook/core-common": "7.0.2", + "@storybook/manager": "7.0.2", + "@storybook/node-logger": "7.0.2", "@types/ejs": "^3.1.1", "@types/find-cache-dir": "^3.2.1", "@yarnpkg/esbuild-plugin-pnp": "^3.0.0-rc.10", "browser-assert": "^1.2.1", "ejs": "^3.1.8", - "esbuild": "^0.16.4", + "esbuild": "^0.17.0", "esbuild-plugin-alias": "^0.2.1", "express": "^4.17.3", "find-cache-dir": "^3.0.0", "fs-extra": "^11.1.0", "process": "^0.11.10", - "slash": "^3.0.0", "util": "^0.12.4" }, "funding": { @@ -3512,21 +3581,21 @@ } }, "node_modules/@storybook/builder-vite": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-7.0.0-rc.3.tgz", - "integrity": "sha512-v2d04PWfcITD7zI68d7XbCbOd+5vl3gIMEX5Xdsmuw3WcaqYxvDSE8GhL6zsBhrUyygV/8xhSaaxyfv8ImM0+w==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-7.0.2.tgz", + "integrity": "sha512-G6CD2Gf2zwzRslvNvqgz4FeADVEA9XA4Mw6+NM6Twc+Wy/Ah482dvHS9ApSgirtGyBKjOfdHn1xQT4Z+kzbJnw==", "dev": true, "dependencies": { - "@storybook/channel-postmessage": "7.0.0-rc.3", - "@storybook/channel-websocket": "7.0.0-rc.3", - "@storybook/client-logger": "7.0.0-rc.3", - "@storybook/core-common": "7.0.0-rc.3", - "@storybook/csf-plugin": "7.0.0-rc.3", - "@storybook/mdx2-csf": "next", - "@storybook/node-logger": "7.0.0-rc.3", - "@storybook/preview": "7.0.0-rc.3", - "@storybook/preview-api": "7.0.0-rc.3", - "@storybook/types": "7.0.0-rc.3", + "@storybook/channel-postmessage": "7.0.2", + "@storybook/channel-websocket": "7.0.2", + "@storybook/client-logger": "7.0.2", + "@storybook/core-common": "7.0.2", + "@storybook/csf-plugin": "7.0.2", + "@storybook/mdx2-csf": "^1.0.0", + "@storybook/node-logger": "7.0.2", + "@storybook/preview": "7.0.2", + "@storybook/preview-api": "7.0.2", + "@storybook/types": "7.0.2", "browser-assert": "^1.2.1", "es-module-lexer": "^0.9.3", "express": "^4.17.3", @@ -3534,8 +3603,9 @@ "glob": "^8.1.0", "glob-promise": "^6.0.2", "magic-string": "^0.27.0", - "rollup": "^2.25.0 || ^3.3.0", - "slash": "^3.0.0" + "remark-external-links": "^8.0.0", + "remark-slug": "^6.0.0", + "rollup": "^2.25.0 || ^3.3.0" }, "funding": { "type": "opencollective", @@ -3564,14 +3634,14 @@ } }, "node_modules/@storybook/channel-postmessage": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-7.0.0-rc.3.tgz", - "integrity": "sha512-1uptuCjA4vAvvoxNoIJPTIpSARzJnLU7eahRhTPwELBnCH0ObqvgInge0cvbYsaTRDNV90oBbEKlxLf1Zb1BhQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-7.0.2.tgz", + "integrity": "sha512-SZ/KqnZcx10W9hJbrzBKcP9dmgaeTaXugUhcgw1IkmjKWdsKazqFZCPwQWZZKAmhO4wYbyYOhkz3wfSIeB4mFw==", "dev": true, "dependencies": { - "@storybook/channels": "7.0.0-rc.3", - "@storybook/client-logger": "7.0.0-rc.3", - "@storybook/core-events": "7.0.0-rc.3", + "@storybook/channels": "7.0.2", + "@storybook/client-logger": "7.0.2", + "@storybook/core-events": "7.0.2", "@storybook/global": "^5.0.0", "qs": "^6.10.0", "telejson": "^7.0.3" @@ -3582,13 +3652,13 @@ } }, "node_modules/@storybook/channel-websocket": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/channel-websocket/-/channel-websocket-7.0.0-rc.3.tgz", - "integrity": "sha512-706jopde+OZZkqsmrRuwd9utusqiKianiF8cvjAxrxogSx8LwHk8jxrEKHxHiZUEWDS3JxJoIYSV8gxH9hcjsA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/channel-websocket/-/channel-websocket-7.0.2.tgz", + "integrity": "sha512-YU3lFId6Nsi75ddA+3qfbnLfNUPswboYyx+SALhaLuXqz7zqfzX4ezMgxeS/h0gRlUJ7nf2/yJ5qie/kZaizjw==", "dev": true, "dependencies": { - "@storybook/channels": "7.0.0-rc.3", - "@storybook/client-logger": "7.0.0-rc.3", + "@storybook/channels": "7.0.2", + "@storybook/client-logger": "7.0.2", "@storybook/global": "^5.0.0", "telejson": "^7.0.3" }, @@ -3598,9 +3668,9 @@ } }, "node_modules/@storybook/channels": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.0.0-rc.3.tgz", - "integrity": "sha512-jaODIck+um16Fn2k1vwHK9RNk2J8hLVyzLSkoGM40TsMF5nichwI3rA6225pLk015itJbhCAi/RhaMFBI+ZtsA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.0.2.tgz", + "integrity": "sha512-qkI8mFy9c8mxN2f01etayKhCaauL6RAsxRzbX1/pKj6UqhHWqqUbtHwymrv4hG5qDYjV1e9pd7ae5eNF8Kui0g==", "dev": true, "funding": { "type": "opencollective", @@ -3608,21 +3678,21 @@ } }, "node_modules/@storybook/cli": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/cli/-/cli-7.0.0-rc.3.tgz", - "integrity": "sha512-g1nWHLI1fiDK2dnLpmbhbrm6ZaAwuZkUgEGtlEQCPTHWVRZj2fJT0y5zjgBIhFpdkB/X8MZzgVxqhTJF0uX39Q==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/cli/-/cli-7.0.2.tgz", + "integrity": "sha512-xMM2QdXNGg09wuXzAGroKrbsnaHSFPmtmefX1XGALhHuKVwxOoC2apWMpek6gY/9vh5EIRTog2Dvfd2BzNrT6Q==", "dev": true, "dependencies": { "@babel/core": "^7.20.2", "@babel/preset-env": "^7.20.2", "@ndelangen/get-tarball": "^3.0.7", - "@storybook/codemod": "7.0.0-rc.3", - "@storybook/core-common": "7.0.0-rc.3", - "@storybook/core-server": "7.0.0-rc.3", - "@storybook/csf-tools": "7.0.0-rc.3", - "@storybook/node-logger": "7.0.0-rc.3", - "@storybook/telemetry": "7.0.0-rc.3", - "@storybook/types": "7.0.0-rc.3", + "@storybook/codemod": "7.0.2", + "@storybook/core-common": "7.0.2", + "@storybook/core-server": "7.0.2", + "@storybook/csf-tools": "7.0.2", + "@storybook/node-logger": "7.0.2", + "@storybook/telemetry": "7.0.2", + "@storybook/types": "7.0.2", "@types/semver": "^7.3.4", "boxen": "^5.1.2", "chalk": "^4.1.0", @@ -3734,26 +3804,6 @@ "ms": "2.0.0" } }, - "node_modules/@storybook/cli/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@storybook/cli/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -3827,6 +3877,15 @@ "node": ">=8.16.0" } }, + "node_modules/@storybook/cli/node_modules/puppeteer-core/node_modules/ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dev": true, + "dependencies": { + "async-limiter": "~1.0.0" + } + }, "node_modules/@storybook/cli/node_modules/rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -3839,6 +3898,26 @@ "rimraf": "bin.js" } }, + "node_modules/@storybook/cli/node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@storybook/cli/node_modules/semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", @@ -3866,15 +3945,6 @@ "node": ">=8" } }, - "node_modules/@storybook/cli/node_modules/ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", - "dev": true, - "dependencies": { - "async-limiter": "~1.0.0" - } - }, "node_modules/@storybook/cli/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -3882,9 +3952,9 @@ "dev": true }, "node_modules/@storybook/client-logger": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.0.0-rc.3.tgz", - "integrity": "sha512-cC7lq+S4n5fFooDCyefgTAOfipadiZskNuzsQF7drE9nQLZ8GflLdmTKK//5NQUHKPzF7r+4Q5DAK4I3nqIkxA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.0.2.tgz", + "integrity": "sha512-rv7W2BhzIQHbFpUM5/CP/acS6T5lTmaxT0MbZ9n+9h++9QQU/cFOdkZgSUbLVAb1AeUGoLsk0HYzcqPpV35Xsw==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0" @@ -3895,18 +3965,18 @@ } }, "node_modules/@storybook/codemod": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-7.0.0-rc.3.tgz", - "integrity": "sha512-P965X5g4WIBfrYMLYPQIvwp9wfIf5bnUIVgwjeGUDLDLIst6RXmHGik9MHLy2Ic/MXTsf/kwK5qY9pj95t8DZg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-7.0.2.tgz", + "integrity": "sha512-D9PdByxJlFiaDJcLkM+RN1DHCj4VfQIlSZkADOcNtI4o9H064oiMloWDGZiR1i1FCYMSXuWmW6tMsuCVebA+Nw==", "dev": true, "dependencies": { "@babel/core": "~7.21.0", - "@babel/preset-env": "~7.20.2", + "@babel/preset-env": "~7.21.0", "@babel/types": "~7.21.2", - "@storybook/csf": "next", - "@storybook/csf-tools": "7.0.0-rc.3", - "@storybook/node-logger": "7.0.0-rc.3", - "@storybook/types": "7.0.0-rc.3", + "@storybook/csf": "^0.1.0", + "@storybook/csf-tools": "7.0.2", + "@storybook/node-logger": "7.0.2", + "@storybook/types": "7.0.2", "cross-spawn": "^7.0.3", "globby": "^11.0.2", "jscodeshift": "^0.14.0", @@ -3920,16 +3990,16 @@ } }, "node_modules/@storybook/components": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/components/-/components-7.0.0-rc.3.tgz", - "integrity": "sha512-PeQFr2hZvLnxLswKihw1Ro5wCqmNZeSE4q+tFdifhLVIqP/OwHG+ShiLCHQ1aEa0Z3Ub+80m7uPzg69+y9m+bQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-7.0.2.tgz", + "integrity": "sha512-Ee9pY6WlpricPUdYiyR0Ov8zgHkUt541yl1CZ6Ytaom2TA12cAnRjKewbLAgVPPhIE1LsMRhOPFYql0JMtnN4Q==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.0.0-rc.3", - "@storybook/csf": "next", + "@storybook/client-logger": "7.0.2", + "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/theming": "7.0.0-rc.3", - "@storybook/types": "7.0.0-rc.3", + "@storybook/theming": "7.0.2", + "@storybook/types": "7.0.2", "memoizerific": "^1.11.3", "use-resize-observer": "^9.1.0", "util-deprecate": "^1.0.2" @@ -3944,13 +4014,13 @@ } }, "node_modules/@storybook/core-client": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-7.0.0-rc.3.tgz", - "integrity": "sha512-epUiHzFQNoEr5PYq9069SliQzHl5fVQj94aWdGZWCQPGldxiFtCNB7o32NzwwIVzXOKPzU38qg2B4738jt/1XQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-7.0.2.tgz", + "integrity": "sha512-tr6Uv41YD2O0xiUrtgujiY1QxuznhbyUI0BRsSh49e8cx3QoW7FgPy7IVZHgb17DXKZ/wY/hgdyTTB87H6IbLA==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.0.0-rc.3", - "@storybook/preview-api": "7.0.0-rc.3" + "@storybook/client-logger": "7.0.2", + "@storybook/preview-api": "7.0.2" }, "funding": { "type": "opencollective", @@ -3958,18 +4028,18 @@ } }, "node_modules/@storybook/core-common": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.0.0-rc.3.tgz", - "integrity": "sha512-uUIs14+35ubRcpYwuX0OHW05tSDC5jeNEY8gv2EjcexBLeNozfGV4Tf5/ncG8glVbp8jGUlu2S3XJZoHKHDSqQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.0.2.tgz", + "integrity": "sha512-DayFPTCj695tnEKLuDlogclBim8mzdrbj9U1xzFm23BUReheGSGdLl2zrb3mP1l9Zj4xJ/Ctst1KN9SFbW84vw==", "dev": true, "dependencies": { - "@storybook/node-logger": "7.0.0-rc.3", - "@storybook/types": "7.0.0-rc.3", + "@storybook/node-logger": "7.0.2", + "@storybook/types": "7.0.2", "@types/node": "^16.0.0", "@types/pretty-hrtime": "^1.0.0", "chalk": "^4.1.0", - "esbuild": "^0.16.4", - "esbuild-register": "^3.3.3", + "esbuild": "^0.17.0", + "esbuild-register": "^3.4.0", "file-system-cache": "^2.0.0", "find-up": "^5.0.0", "fs-extra": "^11.1.0", @@ -3981,7 +4051,6 @@ "pkg-dir": "^5.0.0", "pretty-hrtime": "^1.0.3", "resolve-from": "^5.0.0", - "slash": "^3.0.0", "ts-dedent": "^2.0.0" }, "funding": { @@ -3990,9 +4059,9 @@ } }, "node_modules/@storybook/core-common/node_modules/@types/node": { - "version": "16.18.16", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.16.tgz", - "integrity": "sha512-ZOzvDRWp8dCVBmgnkIqYCArgdFOO9YzocZp8Ra25N/RStKiWvMOXHMz+GjSeVNe5TstaTmTWPucGJkDw0XXJWA==", + "version": "16.18.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.23.tgz", + "integrity": "sha512-XAMpaw1s1+6zM+jn2tmw8MyaRDIJfXxqmIQIS0HfoGYPuf7dUWeiUKopwq13KFX9lEp1+THGtlaaYx39Nxr58g==", "dev": true }, "node_modules/@storybook/core-common/node_modules/ansi-styles": { @@ -4048,9 +4117,9 @@ } }, "node_modules/@storybook/core-events": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.0.0-rc.3.tgz", - "integrity": "sha512-EBihNmxxiIJbPt6OhCTXFPl2T/9OXNVKtsy8hchBNEzp+UJGyeHx+t9K6tRvbcmt5TG/y7C7ZsYx9U28JTwNkg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.0.2.tgz", + "integrity": "sha512-1DCHCwHRL3+rlvnVVc/BCfReP31XaT2WYgcLeGTmkX1E43Po1MkgcM7PnJPSaa9POvSqZ+6YLZv5Bs1SXbufow==", "dev": true, "funding": { "type": "opencollective", @@ -4058,25 +4127,25 @@ } }, "node_modules/@storybook/core-server": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-7.0.0-rc.3.tgz", - "integrity": "sha512-211514C7w8hvu/bLP97KdF7TM8FpcchgDAhldODDvKFyxFTHMcQFj3ABlptsWFO6JxZsy32hG8qi6phFUtceQA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-7.0.2.tgz", + "integrity": "sha512-7ipGws8YffVaiwkc+D0+MfZc/Sy52aKenG3nDJdK4Ajmp5LPAlelb/sxIhfRvoHDbDsy2FQNz++Mb55Yh03KkA==", "dev": true, "dependencies": { "@aw-web-design/x-default-browser": "1.4.88", "@discoveryjs/json-ext": "^0.5.3", - "@storybook/builder-manager": "7.0.0-rc.3", - "@storybook/core-common": "7.0.0-rc.3", - "@storybook/core-events": "7.0.0-rc.3", - "@storybook/csf": "next", - "@storybook/csf-tools": "7.0.0-rc.3", - "@storybook/docs-mdx": "next", + "@storybook/builder-manager": "7.0.2", + "@storybook/core-common": "7.0.2", + "@storybook/core-events": "7.0.2", + "@storybook/csf": "^0.1.0", + "@storybook/csf-tools": "7.0.2", + "@storybook/docs-mdx": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/manager": "7.0.0-rc.3", - "@storybook/node-logger": "7.0.0-rc.3", - "@storybook/preview-api": "7.0.0-rc.3", - "@storybook/telemetry": "7.0.0-rc.3", - "@storybook/types": "7.0.0-rc.3", + "@storybook/manager": "7.0.2", + "@storybook/node-logger": "7.0.2", + "@storybook/preview-api": "7.0.2", + "@storybook/telemetry": "7.0.2", + "@storybook/types": "7.0.2", "@types/detect-port": "^1.3.0", "@types/node": "^16.0.0", "@types/node-fetch": "^2.5.7", @@ -4100,7 +4169,6 @@ "read-pkg-up": "^7.0.1", "semver": "^7.3.7", "serve-favicon": "^2.5.0", - "slash": "^3.0.0", "telejson": "^7.0.3", "ts-dedent": "^2.0.0", "util-deprecate": "^1.0.2", @@ -4113,9 +4181,9 @@ } }, "node_modules/@storybook/core-server/node_modules/@types/node": { - "version": "16.18.16", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.16.tgz", - "integrity": "sha512-ZOzvDRWp8dCVBmgnkIqYCArgdFOO9YzocZp8Ra25N/RStKiWvMOXHMz+GjSeVNe5TstaTmTWPucGJkDw0XXJWA==", + "version": "16.18.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.23.tgz", + "integrity": "sha512-XAMpaw1s1+6zM+jn2tmw8MyaRDIJfXxqmIQIS0HfoGYPuf7dUWeiUKopwq13KFX9lEp1+THGtlaaYx39Nxr58g==", "dev": true }, "node_modules/@storybook/core-server/node_modules/ansi-styles": { @@ -4204,21 +4272,21 @@ "dev": true }, "node_modules/@storybook/csf": { - "version": "0.0.2-next.10", - "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.0.2-next.10.tgz", - "integrity": "sha512-m2PFgBP/xRIF85VrDhvesn9ktaD2pN3VUjvMqkAL/cINp/3qXsCyI81uw7N5VEOkQAbWrY2FcydnvEPDEdE8fA==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.0.tgz", + "integrity": "sha512-uk+jMXCZ8t38jSTHk2o5btI+aV2Ksbvl6DoOv3r6VaCM1KZqeuMwtwywIQdflkA8/6q/dKT8z8L+g8hC4GC3VQ==", "dev": true, "dependencies": { "type-fest": "^2.19.0" } }, "node_modules/@storybook/csf-plugin": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-7.0.0-rc.3.tgz", - "integrity": "sha512-+r2m09o/5B846Q8ykDWjwPJSZXc3i4Z6vLc04SxIR/VJffF7K0Z/vFmTcPz8Qg5wFdfvy/HFqTLpaOJtVwWBdA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-7.0.2.tgz", + "integrity": "sha512-aGuo+G6G5IwSGkmc+OUA796sOfvJMaQj8QS/Zh5F0nL4ZlQvghHpXON8cRHHvmXHQqUo07KLiy7CZh2I2oq4iQ==", "dev": true, "dependencies": { - "@storybook/csf-tools": "7.0.0-rc.3", + "@storybook/csf-tools": "7.0.2", "unplugin": "^0.10.2" }, "funding": { @@ -4227,17 +4295,17 @@ } }, "node_modules/@storybook/csf-tools": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.0.0-rc.3.tgz", - "integrity": "sha512-I3QG2buAswIYVbYlstmZAamwLopW6daHj2+wrod+whTmeKShp0rbOrVkU0M3Hpj9CVzFM1/4YqCNOBkS2XTnsw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.0.2.tgz", + "integrity": "sha512-sOp355yQSpYiMqNSopmFYWZkPPRJdGgy4tpxGGLxpOZMygK3j1wQ/WQtl2Z0h61KP0S0dl6hrs0pHQz3A/eVrw==", "dev": true, "dependencies": { "@babel/generator": "~7.21.1", "@babel/parser": "~7.21.2", "@babel/traverse": "~7.21.2", "@babel/types": "~7.21.2", - "@storybook/csf": "next", - "@storybook/types": "7.0.0-rc.3", + "@storybook/csf": "^0.1.0", + "@storybook/types": "7.0.2", "fs-extra": "^11.1.0", "recast": "^0.23.1", "ts-dedent": "^2.0.0" @@ -4248,21 +4316,21 @@ } }, "node_modules/@storybook/docs-mdx": { - "version": "0.0.1-next.6", - "resolved": "https://registry.npmjs.org/@storybook/docs-mdx/-/docs-mdx-0.0.1-next.6.tgz", - "integrity": "sha512-DjoSIXADmLJtdroXAjUotFiZlcZ2usWhqrS7aeOtZs0DVR0Ws5WQjnwtpDUXt8gryTSd+OZJ0cNsDcqg4JDEvQ==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@storybook/docs-mdx/-/docs-mdx-0.1.0.tgz", + "integrity": "sha512-JDaBR9lwVY4eSH5W8EGHrhODjygPd6QImRbwjAuJNEnY0Vw4ie3bPkeGfnacB3OBW6u/agqPv2aRlR46JcAQLg==", "dev": true }, "node_modules/@storybook/docs-tools": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-7.0.0-rc.3.tgz", - "integrity": "sha512-1uGIMq0+t8AUJyj0jkta7Imr3vFLkX8oRXhX5zi7znjWMhgeXKskEFujvCcz7eI1NIU9x2WvFwbtSzWDpdC/0g==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-7.0.2.tgz", + "integrity": "sha512-w4D5BURrYjLbLGG9VKAaKU2dSdukszxRE3HWkJyhQU9R1JHvS3n8ntcMqYPqRfoHCOeBLBxP0edDYcAfzGNDYQ==", "dev": true, "dependencies": { "@babel/core": "^7.12.10", - "@storybook/core-common": "7.0.0-rc.3", - "@storybook/preview-api": "7.0.0-rc.3", - "@storybook/types": "7.0.0-rc.3", + "@storybook/core-common": "7.0.2", + "@storybook/preview-api": "7.0.2", + "@storybook/types": "7.0.2", "@types/doctrine": "^0.0.3", "doctrine": "^3.0.0", "lodash": "^4.17.21" @@ -4279,9 +4347,9 @@ "dev": true }, "node_modules/@storybook/manager": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/manager/-/manager-7.0.0-rc.3.tgz", - "integrity": "sha512-8Q/vpHkvWQ/fZHRPFOgGC4Qhgpmafe9GV2QKk3yRA/p9zcW4UzP9fbL4qw6tq+5GLM/kFKArBu28ZA7L7sKB9A==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/manager/-/manager-7.0.2.tgz", + "integrity": "sha512-jsFsFKG0rPNYfuRm/WSXGMBy8vnALyFWU330ObDmfU0JID3SeLlVqAOZT1GlwI6vupYpWodsN6qPZKRmC8onRw==", "dev": true, "funding": { "type": "opencollective", @@ -4289,19 +4357,19 @@ } }, "node_modules/@storybook/manager-api": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.0.0-rc.3.tgz", - "integrity": "sha512-Pa+LabGYakPd9RuS8G7tCp3hPjZwGZL95Dj+yef0bM9WmYBimNjaUsqVJOGttuE4TLXjUIU9+58YImN7QrGfbQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.0.2.tgz", + "integrity": "sha512-PbLj9Rc5uCMPfMdaXv1wE3koA3+d0rmZ3BJI8jeq+mfZEvpvfI4OOpRioT1q04CkkVomFOVFTyO0Q/o6Rb5N7g==", "dev": true, "dependencies": { - "@storybook/channels": "7.0.0-rc.3", - "@storybook/client-logger": "7.0.0-rc.3", - "@storybook/core-events": "7.0.0-rc.3", - "@storybook/csf": "next", + "@storybook/channels": "7.0.2", + "@storybook/client-logger": "7.0.2", + "@storybook/core-events": "7.0.2", + "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/router": "7.0.0-rc.3", - "@storybook/theming": "7.0.0-rc.3", - "@storybook/types": "7.0.0-rc.3", + "@storybook/router": "7.0.2", + "@storybook/theming": "7.0.2", + "@storybook/types": "7.0.2", "dequal": "^2.0.2", "lodash": "^4.17.21", "memoizerific": "^1.11.3", @@ -4353,15 +4421,15 @@ "dev": true }, "node_modules/@storybook/mdx2-csf": { - "version": "1.0.0-next.5", - "resolved": "https://registry.npmjs.org/@storybook/mdx2-csf/-/mdx2-csf-1.0.0-next.5.tgz", - "integrity": "sha512-02w0sgGZaK1agT050yCVhJ+o4rLHANWvLKWjQjeAsYbjneLC5ITt+3GDB4jRiWwJboZ8dHW1fGSK1Vg5fA34aQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@storybook/mdx2-csf/-/mdx2-csf-1.0.0.tgz", + "integrity": "sha512-dBAnEL4HfxxJmv7LdEYUoZlQbWj9APZNIbOaq0tgF8XkxiIbzqvgB0jhL/9UOrysSDbQWBiCRTu2wOVxedGfmw==", "dev": true }, "node_modules/@storybook/node-logger": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.0.0-rc.3.tgz", - "integrity": "sha512-ViWIJUdFUTrFtcoO88T3h55ryjl73aMNyn8vPvIgejJoJfYMTB5ErI4zLquN23HNc+H9AKKm/qMFFSf9xjGORQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.0.2.tgz", + "integrity": "sha512-UENpXxB1yDqP7JXaODJo+pbGt5y3NFBNurBr4+pI4bMAC4ARjpgRE4wp6fxUKFPu9MAR10oCdcLEHkaVUAjYRg==", "dev": true, "dependencies": { "@types/npmlog": "^4.1.2", @@ -4427,9 +4495,9 @@ } }, "node_modules/@storybook/postinstall": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-7.0.0-rc.3.tgz", - "integrity": "sha512-kOCJjixFwdnZxR6K45XR+6Q4UBzOLdabzh3aednQ/piiqj7ZdldaF75ZfoDhKPK4cjrd5AGU6/OWbsJQ+DLVMg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-7.0.2.tgz", + "integrity": "sha512-Hhiu3+N3ZDcbrhOCBJTDJbn/mC4l0v3ziyAP3yalq/2ZR9R5kfsEHHakKmswsKKV+ey0gNGijFTy3soU5oSs+A==", "dev": true, "funding": { "type": "opencollective", @@ -4437,9 +4505,9 @@ } }, "node_modules/@storybook/preview": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-7.0.0-rc.3.tgz", - "integrity": "sha512-7FeJjOV2pNVesdNljzy1DvzhhShZ/pjQOmhFs4GXBXTJCPNQP5iZTSR6b3ehN8L96yVPT5JsdjX4MiyGw2QPnQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-7.0.2.tgz", + "integrity": "sha512-U7MZkDT9bBq7HggLAXmTO9gI4eqhYs26fZS0L6iTE/PCX4Wg2TJBJSq2X8jhDXRqJFOt8SrQ756+V5Vtwrh4Og==", "dev": true, "funding": { "type": "opencollective", @@ -4447,24 +4515,23 @@ } }, "node_modules/@storybook/preview-api": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.0.0-rc.3.tgz", - "integrity": "sha512-iIifbFRmrFIlLzApTZyCWmI3JNt2IxfM8Dm4rNlMJBifjtgHfpxA+DsQI8mW8UGM64a8N1wF7azkN6cnRz6v2w==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.0.2.tgz", + "integrity": "sha512-QAlJM/r92+dQe/kB7MTTR9b/1mt9UJjxNjazGdEWipA/nw23kOF3o/hBcvKwBYkit4zGYsX70H+vuzW8hCo/lA==", "dev": true, "dependencies": { - "@storybook/channel-postmessage": "7.0.0-rc.3", - "@storybook/channels": "7.0.0-rc.3", - "@storybook/client-logger": "7.0.0-rc.3", - "@storybook/core-events": "7.0.0-rc.3", - "@storybook/csf": "next", + "@storybook/channel-postmessage": "7.0.2", + "@storybook/channels": "7.0.2", + "@storybook/client-logger": "7.0.2", + "@storybook/core-events": "7.0.2", + "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/types": "7.0.0-rc.3", + "@storybook/types": "7.0.2", "@types/qs": "^6.9.5", "dequal": "^2.0.2", "lodash": "^4.17.21", "memoizerific": "^1.11.3", "qs": "^6.10.0", - "slash": "^3.0.0", "synchronous-promise": "^2.0.15", "ts-dedent": "^2.0.0", "util-deprecate": "^1.0.2" @@ -4475,9 +4542,9 @@ } }, "node_modules/@storybook/react-dom-shim": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-7.0.0-rc.3.tgz", - "integrity": "sha512-3rQsOPwNlHyV93311GaGP28BFobEaNfw+djxDBxocNrL07xvY3u/XE6bShKOJ6R28ATaGwXUxmj2Cwtd2GxASg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-7.0.2.tgz", + "integrity": "sha512-fMl0aV7mJ3wyQKvt6z+rZuiIiSd9YinS77IJ1ETHqVZ4SxWriOS0GFKP6sZflrlpShoZBh+zl1lDPG7ZZdrQGw==", "dev": true, "funding": { "type": "opencollective", @@ -4489,12 +4556,12 @@ } }, "node_modules/@storybook/router": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.0.0-rc.3.tgz", - "integrity": "sha512-D3Uoz1WRFWH3QUjyrDObwCVRYXdSGZGpCN2eh6gjlKC9VQ9ohaGerEdXSsYnAj2lovhfze8oXp+PS1VKJTlpgg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.0.2.tgz", + "integrity": "sha512-ZB2vucfayZUrMLBlXju4v6CNOQQb0YKDLw5RoojdBxOsUFtnp5UiPOE+I8PQR63EBwnRjozeibV1XSM+GlQb5w==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.0.0-rc.3", + "@storybook/client-logger": "7.0.2", "memoizerific": "^1.11.3", "qs": "^6.10.0" }, @@ -4507,82 +4574,14 @@ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/@storybook/semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@storybook/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg==", - "dev": true, - "dependencies": { - "core-js": "^3.6.5", - "find-up": "^4.1.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@storybook/semver/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/semver/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/semver/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@storybook/semver/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@storybook/telemetry": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-7.0.0-rc.3.tgz", - "integrity": "sha512-0vPVA1aTWCA6jr3iSOPCu8x3zpNUsyxYN30B4b6d3o2iO6YU/CZdm8rxzInv+bKkz2fHFDzCDsfZTgQ5VEggEw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-7.0.2.tgz", + "integrity": "sha512-s2PIwI9nVYQBf3h40EFHLynYUfdqzRJMXyaCWJdVQuvdQfRkAn3CLXaubK+VdjC869z3ZfW20EMu3Mbgzcc0HA==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.0.0-rc.3", - "@storybook/core-common": "7.0.0-rc.3", + "@storybook/client-logger": "7.0.2", + "@storybook/core-common": "7.0.2", "chalk": "^4.1.0", "detect-package-manager": "^2.0.1", "fetch-retry": "^5.0.2", @@ -4649,13 +4648,13 @@ } }, "node_modules/@storybook/theming": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.0.0-rc.3.tgz", - "integrity": "sha512-sVt8Egv9CmeDnTJYPsyvlvHE+GX8hAczc1SvuoLeXs/1gsEsnVn6ovCFGSV0Rc7sAr5oSv794/pFUsboU8tYqg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.0.2.tgz", + "integrity": "sha512-c9sE+QAZNbopPvLiJ6BMxBERfTaq1ATyIri97FBvTucuSotNXw7X5q+ip5/nrCOPZuvK2f5wF4DRyD2HnB/rIQ==", "dev": true, "dependencies": { "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@storybook/client-logger": "7.0.0-rc.3", + "@storybook/client-logger": "7.0.2", "@storybook/global": "^5.0.0", "memoizerific": "^1.11.3" }, @@ -4669,12 +4668,12 @@ } }, "node_modules/@storybook/types": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.0.0-rc.3.tgz", - "integrity": "sha512-2xxgs4zL1QZUdut+Zt5sQdgNCUP0n/y5CRbvEpDwkcuE4KWbfJYixJNumioZ6UwK17ZE9gf4ZxVgttvexmW8eg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.0.2.tgz", + "integrity": "sha512-0OCt/kAexa8MCcljxA+yZxGMn0n2U2Ync0KxotItqNbKBKVkaLQUls0+IXTWSCpC/QJvNZ049jxUHHanNi/96w==", "dev": true, "dependencies": { - "@storybook/channels": "7.0.0-rc.3", + "@storybook/channels": "7.0.2", "@types/babel__core": "^7.0.0", "@types/express": "^4.7.0", "file-system-cache": "^2.0.0" @@ -4685,18 +4684,18 @@ } }, "node_modules/@storybook/web-components": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/web-components/-/web-components-7.0.0-rc.3.tgz", - "integrity": "sha512-enG/VoXu7i5r39Ao4qg6a4Q/aPX5LYkkFaj955BLkUJXW1ZANwjRqo6JSquC4tW8Dm1FYN8sJBAzO6M8YRlbnA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/web-components/-/web-components-7.0.2.tgz", + "integrity": "sha512-qJc5EsNZci0yBOCH9YKuUoSEHvvfetFUsUWpLQa2pzHa648z0Qb8Z1OS/hYCq7PyJN/knb+00Pd8z3zNSw9SgA==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.0.0-rc.3", - "@storybook/core-client": "7.0.0-rc.3", - "@storybook/docs-tools": "7.0.0-rc.3", + "@storybook/client-logger": "7.0.2", + "@storybook/core-client": "7.0.2", + "@storybook/docs-tools": "7.0.2", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.0-rc.3", - "@storybook/preview-api": "7.0.0-rc.3", - "@storybook/types": "7.0.0-rc.3", + "@storybook/manager-api": "7.0.2", + "@storybook/preview-api": "7.0.2", + "@storybook/types": "7.0.2", "ts-dedent": "^2.0.0" }, "engines": { @@ -4711,15 +4710,15 @@ } }, "node_modules/@storybook/web-components-vite": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/web-components-vite/-/web-components-vite-7.0.0-rc.3.tgz", - "integrity": "sha512-A/+tm879pmD9UwWDJdYimwuIaSQPYyf2FSwL/+zIJ6ZS63LFimkIkt/C7hWD6pYNzk1w36VESfRhEeP3Hu4VNA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/web-components-vite/-/web-components-vite-7.0.2.tgz", + "integrity": "sha512-9c6wt+4yvOGN3d2FV3dBbtAeswjuIOS5InCQiMHLZEywjghg3SMre5yatKnO88eEk4XBJkamc6rHzSbETrc3sg==", "dev": true, "dependencies": { - "@storybook/builder-vite": "7.0.0-rc.3", - "@storybook/core-server": "7.0.0-rc.3", - "@storybook/node-logger": "7.0.0-rc.3", - "@storybook/web-components": "7.0.0-rc.3", + "@storybook/builder-vite": "7.0.2", + "@storybook/core-server": "7.0.2", + "@storybook/node-logger": "7.0.2", + "@storybook/web-components": "7.0.2", "magic-string": "^0.27.0" }, "engines": { @@ -4985,12 +4984,6 @@ "rxjs": "^7.2.0" } }, - "node_modules/@types/is-function": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/is-function/-/is-function-1.0.1.tgz", - "integrity": "sha512-A79HEEiwXTFtfY+Bcbo58M2GRYzCr9itHWzbzHVFNEYCcoU/MMGwYYf721gBrnhpj1s6RGVVha/IgNFnR0Iw/Q==", - "dev": true - }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", @@ -5282,12 +5275,6 @@ "integrity": "sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA==", "dev": true }, - "node_modules/@types/webpack-env": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.18.0.tgz", - "integrity": "sha512-56/MAlX5WMsPVbOg7tAxnYvNYMMWr/QJiIp6BxVSW3JJXUVzzOn64qW8TzQyMSqSUFM2+PVI4aUHcHOzIz/1tg==", - "dev": true - }, "node_modules/@types/ws": { "version": "7.4.7", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", @@ -5298,9 +5285,9 @@ } }, "node_modules/@types/yargs": { - "version": "17.0.22", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.22.tgz", - "integrity": "sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g==", + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", "dev": true, "dependencies": { "@types/yargs-parser": "*" @@ -5390,14 +5377,14 @@ "dev": true }, "node_modules/@typescript-eslint/parser": { - "version": "5.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.54.0.tgz", - "integrity": "sha512-aAVL3Mu2qTi+h/r04WI/5PfNWvO6pdhpeMRWk9R7rEV4mwJNzoWf5CCU5vDKBsPIFQFjEq1xg7XBI2rjiMXQbQ==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.57.0.tgz", + "integrity": "sha512-orrduvpWYkgLCyAdNtR1QIWovcNZlEm6yL8nwH/eTxWLd8gsP+25pdLHYzL2QdkqrieaDwLpytHqycncv0woUQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.54.0", - "@typescript-eslint/types": "5.54.0", - "@typescript-eslint/typescript-estree": "5.54.0", + "@typescript-eslint/scope-manager": "5.57.0", + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/typescript-estree": "5.57.0", "debug": "^4.3.4" }, "engines": { @@ -5416,6 +5403,113 @@ } } }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.57.0.tgz", + "integrity": "sha512-NANBNOQvllPlizl9LatX8+MHi7bx7WGIWYjPHDmQe5Si/0YEYfxSljJpoTyTWFTgRy3X8gLYSE4xQ2U+aCozSw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/visitor-keys": "5.57.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.57.0.tgz", + "integrity": "sha512-mxsod+aZRSyLT+jiqHw1KK6xrANm19/+VFALVFP5qa/aiJnlP38qpyaTd0fEKhWvQk6YeNZ5LGwI1pDpBRBhtQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.57.0.tgz", + "integrity": "sha512-LTzQ23TV82KpO8HPnWuxM2V7ieXW8O142I7hQTxWIHDcCEIjtkat6H96PFkYBQqGFLW/G/eVVOB9Z8rcvdY/Vw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/visitor-keys": "5.57.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.0.tgz", + "integrity": "sha512-ery2g3k0hv5BLiKpPuwYt9KBkAp2ugT6VvyShXdLOkax895EC55sP0Tx5L0fZaQueiK3fBLvHVvEl3jFS5ia+g==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.57.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/@typescript-eslint/scope-manager": { "version": "5.54.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.54.0.tgz", @@ -6562,6 +6656,22 @@ "node": ">=10.0.0" } }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/linux-loong64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz", + "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@web/dev-server-esbuild/node_modules/esbuild": { "version": "0.14.54", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz", @@ -8463,17 +8573,6 @@ "node": ">= 0.8" } }, - "node_modules/core-js": { - "version": "3.29.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.29.0.tgz", - "integrity": "sha512-VG23vuEisJNkGl6XQmFJd3rEG/so/CNatqeE+7uZAwTSwFeB/qaO0be8xZYUNWprJ/GIwL8aMt9cj1kvbpTZhg==", - "dev": true, - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, "node_modules/core-js-compat": { "version": "3.29.1", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.29.1.tgz", @@ -8882,12 +8981,6 @@ "node": ">=6.0.0" } }, - "node_modules/dom-walk": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", - "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", - "dev": true - }, "node_modules/dom5": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.1.tgz", @@ -9200,9 +9293,9 @@ "dev": true }, "node_modules/esbuild": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", - "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==", + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.15.tgz", + "integrity": "sha512-LBUV2VsUIc/iD9ME75qhT4aJj0r75abCVS0jakhFzOtR7TQsqQA5w0tZ+KTKnwl3kXE0MhskNdHDh/I5aCR1Zw==", "dev": true, "hasInstallScript": true, "bin": { @@ -9212,28 +9305,60 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.16.17", - "@esbuild/android-arm64": "0.16.17", - "@esbuild/android-x64": "0.16.17", - "@esbuild/darwin-arm64": "0.16.17", - "@esbuild/darwin-x64": "0.16.17", - "@esbuild/freebsd-arm64": "0.16.17", - "@esbuild/freebsd-x64": "0.16.17", - "@esbuild/linux-arm": "0.16.17", - "@esbuild/linux-arm64": "0.16.17", - "@esbuild/linux-ia32": "0.16.17", - "@esbuild/linux-loong64": "0.16.17", - "@esbuild/linux-mips64el": "0.16.17", - "@esbuild/linux-ppc64": "0.16.17", - "@esbuild/linux-riscv64": "0.16.17", - "@esbuild/linux-s390x": "0.16.17", - "@esbuild/linux-x64": "0.16.17", - "@esbuild/netbsd-x64": "0.16.17", - "@esbuild/openbsd-x64": "0.16.17", - "@esbuild/sunos-x64": "0.16.17", - "@esbuild/win32-arm64": "0.16.17", - "@esbuild/win32-ia32": "0.16.17", - "@esbuild/win32-x64": "0.16.17" + "@esbuild/android-arm": "0.17.15", + "@esbuild/android-arm64": "0.17.15", + "@esbuild/android-x64": "0.17.15", + "@esbuild/darwin-arm64": "0.17.15", + "@esbuild/darwin-x64": "0.17.15", + "@esbuild/freebsd-arm64": "0.17.15", + "@esbuild/freebsd-x64": "0.17.15", + "@esbuild/linux-arm": "0.17.15", + "@esbuild/linux-arm64": "0.17.15", + "@esbuild/linux-ia32": "0.17.15", + "@esbuild/linux-loong64": "0.17.15", + "@esbuild/linux-mips64el": "0.17.15", + "@esbuild/linux-ppc64": "0.17.15", + "@esbuild/linux-riscv64": "0.17.15", + "@esbuild/linux-s390x": "0.17.15", + "@esbuild/linux-x64": "0.17.15", + "@esbuild/netbsd-x64": "0.17.15", + "@esbuild/openbsd-x64": "0.17.15", + "@esbuild/sunos-x64": "0.17.15", + "@esbuild/win32-arm64": "0.17.15", + "@esbuild/win32-ia32": "0.17.15", + "@esbuild/win32-x64": "0.17.15" + } + }, + "node_modules/esbuild-android-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz", + "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz", + "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" } }, "node_modules/esbuild-darwin-64": { @@ -9252,6 +9377,214 @@ "node": ">=12" } }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz", + "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz", + "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz", + "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-32": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz", + "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz", + "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz", + "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz", + "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz", + "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz", + "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz", + "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz", + "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz", + "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz", + "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/esbuild-plugin-alias": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/esbuild-plugin-alias/-/esbuild-plugin-alias-0.2.1.tgz", @@ -9270,6 +9603,70 @@ "esbuild": ">=0.12 <1" } }, + "node_modules/esbuild-sunos-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz", + "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-32": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz", + "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", + "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz", + "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -9352,9 +9749,9 @@ } }, "node_modules/eslint-config-prettier": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz", - "integrity": "sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", + "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" @@ -10440,9 +10837,9 @@ "dev": true }, "node_modules/flow-parser": { - "version": "0.201.0", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.201.0.tgz", - "integrity": "sha512-G4oeDNpNGyIrweF9EnoHatncAihMT0tQgV6NMdyM5I7fhrz9Pr13PJ2KLQ673O4wj9KooTdBpeeYHdDNAQoyyw==", + "version": "0.203.1", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.203.1.tgz", + "integrity": "sha512-Nw2M8MPP/Zb+yhvmPDEjzkCXLtgyWGKXZjAYOVftm+wIf3xd4FKa7nRI9v67rODs0WzxMbPc8IPs/7o/dyxo/Q==", "dev": true, "engines": { "node": ">=0.4.0" @@ -10833,16 +11230,6 @@ "node": ">=10" } }, - "node_modules/global": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", - "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", - "dev": true, - "dependencies": { - "min-document": "^2.19.0", - "process": "^0.11.10" - } - }, "node_modules/global-modules": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", @@ -11661,12 +12048,6 @@ "node": ">=8" } }, - "node_modules/is-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", - "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==", - "dev": true - }, "node_modules/is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -12900,28 +13281,29 @@ "dev": true }, "node_modules/lit": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/lit/-/lit-2.6.1.tgz", - "integrity": "sha512-DT87LD64f8acR7uVp7kZfhLRrHkfC/N4BVzAtnw9Yg8087mbBJ//qedwdwX0kzDbxgPccWRW6mFwGbRQIxy0pw==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/lit/-/lit-2.7.0.tgz", + "integrity": "sha512-qSy2BAVA+OiWtNptP404egcC/izDdNRw6iHGIbUmkZtbMJvPKfNsaoKrNs8Zmsbjmv5ZX2tur1l9TfzkSWWT4g==", "dependencies": { "@lit/reactive-element": "^1.6.0", - "lit-element": "^3.2.0", - "lit-html": "^2.6.0" + "lit-element": "^3.3.0", + "lit-html": "^2.7.0" } }, "node_modules/lit-element": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.2.2.tgz", - "integrity": "sha512-6ZgxBR9KNroqKb6+htkyBwD90XGRiqKDHVrW/Eh0EZ+l+iC+u+v+w3/BA5NGi4nizAVHGYvQBHUDuSmLjPp7NQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.3.0.tgz", + "integrity": "sha512-M3OIoblNS7LZdRxOIk8g0wyLEA/lRw/UGJ1TX+767OpkuDsRdSoxBIvewpWqCo7sMd9xt1XedUNZIr9jUO1X3g==", "dependencies": { + "@lit-labs/ssr-dom-shim": "^1.1.0", "@lit/reactive-element": "^1.3.0", - "lit-html": "^2.2.0" + "lit-html": "^2.7.0" } }, "node_modules/lit-html": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.6.1.tgz", - "integrity": "sha512-Z3iw+E+3KKFn9t2YKNjsXNEu/LRLI98mtH/C6lnFg7kvaqPIzPn124Yd4eT/43lyqrejpc5Wb6BHq3fdv4S8Rw==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.7.0.tgz", + "integrity": "sha512-/zPOl8EfeB3HHpTzINSpnWgvgQ8N07g/j272EOAIyB0Ys2RzBqTVT23i+JZuUlNbB2WHHeSsTCFi92NtWrtpqQ==", "dependencies": { "@types/trusted-types": "^2.0.2" } @@ -13185,9 +13567,9 @@ "dev": true }, "node_modules/markdown-to-jsx": { - "version": "7.1.9", - "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.1.9.tgz", - "integrity": "sha512-x4STVIKIJR0mGgZIZ5RyAeQD7FEZd5tS8m/htbcVGlex32J+hlSLj+ExrHCxP6nRKF1EKbcO7i6WhC1GtOpBlA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.2.0.tgz", + "integrity": "sha512-3l4/Bigjm4bEqjCR6Xr+d4DtM1X6vvtGsMGSjJYyep8RjjIvcWtrXBS8Wbfe1/P+atKNMccpsraESIaWVplzVg==", "dev": true, "engines": { "node": ">= 10" @@ -13328,15 +13710,6 @@ "node": ">=6" } }, - "node_modules/min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", - "dev": true, - "dependencies": { - "dom-walk": "^0.1.0" - } - }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -13483,16 +13856,15 @@ } }, "node_modules/msw-storybook-addon": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/msw-storybook-addon/-/msw-storybook-addon-1.7.0.tgz", - "integrity": "sha512-G/cYj7Z8NuyFbMsdVJRr17flWed8J7CmKTSPNXmuK65W6uILpqNDpXJC7KVRhOg7lUFR5Hmqwcq6z8Mow/wu5A==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/msw-storybook-addon/-/msw-storybook-addon-1.8.0.tgz", + "integrity": "sha512-dw3vZwqjixmiur0vouRSOax7wPSu9Og2Hspy9JZFHf49bZRjwDiLF0Pfn2NXEkGviYJOJiGxS1ejoTiUwoSg4A==", "dev": true, "dependencies": { - "@storybook/addons": "^6.0.0", "is-node-process": "^1.0.1" }, "peerDependencies": { - "msw": ">=0.35.0 <1.0.0" + "msw": ">=0.35.0 <2.0.0" } }, "node_modules/msw/node_modules/ansi-styles": { @@ -15742,9 +16114,9 @@ "dev": true }, "node_modules/router-slot": { - "version": "1.6.1", - "resolved": "file:router-slot-1.6.1.tgz", - "integrity": "sha512-lrqzUL9wfSQR7L9rFvRsq/I+BGo2bw0Hn45eZ+qhrjPFv2gn+LRz2TaWa6CVqkiXhdWMrUEmEyD8nzl4cqV0Fw==", + "version": "2.0.0", + "resolved": "file:router-slot-2.0.0.tgz", + "integrity": "sha512-J2E+sDJR7Q/S761Q6vXVCTWFN1kKidX3fparKoipm/NaX9XEdwmCSOEqYyUHbnIyDDo5O5PMhsH8EazLmCQJXw==", "license": "MIT" }, "node_modules/run-async": { @@ -16303,12 +16675,12 @@ "dev": true }, "node_modules/storybook": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/storybook/-/storybook-7.0.0-rc.3.tgz", - "integrity": "sha512-1EFr7o7dcgFKsI6TBqvxYEKGPzKvJ8qzCl3BM/1kZP5BmWqQPbanOQLVkTb4zDb5e+Q+ibDNH5k8D1lQFdsHcg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-7.0.2.tgz", + "integrity": "sha512-/XBLhT9Vb14yNBcA9rlW15y+C6IsCA3kx5PKvK9kL10sKCi8invcY94UfCSisXe8HqsO3u6peumo2xpYucKMjw==", "dev": true, "dependencies": { - "@storybook/cli": "7.0.0-rc.3" + "@storybook/cli": "7.0.2" }, "bin": { "sb": "index.js", @@ -17005,16 +17377,16 @@ "dev": true }, "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.3.tgz", + "integrity": "sha512-xv8mOEDnigb/tN9PSMTwSEqAnUvkoXMQlicOb0IUVDBSQCgBSaAAROUZYy2IcUy5qU6XajK5jjjO7TMWqBTKZA==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=12.20" } }, "node_modules/typical": { @@ -17379,15 +17751,15 @@ } }, "node_modules/vite": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.1.4.tgz", - "integrity": "sha512-3knk/HsbSTKEin43zHu7jTwYWv81f8kgAL99G5NWBcA1LKvtvcVAC4JjBH1arBunO9kQka+1oGbrMKOjk4ZrBg==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.2.1.tgz", + "integrity": "sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==", "dev": true, "dependencies": { - "esbuild": "^0.16.14", + "esbuild": "^0.17.5", "postcss": "^8.4.21", "resolve": "^1.22.1", - "rollup": "^3.10.0" + "rollup": "^3.18.0" }, "bin": { "vite": "bin/vite.js" @@ -18054,9 +18426,9 @@ } }, "@babel/compat-data": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", - "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz", + "integrity": "sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==", "dev": true }, "@babel/core": { @@ -18127,22 +18499,22 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz", + "integrity": "sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==", "dev": true, "requires": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", + "@babel/compat-data": "^7.21.4", + "@babel/helper-validator-option": "^7.21.0", "browserslist": "^4.21.3", "lru-cache": "^5.1.1", "semver": "^6.3.0" } }, "@babel/helper-create-class-features-plugin": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz", - "integrity": "sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.4.tgz", + "integrity": "sha512-46QrX2CQlaFRF4TkwfTt6nJD7IHq8539cCL7SDpqWSDeJKY1xylKKY5F/33mJhLZ3mFvKv2gGrVS6NkyF6qs+Q==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", @@ -18156,9 +18528,9 @@ } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.0.tgz", - "integrity": "sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.4.tgz", + "integrity": "sha512-M00OuhU+0GyZ5iBBN9czjugzWrEq2vDpf/zCYHxxf93ul/Q5rv+a5h+/+0WnI1AebHNVtl5bFV0qsJoH23DbfA==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", @@ -18598,12 +18970,12 @@ } }, "@babel/plugin-syntax-flow": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz", - "integrity": "sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.21.4.tgz", + "integrity": "sha512-l9xd3N+XG4fZRxEP3vXdK6RW7vN1Uf5dxzRC/09wV86wqZ/YYQooBIGNsiRdfNR3/q2/5pPzV4B54J/9ctX5jw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-syntax-import-assertions": { @@ -18625,12 +18997,12 @@ } }, "@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", + "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-syntax-logical-assignment-operators": { @@ -18706,12 +19078,12 @@ } }, "@babel/plugin-syntax-typescript": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", - "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", + "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-arrow-functions": { @@ -18780,9 +19152,9 @@ } }, "@babel/plugin-transform-destructuring": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz", - "integrity": "sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", + "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.20.2" @@ -18938,9 +19310,9 @@ } }, "@babel/plugin-transform-parameters": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz", - "integrity": "sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz", + "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.20.2" @@ -19034,11 +19406,12 @@ } }, "@babel/plugin-transform-typescript": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.0.tgz", - "integrity": "sha512-xo///XTPp3mDzTtrqXoBlK9eiAYW3wv9JXglcn/u1bi60RW11dEUxIgA8cbnDhutS1zacjMRmAwxE0gMklLnZg==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.3.tgz", + "integrity": "sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw==", "dev": true, "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-create-class-features-plugin": "^7.21.0", "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-typescript": "^7.20.0" @@ -19064,31 +19437,31 @@ } }, "@babel/preset-env": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", - "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.4.tgz", + "integrity": "sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw==", "dev": true, "requires": { - "@babel/compat-data": "^7.20.1", - "@babel/helper-compilation-targets": "^7.20.0", + "@babel/compat-data": "^7.21.4", + "@babel/helper-compilation-targets": "^7.21.4", "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-option": "^7.18.6", + "@babel/helper-validator-option": "^7.21.0", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.20.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.20.7", + "@babel/plugin-proposal-async-generator-functions": "^7.20.7", "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.21.0", "@babel/plugin-proposal-dynamic-import": "^7.18.6", "@babel/plugin-proposal-export-namespace-from": "^7.18.9", "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", + "@babel/plugin-proposal-logical-assignment-operators": "^7.20.7", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.2", + "@babel/plugin-proposal-object-rest-spread": "^7.20.7", "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-optional-chaining": "^7.21.0", "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.21.0", "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", @@ -19105,40 +19478,40 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.20.7", + "@babel/plugin-transform-async-to-generator": "^7.20.7", "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.20.2", - "@babel/plugin-transform-classes": "^7.20.2", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.20.2", + "@babel/plugin-transform-block-scoping": "^7.21.0", + "@babel/plugin-transform-classes": "^7.21.0", + "@babel/plugin-transform-computed-properties": "^7.20.7", + "@babel/plugin-transform-destructuring": "^7.21.3", "@babel/plugin-transform-dotall-regex": "^7.18.6", "@babel/plugin-transform-duplicate-keys": "^7.18.9", "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-for-of": "^7.21.0", "@babel/plugin-transform-function-name": "^7.18.9", "@babel/plugin-transform-literals": "^7.18.9", "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.19.6", - "@babel/plugin-transform-modules-commonjs": "^7.19.6", - "@babel/plugin-transform-modules-systemjs": "^7.19.6", + "@babel/plugin-transform-modules-amd": "^7.20.11", + "@babel/plugin-transform-modules-commonjs": "^7.21.2", + "@babel/plugin-transform-modules-systemjs": "^7.20.11", "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.20.5", "@babel/plugin-transform-new-target": "^7.18.6", "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.20.1", + "@babel/plugin-transform-parameters": "^7.21.3", "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.20.5", "@babel/plugin-transform-reserved-words": "^7.18.6", "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.19.0", + "@babel/plugin-transform-spread": "^7.20.7", "@babel/plugin-transform-sticky-regex": "^7.18.6", "@babel/plugin-transform-template-literals": "^7.18.9", "@babel/plugin-transform-typeof-symbol": "^7.18.9", "@babel/plugin-transform-unicode-escapes": "^7.18.10", "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.20.2", + "@babel/types": "^7.21.4", "babel-plugin-polyfill-corejs2": "^0.3.3", "babel-plugin-polyfill-corejs3": "^0.6.0", "babel-plugin-polyfill-regenerator": "^0.4.1", @@ -19147,14 +19520,14 @@ } }, "@babel/preset-flow": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.18.6.tgz", - "integrity": "sha512-E7BDhL64W6OUqpuyHnSroLnqyRTcG6ZdOBl1OKI/QK/HJfplqK/S3sq1Cckx7oTodJ5yOXyfw7rEADJ6UjoQDQ==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.21.4.tgz", + "integrity": "sha512-F24cSq4DIBmhq4OzK3dE63NHagb27OPE3eWR+HLekt4Z3Y5MzIIUGF3LlLgV0gN8vzbDViSY7HnrReNVCJXTeA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-transform-flow-strip-types": "^7.18.6" + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-option": "^7.21.0", + "@babel/plugin-transform-flow-strip-types": "^7.21.0" } }, "@babel/preset-modules": { @@ -19171,14 +19544,16 @@ } }, "@babel/preset-typescript": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.0.tgz", - "integrity": "sha512-myc9mpoVA5m1rF8K8DgLEatOYFDpwC+RkMkjZ0Du6uI62YvDe8uxIEYVs/VCdSJ097nlALiU/yBC7//3nI+hNg==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.4.tgz", + "integrity": "sha512-sMLNWY37TCdRH/bJ6ZeeOH1nPuanED7Ai9Y/vH31IPqalioJ6ZNFUWONsakhv4r4n+I6gm5lmoE0olkgib/j/A==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-validator-option": "^7.21.0", - "@babel/plugin-transform-typescript": "^7.21.0" + "@babel/plugin-syntax-jsx": "^7.21.4", + "@babel/plugin-transform-modules-commonjs": "^7.21.2", + "@babel/plugin-transform-typescript": "^7.21.3" } }, "@babel/register": { @@ -19320,9 +19695,9 @@ } }, "@babel/types": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz", - "integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", + "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", "dev": true, "requires": { "@babel/helper-string-parser": "^7.19.4", @@ -19349,10 +19724,157 @@ "integrity": "sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==", "dev": true }, + "@esbuild/android-arm": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.15.tgz", + "integrity": "sha512-sRSOVlLawAktpMvDyJIkdLI/c/kdRTOqo8t6ImVxg8yT7LQDUYV5Rp2FKeEosLr6ZCja9UjYAzyRSxGteSJPYg==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.15.tgz", + "integrity": "sha512-0kOB6Y7Br3KDVgHeg8PRcvfLkq+AccreK///B4Z6fNZGr/tNHX0z2VywCc7PTeWp+bPvjA5WMvNXltHw5QjAIA==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.15.tgz", + "integrity": "sha512-MzDqnNajQZ63YkaUWVl9uuhcWyEyh69HGpMIrf+acR4otMkfLJ4sUCxqwbCyPGicE9dVlrysI3lMcDBjGiBBcQ==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.15.tgz", + "integrity": "sha512-7siLjBc88Z4+6qkMDxPT2juf2e8SJxmsbNVKFY2ifWCDT72v5YJz9arlvBw5oB4W/e61H1+HDB/jnu8nNg0rLA==", + "dev": true, + "optional": true + }, "@esbuild/darwin-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz", - "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==", + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.15.tgz", + "integrity": "sha512-NbImBas2rXwYI52BOKTW342Tm3LTeVlaOQ4QPZ7XuWNKiO226DisFk/RyPk3T0CKZkKMuU69yOvlapJEmax7cg==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.15.tgz", + "integrity": "sha512-Xk9xMDjBVG6CfgoqlVczHAdJnCs0/oeFOspFap5NkYAmRCT2qTn1vJWA2f419iMtsHSLm+O8B6SLV/HlY5cYKg==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.15.tgz", + "integrity": "sha512-3TWAnnEOdclvb2pnfsTWtdwthPfOz7qAfcwDLcfZyGJwm1SRZIMOeB5FODVhnM93mFSPsHB9b/PmxNNbSnd0RQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.15.tgz", + "integrity": "sha512-MLTgiXWEMAMr8nmS9Gigx43zPRmEfeBfGCwxFQEMgJ5MC53QKajaclW6XDPjwJvhbebv+RzK05TQjvH3/aM4Xw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.15.tgz", + "integrity": "sha512-T0MVnYw9KT6b83/SqyznTs/3Jg2ODWrZfNccg11XjDehIved2oQfrX/wVuev9N936BpMRaTR9I1J0tdGgUgpJA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.15.tgz", + "integrity": "sha512-wp02sHs015T23zsQtU4Cj57WiteiuASHlD7rXjKUyAGYzlOKDAjqK6bk5dMi2QEl/KVOcsjwL36kD+WW7vJt8Q==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.15.tgz", + "integrity": "sha512-k7FsUJjGGSxwnBmMh8d7IbObWu+sF/qbwc+xKZkBe/lTAF16RqxRCnNHA7QTd3oS2AfGBAnHlXL67shV5bBThQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.15.tgz", + "integrity": "sha512-ZLWk6czDdog+Q9kE/Jfbilu24vEe/iW/Sj2d8EVsmiixQ1rM2RKH2n36qfxK4e8tVcaXkvuV3mU5zTZviE+NVQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.15.tgz", + "integrity": "sha512-mY6dPkIRAiFHRsGfOYZC8Q9rmr8vOBZBme0/j15zFUKM99d4ILY4WpOC7i/LqoY+RE7KaMaSfvY8CqjJtuO4xg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.15.tgz", + "integrity": "sha512-EcyUtxffdDtWjjwIH8sKzpDRLcVtqANooMNASO59y+xmqqRYBBM7xVLQhqF7nksIbm2yHABptoioS9RAbVMWVA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.15.tgz", + "integrity": "sha512-BuS6Jx/ezxFuHxgsfvz7T4g4YlVrmCmg7UAwboeyNNg0OzNzKsIZXpr3Sb/ZREDXWgt48RO4UQRDBxJN3B9Rbg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.15.tgz", + "integrity": "sha512-JsdS0EgEViwuKsw5tiJQo9UdQdUJYuB+Mf6HxtJSPN35vez1hlrNb1KajvKWF5Sa35j17+rW1ECEO9iNrIXbNg==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.15.tgz", + "integrity": "sha512-R6fKjtUysYGym6uXf6qyNephVUQAGtf3n2RCsOST/neIwPqRWcnc3ogcielOd6pT+J0RDR1RGcy0ZY7d3uHVLA==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.15.tgz", + "integrity": "sha512-mVD4PGc26b8PI60QaPUltYKeSX0wxuy0AltC+WCTFwvKCq2+OgLP4+fFd+hZXzO2xW1HPKcytZBdjqL6FQFa7w==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.15.tgz", + "integrity": "sha512-U6tYPovOkw3459t2CBwGcFYfFRjivcJJc1WC8Q3funIwX8x4fP+R6xL/QuTPNGOblbq/EUDxj9GU+dWKX0oWlQ==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.15.tgz", + "integrity": "sha512-W+Z5F++wgKAleDABemiyXVnzXgvRFs+GVKThSI+mGgleLWluv0D7Diz4oQpgdpNzh4i2nNDzQtWbjJiqutRp6Q==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.15.tgz", + "integrity": "sha512-Muz/+uGgheShKGqSVS1KsHtCyEzcdOn/W/Xbh6H91Etm+wiIfwZaBn1W58MeGtfI8WA961YMHFYTthBdQs4t+w==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.15.tgz", + "integrity": "sha512-DjDa9ywLUUmjhV2Y9wUTIF+1XsmuFGvZoCmOWkli1XcNAh5t25cc7fgsCx4Zi/Uurep3TTLyDiKATgGEg61pkA==", "dev": true, "optional": true }, @@ -19694,9 +20216,9 @@ "dev": true }, "@lit-labs/ssr-dom-shim": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.0.0.tgz", - "integrity": "sha512-ic93MBXfApIFTrup4a70M/+ddD8xdt2zxxj9sRwHQzhS9ag/syqkD8JPdTXsc1gUy2K8TTirhlCqyTEM/sifNw==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.1.0.tgz", + "integrity": "sha512-92uQ5ARf7UXYrzaFcAX3T2rTvaS9Z1//ukV+DqjACM4c8s0ZBQd7ayJU5Dh2AFLD/Ayuyz4uMmxQec8q3U4Ong==" }, "@lit/reactive-element": { "version": "1.6.1", @@ -19939,40 +20461,40 @@ "dev": true }, "@storybook/addon-a11y": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-7.0.0-rc.3.tgz", - "integrity": "sha512-V/wl19IzsOA0OkUofKKbL09Qj93ywRHW3Pjq3pOLRE178zCumWuBKxpr+dS4C1lNwecIU1ffp8408RSzZ4K5sA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-7.0.2.tgz", + "integrity": "sha512-PCJaLdp/3MypMYQufLIaKL4gzZjDgU8fTW45O7feXwiUZzFUVZamBwBw5BHcHAPsDOr5CmebGvJ9+l2gByWL/g==", "dev": true, "requires": { - "@storybook/addon-highlight": "7.0.0-rc.3", - "@storybook/channels": "7.0.0-rc.3", - "@storybook/client-logger": "7.0.0-rc.3", - "@storybook/components": "7.0.0-rc.3", - "@storybook/core-events": "7.0.0-rc.3", + "@storybook/addon-highlight": "7.0.2", + "@storybook/channels": "7.0.2", + "@storybook/client-logger": "7.0.2", + "@storybook/components": "7.0.2", + "@storybook/core-events": "7.0.2", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.0-rc.3", - "@storybook/preview-api": "7.0.0-rc.3", - "@storybook/theming": "7.0.0-rc.3", - "@storybook/types": "7.0.0-rc.3", + "@storybook/manager-api": "7.0.2", + "@storybook/preview-api": "7.0.2", + "@storybook/theming": "7.0.2", + "@storybook/types": "7.0.2", "axe-core": "^4.2.0", "lodash": "^4.17.21", "react-resize-detector": "^7.1.2" } }, "@storybook/addon-actions": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-7.0.0-rc.3.tgz", - "integrity": "sha512-kyPuSN/PzBnW3w9D/KBEmMqfeGpBeY6Ha2VVPz3BBqcWSHfw0AbHFqvnqluubaHZl1VokE88QT6RxkdyBg33uw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-7.0.2.tgz", + "integrity": "sha512-rcj39u9MrmzsrDWYt1zsoVxrogZ1Amrv9xkEofEY/QKUr2R3xpHhTALveY9BKIlG1GoE8zLlLoP2k4nz3sNNwQ==", "dev": true, "requires": { - "@storybook/client-logger": "7.0.0-rc.3", - "@storybook/components": "7.0.0-rc.3", - "@storybook/core-events": "7.0.0-rc.3", + "@storybook/client-logger": "7.0.2", + "@storybook/components": "7.0.2", + "@storybook/core-events": "7.0.2", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.0-rc.3", - "@storybook/preview-api": "7.0.0-rc.3", - "@storybook/theming": "7.0.0-rc.3", - "@storybook/types": "7.0.0-rc.3", + "@storybook/manager-api": "7.0.2", + "@storybook/preview-api": "7.0.2", + "@storybook/theming": "7.0.2", + "@storybook/types": "7.0.2", "dequal": "^2.0.2", "lodash": "^4.17.21", "polished": "^4.2.2", @@ -19984,65 +20506,65 @@ } }, "@storybook/addon-backgrounds": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-7.0.0-rc.3.tgz", - "integrity": "sha512-6qIwuNwzLFdsLCjj5rO6TCaBvAGUYbrLpw2EQyKg5J/5GxqhMU/HsinCViok2VEn/z45vji9FI1W6bmo7t4LNQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-7.0.2.tgz", + "integrity": "sha512-yRNHQ4PPRJ+HIORQPhDGxn5xolw1xW0ByQZoNRpMD+AMEyfUNFdWbCsRQAOWjNhawxVMHM7EeA2Exrb41zhEjA==", "dev": true, "requires": { - "@storybook/client-logger": "7.0.0-rc.3", - "@storybook/components": "7.0.0-rc.3", - "@storybook/core-events": "7.0.0-rc.3", + "@storybook/client-logger": "7.0.2", + "@storybook/components": "7.0.2", + "@storybook/core-events": "7.0.2", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.0-rc.3", - "@storybook/preview-api": "7.0.0-rc.3", - "@storybook/theming": "7.0.0-rc.3", - "@storybook/types": "7.0.0-rc.3", + "@storybook/manager-api": "7.0.2", + "@storybook/preview-api": "7.0.2", + "@storybook/theming": "7.0.2", + "@storybook/types": "7.0.2", "memoizerific": "^1.11.3", "ts-dedent": "^2.0.0" } }, "@storybook/addon-controls": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-7.0.0-rc.3.tgz", - "integrity": "sha512-16E0AJ1+psFDbL6abOfLFg0zWhUQeJjcM3RKEzJjYZEBuKKL86LAvKhnlkyCUW3VlLN23V0akY6Gev81DR/BfA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-7.0.2.tgz", + "integrity": "sha512-dMpRtj5cmfC9vEMve5ncvbWCEC+WD9YuzJ+grdc48E/Hd//p+O2FE6klSkrz5FAjrc+rHINixdyssekpEL6nYQ==", "dev": true, "requires": { - "@storybook/blocks": "7.0.0-rc.3", - "@storybook/client-logger": "7.0.0-rc.3", - "@storybook/components": "7.0.0-rc.3", - "@storybook/core-common": "7.0.0-rc.3", - "@storybook/manager-api": "7.0.0-rc.3", - "@storybook/node-logger": "7.0.0-rc.3", - "@storybook/preview-api": "7.0.0-rc.3", - "@storybook/theming": "7.0.0-rc.3", - "@storybook/types": "7.0.0-rc.3", + "@storybook/blocks": "7.0.2", + "@storybook/client-logger": "7.0.2", + "@storybook/components": "7.0.2", + "@storybook/core-common": "7.0.2", + "@storybook/manager-api": "7.0.2", + "@storybook/node-logger": "7.0.2", + "@storybook/preview-api": "7.0.2", + "@storybook/theming": "7.0.2", + "@storybook/types": "7.0.2", "lodash": "^4.17.21", "ts-dedent": "^2.0.0" } }, "@storybook/addon-docs": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-7.0.0-rc.3.tgz", - "integrity": "sha512-UPy+o7IBly2TgCQ7hviaExq++KQSPS7/+/8iLUdv81mtRm3hMBMARmom+wjXfciGHp1re1bazQQYoDsOcorDhA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-7.0.2.tgz", + "integrity": "sha512-q3rDWoZEym6Lkmhqc/HBNfLDAmTY8l0WINGUZo/nF98eP5iu4B7Nk7V6BRGYGQt6Y6ZyIQ8WKH0e/eJww2zIog==", "dev": true, "requires": { "@babel/core": "^7.20.2", "@babel/plugin-transform-react-jsx": "^7.19.0", "@jest/transform": "^29.3.1", "@mdx-js/react": "^2.1.5", - "@storybook/blocks": "7.0.0-rc.3", - "@storybook/client-logger": "7.0.0-rc.3", - "@storybook/components": "7.0.0-rc.3", - "@storybook/csf-plugin": "7.0.0-rc.3", - "@storybook/csf-tools": "7.0.0-rc.3", + "@storybook/blocks": "7.0.2", + "@storybook/client-logger": "7.0.2", + "@storybook/components": "7.0.2", + "@storybook/csf-plugin": "7.0.2", + "@storybook/csf-tools": "7.0.2", "@storybook/global": "^5.0.0", - "@storybook/mdx2-csf": "next", - "@storybook/node-logger": "7.0.0-rc.3", - "@storybook/postinstall": "7.0.0-rc.3", - "@storybook/preview-api": "7.0.0-rc.3", - "@storybook/react-dom-shim": "7.0.0-rc.3", - "@storybook/theming": "7.0.0-rc.3", - "@storybook/types": "7.0.0-rc.3", + "@storybook/mdx2-csf": "^1.0.0", + "@storybook/node-logger": "7.0.2", + "@storybook/postinstall": "7.0.2", + "@storybook/preview-api": "7.0.2", + "@storybook/react-dom-shim": "7.0.2", + "@storybook/theming": "7.0.2", + "@storybook/types": "7.0.2", "fs-extra": "^11.1.0", "remark-external-links": "^8.0.0", "remark-slug": "^6.0.0", @@ -20050,332 +20572,134 @@ } }, "@storybook/addon-essentials": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-7.0.0-rc.3.tgz", - "integrity": "sha512-RLA1RgjwuDsRKp2QjBAx2XsgTZ+Dura2k8xCTyBLf0yxnleC8hiAxLwTJSSdDEUuiXxWsBbu0vhHzYnCCVTDnw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-7.0.2.tgz", + "integrity": "sha512-LAsWsXa/Pp2B4Ve2WVgc990FtsiHpFDRsq7S3V7xRrZP8DYRbtJIVdszPMDS5uKC+yzbswFEXz08lqbGvq8zgQ==", "dev": true, "requires": { - "@storybook/addon-actions": "7.0.0-rc.3", - "@storybook/addon-backgrounds": "7.0.0-rc.3", - "@storybook/addon-controls": "7.0.0-rc.3", - "@storybook/addon-docs": "7.0.0-rc.3", - "@storybook/addon-highlight": "7.0.0-rc.3", - "@storybook/addon-measure": "7.0.0-rc.3", - "@storybook/addon-outline": "7.0.0-rc.3", - "@storybook/addon-toolbars": "7.0.0-rc.3", - "@storybook/addon-viewport": "7.0.0-rc.3", - "@storybook/core-common": "7.0.0-rc.3", - "@storybook/manager-api": "7.0.0-rc.3", - "@storybook/node-logger": "7.0.0-rc.3", - "@storybook/preview-api": "7.0.0-rc.3", + "@storybook/addon-actions": "7.0.2", + "@storybook/addon-backgrounds": "7.0.2", + "@storybook/addon-controls": "7.0.2", + "@storybook/addon-docs": "7.0.2", + "@storybook/addon-highlight": "7.0.2", + "@storybook/addon-measure": "7.0.2", + "@storybook/addon-outline": "7.0.2", + "@storybook/addon-toolbars": "7.0.2", + "@storybook/addon-viewport": "7.0.2", + "@storybook/core-common": "7.0.2", + "@storybook/manager-api": "7.0.2", + "@storybook/node-logger": "7.0.2", + "@storybook/preview-api": "7.0.2", "ts-dedent": "^2.0.0" } }, "@storybook/addon-highlight": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-7.0.0-rc.3.tgz", - "integrity": "sha512-MeFIKfDpFrF33TPdl2ko2rie485AhfG2n0MFXA73L8Yzj5JPV+LVNa5eIKUUFyOMUGSkVjfFS6n63F08eqHbCw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-7.0.2.tgz", + "integrity": "sha512-9BkL1OOanguuy73S6nLK0isUb045tOkFONd/PQldOJ0PV3agCvKxKHyzlBz7Hsba8KZhY5jQs+nVW2NiREyGYg==", "dev": true, "requires": { - "@storybook/core-events": "7.0.0-rc.3", + "@storybook/core-events": "7.0.2", "@storybook/global": "^5.0.0", - "@storybook/preview-api": "7.0.0-rc.3" + "@storybook/preview-api": "7.0.2" } }, "@storybook/addon-links": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-7.0.0-rc.3.tgz", - "integrity": "sha512-K2PMxVooGAgb8hCEU2oGUMzKjPLEPACH8NcRLs/fz9PKadepmijY0hBDC50SGkZd2HWSxXxyt6d5WaXTxhP8aw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-7.0.2.tgz", + "integrity": "sha512-lPtfy2MqrcI9YjupBM2eRKGPdFKVPCz7WgO/JQQakGugORJTEGCyJrNJNtWY9jDenv8ynLZ40OxtPBZi54Sr6Q==", "dev": true, "requires": { - "@storybook/client-logger": "7.0.0-rc.3", - "@storybook/core-events": "7.0.0-rc.3", - "@storybook/csf": "next", + "@storybook/client-logger": "7.0.2", + "@storybook/core-events": "7.0.2", + "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.0-rc.3", - "@storybook/preview-api": "7.0.0-rc.3", - "@storybook/router": "7.0.0-rc.3", - "@storybook/types": "7.0.0-rc.3", + "@storybook/manager-api": "7.0.2", + "@storybook/preview-api": "7.0.2", + "@storybook/router": "7.0.2", + "@storybook/types": "7.0.2", "prop-types": "^15.7.2", "ts-dedent": "^2.0.0" } }, "@storybook/addon-measure": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-7.0.0-rc.3.tgz", - "integrity": "sha512-N0HjObHjktlgWvOQcOqyC6/vFXERHzH7aP8L1RRrSnz+mP0XDO+62eBZunlnDGu4uAECH+AV/7LO+bmTMohulg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-7.0.2.tgz", + "integrity": "sha512-cf/d5MXpHAjyUiDIVfc8pLn79CPHgnryDmNNlSiP2zEFKcivrRWiu8Rmrad8pGqLkuAh+PXLKCGn9uiqDvg7QQ==", "dev": true, "requires": { - "@storybook/client-logger": "7.0.0-rc.3", - "@storybook/components": "7.0.0-rc.3", - "@storybook/core-events": "7.0.0-rc.3", + "@storybook/client-logger": "7.0.2", + "@storybook/components": "7.0.2", + "@storybook/core-events": "7.0.2", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.0-rc.3", - "@storybook/preview-api": "7.0.0-rc.3", - "@storybook/types": "7.0.0-rc.3" + "@storybook/manager-api": "7.0.2", + "@storybook/preview-api": "7.0.2", + "@storybook/types": "7.0.2" } }, "@storybook/addon-outline": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-7.0.0-rc.3.tgz", - "integrity": "sha512-SocPRmzzu2wR3SiqMsPskfFumOd0Ph8MUTeJ2cwnaonqqHjjqxaEaFYio8AGmGaHLpY8PKtW0s75jU0oDh9Ezg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-7.0.2.tgz", + "integrity": "sha512-thVISO4NM22xlETisBvAPvz2yFD3qLGOjgzBmj8l8r9Rv0IEdwdPrwm5j0WTv8OtbhC4A8lPpvMsn5FhY5mDXg==", "dev": true, "requires": { - "@storybook/client-logger": "7.0.0-rc.3", - "@storybook/components": "7.0.0-rc.3", - "@storybook/core-events": "7.0.0-rc.3", + "@storybook/client-logger": "7.0.2", + "@storybook/components": "7.0.2", + "@storybook/core-events": "7.0.2", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.0-rc.3", - "@storybook/preview-api": "7.0.0-rc.3", - "@storybook/types": "7.0.0-rc.3", + "@storybook/manager-api": "7.0.2", + "@storybook/preview-api": "7.0.2", + "@storybook/types": "7.0.2", "ts-dedent": "^2.0.0" } }, "@storybook/addon-toolbars": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-7.0.0-rc.3.tgz", - "integrity": "sha512-qnvMWZAa3ELRNiVjj1sy0dJb2GzE5fga9SbsbVQQT2zBvou2e8XbiPRw0WHdwUU2Zj9t9/PVjz2+av7P8B+Cqg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-7.0.2.tgz", + "integrity": "sha512-tAxZ2+nUYsJdT1sx3BrmoMAZFM19+OzWJY6qSnbEq5zoRgvGZaXGR6tLMKydDoHQBU9Ta9YHGo7N7u7h1C23yg==", "dev": true, "requires": { - "@storybook/client-logger": "7.0.0-rc.3", - "@storybook/components": "7.0.0-rc.3", - "@storybook/manager-api": "7.0.0-rc.3", - "@storybook/preview-api": "7.0.0-rc.3", - "@storybook/theming": "7.0.0-rc.3" + "@storybook/client-logger": "7.0.2", + "@storybook/components": "7.0.2", + "@storybook/manager-api": "7.0.2", + "@storybook/preview-api": "7.0.2", + "@storybook/theming": "7.0.2" } }, "@storybook/addon-viewport": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-7.0.0-rc.3.tgz", - "integrity": "sha512-GXBi7f4WNeM4yvKXKYNAMLDHauTOcLpimzf1wtyVapBLpwzcJHBaJTCHQ02yIcm6mU2TFbKXMmzC1uBZcCa+5w==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-7.0.2.tgz", + "integrity": "sha512-TaHJWIIazPM/TerRbka9RqjMPNpwaRsGRdVRBtVoVosy1FzsEjAdQSO7RBMe4G03m5CacSqdsDiJCblI2AXaew==", "dev": true, "requires": { - "@storybook/client-logger": "7.0.0-rc.3", - "@storybook/components": "7.0.0-rc.3", - "@storybook/core-events": "7.0.0-rc.3", + "@storybook/client-logger": "7.0.2", + "@storybook/components": "7.0.2", + "@storybook/core-events": "7.0.2", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.0-rc.3", - "@storybook/preview-api": "7.0.0-rc.3", - "@storybook/theming": "7.0.0-rc.3", + "@storybook/manager-api": "7.0.2", + "@storybook/preview-api": "7.0.2", + "@storybook/theming": "7.0.2", "memoizerific": "^1.11.3", "prop-types": "^15.7.2" } }, - "@storybook/addons": { - "version": "6.5.16", - "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.5.16.tgz", - "integrity": "sha512-p3DqQi+8QRL5k7jXhXmJZLsE/GqHqyY6PcoA1oNTJr0try48uhTGUOYkgzmqtDaa/qPFO5LP+xCPzZXckGtquQ==", - "dev": true, - "requires": { - "@storybook/api": "6.5.16", - "@storybook/channels": "6.5.16", - "@storybook/client-logger": "6.5.16", - "@storybook/core-events": "6.5.16", - "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/router": "6.5.16", - "@storybook/theming": "6.5.16", - "@types/webpack-env": "^1.16.0", - "core-js": "^3.8.2", - "global": "^4.4.0", - "regenerator-runtime": "^0.13.7" - }, - "dependencies": { - "@storybook/channels": { - "version": "6.5.16", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.5.16.tgz", - "integrity": "sha512-VylzaWQZaMozEwZPJdyJoz+0jpDa8GRyaqu9TGG6QGv+KU5POoZaGLDkRE7TzWkyyP0KQLo80K99MssZCpgSeg==", - "dev": true, - "requires": { - "core-js": "^3.8.2", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - } - }, - "@storybook/client-logger": { - "version": "6.5.16", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.5.16.tgz", - "integrity": "sha512-pxcNaCj3ItDdicPTXTtmYJE3YC1SjxFrBmHcyrN+nffeNyiMuViJdOOZzzzucTUG0wcOOX8jaSyak+nnHg5H1Q==", - "dev": true, - "requires": { - "core-js": "^3.8.2", - "global": "^4.4.0" - } - }, - "@storybook/core-events": { - "version": "6.5.16", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.5.16.tgz", - "integrity": "sha512-qMZQwmvzpH5F2uwNUllTPg6eZXr2OaYZQRRN8VZJiuorZzDNdAFmiVWMWdkThwmyLEJuQKXxqCL8lMj/7PPM+g==", - "dev": true, - "requires": { - "core-js": "^3.8.2" - } - }, - "@storybook/csf": { - "version": "0.0.2--canary.4566f4d.1", - "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.0.2--canary.4566f4d.1.tgz", - "integrity": "sha512-9OVvMVh3t9znYZwb0Svf/YQoxX2gVOeQTGe2bses2yj+a3+OJnCrUF3/hGv6Em7KujtOdL2LL+JnG49oMVGFgQ==", - "dev": true, - "requires": { - "lodash": "^4.17.15" - } - }, - "@storybook/router": { - "version": "6.5.16", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.5.16.tgz", - "integrity": "sha512-ZgeP8a5YV/iuKbv31V8DjPxlV4AzorRiR8OuSt/KqaiYXNXlOoQDz/qMmiNcrshrfLpmkzoq7fSo4T8lWo2UwQ==", - "dev": true, - "requires": { - "@storybook/client-logger": "6.5.16", - "core-js": "^3.8.2", - "memoizerific": "^1.11.3", - "qs": "^6.10.0", - "regenerator-runtime": "^0.13.7" - } - }, - "@storybook/theming": { - "version": "6.5.16", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.5.16.tgz", - "integrity": "sha512-hNLctkjaYLRdk1+xYTkC1mg4dYz2wSv6SqbLpcKMbkPHTE0ElhddGPHQqB362md/w9emYXNkt1LSMD8Xk9JzVQ==", - "dev": true, - "requires": { - "@storybook/client-logger": "6.5.16", - "core-js": "^3.8.2", - "memoizerific": "^1.11.3", - "regenerator-runtime": "^0.13.7" - } - } - } - }, - "@storybook/api": { - "version": "6.5.16", - "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.5.16.tgz", - "integrity": "sha512-HOsuT8iomqeTMQJrRx5U8nsC7lJTwRr1DhdD0SzlqL4c80S/7uuCy4IZvOt4sYQjOzW5fOo/kamcoBXyLproTA==", - "dev": true, - "requires": { - "@storybook/channels": "6.5.16", - "@storybook/client-logger": "6.5.16", - "@storybook/core-events": "6.5.16", - "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/router": "6.5.16", - "@storybook/semver": "^7.3.2", - "@storybook/theming": "6.5.16", - "core-js": "^3.8.2", - "fast-deep-equal": "^3.1.3", - "global": "^4.4.0", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3", - "regenerator-runtime": "^0.13.7", - "store2": "^2.12.0", - "telejson": "^6.0.8", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - }, - "dependencies": { - "@storybook/channels": { - "version": "6.5.16", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.5.16.tgz", - "integrity": "sha512-VylzaWQZaMozEwZPJdyJoz+0jpDa8GRyaqu9TGG6QGv+KU5POoZaGLDkRE7TzWkyyP0KQLo80K99MssZCpgSeg==", - "dev": true, - "requires": { - "core-js": "^3.8.2", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - } - }, - "@storybook/client-logger": { - "version": "6.5.16", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.5.16.tgz", - "integrity": "sha512-pxcNaCj3ItDdicPTXTtmYJE3YC1SjxFrBmHcyrN+nffeNyiMuViJdOOZzzzucTUG0wcOOX8jaSyak+nnHg5H1Q==", - "dev": true, - "requires": { - "core-js": "^3.8.2", - "global": "^4.4.0" - } - }, - "@storybook/core-events": { - "version": "6.5.16", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.5.16.tgz", - "integrity": "sha512-qMZQwmvzpH5F2uwNUllTPg6eZXr2OaYZQRRN8VZJiuorZzDNdAFmiVWMWdkThwmyLEJuQKXxqCL8lMj/7PPM+g==", - "dev": true, - "requires": { - "core-js": "^3.8.2" - } - }, - "@storybook/csf": { - "version": "0.0.2--canary.4566f4d.1", - "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.0.2--canary.4566f4d.1.tgz", - "integrity": "sha512-9OVvMVh3t9znYZwb0Svf/YQoxX2gVOeQTGe2bses2yj+a3+OJnCrUF3/hGv6Em7KujtOdL2LL+JnG49oMVGFgQ==", - "dev": true, - "requires": { - "lodash": "^4.17.15" - } - }, - "@storybook/router": { - "version": "6.5.16", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.5.16.tgz", - "integrity": "sha512-ZgeP8a5YV/iuKbv31V8DjPxlV4AzorRiR8OuSt/KqaiYXNXlOoQDz/qMmiNcrshrfLpmkzoq7fSo4T8lWo2UwQ==", - "dev": true, - "requires": { - "@storybook/client-logger": "6.5.16", - "core-js": "^3.8.2", - "memoizerific": "^1.11.3", - "qs": "^6.10.0", - "regenerator-runtime": "^0.13.7" - } - }, - "@storybook/theming": { - "version": "6.5.16", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.5.16.tgz", - "integrity": "sha512-hNLctkjaYLRdk1+xYTkC1mg4dYz2wSv6SqbLpcKMbkPHTE0ElhddGPHQqB362md/w9emYXNkt1LSMD8Xk9JzVQ==", - "dev": true, - "requires": { - "@storybook/client-logger": "6.5.16", - "core-js": "^3.8.2", - "memoizerific": "^1.11.3", - "regenerator-runtime": "^0.13.7" - } - }, - "isobject": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", - "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==", - "dev": true - }, - "telejson": { - "version": "6.0.8", - "resolved": "https://registry.npmjs.org/telejson/-/telejson-6.0.8.tgz", - "integrity": "sha512-nerNXi+j8NK1QEfBHtZUN/aLdDcyupA//9kAboYLrtzZlPLpUfqbVGWb9zz91f/mIjRbAYhbgtnJHY8I1b5MBg==", - "dev": true, - "requires": { - "@types/is-function": "^1.0.0", - "global": "^4.4.0", - "is-function": "^1.0.2", - "is-regex": "^1.1.2", - "is-symbol": "^1.0.3", - "isobject": "^4.0.0", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3" - } - } - } - }, "@storybook/blocks": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-7.0.0-rc.3.tgz", - "integrity": "sha512-mh4LQk2f/Q9n7Sqo6t02CspHubXmSgDY4S5vF3dTgVBM/sD0OxkAY3Pv+HTsXH36lQHYYUft7U7OfhZapgS4ng==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-7.0.2.tgz", + "integrity": "sha512-JzHmU8jZLzeQ6bunzci8j/2Ji18GBTyhrPFLk5RjEbMNGWpGjvER/yR127tZOdbPguVNr4iVbRfGzd1wGHlrzA==", "dev": true, "requires": { - "@storybook/channels": "7.0.0-rc.3", - "@storybook/client-logger": "7.0.0-rc.3", - "@storybook/components": "7.0.0-rc.3", - "@storybook/core-events": "7.0.0-rc.3", - "@storybook/csf": "next", - "@storybook/docs-tools": "7.0.0-rc.3", + "@storybook/channels": "7.0.2", + "@storybook/client-logger": "7.0.2", + "@storybook/components": "7.0.2", + "@storybook/core-events": "7.0.2", + "@storybook/csf": "^0.1.0", + "@storybook/docs-tools": "7.0.2", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.0-rc.3", - "@storybook/preview-api": "7.0.0-rc.3", - "@storybook/theming": "7.0.0-rc.3", - "@storybook/types": "7.0.0-rc.3", + "@storybook/manager-api": "7.0.2", + "@storybook/preview-api": "7.0.2", + "@storybook/theming": "7.0.2", + "@storybook/types": "7.0.2", "@types/lodash": "^4.14.167", "color-convert": "^2.0.1", "dequal": "^2.0.2", @@ -20390,46 +20714,45 @@ } }, "@storybook/builder-manager": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/builder-manager/-/builder-manager-7.0.0-rc.3.tgz", - "integrity": "sha512-aScwYA9MWtqgiD39SkcwUlrR9RFbngv7jPoOaVMdXuMgNabMNz9417L9bCwSPwgO4XZ5a/nSEbGNLfOHfBemsw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/builder-manager/-/builder-manager-7.0.2.tgz", + "integrity": "sha512-Oej/n8D7eaWgmWF7nN2hXLRM53lcYOdh6umSN8Mh/LcYUfxB+dvUBFzUjoLE0xjhW6xRinrKrENT5LcP/f/HBQ==", "dev": true, "requires": { "@fal-works/esbuild-plugin-global-externals": "^2.1.2", - "@storybook/core-common": "7.0.0-rc.3", - "@storybook/manager": "7.0.0-rc.3", - "@storybook/node-logger": "7.0.0-rc.3", + "@storybook/core-common": "7.0.2", + "@storybook/manager": "7.0.2", + "@storybook/node-logger": "7.0.2", "@types/ejs": "^3.1.1", "@types/find-cache-dir": "^3.2.1", "@yarnpkg/esbuild-plugin-pnp": "^3.0.0-rc.10", "browser-assert": "^1.2.1", "ejs": "^3.1.8", - "esbuild": "^0.16.4", + "esbuild": "^0.17.0", "esbuild-plugin-alias": "^0.2.1", "express": "^4.17.3", "find-cache-dir": "^3.0.0", "fs-extra": "^11.1.0", "process": "^0.11.10", - "slash": "^3.0.0", "util": "^0.12.4" } }, "@storybook/builder-vite": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-7.0.0-rc.3.tgz", - "integrity": "sha512-v2d04PWfcITD7zI68d7XbCbOd+5vl3gIMEX5Xdsmuw3WcaqYxvDSE8GhL6zsBhrUyygV/8xhSaaxyfv8ImM0+w==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-7.0.2.tgz", + "integrity": "sha512-G6CD2Gf2zwzRslvNvqgz4FeADVEA9XA4Mw6+NM6Twc+Wy/Ah482dvHS9ApSgirtGyBKjOfdHn1xQT4Z+kzbJnw==", "dev": true, "requires": { - "@storybook/channel-postmessage": "7.0.0-rc.3", - "@storybook/channel-websocket": "7.0.0-rc.3", - "@storybook/client-logger": "7.0.0-rc.3", - "@storybook/core-common": "7.0.0-rc.3", - "@storybook/csf-plugin": "7.0.0-rc.3", - "@storybook/mdx2-csf": "next", - "@storybook/node-logger": "7.0.0-rc.3", - "@storybook/preview": "7.0.0-rc.3", - "@storybook/preview-api": "7.0.0-rc.3", - "@storybook/types": "7.0.0-rc.3", + "@storybook/channel-postmessage": "7.0.2", + "@storybook/channel-websocket": "7.0.2", + "@storybook/client-logger": "7.0.2", + "@storybook/core-common": "7.0.2", + "@storybook/csf-plugin": "7.0.2", + "@storybook/mdx2-csf": "^1.0.0", + "@storybook/node-logger": "7.0.2", + "@storybook/preview": "7.0.2", + "@storybook/preview-api": "7.0.2", + "@storybook/types": "7.0.2", "browser-assert": "^1.2.1", "es-module-lexer": "^0.9.3", "express": "^4.17.3", @@ -20437,58 +20760,59 @@ "glob": "^8.1.0", "glob-promise": "^6.0.2", "magic-string": "^0.27.0", - "rollup": "^2.25.0 || ^3.3.0", - "slash": "^3.0.0" + "remark-external-links": "^8.0.0", + "remark-slug": "^6.0.0", + "rollup": "^2.25.0 || ^3.3.0" } }, "@storybook/channel-postmessage": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-7.0.0-rc.3.tgz", - "integrity": "sha512-1uptuCjA4vAvvoxNoIJPTIpSARzJnLU7eahRhTPwELBnCH0ObqvgInge0cvbYsaTRDNV90oBbEKlxLf1Zb1BhQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-7.0.2.tgz", + "integrity": "sha512-SZ/KqnZcx10W9hJbrzBKcP9dmgaeTaXugUhcgw1IkmjKWdsKazqFZCPwQWZZKAmhO4wYbyYOhkz3wfSIeB4mFw==", "dev": true, "requires": { - "@storybook/channels": "7.0.0-rc.3", - "@storybook/client-logger": "7.0.0-rc.3", - "@storybook/core-events": "7.0.0-rc.3", + "@storybook/channels": "7.0.2", + "@storybook/client-logger": "7.0.2", + "@storybook/core-events": "7.0.2", "@storybook/global": "^5.0.0", "qs": "^6.10.0", "telejson": "^7.0.3" } }, "@storybook/channel-websocket": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/channel-websocket/-/channel-websocket-7.0.0-rc.3.tgz", - "integrity": "sha512-706jopde+OZZkqsmrRuwd9utusqiKianiF8cvjAxrxogSx8LwHk8jxrEKHxHiZUEWDS3JxJoIYSV8gxH9hcjsA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/channel-websocket/-/channel-websocket-7.0.2.tgz", + "integrity": "sha512-YU3lFId6Nsi75ddA+3qfbnLfNUPswboYyx+SALhaLuXqz7zqfzX4ezMgxeS/h0gRlUJ7nf2/yJ5qie/kZaizjw==", "dev": true, "requires": { - "@storybook/channels": "7.0.0-rc.3", - "@storybook/client-logger": "7.0.0-rc.3", + "@storybook/channels": "7.0.2", + "@storybook/client-logger": "7.0.2", "@storybook/global": "^5.0.0", "telejson": "^7.0.3" } }, "@storybook/channels": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.0.0-rc.3.tgz", - "integrity": "sha512-jaODIck+um16Fn2k1vwHK9RNk2J8hLVyzLSkoGM40TsMF5nichwI3rA6225pLk015itJbhCAi/RhaMFBI+ZtsA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.0.2.tgz", + "integrity": "sha512-qkI8mFy9c8mxN2f01etayKhCaauL6RAsxRzbX1/pKj6UqhHWqqUbtHwymrv4hG5qDYjV1e9pd7ae5eNF8Kui0g==", "dev": true }, "@storybook/cli": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/cli/-/cli-7.0.0-rc.3.tgz", - "integrity": "sha512-g1nWHLI1fiDK2dnLpmbhbrm6ZaAwuZkUgEGtlEQCPTHWVRZj2fJT0y5zjgBIhFpdkB/X8MZzgVxqhTJF0uX39Q==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/cli/-/cli-7.0.2.tgz", + "integrity": "sha512-xMM2QdXNGg09wuXzAGroKrbsnaHSFPmtmefX1XGALhHuKVwxOoC2apWMpek6gY/9vh5EIRTog2Dvfd2BzNrT6Q==", "dev": true, "requires": { "@babel/core": "^7.20.2", "@babel/preset-env": "^7.20.2", "@ndelangen/get-tarball": "^3.0.7", - "@storybook/codemod": "7.0.0-rc.3", - "@storybook/core-common": "7.0.0-rc.3", - "@storybook/core-server": "7.0.0-rc.3", - "@storybook/csf-tools": "7.0.0-rc.3", - "@storybook/node-logger": "7.0.0-rc.3", - "@storybook/telemetry": "7.0.0-rc.3", - "@storybook/types": "7.0.0-rc.3", + "@storybook/codemod": "7.0.2", + "@storybook/core-common": "7.0.2", + "@storybook/core-server": "7.0.2", + "@storybook/csf-tools": "7.0.2", + "@storybook/node-logger": "7.0.2", + "@storybook/telemetry": "7.0.2", + "@storybook/types": "7.0.2", "@types/semver": "^7.3.4", "boxen": "^5.1.2", "chalk": "^4.1.0", @@ -20573,20 +20897,6 @@ } } }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -20643,6 +20953,17 @@ "proxy-from-env": "^1.0.0", "rimraf": "^2.6.1", "ws": "^6.1.0" + }, + "dependencies": { + "ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + } } }, "rimraf": { @@ -20652,6 +20973,22 @@ "dev": true, "requires": { "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } } }, "semver": { @@ -20672,15 +21009,6 @@ "has-flag": "^4.0.0" } }, - "ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -20690,27 +21018,27 @@ } }, "@storybook/client-logger": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.0.0-rc.3.tgz", - "integrity": "sha512-cC7lq+S4n5fFooDCyefgTAOfipadiZskNuzsQF7drE9nQLZ8GflLdmTKK//5NQUHKPzF7r+4Q5DAK4I3nqIkxA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.0.2.tgz", + "integrity": "sha512-rv7W2BhzIQHbFpUM5/CP/acS6T5lTmaxT0MbZ9n+9h++9QQU/cFOdkZgSUbLVAb1AeUGoLsk0HYzcqPpV35Xsw==", "dev": true, "requires": { "@storybook/global": "^5.0.0" } }, "@storybook/codemod": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-7.0.0-rc.3.tgz", - "integrity": "sha512-P965X5g4WIBfrYMLYPQIvwp9wfIf5bnUIVgwjeGUDLDLIst6RXmHGik9MHLy2Ic/MXTsf/kwK5qY9pj95t8DZg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-7.0.2.tgz", + "integrity": "sha512-D9PdByxJlFiaDJcLkM+RN1DHCj4VfQIlSZkADOcNtI4o9H064oiMloWDGZiR1i1FCYMSXuWmW6tMsuCVebA+Nw==", "dev": true, "requires": { "@babel/core": "~7.21.0", - "@babel/preset-env": "~7.20.2", + "@babel/preset-env": "~7.21.0", "@babel/types": "~7.21.2", - "@storybook/csf": "next", - "@storybook/csf-tools": "7.0.0-rc.3", - "@storybook/node-logger": "7.0.0-rc.3", - "@storybook/types": "7.0.0-rc.3", + "@storybook/csf": "^0.1.0", + "@storybook/csf-tools": "7.0.2", + "@storybook/node-logger": "7.0.2", + "@storybook/types": "7.0.2", "cross-spawn": "^7.0.3", "globby": "^11.0.2", "jscodeshift": "^0.14.0", @@ -20720,44 +21048,44 @@ } }, "@storybook/components": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/components/-/components-7.0.0-rc.3.tgz", - "integrity": "sha512-PeQFr2hZvLnxLswKihw1Ro5wCqmNZeSE4q+tFdifhLVIqP/OwHG+ShiLCHQ1aEa0Z3Ub+80m7uPzg69+y9m+bQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-7.0.2.tgz", + "integrity": "sha512-Ee9pY6WlpricPUdYiyR0Ov8zgHkUt541yl1CZ6Ytaom2TA12cAnRjKewbLAgVPPhIE1LsMRhOPFYql0JMtnN4Q==", "dev": true, "requires": { - "@storybook/client-logger": "7.0.0-rc.3", - "@storybook/csf": "next", + "@storybook/client-logger": "7.0.2", + "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/theming": "7.0.0-rc.3", - "@storybook/types": "7.0.0-rc.3", + "@storybook/theming": "7.0.2", + "@storybook/types": "7.0.2", "memoizerific": "^1.11.3", "use-resize-observer": "^9.1.0", "util-deprecate": "^1.0.2" } }, "@storybook/core-client": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-7.0.0-rc.3.tgz", - "integrity": "sha512-epUiHzFQNoEr5PYq9069SliQzHl5fVQj94aWdGZWCQPGldxiFtCNB7o32NzwwIVzXOKPzU38qg2B4738jt/1XQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-7.0.2.tgz", + "integrity": "sha512-tr6Uv41YD2O0xiUrtgujiY1QxuznhbyUI0BRsSh49e8cx3QoW7FgPy7IVZHgb17DXKZ/wY/hgdyTTB87H6IbLA==", "dev": true, "requires": { - "@storybook/client-logger": "7.0.0-rc.3", - "@storybook/preview-api": "7.0.0-rc.3" + "@storybook/client-logger": "7.0.2", + "@storybook/preview-api": "7.0.2" } }, "@storybook/core-common": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.0.0-rc.3.tgz", - "integrity": "sha512-uUIs14+35ubRcpYwuX0OHW05tSDC5jeNEY8gv2EjcexBLeNozfGV4Tf5/ncG8glVbp8jGUlu2S3XJZoHKHDSqQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.0.2.tgz", + "integrity": "sha512-DayFPTCj695tnEKLuDlogclBim8mzdrbj9U1xzFm23BUReheGSGdLl2zrb3mP1l9Zj4xJ/Ctst1KN9SFbW84vw==", "dev": true, "requires": { - "@storybook/node-logger": "7.0.0-rc.3", - "@storybook/types": "7.0.0-rc.3", + "@storybook/node-logger": "7.0.2", + "@storybook/types": "7.0.2", "@types/node": "^16.0.0", "@types/pretty-hrtime": "^1.0.0", "chalk": "^4.1.0", - "esbuild": "^0.16.4", - "esbuild-register": "^3.3.3", + "esbuild": "^0.17.0", + "esbuild-register": "^3.4.0", "file-system-cache": "^2.0.0", "find-up": "^5.0.0", "fs-extra": "^11.1.0", @@ -20769,14 +21097,13 @@ "pkg-dir": "^5.0.0", "pretty-hrtime": "^1.0.3", "resolve-from": "^5.0.0", - "slash": "^3.0.0", "ts-dedent": "^2.0.0" }, "dependencies": { "@types/node": { - "version": "16.18.16", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.16.tgz", - "integrity": "sha512-ZOzvDRWp8dCVBmgnkIqYCArgdFOO9YzocZp8Ra25N/RStKiWvMOXHMz+GjSeVNe5TstaTmTWPucGJkDw0XXJWA==", + "version": "16.18.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.23.tgz", + "integrity": "sha512-XAMpaw1s1+6zM+jn2tmw8MyaRDIJfXxqmIQIS0HfoGYPuf7dUWeiUKopwq13KFX9lEp1+THGtlaaYx39Nxr58g==", "dev": true }, "ansi-styles": { @@ -20816,31 +21143,31 @@ } }, "@storybook/core-events": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.0.0-rc.3.tgz", - "integrity": "sha512-EBihNmxxiIJbPt6OhCTXFPl2T/9OXNVKtsy8hchBNEzp+UJGyeHx+t9K6tRvbcmt5TG/y7C7ZsYx9U28JTwNkg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.0.2.tgz", + "integrity": "sha512-1DCHCwHRL3+rlvnVVc/BCfReP31XaT2WYgcLeGTmkX1E43Po1MkgcM7PnJPSaa9POvSqZ+6YLZv5Bs1SXbufow==", "dev": true }, "@storybook/core-server": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-7.0.0-rc.3.tgz", - "integrity": "sha512-211514C7w8hvu/bLP97KdF7TM8FpcchgDAhldODDvKFyxFTHMcQFj3ABlptsWFO6JxZsy32hG8qi6phFUtceQA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-7.0.2.tgz", + "integrity": "sha512-7ipGws8YffVaiwkc+D0+MfZc/Sy52aKenG3nDJdK4Ajmp5LPAlelb/sxIhfRvoHDbDsy2FQNz++Mb55Yh03KkA==", "dev": true, "requires": { "@aw-web-design/x-default-browser": "1.4.88", "@discoveryjs/json-ext": "^0.5.3", - "@storybook/builder-manager": "7.0.0-rc.3", - "@storybook/core-common": "7.0.0-rc.3", - "@storybook/core-events": "7.0.0-rc.3", - "@storybook/csf": "next", - "@storybook/csf-tools": "7.0.0-rc.3", - "@storybook/docs-mdx": "next", + "@storybook/builder-manager": "7.0.2", + "@storybook/core-common": "7.0.2", + "@storybook/core-events": "7.0.2", + "@storybook/csf": "^0.1.0", + "@storybook/csf-tools": "7.0.2", + "@storybook/docs-mdx": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/manager": "7.0.0-rc.3", - "@storybook/node-logger": "7.0.0-rc.3", - "@storybook/preview-api": "7.0.0-rc.3", - "@storybook/telemetry": "7.0.0-rc.3", - "@storybook/types": "7.0.0-rc.3", + "@storybook/manager": "7.0.2", + "@storybook/node-logger": "7.0.2", + "@storybook/preview-api": "7.0.2", + "@storybook/telemetry": "7.0.2", + "@storybook/types": "7.0.2", "@types/detect-port": "^1.3.0", "@types/node": "^16.0.0", "@types/node-fetch": "^2.5.7", @@ -20864,7 +21191,6 @@ "read-pkg-up": "^7.0.1", "semver": "^7.3.7", "serve-favicon": "^2.5.0", - "slash": "^3.0.0", "telejson": "^7.0.3", "ts-dedent": "^2.0.0", "util-deprecate": "^1.0.2", @@ -20873,9 +21199,9 @@ }, "dependencies": { "@types/node": { - "version": "16.18.16", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.16.tgz", - "integrity": "sha512-ZOzvDRWp8dCVBmgnkIqYCArgdFOO9YzocZp8Ra25N/RStKiWvMOXHMz+GjSeVNe5TstaTmTWPucGJkDw0XXJWA==", + "version": "16.18.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.23.tgz", + "integrity": "sha512-XAMpaw1s1+6zM+jn2tmw8MyaRDIJfXxqmIQIS0HfoGYPuf7dUWeiUKopwq13KFX9lEp1+THGtlaaYx39Nxr58g==", "dev": true }, "ansi-styles": { @@ -20939,57 +21265,57 @@ } }, "@storybook/csf": { - "version": "0.0.2-next.10", - "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.0.2-next.10.tgz", - "integrity": "sha512-m2PFgBP/xRIF85VrDhvesn9ktaD2pN3VUjvMqkAL/cINp/3qXsCyI81uw7N5VEOkQAbWrY2FcydnvEPDEdE8fA==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.0.tgz", + "integrity": "sha512-uk+jMXCZ8t38jSTHk2o5btI+aV2Ksbvl6DoOv3r6VaCM1KZqeuMwtwywIQdflkA8/6q/dKT8z8L+g8hC4GC3VQ==", "dev": true, "requires": { "type-fest": "^2.19.0" } }, "@storybook/csf-plugin": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-7.0.0-rc.3.tgz", - "integrity": "sha512-+r2m09o/5B846Q8ykDWjwPJSZXc3i4Z6vLc04SxIR/VJffF7K0Z/vFmTcPz8Qg5wFdfvy/HFqTLpaOJtVwWBdA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-7.0.2.tgz", + "integrity": "sha512-aGuo+G6G5IwSGkmc+OUA796sOfvJMaQj8QS/Zh5F0nL4ZlQvghHpXON8cRHHvmXHQqUo07KLiy7CZh2I2oq4iQ==", "dev": true, "requires": { - "@storybook/csf-tools": "7.0.0-rc.3", + "@storybook/csf-tools": "7.0.2", "unplugin": "^0.10.2" } }, "@storybook/csf-tools": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.0.0-rc.3.tgz", - "integrity": "sha512-I3QG2buAswIYVbYlstmZAamwLopW6daHj2+wrod+whTmeKShp0rbOrVkU0M3Hpj9CVzFM1/4YqCNOBkS2XTnsw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.0.2.tgz", + "integrity": "sha512-sOp355yQSpYiMqNSopmFYWZkPPRJdGgy4tpxGGLxpOZMygK3j1wQ/WQtl2Z0h61KP0S0dl6hrs0pHQz3A/eVrw==", "dev": true, "requires": { "@babel/generator": "~7.21.1", "@babel/parser": "~7.21.2", "@babel/traverse": "~7.21.2", "@babel/types": "~7.21.2", - "@storybook/csf": "next", - "@storybook/types": "7.0.0-rc.3", + "@storybook/csf": "^0.1.0", + "@storybook/types": "7.0.2", "fs-extra": "^11.1.0", "recast": "^0.23.1", "ts-dedent": "^2.0.0" } }, "@storybook/docs-mdx": { - "version": "0.0.1-next.6", - "resolved": "https://registry.npmjs.org/@storybook/docs-mdx/-/docs-mdx-0.0.1-next.6.tgz", - "integrity": "sha512-DjoSIXADmLJtdroXAjUotFiZlcZ2usWhqrS7aeOtZs0DVR0Ws5WQjnwtpDUXt8gryTSd+OZJ0cNsDcqg4JDEvQ==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@storybook/docs-mdx/-/docs-mdx-0.1.0.tgz", + "integrity": "sha512-JDaBR9lwVY4eSH5W8EGHrhODjygPd6QImRbwjAuJNEnY0Vw4ie3bPkeGfnacB3OBW6u/agqPv2aRlR46JcAQLg==", "dev": true }, "@storybook/docs-tools": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-7.0.0-rc.3.tgz", - "integrity": "sha512-1uGIMq0+t8AUJyj0jkta7Imr3vFLkX8oRXhX5zi7znjWMhgeXKskEFujvCcz7eI1NIU9x2WvFwbtSzWDpdC/0g==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-7.0.2.tgz", + "integrity": "sha512-w4D5BURrYjLbLGG9VKAaKU2dSdukszxRE3HWkJyhQU9R1JHvS3n8ntcMqYPqRfoHCOeBLBxP0edDYcAfzGNDYQ==", "dev": true, "requires": { "@babel/core": "^7.12.10", - "@storybook/core-common": "7.0.0-rc.3", - "@storybook/preview-api": "7.0.0-rc.3", - "@storybook/types": "7.0.0-rc.3", + "@storybook/core-common": "7.0.2", + "@storybook/preview-api": "7.0.2", + "@storybook/types": "7.0.2", "@types/doctrine": "^0.0.3", "doctrine": "^3.0.0", "lodash": "^4.17.21" @@ -21002,25 +21328,25 @@ "dev": true }, "@storybook/manager": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/manager/-/manager-7.0.0-rc.3.tgz", - "integrity": "sha512-8Q/vpHkvWQ/fZHRPFOgGC4Qhgpmafe9GV2QKk3yRA/p9zcW4UzP9fbL4qw6tq+5GLM/kFKArBu28ZA7L7sKB9A==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/manager/-/manager-7.0.2.tgz", + "integrity": "sha512-jsFsFKG0rPNYfuRm/WSXGMBy8vnALyFWU330ObDmfU0JID3SeLlVqAOZT1GlwI6vupYpWodsN6qPZKRmC8onRw==", "dev": true }, "@storybook/manager-api": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.0.0-rc.3.tgz", - "integrity": "sha512-Pa+LabGYakPd9RuS8G7tCp3hPjZwGZL95Dj+yef0bM9WmYBimNjaUsqVJOGttuE4TLXjUIU9+58YImN7QrGfbQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.0.2.tgz", + "integrity": "sha512-PbLj9Rc5uCMPfMdaXv1wE3koA3+d0rmZ3BJI8jeq+mfZEvpvfI4OOpRioT1q04CkkVomFOVFTyO0Q/o6Rb5N7g==", "dev": true, "requires": { - "@storybook/channels": "7.0.0-rc.3", - "@storybook/client-logger": "7.0.0-rc.3", - "@storybook/core-events": "7.0.0-rc.3", - "@storybook/csf": "next", + "@storybook/channels": "7.0.2", + "@storybook/client-logger": "7.0.2", + "@storybook/core-events": "7.0.2", + "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/router": "7.0.0-rc.3", - "@storybook/theming": "7.0.0-rc.3", - "@storybook/types": "7.0.0-rc.3", + "@storybook/router": "7.0.2", + "@storybook/theming": "7.0.2", + "@storybook/types": "7.0.2", "dequal": "^2.0.2", "lodash": "^4.17.21", "memoizerific": "^1.11.3", @@ -21057,15 +21383,15 @@ } }, "@storybook/mdx2-csf": { - "version": "1.0.0-next.5", - "resolved": "https://registry.npmjs.org/@storybook/mdx2-csf/-/mdx2-csf-1.0.0-next.5.tgz", - "integrity": "sha512-02w0sgGZaK1agT050yCVhJ+o4rLHANWvLKWjQjeAsYbjneLC5ITt+3GDB4jRiWwJboZ8dHW1fGSK1Vg5fA34aQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@storybook/mdx2-csf/-/mdx2-csf-1.0.0.tgz", + "integrity": "sha512-dBAnEL4HfxxJmv7LdEYUoZlQbWj9APZNIbOaq0tgF8XkxiIbzqvgB0jhL/9UOrysSDbQWBiCRTu2wOVxedGfmw==", "dev": true }, "@storybook/node-logger": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.0.0-rc.3.tgz", - "integrity": "sha512-ViWIJUdFUTrFtcoO88T3h55ryjl73aMNyn8vPvIgejJoJfYMTB5ErI4zLquN23HNc+H9AKKm/qMFFSf9xjGORQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.0.2.tgz", + "integrity": "sha512-UENpXxB1yDqP7JXaODJo+pbGt5y3NFBNurBr4+pI4bMAC4ARjpgRE4wp6fxUKFPu9MAR10oCdcLEHkaVUAjYRg==", "dev": true, "requires": { "@types/npmlog": "^4.1.2", @@ -21111,115 +21437,65 @@ } }, "@storybook/postinstall": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-7.0.0-rc.3.tgz", - "integrity": "sha512-kOCJjixFwdnZxR6K45XR+6Q4UBzOLdabzh3aednQ/piiqj7ZdldaF75ZfoDhKPK4cjrd5AGU6/OWbsJQ+DLVMg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-7.0.2.tgz", + "integrity": "sha512-Hhiu3+N3ZDcbrhOCBJTDJbn/mC4l0v3ziyAP3yalq/2ZR9R5kfsEHHakKmswsKKV+ey0gNGijFTy3soU5oSs+A==", "dev": true }, "@storybook/preview": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-7.0.0-rc.3.tgz", - "integrity": "sha512-7FeJjOV2pNVesdNljzy1DvzhhShZ/pjQOmhFs4GXBXTJCPNQP5iZTSR6b3ehN8L96yVPT5JsdjX4MiyGw2QPnQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-7.0.2.tgz", + "integrity": "sha512-U7MZkDT9bBq7HggLAXmTO9gI4eqhYs26fZS0L6iTE/PCX4Wg2TJBJSq2X8jhDXRqJFOt8SrQ756+V5Vtwrh4Og==", "dev": true }, "@storybook/preview-api": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.0.0-rc.3.tgz", - "integrity": "sha512-iIifbFRmrFIlLzApTZyCWmI3JNt2IxfM8Dm4rNlMJBifjtgHfpxA+DsQI8mW8UGM64a8N1wF7azkN6cnRz6v2w==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.0.2.tgz", + "integrity": "sha512-QAlJM/r92+dQe/kB7MTTR9b/1mt9UJjxNjazGdEWipA/nw23kOF3o/hBcvKwBYkit4zGYsX70H+vuzW8hCo/lA==", "dev": true, "requires": { - "@storybook/channel-postmessage": "7.0.0-rc.3", - "@storybook/channels": "7.0.0-rc.3", - "@storybook/client-logger": "7.0.0-rc.3", - "@storybook/core-events": "7.0.0-rc.3", - "@storybook/csf": "next", + "@storybook/channel-postmessage": "7.0.2", + "@storybook/channels": "7.0.2", + "@storybook/client-logger": "7.0.2", + "@storybook/core-events": "7.0.2", + "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/types": "7.0.0-rc.3", + "@storybook/types": "7.0.2", "@types/qs": "^6.9.5", "dequal": "^2.0.2", "lodash": "^4.17.21", "memoizerific": "^1.11.3", "qs": "^6.10.0", - "slash": "^3.0.0", "synchronous-promise": "^2.0.15", "ts-dedent": "^2.0.0", "util-deprecate": "^1.0.2" } }, "@storybook/react-dom-shim": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-7.0.0-rc.3.tgz", - "integrity": "sha512-3rQsOPwNlHyV93311GaGP28BFobEaNfw+djxDBxocNrL07xvY3u/XE6bShKOJ6R28ATaGwXUxmj2Cwtd2GxASg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-7.0.2.tgz", + "integrity": "sha512-fMl0aV7mJ3wyQKvt6z+rZuiIiSd9YinS77IJ1ETHqVZ4SxWriOS0GFKP6sZflrlpShoZBh+zl1lDPG7ZZdrQGw==", "dev": true }, "@storybook/router": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.0.0-rc.3.tgz", - "integrity": "sha512-D3Uoz1WRFWH3QUjyrDObwCVRYXdSGZGpCN2eh6gjlKC9VQ9ohaGerEdXSsYnAj2lovhfze8oXp+PS1VKJTlpgg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.0.2.tgz", + "integrity": "sha512-ZB2vucfayZUrMLBlXju4v6CNOQQb0YKDLw5RoojdBxOsUFtnp5UiPOE+I8PQR63EBwnRjozeibV1XSM+GlQb5w==", "dev": true, "requires": { - "@storybook/client-logger": "7.0.0-rc.3", + "@storybook/client-logger": "7.0.2", "memoizerific": "^1.11.3", "qs": "^6.10.0" } }, - "@storybook/semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@storybook/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg==", - "dev": true, - "requires": { - "core-js": "^3.6.5", - "find-up": "^4.1.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - } - } - }, "@storybook/telemetry": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-7.0.0-rc.3.tgz", - "integrity": "sha512-0vPVA1aTWCA6jr3iSOPCu8x3zpNUsyxYN30B4b6d3o2iO6YU/CZdm8rxzInv+bKkz2fHFDzCDsfZTgQ5VEggEw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-7.0.2.tgz", + "integrity": "sha512-s2PIwI9nVYQBf3h40EFHLynYUfdqzRJMXyaCWJdVQuvdQfRkAn3CLXaubK+VdjC869z3ZfW20EMu3Mbgzcc0HA==", "dev": true, "requires": { - "@storybook/client-logger": "7.0.0-rc.3", - "@storybook/core-common": "7.0.0-rc.3", + "@storybook/client-logger": "7.0.2", + "@storybook/core-common": "7.0.2", "chalk": "^4.1.0", "detect-package-manager": "^2.0.1", "fetch-retry": "^5.0.2", @@ -21266,55 +21542,55 @@ } }, "@storybook/theming": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.0.0-rc.3.tgz", - "integrity": "sha512-sVt8Egv9CmeDnTJYPsyvlvHE+GX8hAczc1SvuoLeXs/1gsEsnVn6ovCFGSV0Rc7sAr5oSv794/pFUsboU8tYqg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.0.2.tgz", + "integrity": "sha512-c9sE+QAZNbopPvLiJ6BMxBERfTaq1ATyIri97FBvTucuSotNXw7X5q+ip5/nrCOPZuvK2f5wF4DRyD2HnB/rIQ==", "dev": true, "requires": { "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@storybook/client-logger": "7.0.0-rc.3", + "@storybook/client-logger": "7.0.2", "@storybook/global": "^5.0.0", "memoizerific": "^1.11.3" } }, "@storybook/types": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.0.0-rc.3.tgz", - "integrity": "sha512-2xxgs4zL1QZUdut+Zt5sQdgNCUP0n/y5CRbvEpDwkcuE4KWbfJYixJNumioZ6UwK17ZE9gf4ZxVgttvexmW8eg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.0.2.tgz", + "integrity": "sha512-0OCt/kAexa8MCcljxA+yZxGMn0n2U2Ync0KxotItqNbKBKVkaLQUls0+IXTWSCpC/QJvNZ049jxUHHanNi/96w==", "dev": true, "requires": { - "@storybook/channels": "7.0.0-rc.3", + "@storybook/channels": "7.0.2", "@types/babel__core": "^7.0.0", "@types/express": "^4.7.0", "file-system-cache": "^2.0.0" } }, "@storybook/web-components": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/web-components/-/web-components-7.0.0-rc.3.tgz", - "integrity": "sha512-enG/VoXu7i5r39Ao4qg6a4Q/aPX5LYkkFaj955BLkUJXW1ZANwjRqo6JSquC4tW8Dm1FYN8sJBAzO6M8YRlbnA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/web-components/-/web-components-7.0.2.tgz", + "integrity": "sha512-qJc5EsNZci0yBOCH9YKuUoSEHvvfetFUsUWpLQa2pzHa648z0Qb8Z1OS/hYCq7PyJN/knb+00Pd8z3zNSw9SgA==", "dev": true, "requires": { - "@storybook/client-logger": "7.0.0-rc.3", - "@storybook/core-client": "7.0.0-rc.3", - "@storybook/docs-tools": "7.0.0-rc.3", + "@storybook/client-logger": "7.0.2", + "@storybook/core-client": "7.0.2", + "@storybook/docs-tools": "7.0.2", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.0-rc.3", - "@storybook/preview-api": "7.0.0-rc.3", - "@storybook/types": "7.0.0-rc.3", + "@storybook/manager-api": "7.0.2", + "@storybook/preview-api": "7.0.2", + "@storybook/types": "7.0.2", "ts-dedent": "^2.0.0" } }, "@storybook/web-components-vite": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@storybook/web-components-vite/-/web-components-vite-7.0.0-rc.3.tgz", - "integrity": "sha512-A/+tm879pmD9UwWDJdYimwuIaSQPYyf2FSwL/+zIJ6ZS63LFimkIkt/C7hWD6pYNzk1w36VESfRhEeP3Hu4VNA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@storybook/web-components-vite/-/web-components-vite-7.0.2.tgz", + "integrity": "sha512-9c6wt+4yvOGN3d2FV3dBbtAeswjuIOS5InCQiMHLZEywjghg3SMre5yatKnO88eEk4XBJkamc6rHzSbETrc3sg==", "dev": true, "requires": { - "@storybook/builder-vite": "7.0.0-rc.3", - "@storybook/core-server": "7.0.0-rc.3", - "@storybook/node-logger": "7.0.0-rc.3", - "@storybook/web-components": "7.0.0-rc.3", + "@storybook/builder-vite": "7.0.2", + "@storybook/core-server": "7.0.2", + "@storybook/node-logger": "7.0.2", + "@storybook/web-components": "7.0.2", "magic-string": "^0.27.0" } }, @@ -21569,12 +21845,6 @@ "rxjs": "^7.2.0" } }, - "@types/is-function": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/is-function/-/is-function-1.0.1.tgz", - "integrity": "sha512-A79HEEiwXTFtfY+Bcbo58M2GRYzCr9itHWzbzHVFNEYCcoU/MMGwYYf721gBrnhpj1s6RGVVha/IgNFnR0Iw/Q==", - "dev": true - }, "@types/istanbul-lib-coverage": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", @@ -21866,12 +22136,6 @@ "integrity": "sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA==", "dev": true }, - "@types/webpack-env": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.18.0.tgz", - "integrity": "sha512-56/MAlX5WMsPVbOg7tAxnYvNYMMWr/QJiIp6BxVSW3JJXUVzzOn64qW8TzQyMSqSUFM2+PVI4aUHcHOzIz/1tg==", - "dev": true - }, "@types/ws": { "version": "7.4.7", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", @@ -21882,9 +22146,9 @@ } }, "@types/yargs": { - "version": "17.0.22", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.22.tgz", - "integrity": "sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g==", + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", "dev": true, "requires": { "@types/yargs-parser": "*" @@ -21951,15 +22215,82 @@ } }, "@typescript-eslint/parser": { - "version": "5.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.54.0.tgz", - "integrity": "sha512-aAVL3Mu2qTi+h/r04WI/5PfNWvO6pdhpeMRWk9R7rEV4mwJNzoWf5CCU5vDKBsPIFQFjEq1xg7XBI2rjiMXQbQ==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.57.0.tgz", + "integrity": "sha512-orrduvpWYkgLCyAdNtR1QIWovcNZlEm6yL8nwH/eTxWLd8gsP+25pdLHYzL2QdkqrieaDwLpytHqycncv0woUQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.54.0", - "@typescript-eslint/types": "5.54.0", - "@typescript-eslint/typescript-estree": "5.54.0", + "@typescript-eslint/scope-manager": "5.57.0", + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/typescript-estree": "5.57.0", "debug": "^4.3.4" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.57.0.tgz", + "integrity": "sha512-NANBNOQvllPlizl9LatX8+MHi7bx7WGIWYjPHDmQe5Si/0YEYfxSljJpoTyTWFTgRy3X8gLYSE4xQ2U+aCozSw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/visitor-keys": "5.57.0" + } + }, + "@typescript-eslint/types": { + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.57.0.tgz", + "integrity": "sha512-mxsod+aZRSyLT+jiqHw1KK6xrANm19/+VFALVFP5qa/aiJnlP38qpyaTd0fEKhWvQk6YeNZ5LGwI1pDpBRBhtQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.57.0.tgz", + "integrity": "sha512-LTzQ23TV82KpO8HPnWuxM2V7ieXW8O142I7hQTxWIHDcCEIjtkat6H96PFkYBQqGFLW/G/eVVOB9Z8rcvdY/Vw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/visitor-keys": "5.57.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.0.tgz", + "integrity": "sha512-ery2g3k0hv5BLiKpPuwYt9KBkAp2ugT6VvyShXdLOkax895EC55sP0Tx5L0fZaQueiK3fBLvHVvEl3jFS5ia+g==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.57.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } } }, "@typescript-eslint/scope-manager": { @@ -23002,6 +23333,13 @@ "ua-parser-js": "^1.0.2" }, "dependencies": { + "@esbuild/linux-loong64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz", + "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==", + "dev": true, + "optional": true + }, "esbuild": { "version": "0.14.54", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz", @@ -24449,12 +24787,6 @@ "keygrip": "~1.1.0" } }, - "core-js": { - "version": "3.29.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.29.0.tgz", - "integrity": "sha512-VG23vuEisJNkGl6XQmFJd3rEG/so/CNatqeE+7uZAwTSwFeB/qaO0be8xZYUNWprJ/GIwL8aMt9cj1kvbpTZhg==", - "dev": true - }, "core-js-compat": { "version": "3.29.1", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.29.1.tgz", @@ -24761,12 +25093,6 @@ "esutils": "^2.0.2" } }, - "dom-walk": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", - "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", - "dev": true - }, "dom5": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.1.tgz", @@ -25041,35 +25367,49 @@ "dev": true }, "esbuild": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", - "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==", + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.15.tgz", + "integrity": "sha512-LBUV2VsUIc/iD9ME75qhT4aJj0r75abCVS0jakhFzOtR7TQsqQA5w0tZ+KTKnwl3kXE0MhskNdHDh/I5aCR1Zw==", "dev": true, "requires": { - "@esbuild/android-arm": "0.16.17", - "@esbuild/android-arm64": "0.16.17", - "@esbuild/android-x64": "0.16.17", - "@esbuild/darwin-arm64": "0.16.17", - "@esbuild/darwin-x64": "0.16.17", - "@esbuild/freebsd-arm64": "0.16.17", - "@esbuild/freebsd-x64": "0.16.17", - "@esbuild/linux-arm": "0.16.17", - "@esbuild/linux-arm64": "0.16.17", - "@esbuild/linux-ia32": "0.16.17", - "@esbuild/linux-loong64": "0.16.17", - "@esbuild/linux-mips64el": "0.16.17", - "@esbuild/linux-ppc64": "0.16.17", - "@esbuild/linux-riscv64": "0.16.17", - "@esbuild/linux-s390x": "0.16.17", - "@esbuild/linux-x64": "0.16.17", - "@esbuild/netbsd-x64": "0.16.17", - "@esbuild/openbsd-x64": "0.16.17", - "@esbuild/sunos-x64": "0.16.17", - "@esbuild/win32-arm64": "0.16.17", - "@esbuild/win32-ia32": "0.16.17", - "@esbuild/win32-x64": "0.16.17" + "@esbuild/android-arm": "0.17.15", + "@esbuild/android-arm64": "0.17.15", + "@esbuild/android-x64": "0.17.15", + "@esbuild/darwin-arm64": "0.17.15", + "@esbuild/darwin-x64": "0.17.15", + "@esbuild/freebsd-arm64": "0.17.15", + "@esbuild/freebsd-x64": "0.17.15", + "@esbuild/linux-arm": "0.17.15", + "@esbuild/linux-arm64": "0.17.15", + "@esbuild/linux-ia32": "0.17.15", + "@esbuild/linux-loong64": "0.17.15", + "@esbuild/linux-mips64el": "0.17.15", + "@esbuild/linux-ppc64": "0.17.15", + "@esbuild/linux-riscv64": "0.17.15", + "@esbuild/linux-s390x": "0.17.15", + "@esbuild/linux-x64": "0.17.15", + "@esbuild/netbsd-x64": "0.17.15", + "@esbuild/openbsd-x64": "0.17.15", + "@esbuild/sunos-x64": "0.17.15", + "@esbuild/win32-arm64": "0.17.15", + "@esbuild/win32-ia32": "0.17.15", + "@esbuild/win32-x64": "0.17.15" } }, + "esbuild-android-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz", + "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==", + "dev": true, + "optional": true + }, + "esbuild-android-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz", + "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==", + "dev": true, + "optional": true + }, "esbuild-darwin-64": { "version": "0.14.54", "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz", @@ -25077,6 +25417,97 @@ "dev": true, "optional": true }, + "esbuild-darwin-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz", + "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz", + "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz", + "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==", + "dev": true, + "optional": true + }, + "esbuild-linux-32": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz", + "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==", + "dev": true, + "optional": true + }, + "esbuild-linux-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz", + "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz", + "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz", + "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==", + "dev": true, + "optional": true + }, + "esbuild-linux-mips64le": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz", + "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==", + "dev": true, + "optional": true + }, + "esbuild-linux-ppc64le": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz", + "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-riscv64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz", + "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==", + "dev": true, + "optional": true + }, + "esbuild-linux-s390x": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz", + "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==", + "dev": true, + "optional": true + }, + "esbuild-netbsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz", + "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==", + "dev": true, + "optional": true + }, + "esbuild-openbsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz", + "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==", + "dev": true, + "optional": true + }, "esbuild-plugin-alias": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/esbuild-plugin-alias/-/esbuild-plugin-alias-0.2.1.tgz", @@ -25092,6 +25523,34 @@ "debug": "^4.3.4" } }, + "esbuild-sunos-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz", + "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==", + "dev": true, + "optional": true + }, + "esbuild-windows-32": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz", + "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==", + "dev": true, + "optional": true + }, + "esbuild-windows-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", + "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", + "dev": true, + "optional": true + }, + "esbuild-windows-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz", + "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==", + "dev": true, + "optional": true + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -25256,9 +25715,9 @@ } }, "eslint-config-prettier": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz", - "integrity": "sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", + "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", "dev": true }, "eslint-import-resolver-node": { @@ -25995,9 +26454,9 @@ "dev": true }, "flow-parser": { - "version": "0.201.0", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.201.0.tgz", - "integrity": "sha512-G4oeDNpNGyIrweF9EnoHatncAihMT0tQgV6NMdyM5I7fhrz9Pr13PJ2KLQ673O4wj9KooTdBpeeYHdDNAQoyyw==", + "version": "0.203.1", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.203.1.tgz", + "integrity": "sha512-Nw2M8MPP/Zb+yhvmPDEjzkCXLtgyWGKXZjAYOVftm+wIf3xd4FKa7nRI9v67rODs0WzxMbPc8IPs/7o/dyxo/Q==", "dev": true }, "for-each": { @@ -26285,16 +26744,6 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, - "global": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", - "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", - "dev": true, - "requires": { - "min-document": "^2.19.0", - "process": "^0.11.10" - } - }, "global-modules": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", @@ -26894,12 +27343,6 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, - "is-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", - "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==", - "dev": true - }, "is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -27835,28 +28278,29 @@ "dev": true }, "lit": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/lit/-/lit-2.6.1.tgz", - "integrity": "sha512-DT87LD64f8acR7uVp7kZfhLRrHkfC/N4BVzAtnw9Yg8087mbBJ//qedwdwX0kzDbxgPccWRW6mFwGbRQIxy0pw==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/lit/-/lit-2.7.0.tgz", + "integrity": "sha512-qSy2BAVA+OiWtNptP404egcC/izDdNRw6iHGIbUmkZtbMJvPKfNsaoKrNs8Zmsbjmv5ZX2tur1l9TfzkSWWT4g==", "requires": { "@lit/reactive-element": "^1.6.0", - "lit-element": "^3.2.0", - "lit-html": "^2.6.0" + "lit-element": "^3.3.0", + "lit-html": "^2.7.0" } }, "lit-element": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.2.2.tgz", - "integrity": "sha512-6ZgxBR9KNroqKb6+htkyBwD90XGRiqKDHVrW/Eh0EZ+l+iC+u+v+w3/BA5NGi4nizAVHGYvQBHUDuSmLjPp7NQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.3.0.tgz", + "integrity": "sha512-M3OIoblNS7LZdRxOIk8g0wyLEA/lRw/UGJ1TX+767OpkuDsRdSoxBIvewpWqCo7sMd9xt1XedUNZIr9jUO1X3g==", "requires": { + "@lit-labs/ssr-dom-shim": "^1.1.0", "@lit/reactive-element": "^1.3.0", - "lit-html": "^2.2.0" + "lit-html": "^2.7.0" } }, "lit-html": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.6.1.tgz", - "integrity": "sha512-Z3iw+E+3KKFn9t2YKNjsXNEu/LRLI98mtH/C6lnFg7kvaqPIzPn124Yd4eT/43lyqrejpc5Wb6BHq3fdv4S8Rw==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.7.0.tgz", + "integrity": "sha512-/zPOl8EfeB3HHpTzINSpnWgvgQ8N07g/j272EOAIyB0Ys2RzBqTVT23i+JZuUlNbB2WHHeSsTCFi92NtWrtpqQ==", "requires": { "@types/trusted-types": "^2.0.2" } @@ -28061,9 +28505,9 @@ "dev": true }, "markdown-to-jsx": { - "version": "7.1.9", - "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.1.9.tgz", - "integrity": "sha512-x4STVIKIJR0mGgZIZ5RyAeQD7FEZd5tS8m/htbcVGlex32J+hlSLj+ExrHCxP6nRKF1EKbcO7i6WhC1GtOpBlA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.2.0.tgz", + "integrity": "sha512-3l4/Bigjm4bEqjCR6Xr+d4DtM1X6vvtGsMGSjJYyep8RjjIvcWtrXBS8Wbfe1/P+atKNMccpsraESIaWVplzVg==", "dev": true }, "marky": { @@ -28163,15 +28607,6 @@ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, - "min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", - "dev": true, - "requires": { - "dom-walk": "^0.1.0" - } - }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -28325,12 +28760,11 @@ } }, "msw-storybook-addon": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/msw-storybook-addon/-/msw-storybook-addon-1.7.0.tgz", - "integrity": "sha512-G/cYj7Z8NuyFbMsdVJRr17flWed8J7CmKTSPNXmuK65W6uILpqNDpXJC7KVRhOg7lUFR5Hmqwcq6z8Mow/wu5A==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/msw-storybook-addon/-/msw-storybook-addon-1.8.0.tgz", + "integrity": "sha512-dw3vZwqjixmiur0vouRSOax7wPSu9Og2Hspy9JZFHf49bZRjwDiLF0Pfn2NXEkGviYJOJiGxS1ejoTiUwoSg4A==", "dev": true, "requires": { - "@storybook/addons": "^6.0.0", "is-node-process": "^1.0.1" } }, @@ -29942,8 +30376,8 @@ } }, "router-slot": { - "version": "file:router-slot-1.6.1.tgz", - "integrity": "sha512-lrqzUL9wfSQR7L9rFvRsq/I+BGo2bw0Hn45eZ+qhrjPFv2gn+LRz2TaWa6CVqkiXhdWMrUEmEyD8nzl4cqV0Fw==" + "version": "file:router-slot-2.0.0.tgz", + "integrity": "sha512-J2E+sDJR7Q/S761Q6vXVCTWFN1kKidX3fparKoipm/NaX9XEdwmCSOEqYyUHbnIyDDo5O5PMhsH8EazLmCQJXw==" }, "run-async": { "version": "2.4.1", @@ -30398,12 +30832,12 @@ "dev": true }, "storybook": { - "version": "7.0.0-rc.3", - "resolved": "https://registry.npmjs.org/storybook/-/storybook-7.0.0-rc.3.tgz", - "integrity": "sha512-1EFr7o7dcgFKsI6TBqvxYEKGPzKvJ8qzCl3BM/1kZP5BmWqQPbanOQLVkTb4zDb5e+Q+ibDNH5k8D1lQFdsHcg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-7.0.2.tgz", + "integrity": "sha512-/XBLhT9Vb14yNBcA9rlW15y+C6IsCA3kx5PKvK9kL10sKCi8invcY94UfCSisXe8HqsO3u6peumo2xpYucKMjw==", "dev": true, "requires": { - "@storybook/cli": "7.0.0-rc.3" + "@storybook/cli": "7.0.2" } }, "stream-shift": { @@ -30948,9 +31382,9 @@ "dev": true }, "typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.3.tgz", + "integrity": "sha512-xv8mOEDnigb/tN9PSMTwSEqAnUvkoXMQlicOb0IUVDBSQCgBSaAAROUZYy2IcUy5qU6XajK5jjjO7TMWqBTKZA==", "dev": true }, "typical": { @@ -31216,16 +31650,16 @@ "dev": true }, "vite": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.1.4.tgz", - "integrity": "sha512-3knk/HsbSTKEin43zHu7jTwYWv81f8kgAL99G5NWBcA1LKvtvcVAC4JjBH1arBunO9kQka+1oGbrMKOjk4ZrBg==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.2.1.tgz", + "integrity": "sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==", "dev": true, "requires": { - "esbuild": "^0.16.14", + "esbuild": "^0.17.5", "fsevents": "~2.3.2", "postcss": "^8.4.21", "resolve": "^1.22.1", - "rollup": "^3.10.0" + "rollup": "^3.18.0" } }, "vite-plugin-static-copy": { diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index 2d00798d91..46d864b4a3 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -63,10 +63,10 @@ "@umbraco-ui/uui": "^1.2.0-rc.2", "@umbraco-ui/uui-css": "^1.2.0-rc.2", "element-internals-polyfill": "^1.1.19", - "lit": "^2.6.1", + "lit": "^2.7.0", "lodash-es": "4.17.21", "monaco-editor": "^0.36.1", - "router-slot": "file:router-slot-1.6.1.tgz", + "router-slot": "file:router-slot-2.0.0.tgz", "rxjs": "^7.8.0", "uuid": "^9.0.0" }, @@ -77,19 +77,19 @@ "@playwright/test": "^1.30.0", "@rollup/plugin-json": "^6.0.0", "@rollup/plugin-node-resolve": "^15.0.1", - "@storybook/addon-a11y": "^7.0.0-rc.3", - "@storybook/addon-actions": "^7.0.0-rc.3", - "@storybook/addon-essentials": "^7.0.0-rc.3", - "@storybook/addon-links": "^7.0.0-rc.3", - "@storybook/mdx2-csf": "^1.0.0-next.5", - "@storybook/web-components": "^7.0.0-rc.3", - "@storybook/web-components-vite": "^7.0.0-rc.3", + "@storybook/addon-a11y": "^7.0.2", + "@storybook/addon-actions": "^7.0.2", + "@storybook/addon-essentials": "^7.0.2", + "@storybook/addon-links": "^7.0.2", + "@storybook/mdx2-csf": "^1.0.0", + "@storybook/web-components": "^7.0.2", + "@storybook/web-components-vite": "^7.0.2", "@types/chai": "^4.3.4", "@types/lodash-es": "^4.17.6", "@types/mocha": "^10.0.0", "@types/uuid": "^9.0.0", "@typescript-eslint/eslint-plugin": "^5.50.0", - "@typescript-eslint/parser": "^5.54.0", + "@typescript-eslint/parser": "^5.57.0", "@web/dev-server-esbuild": "^0.3.3", "@web/dev-server-import-maps": "^0.0.7", "@web/dev-server-rollup": "^0.3.21", @@ -97,7 +97,7 @@ "@web/test-runner-playwright": "^0.9.0", "babel-loader": "^9.1.2", "eslint": "^8.32.0", - "eslint-config-prettier": "^8.6.0", + "eslint-config-prettier": "^8.8.0", "eslint-import-resolver-typescript": "^3.5.3", "eslint-plugin-import": "^2.27.4", "eslint-plugin-lit": "^1.8.2", @@ -106,7 +106,7 @@ "eslint-plugin-storybook": "^0.6.11", "eslint-plugin-wc": "^1.4.0", "msw": "^1.1.0", - "msw-storybook-addon": "^1.7.0", + "msw-storybook-addon": "^1.8.0", "openapi-typescript-codegen": "^0.23.0", "playwright-msw": "^2.1.0", "plop": "^3.1.1", @@ -117,10 +117,10 @@ "rollup-plugin-dts": "^5.2.0", "rollup-plugin-esbuild": "^5.0.0", "rollup-plugin-url": "^3.0.1", - "storybook": "^7.0.0-rc.3", + "storybook": "^7.0.2", "tiny-glob": "^0.2.9", - "typescript": "^4.9.5", - "vite": "^4.1.4", + "typescript": "^5.0.3", + "vite": "^4.2.1", "vite-plugin-static-copy": "^0.13.0", "vite-tsconfig-paths": "^4.0.5", "web-component-analyzer": "^2.0.0-next.4" diff --git a/src/Umbraco.Web.UI.Client/router-slot-1.6.1.tgz b/src/Umbraco.Web.UI.Client/router-slot-1.6.1.tgz deleted file mode 100644 index a5285852af..0000000000 Binary files a/src/Umbraco.Web.UI.Client/router-slot-1.6.1.tgz and /dev/null differ diff --git a/src/Umbraco.Web.UI.Client/router-slot-2.0.0.tgz b/src/Umbraco.Web.UI.Client/router-slot-2.0.0.tgz new file mode 100644 index 0000000000..e2e34160de Binary files /dev/null and b/src/Umbraco.Web.UI.Client/router-slot-2.0.0.tgz differ diff --git a/src/Umbraco.Web.UI.Client/src/app.ts b/src/Umbraco.Web.UI.Client/src/app.ts index 9f1337ba18..5707e9ec4d 100644 --- a/src/Umbraco.Web.UI.Client/src/app.ts +++ b/src/Umbraco.Web.UI.Client/src/app.ts @@ -10,10 +10,11 @@ import './core/modal/modal-element.element'; import { UUIIconRegistryEssential } from '@umbraco-ui/uui'; import { css, html } from 'lit'; -import { customElement, property, state } from 'lit/decorators.js'; +import { customElement, property } from 'lit/decorators.js'; import { UmbIconStore } from './core/stores/icon/icon.store'; -import type { Guard, IRoute } from '@umbraco-cms/internal/router'; +import type { Guard, IRoute } from '@umbraco-cms/backoffice/router'; +import { pathWithoutBasePath } from '@umbraco-cms/backoffice/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; import { OpenAPI, RuntimeLevelModel, ServerResource } from '@umbraco-cms/backoffice/backend-api'; @@ -37,8 +38,7 @@ export class UmbAppElement extends UmbLitElement { @property({ type: String }) private umbracoUrl?: string; - @state() - private _routes: IRoute[] = [ + private _routes: IRoute[] = [ { path: 'install', component: () => import('./installer/installer.element'), @@ -68,7 +68,7 @@ export class UmbAppElement extends UmbLitElement { this._setup(); } - async connectedCallback() { + connectedCallback() { super.connectedCallback(); OpenAPI.BASE = @@ -79,8 +79,7 @@ export class UmbAppElement extends UmbLitElement { this.provideContext('UMBRACOBASE', OpenAPI.BASE); - await this._setInitStatus(); - this._redirect(); + this._setInitStatus(); // Listen for the debug event from the component this.addEventListener(umbDebugContextEventType, (event: any) => { @@ -89,7 +88,7 @@ export class UmbAppElement extends UmbLitElement { // we have collected whilst coming up through the DOM // and pass it back down to the callback in // the component that originally fired the event - if(event.callback){ + if (event.callback) { event.callback(event.instances); } @@ -97,40 +96,43 @@ export class UmbAppElement extends UmbLitElement { // Why? Can't send contexts data directly - browser seems to not serialize it and says its null // But a simple object works fine for browser extension to consume const data = { - contexts: contextData(event.instances) + contexts: contextData(event.instances), }; // Emit this new event for the browser extension to listen for this.dispatchEvent(new CustomEvent('umb:debug-contexts:data', { detail: data, bubbles: true })); - }); } private async _setup() { + await this._setInitStatus(); this._iconRegistry.attach(this); } private async _setInitStatus() { const { data } = await tryExecuteAndNotify(this, ServerResource.getServerStatus()); this._runtimeLevel = data?.serverStatus ?? RuntimeLevelModel.UNKNOWN; + this._redirect(); } private _redirect() { switch (this._runtimeLevel) { case RuntimeLevelModel.INSTALL: - history.replaceState(null, '', '/install'); + history.replaceState(null, '', 'install'); break; case RuntimeLevelModel.UPGRADE: - history.replaceState(null, '', '/upgrade'); + history.replaceState(null, '', 'upgrade'); break; case RuntimeLevelModel.RUN: { - const pathname = - window.location.pathname === '/install' || window.location.pathname === '/upgrade' - ? '/' - : window.location.pathname; - history.replaceState(null, '', pathname); + const pathname = pathWithoutBasePath({ start: true, end: false }); + + // If we are on the installer or upgrade page, redirect to the root + // but if not, keep the current path but replace state anyway to initialize the router + const finalPath = pathname === '/install' || pathname === '/upgrade' ? '/' : location.href; + + history.replaceState(null, '', finalPath); break; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/dashboards/redirect-management/dashboard-redirect-management.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/dashboards/redirect-management/dashboard-redirect-management.element.ts index 42fa9ae950..8e7de5f464 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/dashboards/redirect-management/dashboard-redirect-management.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/dashboards/redirect-management/dashboard-redirect-management.element.ts @@ -154,14 +154,13 @@ export class UmbDashboardRedirectManagementElement extends UmbLitElement { } private async _removeRedirect(r: RedirectUrlResponseModel) { - if (!r.key) return; - const res = await tryExecuteAndNotify( - this, - RedirectManagementResource.deleteRedirectManagementByKey({ key: r.key }) - ); + if (!r.id) return; + const res = await tryExecuteAndNotify(this, RedirectManagementResource.deleteRedirectManagementById({ id: r.id })); if (!res.error) { // or just run a this._getRedirectData() again? - this.shadowRoot?.getElementById(`redirect-key-${r.key}`)?.remove(); + //this.shadowRoot?.getElementById(`redirect-key-${r.id}`)?.remove(); + // No no, never manipulate DOM manipulate the data for the DOM: + this._redirectData = this._redirectData?.filter((x) => x.id !== r.id); } } @@ -217,7 +216,9 @@ export class UmbDashboardRedirectManagementElement extends UmbLitElement { if (data) { this._total = data?.total; this._redirectData = data?.items; - if (this._filter?.length) this._buttonState = 'success'; + if (this._filter?.length) { + this._buttonState = 'success'; + } } } @@ -281,6 +282,7 @@ export class UmbDashboardRedirectManagementElement extends UmbLitElement { } private renderTable() { + // TODO: Instead of map, use repeat lit util: return html` @@ -291,7 +293,7 @@ export class UmbDashboardRedirectManagementElement extends UmbLitElement { Actions ${this._redirectData?.map((data) => { - return html` + return html` ${data.culture || '*'} ${data.originalUrl} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-blueprints/document-blueprint.detail.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-blueprints/document-blueprint.detail.store.ts index f0efc47b4b..f60b478a36 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-blueprints/document-blueprint.detail.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-blueprints/document-blueprint.detail.store.ts @@ -12,30 +12,30 @@ import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; */ export class UmbDocumentBlueprintStore extends UmbStoreBase { // TODO: use the right type: - #data = new ArrayState([], (x) => x.key); + #data = new ArrayState([], (x) => x.id); constructor(host: UmbControllerHostElement) { super(host, UMB_DOCUMENT_BLUEPRINT_STORE_CONTEXT_TOKEN.toString()); } /** - * @description - Request a Data Type by key. The Data Type is added to the store and is returned as an Observable. - * @param {string} key + * @description - Request a Data Type by id. The Data Type is added to the store and is returned as an Observable. + * @param {string} id * @return {*} {(Observable)} * @memberof UmbDocumentBlueprintStore */ - getByKey(key: string) { + getById(id: string) { // TODO: use backend cli when available. - fetch(`/umbraco/management/api/v1/document-blueprint/details/${key}`) + fetch(`/umbraco/management/api/v1/document-blueprint/details/${id}`) .then((res) => res.json()) .then((data) => { this.#data.append(data); }); - return this.#data.getObservablePart((documents) => documents.find((document) => document.key === key)); + return this.#data.getObservablePart((documents) => documents.find((document) => document.id === id)); } - getScaffold(entityType: string, parentKey: string | null) { + getScaffold(entityType: string, parentId: string | null) { return {} as DocumentBlueprintDetails; } @@ -75,21 +75,21 @@ export class UmbDocumentBlueprintStore extends UmbStoreBase { // TODO: How can we avoid having this in both stores? /** * @description - Delete a Data Type. - * @param {string[]} keys + * @param {string[]} ids * @memberof UmbDocumentBlueprintStore * @return {*} {Promise} */ - async delete(keys: string[]) { + async delete(ids: string[]) { // TODO: use backend cli when available. await fetch('/umbraco/backoffice/document-blueprint/delete', { method: 'POST', - body: JSON.stringify(keys), + body: JSON.stringify(ids), headers: { 'Content-Type': 'application/json', }, }); - this.#data.remove(keys); + this.#data.remove(ids); } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/modals/allowed-document-types/allowed-document-types-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/modals/allowed-document-types/allowed-document-types-modal.element.ts index ff55e6dfc3..41f8b961b5 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/modals/allowed-document-types/allowed-document-types-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/modals/allowed-document-types/allowed-document-types-modal.element.ts @@ -21,9 +21,9 @@ export class UmbAllowedDocumentTypesModalElement extends UmbModalBaseElement< async firstUpdated() { // TODO: show error - if (!this.data?.key) return; + if (!this.data?.id) return; - const { data } = await this.#documentTypeRepository.requestAllowedChildTypesOf(this.data.key); + const { data } = await this.#documentTypeRepository.requestAllowedChildTypesOf(this.data.id); if (data) { this._allowedDocumentTypes = data; @@ -37,8 +37,8 @@ export class UmbAllowedDocumentTypesModalElement extends UmbModalBaseElement< #onClick(event: PointerEvent) { event.stopPropagation(); const target = event.target as HTMLButtonElement; - const documentTypeKey = target.dataset.key; - if (!documentTypeKey) throw new Error('No document type key found'); + const documentTypeKey = target.dataset.id; + if (!documentTypeKey) throw new Error('No document type id found'); this.modalHandler?.submit({ documentTypeKey }); } @@ -50,7 +50,7 @@ export class UmbAllowedDocumentTypesModalElement extends UmbModalBaseElement< ${this._allowedDocumentTypes.map( (item) => html` - + ${item.icon ? html`` : nothing} ` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/document-type.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/document-type.repository.ts index 14494da134..78c9ac203c 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/document-type.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/document-type.repository.ts @@ -60,34 +60,34 @@ export class UmbDocumentTypeRepository implements UmbTreeRepository, U return { data, error, asObservable: () => this.#treeStore!.rootItems }; } - async requestTreeItemsOf(parentKey: string | null) { + async requestTreeItemsOf(parentId: string | null) { await this.#init; - if (!parentKey) { - const error: ProblemDetailsModel = { title: 'Parent key is missing' }; + if (!parentId) { + const error: ProblemDetailsModel = { title: 'Parent id is missing' }; return { data: undefined, error }; } - const { data, error } = await this.#treeSource.getChildrenOf(parentKey); + const { data, error } = await this.#treeSource.getChildrenOf(parentId); if (data) { this.#treeStore?.appendItems(data.items); } - return { data, error, asObservable: () => this.#treeStore!.childrenOf(parentKey) }; + return { data, error, asObservable: () => this.#treeStore!.childrenOf(parentId) }; } - async requestTreeItems(keys: Array) { + async requestTreeItems(ids: Array) { await this.#init; - if (!keys) { - const error: ProblemDetailsModel = { title: 'Keys are missing' }; + if (!ids) { + const error: ProblemDetailsModel = { title: 'Ids are missing' }; return { data: undefined, error }; } - const { data, error } = await this.#treeSource.getItems(keys); + const { data, error } = await this.#treeSource.getItems(ids); - return { data, error, asObservable: () => this.#treeStore!.items(keys) }; + return { data, error, asObservable: () => this.#treeStore!.items(ids) }; } async rootTreeItems() { @@ -95,29 +95,29 @@ export class UmbDocumentTypeRepository implements UmbTreeRepository, U return this.#treeStore!.rootItems; } - async treeItemsOf(parentKey: string | null) { + async treeItemsOf(parentId: string | null) { await this.#init; - return this.#treeStore!.childrenOf(parentKey); + return this.#treeStore!.childrenOf(parentId); } - async treeItems(keys: Array) { + async treeItems(ids: Array) { await this.#init; - return this.#treeStore!.items(keys); + return this.#treeStore!.items(ids); } // DETAILS: - async createScaffold(parentKey: string | null) { - if (!parentKey) throw new Error('Parent key is missing'); + async createScaffold(parentId: string | null) { + if (!parentId) throw new Error('Parent id is missing'); await this.#init; - return this.#detailDataSource.createScaffold(parentKey); + return this.#detailDataSource.createScaffold(parentId); } - async requestByKey(key: string) { - if (!key) throw new Error('Key is missing'); + async requestById(id: string) { + if (!id) throw new Error('Id is missing'); await this.#init; - const { data, error } = await this.#detailDataSource.get(key); + const { data, error } = await this.#detailDataSource.get(id); if (data) { this.#detailStore?.append(data); @@ -126,23 +126,23 @@ export class UmbDocumentTypeRepository implements UmbTreeRepository, U return { data, error }; } - async byKey(key: string) { - if (!key) throw new Error('Key is missing'); + async byId(id: string) { + if (!id) throw new Error('Id is missing'); await this.#init; - return this.#detailStore!.byKey(key); + return this.#detailStore!.byId(id); } // TODO: we need to figure out where to put this - async requestAllowedChildTypesOf(key: string) { - if (!key) throw new Error('Key is missing'); + async requestAllowedChildTypesOf(id: string) { + if (!id) throw new Error('Id is missing'); await this.#init; - return this.#detailDataSource.getAllowedChildrenOf(key); + return this.#detailDataSource.getAllowedChildrenOf(id); } // Could potentially be general methods: async create(template: ItemType) { - if (!template || !template.key) throw new Error('Template is missing'); + if (!template || !template.id) throw new Error('Template is missing'); await this.#init; const { error } = await this.#detailDataSource.insert(template); @@ -160,22 +160,24 @@ export class UmbDocumentTypeRepository implements UmbTreeRepository, U return { error }; } - async save(item: ItemType) { - if (!item || !item.key) throw new Error('Document-Type is missing'); + async save(id: string, item: any) { + if (!id) throw new Error('Id is missing'); + if (!item) throw new Error('Item is missing'); + await this.#init; - const { error } = await this.#detailDataSource.update(item.key, item); + const { error } = await this.#detailDataSource.update(id, item); if (!error) { - const notification = { data: { message: `Document saved` } }; - this.#notificationContext?.peek('positive', notification); - // TODO: we currently don't use the detail store for anything. // Consider to look up the data before fetching from the server // Consider notify a workspace if a template is updated in the store while someone is editing it. this.#detailStore?.append(item); - this.#treeStore?.updateItem(item.key, { name: item.name }); + this.#treeStore?.updateItem(id, item); // TODO: would be nice to align the stores on methods/methodNames. + + const notification = { data: { message: `Document Type saved` } }; + this.#notificationContext?.peek('positive', notification); } return { error }; @@ -183,11 +185,11 @@ export class UmbDocumentTypeRepository implements UmbTreeRepository, U // General: - async delete(key: string) { - if (!key) throw new Error('Document key is missing'); + async delete(id: string) { + if (!id) throw new Error('Document id is missing'); await this.#init; - const { error } = await this.#detailDataSource.delete(key); + const { error } = await this.#detailDataSource.delete(id); if (!error) { const notification = { data: { message: `Document deleted` } }; @@ -196,8 +198,8 @@ export class UmbDocumentTypeRepository implements UmbTreeRepository, U // TODO: we currently don't use the detail store for anything. // Consider to look up the data before fetching from the server. // Consider notify a workspace if a template is deleted from the store while someone is editing it. - this.#detailStore?.remove([key]); - this.#treeStore?.removeItem(key); + this.#detailStore?.remove([id]); + this.#treeStore?.removeItem(id); // TODO: would be nice to align the stores on methods/methodNames. } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/document-type.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/document-type.store.ts index f8b258866d..23b64c0942 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/document-type.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/document-type.store.ts @@ -11,7 +11,7 @@ import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; * @description - Data Store for Document Types */ export class UmbDocumentTypeStore extends UmbStoreBase { - #data = new ArrayState([], (x) => x.key); + #data = new ArrayState([], (x) => x.id); /** * Creates an instance of UmbDocumentTypeStore. @@ -36,8 +36,8 @@ export class UmbDocumentTypeStore extends UmbStoreBase { * @param {DocumentTypeModel} document * @memberof UmbDocumentTypeStore */ - byKey(key: DocumentTypeResponseModel['key']) { - return this.#data.getObservablePart((x) => x.find((y) => y.key === key)); + byId(id: DocumentTypeResponseModel['id']) { + return this.#data.getObservablePart((x) => x.find((y) => y.id === id)); } /** @@ -45,7 +45,7 @@ export class UmbDocumentTypeStore extends UmbStoreBase { * @param {string[]} uniques * @memberof UmbDocumentTypeStore */ - remove(uniques: Array) { + remove(uniques: Array) { this.#data.remove(uniques); } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/sources/document-type.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/sources/document-type.server.data.ts index 561d27c049..f6bff744b2 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/sources/document-type.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/sources/document-type.server.data.ts @@ -26,32 +26,32 @@ export class UmbDocumentTypeServerDataSource implements UmbDataSource( this.#host, - fetch(`/umbraco/management/api/v1/document-type/${document.key}`, { + fetch(`/umbraco/management/api/v1/document-type/${document.id}`, { method: 'PUT', body: body, headers: { @@ -127,13 +127,13 @@ export class UmbDocumentTypeServerDataSource implements UmbDataSource) { + async trashItems(ids: Array) { // TODO: use backend cli when available. return tryExecuteAndNotify( this.#host, fetch('/umbraco/management/api/v1/document-type/trash', { method: 'POST', - body: JSON.stringify(keys), + body: JSON.stringify(ids), headers: { 'Content-Type': 'application/json', }, @@ -27,13 +27,13 @@ export class DocumentTypeTreeServerDataSource implements UmbTreeDataSource { ); } - async moveItems(keys: Array, destination: string) { + async moveItems(ids: Array, destination: string) { // TODO: use backend cli when available. return tryExecuteAndNotify( this.#host, fetch('/umbraco/management/api/v1/document-type/move', { method: 'POST', - body: JSON.stringify({ keys, destination }), + body: JSON.stringify({ ids: ids, destination }), headers: { 'Content-Type': 'application/json', }, @@ -60,41 +60,41 @@ export class DocumentTypeTreeServerDataSource implements UmbTreeDataSource { } /** - * Fetches the children of a given parent key from the server - * @param {(string | null)} parentKey + * Fetches the children of a given parent id from the server + * @param {(string | null)} parentId * @return {*} * @memberof DocumentTreeServerDataSource */ - async getChildrenOf(parentKey: string | null) { - if (!parentKey) { - const error: ProblemDetailsModel = { title: 'Parent key is missing' }; + async getChildrenOf(parentId: string | null) { + if (!parentId) { + const error: ProblemDetailsModel = { title: 'Parent id is missing' }; return { error }; } return tryExecuteAndNotify( this.#host, DocumentTypeResource.getTreeDocumentTypeChildren({ - parentKey, + parentId, }) ); } /** - * Fetches the items for the given keys from the server - * @param {Array} keys + * Fetches the items for the given ids from the server + * @param {Array} ids * @return {*} * @memberof DocumentTreeServerDataSource */ - async getItems(keys: Array) { - if (keys) { + async getItems(ids: Array) { + if (ids) { const error: ProblemDetailsModel = { title: 'Keys are missing' }; return { error }; } return tryExecuteAndNotify( this.#host, - DocumentTypeResource.getTreeDocumentTypeItem({ - key: keys, + DocumentTypeResource.getDocumentTypeItem({ + id: ids, }) ); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace-editor.element.ts index ebb3b26d47..21d8c3e526 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace-editor.element.ts @@ -2,7 +2,7 @@ import { UUIInputElement, UUIInputEvent } from '@umbraco-ui/uui'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { css, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; -import { UmbWorkspaceDocumentTypeContext } from './document-type-workspace.context'; +import { UmbDocumentTypeWorkspaceContext } from './document-type-workspace.context'; import type { DocumentTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN, UMB_ICON_PICKER_MODAL } from '@umbraco-cms/backoffice/modal'; @@ -32,7 +32,9 @@ export class UmbDocumentTypeWorkspaceEditorElement extends UmbLitElement { } #alias { - padding: 0 var(--uui-size-space-3); + height: calc(100% - 2px); + --uui-input-border-width: 0; + --uui-button-height: calc(100% -2px); } #icon { @@ -48,7 +50,7 @@ export class UmbDocumentTypeWorkspaceEditorElement extends UmbLitElement { name: 'umb:document-dashed-line', }; - #workspaceContext?: UmbWorkspaceDocumentTypeContext; + #workspaceContext?: UmbDocumentTypeWorkspaceContext; //@state() //private _documentType?: DocumentTypeResponseModel; @@ -64,7 +66,7 @@ export class UmbDocumentTypeWorkspaceEditorElement extends UmbLitElement { super(); this.consumeContext(UMB_ENTITY_WORKSPACE_CONTEXT, (instance) => { - this.#workspaceContext = instance as UmbWorkspaceDocumentTypeContext; + this.#workspaceContext = instance as UmbDocumentTypeWorkspaceContext; this.#observeDocumentType(); }); @@ -76,10 +78,12 @@ export class UmbDocumentTypeWorkspaceEditorElement extends UmbLitElement { #observeDocumentType() { if (!this.#workspaceContext) return; //this.observe(this.#workspaceContext.data, (data) => (this._documentType = data)); + this.observe(this.#workspaceContext.name, (name) => (this._name = name)); + this.observe(this.#workspaceContext.alias, (alias) => (this._alias = alias)); } // TODO. find a way where we don't have to do this for all workspaces. - private _handleInput(event: UUIInputEvent) { + private _handleNameInput(event: UUIInputEvent) { if (event instanceof UUIInputEvent) { const target = event.composedPath()[0] as UUIInputElement; @@ -89,6 +93,18 @@ export class UmbDocumentTypeWorkspaceEditorElement extends UmbLitElement { } } + // TODO. find a way where we don't have to do this for all workspaces. + private _handleAliasInput(event: UUIInputEvent) { + if (event instanceof UUIInputEvent) { + const target = event.composedPath()[0] as UUIInputElement; + + if (typeof target?.value === 'string') { + this.#workspaceContext?.setAlias(target.value); + } + } + event.stopPropagation(); + } + private async _handleIconClick() { const modalHandler = this._modalContext?.open(UMB_ICON_PICKER_MODAL); @@ -106,8 +122,9 @@ export class UmbDocumentTypeWorkspaceEditorElement extends UmbLitElement { - -
${this._alias}
+ +
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace.context.ts index 7d6ddd92d3..4ee41fc2b7 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace.context.ts @@ -1,18 +1,36 @@ import { UmbWorkspaceContext } from '../../../shared/components/workspace/workspace-context/workspace-context'; import { UmbDocumentTypeRepository } from '../repository/document-type.repository'; -import { UmbWorkspacePropertyStructureManager } from '../../../shared/components/workspace/workspace-context/workspace-property-structure-manager.class'; +import { UmbWorkspacePropertyStructureManager } from '../../../shared/components/workspace/workspace-context/workspace-structure-manager.class'; import { UmbEntityWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; import type { DocumentTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; type EntityType = DocumentTypeResponseModel; -export class UmbWorkspaceDocumentTypeContext +export class UmbDocumentTypeWorkspaceContext extends UmbWorkspaceContext implements UmbEntityWorkspaceContextInterface { // Draft is located in structure manager + + // General for content types: readonly data; readonly name; + readonly alias; + readonly description; + readonly icon; + + // TODO: Consider if each of these should go the view it self, but only if its used in that one view, otherwise make then go here. + readonly allowedAsRoot; + readonly variesByCulture; + readonly variesBySegment; + readonly isElement; + readonly allowedContentTypes; + readonly compositions; + + // Document type specific: + readonly allowedTemplateIds; + readonly defaultTemplateId; + readonly cleanup; readonly structure; @@ -20,20 +38,36 @@ export class UmbWorkspaceDocumentTypeContext super(host, new UmbDocumentTypeRepository(host)); this.structure = new UmbWorkspacePropertyStructureManager(this.host, this.repository); + + // General for content types: this.data = this.structure.rootDocumentType; this.name = this.structure.rootDocumentTypeObservablePart((data) => data?.name); + this.alias = this.structure.rootDocumentTypeObservablePart((data) => data?.alias); + this.description = this.structure.rootDocumentTypeObservablePart((data) => data?.description); + this.icon = this.structure.rootDocumentTypeObservablePart((data) => data?.icon); + this.allowedAsRoot = this.structure.rootDocumentTypeObservablePart((data) => data?.allowedAsRoot); + this.variesByCulture = this.structure.rootDocumentTypeObservablePart((data) => data?.variesByCulture); + this.variesBySegment = this.structure.rootDocumentTypeObservablePart((data) => data?.variesBySegment); + this.isElement = this.structure.rootDocumentTypeObservablePart((data) => data?.isElement); + this.allowedContentTypes = this.structure.rootDocumentTypeObservablePart((data) => data?.allowedContentTypes); + this.compositions = this.structure.rootDocumentTypeObservablePart((data) => data?.compositions); + + // Document type specific: + this.allowedTemplateIds = this.structure.rootDocumentTypeObservablePart((data) => data?.allowedTemplateIds); + this.defaultTemplateId = this.structure.rootDocumentTypeObservablePart((data) => data?.defaultTemplateId); + this.cleanup = this.structure.rootDocumentTypeObservablePart((data) => data?.defaultTemplateId); } public setPropertyValue(alias: string, value: unknown) { - throw new Error('setPropertyValue is not implemented for UmbWorkspaceDocumentTypeContext'); + throw new Error('setPropertyValue is not implemented for UmbDocumentTypeWorkspaceContext'); } getData() { return this.structure.getRootDocumentType() || {}; } - getEntityKey() { - return this.getData().key; + getEntityId() { + return this.getData().id; } getEntityType() { @@ -43,14 +77,17 @@ export class UmbWorkspaceDocumentTypeContext setName(name: string) { this.structure.updateRootDocumentType({ name }); } + setAlias(alias: string) { + this.structure.updateRootDocumentType({ alias }); + } // TODO => manage setting icon color setIcon(icon: string) { this.structure.updateRootDocumentType({ icon }); } - async createScaffold(documentTypeKey: string) { - const { data } = await this.structure.createScaffold(documentTypeKey); + async createScaffold(parentId: string) { + const { data } = await this.structure.createScaffold(parentId); if (!data) return undefined; this.setIsNew(true); @@ -58,8 +95,8 @@ export class UmbWorkspaceDocumentTypeContext return data || undefined; } - async load(entityKey: string) { - const { data } = await this.structure.loadType(entityKey); + async load(entityId: string) { + const { data } = await this.structure.loadType(entityId); if (!data) return undefined; this.setIsNew(false); @@ -68,7 +105,9 @@ export class UmbWorkspaceDocumentTypeContext } async save() { - this.repository.save(this.getData()); + const id = this.getEntityId(); + if (!id) throw new Error('Cannot save entity without id'); + this.repository.save(id, this.getData()); } public destroy(): void { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace.element.ts index 28748e430c..78b74edc56 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace.element.ts @@ -1,26 +1,26 @@ import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; -import { UmbWorkspaceDocumentTypeContext } from './document-type-workspace.context'; +import { UmbDocumentTypeWorkspaceContext } from './document-type-workspace.context'; import { UmbDocumentTypeWorkspaceEditorElement } from './document-type-workspace-editor.element'; -import { IRoutingInfo } from '@umbraco-cms/internal/router'; +import type { IRoute } from '@umbraco-cms/backoffice/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-document-type-workspace') export class UmbDocumentTypeWorkspaceElement extends UmbLitElement { static styles = [UUITextStyles]; - #workspaceContext = new UmbWorkspaceDocumentTypeContext(this); + #workspaceContext = new UmbDocumentTypeWorkspaceContext(this); #element = new UmbDocumentTypeWorkspaceEditorElement(); @state() - _routes = [ + _routes: IRoute[] = [ { - path: 'edit/:key', + path: 'edit/:id', component: () => this.#element, - setup: (component: HTMLElement, info: IRoutingInfo) => { - const key = info.match.params.key; - this.#workspaceContext.load(key); + setup: (_component, info) => { + const id = info.match.params.id; + this.#workspaceContext.load(id); }, }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace.stories.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace.stories.ts index 872198dd8d..bf851ab301 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace.stories.ts @@ -12,5 +12,5 @@ export default { } as Meta; export const AAAOverview: Story = () => - html` `; + html` `; AAAOverview.storyName = 'Overview'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/manifests.ts index 3baf28c927..37e4baa850 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/manifests.ts @@ -20,7 +20,7 @@ const workspaceViews: Array = [ type: 'workspaceView', alias: 'Umb.WorkspaceView.DocumentType.Design', name: 'Document Type Workspace Design View', - loader: () => import('./views/design/document-type-workspace-view-design.element'), + loader: () => import('./views/design/document-type-workspace-view-edit.element'), weight: 1000, meta: { label: 'Design', diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/design/document-type-workspace-view-design.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/design/document-type-workspace-view-design.element.ts index 9266050fbe..5f7c657b58 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/design/document-type-workspace-view-design.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/design/document-type-workspace-view-design.element.ts @@ -2,9 +2,8 @@ import { css, html } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, state } from 'lit/decorators.js'; import { repeat } from 'lit/directives/repeat.js'; -import { UmbWorkspaceDocumentTypeContext } from '../../document-type-workspace.context'; +import { UmbDocumentTypeWorkspaceContext } from '../../document-type-workspace.context'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import type { DocumentTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; import '../../../../../shared/property-creator/property-creator.element.ts'; import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-api'; @@ -78,7 +77,7 @@ export class UmbDocumentTypeWorkspaceViewDesignElement extends UmbLitElement { `, ]; - private _workspaceContext?: UmbWorkspaceDocumentTypeContext; + private _workspaceContext?: UmbDocumentTypeWorkspaceContext; @state() private _tabs: any[] = []; @@ -88,7 +87,7 @@ export class UmbDocumentTypeWorkspaceViewDesignElement extends UmbLitElement { // TODO: Figure out if this is the best way to consume the context or if it can be strongly typed with an UmbContextToken this.consumeContext(UMB_ENTITY_WORKSPACE_CONTEXT, (documentTypeContext) => { - this._workspaceContext = documentTypeContext as UmbWorkspaceDocumentTypeContext; + this._workspaceContext = documentTypeContext as UmbDocumentTypeWorkspaceContext; this._observeDocumentType(); }); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/design/document-type-workspace-view-edit-properties.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/design/document-type-workspace-view-edit-properties.element.ts new file mode 100644 index 0000000000..73eea4e334 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/design/document-type-workspace-view-edit-properties.element.ts @@ -0,0 +1,130 @@ +import { css, html } from 'lit'; +import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; +import { customElement, property, state } from 'lit/decorators.js'; +import { repeat } from 'lit/directives/repeat.js'; +import { UmbWorkspacePropertyStructureHelper } from '../../../../../shared/components/workspace/workspace-context/workspace-property-structure-helper.class'; +import { PropertyContainerTypes } from '../../../../../shared/components/workspace/workspace-context/workspace-structure-manager.class'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import { DocumentTypePropertyTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import { UMB_MODAL_CONTEXT_TOKEN, UMB_PROPERTY_SETTINGS_MODAL } from '@umbraco-cms/backoffice/modal'; +import './document-type-workspace-view-edit-property.element'; + +@customElement('umb-document-type-workspace-view-edit-properties') +export class UmbDocumentTypeWorkspaceViewEditPropertiesElement extends UmbLitElement { + private _containerId: string | undefined; + + public get containerId(): string | undefined { + return this._containerId; + } + public set containerId(value: string | undefined) { + if (value === this._containerId) return; + const oldValue = this._containerId; + this._containerId = value; + this.requestUpdate('containerId', oldValue); + } + + @property({ type: String, attribute: 'container-name', reflect: false }) + public get containerName(): string | undefined { + return this._propertyStructureHelper.getContainerName(); + } + public set containerName(value: string | undefined) { + this._propertyStructureHelper.setContainerName(value); + } + + @property({ type: String, attribute: 'container-type', reflect: false }) + public get containerType(): PropertyContainerTypes | undefined { + return this._propertyStructureHelper.getContainerType(); + } + public set containerType(value: PropertyContainerTypes | undefined) { + this._propertyStructureHelper.setContainerType(value); + } + + _propertyStructureHelper = new UmbWorkspacePropertyStructureHelper(this); + + @state() + _propertyStructure: Array = []; + + #modalContext?: typeof UMB_MODAL_CONTEXT_TOKEN.TYPE; + + constructor() { + super(); + + this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (instance) => (this.#modalContext = instance)); + this.observe(this._propertyStructureHelper.propertyStructure, (propertyStructure) => { + this._propertyStructure = propertyStructure; + }); + } + + async #onAddProperty() { + const property = await this._propertyStructureHelper.addProperty(this._containerId); + if (!property) return; + + // Take id and parse to modal: + console.log('property id:', property.id!); + + const modalHandler = this.#modalContext?.open(UMB_PROPERTY_SETTINGS_MODAL); + + modalHandler?.onSubmit().then((result) => { + console.log(result); + }); + } + + render() { + return html`${repeat( + this._propertyStructure, + (property) => property.alias, + (property) => + html` { + this._propertyStructureHelper.partialUpdateProperty(property.id, event.detail); + }}>` + )} Add property `; + } + + static styles = [ + UUITextStyles, + css` + .property:first-of-type { + padding-top: 0; + } + .property { + border-bottom: 1px solid var(--uui-color-divider); + } + .property:last-child { + border-bottom: 0; + } + + .property { + display: grid; + grid-template-columns: 200px auto; + column-gap: var(--uui-size-layout-2); + border-bottom: 1px solid var(--uui-color-divider); + padding: var(--uui-size-layout-1) 0; + container-type: inline-size; + } + + .property > div { + grid-column: span 2; + } + + @container (width > 600px) { + .property:not([orientation='vertical']) > div { + grid-column: span 1; + } + } + + #add { + width: 100%; + } + `, + ]; +} + +export default UmbDocumentTypeWorkspaceViewEditPropertiesElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-document-type-workspace-view-edit-properties': UmbDocumentTypeWorkspaceViewEditPropertiesElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/design/document-type-workspace-view-edit-property.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/design/document-type-workspace-view-edit-property.element.ts new file mode 100644 index 0000000000..45fad85fcb --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/design/document-type-workspace-view-edit-property.element.ts @@ -0,0 +1,106 @@ +import { css, html, LitElement } from 'lit'; +import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; +import { customElement, property } from 'lit/decorators.js'; +import { PropertyTypeResponseModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; + +/** + * @element document-type-workspace-view-edit-property + * @description - Element for displaying a property in an workspace. + * @slot editor - Slot for rendering the Property Editor + */ +@customElement('document-type-workspace-view-edit-property') +export class UmbDocumentTypeWorkspacePropertyElement extends LitElement { + /** + * Property, the data object for the property. + * @type {string} + * @attr + * @default '' + */ + @property({ type: Object }) + public property?: PropertyTypeResponseModelBaseModel; + + _firePartialUpdate(propertyName: string, value: string | number | boolean | null | undefined) { + const partialObject = {} as any; + partialObject[propertyName] = value; + + this.dispatchEvent(new CustomEvent('partial-property-update', { detail: partialObject })); + } + + render() { + // TODO: Only show alias on label if user has access to DocumentType within settings: + return this.property + ? html` + +
+ ` + : ''; + } + + static styles = [ + UUITextStyles, + css` + :host { + display: grid; + grid-template-columns: 200px auto; + column-gap: var(--uui-size-layout-2); + border-bottom: 1px solid var(--uui-color-divider); + padding: var(--uui-size-layout-1) 0; + container-type: inline-size; + } + + :host > div { + grid-column: span 2; + } + + @container (width > 600px) { + :host(:not([orientation='vertical'])) > div { + grid-column: span 1; + } + } + + :host(:last-of-type) { + border-bottom: none; + } + + :host-context(umb-variantable-property:first-of-type) { + padding-top: 0; + } + + p { + margin-bottom: 0; + } + + #header { + position: sticky; + top: var(--uui-size-space-4); + height: min-content; + z-index: 2; + } + `, + ]; +} + +declare global { + interface HTMLElementTagNameMap { + 'document-type-workspace-view-edit-property': UmbDocumentTypeWorkspacePropertyElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/design/document-type-workspace-view-edit-tab.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/design/document-type-workspace-view-edit-tab.element.ts new file mode 100644 index 0000000000..51782de0b7 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/design/document-type-workspace-view-edit-tab.element.ts @@ -0,0 +1,115 @@ +import { css, html } from 'lit'; +import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; +import { customElement, property, state } from 'lit/decorators.js'; +import { repeat } from 'lit/directives/repeat.js'; +import { UmbWorkspaceContainerStructureHelper } from '../../../../../shared/components/workspace/workspace-context/workspace-container-structure-helper.class'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import { PropertyTypeContainerResponseModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; +import './document-type-workspace-view-edit-properties.element'; + +@customElement('umb-document-type-workspace-view-edit-tab') +export class UmbDocumentTypeWorkspaceViewEditTabElement extends UmbLitElement { + static styles = [ + UUITextStyles, + css` + uui-box { + margin: var(--uui-size-layout-1); + } + + #add { + width: 100%; + } + `, + ]; + + private _ownerTabId?: string | undefined; + + @property({ type: String }) + public get ownerTabId(): string | undefined { + return this._ownerTabId; + } + public set ownerTabId(value: string | undefined) { + if (value === this._ownerTabId) return; + const oldValue = this._ownerTabId; + this._ownerTabId = value; + this.requestUpdate('ownerTabId', oldValue); + } + + private _tabName?: string | undefined; + + @property({ type: String }) + public get tabName(): string | undefined { + return this._groupStructureHelper.getName(); + } + public set tabName(value: string | undefined) { + if (value === this._tabName) return; + const oldValue = this._tabName; + this._tabName = value; + this._groupStructureHelper.setName(value); + this.requestUpdate('tabName', oldValue); + } + + @property({ type: Boolean }) + public get noTabName(): boolean { + return this._groupStructureHelper.getIsRoot(); + } + public set noTabName(value: boolean) { + this._groupStructureHelper.setIsRoot(value); + } + + _groupStructureHelper = new UmbWorkspaceContainerStructureHelper(this); + + @state() + _groups: Array = []; + + @state() + _hasProperties = false; + + constructor() { + super(); + + this.observe(this._groupStructureHelper.containers, (groups) => { + this._groups = groups; + }); + this.observe(this._groupStructureHelper.hasProperties, (hasProperties) => { + this._hasProperties = hasProperties; + }); + } + + #onAddGroup = () => { + // Idea, maybe we can gather the sortOrder from the last group rendered and add 1 to it? + this._groupStructureHelper.addGroup(this._ownerTabId); + }; + + render() { + return html` + ${this._hasProperties + ? html` + + + + ` + : ''} + ${repeat( + this._groups, + (group) => group.name, + (group) => html` + + ` + )} + Add Group + `; + } +} + +export default UmbDocumentTypeWorkspaceViewEditTabElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-document-type-workspace-view-edit-tab': UmbDocumentTypeWorkspaceViewEditTabElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/design/document-type-workspace-view-edit.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/design/document-type-workspace-view-edit.element.ts new file mode 100644 index 0000000000..b09416588d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/design/document-type-workspace-view-edit.element.ts @@ -0,0 +1,209 @@ +import { css, html } from 'lit'; +import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; +import { customElement, state } from 'lit/decorators.js'; +import { repeat } from 'lit/directives/repeat.js'; +import { UmbDocumentTypeWorkspaceContext } from '../../document-type-workspace.context'; +import { UmbWorkspaceContainerStructureHelper } from '../../../../../shared/components/workspace/workspace-context/workspace-container-structure-helper.class'; +import type { UmbDocumentTypeWorkspaceViewEditTabElement } from './document-type-workspace-view-edit-tab.element'; +import type { UmbRouterSlotChangeEvent, UmbRouterSlotInitEvent } from '@umbraco-cms/internal/router'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import { PropertyTypeContainerResponseModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; +import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-api'; +import type { IRoute } from '@umbraco-cms/backoffice/router'; + +@customElement('umb-document-type-workspace-view-edit') +export class UmbDocumentTypeWorkspaceViewEditElement extends UmbLitElement { + static styles = [ + UUITextStyles, + css` + :host { + display: block; + --uui-tab-background: var(--uui-color-surface); + } + + /* TODO: This should be replaced with a general workspace bar — naming is hard */ + #workspace-tab-bar { + padding: 0 var(--uui-size-layout-1); + display: flex; + align-items: center; + justify-content: space-between; + background-color: var(--uui-color-surface); + flex-wrap: nowrap; + } + `, + ]; + + //private _hasRootProperties = false; + private _hasRootGroups = false; + + @state() + private _routes: IRoute[] = []; + + @state() + _tabs: Array = []; + + @state() + private _routerPath?: string; + + @state() + private _activePath = ''; + + private _workspaceContext?: UmbDocumentTypeWorkspaceContext; + + private _tabsStructureHelper = new UmbWorkspaceContainerStructureHelper(this); + + constructor() { + super(); + + this._tabsStructureHelper.setIsRoot(true); + this._tabsStructureHelper.setContainerChildType('Tab'); + this.observe(this._tabsStructureHelper.containers, (tabs) => { + this._tabs = tabs; + this._createRoutes(); + }); + + // _hasRootProperties can be gotten via _tabsStructureHelper.hasProperties. But we do not support root properties currently. + + this.consumeContext(UMB_ENTITY_WORKSPACE_CONTEXT, (workspaceContext) => { + this._workspaceContext = workspaceContext as UmbDocumentTypeWorkspaceContext; + this._observeRootGroups(); + }); + } + + private _observeRootGroups() { + if (!this._workspaceContext) return; + + this.observe( + this._workspaceContext.structure.hasRootContainers('Group'), + (hasRootGroups) => { + this._hasRootGroups = hasRootGroups; + this._createRoutes(); + }, + '_observeGroups' + ); + } + + private _createRoutes() { + const routes: IRoute[] = []; + + if (this._tabs.length > 0) { + this._tabs?.forEach((tab) => { + const tabName = tab.name; + routes.push({ + path: `tab/${encodeURI(tabName || '').toString()}`, + component: () => import('./document-type-workspace-view-edit-tab.element'), + setup: (component) => { + (component as UmbDocumentTypeWorkspaceViewEditTabElement).tabName = tabName ?? ''; + (component as UmbDocumentTypeWorkspaceViewEditTabElement).ownerTabId = tab.id; + }, + }); + }); + } + + if (this._hasRootGroups) { + routes.push({ + path: '', + component: () => import('./document-type-workspace-view-edit-tab.element'), + setup: (component) => { + (component as UmbDocumentTypeWorkspaceViewEditTabElement).noTabName = true; + }, + }); + } + + if (routes.length !== 0) { + routes.push({ + path: '**', + redirectTo: routes[0]?.path, + }); + } + + this._routes = routes; + } + + #remove(tabId: string | undefined) { + if (!tabId) return; + this._workspaceContext?.structure.removeContainer(null, tabId); + } + async #addTab() { + this._workspaceContext?.structure.createContainer(null, null, 'Tab'); + } + + renderTabsNavigation() { + return html` + ${this._hasRootGroups + ? html` + Content + ` + : ''} + ${repeat( + this._tabs, + (tab) => tab.id, + (tab) => { + // TODO: make better url folder name: + const path = this._routerPath + '/tab/' + encodeURI(tab.name || ''); + return html` + ${path === this._activePath + ? html` + + this.#remove(tab.id)} + compact> + + + ` + : tab.name} + `; + } + )} + + + Add tab + + `; + } + + renderActions() { + return html`
+ + + Compositions + + + + Recorder + +
`; + } + + render() { + return html` +
${this._routerPath ? this.renderTabsNavigation() : ''}${this.renderActions()}
+ + { + this._routerPath = event.target.absoluteRouterPath; + }} + @change=${(event: UmbRouterSlotChangeEvent) => { + this._activePath = event.target.absoluteActiveViewPath || ''; + }}> + + `; + } +} + +export default UmbDocumentTypeWorkspaceViewEditElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-document-type-workspace-view-edit': UmbDocumentTypeWorkspaceViewEditElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/details/document-type-workspace-view-details.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/details/document-type-workspace-view-details.element.ts index 5e755d67d7..803fcf76a0 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/details/document-type-workspace-view-details.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/details/document-type-workspace-view-details.element.ts @@ -1,7 +1,7 @@ import { css, html } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, state } from 'lit/decorators.js'; -import { UmbWorkspaceDocumentTypeContext } from '../../document-type-workspace.context'; +import { UmbDocumentTypeWorkspaceContext } from '../../document-type-workspace.context'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import type { DocumentTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-api'; @@ -27,14 +27,14 @@ export class UmbDocumentTypeWorkspaceViewDetailsElement extends UmbLitElement { `, ]; - private _workspaceContext?: UmbWorkspaceDocumentTypeContext; + private _workspaceContext?: UmbDocumentTypeWorkspaceContext; constructor() { super(); // TODO: Figure out if this is the best way to consume the context or if it can be strongly typed with an UmbContextToken this.consumeContext(UMB_ENTITY_WORKSPACE_CONTEXT, (documentTypeContext) => { - this._workspaceContext = documentTypeContext as UmbWorkspaceDocumentTypeContext; + this._workspaceContext = documentTypeContext as UmbDocumentTypeWorkspaceContext; this._observeDocumentType(); }); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/structure/document-type-workspace-view-structure.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/structure/document-type-workspace-view-structure.element.ts index f7d3f88e5f..94ee23568c 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/structure/document-type-workspace-view-structure.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/structure/document-type-workspace-view-structure.element.ts @@ -1,7 +1,7 @@ import { css, html } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, state } from 'lit/decorators.js'; -import { UmbWorkspaceDocumentTypeContext } from '../../document-type-workspace.context'; +import { UmbDocumentTypeWorkspaceContext } from '../../document-type-workspace.context'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import type { DocumentTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-api'; @@ -27,14 +27,14 @@ export class UmbDocumentTypeWorkspaceViewStructureElement extends UmbLitElement `, ]; - private _workspaceContext?: UmbWorkspaceDocumentTypeContext; + private _workspaceContext?: UmbDocumentTypeWorkspaceContext; constructor() { super(); // TODO: Figure out if this is the best way to consume the context or if it can be strongly typed with an UmbContextToken this.consumeContext(UMB_ENTITY_WORKSPACE_CONTEXT, (documentTypeContext) => { - this._workspaceContext = documentTypeContext as UmbWorkspaceDocumentTypeContext; + this._workspaceContext = documentTypeContext as UmbDocumentTypeWorkspaceContext; this._observeDocumentType(); }); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/templates/document-type-workspace-view-templates.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/templates/document-type-workspace-view-templates.element.ts index 2cdbfc6392..8563844b9f 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/templates/document-type-workspace-view-templates.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/templates/document-type-workspace-view-templates.element.ts @@ -1,7 +1,7 @@ import { css, html } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement } from 'lit/decorators.js'; -import { UmbWorkspaceDocumentTypeContext } from '../../document-type-workspace.context'; +import { UmbDocumentTypeWorkspaceContext } from '../../document-type-workspace.context'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-api'; @@ -35,12 +35,12 @@ export class UmbDocumentTypeWorkspaceViewTemplatesElement extends UmbLitElement `, ]; - private _workspaceContext?: UmbWorkspaceDocumentTypeContext; + private _workspaceContext?: UmbDocumentTypeWorkspaceContext; constructor() { super(); this.consumeContext(UMB_ENTITY_WORKSPACE_CONTEXT, (documentTypeContext) => { - this._workspaceContext = documentTypeContext as UmbWorkspaceDocumentTypeContext; + this._workspaceContext = documentTypeContext as UmbDocumentTypeWorkspaceContext; this._observeDocumentType(); }); } @@ -49,13 +49,13 @@ export class UmbDocumentTypeWorkspaceViewTemplatesElement extends UmbLitElement if (!this._workspaceContext) return; } - async #changeDefaultKey(e: CustomEvent) { - // save new default key - console.log('workspace: default template key', e); + async #changeDefaultId(e: CustomEvent) { + // save new default id + console.log('workspace: default template id', e); } #changeAllowedKeys(e: CustomEvent) { - // save new allowed keys + // save new allowed ids console.log('workspace: allowed templates changed', e); } @@ -65,9 +65,9 @@ export class UmbDocumentTypeWorkspaceViewTemplatesElement extends UmbLitElement
Choose which templates editors are allowed to use on content of this type
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/collection/views/table/column-layouts/document-table-actions-column-layout.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/collection/views/table/column-layouts/document-table-actions-column-layout.element.ts index c5dd3bac32..a20182afe1 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/collection/views/table/column-layouts/document-table-actions-column-layout.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/collection/views/table/column-layouts/document-table-actions-column-layout.element.ts @@ -70,7 +70,7 @@ export class UmbDocumentTableActionColumnLayoutElement extends LitElement { + unique=${ifDefined(this.item.id)}> `; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/collection/views/table/document-table-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/collection/views/table/document-table-collection-view.element.ts index 5f63a23d34..ec3eef7b88 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/collection/views/table/document-table-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/collection/views/table/document-table-collection-view.element.ts @@ -96,10 +96,10 @@ export class UmbDocumentTableCollectionViewElement extends UmbLitElement { private _createTableItems(items: Array) { this._tableItems = items.map((item) => { - // TODO: use unique instead of key - if (!item.key) throw new Error('Item key is missing.'); + // TODO: use unique instead of id + if (!item.id) throw new Error('Item id is missing.'); return { - key: item.key, + id: item.id, icon: item.icon, data: [ { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-actions/create/create.action.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-actions/create/create.action.ts index 6994ebcabe..62a8480101 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-actions/create/create.action.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/entity-actions/create/create.action.ts @@ -24,16 +24,16 @@ export class UmbCreateDocumentEntityAction extends UmbEntityActionBase, UmbDe return { data, error, asObservable: () => this.#treeStore!.rootItems }; } - async requestTreeItemsOf(parentKey: string | null) { + async requestTreeItemsOf(parentId: string | null) { await this.#init; - if (!parentKey) { - const error: ProblemDetailsModel = { title: 'Parent key is missing' }; + if (!parentId) { + const error: ProblemDetailsModel = { title: 'Parent id is missing' }; return { data: undefined, error }; } - const { data, error } = await this.#treeSource.getChildrenOf(parentKey); + const { data, error } = await this.#treeSource.getChildrenOf(parentId); if (data) { this.#treeStore?.appendItems(data.items); } - return { data, error, asObservable: () => this.#treeStore!.childrenOf(parentKey) }; + return { data, error, asObservable: () => this.#treeStore!.childrenOf(parentId) }; } - async requestTreeItems(keys: Array) { + async requestTreeItems(ids: Array) { await this.#init; - if (!keys) { + if (!ids) { const error: ProblemDetailsModel = { title: 'Keys are missing' }; return { data: undefined, error }; } - const { data, error } = await this.#treeSource.getItems(keys); + const { data, error } = await this.#treeSource.getItems(ids); - return { data, error, asObservable: () => this.#treeStore!.items(keys) }; + return { data, error, asObservable: () => this.#treeStore!.items(ids) }; } async rootTreeItems() { @@ -99,34 +100,34 @@ export class UmbDocumentRepository implements UmbTreeRepository, UmbDe return this.#treeStore!.rootItems; } - async treeItemsOf(parentKey: string | null) { + async treeItemsOf(parentId: string | null) { await this.#init; - return this.#treeStore!.childrenOf(parentKey); + return this.#treeStore!.childrenOf(parentId); } - async treeItems(keys: Array) { + async treeItems(ids: Array) { await this.#init; - return this.#treeStore!.items(keys); + return this.#treeStore!.items(ids); } // DETAILS: async createScaffold(documentTypeKey: string) { - if (!documentTypeKey) throw new Error('Document type key is missing'); + if (!documentTypeKey) throw new Error('Document type id is missing'); await this.#init; return this.#detailDataSource.createScaffold(documentTypeKey); } - async requestByKey(key: string) { + async requestById(id: string) { await this.#init; - // TODO: should we show a notification if the key is missing? + // TODO: should we show a notification if the id is missing? // Investigate what is best for Acceptance testing, cause in that perspective a thrown error might be the best choice? - if (!key) { + if (!id) { const error: ProblemDetailsModel = { title: 'Key is missing' }; return { error }; } - const { data, error } = await this.#detailDataSource.get(key); + const { data, error } = await this.#detailDataSource.get(id); if (data) { this.#store?.append(data); @@ -136,11 +137,10 @@ export class UmbDocumentRepository implements UmbTreeRepository, UmbDe } // Could potentially be general methods: - - async create(item: CreateDocumentRequestModel & { key: string }) { + async create(item: CreateDocumentRequestModel & { id: string }) { await this.#init; - if (!item || !item.key) { + if (!item || !item.id) { throw new Error('Document is missing'); } @@ -159,61 +159,57 @@ export class UmbDocumentRepository implements UmbTreeRepository, UmbDe return { error }; } - async save(item: ItemType) { + async save(id: string, item: UpdateDocumentRequestModel) { + if (!id) throw new Error('Id is missing'); + if (!item) throw new Error('Item is missing'); + await this.#init; - if (!item || !item.key) { - throw new Error('Document is missing'); - } - - const { error } = await this.#detailDataSource.update(item.key, item); + const { error } = await this.#detailDataSource.update(id, item); if (!error) { + // TODO: we currently don't use the detail store for anything. + // Consider to look up the data before fetching from the server + // Consider notify a workspace if a document is updated in the store while someone is editing it. + this.#store?.append(item); + //this.#treeStore?.updateItem(item.id, { name: item.name });// Port data to tree store. + // TODO: would be nice to align the stores on methods/methodNames. + const notification = { data: { message: `Document saved` } }; this.#notificationContext?.peek('positive', notification); } - // TODO: we currently don't use the detail store for anything. - // Consider to look up the data before fetching from the server - // Consider notify a workspace if a document is updated in the store while someone is editing it. - this.#store?.append(item); - //this.#treeStore?.updateItem(item.key, { name: item.name });// Port data to tree store. - // TODO: would be nice to align the stores on methods/methodNames. - return { error }; } // General: - async delete(key: string) { + async delete(id: string) { + if (!id) throw new Error('Id is missing'); await this.#init; - if (!key) { - throw new Error('Document key is missing'); - } - - const { error } = await this.#detailDataSource.delete(key); + const { error } = await this.#detailDataSource.delete(id); if (!error) { + // TODO: we currently don't use the detail store for anything. + // Consider to look up the data before fetching from the server. + // Consider notify a workspace if a document is deleted from the store while someone is editing it. + // TODO: would be nice to align the stores on methods/methodNames. + this.#store?.remove([id]); + this.#treeStore?.removeItem(id); + const notification = { data: { message: `Document deleted` } }; this.#notificationContext?.peek('positive', notification); } - // TODO: we currently don't use the detail store for anything. - // Consider to look up the data before fetching from the server. - // Consider notify a workspace if a document is deleted from the store while someone is editing it. - this.#store?.remove([key]); - this.#treeStore?.removeItem(key); - // TODO: would be nice to align the stores on methods/methodNames. - return { error }; } // Listing all currently known methods we need to implement: // these currently only covers posting data // TODO: find a good way to split these - async trash(keys: Array) { - console.log('document trash: ' + keys); + async trash(ids: Array) { + console.log('document trash: ' + ids); alert('implement trash'); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.store.ts index f1f3ce7aaf..d53818f95e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.store.ts @@ -11,7 +11,7 @@ import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; * @description - Data Store for Template Details */ export class UmbDocumentStore extends UmbStoreBase { - #data = new ArrayState([], (x) => x.key); + #data = new ArrayState([], (x) => x.id); /** * Creates an instance of UmbDocumentDetailStore. @@ -36,8 +36,8 @@ export class UmbDocumentStore extends UmbStoreBase { * @param {DocumentModel} document * @memberof UmbDocumentStore */ - byKey(key: DocumentResponseModel['key']) { - return this.#data.getObservablePart((x) => x.find((y) => y.key === key)); + byKey(id: DocumentResponseModel['id']) { + return this.#data.getObservablePart((x) => x.find((y) => y.id === id)); } /** @@ -45,7 +45,7 @@ export class UmbDocumentStore extends UmbStoreBase { * @param {string[]} uniques * @memberof UmbDocumentDetailStore */ - remove(uniques: Array) { + remove(uniques: Array) { this.#data.remove(uniques); } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/sources/document.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/sources/document.server.data.ts index 83a93a9c1a..ae6a501479 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/sources/document.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/sources/document.server.data.ts @@ -32,37 +32,37 @@ export class UmbDocumentServerDataSource } /** - * Fetches a Document with the given key from the server - * @param {string} key + * Fetches a Document with the given id from the server + * @param {string} id * @return {*} * @memberof UmbDocumentServerDataSource */ - async get(key: string) { - if (!key) { + async get(id: string) { + if (!id) { const error: ProblemDetailsModel = { title: 'Key is missing' }; return { error }; } return tryExecuteAndNotify( this.#host, - DocumentResource.getDocumentByKey({ - key, + DocumentResource.getDocumentById({ + id, }) ); } /** * Creates a new Document scaffold - * @param {(string | null)} parentKey + * @param {(string | null)} parentId * @return {*} * @memberof UmbDocumentServerDataSource */ - async createScaffold(documentTypeKey: string) { + async createScaffold(documentTypeId: string) { const data: DocumentResponseModel = { urls: [], - templateKey: null, - key: uuidv4(), - contentTypeKey: documentTypeKey, + templateId: null, + id: uuidv4(), + contentTypeId: documentTypeId, values: [], variants: [ { @@ -87,8 +87,8 @@ export class UmbDocumentServerDataSource * @return {*} * @memberof UmbDocumentServerDataSource */ - async insert(document: CreateDocumentRequestModel & { key: string }) { - if (!document.key) throw new Error('Key is missing'); + async insert(document: CreateDocumentRequestModel & { id: string }) { + if (!document.id) throw new Error('Id is missing'); let body: string; @@ -118,12 +118,12 @@ export class UmbDocumentServerDataSource * @return {*} * @memberof UmbDocumentServerDataSource */ - async update(key: string, document: DocumentResponseModel) { - if (!document.key) { - const error: ProblemDetailsModel = { title: 'Document key is missing' }; + async update(id: string, document: DocumentResponseModel) { + if (!document.id) { + const error: ProblemDetailsModel = { title: 'Document id is missing' }; return { error }; } - //const payload = { key: document.key, requestBody: document }; + //const payload = { id: document.id, requestBody: document }; let body: string; @@ -153,8 +153,8 @@ export class UmbDocumentServerDataSource * @return {*} * @memberof UmbDocumentServerDataSource */ - async trash(key: string) { - if (!key) { + async trash(id: string) { + if (!id) { const error: ProblemDetailsModel = { title: 'Key is missing' }; return { error }; } @@ -164,7 +164,7 @@ export class UmbDocumentServerDataSource this.#host, fetch('/umbraco/management/api/v1/document/trash', { method: 'POST', - body: JSON.stringify([key]), + body: JSON.stringify([id]), headers: { 'Content-Type': 'application/json', }, @@ -174,12 +174,12 @@ export class UmbDocumentServerDataSource /** * Deletes a Document on the server - * @param {string} key + * @param {string} id * @return {*} * @memberof UmbDocumentServerDataSource */ - async delete(key: string) { - if (!key) { + async delete(id: string) { + if (!id) { const error: ProblemDetailsModel = { title: 'Key is missing' }; return { error }; } @@ -189,7 +189,7 @@ export class UmbDocumentServerDataSource try { await fetch('/umbraco/management/api/v1/document/trash', { method: 'POST', - body: JSON.stringify([key]), + body: JSON.stringify([id]), headers: { 'Content-Type': 'application/json', }, diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/sources/document.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/sources/document.tree.server.data.ts index 4bb080ab00..076b707b0b 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/sources/document.tree.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/sources/document.tree.server.data.ts @@ -13,13 +13,13 @@ export class DocumentTreeServerDataSource implements UmbTreeDataSource { #host: UmbControllerHostElement; // TODO: how do we handle trashed items? - async trashItems(keys: Array) { + async trashItems(ids: Array) { // TODO: use backend cli when available. return tryExecuteAndNotify( this.#host, fetch('/umbraco/management/api/v1/document/trash', { method: 'POST', - body: JSON.stringify(keys), + body: JSON.stringify(ids), headers: { 'Content-Type': 'application/json', }, @@ -27,13 +27,13 @@ export class DocumentTreeServerDataSource implements UmbTreeDataSource { ); } - async moveItems(keys: Array, destination: string) { + async moveItems(ids: Array, destination: string) { // TODO: use backend cli when available. return tryExecuteAndNotify( this.#host, fetch('/umbraco/management/api/v1/document/move', { method: 'POST', - body: JSON.stringify({ keys, destination }), + body: JSON.stringify({ ids, destination }), headers: { 'Content-Type': 'application/json', }, @@ -60,41 +60,41 @@ export class DocumentTreeServerDataSource implements UmbTreeDataSource { } /** - * Fetches the children of a given parent key from the server - * @param {(string | null)} parentKey + * Fetches the children of a given parent id from the server + * @param {(string | null)} parentId * @return {*} * @memberof DocumentTreeServerDataSource */ - async getChildrenOf(parentKey: string | null) { - if (!parentKey) { - const error: ProblemDetailsModel = { title: 'Parent key is missing' }; + async getChildrenOf(parentId: string | null) { + if (!parentId) { + const error: ProblemDetailsModel = { title: 'Parent id is missing' }; return { error }; } return tryExecuteAndNotify( this.#host, DocumentResource.getTreeDocumentChildren({ - parentKey, + parentId, }) ); } /** - * Fetches the items for the given keys from the server - * @param {Array} keys + * Fetches the items for the given ids from the server + * @param {Array} ids * @return {*} * @memberof DocumentTreeServerDataSource */ - async getItems(keys: Array) { - if (!keys) { - const error: ProblemDetailsModel = { title: 'Keys are missing' }; + async getItems(ids: Array) { + if (!ids) { + const error: ProblemDetailsModel = { title: 'Ids are missing' }; return { error }; } return tryExecuteAndNotify( this.#host, - DocumentResource.getTreeDocumentItem({ - key: keys, + DocumentResource.getDocumentItem({ + id: ids, }) ); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/sources/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/sources/index.ts index a00ee540ff..8cbe1ec6d5 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/sources/index.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/sources/index.ts @@ -3,5 +3,5 @@ import { UmbDataSource, DataSourceResponse } from '@umbraco-cms/backoffice/repos export interface UmbDocumentDataSource extends UmbDataSource { createScaffold(documentTypeKey: string): Promise>; - trash(key: string): Promise>; + trash(id: string): Promise>; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/tree/tree-item/document-tree-item.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/tree/tree-item/document-tree-item.context.ts index a9812355db..4fcde2bd4f 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/tree/tree-item/document-tree-item.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/tree/tree-item/document-tree-item.context.ts @@ -5,6 +5,6 @@ import { DocumentTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-a // TODO get unique method from an document repository static method export class UmbDocumentTreeItemContext extends UmbTreeItemContextBase { constructor(host: UmbControllerHostElement) { - super(host, (x: DocumentTreeItemResponseModel) => x.key); + super(host, (x: DocumentTreeItemResponseModel) => x.id); } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace-editor.element.ts index 64c78a268e..dd2f4c5fdf 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace-editor.element.ts @@ -1,12 +1,12 @@ import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { css, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; -import { IRoute, IRoutingInfo } from 'router-slot'; import { UmbVariantId } from '../../../shared/variants/variant-id.class'; import { ActiveVariant } from '../../../shared/components/workspace/workspace-context/workspace-split-view-manager.class'; import { UmbDocumentWorkspaceContext } from './document-workspace.context'; import { UmbDocumentWorkspaceSplitViewElement } from './document-workspace-split-view.element'; -import { UmbRouterSlotInitEvent } from '@umbraco-cms/internal/router'; +import type { IRoute } from '@umbraco-cms/backoffice/router'; +import type { UmbRouterSlotInitEvent } from '@umbraco-cms/internal/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import '../../../shared/components/workspace/workspace-variant/workspace-variant.element'; import { VariantModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; @@ -86,7 +86,7 @@ export class UmbDocumentWorkspaceEditorElement extends UmbLitElement { routes.push({ path: new UmbVariantId(variantA).toString() + '_&_' + new UmbVariantId(variantB).toString(), component: this.splitViewElement, - setup: (component: HTMLElement | Promise, info: IRoutingInfo) => { + setup: (_component, info) => { // Set split view/active info.. const variantSplit = info.match.fragments.consumed.split('_&_'); variantSplit.forEach((part, index) => { @@ -102,7 +102,7 @@ export class UmbDocumentWorkspaceEditorElement extends UmbLitElement { routes.push({ path: new UmbVariantId(variant).toString(), component: this.splitViewElement, - setup: (component: HTMLElement | Promise, info: IRoutingInfo) => { + setup: (_component, info) => { // cause we might come from a split-view, we need to reset index 1. this.#workspaceContext?.splitView.removeActiveVariant(1); this._handleVariantFolderPart(0, info.match.fragments.consumed); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace.context.ts index 246b1866a6..e4d3f0b984 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace.context.ts @@ -3,7 +3,7 @@ import { UmbDocumentRepository } from '../repository/document.repository'; import { UmbDocumentTypeRepository } from '../../document-types/repository/document-type.repository'; import { UmbWorkspaceVariableEntityContextInterface } from '../../../shared/components/workspace/workspace-context/workspace-variable-entity-context.interface'; import { UmbVariantId } from '../../../shared/variants/variant-id.class'; -import { UmbWorkspacePropertyStructureManager } from '../../../shared/components/workspace/workspace-context/workspace-property-structure-manager.class'; +import { UmbWorkspacePropertyStructureManager } from '../../../shared/components/workspace/workspace-context/workspace-structure-manager.class'; import { UmbWorkspaceSplitViewManager } from '../../../shared/components/workspace/workspace-context/workspace-split-view-manager.class'; import type { CreateDocumentRequestModel, DocumentResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { partialUpdateFrozenArray, ObjectState, UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; @@ -28,12 +28,12 @@ export class UmbDocumentWorkspaceContext * The document is the current state/draft version of the document. */ #draft = new ObjectState(undefined); - readonly unique = this.#draft.getObservablePart((data) => data?.key); - readonly documentTypeKey = this.#draft.getObservablePart((data) => data?.contentTypeKey); + readonly unique = this.#draft.getObservablePart((data) => data?.id); + readonly documentTypeKey = this.#draft.getObservablePart((data) => data?.contentTypeId); readonly variants = this.#draft.getObservablePart((data) => data?.variants || []); readonly urls = this.#draft.getObservablePart((data) => data?.urls || []); - readonly templateKey = this.#draft.getObservablePart((data) => data?.templateKey || null); + readonly templateId = this.#draft.getObservablePart((data) => data?.templateId || null); readonly structure; readonly splitView; @@ -44,7 +44,7 @@ export class UmbDocumentWorkspaceContext this.structure = new UmbWorkspacePropertyStructureManager(this.host, new UmbDocumentTypeRepository(this.host)); this.splitView = new UmbWorkspaceSplitViewManager(this.host); - new UmbObserverController(this.host, this.documentTypeKey, (key) => this.structure.loadType(key)); + new UmbObserverController(this.host, this.documentTypeKey, (id) => this.structure.loadType(id)); /* TODO: Concept for ensure variant values: @@ -59,8 +59,8 @@ export class UmbDocumentWorkspaceContext */ } - async load(entityKey: string) { - const { data } = await this.repository.requestByKey(entityKey); + async load(entityId: string) { + const { data } = await this.repository.requestById(entityId); if (!data) return undefined; this.setIsNew(false); @@ -89,8 +89,8 @@ export class UmbDocumentWorkspaceContext } */ - getEntityKey() { - return this.getData().key; + getEntityId() { + return this.getData().id; } getEntityType() { @@ -163,19 +163,21 @@ export class UmbDocumentWorkspaceContext async save() { if (!this.#draft.value) return; + if (!this.#draft.value.id) return; + if (this.getIsNew()) { // TODO: typescript hack until we get the create type - const value = this.#draft.value as CreateDocumentRequestModel & { key: string }; + const value = this.#draft.value as CreateDocumentRequestModel & { id: string }; await this.repository.create(value); } else { - await this.repository.save(this.#draft.value); + await this.repository.save(this.#draft.value.id, this.#draft.value); } // If it went well, then its not new anymore?. this.setIsNew(false); } - async delete(key: string) { - await this.repository.delete(key); + async delete(id: string) { + await this.repository.delete(id); } /* diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace.element.ts index 062c5edc8d..19301cf90a 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace.element.ts @@ -1,8 +1,8 @@ import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; -import { IRoute, IRoutingInfo } from 'router-slot'; import { UmbDocumentWorkspaceContext } from './document-workspace.context'; +import type { IRoute } from '@umbraco-cms/backoffice/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import './document-workspace-editor.element'; @@ -17,22 +17,22 @@ export class UmbDocumentWorkspaceElement extends UmbLitElement { @state() _routes: IRoute[] = [ { - path: 'create/:parentKey/:documentTypeKey', + path: 'create/:parentId/:documentTypeKey', component: () => this.#element, - setup: async (component: HTMLElement, info: IRoutingInfo) => { - // TODO: use parent key: + setup: async (_component, info) => { + // TODO: use parent id: // TODO: Notice the perspective of permissions here, we need to check if the user has access to create a document of this type under this parent? - const parentKey = info.match.params.parentKey; + const parentId = info.match.params.parentId; const documentTypeKey = info.match.params.documentTypeKey; this.#workspaceContext.createScaffold(documentTypeKey); }, }, { - path: 'edit/:key', + path: 'edit/:id', component: () => this.#element, - setup: (component: HTMLElement, info: IRoutingInfo) => { - const key = info.match.params.key; - this.#workspaceContext.load(key); + setup: (_component, info) => { + const id = info.match.params.id; + this.#workspaceContext.load(id); }, }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/views/edit/document-workspace-view-edit-properties.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/views/edit/document-workspace-view-edit-properties.element.ts index a64174b210..2cc4063213 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/views/edit/document-workspace-view-edit-properties.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/views/edit/document-workspace-view-edit-properties.element.ts @@ -2,13 +2,10 @@ import { css, html } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, property, state } from 'lit/decorators.js'; import { repeat } from 'lit/directives/repeat.js'; -import { UmbDocumentWorkspaceContext } from '../../document-workspace.context'; +import { UmbWorkspacePropertyStructureHelper } from '../../../../../shared/components/workspace/workspace-context/workspace-property-structure-helper.class'; +import { PropertyContainerTypes } from '../../../../../shared/components/workspace/workspace-context/workspace-structure-manager.class'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { - DocumentTypePropertyTypeResponseModel, - PropertyTypeContainerResponseModelBaseModel, -} from '@umbraco-cms/backoffice/backend-api'; -import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-api'; +import { DocumentTypePropertyTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; @customElement('umb-document-workspace-view-edit-properties') export class UmbDocumentWorkspaceViewEditPropertiesElement extends UmbLitElement { @@ -24,93 +21,35 @@ export class UmbDocumentWorkspaceViewEditPropertiesElement extends UmbLitElement `, ]; - private _containerName?: string; - @property({ type: String, attribute: 'container-name', reflect: false }) public get containerName(): string | undefined { - return this._containerName; + return this._propertyStructureHelper.getContainerName(); } public set containerName(value: string | undefined) { - if (this._containerName === value) return; - this._containerName = value; - this._observeGroupContainers(); + this._propertyStructureHelper.setContainerName(value); } - private _containerType?: 'Group' | 'Tab'; - @property({ type: String, attribute: 'container-type', reflect: false }) - public get containerType(): 'Group' | 'Tab' | undefined { - return this._containerType; + public get containerType(): PropertyContainerTypes | undefined { + return this._propertyStructureHelper.getContainerType(); } - public set containerType(value: 'Group' | 'Tab' | undefined) { - if (this._containerType === value) return; - this._containerType = value; - this._observeGroupContainers(); + public set containerType(value: PropertyContainerTypes | undefined) { + this._propertyStructureHelper.setContainerType(value); } - @state() - _groupContainers: Array = []; + _propertyStructureHelper = new UmbWorkspacePropertyStructureHelper(this); @state() _propertyStructure: Array = []; - private _workspaceContext?: UmbDocumentWorkspaceContext; - constructor() { super(); - this.consumeContext(UMB_ENTITY_WORKSPACE_CONTEXT, (workspaceContext) => { - this._workspaceContext = workspaceContext as UmbDocumentWorkspaceContext; - this._observeGroupContainers(); + this.observe(this._propertyStructureHelper.propertyStructure, (propertyStructure) => { + this._propertyStructure = propertyStructure; }); } - private _observeGroupContainers() { - if (!this._workspaceContext || !this._containerName || !this._containerType) return; - - // TODO: Should be no need to update this observable if its already there. - this.observe( - this._workspaceContext!.structure.containersByNameAndType(this._containerName, this._containerType), - (groupContainers) => { - this._groupContainers = groupContainers || []; - groupContainers.forEach((group) => { - if (group.key) { - // Gather property aliases of this group, by group key. - this._observePropertyStructureOfGroup(group); - } - }); - }, - '_observeGroupContainers' - ); - } - - private _observePropertyStructureOfGroup(group: PropertyTypeContainerResponseModelBaseModel) { - if (!this._workspaceContext || !group.key) return; - - // TODO: Should be no need to update this observable if its already there. - this.observe( - this._workspaceContext.structure.propertyStructuresOf(group.key), - (properties) => { - // If this need to be able to remove properties, we need to clean out the ones of this group.key before inserting them: - this._propertyStructure = this._propertyStructure.filter((x) => x.containerKey !== group.key); - - properties?.forEach((property) => { - if (!this._propertyStructure.find((x) => x.alias === property.alias)) { - this._propertyStructure.push(property); - } - }); - - if (this._propertyStructure.length > 0) { - // TODO: Missing sort order? - //this._propertyStructure.sort((a, b) => (a.sortOrder || 0) - (b.sortOrder || 0)); - } - }, - '_observePropertyStructureOfGroup' + group.key - ); - - // cache observable - } - render() { return repeat( this._propertyStructure, diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/views/edit/document-workspace-view-edit-tab.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/views/edit/document-workspace-view-edit-tab.element.ts index 53bfdf0ae6..6febfe89a9 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/views/edit/document-workspace-view-edit-tab.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/views/edit/document-workspace-view-edit-tab.element.ts @@ -2,25 +2,19 @@ import { css, html } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, property, state } from 'lit/decorators.js'; import { repeat } from 'lit/directives/repeat.js'; -import { UmbDocumentWorkspaceContext } from '../../document-workspace.context'; +import { UmbWorkspaceContainerStructureHelper } from '../../../../../shared/components/workspace/workspace-context/workspace-container-structure-helper.class'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { PropertyTypeContainerResponseModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; import './document-workspace-view-edit-properties.element'; -import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-api'; @customElement('umb-document-workspace-view-edit-tab') export class UmbDocumentWorkspaceViewEditTabElement extends UmbLitElement { static styles = [ UUITextStyles, css` - :host { - display: block; + uui-box { margin: var(--uui-size-layout-1); } - - uui-box + uui-box { - margin-top: var(--uui-size-layout-1); - } `, ]; @@ -28,127 +22,46 @@ export class UmbDocumentWorkspaceViewEditTabElement extends UmbLitElement { @property({ type: String }) public get tabName(): string | undefined { - return this._tabName; + return this._groupStructureHelper.getName(); } public set tabName(value: string | undefined) { + if (value === this._tabName) return; const oldValue = this._tabName; - if (oldValue === value) return; this._tabName = value; - this._observeTabContainers(); + this._groupStructureHelper.setName(value); this.requestUpdate('tabName', oldValue); } - private _noTabName = false; - @property({ type: Boolean }) public get noTabName(): boolean { - return this._noTabName; + return this._groupStructureHelper.getIsRoot(); } public set noTabName(value: boolean) { - const oldValue = this._noTabName; - if (oldValue === value) return; - this._noTabName = value; - if (this._noTabName) { - this._tabName = undefined; - } - this._observeTabContainers(); - this.requestUpdate('noTabName', oldValue); + this._groupStructureHelper.setIsRoot(value); } - @state() - _tabContainers: PropertyTypeContainerResponseModelBaseModel[] = []; - - @state() - _hasTabProperties = false; + _groupStructureHelper = new UmbWorkspaceContainerStructureHelper(this); @state() _groups: Array = []; - private _workspaceContext?: UmbDocumentWorkspaceContext; + @state() + _hasProperties = false; constructor() { super(); - this.consumeContext(UMB_ENTITY_WORKSPACE_CONTEXT, (workspaceContext) => { - this._workspaceContext = workspaceContext as UmbDocumentWorkspaceContext; - this._observeTabContainers(); + this.observe(this._groupStructureHelper.containers, (groups) => { + this._groups = groups; + }); + this.observe(this._groupStructureHelper.hasProperties, (hasProperties) => { + this._hasProperties = hasProperties; }); } - private _observeHasTabProperties() { - if (!this._workspaceContext) return; - - this._tabContainers.forEach((container) => { - this.observe( - this._workspaceContext!.structure.hasPropertyStructuresOf(container.key!), - (hasTabProperties) => { - this._hasTabProperties = hasTabProperties; - }, - '_observeHasTabProperties_' + container.key - ); - }); - } - - private _observeTabContainers() { - if (!this._workspaceContext) return; - - if (this._tabName) { - this._groups = []; - this.observe( - this._workspaceContext.structure.containersByNameAndType(this._tabName, 'Tab'), - (tabContainers) => { - this._tabContainers = tabContainers || []; - if (this._tabContainers.length > 0) { - this._observeHasTabProperties(); - this._observeGroups(); - } - }, - '_observeTabContainers' - ); - } else if (this._noTabName) { - this._groups = []; - this._observeRootGroups(); - } - } - - private _observeGroups() { - if (!this._workspaceContext || !this._tabName) return; - - this._tabContainers.forEach((container) => { - this.observe( - this._workspaceContext!.structure.containersOfParentKey(container.key, 'Group'), - this._insertGroupContainers, - '_observeGroupsOf_' + container.key - ); - }); - } - - private _observeRootGroups() { - if (!this._workspaceContext || !this._noTabName) return; - - // This is where we potentially could observe root properties as well. - this.observe( - this._workspaceContext!.structure.rootContainers('Group'), - this._insertGroupContainers, - '_observeRootGroups' - ); - } - - private _insertGroupContainers = (groupContainers: PropertyTypeContainerResponseModelBaseModel[]) => { - groupContainers.forEach((group) => { - if (group.name) { - if (!this._groups.find((x) => x.name === group.name)) { - this._groups.push(group); - this._groups.sort((a, b) => (a.sortOrder || 0) - (b.sortOrder || 0)); - } - } - }); - }; - render() { - // TODO: only show tab properties if there was any. We might do this with an event? to tell us when the properties is empty. return html` - ${this._hasTabProperties + ${this._hasProperties ? html` { + this._tabs = tabs; + this._createRoutes(); + }); + + // _hasRootProperties can be gotten via _tabsStructureHelper.hasProperties. But we do not support root properties currently. + this.consumeContext(UMB_ENTITY_WORKSPACE_CONTEXT, (workspaceContext) => { this._workspaceContext = workspaceContext as UmbDocumentWorkspaceContext; - this._observeTabs(); + this._observeRootGroups(); }); } - private _observeTabs() { + private _observeRootGroups() { if (!this._workspaceContext) return; - this.observe( - this._workspaceContext.structure.rootContainers('Tab'), - (tabs) => { - tabs.forEach((tab) => { - // Only add each tab name once, as our containers merge on name: - if (!this._tabs.find((x) => x.name === tab.name || '')) { - this._tabs.push(tab); - } - }); - this._createRoutes(); - }, - '_observeTabs' - ); - - /* - Impleent this, when it becomes an option to have properties directly in the root of the document. - this.observe( - this._workspaceContext.rootPropertyStructures(), - (rootPropertyStructure) => { - this._hasRootProperties = rootPropertyStructure.length > 0; - this._createRoutes(); - }, - '_observeTabs' - ); - */ - this.observe( this._workspaceContext.structure.hasRootContainers('Group'), (hasRootGroups) => { this._hasRootGroups = hasRootGroups; this._createRoutes(); }, - '_observeTabs' + '_observeGroups' ); } private _createRoutes() { - const routes: any[] = []; + const routes: IRoute[] = []; if (this._tabs.length > 0) { this._tabs?.forEach((tab) => { @@ -94,7 +81,7 @@ export class UmbDocumentWorkspaceViewEditElement extends UmbLitElement { routes.push({ path: `tab/${encodeURI(tabName || '').toString()}`, component: () => import('./document-workspace-view-edit-tab.element'), - setup: (component: Promise) => { + setup: (component) => { (component as any).tabName = tabName; }, }); @@ -105,7 +92,7 @@ export class UmbDocumentWorkspaceViewEditElement extends UmbLitElement { routes.push({ path: '', component: () => import('./document-workspace-view-edit-tab.element'), - setup: (component: Promise) => { + setup: (component) => { (component as any).noTabName = true; }, }); @@ -139,6 +126,7 @@ export class UmbDocumentWorkspaceViewEditElement extends UmbLitElement { this._tabs, (tab) => tab.name, (tab) => { + // TODO: make better url folder name: const path = this._routerPath + '/tab/' + encodeURI(tab.name || ''); return html`${tab.name}([], (x) => x.key); + #data = new ArrayState([], (x) => x.id); constructor(host: UmbControllerHostElement) { super(host, UMB_MEDIA_TYPE_STORE_CONTEXT_TOKEN.toString()); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.repository.ts index 769559b402..898e1ab966 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.repository.ts @@ -56,34 +56,34 @@ export class UmbMediaTypeRepository implements UmbTreeRepository { return { data, error, asObservable: () => this.#treeStore!.rootItems }; } - async requestTreeItemsOf(parentKey: string | null) { + async requestTreeItemsOf(parentId: string | null) { await this.#init; - if (!parentKey) { - const error: ProblemDetailsModel = { title: 'Parent key is missing' }; + if (!parentId) { + const error: ProblemDetailsModel = { title: 'Parent id is missing' }; return { data: undefined, error }; } - const { data, error } = await this.#treeSource.getChildrenOf(parentKey); + const { data, error } = await this.#treeSource.getChildrenOf(parentId); if (data) { this.#treeStore?.appendItems(data.items); } - return { data, error, asObservable: () => this.#treeStore!.childrenOf(parentKey) }; + return { data, error, asObservable: () => this.#treeStore!.childrenOf(parentId) }; } - async requestTreeItems(keys: Array) { + async requestTreeItems(ids: Array) { await this.#init; - if (!keys) { + if (!ids) { const error: ProblemDetailsModel = { title: 'Keys are missing' }; return { data: undefined, error }; } - const { data, error } = await this.#treeSource.getItems(keys); + const { data, error } = await this.#treeSource.getItems(ids); - return { data, error, asObservable: () => this.#treeStore!.items(keys) }; + return { data, error, asObservable: () => this.#treeStore!.items(ids) }; } async rootTreeItems() { @@ -91,14 +91,14 @@ export class UmbMediaTypeRepository implements UmbTreeRepository { return this.#treeStore!.rootItems; } - async treeItemsOf(parentKey: string | null) { + async treeItemsOf(parentId: string | null) { await this.#init; - return this.#treeStore!.childrenOf(parentKey); + return this.#treeStore!.childrenOf(parentId); } - async treeItems(keys: Array) { + async treeItems(ids: Array) { await this.#init; - return this.#treeStore!.items(keys); + return this.#treeStore!.items(ids); } // DETAILS @@ -108,16 +108,16 @@ export class UmbMediaTypeRepository implements UmbTreeRepository { return this.#detailSource.createScaffold(); } - async requestDetails(key: string) { + async requestDetails(id: string) { await this.#init; - // TODO: should we show a notification if the key is missing? + // TODO: should we show a notification if the id is missing? // Investigate what is best for Acceptance testing, cause in that perspective a thrown error might be the best choice? - if (!key) { - const error: ProblemDetailsModel = { title: 'Key is missing' }; + if (!id) { + const error: ProblemDetailsModel = { title: 'Id is missing' }; return { error }; } - const { data, error } = await this.#detailSource.get(key); + const { data, error } = await this.#detailSource.get(id); if (data) { this.#store?.append(data); @@ -125,9 +125,9 @@ export class UmbMediaTypeRepository implements UmbTreeRepository { return { data, error }; } - async delete(key: string) { + async delete(id: string) { await this.#init; - return this.#detailSource.delete(key); + return this.#detailSource.delete(id); } async save(mediaType: MediaTypeDetails) { @@ -135,7 +135,7 @@ export class UmbMediaTypeRepository implements UmbTreeRepository { // TODO: should we show a notification if the media type is missing? // Investigate what is best for Acceptance testing, cause in that perspective a thrown error might be the best choice? - if (!mediaType || !mediaType.key) { + if (!mediaType || !mediaType.id) { const error: ProblemDetailsModel = { title: 'Media Type is missing' }; return { error }; } @@ -151,7 +151,7 @@ export class UmbMediaTypeRepository implements UmbTreeRepository { // Consider to look up the data before fetching from the server // Consider notify a workspace if a media type is updated in the store while someone is editing it. this.#store?.append(mediaType); - this.#treeStore?.updateItem(mediaType.key, { name: mediaType.name }); + this.#treeStore?.updateItem(mediaType.id, { name: mediaType.name }); // TODO: would be nice to align the stores on methods/methodNames. return { error }; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/sources/media-type.detail.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/sources/media-type.detail.server.data.ts index fa2481dd0f..701b0dcf21 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/sources/media-type.detail.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/sources/media-type.detail.server.data.ts @@ -31,15 +31,15 @@ export class UmbMediaTypeDetailServerDataSource implements MediaTypeDetailDataSo } /** - * @description - Fetches a MediaType with the given key from the server - * @param {string} key + * @description - Fetches a MediaType with the given id from the server + * @param {string} id * @return {*} * @memberof UmbMediaTypeDetailServerDataSource */ - get(key: string) { - //return tryExecuteAndNotify(this.#host, MediaTypeResource.getMediaTypeByKey({ key })) as any; + get(id: string) { + //return tryExecuteAndNotify(this.#host, MediaTypeResource.getMediaTypeByKey({ id })) as any; // TODO: use backend cli when available. - return tryExecuteAndNotify(this.#host, fetch(`/umbraco/management/api/v1/media-type/${key}`)) as any; + return tryExecuteAndNotify(this.#host, fetch(`/umbraco/management/api/v1/media-type/${id}`)) as any; } /** @@ -49,18 +49,18 @@ export class UmbMediaTypeDetailServerDataSource implements MediaTypeDetailDataSo * @memberof UmbMediaTypeDetailServerDataSource */ async update(mediaType: MediaTypeDetails) { - if (!mediaType.key) { - const error: ProblemDetailsModel = { title: 'MediaType key is missing' }; + if (!mediaType.id) { + const error: ProblemDetailsModel = { title: 'MediaType id is missing' }; return { error }; } - const payload = { key: mediaType.key, requestBody: mediaType }; + const payload = { id: mediaType.id, requestBody: mediaType }; //return tryExecuteAndNotify(this.#host, MediaTypeResource.putMediaTypeByKey(payload)); // TODO: use backend cli when available. return tryExecuteAndNotify( this.#host, - fetch(`/umbraco/management/api/v1/media-type/${mediaType.key}`, { + fetch(`/umbraco/management/api/v1/media-type/${mediaType.id}`, { method: 'PUT', body: JSON.stringify(payload), headers: { @@ -93,21 +93,21 @@ export class UmbMediaTypeDetailServerDataSource implements MediaTypeDetailDataSo /** * @description - Deletes a MediaType on the server - * @param {string} key + * @param {string} id * @return {*} * @memberof UmbMediaTypeDetailServerDataSource */ - async delete(key: string) { - if (!key) { + async delete(id: string) { + if (!id) { const error: ProblemDetailsModel = { title: 'Key is missing' }; return { error }; } - //return await tryExecuteAndNotify(this.#host, MediaTypeResource.deleteMediaTypeByKey({ key })); + //return await tryExecuteAndNotify(this.#host, MediaTypeResource.deleteMediaTypeByKey({ id })); // TODO: use backend cli when available. return tryExecuteAndNotify( this.#host, - fetch(`/umbraco/management/api/v1/media-type/${key}`, { + fetch(`/umbraco/management/api/v1/media-type/${id}`, { method: 'DELETE', }) ) as any; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/sources/media-type.details.server.data.interface.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/sources/media-type.details.server.data.interface.ts index 8182c5d0f1..7da7f1a9b2 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/sources/media-type.details.server.data.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/sources/media-type.details.server.data.interface.ts @@ -3,9 +3,9 @@ import type { DataSourceResponse } from '@umbraco-cms/backoffice/repository'; // TODO => Use models when they exist export interface MediaTypeDetailDataSource { - createScaffold(parentKey: string): Promise>; - get(key: string): Promise>; + createScaffold(parentId: string): Promise>; + get(id: string): Promise>; insert(data: any): Promise; update(data: any): Promise; - delete(key: string): Promise; + delete(id: string): Promise; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/sources/media-type.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/sources/media-type.tree.server.data.ts index 4fa209600d..6d164599f4 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/sources/media-type.tree.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/sources/media-type.tree.server.data.ts @@ -31,41 +31,41 @@ export class MediaTypeTreeServerDataSource implements UmbTreeDataSource { } /** - * Fetches the children of a given parent key from the server - * @param {(string | null)} parentKey + * Fetches the children of a given parent id from the server + * @param {(string | null)} parentId * @return {*} * @memberof MediaTypeTreeServerDataSource */ - async getChildrenOf(parentKey: string | null) { - if (!parentKey) { - const error: ProblemDetailsModel = { title: 'Parent key is missing' }; + async getChildrenOf(parentId: string | null) { + if (!parentId) { + const error: ProblemDetailsModel = { title: 'Parent id is missing' }; return { error }; } return tryExecuteAndNotify( this.#host, MediaTypeResource.getTreeMediaTypeChildren({ - parentKey, + parentId, }) ); } /** - * Fetches the items for the given keys from the server - * @param {Array} keys + * Fetches the items for the given ids from the server + * @param {Array} ids * @return {*} * @memberof MediaTypeTreeServerDataSource */ - async getItems(keys: Array) { - if (!keys || keys.length === 0) { + async getItems(ids: Array) { + if (!ids || ids.length === 0) { const error: ProblemDetailsModel = { title: 'Keys are missing' }; return { error }; } return tryExecuteAndNotify( this.#host, - MediaTypeResource.getTreeMediaTypeItem({ - key: keys, + MediaTypeResource.getMediaTypeItem({ + id: ids, }) ); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/workspace/media-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/workspace/media-type-workspace.context.ts index 04d9a806dd..648c880015 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/workspace/media-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/workspace/media-type-workspace.context.ts @@ -22,8 +22,8 @@ export class UmbWorkspaceMediaTypeContext return this.#data.getValue(); } - getEntityKey() { - return this.getData()?.key || ''; + getEntityId() { + return this.getData()?.id || ''; } getEntityType() { @@ -38,8 +38,8 @@ export class UmbWorkspaceMediaTypeContext // TODO => Implement setPropertyValue } - async load(entityKey: string) { - const { data } = await this.repository.requestDetails(entityKey); + async load(entityId: string) { + const { data } = await this.repository.requestDetails(entityId); if (data) { this.#data.next(data); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/workspace/media-type-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/workspace/media-type-workspace.element.ts index 5b1ef7f277..a2f98ec9c6 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/workspace/media-type-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/workspace/media-type-workspace.element.ts @@ -4,7 +4,7 @@ import { customElement, state } from 'lit/decorators.js'; import { UmbWorkspaceMediaTypeContext } from './media-type-workspace.context'; import { UmbMediaTypeWorkspaceEditElement } from './media-type-workspace-edit.element'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { IRoutingInfo } from '@umbraco-cms/internal/router'; +import type { IRoute } from '@umbraco-cms/backoffice/router'; @customElement('umb-media-type-workspace') export class UmbMediaTypeWorkspaceElement extends UmbLitElement { @@ -27,13 +27,13 @@ export class UmbMediaTypeWorkspaceElement extends UmbLitElement { #element = new UmbMediaTypeWorkspaceEditElement(); @state() - _routes: any[] = [ + _routes: IRoute[] = [ { - path: 'edit/:key', + path: 'edit/:id', component: () => this.#element, - setup: (component: HTMLElement, info: IRoutingInfo) => { - const key = info.match.params.key; - this.#workspaceContext.load(key); + setup: (component, info) => { + const id = info.match.params.id; + this.#workspaceContext.load(id); }, }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/collection-view/media-grid-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/collection-view/media-grid-collection-view.element.ts index 50fb77a885..a34369425c 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/collection-view/media-grid-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/collection-view/media-grid-collection-view.element.ts @@ -118,24 +118,24 @@ export class UmbMediaGridCollectionViewElement extends UmbLitElement { private _handleOpenItem(mediaItem: EntityTreeItemResponseModel) { //TODO: Fix when we have dynamic routing - history.pushState(null, '', 'section/media/media/edit/' + mediaItem.key); + history.pushState(null, '', 'section/media/media/edit/' + mediaItem.id); } private _handleSelect(mediaItem: EntityTreeItemResponseModel) { - if (mediaItem.key) { - this._collectionContext?.select(mediaItem.key); + if (mediaItem.id) { + this._collectionContext?.select(mediaItem.id); } } private _handleDeselect(mediaItem: EntityTreeItemResponseModel) { - if (mediaItem.key) { - this._collectionContext?.deselect(mediaItem.key); + if (mediaItem.id) { + this._collectionContext?.deselect(mediaItem.id); } } private _isSelected(mediaItem: EntityTreeItemResponseModel) { - if (mediaItem.key) { - return this._selection.includes(mediaItem.key); + if (mediaItem.id) { + return this._selection.includes(mediaItem.id); } return false; } @@ -167,7 +167,7 @@ export class UmbMediaGridCollectionViewElement extends UmbLitElement { ${this._mediaItems ? repeat( this._mediaItems, - (file, index) => (file.key || '') + index, + (file, index) => (file.id || '') + index, (file) => this._renderMediaItem(file) ) : ''} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/collection-view/media-table-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/collection-view/media-table-collection-view.element.ts index acacf64c88..7e5a02a213 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/collection-view/media-table-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/collection-view/media-table-collection-view.element.ts @@ -85,7 +85,7 @@ export class UmbMediaTableCollectionViewElement extends UmbLitElement { // TODO: I guess the type error will go away when we get an entity based MediaDetails model instead of tree based. this._tableItems = mediaItems.map((item) => { return { - key: item.key, + id: item.id, icon: item.icon, data: [ { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/index.ts index d76d6bef9e..203cdbb451 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/index.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/index.ts @@ -5,7 +5,7 @@ export interface ContentProperty { alias: string; label: string; description: string; - dataTypeKey: string; + dataTypeId: string; } export interface ContentPropertyData { @@ -15,7 +15,7 @@ export interface ContentPropertyData { // Media export interface MediaDetails extends ContentTreeItemResponseModel { - key: string; // TODO: Remove this when the backend is fixed + id: string; // TODO: Remove this when the backend is fixed isTrashed: boolean; // TODO: remove only temp part of refactor properties: Array; data: Array; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.repository.ts index 873e8011d6..28e2aed79d 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.repository.ts @@ -6,13 +6,19 @@ import { UmbMediaDetailServerDataSource } from './sources/media.detail.server.da import type { UmbTreeRepository, UmbTreeDataSource } from '@umbraco-cms/backoffice/repository'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; -import { ProblemDetailsModel } from '@umbraco-cms/backoffice/backend-api'; +import { + CreateMediaRequestModel, + ProblemDetailsModel, + UpdateMediaRequestModel, +} from '@umbraco-cms/backoffice/backend-api'; import { UmbDetailRepository } from '@umbraco-cms/backoffice/repository'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; type ItemDetailType = MediaDetails; -export class UmbMediaRepository implements UmbTreeRepository, UmbDetailRepository { +export class UmbMediaRepository + implements UmbTreeRepository, UmbDetailRepository +{ #host: UmbControllerHostElement; #treeSource: UmbTreeDataSource; @@ -73,34 +79,34 @@ export class UmbMediaRepository implements UmbTreeRepository, UmbDetailRepositor return { data, error, asObservable: () => this.#treeStore!.rootItems }; } - async requestTreeItemsOf(parentKey: string | null) { + async requestTreeItemsOf(parentId: string | null) { await this.#init; - if (!parentKey) { - const error: ProblemDetailsModel = { title: 'Parent key is missing' }; + if (!parentId) { + const error: ProblemDetailsModel = { title: 'Parent id is missing' }; return { data: undefined, error }; } - const { data, error } = await this.#treeSource.getChildrenOf(parentKey); + const { data, error } = await this.#treeSource.getChildrenOf(parentId); if (data) { this.#treeStore?.appendItems(data.items); } - return { data, error, asObservable: () => this.#treeStore!.childrenOf(parentKey) }; + return { data, error, asObservable: () => this.#treeStore!.childrenOf(parentId) }; } - async requestTreeItems(keys: Array) { + async requestTreeItems(ids: Array) { await this.#init; - if (!keys) { + if (!ids) { const error: ProblemDetailsModel = { title: 'Keys are missing' }; return { data: undefined, error }; } - const { data, error } = await this.#treeSource.getItems(keys); + const { data, error } = await this.#treeSource.getItems(ids); - return { data, error, asObservable: () => this.#treeStore!.items(keys) }; + return { data, error, asObservable: () => this.#treeStore!.items(ids) }; } async rootTreeItems() { @@ -108,38 +114,29 @@ export class UmbMediaRepository implements UmbTreeRepository, UmbDetailRepositor return this.#treeStore!.rootItems; } - async treeItemsOf(parentKey: string | null) { + async treeItemsOf(parentId: string | null) { await this.#init; - return this.#treeStore!.childrenOf(parentKey); + return this.#treeStore!.childrenOf(parentId); } - async treeItems(keys: Array) { + async treeItems(ids: Array) { await this.#init; - return this.#treeStore!.items(keys); + return this.#treeStore!.items(ids); } // DETAILS: - async createScaffold(parentKey: string | null) { + async createScaffold(parentId: string | null) { + if (!parentId) throw new Error('Parent id is missing'); await this.#init; - - if (!parentKey) { - throw new Error('Parent key is missing'); - } - - return this.#detailDataSource.createScaffold(parentKey); + return this.#detailDataSource.createScaffold(parentId); } - async requestByKey(key: string) { + async requestById(id: string) { + if (!id) throw new Error('Id is missing'); await this.#init; - // TODO: should we show a notification if the key is missing? - // Investigate what is best for Acceptance testing, cause in that perspective a thrown error might be the best choice? - if (!key) { - const error: ProblemDetailsModel = { title: 'Key is missing' }; - return { error }; - } - const { data, error } = await this.#detailDataSource.get(key); + const { data, error } = await this.#detailDataSource.get(id); if (data) { this.#store?.append(data); @@ -150,62 +147,58 @@ export class UmbMediaRepository implements UmbTreeRepository, UmbDetailRepositor // Could potentially be general methods: - async create(template: ItemDetailType) { + async create(media: CreateMediaRequestModel) { + if (!media) throw new Error('Media is missing'); + await this.#init; - if (!template || !template.key) { - throw new Error('Template is missing'); - } - - const { error } = await this.#detailDataSource.insert(template); + const { error } = await this.#detailDataSource.insert(media); if (!error) { + // TODO: we currently don't use the detail store for anything. + // Consider to look up the data before fetching from the server + // TODO: Update tree store with the new item? or ask tree to request the new item? + //this.#store?.append(media); + const notification = { data: { message: `Media created` } }; this.#notificationContext?.peek('positive', notification); } - // TODO: we currently don't use the detail store for anything. - // Consider to look up the data before fetching from the server - this.#store?.append(template); - // TODO: Update tree store with the new item? or ask tree to request the new item? - return { error }; } - async save(document: ItemDetailType) { + async save(id: string, updatedItem: UpdateMediaRequestModel) { + if (!id) throw new Error('Id is missing'); + if (!updatedItem) throw new Error('Updated media item is missing'); + await this.#init; - if (!document || !document.key) { - throw new Error('Template is missing'); - } - - const { error } = await this.#detailDataSource.update(document.key, document); + const { error } = await this.#detailDataSource.update(id, updatedItem); if (!error) { - const notification = { data: { message: `Document saved` } }; + // TODO: we currently don't use the detail store for anything. + // Consider to look up the data before fetching from the server + // Consider notify a workspace if a template is updated in the store while someone is editing it. + // TODO: would be nice to align the stores on methods/methodNames. + // this.#store?.append(updatedMediaItem); + // this.#treeStore?.updateItem(id, updatedItem); + + const notification = { data: { message: `Media saved` } }; this.#notificationContext?.peek('positive', notification); } - // TODO: we currently don't use the detail store for anything. - // Consider to look up the data before fetching from the server - // Consider notify a workspace if a template is updated in the store while someone is editing it. - this.#store?.append(document); - this.#treeStore?.updateItem(document.key, { name: document.name }); - - // TODO: would be nice to align the stores on methods/methodNames. - return { error }; } // General: - async delete(key: string) { + async delete(id: string) { await this.#init; - if (!key) { - throw new Error('Document key is missing'); + if (!id) { + throw new Error('Document id is missing'); } - const { error } = await this.#detailDataSource.delete(key); + const { error } = await this.#detailDataSource.delete(id); if (!error) { const notification = { data: { message: `Document deleted` } }; @@ -215,23 +208,23 @@ export class UmbMediaRepository implements UmbTreeRepository, UmbDetailRepositor // TODO: we currently don't use the detail store for anything. // Consider to look up the data before fetching from the server. // Consider notify a workspace if a template is deleted from the store while someone is editing it. - this.#store?.remove([key]); - this.#treeStore?.removeItem(key); + this.#store?.remove([id]); + this.#treeStore?.removeItem(id); // TODO: would be nice to align the stores on methods/methodNames. return { error }; } - async trash(keys: Array) { - console.log('media trash: ' + keys); + async trash(ids: Array) { + console.log('media trash: ' + ids); alert('implement trash'); } - async move(keys: Array, destination: string) { + async move(ids: Array, destination: string) { // TODO: use backend cli when available. const res = await fetch('/umbraco/management/api/v1/media/move', { method: 'POST', - body: JSON.stringify({ keys, destination }), + body: JSON.stringify({ ids, destination }), headers: { 'Content-Type': 'application/json', }, diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.store.ts index 647992a1af..ddc1a8b5fc 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.store.ts @@ -11,7 +11,7 @@ import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; * @description - Data Store for Template Details */ export class UmbMediaStore extends UmbStoreBase { - #data = new ArrayState([], (x) => x.key); + #data = new ArrayState([], (x) => x.id); /** * Creates an instance of UmbMediaStore. diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.tree.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.tree.store.ts index adc6a920e0..9c63d9c946 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.tree.store.ts @@ -13,7 +13,7 @@ export const UMB_MEDIA_TREE_STORE_CONTEXT_TOKEN = new UmbContextToken([], (x) => x.key); + #data = new ArrayState([], (x) => x.id); /** * Creates an instance of UmbMediaTreeStore. diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/sources/media.detail.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/sources/media.detail.server.data.ts index 609a119df6..797329b01a 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/sources/media.detail.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/sources/media.detail.server.data.ts @@ -1,6 +1,10 @@ import type { MediaDetails } from '../../'; import { UmbDataSource } from '@umbraco-cms/backoffice/repository'; -import { ProblemDetailsModel } from '@umbraco-cms/backoffice/backend-api'; +import { + CreateMediaRequestModel, + ProblemDetailsModel, + UpdateMediaRequestModel, +} from '@umbraco-cms/backoffice/backend-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -10,7 +14,9 @@ import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; * @class UmbTemplateDetailServerDataSource * @implements {TemplateDetailDataSource} */ -export class UmbMediaDetailServerDataSource implements UmbDataSource { +export class UmbMediaDetailServerDataSource + implements UmbDataSource +{ #host: UmbControllerHostElement; /** @@ -23,13 +29,13 @@ export class UmbMediaDetailServerDataSource implements UmbDataSource res.json()) .then((res) => res[0] || undefined) ); @@ -45,39 +51,20 @@ export class UmbMediaDetailServerDataSource implements UmbDataSource) { + async trashItems(ids: Array) { // TODO: use backend cli when available. return tryExecuteAndNotify( this.#host, fetch('/umbraco/management/api/v1/media/trash', { method: 'POST', - body: JSON.stringify(keys), + body: JSON.stringify(ids), headers: { 'Content-Type': 'application/json', }, @@ -27,13 +27,13 @@ export class MediaTreeServerDataSource implements UmbTreeDataSource { ); } - async moveItems(keys: Array, destination: string) { + async moveItems(ids: Array, destination: string) { // TODO: use backend cli when available. return tryExecuteAndNotify( this.#host, fetch('/umbraco/management/api/v1/media/move', { method: 'POST', - body: JSON.stringify({ keys, destination }), + body: JSON.stringify({ ids, destination }), headers: { 'Content-Type': 'application/json', }, @@ -60,33 +60,33 @@ export class MediaTreeServerDataSource implements UmbTreeDataSource { } /** - * Fetches the children of a given parent key from the server - * @param {(string | null)} parentKey + * Fetches the children of a given parent id from the server + * @param {(string | null)} parentId * @return {*} * @memberof MediaTreeServerDataSource */ - async getChildrenOf(parentKey: string | null) { - if (!parentKey) { - const error: ProblemDetailsModel = { title: 'Parent key is missing' }; + async getChildrenOf(parentId: string | null) { + if (!parentId) { + const error: ProblemDetailsModel = { title: 'Parent id is missing' }; return { error }; } return tryExecuteAndNotify( this.#host, MediaResource.getTreeMediaChildren({ - parentKey, + parentId, }) ); } /** - * Fetches the items for the given keys from the server - * @param {Array} keys + * Fetches the items for the given ids from the server + * @param {Array} ids * @return {*} * @memberof MediaTreeServerDataSource */ - async getItems(keys: Array) { - if (!keys) { + async getItems(ids: Array) { + if (!ids) { const error: ProblemDetailsModel = { title: 'Keys are missing' }; return { error }; } @@ -94,7 +94,7 @@ export class MediaTreeServerDataSource implements UmbTreeDataSource { return tryExecuteAndNotify( this.#host, MediaResource.getTreeMediaItem({ - key: keys, + id: ids, }) ); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/media-workspace-edit.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/media-workspace-edit.element.ts index 66676ea129..81224bde73 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/media-workspace-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/media-workspace-edit.element.ts @@ -28,7 +28,7 @@ export class UmbMediaWorkspaceEditElement extends UmbLitElement { ]; @state() - _key?: string; + _id?: string; #umbWorkspaceContext?: UmbMediaWorkspaceContext; @@ -37,23 +37,23 @@ export class UmbMediaWorkspaceEditElement extends UmbLitElement { this.consumeContext(UMB_ENTITY_WORKSPACE_CONTEXT, (instance) => { this.#umbWorkspaceContext = instance as UmbMediaWorkspaceContext; - this.#observeKey(); + this.#observeId(); }); } - #observeKey() { + #observeId() { if (!this.#umbWorkspaceContext) return; - this.observe(this.#umbWorkspaceContext.data, (data) => (this._key = data?.key)); + this.observe(this.#umbWorkspaceContext.data, (data) => (this._id = data?.id)); } render() { - if (!this._key) return nothing; + if (!this._id) return nothing; return html` + unique="${this._id}"> `; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/media-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/media-workspace.context.ts index 9b689787aa..751b587560 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/media-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/media-workspace.context.ts @@ -22,9 +22,9 @@ export class UmbMediaWorkspaceContext return this.#data.getValue(); } - // TODO: this should be async because it can only return the key if the data is loaded. - getEntityKey() { - return this.getData()?.key || ''; + // TODO: this should be async because it can only return the id if the data is loaded. + getEntityId() { + return this.getData()?.id || ''; } getEntityType() { @@ -46,19 +46,21 @@ export class UmbMediaWorkspaceContext } } - async load(entityKey: string) { - const { data } = await this.repository.requestByKey(entityKey); + async load(entityId: string) { + const { data } = await this.repository.requestById(entityId); if (data) { this.setIsNew(false); this.#data.next(data); } } - async createScaffold(parentKey: string | null) { - const { data } = await this.repository.createScaffold(parentKey); + async createScaffold(parentId: string | null) { + const { data } = await this.repository.createScaffold(parentId); if (!data) return; this.setIsNew(true); - this.#data.next(data); + // TODO: This is a hack to get around the fact that the data is not typed correctly. + // Create and response models are different. We need to look into this. + this.#data.next(data as unknown as MediaDetails); } async save() { @@ -66,14 +68,14 @@ export class UmbMediaWorkspaceContext if (this.isNew) { await this.repository.create(this.#data.value); } else { - await this.repository.save(this.#data.value); + await this.repository.save(this.#data.value.id, this.#data.value); } // If it went well, then its not new anymore?. this.setIsNew(false); } - async delete(key: string) { - await this.repository.delete(key); + async delete(id: string) { + await this.repository.delete(id); } public destroy(): void { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/media-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/media-workspace.element.ts index cc3e954a76..aab70442d0 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/media-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/media-workspace.element.ts @@ -3,7 +3,7 @@ import { css, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; import { UmbMediaWorkspaceContext } from './media-workspace.context'; import { UmbMediaWorkspaceEditElement } from './media-workspace-edit.element'; -import { IRoute, IRoutingInfo } from '@umbraco-cms/internal/router'; +import type { IRoute } from '@umbraco-cms/backoffice/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-media-workspace') @@ -25,11 +25,11 @@ export class UmbMediaWorkspaceElement extends UmbLitElement { @state() _routes: IRoute[] = [ { - path: 'edit/:key', + path: 'edit/:id', component: () => this.#element, - setup: (component: HTMLElement, info: IRoutingInfo) => { - const key = info.match.params.key; - this.#workspaceContext.load(key); + setup: (_component, info) => { + const id = info.match.params.id; + this.#workspaceContext.load(id); }, }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/media-workspace.stories.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/media-workspace.stories.ts index 82e5edea53..162440cfe3 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/media-workspace.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/media-workspace.stories.ts @@ -1,6 +1,7 @@ import './media-workspace.element'; import { Meta, Story } from '@storybook/web-components'; import { html } from 'lit'; +import { ifDefined } from 'lit/directives/if-defined.js'; import { data as mediaNodes } from '../../../../core/mocks/data/media.data'; import type { UmbMediaWorkspaceElement } from './media-workspace.element'; @@ -11,5 +12,5 @@ export default { } as Meta; export const AAAOverview: Story = () => - html` `; + html` `; AAAOverview.storyName = 'Overview'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.repository.ts index 70b5f760b5..572e6d7fd0 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.repository.ts @@ -10,7 +10,7 @@ import { ProblemDetailsModel } from '@umbraco-cms/backoffice/backend-api'; import type { UmbTreeDataSource, UmbDetailRepository, UmbTreeRepository } from '@umbraco-cms/backoffice/repository'; // TODO => Update type when backend updated -export class UmbMemberGroupRepository implements UmbTreeRepository, UmbDetailRepository { +export class UmbMemberGroupRepository implements UmbTreeRepository, UmbDetailRepository { #init!: Promise; #host: UmbControllerHostElement; @@ -54,20 +54,20 @@ export class UmbMemberGroupRepository implements UmbTreeRepository, UmbDetailRep return { data, error }; } - async requestTreeItemsOf(parentKey: string | null) { + async requestTreeItemsOf(parentId: string | null) { const error: ProblemDetailsModel = { title: 'Not implemented' }; return { data: undefined, error }; } - async requestTreeItems(keys: Array) { + async requestTreeItems(ids: Array) { await this.#init; - if (!keys) { - const error: ProblemDetailsModel = { title: 'Keys are missing' }; + if (!ids) { + const error: ProblemDetailsModel = { title: 'Ids are missing' }; return { data: undefined, error }; } - const { data, error } = await this.#treeSource.getItems(keys); + const { data, error } = await this.#treeSource.getItems(ids); return { data, error }; } @@ -77,14 +77,14 @@ export class UmbMemberGroupRepository implements UmbTreeRepository, UmbDetailRep return this.#treeStore!.rootItems; } - async treeItemsOf(parentKey: string | null) { + async treeItemsOf(parentId: string | null) { await this.#init; - return this.#treeStore!.childrenOf(parentKey); + return this.#treeStore!.childrenOf(parentId); } - async treeItems(keys: Array) { + async treeItems(ids: Array) { await this.#init; - return this.#treeStore!.items(keys); + return this.#treeStore!.items(ids); } // DETAIL @@ -94,16 +94,16 @@ export class UmbMemberGroupRepository implements UmbTreeRepository, UmbDetailRep return this.#detailSource.createScaffold(); } - async requestByKey(key: string) { + async requestById(id: string) { await this.#init; - // TODO: should we show a notification if the key is missing? + // TODO: should we show a notification if the id is missing? // Investigate what is best for Acceptance testing, cause in that perspective a thrown error might be the best choice? - if (!key) { - const error: ProblemDetailsModel = { title: 'Key is missing' }; + if (!id) { + const error: ProblemDetailsModel = { title: 'Id is missing' }; return { error }; } - const { data, error } = await this.#detailSource.get(key); + const { data, error } = await this.#detailSource.get(id); if (data) { this.#store?.append(data); @@ -129,49 +129,44 @@ export class UmbMemberGroupRepository implements UmbTreeRepository, UmbDetailRep return { data, error }; } - async save(memberGroup: MemberGroupDetails) { + async save(id: string, memberGroup: MemberGroupDetails) { + if (!id) throw new Error('Id is missing'); + if (!memberGroup) throw new Error('Member group is missing'); + await this.#init; - if (!memberGroup || !memberGroup.name) { - const error: ProblemDetailsModel = { title: 'Member group is missing' }; - return { error }; - } - - const { error } = await this.#detailSource.update(memberGroup.key, memberGroup); + const { error } = await this.#detailSource.update(id, memberGroup); if (!error) { + this.#store?.append(memberGroup); + this.#treeStore?.updateItem(memberGroup.id, memberGroup); + const notification = { data: { message: `Member group '${memberGroup.name} saved` } }; this.#notificationContext?.peek('positive', notification); } - this.#store?.append(memberGroup); - this.#treeStore?.updateItem(memberGroup.key, { name: memberGroup.name }); - return { error }; } - async delete(key: string) { + async delete(id: string) { + if (!id) throw new Error('Id is missing'); + await this.#init; - if (!key) { - const error: ProblemDetailsModel = { title: 'Key is missing' }; - return { error }; - } - - const { error } = await this.#detailSource.delete(key); + const { error } = await this.#detailSource.delete(id); if (!error) { + // TODO: we currently don't use the detail store for anything. + // Consider to look up the data before fetching from the server. + // Consider notify a workspace if a template is deleted from the store while someone is editing it. + // TODO: would be nice to align the stores on methods/methodNames. + this.#store?.remove([id]); + this.#treeStore?.removeItem(id); + const notification = { data: { message: `Document deleted` } }; this.#notificationContext?.peek('positive', notification); } - // TODO: we currently don't use the detail store for anything. - // Consider to look up the data before fetching from the server. - // Consider notify a workspace if a template is deleted from the store while someone is editing it. - this.#store?.remove([key]); - this.#treeStore?.removeItem(key); - // TODO: would be nice to align the stores on methods/methodNames. - return { error }; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.store.ts index 5e24666945..38fd8ede11 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.store.ts @@ -11,7 +11,7 @@ import { UmbStoreBase } from '@umbraco-cms/backoffice/store'; * @description - Data Store for Member Groups */ export class UmbMemberGroupStore extends UmbStoreBase { - #data = new ArrayState([], (x) => x.key); + #data = new ArrayState([], (x) => x.id); constructor(host: UmbControllerHostElement) { super(host, UMB_MEMBER_GROUP_STORE_CONTEXT_TOKEN.toString()); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/sources/member-group.detail.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/sources/member-group.detail.server.data.ts index 379268de87..11503e3873 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/sources/member-group.detail.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/sources/member-group.detail.server.data.ts @@ -32,15 +32,15 @@ export class UmbMemberGroupDetailServerDataSource implements UmbDataSource} keys + * Fetches the items for the given ids from the server + * @param {Array} ids * @return {*} * @memberof MemberGroupTreeServerDataSource */ - async getItems(keys: Array) { - if (!keys || keys.length === 0) { + async getItems(ids: Array) { + if (!ids || ids.length === 0) { const error: ProblemDetailsModel = { title: 'Keys are missing' }; return { error }; } return tryExecuteAndNotify( this.#host, - MemberGroupResource.getTreeMemberGroupItem({ - key: keys, + MemberGroupResource.getMemberGroupItem({ + id: ids, }) ); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/member-group-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/member-group-workspace.context.ts index a59fd3ec92..ecf64222eb 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/member-group-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/member-group-workspace.context.ts @@ -22,8 +22,8 @@ export class UmbWorkspaceMemberGroupContext return this.#data.getValue(); } - getEntityKey() { - return this.getData()?.key || ''; + getEntityId() { + return this.getData()?.id || ''; } getEntityType() { @@ -40,8 +40,8 @@ export class UmbWorkspaceMemberGroupContext return; } - async load(entityKey: string) { - const { data } = await this.repository.requestByKey(entityKey); + async load(entityId: string) { + const { data } = await this.repository.requestById(entityId); if (data) { this.#data.next(data); } @@ -56,7 +56,7 @@ export class UmbWorkspaceMemberGroupContext async save() { if (!this.#data.value) return; - await this.repository.save(this.#data.value); + await this.repository.save(this.#data.value.id, this.#data.value); this.setIsNew(true); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/member-group-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/member-group-workspace.element.ts index 674512ad7f..8639559f35 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/member-group-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/member-group-workspace.element.ts @@ -1,9 +1,9 @@ import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { css, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; -import { IRoutingInfo } from 'router-slot'; import { UmbWorkspaceMemberGroupContext } from './member-group-workspace.context'; import { UmbMemberGroupWorkspaceEditElement } from './member-group-workspace-edit.element'; +import type { IRoute } from '@umbraco-cms/backoffice/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; /** @@ -27,13 +27,13 @@ export class UmbMemberGroupWorkspaceElement extends UmbLitElement { #element = new UmbMemberGroupWorkspaceEditElement(); @state() - _routes: any[] = [ + _routes: IRoute[] = [ { - path: 'edit/:key', + path: 'edit/:id', component: () => this.#element, - setup: (component: HTMLElement, info: IRoutingInfo) => { - const key = info.match.params.key; - this.#workspaceContext.load(key); + setup: (_component, info) => { + const id = info.match.params.id; + this.#workspaceContext.load(id); }, }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/member-group-workspace.stories.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/member-group-workspace.stories.ts index ac44105f27..404d9313ca 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/member-group-workspace.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/member-group-workspace.stories.ts @@ -14,5 +14,5 @@ export default { } as Meta; export const AAAOverview: Story = () => - html` `; + html` `; AAAOverview.storyName = 'Overview'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/views/info/workspace-view-member-group-info.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/views/info/workspace-view-member-group-info.element.ts index 31f73ba2a1..a8e5d16e0a 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/views/info/workspace-view-member-group-info.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/views/info/workspace-view-member-group-info.element.ts @@ -63,7 +63,7 @@ export class UmbWorkspaceViewMemberGroupInfoElement extends UmbLitElement { return html` -
${this._memberGroup?.key}
+
${this._memberGroup?.id}
`; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.repository.ts index 81eaa12de2..620347e0b4 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.repository.ts @@ -60,34 +60,34 @@ export class UmbMemberTypeRepository implements UmbTreeRepository, return { data, error, asObservable: () => this.#treeStore!.rootItems }; } - async requestTreeItemsOf(parentKey: string | null) { + async requestTreeItemsOf(parentId: string | null) { await this.#init; - if (!parentKey) { - const error: ProblemDetailsModel = { title: 'Parent key is missing' }; + if (!parentId) { + const error: ProblemDetailsModel = { title: 'Parent id is missing' }; return { data: undefined, error }; } - const { data, error } = await this.#treeSource.getChildrenOf(parentKey); + const { data, error } = await this.#treeSource.getChildrenOf(parentId); if (data) { this.#treeStore?.appendItems(data.items); } - return { data, error, asObservable: () => this.#treeStore!.childrenOf(parentKey) }; + return { data, error, asObservable: () => this.#treeStore!.childrenOf(parentId) }; } - async requestTreeItems(keys: Array) { + async requestTreeItems(ids: Array) { await this.#init; - if (!keys) { + if (!ids) { const error: ProblemDetailsModel = { title: 'Keys are missing' }; return { data: undefined, error }; } - const { data, error } = await this.#treeSource.getItems(keys); + const { data, error } = await this.#treeSource.getItems(ids); - return { data, error, asObservable: () => this.#treeStore!.items(keys) }; + return { data, error, asObservable: () => this.#treeStore!.items(ids) }; } async rootTreeItems() { @@ -95,14 +95,14 @@ export class UmbMemberTypeRepository implements UmbTreeRepository, return this.#treeStore!.rootItems; } - async treeItemsOf(parentKey: string | null) { + async treeItemsOf(parentId: string | null) { await this.#init; - return this.#treeStore!.childrenOf(parentKey); + return this.#treeStore!.childrenOf(parentId); } - async treeItems(keys: Array) { + async treeItems(ids: Array) { await this.#init; - return this.#treeStore!.items(keys); + return this.#treeStore!.items(ids); } // DETAILS @@ -112,16 +112,16 @@ export class UmbMemberTypeRepository implements UmbTreeRepository, return this.#detailSource.createScaffold(); } - async requestByKey(key: string) { + async requestById(id: string) { await this.#init; - // TODO: should we show a notification if the key is missing? + // TODO: should we show a notification if the id is missing? // Investigate what is best for Acceptance testing, cause in that perspective a thrown error might be the best choice? - if (!key) { + if (!id) { const error: ProblemDetailsModel = { title: 'Key is missing' }; return { error }; } - const { data, error } = await this.#detailSource.requestByKey(key); + const { data, error } = await this.#detailSource.requestById(id); if (data) { this.#store?.append(data); @@ -129,15 +129,15 @@ export class UmbMemberTypeRepository implements UmbTreeRepository, return { data, error }; } - async delete(key: string) { + async delete(id: string) { await this.#init; - if (!key) { + if (!id) { const error: ProblemDetailsModel = { title: 'Key is missing' }; return { error }; } - const { error } = await this.#detailSource.delete(key); + const { error } = await this.#detailSource.delete(id); if (!error) { const notification = { data: { message: `Member type deleted` } }; @@ -147,37 +147,33 @@ export class UmbMemberTypeRepository implements UmbTreeRepository, // TODO: we currently don't use the detail store for anything. // Consider to look up the data before fetching from the server. // Consider notify a workspace if a member type is deleted from the store while someone is editing it. - this.#store?.remove([key]); - this.#treeStore?.removeItem(key); + this.#store?.remove([id]); + this.#treeStore?.removeItem(id); // TODO: would be nice to align the stores on methods/methodNames. return { error }; } - async save(detail: ItemType) { + async save(id: string, updatedMemberType: any) { + if (!id) throw new Error('Key is missing'); + if (!updatedMemberType) throw new Error('Member Type is missing'); + await this.#init; - // TODO: should we show a notification if the MemberType is missing? - // Investigate what is best for Acceptance testing, cause in that perspective a thrown error might be the best choice? - if (!detail || !detail.key) { - const error: ProblemDetailsModel = { title: 'Member type is missing' }; - return { error }; - } - - const { error } = await this.#detailSource.save(detail); + const { error } = await this.#detailSource.save(id, updatedMemberType); if (!error) { - const notification = { data: { message: `Member type '${detail.name}' saved` } }; + // TODO: we currently don't use the detail store for anything. + // Consider to look up the data before fetching from the server + // Consider notify a workspace if a member type is updated in the store while someone is editing it. + // TODO: would be nice to align the stores on methods/methodNames. + //this.#store?.append(detail); + this.#treeStore?.updateItem(id, updatedMemberType); + + const notification = { data: { message: `Member type '${updatedMemberType.name}' saved` } }; this.#notificationContext?.peek('positive', notification); } - // TODO: we currently don't use the detail store for anything. - // Consider to look up the data before fetching from the server - // Consider notify a workspace if a member type is updated in the store while someone is editing it. - this.#store?.append(detail); - this.#treeStore?.updateItem(detail.key, { name: detail.name }); - // TODO: would be nice to align the stores on methods/methodNames. - return { error }; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.store.ts index 7624273435..b9afd506a2 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.store.ts @@ -11,7 +11,7 @@ import type { MemberTypeDetails } from '@umbraco-cms/backoffice/models'; * @description - Data Store for Member Types */ export class UmbMemberTypeStore extends UmbStoreBase { - #data = new ArrayState([], (x) => x.key); + #data = new ArrayState([], (x) => x.id); constructor(host: UmbControllerHostElement) { super(host, UMB_MEMBER_TYPE_STORE_CONTEXT_TOKEN.toString()); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/sources/member-type.detail.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/sources/member-type.detail.server.data.ts index b0e33984ed..ab8466c03c 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/sources/member-type.detail.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/sources/member-type.detail.server.data.ts @@ -10,7 +10,7 @@ import { UmbDetailRepository } from '@umbraco-cms/backoffice/repository'; * @class UmbMemberTypeDetailServerDataSource * @implements {MemberTypeDetailDataSource} */ -export class UmbMemberTypeDetailServerDataSource implements UmbDetailRepository { +export class UmbMemberTypeDetailServerDataSource implements UmbDetailRepository { #host: UmbControllerHostElement; constructor(host: UmbControllerHostElement) { @@ -28,15 +28,15 @@ export class UmbMemberTypeDetailServerDataSource implements UmbDetailRepository< } /** - * @description - Fetches a MemberType with the given key from the server - * @param {string} key + * @description - Fetches a MemberType with the given id from the server + * @param {string} id * @return {*} * @memberof UmbMemberTypeDetailServerDataSource */ - requestByKey(key: string) { - //return tryExecuteAndNotify(this.#host, MemberTypeResource.getMemberTypeByKey({ key })); + requestById(id: string) { + //return tryExecuteAndNotify(this.#host, MemberTypeResource.getMemberTypeByKey({ id })); // TODO => use backend cli when available. - return tryExecuteAndNotify(this.#host, fetch(`/umbraco/management/api/v1/member-group/${key}`)) as any; + return tryExecuteAndNotify(this.#host, fetch(`/umbraco/management/api/v1/member-group/${id}`)) as any; } /** @@ -45,19 +45,16 @@ export class UmbMemberTypeDetailServerDataSource implements UmbDetailRepository< * @return {*} * @memberof UmbMemberTypeDetailServerDataSource */ - async save(memberType: MemberTypeDetails) { - if (!memberType.key) { - const error: ProblemDetailsModel = { title: 'MemberType key is missing' }; - return { error }; - } + async save(id: string, memberType: any) { + if (!id) throw new Error('Member Type id is missing'); - const payload = { key: memberType.key, requestBody: memberType }; + const payload = { id: memberType.id, requestBody: memberType }; //return tryExecuteAndNotify(this.#host, MemberTypeResource.putMemberTypeByKey(payload)); // TODO => use backend cli when available. return tryExecuteAndNotify( this.#host, - fetch(`/umbraco/management/api/v1/member-type/${memberType.key}`, { + fetch(`/umbraco/management/api/v1/member-type/${memberType.id}`, { method: 'PUT', body: JSON.stringify(payload), headers: { @@ -94,21 +91,21 @@ export class UmbMemberTypeDetailServerDataSource implements UmbDetailRepository< /** * @description - Deletes a MemberType on the server - * @param {string} key + * @param {string} id * @return {*} * @memberof UmbMemberTypeDetailServerDataSource */ - async delete(key: string) { - if (!key) { + async delete(id: string) { + if (!id) { const error: ProblemDetailsModel = { title: 'Key is missing' }; return { error }; } - //return await tryExecuteAndNotify(this.#host, MemberTypeResource.deleteMemberTypeByKey({ key })); + //return await tryExecuteAndNotify(this.#host, MemberTypeResource.deleteMemberTypeByKey({ id })); // TODO => use backend cli when available. return tryExecuteAndNotify( this.#host, - fetch(`/umbraco/management/api/v1/member-type/${key}`, { + fetch(`/umbraco/management/api/v1/member-type/${id}`, { method: 'DELETE', }) ) as any; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/sources/member-type.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/sources/member-type.tree.server.data.ts index 6202393162..0c1abf952a 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/sources/member-type.tree.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/sources/member-type.tree.server.data.ts @@ -31,32 +31,32 @@ export class MemberTypeTreeServerDataSource implements UmbTreeDataSource { } /** - * Fetches the children of a given parent key from the server - * @param {(string | null)} parentKey + * Fetches the children of a given parent id from the server + * @param {(string | null)} parentId * @return {*} * @memberof MemberTypeTreeServerDataSource */ - async getChildrenOf(parentKey: string | null) { + async getChildrenOf(parentId: string | null) { const error: ProblemDetailsModel = { title: 'Not implemented for Member Type' }; return { error }; } /** - * Fetches the items for the given keys from the server - * @param {Array} keys + * Fetches the items for the given ids from the server + * @param {Array} ids * @return {*} * @memberof MemberTypeTreeServerDataSource */ - async getItems(keys: Array) { - if (!keys || keys.length === 0) { - const error: ProblemDetailsModel = { title: 'Keys are missing' }; + async getItems(ids: Array) { + if (!ids || ids.length === 0) { + const error: ProblemDetailsModel = { title: 'Ids are missing' }; return { error }; } return tryExecuteAndNotify( this.#host, - MemberTypeResource.getTreeMemberTypeItem({ - key: keys, + MemberTypeResource.getMemberTypeItem({ + id: ids, }) ); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/workspace/member-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/workspace/member-type-workspace.context.ts index b20ae7528e..8274bec279 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/workspace/member-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/workspace/member-type-workspace.context.ts @@ -18,8 +18,8 @@ export class UmbMemberTypeWorkspaceContext super(host, new UmbMemberTypeRepository(host)); } - async load(entityKey: string) { - const { data } = await this.repository.requestByKey(entityKey); + async load(entityId: string) { + const { data } = await this.repository.requestById(entityId); if (data) { this.setIsNew(false); this.#data.next(data); @@ -37,8 +37,8 @@ export class UmbMemberTypeWorkspaceContext return this.#data.getValue(); } - getEntityKey() { - return this.getData()?.key || ''; + getEntityId() { + return this.getData()?.id || ''; } getEntityType() { @@ -55,17 +55,19 @@ export class UmbMemberTypeWorkspaceContext async save() { if (!this.#data.value) return; + if (!this.#data.value.id) return; + if (this.isNew) { await this.repository.create(this.#data.value); } else { - await this.repository.save(this.#data.value); + await this.repository.save(this.#data.value.id, this.#data.value); } // If it went well, then its not new anymore?. this.setIsNew(false); } - async delete(key: string) { - await this.repository.delete(key); + async delete(id: string) { + await this.repository.delete(id); } public destroy(): void { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/workspace/member-type-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/workspace/member-type-workspace.element.ts index a5e1593549..f7cbc5f788 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/workspace/member-type-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/workspace/member-type-workspace.element.ts @@ -1,9 +1,9 @@ import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { css, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; -import { IRoutingInfo } from 'router-slot'; import { UmbMemberTypeWorkspaceEditElement } from './member-type-workspace-edit.element'; import { UmbMemberTypeWorkspaceContext } from './member-type-workspace.context'; +import { IRoute } from '@umbraco-cms/backoffice/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-member-type-workspace') @@ -23,13 +23,13 @@ export class UmbMemberTypeWorkspaceElement extends UmbLitElement { #element = new UmbMemberTypeWorkspaceEditElement(); @state() - _routes: any[] = [ + _routes: IRoute[] = [ { - path: 'edit/:key', + path: 'edit/:id', component: () => this.#element, - setup: (component: HTMLElement, info: IRoutingInfo) => { - const key = info.match.params.key; - this.#workspaceContext.load(key); + setup: (_component, info) => { + const id = info.match.params.id; + this.#workspaceContext.load(id); }, }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/member.detail.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/member.detail.store.ts index b110fcfbe8..973f79f5c4 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/member.detail.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/member.detail.store.ts @@ -13,37 +13,37 @@ import { UmbEntityDetailStore, UmbStoreBase } from '@umbraco-cms/backoffice/stor * @description - Data Store for Members */ export class UmbMemberStore extends UmbStoreBase implements UmbEntityDetailStore { - #data = new ArrayState([], (x) => x.key); + #data = new ArrayState([], (x) => x.id); public groups = this.#data.asObservable(); constructor(private host: UmbControllerHostElement) { super(host, UMB_MEMBER_STORE_CONTEXT_TOKEN.toString()); } - getScaffold(entityType: string, parentKey: string | null) { + getScaffold(entityType: string, parentId: string | null) { return {} as MemberDetails; } /** - * @description - Request a Member by key. The Member is added to the store and is returned as an Observable. - * @param {string} key + * @description - Request a Member by id. The Member is added to the store and is returned as an Observable. + * @param {string} id * @return {*} {(Observable)} * @memberof UmbMemberStore */ - getByKey(key: string): Observable { - // tryExecuteAndNotify(this.host, MemberResource.getMemberByKey({ key })).then(({ data }) => { + getByKey(id: string): Observable { + // tryExecuteAndNotify(this.host, MemberResource.getMemberByKey({ id })).then(({ data }) => { // if (data) {} // this.#data.appendOne(data); // } // }); // temp until Resource is updated - const member = umbMemberData.getByKey(key); + const member = umbMemberData.getById(id); if (member) { this.#data.appendOne(member); } - return createObservablePart(this.#data, (members) => members.find((member) => member.key === key) as MemberDetails); + return createObservablePart(this.#data, (members) => members.find((member) => member.id === id) as MemberDetails); } async save(member: Array): Promise { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/member.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/member.repository.ts index b0e6c529c6..cf91bf0bf9 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/member.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/member.repository.ts @@ -53,20 +53,20 @@ export class UmbMemberRepository implements UmbTreeRepository { return { data, error }; } - async requestTreeItemsOf(parentKey: string | null) { + async requestTreeItemsOf(parentId: string | null) { const error: ProblemDetailsModel = { title: 'Not implemented' }; return { data: undefined, error }; } - async requestTreeItems(keys: Array) { + async requestTreeItems(ids: Array) { await this.#init; - if (!keys) { + if (!ids) { const error: ProblemDetailsModel = { title: 'Keys are missing' }; return { data: undefined, error }; } - const { data, error } = await this.#dataSource.getItems(keys); + const { data, error } = await this.#dataSource.getItems(ids); return { data, error }; } @@ -76,13 +76,13 @@ export class UmbMemberRepository implements UmbTreeRepository { return this.#treeStore!.rootItems; } - async treeItemsOf(parentKey: string | null) { + async treeItemsOf(parentId: string | null) { await this.#init; - return this.#treeStore!.childrenOf(parentKey); + return this.#treeStore!.childrenOf(parentId); } - async treeItems(keys: Array) { + async treeItems(ids: Array) { await this.#init; - return this.#treeStore!.items(keys); + return this.#treeStore!.items(ids); } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/member.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/member.store.ts index 518d0b5c47..4b01b1a8d8 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/member.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/member.store.ts @@ -11,7 +11,7 @@ import type { MemberDetails } from '@umbraco-cms/backoffice/models'; * @description - Data Store for Members */ export class UmbMemberStore extends UmbStoreBase { - #data = new ArrayState([], (x) => x.key); + #data = new ArrayState([], (x) => x.id); constructor(host: UmbControllerHostElement) { super(host, UMB_MEMBER_STORE_CONTEXT_TOKEN.toString()); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/sources/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/sources/index.ts index c327035dfc..2b26859baf 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/sources/index.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/sources/index.ts @@ -6,5 +6,5 @@ import type { export interface MemberTreeDataSource { getRootItems(): Promise>; - getItems(key: Array): Promise>; + getItems(id: Array): Promise>; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/sources/member.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/sources/member.tree.server.data.ts index b22acf103c..b386fb52e2 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/sources/member.tree.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/sources/member.tree.server.data.ts @@ -33,26 +33,26 @@ export class MemberTreeServerDataSource implements MemberTreeDataSource { } /** - * Fetches the items for the given keys from the server - * @param {Array} keys + * Fetches the items for the given ids from the server + * @param {Array} ids * @return {*} * @memberof MemberTreeServerDataSource */ - async getItems(keys: Array) { + async getItems(ids: Array) { const response = await fetch('/umbraco/management/api/v1/tree/member/item'); const data = await response.json(); return { data, error: undefined }; - // if (keys) { - // const error: ProblemDetailsModel = { title: 'Keys are missing' }; + // if (ids) { + // const error: ProblemDetailsModel = { title: 'Ids are missing' }; // return { error }; // } // return tryExecuteAndNotify( // this.#host, // MemberResource.getTreeMemberItem({ - // key: keys, + // id: ids, // }) // ); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/workspace/member-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/workspace/member-workspace.context.ts index 7f7367ced3..3edd6f8b1e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/workspace/member-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/workspace/member-workspace.context.ts @@ -16,7 +16,7 @@ export class UmbMemberWorkspaceContext return 'member'; } - getEntityKey() { + getEntityId() { return '1234'; } @@ -28,8 +28,8 @@ export class UmbMemberWorkspaceContext console.log('save'); } - async load(key: string) { - console.log('load', key); + async load(id: string) { + console.log('load', id); } public destroy(): void { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/workspace/member-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/workspace/member-workspace.element.ts index 5b76fa0e97..dbe2e140cf 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/workspace/member-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/workspace/member-workspace.element.ts @@ -1,9 +1,9 @@ import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { css, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; -import { IRoutingInfo } from 'router-slot'; import { UmbMemberWorkspaceEditElement } from './member-workspace-edit.element'; import { UmbMemberWorkspaceContext } from './member-workspace.context'; +import type { IRoute } from '@umbraco-cms/backoffice/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-member-workspace') @@ -23,13 +23,13 @@ export class UmbMemberWorkspaceElement extends UmbLitElement { #element = new UmbMemberWorkspaceEditElement(); @state() - _routes: any[] = [ + _routes: IRoute[] = [ { - path: 'edit/:key', + path: 'edit/:id', component: () => this.#element, - setup: (component: HTMLElement, info: IRoutingInfo) => { - const key = info.match.params.key; - this.#workspaceContext.load(key); + setup: (_component, info) => { + const id = info.match.params.id; + this.#workspaceContext.load(id); }, }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/workspace/member-workspace.stories.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/workspace/member-workspace.stories.ts index ebe1cce2ce..2af3d29bf2 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/workspace/member-workspace.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/workspace/member-workspace.stories.ts @@ -14,5 +14,5 @@ export default { } as Meta; export const AAAOverview: Story = () => - html` `; + html` `; AAAOverview.storyName = 'Overview'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-builder/workspace/workspace-package-builder.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-builder/workspace/workspace-package-builder.element.ts index 8903993ffb..9dce5a6dca 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-builder/workspace/workspace-package-builder.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-builder/workspace/workspace-package-builder.element.ts @@ -38,7 +38,7 @@ export class UmbWorkspacePackageBuilderElement extends UmbLitElement { ]; @property() - entityKey?: string; + entityId?: string; @state() private _package: PackageDefinitionResponseModel = {}; @@ -57,22 +57,19 @@ export class UmbWorkspacePackageBuilderElement extends UmbLitElement { connectedCallback(): void { super.connectedCallback(); - if (this.entityKey) this.#getPackageCreated(); + if (this.entityId) this.#getPackageCreated(); } async #getPackageCreated() { - if (!this.entityKey) return; - const { data } = await tryExecuteAndNotify(this, PackageResource.getPackageCreatedByKey({ key: this.entityKey })); + if (!this.entityId) return; + const { data } = await tryExecuteAndNotify(this, PackageResource.getPackageCreatedById({ id: this.entityId })); if (!data) return; this._package = data as PackageDefinitionResponseModel; } async #download() { - if (!this._package?.key) return; - const response = await tryExecuteAndNotify( - this, - PackageResource.getPackageCreatedByKeyDownload({ key: this._package.key }) - ); + if (!this._package?.id) return; + await tryExecuteAndNotify(this, PackageResource.getPackageCreatedByIdDownload({ id: this._package.id })); } #nameDefined() { @@ -94,10 +91,10 @@ export class UmbWorkspacePackageBuilderElement extends UmbLitElement { async #update() { if (!this.#nameDefined()) return; - if (!this._package?.key) return; + if (!this._package?.id) return; const response = await tryExecuteAndNotify( this, - PackageResource.putPackageCreatedByKey({ key: this._package.key, requestBody: this._package }) + PackageResource.putPackageCreatedById({ id: this._package.id, requestBody: this._package }) ); if (response.error) return; @@ -105,7 +102,7 @@ export class UmbWorkspacePackageBuilderElement extends UmbLitElement { } #navigateBack() { - window.history.pushState({}, '', '/section/packages/view/created'); + window.history.pushState({}, '', 'section/packages/view/created'); } render() { @@ -135,13 +132,13 @@ export class UmbWorkspacePackageBuilderElement extends UmbLitElement { #renderActions() { return html`
- ${this._package?.key + ${this._package?.id ? html` Download ` : nothing} @@ -203,7 +200,7 @@ export class UmbWorkspacePackageBuilderElement extends UmbLitElement { .value=${this._package.contentNodeId ?? ''} max="1" @change="${(e: CustomEvent) => - (this._package.contentNodeId = (e.target as UmbInputDocumentPickerElement).selectedKeys[0])}"> + (this._package.contentNodeId = (e.target as UmbInputDocumentPickerElement).selectedIds[0])}"> + (this._package.mediaIds = (e.target as UmbInputMediaPickerElement).selectedIds)}"> import('./packages-created-overview.element'), @@ -33,12 +33,12 @@ export class UmbCreatedPackagesSectionViewElement extends UmbLitElement { // TODO: find a way to make this reuseable across: this._workspaces?.map((workspace: ManifestWorkspace) => { routes.push({ - path: `${workspace.meta.entityType}/:key`, + path: `${workspace.meta.entityType}/:id`, component: () => createExtensionElement(workspace), - setup: (component: Promise, info: IRoutingInfo) => { - component.then((el: HTMLElement) => { - (el as any).entityKey = info.match.params.key; - }); + setup: (component, info) => { + if (component) { + (component as any).entityId = info.match.params.id; + } }, }); routes.push({ diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/created/packages-created-overview.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/created/packages-created-overview.element.ts index 11cd97a2fc..0ae1e74eec 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/created/packages-created-overview.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/created/packages-created-overview.element.ts @@ -77,7 +77,7 @@ export class UmbPackagesCreatedOverviewElement extends UmbLitElement { } #createNewPackage() { - window.history.pushState({}, '', `/section/packages/view/created/package-builder`); + window.history.pushState({}, '', `section/packages/view/created/package-builder`); } render() { @@ -95,7 +95,7 @@ export class UmbPackagesCreatedOverviewElement extends UmbLitElement { ${repeat( this._createdPackages, - (item) => item.key, + (item) => item.id, (item) => this.#renderPackageItem(item) )} @@ -113,8 +113,8 @@ export class UmbPackagesCreatedOverviewElement extends UmbLitElement { } #packageBuilder(p: PackageDefinitionResponseModel) { - if (!p.key) return; - window.history.pushState({}, '', `/section/packages/view/created/package-builder/${p.key}`); + if (!p.id) return; + window.history.pushState({}, '', `section/packages/view/created/package-builder/${p.id}`); } #renderPagination() { @@ -133,7 +133,7 @@ export class UmbPackagesCreatedOverviewElement extends UmbLitElement { } async #deletePackage(p: PackageDefinitionResponseModel) { - if (!p.key) return; + if (!p.id) return; const modalHandler = this._modalContext?.open(UMB_CONFIRM_MODAL, { color: 'danger', headline: `Remove ${p.name}?`, @@ -143,9 +143,9 @@ export class UmbPackagesCreatedOverviewElement extends UmbLitElement { await modalHandler?.onSubmit(); - const { error } = await tryExecuteAndNotify(this, PackageResource.deletePackageCreatedByKey({ key: p.key })); + const { error } = await tryExecuteAndNotify(this, PackageResource.deletePackageCreatedById({ id: p.id })); if (error) return; - const index = this._createdPackages.findIndex((x) => x.key === p.key); + const index = this._createdPackages.findIndex((x) => x.id === p.id); this._createdPackages.splice(index, 1); this.requestUpdate(); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/examine-management/dashboard-examine-management.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/examine-management/dashboard-examine-management.element.ts index 4fdafa6210..3c9b8fe4db 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/examine-management/dashboard-examine-management.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/examine-management/dashboard-examine-management.element.ts @@ -3,7 +3,8 @@ import { customElement, state } from 'lit/decorators.js'; import { UmbDashboardExamineIndexElement } from './views/section-view-examine-indexers'; import { UmbDashboardExamineSearcherElement } from './views/section-view-examine-searchers'; -import type { IRoute, IRoutingInfo, UmbRouterSlotChangeEvent, UmbRouterSlotInitEvent } from '@umbraco-cms/internal/router'; +import type { IRoute } from '@umbraco-cms/backoffice/router'; +import type { UmbRouterSlotChangeEvent, UmbRouterSlotInitEvent } from '@umbraco-cms/internal/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @@ -26,7 +27,7 @@ export class UmbDashboardExamineManagementElement extends UmbLitElement { { path: `/index/:indexerName`, component: () => import('./views/section-view-examine-indexers'), - setup: (component: HTMLElement, info: IRoutingInfo) => { + setup: (component, info) => { const element = component as UmbDashboardExamineIndexElement; element.indexName = info.match.params.indexerName; }, @@ -34,7 +35,7 @@ export class UmbDashboardExamineManagementElement extends UmbLitElement { { path: `/searcher/:searcherName`, component: () => import('./views/section-view-examine-searchers'), - setup: (component: HTMLElement, info: IRoutingInfo) => { + setup: (component, info) => { const element = component as UmbDashboardExamineSearcherElement; element.searcherName = info.match.params.searcherName; }, diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/health-check/dashboard-health-check.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/health-check/dashboard-health-check.element.ts index 1828d225a1..cce292cb19 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/health-check/dashboard-health-check.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/health-check/dashboard-health-check.element.ts @@ -6,7 +6,7 @@ import { UMB_HEALTHCHECK_DASHBOARD_CONTEXT_TOKEN, } from './health-check-dashboard.context'; import { UmbHealthCheckContext } from './health-check.context'; -import type { IRoute, IRoutingInfo } from '@umbraco-cms/internal/router'; +import type { IRoute } from '@umbraco-cms/backoffice/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { ManifestHealthCheck } from '@umbraco-cms/backoffice/extensions-registry'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extensions-api'; @@ -20,7 +20,7 @@ export class UmbDashboardHealthCheckElement extends UmbLitElement { { path: `/:groupName`, component: () => import('./views/health-check-group.element'), - setup: (component: HTMLElement, info: IRoutingInfo) => { + setup: (component, info) => { const element = component as UmbDashboardHealthCheckGroupElement; element.groupName = decodeURI(info.match.params.groupName); }, diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/health-check/views/health-check-group-box-overview.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/health-check/views/health-check-group-box-overview.element.ts index a298ec6672..53296360cf 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/health-check/views/health-check-group-box-overview.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/health-check/views/health-check-group-box-overview.element.ts @@ -6,7 +6,7 @@ import { UMB_HEALTHCHECK_DASHBOARD_CONTEXT_TOKEN, UmbHealthCheckDashboardContext, } from '../health-check-dashboard.context'; -import { ensureSlash, path } from '@umbraco-cms/internal/router'; +import { ensureSlash, path } from '@umbraco-cms/backoffice/router'; import type { ManifestHealthCheck } from '@umbraco-cms/backoffice/extensions-registry'; import { HealthCheckGroupWithResultResponseModel, StatusResultTypeModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/health-check/views/health-check-group.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/health-check/views/health-check-group.element.ts index 97459331cf..8480c9d534 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/health-check/views/health-check-group.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/health-check/views/health-check-group.element.ts @@ -87,7 +87,7 @@ export class UmbDashboardHealthCheckGroupElement extends UmbLitElement { private _checks?: HealthCheckModel[]; @state() - private _keyResults?: HealthCheckWithResultPresentationModel[]; + private _idResults?: HealthCheckWithResultPresentationModel[]; private _api?: UmbHealthCheckContext; @@ -106,7 +106,7 @@ export class UmbDashboardHealthCheckGroupElement extends UmbLitElement { }); this._api?.results.subscribe((results) => { - this._keyResults = results?.checks; + this._idResults = results?.checks; }); }); } @@ -143,18 +143,18 @@ export class UmbDashboardHealthCheckGroupElement extends UmbLitElement { ${this._group?.checks?.map((check) => { return html`

${check.description}

- ${check.key ? this.renderCheckResults(check.key) : nothing} + ${check.id ? this.renderCheckResults(check.id) : nothing}
`; })}
`; } - renderCheckResults(key: string) { - if (!this._keyResults) { + renderCheckResults(id: string) { + if (!this._idResults) { return nothing; } - const checkResults = this._keyResults.find((x) => x.key === key); + const checkResults = this._idResults.find((x) => x.id === id); if (!checkResults) { return nothing; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/entity-actions/create/create.action.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/entity-actions/create/create.action.ts index 5849726dd0..bf87193435 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/entity-actions/create/create.action.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/entity-actions/create/create.action.ts @@ -1,5 +1,5 @@ import { UmbDataTypeRepository } from '../../repository/data-type.repository'; -import { UMB_CREATE_DATA_TYPE_MODAL } from './modal'; +import { UMB_DATA_TYPE_CREATE_OPTIONS_MODAL } from './modal'; import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; @@ -17,9 +17,11 @@ export class UmbCreateDataTypeEntityAction extends UmbEntityActionBase = [ type: 'entityAction', alias: 'Umb.EntityAction.DataType.Create', name: 'Create Data Type Entity Action', - weight: 900, + weight: 1000, meta: { icon: 'umb:add', label: 'Create', @@ -15,14 +15,14 @@ const entityActions: Array = [ api: UmbCreateDataTypeEntityAction, }, conditions: { - entityType: 'data-type-root', + entityType: 'data-type', }, }, { type: 'modal', - alias: 'Umb.Modal.CreateDataType', - name: 'Create Data Type Modal', - loader: () => import('./modal/create-data-type-modal.element'), + alias: 'Umb.Modal.DataTypeCreateOptions', + name: 'Data Type Create Options Modal', + loader: () => import('./modal/data-type-create-options-modal.element'), }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/entity-actions/create/modal/create-data-type-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/entity-actions/create/modal/data-type-create-options-modal.element.ts similarity index 53% rename from src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/entity-actions/create/modal/create-data-type-modal.element.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/entity-actions/create/modal/data-type-create-options-modal.element.ts index cfe48669f7..f4c615847c 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/entity-actions/create/modal/create-data-type-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/entity-actions/create/modal/data-type-create-options-modal.element.ts @@ -1,14 +1,26 @@ import { html } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; -import { customElement } from 'lit/decorators.js'; +import { customElement, property } from 'lit/decorators.js'; import { DATA_TYPE_REPOSITORY_ALIAS } from '../../../repository/manifests'; -import { UmbModalBaseElement } from '@umbraco-cms/internal/modal'; -import { UmbModalContext, UMB_FOLDER_MODAL, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; +import { UmbDataTypeCreateOptionsModalData } from '.'; +import { + UmbModalContext, + UmbModalHandler, + UMB_FOLDER_MODAL, + UMB_MODAL_CONTEXT_TOKEN, +} from '@umbraco-cms/backoffice/modal'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -@customElement('umb-create-data-type-modal') -export class UmbCreateDataTypeModalElement extends UmbModalBaseElement { +@customElement('umb-data-type-create-options-modal') +export class UmbDataTypeCreateOptionsModalElement extends UmbLitElement { static styles = [UUITextStyles]; + @property({ attribute: false }) + modalHandler?: UmbModalHandler; + + @property({ type: Object }) + data?: UmbDataTypeCreateOptionsModalData; + #modalContext?: UmbModalContext; constructor() { @@ -26,6 +38,11 @@ export class UmbCreateDataTypeModalElement extends UmbModalBaseElement { folderModalHandler?.onSubmit().then(() => this.modalHandler?.submit()); } + // close the modal when navigating to data type + #onNavigate() { + this.modalHandler?.submit(); + } + #onCancel() { this.modalHandler?.reject(); } @@ -34,7 +51,11 @@ export class UmbCreateDataTypeModalElement extends UmbModalBaseElement { return html` - + + } @@ -47,10 +68,10 @@ export class UmbCreateDataTypeModalElement extends UmbModalBaseElement { } } -export default UmbCreateDataTypeModalElement; +export default UmbDataTypeCreateOptionsModalElement; declare global { interface HTMLElementTagNameMap { - 'umb-create-data-type-modal': UmbCreateDataTypeModalElement; + 'umb-data-type-create-options-modal': UmbDataTypeCreateOptionsModalElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/entity-actions/create/modal/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/entity-actions/create/modal/index.ts index 9e1e8eb025..c6565fb240 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/entity-actions/create/modal/index.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/entity-actions/create/modal/index.ts @@ -1,6 +1,13 @@ import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; -export const UMB_CREATE_DATA_TYPE_MODAL = new UmbModalToken('Umb.Modal.CreateDataType', { - type: 'sidebar', - size: 'small', -}); +export interface UmbDataTypeCreateOptionsModalData { + parentKey: string | null; +} + +export const UMB_DATA_TYPE_CREATE_OPTIONS_MODAL = new UmbModalToken( + 'Umb.Modal.DataTypeCreateOptions', + { + type: 'sidebar', + size: 'small', + } +); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/menu-item/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/menu-item/manifests.ts index 1f44f2d881..29c995c92a 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/menu-item/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/menu-item/manifests.ts @@ -9,7 +9,7 @@ const menuItem: ManifestTypes = { meta: { label: 'Data Types', icon: 'umb:folder', - entityType: 'data-type-root', + entityType: 'data-type', treeAlias: 'Umb.Tree.DataTypes', }, conditions: { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/data-type.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/data-type.repository.ts index d08e01a230..21a4d02041 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/data-type.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/data-type.repository.ts @@ -23,11 +23,11 @@ import { import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; import { UmbFolderRepository } from '@umbraco-cms/backoffice/repository'; -type ItemType = DataTypeResponseModel; -type TreeItemType = any; - export class UmbDataTypeRepository - implements UmbTreeRepository, UmbDetailRepository, UmbFolderRepository + implements + UmbTreeRepository, + UmbDetailRepository, + UmbFolderRepository { #init!: Promise; @@ -77,26 +77,26 @@ export class UmbDataTypeRepository return { data, error, asObservable: () => this.#treeStore!.rootItems }; } - async requestTreeItemsOf(parentKey: string | null) { - if (!parentKey) throw new Error('Parent key is missing'); + async requestTreeItemsOf(parentId: string | null) { + if (!parentId) throw new Error('Parent id is missing'); await this.#init; - const { data, error } = await this.#treeSource.getChildrenOf(parentKey); + const { data, error } = await this.#treeSource.getChildrenOf(parentId); if (data) { this.#treeStore?.appendItems(data.items); } - return { data, error, asObservable: () => this.#treeStore!.childrenOf(parentKey) }; + return { data, error, asObservable: () => this.#treeStore!.childrenOf(parentId) }; } - async requestTreeItems(keys: Array) { - if (!keys) throw new Error('Keys are missing'); + async requestTreeItems(ids: Array) { + if (!ids) throw new Error('Keys are missing'); await this.#init; - const { data, error } = await this.#treeSource.getItems(keys); + const { data, error } = await this.#treeSource.getItems(ids); - return { data, error, asObservable: () => this.#treeStore!.items(keys) }; + return { data, error, asObservable: () => this.#treeStore!.items(ids) }; } async rootTreeItems() { @@ -104,31 +104,31 @@ export class UmbDataTypeRepository return this.#treeStore!.rootItems; } - async treeItemsOf(parentKey: string | null) { - if (parentKey === undefined) throw new Error('Parent key is missing'); + async treeItemsOf(parentId: string | null) { + if (parentId === undefined) throw new Error('Parent id is missing'); await this.#init; - return this.#treeStore!.childrenOf(parentKey); + return this.#treeStore!.childrenOf(parentId); } - async treeItems(keys: Array) { + async treeItems(ids: Array) { await this.#init; - return this.#treeStore!.items(keys); + return this.#treeStore!.items(ids); } // DETAILS: - async createScaffold(parentKey: string | null) { - if (parentKey === undefined) throw new Error('Parent key is missing'); + async createScaffold(parentId: string | null) { + if (parentId === undefined) throw new Error('Parent id is missing'); await this.#init; - return this.#detailSource.createScaffold(parentKey); + return this.#detailSource.createScaffold(parentId); } - async requestByKey(key: string) { - if (!key) throw new Error('Key is missing'); + async requestById(id: string) { + if (!id) throw new Error('Key is missing'); await this.#init; - const { data, error } = await this.#detailSource.get(key); + const { data, error } = await this.#detailSource.get(id); if (data) { this.#detailStore?.append(data); @@ -137,140 +137,130 @@ export class UmbDataTypeRepository return { data, error }; } - async byKey(key: string) { - if (!key) throw new Error('Key is missing'); + async byId(id: string) { + if (!id) throw new Error('Key is missing'); await this.#init; - return this.#detailStore!.byKey(key); + return this.#detailStore!.byId(id); } - // Could potentially be general methods: - async create(dataType: ItemType) { + async create(dataType: CreateDataTypeRequestModel) { if (!dataType) throw new Error('Data Type is missing'); - if (!dataType.key) throw new Error('Data Type key is missing'); + if (!dataType.id) throw new Error('Data Type id is missing'); await this.#init; const { error } = await this.#detailSource.insert(dataType); if (!error) { + // TODO: We need to push a new item to the tree store to update the tree. How do we want to create the tree items? + const treeItem = createTreeItem(dataType); + this.#treeStore?.appendItems([treeItem]); + //this.#detailStore?.append(dataType); + const notification = { data: { message: `Data Type created` } }; this.#notificationContext?.peek('positive', notification); - - this.#detailStore?.append(dataType); - this.#treeStore?.appendItems([dataType]); } return { error }; } - async save(dataType: ItemType) { - if (!dataType) throw new Error('Data Type is missing'); - if (!dataType.key) throw new Error('Data Type key is missing'); + async save(id: string, updatedDataType: UpdateDataTypeRequestModel) { + if (!id) throw new Error('Data Type id is missing'); + if (!updatedDataType) throw new Error('Data Type is missing'); await this.#init; - const { error } = await this.#detailSource.update(dataType.key, dataType); + const { error } = await this.#detailSource.update(id, updatedDataType); if (!error) { + // TODO: we currently don't use the detail store for anything. + // Consider to look up the data before fetching from the server + // Consider notify a workspace if a template is updated in the store while someone is editing it. + // TODO: would be nice to align the stores on methods/methodNames. + // this.#detailStore?.append(dataType); + this.#treeStore?.updateItem(id, updatedDataType); + const notification = { data: { message: `Data Type saved` } }; this.#notificationContext?.peek('positive', notification); } - // TODO: we currently don't use the detail store for anything. - // Consider to look up the data before fetching from the server - // Consider notify a workspace if a template is updated in the store while someone is editing it. - this.#detailStore?.append(dataType); - this.#treeStore?.updateItem(dataType.key, { name: dataType.name }); - // TODO: would be nice to align the stores on methods/methodNames. - return { error }; } // General: - async delete(key: string) { - if (!key) throw new Error('Data Type key is missing'); + async delete(id: string) { + if (!id) throw new Error('Data Type id is missing'); await this.#init; - const { error } = await this.#detailSource.delete(key); + const { error } = await this.#detailSource.delete(id); if (!error) { + // TODO: we currently don't use the detail store for anything. + // Consider to look up the data before fetching from the server. + // Consider notify a workspace if a template is deleted from the store while someone is editing it. + // TODO: would be nice to align the stores on methods/methodNames. + this.#detailStore?.remove([id]); + this.#treeStore?.removeItem(id); + const notification = { data: { message: `Data Type deleted` } }; this.#notificationContext?.peek('positive', notification); } - // TODO: we currently don't use the detail store for anything. - // Consider to look up the data before fetching from the server. - // Consider notify a workspace if a template is deleted from the store while someone is editing it. - this.#detailStore?.remove([key]); - this.#treeStore?.removeItem(key); - // TODO: would be nice to align the stores on methods/methodNames. - return { error }; } // folder - async createFolderScaffold(parentKey: string | null) { - if (parentKey === undefined) throw new Error('Parent key is missing'); - return this.#folderSource.createScaffold(parentKey); + async createFolderScaffold(parentId: string | null) { + if (parentId === undefined) throw new Error('Parent id is missing'); + return this.#folderSource.createScaffold(parentId); } - // TODO: temp create type until backend is ready. Remove the key addition when new types are generated. - async createFolder(folderRequest: CreateFolderRequestModel & { key?: string | undefined }) { + // TODO: temp create type until backend is ready. Remove the id addition when new types are generated. + async createFolder(folderRequest: CreateFolderRequestModel & { id?: string | undefined }) { if (!folderRequest) throw new Error('folder request is missing'); await this.#init; const { error } = await this.#folderSource.insert(folderRequest); - // TODO: We need to push a new item to the tree store to update the tree. How do we want to create the tree items? if (!error) { - const treeItem: FolderTreeItemResponseModel = { - $type: 'FolderTreeItemResponseModel', - parentKey: folderRequest.parentKey, - name: folderRequest.name, - key: folderRequest.key, - isFolder: true, - isContainer: false, - type: 'data-type', - icon: 'umb:folder', - hasChildren: false, - }; - - this.#treeStore?.appendItems([treeItem]); + // TODO: We need to push a new item to the tree store to update the tree. How do we want to create the tree items? + const folderTreeItem = createFolderTreeItem(folderRequest); + this.#treeStore?.appendItems([folderTreeItem]); } return { error }; } - async deleteFolder(key: string) { - if (!key) throw new Error('Key is missing'); + async deleteFolder(id: string) { + if (!id) throw new Error('Key is missing'); - const { error } = await this.#folderSource.delete(key); + const { error } = await this.#folderSource.delete(id); if (!error) { - this.#treeStore?.removeItem(key); + this.#treeStore?.removeItem(id); } return { error }; } - async updateFolder(key: string, folder: FolderModelBaseModel) { - if (!key) throw new Error('Key is missing'); + async updateFolder(id: string, folder: FolderModelBaseModel) { + if (!id) throw new Error('Key is missing'); if (!folder) throw new Error('Folder data is missing'); - const { error } = await this.#folderSource.update(key, folder); + const { error } = await this.#folderSource.update(id, folder); if (!error) { - this.#treeStore?.updateItem(key, { name: folder.name }); + this.#treeStore?.updateItem(id, { name: folder.name }); } return { error }; } - async requestFolder(key: string) { - if (!key) throw new Error('Key is missing'); + async requestFolder(id: string) { + if (!id) throw new Error('Key is missing'); - const { data, error } = await this.#folderSource.get(key); + const { data, error } = await this.#folderSource.get(id); if (data) { this.#treeStore?.appendItems([data]); @@ -279,3 +269,29 @@ export class UmbDataTypeRepository return { data, error }; } } + +export const createTreeItem = (item: CreateDataTypeRequestModel): FolderTreeItemResponseModel => { + if (!item) throw new Error('item is null or undefined'); + if (!item.id) throw new Error('item.id is null or undefined'); + + return { + $type: 'FolderTreeItemResponseModel', + type: 'data-type', + parentId: item.parentId, + name: item.name, + id: item.id, + isFolder: false, + isContainer: false, + hasChildren: false, + }; +}; + +export const createFolderTreeItem = (item: CreateFolderRequestModel): FolderTreeItemResponseModel => { + if (!item) throw new Error('item is null or undefined'); + if (!item.id) throw new Error('item.id is null or undefined'); + + return { + ...createTreeItem(item), + isFolder: true, + }; +}; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/data-type.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/data-type.store.ts index c50fc3644c..71db9b0013 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/data-type.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/data-type.store.ts @@ -13,7 +13,7 @@ export const UMB_DATA_TYPE_STORE_CONTEXT_TOKEN = new UmbContextToken([], (x) => x.key); + #data = new ArrayState([], (x) => x.id); /** * Creates an instance of UmbDataTypeStore. @@ -35,11 +35,11 @@ export class UmbDataTypeStore extends UmbStoreBase { /** * Append a data-type to the store - * @param {key} DataTypeModel key. + * @param {id} DataTypeModel id. * @memberof UmbDataTypeStore */ - byKey(key: DataTypeResponseModel['key']) { - return this.#data.getObservablePart((x) => x.find((y) => y.key === key)); + byId(id: DataTypeResponseModel['id']) { + return this.#data.getObservablePart((x) => x.find((y) => y.id === id)); } /** @@ -47,7 +47,7 @@ export class UmbDataTypeStore extends UmbStoreBase { * @param {string[]} uniques * @memberof UmbDataTypeStore */ - remove(uniques: Array) { + remove(uniques: Array) { this.#data.remove(uniques); } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/sources/data-type-folder.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/sources/data-type-folder.server.data.ts index ddeea07a1a..dffb153689 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/sources/data-type-folder.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/sources/data-type-folder.server.data.ts @@ -28,34 +28,34 @@ export class UmbDataTypeFolderServerDataSource implements UmbFolderDataSource { } /** - * Creates a Data Type folder with the given key from the server - * @param {string} key + * Creates a Data Type folder with the given id from the server + * @param {string} parentId * @return {*} * @memberof UmbDataTypeFolderServerDataSource */ - async createScaffold(parentKey: string | null) { + async createScaffold(parentId: string | null) { const scaffold: FolderReponseModel = { $type: 'FolderReponseModel', name: '', - key: uuidv4(), - parentKey, + id: uuidv4(), + parentId, }; return { data: scaffold }; } /** - * Fetches a Data Type folder with the given key from the server - * @param {string} key + * Fetches a Data Type folder with the given id from the server + * @param {string} id * @return {*} * @memberof UmbDataTypeFolderServerDataSource */ - async get(key: string) { - if (!key) throw new Error('Key is missing'); + async get(id: string) { + if (!id) throw new Error('Key is missing'); return tryExecuteAndNotify( this.#host, - DataTypeResource.getDataTypeFolderByKey({ - key, + DataTypeResource.getDataTypeFolderById({ + id: id, }) ); } @@ -82,30 +82,30 @@ export class UmbDataTypeFolderServerDataSource implements UmbFolderDataSource { * @return {*} * @memberof UmbDataTypeFolderServerDataSource */ - async update(key: string, folder: FolderModelBaseModel) { - if (!key) throw new Error('Key is missing'); - if (!key) throw new Error('Folder data is missing'); + async update(id: string, folder: FolderModelBaseModel) { + if (!id) throw new Error('Key is missing'); + if (!id) throw new Error('Folder data is missing'); return tryExecuteAndNotify( this.#host, - DataTypeResource.putDataTypeFolderByKey({ - key, + DataTypeResource.putDataTypeFolderById({ + id: id, requestBody: folder, }) ); } /** - * Deletes a Data Type folder with the given key on the server - * @param {string} key + * Deletes a Data Type folder with the given id on the server + * @param {string} id * @return {*} * @memberof UmbDataTypeServerDataSource */ - async delete(key: string) { - if (!key) throw new Error('Key is missing'); + async delete(id: string) { + if (!id) throw new Error('Key is missing'); return tryExecuteAndNotify( this.#host, - DataTypeResource.deleteDataTypeFolderByKey({ - key, + DataTypeResource.deleteDataTypeFolderById({ + id: id, }) ); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/sources/data-type.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/sources/data-type.server.data.ts index aab943d402..0d70c24d85 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/sources/data-type.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/sources/data-type.server.data.ts @@ -17,8 +17,7 @@ import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; * @implements {RepositoryDetailDataSource} */ export class UmbDataTypeServerDataSource - implements - UmbDataSource + implements UmbDataSource { #host: UmbControllerHostElement; @@ -32,32 +31,31 @@ export class UmbDataTypeServerDataSource } /** - * Fetches a Data Type with the given key from the server - * @param {string} key + * Fetches a Data Type with the given id from the server + * @param {string} id * @return {*} * @memberof UmbDataTypeServerDataSource */ - async get(key: string) { - if (!key) throw new Error('Key is missing'); + async get(id: string) { + if (!id) throw new Error('Key is missing'); return tryExecuteAndNotify( this.#host, - DataTypeResource.getDataTypeByKey({ - key, + DataTypeResource.getDataTypeById({ + id: id, }) ); } /** * Creates a new Data Type scaffold - * @param {(string | null)} parentKey - * @return {*} + * @param {(string | null)} parentId + * @return { CreateDataTypeRequestModel } * @memberof UmbDataTypeServerDataSource */ - async createScaffold(parentKey: string | null) { - const data: DataTypeResponseModel = { - $type: '', - parentKey: parentKey, - key: uuidv4(), + async createScaffold(parentId?: string | null) { + const data: CreateDataTypeRequestModel = { + id: uuidv4(), + parentId, }; return { data }; @@ -69,11 +67,11 @@ export class UmbDataTypeServerDataSource * @return {*} * @memberof UmbDataTypeServerDataSource */ - async insert(dataType: CreateDataTypeRequestModel & { key: string }) { + async insert(dataType: CreateDataTypeRequestModel & { id: string }) { if (!dataType) throw new Error('Data Type is missing'); - if (!dataType.key) throw new Error('Data Type key is missing'); + if (!dataType.id) throw new Error('Data Type id is missing'); - tryExecuteAndNotify( + return tryExecuteAndNotify( this.#host, DataTypeResource.postDataType({ requestBody: dataType, @@ -87,13 +85,13 @@ export class UmbDataTypeServerDataSource * @return {*} * @memberof UmbDataTypeServerDataSource */ - async update(key: string, data: DataTypeModelBaseModel) { - if (!key) throw new Error('Key is missing'); + async update(id: string, data: DataTypeModelBaseModel) { + if (!id) throw new Error('Key is missing'); return tryExecuteAndNotify( this.#host, - DataTypeResource.putDataTypeByKey({ - key, + DataTypeResource.putDataTypeById({ + id: id, requestBody: data, }) ); @@ -101,17 +99,17 @@ export class UmbDataTypeServerDataSource /** * Deletes a Data Type on the server - * @param {string} key + * @param {string} id * @return {*} * @memberof UmbDataTypeServerDataSource */ - async delete(key: string) { - if (!key) throw new Error('Key is missing'); + async delete(id: string) { + if (!id) throw new Error('Key is missing'); return tryExecuteAndNotify( this.#host, - DataTypeResource.deleteDataTypeByKey({ - key, + DataTypeResource.deleteDataTypeById({ + id: id, }) ); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/sources/data-type.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/sources/data-type.tree.server.data.ts index c2582f00e8..f1da0afaa9 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/sources/data-type.tree.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/sources/data-type.tree.server.data.ts @@ -31,34 +31,34 @@ export class UmbDataTypeTreeServerDataSource implements UmbTreeDataSource { } /** - * Fetches the children of a given parent key from the server - * @param {(string | null)} parentKey + * Fetches the children of a given parent id from the server + * @param {(string | null)} parentId * @return {*} * @memberof UmbDataTypeTreeServerDataSource */ - async getChildrenOf(parentKey: string | null) { - if (!parentKey) throw new Error('Parent key is missing'); + async getChildrenOf(parentId: string | null) { + if (!parentId) throw new Error('Parent id is missing'); return tryExecuteAndNotify( this.#host, DataTypeResource.getTreeDataTypeChildren({ - parentKey, + parentId, }) ); } /** - * Fetches the items for the given keys from the server - * @param {Array} keys + * Fetches the items for the given ids from the server + * @param {Array} ids * @return {*} * @memberof UmbDataTypeTreeServerDataSource */ - async getItems(keys: Array) { - if (!keys) throw new Error('Keys are missing'); + async getItems(ids: Array) { + if (!ids) throw new Error('Ids are missing'); return tryExecuteAndNotify( this.#host, - DataTypeResource.getTreeDataTypeItem({ - key: keys, + DataTypeResource.getDataTypeItem({ + id: ids, }) ); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/data-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/data-type-workspace.context.ts index 4ca1a0b7f4..127850dc1f 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/data-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/data-type-workspace.context.ts @@ -1,7 +1,7 @@ import { UmbWorkspaceContext } from '../../../shared/components/workspace/workspace-context/workspace-context'; import { UmbDataTypeRepository } from '../repository/data-type.repository'; import { UmbEntityWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; -import type { DataTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { CreateDataTypeRequestModel, DataTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { appendToFrozenArray, ObjectState } from '@umbraco-cms/backoffice/observable-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; @@ -9,27 +9,31 @@ export class UmbDataTypeWorkspaceContext extends UmbWorkspaceContext implements UmbEntityWorkspaceContextInterface { + // TODO: revisit. temp solution because the create and response models are different. #data = new ObjectState(undefined); data = this.#data.asObservable(); + name = this.#data.getObservablePart((data) => data?.name); - key = this.#data.getObservablePart((data) => data?.key); + id = this.#data.getObservablePart((data) => data?.id); constructor(host: UmbControllerHostElement) { super(host, new UmbDataTypeRepository(host)); } - async load(key: string) { - const { data } = await this.repository.requestByKey(key); + async load(id: string) { + const { data } = await this.repository.requestById(id); if (data) { this.setIsNew(false); this.#data.update(data); } } - async createScaffold(parentKey: string | null) { - const { data } = await this.repository.createScaffold(parentKey); + async createScaffold(parentId: string | null) { + const { data } = await this.repository.createScaffold(parentId); this.setIsNew(true); - this.#data.next(data); + // TODO: This is a hack to get around the fact that the data is not typed correctly. + // Create and response models are different. We need to look into this. + this.#data.next(data as unknown as DataTypeResponseModel); return { data }; } @@ -37,8 +41,8 @@ export class UmbDataTypeWorkspaceContext return this.#data.getValue(); } - getEntityKey() { - return this.getData()?.key || ''; + getEntityId() { + return this.getData()?.id || ''; } getEntityType() { @@ -70,17 +74,19 @@ export class UmbDataTypeWorkspaceContext async save() { if (!this.#data.value) return; + if (!this.#data.value.id) return; + if (this.isNew) { await this.repository.create(this.#data.value); } else { - await this.repository.save(this.#data.value); + await this.repository.save(this.#data.value.id, this.#data.value); } // If it went well, then its not new anymore?. this.setIsNew(false); } - async delete(key: string) { - await this.repository.delete(key); + async delete(id: string) { + await this.repository.delete(id); } public destroy(): void { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/data-type-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/data-type-workspace.element.ts index 69ddcdeed1..69f1f01de7 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/data-type-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/data-type-workspace.element.ts @@ -2,7 +2,7 @@ import { UUITextStyles } from '@umbraco-ui/uui-css'; import { css, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; import { UmbDataTypeWorkspaceContext } from './data-type-workspace.context'; -import { UmbRouterSlotInitEvent, IRoute, IRoutingInfo } from '@umbraco-cms/internal/router'; +import type { IRoute } from '@umbraco-cms/backoffice/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import './data-type-workspace-edit.element'; @@ -13,37 +13,30 @@ export class UmbDataTypeWorkspaceElement extends UmbLitElement { #workspaceContext = new UmbDataTypeWorkspaceContext(this); - #routerPath? = ''; - #element = document.createElement('umb-data-type-workspace-edit-element'); - #key = ''; @state() _routes: IRoute[] = [ { - path: 'create/:parentKey', + path: 'create/:parentId', component: () => this.#element, - setup: async (component: HTMLElement, info: IRoutingInfo) => { - const parentKey = info.match.params.parentKey; - this.#workspaceContext.createScaffold(parentKey); + setup: (_component, info) => { + const parentId = info.match.params.parentId === 'null' ? null : info.match.params.parentId; + this.#workspaceContext.createScaffold(parentId); }, }, { - path: 'edit/:key', + path: 'edit/:id', component: () => this.#element, - setup: (component: HTMLElement, info: IRoutingInfo) => { - const key = info.match.params.key; - this.#workspaceContext.load(key); + setup: (_component, info) => { + const id = info.match.params.id; + this.#workspaceContext.load(id); }, }, ]; render() { - return html` { - this.#routerPath = event.target.absoluteRouterPath; - }}>`; + return html``; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/data-type-workspace.stories.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/data-type-workspace.stories.ts index 3b560f8660..61c3a003d2 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/data-type-workspace.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/data-type-workspace.stories.ts @@ -3,6 +3,7 @@ import './data-type-workspace.element'; import { Meta, Story } from '@storybook/web-components'; import { html } from 'lit'; +import { ifDefined } from 'lit/directives/if-defined.js'; import { data } from '../../../../core/mocks/data/data-type.data'; import type { UmbDataTypeWorkspaceElement } from './data-type-workspace.element'; @@ -14,5 +15,5 @@ export default { } as Meta; export const AAAOverview: Story = () => - html` `; + html` `; AAAOverview.storyName = 'Overview'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/views/info/workspace-view-data-type-info.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/views/info/workspace-view-data-type-info.element.ts index 6e88882dd4..03b7ef49a0 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/views/info/workspace-view-data-type-info.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/views/info/workspace-view-data-type-info.element.ts @@ -9,7 +9,15 @@ import { DataTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; @customElement('umb-workspace-view-data-type-info') export class UmbWorkspaceViewDataTypeInfoElement extends UmbLitElement { - static styles = [UUITextStyles, css``]; + static styles = [ + UUITextStyles, + css` + :host { + display: block; + margin: var(--uui-size-layout-1); + } + `, + ]; @state() _dataType?: DataTypeResponseModel; @@ -42,8 +50,8 @@ export class UmbWorkspaceViewDataTypeInfoElement extends UmbLitElement { private _renderGeneralInfo() { return html` - -
${this._dataType?.key}
+ +
${this._dataType?.id}
${this._dataType?.propertyEditorAlias}
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/sources/language.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/sources/language.server.data.ts index af2231bbe1..6764a51dea 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/sources/language.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/sources/language.server.data.ts @@ -55,7 +55,6 @@ export class UmbLanguageServerDataSource name: '', isDefault: false, isMandatory: false, - fallbackIsoCode: '', isoCode: '', }; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language-root/components/language-root-table-delete-column-layout.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language-root/components/language-root-table-delete-column-layout.element.ts index 2da293c6b0..56493b1112 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language-root/components/language-root-table-delete-column-layout.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language-root/components/language-root-table-delete-column-layout.element.ts @@ -34,7 +34,9 @@ export class UmbLanguageRootTableDeleteColumnLayoutElement extends UmbLitElement return html` - + + + = []; #languageRepository = new UmbLanguageRepository(this); + private _cultureNames = new Intl.DisplayNames('en', { type: 'language' }); connectedCallback() { super.connectedCallback(); @@ -82,13 +83,13 @@ export class UmbLanguageRootWorkspaceElement extends UmbLitElement { #createTableItems(languages: Array) { this._tableItems = languages.map((language) => { return { - key: language.isoCode ?? '', + id: language.isoCode ?? '', icon: 'umb:globe', data: [ { columnAlias: 'languageName', value: { - name: language.name, + name: language.name ? language.name : this._cultureNames.of(language.isoCode ?? ''), isoCode: language.isoCode, }, }, diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace-edit.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace-edit.element.ts index 93a00c19ef..594f876c75 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace-edit.element.ts @@ -8,8 +8,8 @@ import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { LanguageResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-api'; -@customElement('umb-language-workspace-thingy') -export class UmbLanguageWorkspaceThingyElement extends UmbLitElement { +@customElement('umb-language-workspace-edit') +export class UmbLanguageWorkspaceEditElement extends UmbLitElement { static styles = [ UUITextStyles, css` @@ -19,9 +19,23 @@ export class UmbLanguageWorkspaceThingyElement extends UmbLitElement { gap: var(--uui-size-space-4); width: 100%; } + uui-input { width: 100%; } + + strong { + display: flex; + align-items: center; + } + + #footer { + padding: 0 var(--uui-size-layout-1); + } + + uui-input:not(:focus) { + border: 1px solid transparent; + } `, ]; @@ -30,6 +44,9 @@ export class UmbLanguageWorkspaceThingyElement extends UmbLitElement { @state() _language?: LanguageResponseModel; + @state() + _isNew?: boolean; + constructor() { super(); @@ -44,6 +61,9 @@ export class UmbLanguageWorkspaceThingyElement extends UmbLitElement { this.observe(this.#workspaceContext.data, (data) => { this._language = data; }); + this.observe(this.#workspaceContext.isNew, (isNew) => { + this._isNew = isNew; + }); } #handleInput(event: UUIInputEvent) { @@ -59,19 +79,28 @@ export class UmbLanguageWorkspaceThingyElement extends UmbLitElement { render() { return html` + `; } } -export default UmbLanguageWorkspaceThingyElement; +export default UmbLanguageWorkspaceEditElement; declare global { interface HTMLElementTagNameMap { - 'umb-language-workspace-thingy': UmbLanguageWorkspaceThingyElement; + 'umb-language-workspace-edit': UmbLanguageWorkspaceEditElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace.context.ts index af5b2d0fc8..f51bfe3075 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace.context.ts @@ -45,7 +45,7 @@ export class UmbLanguageWorkspaceContext } // TODO: Convert to uniques: - getEntityKey() { + getEntityId() { return this.#data.getValue()?.isoCode; } @@ -76,7 +76,25 @@ export class UmbLanguageWorkspaceContext } async save() { - throw new Error('Save method not implemented.'); + const data = this.getData(); + if (!data) return; + + if (this.getIsNew()) { + const { error } = await this.repository.create(data); + // TODO: this is temp solution to bubble validation errors to the UI + if (error) { + if (error.type === 'validation') { + this.setValidationErrors?.(error.errors); + } + } else { + this.setValidationErrors?.(undefined); + // TODO: do not make it the buttons responsibility to set the workspace to not new. + this.setIsNew(false); + } + } else { + await this.repository.save(data); + // TODO: Show validation errors as warnings? + } } destroy(): void { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace.element.ts index 3eb52b81f3..731ea98073 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace.element.ts @@ -1,29 +1,70 @@ import { UUITextStyles } from '@umbraco-ui/uui-css'; import { css, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; -import { IRoutingInfo } from 'router-slot'; import { UmbLanguageWorkspaceContext } from './language-workspace.context'; +import type { IRoute } from '@umbraco-cms/backoffice/router'; import { UmbRouterSlotInitEvent } from '@umbraco-cms/internal/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import './language-workspace-edit.element'; +import { generateRoutePathBuilder } from '@umbraco-cms/backoffice/router'; + @customElement('umb-language-workspace') export class UmbLanguageWorkspaceElement extends UmbLitElement { static styles = [UUITextStyles, css``]; #languageWorkspaceContext = new UmbLanguageWorkspaceContext(this); + /** + * Workspace editor element, lazy loaded but shared across several user flows. + */ + #editorElement?: HTMLElement; + #routerPath? = ''; - // TODO: add create route + #getComponentElement = async () => { + if (this.#editorElement) { + return this.#editorElement; + } + this.#editorElement = new (await import('./language-workspace-edit.element')).default(); + return this.#editorElement; + }; + @state() - _routes = [ + _routes: IRoute[] = [ { path: 'edit/:isoCode', - component: () => import('./language-workspace-edit.element'), - setup: (component: HTMLElement, info: IRoutingInfo) => { + component: this.#getComponentElement, + setup: (_component, info) => { + this.removeControllerByUnique('_observeIsNew'); this.#languageWorkspaceContext.load(info.match.params.isoCode); }, }, + { + path: 'create', + component: this.#getComponentElement, + setup: async () => { + this.#languageWorkspaceContext.createScaffold(); + + // Navigate to edit route when language is created: + this.observe( + this.#languageWorkspaceContext.isNew, + (isNew) => { + console.log('observe', isNew); + if (isNew === false) { + const isoCode = this.#languageWorkspaceContext.getEntityId(); + if (this.#routerPath && isoCode) { + const routeBasePath = this.#routerPath.endsWith('/') ? this.#routerPath : this.#routerPath + '/'; + // TODO: Revisit if this is the right way to change URL: + const newPath = generateRoutePathBuilder(routeBasePath + 'edit/:isoCode')({ isoCode }); + window.history.pushState({}, '', newPath); + } + } + }, + '_observeIsNew' + ); + }, + }, ]; render() { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/views/details/language-details-workspace-view.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/views/details/language-details-workspace-view.element.ts index db03dd5f15..c1b79f9add 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/views/details/language-details-workspace-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/views/details/language-details-workspace-view.element.ts @@ -4,8 +4,8 @@ import { css, html, nothing } from 'lit'; import { customElement, state } from 'lit/decorators.js'; import { ifDefined } from 'lit/directives/if-defined.js'; import { UmbLanguageWorkspaceContext } from '../../language-workspace.context'; -import UmbInputCultureSelectElement from '../../../../../../shared/components/input-culture-select/input-culture-select.element'; -import UmbInputLanguagePickerElement from '../../../../../../shared/components/input-language-picker/input-language-picker.element'; +import { UmbInputCultureSelectElement } from '../../../../../../shared/components/input-culture-select/input-culture-select.element'; +import { UmbInputLanguagePickerElement } from '../../../../../../shared/components/input-language-picker/input-language-picker.element'; import { UmbChangeEvent } from '@umbraco-cms/backoffice/events'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { LanguageResponseModel } from '@umbraco-cms/backoffice/backend-api'; @@ -52,7 +52,7 @@ export class UmbLanguageDetailsWorkspaceViewElement extends UmbLitElement { _isDefaultLanguage = false; @state() - _isNew = false; + _isNew?: boolean; @state() _validationErrors?: { [key: string]: Array }; @@ -81,8 +81,8 @@ export class UmbLanguageDetailsWorkspaceViewElement extends UmbLitElement { } }); - this.observe(this.#languageWorkspaceContext.isNew, (value) => { - this._isNew = value; + this.observe(this.#languageWorkspaceContext.isNew, (isNew) => { + this._isNew = isNew; }); this.observe(this.#languageWorkspaceContext.validationErrors, (value) => { @@ -98,6 +98,11 @@ export class UmbLanguageDetailsWorkspaceViewElement extends UmbLitElement { const isoCode = target.value.toString(); const cultureName = target.selectedCultureName; + // If there is no cultureName, it was probably an unknown event that triggered the change event, so ignore it. + if (!cultureName) { + return; + } + if (!isoCode) { // If the isoCode is empty, we reset the value to the original value. // Provides a way better UX @@ -143,15 +148,13 @@ export class UmbLanguageDetailsWorkspaceViewElement extends UmbLitElement { } render() { - if (!this._language) return nothing; - return html`
@@ -163,14 +166,15 @@ export class UmbLanguageDetailsWorkspaceViewElement extends UmbLitElement { -
${this._language.isoCode}
+
${this._language?.isoCode}
Default language @@ -178,14 +182,17 @@ export class UmbLanguageDetailsWorkspaceViewElement extends UmbLitElement {
- ${this._language.isDefault !== this._isDefaultLanguage + ${this._language?.isDefault && this._language?.isDefault !== this._isDefaultLanguage ? html`
Switching default language may result in default content missing.
` : nothing}
- +
Mandatory language
Properties on this language have to be filled out before the node can be published.
@@ -198,7 +205,7 @@ export class UmbLanguageDetailsWorkspaceViewElement extends UmbLitElement { label="Fallback language" description="To allow multi-lingual content to fall back to another language if not present in the requested language, select it here."> >; getSavedSearchByName({ name }: { name: string }): Promise>; deleteSavedSearchByName({ name }: { name: string }): Promise>; - postLogViewerSavedSearch({ - requestBody, - }: { - requestBody?: SavedLogSearchResponseModel; - }): Promise>; + postLogViewerSavedSearch({ name, query }: SavedLogSearchResponseModel): Promise>; } export interface LogMessagesDataSource { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/repository/sources/log-viewer.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/repository/sources/log-viewer.server.data.ts index 660ab50056..fa069f9d2f 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/repository/sources/log-viewer.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/repository/sources/log-viewer.server.data.ts @@ -54,8 +54,11 @@ export class UmbLogSearchesServerDataSource implements LogSearchDataSource { * @return {*} * @memberof UmbLogSearchesServerDataSource */ - async postLogViewerSavedSearch({ requestBody }: { requestBody?: SavedLogSearchResponseModel }) { - return await tryExecuteAndNotify(this.#host, LogViewerResource.postLogViewerSavedSearch({ requestBody })); + async postLogViewerSavedSearch({ name, query }: SavedLogSearchResponseModel) { + return await tryExecuteAndNotify( + this.#host, + LogViewerResource.postLogViewerSavedSearch({ requestBody: { name, query } }) + ); } /** * Remove a log viewer saved search by name from the server diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/components/log-viewer-date-range-selector.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/components/log-viewer-date-range-selector.element.ts index 4ae57c93cd..248825bad1 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/components/log-viewer-date-range-selector.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/components/log-viewer-date-range-selector.element.ts @@ -1,13 +1,13 @@ import { UUITextStyles } from '@umbraco-ui/uui-css'; import { css, html } from 'lit'; import { customElement, property, queryAll, state } from 'lit/decorators.js'; -import { query } from 'router-slot'; import { LogViewerDateRange, UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, } from '../../logviewer.context'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import { query as getQuery, path, toQueryString } from '@umbraco-cms/backoffice/router'; @customElement('umb-log-viewer-date-range-selector') export class UmbLogViewerDateRangeSelectorElement extends UmbLitElement { @@ -87,8 +87,15 @@ export class UmbLogViewerDateRangeSelectorElement extends UmbLitElement { this._endDate = input.value; } }); - const newDateRange: LogViewerDateRange = { startDate: this._startDate, endDate: this._endDate }; - this.#logViewerContext?.setDateRange(newDateRange); + + const query = getQuery(); + const qs = toQueryString({ + ...query, + startDate: this._startDate, + endDate: this._endDate, + }); + + window.history.pushState({}, '', `${path()}?${qs}`); } render() { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/components/log-viewer-level-tag.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/components/log-viewer-level-tag.element.ts index 4bf03dbf85..1807638292 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/components/log-viewer-level-tag.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/components/log-viewer-level-tag.element.ts @@ -27,7 +27,10 @@ export class UmbLogViewerLevelTagElement extends LitElement { Information: { look: 'primary', color: 'positive' }, Warning: { look: 'primary', color: 'warning' }, Error: { look: 'primary', color: 'danger' }, - Fatal: { look: 'primary' }, + Fatal: { + look: 'primary', + style: 'background-color: var(--umb-log-viewer-fatal-color); color: var(--uui-color-surface)', + }, }; render() { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts index 46382e5690..f5423593a8 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts @@ -1,15 +1,15 @@ import './components'; import { map } from 'rxjs'; -import { css, html, nothing } from 'lit'; +import { PropertyValueMap, css, html, nothing } from 'lit'; import { customElement, state } from 'lit/decorators.js'; -import { IRoutingInfo } from 'router-slot'; import { UUITextStyles } from '@umbraco-ui/uui-css'; import { repeat } from 'lit/directives/repeat.js'; import { UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN } from '../logviewer.context'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { umbExtensionsRegistry, createExtensionElement } from '@umbraco-cms/backoffice/extensions-api'; import { ManifestWorkspaceView, ManifestWorkspaceViewCollection } from '@umbraco-cms/backoffice/extensions-registry'; -import { UmbRouterSlotInitEvent, UmbRouterSlotChangeEvent } from '@umbraco-cms/internal/router'; +import type { UmbRouterSlotInitEvent, UmbRouterSlotChangeEvent } from '@umbraco-cms/internal/router'; +import type { IRoute } from '@umbraco-cms/backoffice/router'; //TODO make uui-input accept min and max values @customElement('umb-logviewer-workspace') @@ -26,7 +26,7 @@ export class UmbLogViewerWorkspaceElement extends UmbLitElement { --umb-log-viewer-information-color: var(--uui-color-positive); --umb-log-viewer-warning-color: var(--uui-color-warning); --umb-log-viewer-error-color: var(--uui-color-danger); - --umb-log-viewer-fatal-color: var(--uui-color-default); + --umb-log-viewer-fatal-color: var(--uui-palette-black); --umb-log-viewer-verbose-color: var(--uui-color-current); } @@ -51,7 +51,7 @@ export class UmbLogViewerWorkspaceElement extends UmbLitElement { private _workspaceViews: Array = []; @state() - private _routes: any[] = []; + private _routes: IRoute[] = []; @state() private _activePath?: string; @@ -64,12 +64,24 @@ export class UmbLogViewerWorkspaceElement extends UmbLitElement { constructor() { super(); this.#logViewerContext.init(); + this.provideContext(UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, this.#logViewerContext); + } + + firstUpdated(props: PropertyValueMap) { + super.firstUpdated(props); + + window.addEventListener('changestate', this.#logViewerContext.onChangeState); + this.#logViewerContext.onChangeState(); } connectedCallback() { super.connectedCallback(); this._observeWorkspaceViews(); - this.provideContext(UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, this.#logViewerContext); + } + + disconnectedCallback(): void { + super.disconnectedCallback(); + window.removeEventListener('changestate', this.#logViewerContext.onChangeState); } load(): void { @@ -101,16 +113,9 @@ export class UmbLogViewerWorkspaceElement extends UmbLitElement { this._routes = this._workspaceViews.map((view) => { return { path: `${view.meta.pathname}`, - component: () => { - return createExtensionElement(view); - }, - setup: (component: Promise | HTMLElement, info: IRoutingInfo) => { - // When its using import, we get an element, when using createExtensionElement we get a Promise. - if ((component as any).then) { - (component as any).then((el: any) => (el.manifest = view)); - } else { - (component as any).manifest = view; - } + component: () => createExtensionElement(view), + setup: (component) => { + (component as any).manifest = view; }, }; }); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/manifests.ts index 1d6ee72173..83478e4b88 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/manifests.ts @@ -1,4 +1,5 @@ import type { + ManifestModal, ManifestWorkspace, ManifestWorkspaceAction, ManifestWorkspaceView, @@ -51,4 +52,13 @@ const workspaceViews: Array = [ const workspaceActions: Array = []; -export const manifests = [workspace, ...workspaceViews, ...workspaceActions]; +const modals: Array = [ + { + type: 'modal', + alias: 'Umb.Modal.LogViewer.SaveSearch', + name: 'Saved Searches Modal', + loader: () => import('../views/search/components/log-viewer-search-input-modal.element'), + }, +]; + +export const manifests = [workspace, ...workspaceViews, ...workspaceActions, ...modals]; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts index 22a4eeaeeb..6bec1b10e9 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer.context.ts @@ -15,9 +15,11 @@ import { PagedLogMessageResponseModel, PagedLogTemplateResponseModel, PagedSavedLogSearchResponseModel, + SavedLogSearchPresenationBaseModel, } from '@umbraco-cms/backoffice/backend-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; +import { query } from '@umbraco-cms/backoffice/router'; export type PoolingInterval = 0 | 2000 | 5000 | 10000 | 20000 | 30000; export interface PoolingCOnfig { @@ -56,7 +58,7 @@ export class UmbLogViewerWorkspaceContext { endDate: this.today, }; - #savedSearches = new DeepState(undefined); + #savedSearches = new ObjectState(undefined); savedSearches = createObservablePart(this.#savedSearches, (data) => data?.items); #logCount = new DeepState(null); @@ -103,8 +105,54 @@ export class UmbLogViewerWorkspaceContext { this.validateLogSize(); } - setDateRange(dateRange: LogViewerDateRange) { - const { startDate, endDate } = dateRange; + reset() { + this.#logs.next({ items: [], total: 0 }); + this.setCurrentPage(1); + } + + onChangeState = () => { + this.reset(); + + const searchQuery = query(); + let sanitizedQuery = ''; + if (searchQuery.lq) { + sanitizedQuery = decodeURIComponent(searchQuery.lq); + } + this.setFilterExpression(sanitizedQuery); + + let validLogLevels: LogLevelModel[] = []; + if (searchQuery.loglevels) { + const loglevels = searchQuery.loglevels.split(',') as LogLevelModel[]; + + // Filter out invalid log levels that do not exist in LogLevelModel + validLogLevels = loglevels.filter((loglevel) => { + return Object.values(LogLevelModel).includes(loglevel); + }); + } + this.setLogLevelsFilter(validLogLevels); + + const dateRange: Partial = {}; + + if (searchQuery.startDate) { + dateRange.startDate = searchQuery.startDate; + } + + if (searchQuery.endDate) { + dateRange.endDate = searchQuery.endDate; + } + + this.setDateRange(dateRange); + + this.setCurrentPage(searchQuery.page ? Number(searchQuery.page) : 1); + + this.getLogs(); + }; + + setDateRange(dateRange: Partial) { + let { startDate, endDate } = dateRange; + + if (!startDate) startDate = this.defaultDateRange.startDate; + if (!endDate) endDate = this.defaultDateRange.endDate; const isAnyDateInTheFuture = new Date(startDate) > new Date() || new Date(endDate) > new Date(); const isStartDateBiggerThenEndDate = new Date(startDate) > new Date(endDate); @@ -112,9 +160,10 @@ export class UmbLogViewerWorkspaceContext { return; } - this.#dateRange.next(dateRange); + this.#dateRange.next({ startDate, endDate }); this.validateLogSize(); this.getLogCount(); + this.getMessageTemplates(0, 10); } async getSavedSearches() { @@ -122,7 +171,7 @@ export class UmbLogViewerWorkspaceContext { if (data) { this.#savedSearches.next(data); } else { - //falback to some default searches like in the old backoffice + //falback to some default searches resembling Umbraco <= 12 this.#savedSearches.next({ items: [ { @@ -155,6 +204,26 @@ export class UmbLogViewerWorkspaceContext { } } + async saveSearch({ name, query }: SavedLogSearchPresenationBaseModel) { + const previousSavedSearches = this.#savedSearches.getValue()?.items ?? []; + try { + this.#savedSearches.update({ items: [...previousSavedSearches, { name, query }] }); + await this.#repository.saveSearch({ name, query }); + } catch (err) { + this.#savedSearches.update({ items: previousSavedSearches }); + } + } + + async removeSearch({ name }: { name: string }) { + const previousSavedSearches = this.#savedSearches.getValue()?.items ?? []; + try { + this.#savedSearches.update({ items: previousSavedSearches.filter((search) => search.name !== name) }); + await this.#repository.removeSearch({ name }); + } catch (err) { + this.#savedSearches.update({ items: previousSavedSearches }); + } + } + async getLogCount() { const { data } = await this.#repository.getLogCount({ ...this.#dateRange.getValue() }); @@ -164,7 +233,7 @@ export class UmbLogViewerWorkspaceContext { } async getMessageTemplates(skip: number, take: number) { - const { data } = await this.#repository.getMessageTemplates({ skip, take }); + const { data } = await this.#repository.getMessageTemplates({ skip, take, ...this.#dateRange.getValue() }); if (data) { this.#messageTemplates.next(data); @@ -180,14 +249,12 @@ export class UmbLogViewerWorkspaceContext { } async validateLogSize() { - const { data, error } = await this.#repository.getLogViewerValidateLogsSize({ ...this.#dateRange.getValue() }); + const { error } = await this.#repository.getLogViewerValidateLogsSize({ ...this.#dateRange.getValue() }); if (error) { this.#canShowLogs.next(false); - console.info('LogViewer: ', error); return; } this.#canShowLogs.next(true); - console.info('LogViewer:showinfg logs'); } setCurrentPage(page: number) { @@ -244,7 +311,7 @@ export class UmbLogViewerWorkspaceContext { } setPollingInterval(interval: PoolingInterval) { - this.#polling.update({ interval, enabled: true }); + this.#polling.update({ interval }); } toggleSortOrder() { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-log-level-overview.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-log-level-overview.element.ts index bae9ab55f4..fecb77768c 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-log-level-overview.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-log-level-overview.element.ts @@ -1,4 +1,4 @@ -import { html } from 'lit'; +import { html, nothing } from 'lit'; import { customElement, property, state } from 'lit/decorators.js'; import { UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN } from '../../../logviewer.context'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @@ -37,7 +37,7 @@ export class UmbLogViewerLogLevelOverviewElement extends UmbLitElement { render() { return html`${this._loggers.length > 0 ? this._loggers.find((logger) => logger.name === this.loggerName)?.level - : ''}`; + : nothing}`; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-log-types-chart.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-log-types-chart.element.ts index e0b286c9a6..922c84f72b 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-log-types-chart.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-log-types-chart.element.ts @@ -116,6 +116,7 @@ export class UmbLogViewerLogTypesChartElement extends UmbLitElement { }); } + // TODO: Stop using this complex code in render methods, instead changes to _logLevelCount should trigger a state prop containing the keys. And then try to make use of the repeat LIT method: render() { return html` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-message-templates-overview.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-message-templates-overview.element.ts index d96280149b..1e10aff9bb 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-message-templates-overview.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-message-templates-overview.element.ts @@ -66,14 +66,11 @@ export class UmbLogViewerMessageTemplatesOverviewElement extends UmbLitElement { #renderSearchItem = (searchListItem: SavedLogSearchResponseModel) => { return html`
  • { - this.#setCurrentQuery(searchListItem.query ?? ''); - }} label="${searchListItem.name ?? ''}" title="${searchListItem.name ?? ''}" - href=${'/section/settings/logviewer/search?lq=' + searchListItem.query} - >${searchListItem.name} + href=${`section/settings/workspace/logviewer/search/?lq=${searchListItem.query}`}> + ${searchListItem.name} +
  • `; }; @@ -90,13 +87,12 @@ export class UmbLogViewerMessageTemplatesOverviewElement extends UmbLitElement { ${this._messageTemplates ? this._messageTemplates.items.map( (template) => - html` + html` + { - this.#setCurrentQuery(`@MessageTemplate='${template.messageTemplate}'` ?? ''); - }} - href=${'/section/settings/logviewer/search?lg=@MessageTemplate%3D' + template.messageTemplate}> + href=${`section/settings/workspace/logviewer/search/?lq=${encodeURIComponent( + `@MessageTemplate='${template.messageTemplate}'` + )}`}> ${template.messageTemplate} ${template.count} @@ -109,9 +105,9 @@ export class UmbLogViewerMessageTemplatesOverviewElement extends UmbLitElement { id="show-more-templates-btn" look="primary" @click=${this.#getMessageTemplates} - label="Show more templates" - >Show more + label="Show more templates"> + Show more +
    `; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-saved-searches-overview.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-saved-searches-overview.element.ts index 761f06c97b..a918939169 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-saved-searches-overview.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/components/log-viewer-saved-searches-overview.element.ts @@ -40,6 +40,7 @@ export class UmbLogViewerSavedSearchesOverviewElement extends UmbLitElement { private _savedSearches: SavedLogSearchResponseModel[] = []; #logViewerContext?: UmbLogViewerWorkspaceContext; + constructor() { super(); this.consumeContext(UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, (instance) => { @@ -56,39 +57,21 @@ export class UmbLogViewerSavedSearchesOverviewElement extends UmbLitElement { }); } - #setCurrentQuery(query: string) { - this.#logViewerContext?.setFilterExpression(query); - } - #renderSearchItem = (searchListItem: SavedLogSearchResponseModel) => { return html`
  • { - this.#setCurrentQuery(searchListItem.query ?? ''); - }} label="${searchListItem.name ?? ''}" title="${searchListItem.name ?? ''}" - href=${'/section/settings/logviewer/search?lq=' + searchListItem.query} - >${searchListItem.name} + href=${`section/settings/workspace/logviewer/search/?lq=${encodeURIComponent(searchListItem.query ?? '')}`}> + ${searchListItem.name} +
  • `; }; render() { return html`
      -
    • - { - this.#setCurrentQuery(''); - }} - label="All logs" - title="All logs" - href="/section/settings/logviewer/search" - >All logs -
    • - ${this._savedSearches.map(this.#renderSearchItem)} + ${this.#renderSearchItem({ name: 'All logs', query: '' })} ${this._savedSearches.map(this.#renderSearchItem)}
    `; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/log-overview-view.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/log-overview-view.element.ts index d4faca5e18..b8fba68f66 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/log-overview-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/overview/log-overview-view.element.ts @@ -107,8 +107,8 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { #observeErrorCount() { if (!this.#logViewerContext) return; - this.observe(this.#logViewerContext.logCount, () => { - this._errorCount = this._logLevelCount?.error ?? 0; + this.observe(this.#logViewerContext.logCount, (logLevelCount) => { + this._errorCount = logLevelCount?.error ?? 0; }); } @@ -128,7 +128,13 @@ export class UmbLogViewerOverviewViewElement extends UmbLitElement { -

    ${this._errorCount}

    + +

    ${this._errorCount}

    diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/log-viewer-log-level-filter-menu.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/log-viewer-log-level-filter-menu.element.ts index 78c554931e..ce2d6eee18 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/log-viewer-log-level-filter-menu.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/log-viewer-log-level-filter-menu.element.ts @@ -2,10 +2,11 @@ import { UUICheckboxElement } from '@umbraco-ui/uui'; import { UUITextStyles } from '@umbraco-ui/uui-css'; import { css, html } from 'lit'; import { customElement, queryAll, state } from 'lit/decorators.js'; -import _ from 'lodash'; +import { debounce } from 'lodash-es'; import { UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN } from '../../../logviewer.context'; import { LogLevelModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import { path, query, toQueryString } from '@umbraco-cms/backoffice/router'; @customElement('umb-log-viewer-log-level-filter-menu') export class UmbLogViewerLogLevelFilterMenuElement extends UmbLitElement { @@ -58,16 +59,23 @@ export class UmbLogViewerLogLevelFilterMenuElement extends UmbLitElement { #setLogLevel() { if (!this.#logViewerContext) return; - this.#logViewerContext?.setCurrentPage(1); const logLevels = Array.from(this._logLevelSelectorCheckboxes) .filter((checkbox) => checkbox.checked) .map((checkbox) => checkbox.value as LogLevelModel); - this.#logViewerContext?.setLogLevelsFilter(logLevels); - this.#logViewerContext.getLogs(); + + let q = query(); + + if (logLevels.length) { + q = { ...q, loglevels: logLevels.join(',') }; + } else { + delete q.loglevels; + } + + window.history.pushState({}, '', `${path()}?${toQueryString(q)}`); } - setLogLevelDebounce = _.debounce(this.#setLogLevel, 300); + setLogLevelDebounce = debounce(this.#setLogLevel, 300); #selectAllLogLevels() { this._logLevelSelectorCheckboxes.forEach((checkbox) => (checkbox.checked = true)); @@ -84,9 +92,13 @@ export class UmbLogViewerLogLevelFilterMenuElement extends UmbLitElement {
    ${Object.values(LogLevelModel).map( (logLevel) => - html`` + html` + + ` )} Select allLog Level: + + Log Level: ${this._logLevelFilter.length > 0 ? this._logLevelFilter.map((level) => html`${level}`) : 'All'} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/log-viewer-message.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/log-viewer-message.element.ts index 6669964aa3..36b885f34e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/log-viewer-message.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/log-viewer-message.element.ts @@ -4,6 +4,7 @@ import { customElement, property, query, state } from 'lit/decorators.js'; import { UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN } from '../../../logviewer.context'; import { LogLevelModel, LogMessagePropertyPresentationModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import { query as getQuery, toQueryString } from '@umbraco-cms/backoffice/router'; //TODO: check how to display EventId field in the message properties @customElement('umb-log-viewer-message') @@ -211,18 +212,23 @@ export class UmbLogViewerMessageElement extends UmbLitElement { private _propertiesWithSearchMenu: Array = ['HttpRequestNumber', 'SourceContext', 'MachineName']; private _findLogsWithProperty({ name, value }: LogMessagePropertyPresentationModel) { - let queryString = ''; + if (!name) return ''; + + let query = getQuery(); + let sanitizedValue = value ?? ''; if (isNaN(+(value ?? ''))) { - queryString = name + "='" + value + "'"; - } else { - queryString = name + '=' + value; + sanitizedValue = "'" + value + "'"; } - this.#logViewerContext?.setFilterExpression(queryString); - this.#logViewerContext?.setCurrentPage(1); - this.details.removeAttribute('open'); - this.#logViewerContext?.getLogs(); + query = { + ...query, + lq: encodeURIComponent(`${name}=${sanitizedValue}`), + }; + + const queryString = toQueryString(query); + + return queryString; } #setOpen(event: Event) { @@ -259,14 +265,12 @@ export class UmbLogViewerMessageElement extends UmbLitElement { ${this._propertiesWithSearchMenu.includes(property.name ?? '') ? html` { - this._findLogsWithProperty(property); - }} look="secondary" label="Find logs with ${property.name}" title="Find logs with ${property.name}" - >` + href=${`section/settings/workspace/logviewer/search/?${this._findLogsWithProperty(property)}`}> + + ` : ''}
    ` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/log-viewer-messages-list.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/log-viewer-messages-list.element.ts index 896fedc78c..b185f59144 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/log-viewer-messages-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/log-viewer-messages-list.element.ts @@ -11,6 +11,9 @@ export class UmbLogViewerMessagesListElement extends UmbLitElement { static styles = [ UUITextStyles, css` + :host { + display: block; + } #message-list-header { display: flex; font-weight: 600; @@ -129,23 +132,21 @@ export class UmbLogViewerMessagesListElement extends UmbLitElement {
    Machine name
    Message
    - - ${this._logs.length > 0 - ? html` ${this._logs.map( - (log) => html`` - )}` - : html` - Sorry, we cannot find what you are looking for. - `} - + ${this._logs.length > 0 + ? html` ${this._logs.map( + (log) => html`` + )}` + : html` + Sorry, we cannot find what you are looking for. + `} ${this._renderPagination()} `; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/log-viewer-polling-button.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/log-viewer-polling-button.element.ts index 44b19b8cae..f32fa860eb 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/log-viewer-polling-button.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/log-viewer-polling-button.element.ts @@ -90,10 +90,11 @@ export class UmbLogViewerPollingButtonElement extends UmbLitElement { this.#logViewerContext?.togglePolling(); } - #setPolingInterval(interval: PoolingInterval) { + #setPolingInterval = (interval: PoolingInterval) => { this.#logViewerContext?.setPollingInterval(interval); + this.#closePoolingPopover(); - } + }; #openPoolingPopover() { this._pollingPopover.open = true; @@ -103,6 +104,7 @@ export class UmbLogViewerPollingButtonElement extends UmbLitElement { #closePoolingPopover() { this._pollingPopover.open = false; this._polingExpandSymbol.open = false; + this.#togglePolling(); } render() { @@ -111,7 +113,7 @@ export class UmbLogViewerPollingButtonElement extends UmbLitElement { >${this._poolingConfig.enabled ? html`Polling ${this._poolingConfig.interval / 1000} seconds` - : 'Pooling'} (this._polingExpandSymbol.open = false)}> diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/log-viewer-search-input-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/log-viewer-search-input-modal.element.ts new file mode 100644 index 0000000000..7fc279c8eb --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/log-viewer-search-input-modal.element.ts @@ -0,0 +1,73 @@ +import { html, css } from 'lit'; +import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; +import { customElement, query, state } from 'lit/decorators.js'; +import { UmbModalBaseElement } from '@umbraco-cms/internal/modal'; +import { SavedLogSearchPresenationBaseModel } from '@umbraco-cms/backoffice/backend-api'; +import { UUIInputElement } from '@umbraco-ui/uui'; + +@customElement('umb-log-viewer-save-search-modal') +export default class UmbLogViewerSaveSearchModalElement extends UmbModalBaseElement< + { query: string }, + SavedLogSearchPresenationBaseModel +> { + static styles = [ + UUITextStyles, + css` + uui-input { + width: 100%; + } + `, + ]; + + @query('uui-input') + private _input!: UUIInputElement; + + private _handleClose() { + this.modalHandler?.reject(); + } + + private _handleSubmit() { + this.modalHandler?.submit({ name: this._input.value as string, query: this.data?.query }); + } + + @state() + private _hasValue = false; + + #validate(event: Event) { + const target = event.target as UUIInputElement; + this._hasValue = (target.value as string).length > 0; + } + + render() { + return html` + + Enter a friendly name for your search query + + Query: + ${this.data?.query} + + + Name: + + + + Close + Save + + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + 'umb-log-viewer-save-search-modal': UmbLogViewerSaveSearchModalElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/log-viewer-search-input.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/log-viewer-search-input.element.ts index 32ae06990d..f001b327e5 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/log-viewer-search-input.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/components/log-viewer-search-input.element.ts @@ -1,10 +1,31 @@ -import { UUIInputElement, UUIPopoverElement, UUISymbolExpandElement } from '@umbraco-ui/uui'; +import { UUIButtonElement, UUIInputElement, UUIPopoverElement, UUISymbolExpandElement } from '@umbraco-ui/uui'; import { UUITextStyles } from '@umbraco-ui/uui-css'; import { css, html } from 'lit'; import { customElement, query, state } from 'lit/decorators.js'; +import { Subject, debounceTime, tap } from 'rxjs'; import { UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN } from '../../../logviewer.context'; import { SavedLogSearchResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import { query as getQuery, path, toQueryString } from '@umbraco-cms/backoffice/router'; +import { + UMB_MODAL_CONTEXT_TOKEN, + UmbModalContext, + UmbModalHandler, + UmbModalToken, +} from '@umbraco-cms/backoffice/modal'; + +import './log-viewer-search-input-modal.element'; +export interface UmbContextSaveSearchModalData { + query: string; +} + +export const UMB_LOG_VIEWER_SAVE_SEARCH_MODAL = new UmbModalToken( + 'Umb.Modal.LogViewer.SaveSearch', + { + type: 'dialog', + size: 'small', + } +); @customElement('umb-log-viewer-search-input') export class UmbLogViewerSearchInputElement extends UmbLitElement { @@ -37,6 +58,13 @@ export class UmbLogViewerSearchInputElement extends UmbLitElement { box-shadow: var(--uui-shadow-depth-1); } + #loader-container { + display: flex; + justify-content: center; + align-items: center; + margin: 0 var(--uui-size-space-4); + } + .saved-search-item { display: flex; justify-content: space-between; @@ -92,15 +120,38 @@ export class UmbLogViewerSearchInputElement extends UmbLitElement { @state() private _inputQuery = ''; + @state() + private _showLoader = false; + + private inputQuery$ = new Subject(); + #logViewerContext?: UmbLogViewerWorkspaceContext; + private _modalContext?: UmbModalContext; + constructor() { super(); this.consumeContext(UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, (instance) => { this.#logViewerContext = instance; this.#observeStuff(); + this.#logViewerContext?.getSavedSearches(); this.#logViewerContext.getLogs(); }); + + this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (instance) => { + this._modalContext = instance; + }); + + this.inputQuery$ + .pipe( + tap(() => (this._showLoader = true)), + debounceTime(250) + ) + .subscribe((query) => { + this.#logViewerContext?.setFilterExpression(query); + this.#persist(query); + this._showLoader = false; + }); } #observeStuff() { @@ -129,36 +180,54 @@ export class UmbLogViewerSearchInputElement extends UmbLitElement { #setQuery(event: Event) { const target = event.target as UUIInputElement; - this._inputQuery = target.value as string; - this.#logViewerContext?.setFilterExpression(this._inputQuery); + this.inputQuery$.next(target.value as string); } #setQueryFromSavedSearch(query: string) { - this._inputQuery = query; - this.#logViewerContext?.setFilterExpression(query); - this.#logViewerContext?.setCurrentPage(1); - - this.#logViewerContext?.getLogs(); + this.inputQuery$.next(query); this._savedSearchesPopover.open = false; } + #persist(filter: string) { + let q = getQuery(); + + q = { + ...q, + lq: filter, + }; + + window.history.pushState({}, '', `${path()}?${toQueryString(q)}`); + } + #clearQuery() { - this._inputQuery = ''; + this.inputQuery$.next(''); this.#logViewerContext?.setFilterExpression(''); this.#logViewerContext?.getLogs(); } - #search() { - this.#logViewerContext?.setCurrentPage(1); + #modalHandler?: UmbModalHandler; - this.#logViewerContext?.getLogs(); + #saveSearch(savedSearch: SavedLogSearchResponseModel) { + this.#logViewerContext?.saveSearch(savedSearch); + } + + #removeSearch(event: Event) { + const target = event.target as UUIButtonElement; + this.#logViewerContext?.removeSearch({ name: target.id }); + } + + #openSaveSearchDialog() { + this.#modalHandler = this._modalContext?.open(UMB_LOG_VIEWER_SAVE_SEARCH_MODAL, { query: this._inputQuery }); + this.#modalHandler?.onSubmit().then((savedSearch) => { + if (savedSearch) { + this.#saveSearch(savedSearch); + } + }); } render() { - return html` + return html` + + ${this._showLoader + ? html`
    + +
    ` + : ''} ${this._inputQuery - ? html` this.#setQueryFromSavedSearch(search.query ?? '')}> ${search.name} ${search.query} ` )}
    - Search`; + `; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/log-search-view.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/log-search-view.element.ts index d936195362..79e8f9e216 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/log-search-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/views/search/log-search-view.element.ts @@ -3,6 +3,7 @@ import { css, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; import { UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN } from '../../logviewer.context'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import type { UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; @customElement('umb-log-viewer-search-view') export class UmbLogViewerSearchViewElement extends UmbLitElement { @@ -11,6 +12,7 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { css` #layout { margin: 20px; + padding-bottom: 20px; } #levels-container, #input-container { @@ -44,6 +46,9 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { private _canShowLogs = false; #logViewerContext?: UmbLogViewerWorkspaceContext; + + #canShowLogsObserver?: UmbObserverController; + constructor() { super(); this.consumeContext(UMB_APP_LOG_VIEWER_CONTEXT_TOKEN, (instance) => { @@ -53,8 +58,10 @@ export class UmbLogViewerSearchViewElement extends UmbLitElement { } #observeCanShowLogs() { + if (this.#canShowLogsObserver) this.#canShowLogsObserver.destroy(); if (!this.#logViewerContext) return; - this.observe(this.#logViewerContext.canShowLogs, (canShowLogs) => { + + this.#canShowLogsObserver = this.observe(this.#logViewerContext.canShowLogs, (canShowLogs) => { this._canShowLogs = canShowLogs ?? false; }); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/relation-type.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/relation-type.repository.ts index e098faaefd..52249a2896 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/relation-type.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/relation-type.repository.ts @@ -5,18 +5,20 @@ import { RelationTypeTreeServerDataSource } from './sources/relation-type.tree.s import { RelationTypeTreeDataSource } from './sources'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; -import { ProblemDetailsModel, RelationTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import { + CreateRelationTypeRequestModel, + ProblemDetailsModel, + RelationTypeResponseModel, + UpdateRelationTypeRequestModel, +} from '@umbraco-cms/backoffice/backend-api'; import { UmbDetailRepository, UmbTreeRepository } from '@umbraco-cms/backoffice/repository'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; -type ItemType = RelationTypeResponseModel; -type TreeItemType = any; - -// Move to documentation / JSdoc -/* We need to create a new instance of the repository from within the element context. We want the notifications to be displayed in the right context. */ -// element -> context -> repository -> (store) -> data source -// All methods should be async and return a promise. Some methods might return an observable as part of the promise response. -export class UmbRelationTypeRepository implements UmbTreeRepository, UmbDetailRepository { +export class UmbRelationTypeRepository + implements + UmbTreeRepository, + UmbDetailRepository +{ #init!: Promise; #host: UmbControllerHostElement; @@ -67,22 +69,18 @@ export class UmbRelationTypeRepository implements UmbTreeRepository) { + async requestTreeItems(ids: Array) { + if (!ids) throw new Error('Ids are missing'); await this.#init; - if (!keys) { - const error: ProblemDetailsModel = { title: 'Keys are missing' }; - return { data: undefined, error }; - } + const { data, error } = await this.#treeSource.getItems(ids); - const { data, error } = await this.#treeSource.getItems(keys); - - return { data, error, asObservable: () => this.#treeStore!.items(keys) }; + return { data, error, asObservable: () => this.#treeStore!.items(ids) }; } async rootTreeItems() { @@ -90,38 +88,38 @@ export class UmbRelationTypeRepository implements UmbTreeRepository) { + async treeItems(ids: Array) { await this.#init; - return this.#treeStore!.items(keys); + return this.#treeStore!.items(ids); } // DETAILS: - async createScaffold(parentKey: string | null) { + async createScaffold(parentId: string | null) { await this.#init; - if (!parentKey) { - throw new Error('Parent key is missing'); + if (!parentId) { + throw new Error('Parent id is missing'); } - return this.#detailDataSource.createScaffold(parentKey); + return this.#detailDataSource.createScaffold(parentId); } - async requestByKey(key: string) { + async requestById(id: string) { await this.#init; - // TODO: should we show a notification if the key is missing? + // TODO: should we show a notification if the id is missing? // Investigate what is best for Acceptance testing, cause in that perspective a thrown error might be the best choice? - if (!key) { + if (!id) { const error: ProblemDetailsModel = { title: 'Key is missing' }; return { error }; } - const { data, error } = await this.#detailDataSource.get(key); + const { data, error } = await this.#detailDataSource.get(id); if (data) { this.#detailStore?.append(data); @@ -130,82 +128,79 @@ export class UmbRelationTypeRepository implements UmbTreeRepository([], (x) => x.key); + #data = new ArrayState([], (x) => x.id); /** * Creates an instance of UmbRelationTypeStore. @@ -35,11 +35,11 @@ export class UmbRelationTypeStore extends UmbStoreBase { /** * Append a relation-type to the store - * @param {key} RelationTypeResponseModel key. + * @param {id} RelationTypeResponseModel id. * @memberof UmbRelationTypeStore */ - byKey(key: RelationTypeResponseModel['key']) { - return this.#data.getObservablePart((x) => x.find((y) => y.key === key)); + byKey(id: RelationTypeResponseModel['id']) { + return this.#data.getObservablePart((x) => x.find((y) => y.id === id)); } /** @@ -47,7 +47,7 @@ export class UmbRelationTypeStore extends UmbStoreBase { * @param {string[]} uniques * @memberof UmbRelationTypeStore */ - remove(uniques: Array) { + remove(uniques: Array) { this.#data.remove(uniques); } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/sources/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/sources/index.ts index 5080a513de..f8ff932071 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/sources/index.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/sources/index.ts @@ -1,7 +1,7 @@ import type { DataSourceResponse } from '@umbraco-cms/backoffice/repository'; -import { EntityTreeItemResponseModel, PagedEntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import { ItemResponseModelBaseModel, PagedEntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; export interface RelationTypeTreeDataSource { getRootItems(): Promise>; - getItems(key: Array): Promise>; + getItems(ids: Array): Promise>; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/sources/relation-type.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/sources/relation-type.server.data.ts index 7f30c96a2c..80ba73c8d4 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/sources/relation-type.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/sources/relation-type.server.data.ts @@ -30,32 +30,32 @@ export class UmbRelationTypeServerDataSource } /** - * Fetches a Relation Type with the given key from the server - * @param {string} key + * Fetches a Relation Type with the given id from the server + * @param {string} id * @return {*} * @memberof UmbRelationTypeServerDataSource */ - async get(key: string) { - if (!key) { + async get(id: string) { + if (!id) { const error: ProblemDetailsModel = { title: 'Key is missing' }; return { error }; } return tryExecuteAndNotify( this.#host, - RelationTypeResource.getRelationTypeByKey({ - key, + RelationTypeResource.getRelationTypeById({ + id, }) ); } /** * Creates a new Relation Type scaffold - * @param {(string | null)} parentKey + * @param {(string | null)} parentId * @return {*} * @memberof UmbRelationTypeServerDataSource */ - async createScaffold(parentKey: string | null) { + async createScaffold(parentId: string | null) { const data: RelationTypeResponseModel = {}; return { data }; @@ -68,7 +68,7 @@ export class UmbRelationTypeServerDataSource * @memberof UmbRelationTypeServerDataSource */ async insert(relationType: CreateRelationTypeRequestModel) { - if (!relationType.key) throw new Error('RelationType key is missing'); + if (!relationType.id) throw new Error('RelationType id is missing'); return tryExecuteAndNotify( this.#host, @@ -84,13 +84,13 @@ export class UmbRelationTypeServerDataSource * @return {*} * @memberof UmbRelationTypeServerDataSource */ - async update(key: string, relationType: UpdateRelationTypeRequestModel) { - if (!key) throw new Error('RelationType key is missing'); + async update(id: string, relationType: UpdateRelationTypeRequestModel) { + if (!id) throw new Error('RelationType id is missing'); return tryExecuteAndNotify( this.#host, - RelationTypeResource.putRelationTypeByKey({ - key, + RelationTypeResource.putRelationTypeById({ + id, requestBody: relationType, }) ); @@ -98,20 +98,20 @@ export class UmbRelationTypeServerDataSource /** * Deletes a Relation Type on the server - * @param {string} key + * @param {string} id * @return {*} * @memberof UmbRelationTypeServerDataSource */ - async delete(key: string) { - if (!key) { - const error: ProblemDetailsModel = { title: 'RelationType key is missing' }; + async delete(id: string) { + if (!id) { + const error: ProblemDetailsModel = { title: 'RelationType id is missing' }; return { error }; } return tryExecuteAndNotify( this.#host, - RelationTypeResource.deleteRelationTypeByKey({ - key, + RelationTypeResource.deleteRelationTypeById({ + id, }) ); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/sources/relation-type.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/sources/relation-type.tree.server.data.ts index 75a1243816..1dc64b51b5 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/sources/relation-type.tree.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/sources/relation-type.tree.server.data.ts @@ -14,9 +14,9 @@ export class RelationTypeTreeServerDataSource implements RelationTypeTreeDataSou #host: UmbControllerHostElement; // TODO: how do we handle trashed items? - async trashItems(keys: Array) { - if (!keys) { - const error: ProblemDetailsModel = { title: 'RelationType keys is missing' }; + async trashItems(ids: Array) { + if (!ids) { + const error: ProblemDetailsModel = { title: 'RelationType ids is missing' }; return { error }; } @@ -25,20 +25,20 @@ export class RelationTypeTreeServerDataSource implements RelationTypeTreeDataSou return tryExecuteAndNotify( this.#host, RelationTypeResource.deleteRelationTypeByKey({ - key: keys, + id: ids, }) ); */ return Promise.resolve({ error: null, data: null }); } - async moveItems(keys: Array, destination: string) { + async moveItems(ids: Array, destination: string) { // TODO: use backend cli when available. return tryExecuteAndNotify( this.#host, fetch('/umbraco/management/api/v1/relation-type/move', { method: 'POST', - body: JSON.stringify({ keys, destination }), + body: JSON.stringify({ ids, destination }), headers: { 'Content-Type': 'application/json', }, @@ -65,21 +65,21 @@ export class RelationTypeTreeServerDataSource implements RelationTypeTreeDataSou } /** - * Fetches the items for the given keys from the server - * @param {Array} keys + * Fetches the items for the given ids from the server + * @param {Array} ids * @return {*} * @memberof RelationTypeTreeServerDataSource */ - async getItems(keys: Array) { - if (keys) { - const error: ProblemDetailsModel = { title: 'Keys are missing' }; + async getItems(ids: Array) { + if (ids) { + const error: ProblemDetailsModel = { title: 'Ids are missing' }; return { error }; } return tryExecuteAndNotify( this.#host, - RelationTypeResource.getTreeRelationTypeItem({ - key: keys, + RelationTypeResource.getRelationTypeItem({ + id: ids, }) ); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/relation-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/relation-type-workspace.context.ts index dc75e3a0ef..81abf8f66f 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/relation-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/relation-type-workspace.context.ts @@ -13,14 +13,14 @@ export class UmbRelationTypeWorkspaceContext #data = new ObjectState(undefined); data = this.#data.asObservable(); name = this.#data.getObservablePart((data) => data?.name); - key = this.#data.getObservablePart((data) => data?.key); + id = this.#data.getObservablePart((data) => data?.id); constructor(host: UmbControllerHostElement) { super(host, new UmbRelationTypeRepository(host)); } - async load(key: string) { - const { data } = await this.repository.requestByKey(key); + async load(id: string) { + const { data } = await this.repository.requestById(id); if (data) { this.setIsNew(false); @@ -28,8 +28,8 @@ export class UmbRelationTypeWorkspaceContext } } - async createScaffold(parentKey: string | null) { - const { data } = await this.repository.createScaffold(parentKey); + async createScaffold(parentId: string | null) { + const { data } = await this.repository.createScaffold(parentId); if (!data) return; this.setIsNew(true); this.#data.next(data); @@ -39,8 +39,8 @@ export class UmbRelationTypeWorkspaceContext return this.#data.getValue(); } - getEntityKey() { - return this.getData()?.key || ''; + getEntityId() { + return this.getData()?.id || ''; } getEntityType() { @@ -53,24 +53,24 @@ export class UmbRelationTypeWorkspaceContext async save() { if (!this.#data.value) return; + if (!this.#data.value.id) return; + if (this.isNew) { await this.repository.create(this.#data.value); } else { - await this.repository.save(this.#data.value); + await this.repository.save(this.#data.value.id, this.#data.value); } - // If it went well, then its not new anymore?. + // If it went well, then its not new anymore?. this.setIsNew(false); } - update(key: K, value: RelationTypeBaseModel[K]) { - console.log('update', key, value); - - this.#data.next({ ...this.#data.value, [key]: value }); + update(id: K, value: RelationTypeBaseModel[K]) { + this.#data.next({ ...this.#data.value, [id]: value }); } - async delete(key: string) { - await this.repository.delete(key); + async delete(id: string) { + await this.repository.delete(id); } public destroy(): void { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/relation-type-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/relation-type-workspace.element.ts index 3e36f0dc74..eb96b21baf 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/relation-type-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/relation-type-workspace.element.ts @@ -3,7 +3,8 @@ import { css, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; import { UmbRelationTypeWorkspaceContext } from './relation-type-workspace.context'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UmbRouterSlotInitEvent, IRoute, IRoutingInfo } from '@umbraco-cms/internal/router'; +import type { UmbRouterSlotInitEvent } from '@umbraco-cms/internal/router'; +import type { IRoute } from '@umbraco-cms/backoffice/router'; import './relation-type-workspace-edit.element'; @@ -25,19 +26,19 @@ export class UmbRelationTypeWorkspaceElement extends UmbLitElement { @state() _routes: IRoute[] = [ { - path: 'create/:parentKey', + path: 'create/:parentId', component: () => this.#element, - setup: async (component: HTMLElement, info: IRoutingInfo) => { - const parentKey = info.match.params.parentKey; - this.#workspaceContext.createScaffold(parentKey); + setup: (_component, info) => { + const parentId = info.match.params.parentId; + this.#workspaceContext.createScaffold(parentId); }, }, { - path: 'edit/:key', + path: 'edit/:id', component: () => this.#element, - setup: (component: HTMLElement, info: IRoutingInfo) => { - const key = info.match.params.key; - this.#workspaceContext.load(key); + setup: (_component, info) => { + const id = info.match.params.id; + this.#workspaceContext.load(id); }, }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/relation-type-workspace.stories.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/relation-type-workspace.stories.ts index 0a95080b53..34a177e3c3 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/relation-type-workspace.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/relation-type-workspace.stories.ts @@ -3,6 +3,7 @@ import './relation-type-workspace.element'; import { Meta, Story } from '@storybook/web-components'; import { html } from 'lit'; +import { ifDefined } from 'lit/directives/if-defined.js'; import { data } from '../../../../core/mocks/data/relation-type.data'; import type { UmbRelationTypeWorkspaceElement } from './relation-type-workspace.element'; @@ -14,5 +15,5 @@ export default { } as Meta; export const AAAOverview: Story = () => - html` `; + html` `; AAAOverview.storyName = 'Overview'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/views/relation-type/relation-type-workspace-view-relation-type.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/views/relation-type/relation-type-workspace-view-relation-type.element.ts index cb700784c9..934f15d8f2 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/views/relation-type/relation-type-workspace-view-relation-type.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/views/relation-type/relation-type-workspace-view-relation-type.element.ts @@ -10,16 +10,6 @@ import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-ap @customElement('umb-relation-type-workspace-view-relation-type') export class UmbRelationTypeWorkspaceViewRelationTypeElement extends UmbLitElement { - static styles = [ - UUITextStyles, - css` - :host { - display: block; - margin: var(--uui-size-layout-1); - } - `, - ]; - @state() private _relationType?: RelationTypeResponseModel; @@ -39,10 +29,7 @@ export class UmbRelationTypeWorkspaceViewRelationTypeElement extends UmbLitEleme return; } - console.log('this._workspaceContext.data', this.#workspaceContext); - this.observe(this.#workspaceContext.data, (relationType) => { - console.log('relationType', relationType); if (!relationType) return; this._relationType = relationType; @@ -86,16 +73,26 @@ export class UmbRelationTypeWorkspaceViewRelationTypeElement extends UmbLitEleme } #renderParentProperty() { - if (this._relationType?.key) return html`
    ${this._relationType.parentObjectTypeName}
    `; + if (this._relationType?.id) return html`
    ${this._relationType.parentObjectTypeName}
    `; return html``; } #renderChildProperty() { - if (this._relationType?.key) return html`
    ${this._relationType.parentObjectTypeName}
    `; + if (this._relationType?.id) return html`
    ${this._relationType.parentObjectTypeName}
    `; return html``; } + + static styles = [ + UUITextStyles, + css` + :host { + display: block; + margin: var(--uui-size-layout-1); + } + `, + ]; } export default UmbRelationTypeWorkspaceViewRelationTypeElement; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/collection.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/collection.context.ts index c5f0c4baf5..9668a51d68 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/collection.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/collection.context.ts @@ -10,7 +10,7 @@ import { UmbTreeRepository } from '@umbraco-cms/backoffice/repository'; export class UmbCollectionContext { private _host: UmbControllerHostElement; private _entityType: string | null; - private _entityKey: string | null; + private _entityId: string | null; #repository?: UmbTreeRepository; @@ -32,13 +32,13 @@ export class UmbCollectionContext { @@ -88,10 +88,10 @@ export class UmbCollectionContext { if (nodes) { this.#data.next(nodes); @@ -114,9 +114,9 @@ export class UmbCollectionContext, (nodes) => { @@ -156,12 +156,12 @@ export class UmbCollectionContext k !== key); + public deselect(id: string) { + this.#selection.filter((k) => k !== id); } // TODO: how can we make sure to call this. diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/collection.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/collection.element.ts index 656f0c03e6..9b883b69bd 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/collection.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/collection.element.ts @@ -9,6 +9,7 @@ import { createExtensionElement, umbExtensionsRegistry } from '@umbraco-cms/back import type { ManifestCollectionView } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import type { UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; +import type { IRoute } from '@umbraco-cms/backoffice/router'; @customElement('umb-collection') export class UmbCollectionElement extends UmbLitElement { @@ -30,7 +31,7 @@ export class UmbCollectionElement extends UmbLitElement { ]; @state() - private _routes: Array = []; + private _routes: Array = []; @state() private _selection?: Array | null; @@ -95,7 +96,7 @@ export class UmbCollectionElement extends UmbLitElement { this._routes.push({ path: '**', - redirectTo: views?.[0]?.meta.pathName, + redirectTo: views?.[0]?.meta.pathName ?? '/', }); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/backoffice-frame/backoffice-main.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/backoffice-frame/backoffice-main.element.ts index 2654b4ed12..59ab21030a 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/backoffice-frame/backoffice-main.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/backoffice-frame/backoffice-main.element.ts @@ -5,6 +5,7 @@ import { state } from 'lit/decorators.js'; import { UmbSectionElement } from '../section/section.element'; import { UmbSectionContext, UMB_SECTION_CONTEXT_TOKEN } from '../section/section.context'; import { UmbBackofficeContext, UMB_BACKOFFICE_CONTEXT_TOKEN } from './backoffice.context'; +import type { IRoute } from '@umbraco-cms/backoffice/router'; import type { UmbRouterSlotChangeEvent } from '@umbraco-cms/internal/router'; import type { ManifestSection } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @@ -24,7 +25,7 @@ export class UmbBackofficeMainElement extends UmbLitElement { ]; @state() - private _routes: Array = []; + private _routes: Array = []; @state() private _sections: Array = []; @@ -63,10 +64,8 @@ export class UmbBackofficeMainElement extends UmbLitElement { return { path: this._routePrefix + section.meta.pathname, component: () => createExtensionElementOrFallback(section, 'umb-section'), - setup: (component: Promise) => { - component.then((element) => { - element.manifest = section; - }); + setup: (component) => { + (component as UmbSectionElement).manifest = section; }, }; }); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/code-editor/code-editor.stories.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/code-editor/code-editor.stories.ts index 4892950f62..e8d7805abe 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/code-editor/code-editor.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/code-editor/code-editor.stories.ts @@ -137,16 +137,16 @@ const codeSnippets: Record = { this.#data.next({ ...this.#data.value, $type: this.#data.value?.$type || '', content: value }); } - async load(entityKey: string) { - const { data } = await this.repository.requestByKey(entityKey); + async load(entityId: string) { + const { data } = await this.repository.requestByKey(entityId); if (data) { this.setIsNew(false); this.#data.next(data); } } - async createScaffold(parentKey: string | null) { - const { data } = await this.repository.createScaffold(parentKey); + async createScaffold(parentId: string | null) { + const { data } = await this.repository.createScaffold(parentId); if (!data) return; this.setIsNew(true); this.#data.next(data); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.element.ts index 33f35f8f52..c0161b597c 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.element.ts @@ -180,10 +180,17 @@ export class UmbDebugElement extends UmbLitElement { const props: TemplateResult[] = []; instance.properties?.forEach((property) => { - if (property.type === 'string') { - props.push(html`
  • ${property.key} = ${property.value}
  • `); - } else { - props.push(html`
  • ${property.key} (${property.type})
  • `); + switch(property.type){ + case 'string': + case 'number': + case 'boolean': + case 'object': + props.push(html`
  • ${property.key} (${property.type}) = ${property.value}
  • `); + break; + + default: + props.push(html`
  • ${property.key} (${property.type})
  • `); + break; } }); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/donut-chart/donut-chart.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/donut-chart/donut-chart.element.ts index fb3a7bfcd4..2f3f7892da 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/donut-chart/donut-chart.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/donut-chart/donut-chart.element.ts @@ -9,6 +9,7 @@ export interface Circle { name: string; percent: number; kind: string; + number: number; } interface CircleWithCommands extends Circle { @@ -195,6 +196,7 @@ export class UmbDonutChartElement extends LitElement { this._slices.map((slice) => { return { percent: this.#calculatePercentage(slice.amount), + number: slice.amount, color: slice.color, name: slice.name, kind: slice.kind, @@ -249,7 +251,7 @@ export class UmbDonutChartElement extends LitElement { const index = target.dataset.index as unknown as number; const circle = this.circles[index]; this._detailName = circle.name; - this._detailAmount = circle.percent; + this._detailAmount = circle.number; this._detailColor = circle.color; this._detailKind = circle.kind; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/extension-slot/extension-slot.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/extension-slot/extension-slot.element.ts index e75fe7d3dc..d690fb3091 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/extension-slot/extension-slot.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/extension-slot/extension-slot.element.ts @@ -45,6 +45,7 @@ export class UmbExtensionSlotElement extends UmbLitElement { } set props(newVal) { this._props = newVal; + // TODO: we could optimize this so we only re-set the updated props. this.#assignPropsToAllComponents(); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/index.ts index d7c74fb3df..78b453c6cb 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/index.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/index.ts @@ -28,6 +28,7 @@ import './input-media-picker/input-media-picker.element'; import './input-multi-url-picker/input-multi-url-picker.element'; import './input-slider/input-slider.element'; import './input-toggle/input-toggle.element'; +import './input-upload-field/input-upload-field.element'; import './input-template-picker/input-template-picker.element'; import './property-type-based-property/property-type-based-property.element'; import './ref-property-editor-ui/ref-property-editor-ui.element'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-checkbox-list/input-checkbox-list.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-checkbox-list/input-checkbox-list.element.ts index 5285262242..e70a5fc6b4 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-checkbox-list/input-checkbox-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-checkbox-list/input-checkbox-list.element.ts @@ -20,6 +20,7 @@ export class UmbInputCheckboxListElement extends FormControlMixin(UmbLitElement) /** * List of items. */ + // TODO: Could this use a type that we export to ensure TS failure, or hook this up with a type coming from backend? @property() public list: Array<{ key: string; checked: boolean; value: string }> = []; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-checkbox-list/input-checkbox-list.stories.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-checkbox-list/input-checkbox-list.stories.ts index d3ed1de046..cee98bed08 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-checkbox-list/input-checkbox-list.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-checkbox-list/input-checkbox-list.stories.ts @@ -3,26 +3,26 @@ import './input-checkbox-list.element'; import type { UmbInputCheckboxListElement } from './input-checkbox-list.element'; const meta: Meta = { - title: 'Components/Inputs/Checkbox List', - component: 'umb-input-checkbox-list' + title: 'Components/Inputs/Checkbox List', + component: 'umb-input-checkbox-list', }; - + export default meta; type Story = StoryObj; - + export const Overview: Story = { - args: { - list: [ - { - key: "isAwesome", - value: "Umbraco is awesome?", - checked: true - }, - { - key: "attendingCodeGarden", - value: "Attending CodeGarden?", - checked: false - }, - ] - } -}; \ No newline at end of file + args: { + list: [ + { + key: 'isAwesome', + value: 'Umbraco is awesome?', + checked: true, + }, + { + key: 'attendingCodeGarden', + value: 'Attending CodeGarden?', + checked: false, + }, + ], + }, +}; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-document-picker/input-document-picker.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-document-picker/input-document-picker.element.ts index cf5bd39230..d87623d464 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-document-picker/input-document-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-document-picker/input-document-picker.element.ts @@ -61,21 +61,21 @@ export class UmbInputDocumentPickerElement extends FormControlMixin(UmbLitElemen @property({ type: String, attribute: 'min-message' }) maxMessage = 'This field exceeds the allowed amount of items'; - // TODO: do we need both selectedKeys and value? If we just use value we follow the same pattern as native form controls. - private _selectedKeys: Array = []; - public get selectedKeys(): Array { - return this._selectedKeys; + // TODO: do we need both selectedIds and value? If we just use value we follow the same pattern as native form controls. + private _selectedIds: Array = []; + public get selectedIds(): Array { + return this._selectedIds; } - public set selectedKeys(keys: Array) { - this._selectedKeys = keys; - super.value = keys.join(','); + public set selectedIds(ids: Array) { + this._selectedIds = ids; + super.value = ids.join(','); this._observePickedDocuments(); } @property() - public set value(keysString: string) { - if (keysString !== this._value) { - this.selectedKeys = keysString.split(/[ ,]+/); + public set value(idsString: string) { + if (idsString !== this._value) { + this.selectedIds = idsString.split(/[ ,]+/); } } @@ -92,12 +92,12 @@ export class UmbInputDocumentPickerElement extends FormControlMixin(UmbLitElemen this.addValidator( 'rangeUnderflow', () => this.minMessage, - () => !!this.min && this._selectedKeys.length < this.min + () => !!this.min && this._selectedIds.length < this.min ); this.addValidator( 'rangeOverflow', () => this.maxMessage, - () => !!this.max && this._selectedKeys.length > this.max + () => !!this.max && this._selectedIds.length > this.max ); this.consumeContext(UMB_DOCUMENT_TREE_STORE_CONTEXT_TOKEN, (instance) => { @@ -119,16 +119,16 @@ export class UmbInputDocumentPickerElement extends FormControlMixin(UmbLitElemen if (!this._documentStore) return; // TODO: consider changing this to the list data endpoint when it is available - this._pickedItemsObserver = this.observe(this._documentStore.items(this._selectedKeys), (items) => { + this._pickedItemsObserver = this.observe(this._documentStore.items(this._selectedIds), (items) => { this._items = items; }); } private _openPicker() { - // We send a shallow copy(good enough as its just an array of keys) of our this._selectedKeys, as we don't want the modal to manipulate our data: + // We send a shallow copy(good enough as its just an array of ids) of our this._selectedIds, as we don't want the modal to manipulate our data: const modalHandler = this._modalContext?.open(UMB_DOCUMENT_PICKER_MODAL, { multiple: this.max === 1 ? false : true, - selection: [...this._selectedKeys], + selection: [...this._selectedIds], }); modalHandler?.onSubmit().then(({ selection }: any) => { @@ -145,12 +145,12 @@ export class UmbInputDocumentPickerElement extends FormControlMixin(UmbLitElemen }); await modalHandler?.onSubmit(); - const newSelection = this._selectedKeys.filter((value) => value !== item.key); + const newSelection = this._selectedIds.filter((value) => value !== item.id); this._setSelection(newSelection); } private _setSelection(newSelection: Array) { - this.selectedKeys = newSelection; + this.selectedIds = newSelection; this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true })); } @@ -166,7 +166,7 @@ export class UmbInputDocumentPickerElement extends FormControlMixin(UmbLitElemen const tempItem = item as EntityTreeItemResponseModel & { isTrashed: boolean }; return html` - + ${tempItem.isTrashed ? html` Trashed ` : nothing} this._removeItem(item)} label="Remove document ${item.name}">Remove diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-document-type-picker/input-document-type-picker.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-document-type-picker/input-document-type-picker.element.ts index 1ab2fc05c7..c3f844b898 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-document-type-picker/input-document-type-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-document-type-picker/input-document-type-picker.element.ts @@ -28,21 +28,21 @@ export class UmbInputDocumentTypePickerElement extends FormControlMixin(UmbLitEl `, ]; - // TODO: do we need both selectedKeys and value? If we just use value we follow the same pattern as native form controls. - private _selectedKeys: Array = []; - public get selectedKeys(): Array { - return this._selectedKeys; + // TODO: do we need both selectedIds and value? If we just use value we follow the same pattern as native form controls. + private _selectedIds: Array = []; + public get selectedIds(): Array { + return this._selectedIds; } - public set selectedKeys(keys: Array) { - this._selectedKeys = keys; - super.value = keys.join(','); + public set selectedIds(ids: Array) { + this._selectedIds = ids; + super.value = ids.join(','); this._observePickedDocuments(); } @property() - public set value(keysString: string) { - if (keysString !== this._value) { - this.selectedKeys = keysString.split(/[ ,]+/); + public set value(idsString: string) { + if (idsString !== this._value) { + this.selectedIds = idsString.split(/[ ,]+/); } } @@ -74,16 +74,16 @@ export class UmbInputDocumentTypePickerElement extends FormControlMixin(UmbLitEl if (!this._documentTypeStore) return; // TODO: consider changing this to the list data endpoint when it is available - this._pickedItemsObserver = this.observe(this._documentTypeStore.items(this._selectedKeys), (items) => { + this._pickedItemsObserver = this.observe(this._documentTypeStore.items(this._selectedIds), (items) => { this._items = items; }); } private _openPicker() { - // We send a shallow copy(good enough as its just an array of keys) of our this._selectedKeys, as we don't want the modal to manipulate our data: + // We send a shallow copy(good enough as its just an array of ids) of our this._selectedIds, as we don't want the modal to manipulate our data: const modalHandler = this._modalContext?.open(UMB_DOCUMENT_TYPE_PICKER_MODAL, { multiple: true, - selection: [...this._selectedKeys], + selection: [...this._selectedIds], }); modalHandler?.onSubmit().then(({ selection }: any) => { @@ -100,12 +100,12 @@ export class UmbInputDocumentTypePickerElement extends FormControlMixin(UmbLitEl }); await modalHandler?.onSubmit(); - const newSelection = this._selectedKeys.filter((value) => value !== item.key); + const newSelection = this._selectedIds.filter((value) => value !== item.id); this._setSelection(newSelection); } private _setSelection(newSelection: Array) { - this.selectedKeys = newSelection; + this.selectedIds = newSelection; this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true })); } @@ -121,7 +121,7 @@ export class UmbInputDocumentTypePickerElement extends FormControlMixin(UmbLitEl const tempItem = item as DocumentTypeResponseModel & { isTrashed: boolean }; return html` - + ${tempItem.isTrashed ? html` Trashed ` : nothing} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-language-picker/input-language-picker.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-language-picker/input-language-picker.element.ts index 263d9c76f0..df04084af4 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-language-picker/input-language-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-language-picker/input-language-picker.element.ts @@ -68,16 +68,16 @@ export class UmbInputLanguagePickerElement extends FormControlMixin(UmbLitElemen public get selectedIsoCodes(): Array { return this._selectedIsoCodes; } - public set selectedIsoCodes(keys: Array) { - this._selectedIsoCodes = keys; - super.value = keys.join(','); + public set selectedIsoCodes(isoCodes: Array) { + this._selectedIsoCodes = isoCodes; + super.value = isoCodes.join(','); this._observePickedItems(); } @property() - public set value(keysString: string) { - if (keysString !== this._value) { - this.selectedIsoCodes = keysString.split(/[ ,]+/); + public set value(isoCodesString: string) { + if (isoCodesString !== this._value) { + this.selectedIsoCodes = isoCodesString.split(/[ ,]+/); } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-list-base/input-list-base.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-list-base/input-list-base.ts index 37e134229b..2128b126e5 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-list-base/input-list-base.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-list-base/input-list-base.ts @@ -51,8 +51,8 @@ export class UmbInputListBaseElement extends UmbLitElement { }); } - protected removeFromSelection(key: string) { - this.value = this.value.filter((k) => k !== key); + protected removeFromSelection(id: string) { + this.value = this.value.filter((k) => k !== id); this.selectionUpdated(); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-media-picker/input-media-picker.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-media-picker/input-media-picker.element.ts index 626bfd9def..f324ca44be 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-media-picker/input-media-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-media-picker/input-media-picker.element.ts @@ -26,7 +26,7 @@ export class UmbInputMediaPickerElement extends FormControlMixin(UmbLitElement) } #add-button { text-align: center; - height: 202px; + height: 160px; } uui-icon { @@ -72,21 +72,21 @@ export class UmbInputMediaPickerElement extends FormControlMixin(UmbLitElement) @property({ type: String, attribute: 'min-message' }) maxMessage = 'This field exceeds the allowed amount of items'; - // TODO: do we need both selectedKeys and value? If we just use value we follow the same pattern as native form controls. - private _selectedKeys: Array = []; - public get selectedKeys(): Array { - return this._selectedKeys; + // TODO: do we need both selectedIds and value? If we just use value we follow the same pattern as native form controls. + private _selectedIds: Array = []; + public get selectedIds(): Array { + return this._selectedIds; } - public set selectedKeys(keys: Array) { - this._selectedKeys = keys; - super.value = keys.join(','); + public set selectedIds(ids: Array) { + this._selectedIds = ids; + super.value = ids.join(','); this._observePickedMedias(); } @property() - public set value(keysString: string) { - if (keysString !== this._value) { - this.selectedKeys = keysString.split(/[ ,]+/); + public set value(idsString: string) { + if (idsString !== this._value) { + this.selectedIds = idsString.split(/[ ,]+/); } } @@ -103,12 +103,12 @@ export class UmbInputMediaPickerElement extends FormControlMixin(UmbLitElement) this.addValidator( 'rangeUnderflow', () => this.minMessage, - () => !!this.min && this._selectedKeys.length < this.min + () => !!this.min && this._selectedIds.length < this.min ); this.addValidator( 'rangeOverflow', () => this.maxMessage, - () => !!this.max && this._selectedKeys.length > this.max + () => !!this.max && this._selectedIds.length > this.max ); this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (instance) => { @@ -129,7 +129,7 @@ export class UmbInputMediaPickerElement extends FormControlMixin(UmbLitElement) this._pickedItemsObserver?.destroy(); // TODO: consider changing this to the list data endpoint when it is available - const { asObservable } = await this._repository.requestTreeItems(this._selectedKeys); + const { asObservable } = await this._repository.requestTreeItems(this._selectedIds); if (!asObservable) return; @@ -139,10 +139,10 @@ export class UmbInputMediaPickerElement extends FormControlMixin(UmbLitElement) } private _openPicker() { - // We send a shallow copy(good enough as its just an array of keys) of our this._selectedKeys, as we don't want the modal to manipulate our data: + // We send a shallow copy(good enough as its just an array of ids) of our this._selectedIds, as we don't want the modal to manipulate our data: const modalHandler = this._modalContext?.open(UMB_MEDIA_PICKER_MODAL, { multiple: this.max === 1 ? false : true, - selection: [...this._selectedKeys], + selection: [...this._selectedIds], }); modalHandler?.onSubmit().then(({ selection }: any) => { @@ -159,13 +159,13 @@ export class UmbInputMediaPickerElement extends FormControlMixin(UmbLitElement) }); modalHandler?.onSubmit().then(() => { - const newSelection = this._selectedKeys.filter((value) => value !== item.key); + const newSelection = this._selectedIds.filter((value) => value !== item.id); this._setSelection(newSelection); }); } private _setSelection(newSelection: Array) { - this.selectedKeys = newSelection; + this.selectedIds = newSelection; this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true })); } @@ -187,7 +187,7 @@ export class UmbInputMediaPickerElement extends FormControlMixin(UmbLitElement) return html` ${tempItem.isTrashed ? html` Trashed ` : nothing} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-number-range/input-number-range.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-number-range/input-number-range.element.ts index 46910eb48f..20e021b98c 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-number-range/input-number-range.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-number-range/input-number-range.element.ts @@ -5,24 +5,19 @@ import { FormControlMixin } from '@umbraco-ui/uui-base/lib/mixins'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; function getNumberOrUndefined(value: string) { - const num = parseInt(value, 10); - return isNaN(num) ? undefined : num; + const num = parseInt(value, 10); + return isNaN(num) ? undefined : num; } @customElement('umb-input-number-range') export class UmbInputNumberRangeElement extends FormControlMixin(UmbLitElement) { - static styles = [ - UUITextStyles, - css` + static styles = [UUITextStyles, css``]; - `, - ]; + @property({ type: String, attribute: 'min-label' }) + minLabel = 'Low value'; - @property({type: String, attribute:'min-label'}) - minLabel = "Low value" - - @property({type: String, attribute:'max-label'}) - maxLabel = "High value" + @property({ type: String, attribute: 'max-label' }) + maxLabel = 'High value'; @state() private _minValue?: number; @@ -30,8 +25,8 @@ export class UmbInputNumberRangeElement extends FormControlMixin(UmbLitElement) public get minValue() { return this._minValue; } - public set minValue(keys: number | undefined) { - this._minValue = keys; + public set minValue(value: number | undefined) { + this._minValue = value; this.updateValue(); } @@ -41,22 +36,22 @@ export class UmbInputNumberRangeElement extends FormControlMixin(UmbLitElement) public get maxValue() { return this._maxValue; } - public set maxValue(keys: number | undefined) { - this._maxValue = keys; + public set maxValue(value: number | undefined) { + this._maxValue = value; this.updateValue(); } private updateValue() { - const newValue = (this._minValue || this._maxValue) ? (this._minValue || '')+','+(this._maxValue || '') : ''; - if(super.value !== newValue) { + const newValue = this._minValue || this._maxValue ? (this._minValue || '') + ',' + (this._maxValue || '') : ''; + if (super.value !== newValue) { super.value = newValue; } } @property() - public set value(keysString: string) { - if(keysString !== this._value) { - const splittedValue = keysString.split(/[ ,]+/); + public set value(valueString: string) { + if (valueString !== this._value) { + const splittedValue = valueString.split(/[ ,]+/); this.minValue = getNumberOrUndefined(splittedValue[0]); this.maxValue = getNumberOrUndefined(splittedValue[1]); } @@ -66,26 +61,29 @@ export class UmbInputNumberRangeElement extends FormControlMixin(UmbLitElement) super(); } - protected getFormElement() { - return this; - } + protected getFormElement() { + return this; + } - private _onMinInput(e:InputEvent) { + private _onMinInput(e: InputEvent) { this.minValue = Number((e.target as HTMLInputElement).value); this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true })); } - private _onMaxInput(e:InputEvent) { + private _onMaxInput(e: InputEvent) { this.maxValue = Number((e.target as HTMLInputElement).value); this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true })); } - - render() { - return html` – `; + return html` + – + `; } - } export default UmbInputNumberRangeElement; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-template-picker/input-template-picker.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-template-picker/input-template-picker.element.ts index 3c7320e1a6..aa47ff72d6 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-template-picker/input-template-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-template-picker/input-template-picker.element.ts @@ -119,7 +119,7 @@ export class UmbInputTemplatePickerElement extends FormControlMixin(UmbLitElemen }); } - #removeTemplate(key: string) { + #removeTemplate(id: string) { /* TODO: We need to follow up on this experience. Could we test if this document type is in use, if so we should have a dialog notifying the user(Dialog, are you sure...) about that we might will break something? @@ -129,14 +129,14 @@ export class UmbInputTemplatePickerElement extends FormControlMixin(UmbLitElemen In current backoffice we just prevent deleting a default when there are other templates. But if its the only one its okay. This is a weird experience, so we should make something that makes more sense. BTW. its weird cause the damage of removing the default template is equally bad when there is one or more templates. */ - this.allowedKeys = this.allowedKeys.filter((x) => x !== key); + this.allowedKeys = this.allowedKeys.filter((x) => x !== id); } #openTemplate(e: CustomEvent) { - const key = (e.target as UmbTemplateCardElement).value; + const id = (e.target as UmbTemplateCardElement).value; this._modalContext?.open(UMB_TEMPLATE_MODAL, { - key: key as string, + id: id as string, language: 'razor', }); } @@ -148,14 +148,14 @@ export class UmbInputTemplatePickerElement extends FormControlMixin(UmbLitElemen + ?default="${template.id === this.defaultKey}"> diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-upload-field/input-upload-field.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-upload-field/input-upload-field.element.ts new file mode 100644 index 0000000000..a5237a876d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-upload-field/input-upload-field.element.ts @@ -0,0 +1,188 @@ +import { css, html, nothing } from 'lit'; +import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; +import { customElement, property, query, state } from 'lit/decorators.js'; +import { FormControlMixin } from '@umbraco-ui/uui-base/lib/mixins'; +import { ifDefined } from 'lit/directives/if-defined.js'; +import { UUIFileDropzoneElement } from '@umbraco-ui/uui'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; + +@customElement('umb-input-upload-field') +export class UmbInputUploadFieldElement extends FormControlMixin(UmbLitElement) { + static styles = [ + UUITextStyles, + css` + uui-icon { + vertical-align: sub; + margin-right: var(--uui-size-space-4); + } + + uui-symbol-file-thumbnail { + box-sizing: border-box; + min-height: 150px; + padding: var(--uui-size-space-4); + border: 1px solid var(--uui-color-border); + } + + #wrapper { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, auto)); + } + `, + ]; + + private _keys: Array = []; + /** + * @description Keys to the files that belong to this upload field. + * @type {Array} + * @default [] + */ + @property({ type: Array }) + public set keys(fileKeys: Array) { + this._keys = fileKeys; + super.value = this._keys.join(','); + } + public get keys(): Array { + return this._keys; + } + + /** + * @description Allowed file extensions. If left empty, all are allowed. + * @type {Array} + * @default undefined + */ + @property({ type: Array }) + fileExtensions?: Array; + + /** + * @description Allows the user to upload multiple files. + * @type {Boolean} + * @default false + * @attr + */ + @property({ type: Boolean }) + multiple = false; + + @state() + _currentFiles: Blob[] = []; + + @state() + _currentFilesTemp?: Blob[]; + + @state() + extensions?: string[]; + + @query('#dropzone') + private _dropzone?: UUIFileDropzoneElement; + + private _notificationContext?: UmbNotificationContext; + + protected getFormElement() { + return undefined; + } + + constructor() { + super(); + this.consumeContext(UMB_NOTIFICATION_CONTEXT_TOKEN, (instance) => { + this._notificationContext = instance; + }); + } + + connectedCallback(): void { + super.connectedCallback(); + this.#setExtensions(); + } + + #setExtensions() { + if (!this.fileExtensions?.length) return; + + this.extensions = this.fileExtensions.map((extension) => { + return `.${extension}`; + }); + } + + #onUpload(e: CustomEvent) { + // UUIFileDropzoneEvent doesnt exist? + + this._currentFilesTemp = e.detail.files; + + if (!this.fileExtensions?.length && this._currentFilesTemp?.length) { + this.#setFiles(this._currentFilesTemp); + return; + } + const validated = this.#validateExtensions(); + this.#setFiles(validated); + } + + #validateExtensions(): Blob[] { + // TODO: Should property editor be able to handle allowed extensions like image/* ? + + const filesValidated: Blob[] = []; + this._currentFilesTemp?.forEach((temp) => { + const type = temp.type.slice(temp.type.lastIndexOf('/') + 1, temp.length); + if (this.fileExtensions?.find((x) => x === type)) filesValidated.push(temp); + else + this._notificationContext?.peek('danger', { + data: { headline: 'File upload', message: `Chosen file type "${type}" is not allowed` }, + }); + }); + + return filesValidated; + } + #setFiles(files: Blob[]) { + this._currentFiles = [...this._currentFiles, ...files]; + + //TODO: set keys when possible, not names + this.keys = this._currentFiles.map((file) => file.name); + this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true })); + } + + #handleBrowse() { + if (!this._dropzone) return; + this._dropzone.browse(); + } + + render() { + return html`${this.#renderFiles()} ${this.#renderDropzone()}`; + } + + #renderDropzone() { + if (!this.multiple && this._currentFiles.length) return nothing; + return html` + + Upload file here + + `; + } + + #renderFiles() { + if (!this._currentFiles?.length) return nothing; + return html`
    + ${this._currentFiles.map((file) => { + return html` + `; + })} +
    + + Remove file(s) + `; + } + + #handleRemove() { + // Remove via endpoint? + this._currentFiles = []; + } +} + +export default UmbInputUploadFieldElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-input-upload-field': UmbInputUploadFieldElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-upload-field/input-upload-field.stories.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-upload-field/input-upload-field.stories.ts new file mode 100644 index 0000000000..02a1fdb44f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-upload-field/input-upload-field.stories.ts @@ -0,0 +1,17 @@ +import { Meta, StoryObj } from '@storybook/web-components'; +import './input-upload-field.element'; +import type { UmbInputUploadFieldElement } from './input-upload-field.element'; + +const meta: Meta = { + title: 'Components/Inputs/Upload Field', + component: 'umb-input-upload-field', +}; + +export default meta; +type Story = StoryObj; + +export const Overview: Story = { + args: { + multiple: false, + }, +}; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-user-group/input-user-group.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-user-group/input-user-group.element.ts index ad3a644846..c7ecf36862 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-user-group/input-user-group.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-user-group/input-user-group.element.ts @@ -80,7 +80,7 @@ export class UmbInputPickerUserGroupElement extends UmbInputListBaseElement { ${userGroup.name}
    this.removeFromSelection(userGroup.key)} + @click=${() => this.removeFromSelection(userGroup.id)} label="remove" color="danger">
    diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-user/input-user.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-user/input-user.element.ts index 636696bfed..762edbc5cf 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-user/input-user.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-user/input-user.element.ts @@ -76,7 +76,7 @@ export class UmbPickerUserElement extends UmbInputListBaseElement {
    ${user.name}
    - this.removeFromSelection(user.key)} label="remove" color="danger"> + this.removeFromSelection(user.id)} label="remove" color="danger">
    ` )} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/property-type-based-property/property-type-based-property.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/property-type-based-property/property-type-based-property.element.ts index 64c634c4ac..588e861041 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/property-type-based-property/property-type-based-property.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/property-type-based-property/property-type-based-property.element.ts @@ -33,8 +33,8 @@ export class UmbPropertyTypeBasedPropertyElement extends UmbLitElement { public set property(value: PropertyTypeResponseModelBaseModel | undefined) { const oldProperty = this._property; this._property = value; - if (this._property?.dataTypeKey !== oldProperty?.dataTypeKey) { - this._observeDataType(this._property?.dataTypeKey); + if (this._property?.dataTypeId !== oldProperty?.dataTypeId) { + this._observeDataType(this._property?.dataTypeId); this._observeProperty(); } } @@ -95,13 +95,13 @@ export class UmbPropertyTypeBasedPropertyElement extends UmbLitElement { ); } - private async _observeDataType(dataTypeKey?: string) { + private async _observeDataType(dataTypeId?: string) { this._dataTypeObserver?.destroy(); - if (dataTypeKey) { + if (dataTypeId) { // Its not technically needed to have await here, this is only to ensure that the data is loaded before we observe it, and thereby only updating the DOM with the latest data. - await this._dataTypeRepository.requestByKey(dataTypeKey); + await this._dataTypeRepository.requestById(dataTypeId); this._dataTypeObserver = this.observe( - await this._dataTypeRepository.byKey(dataTypeKey), + await this._dataTypeRepository.byId(dataTypeId), (dataType) => { this._dataTypeData = dataType?.values || []; this._propertyEditorUiAlias = dataType?.propertyEditorUiAlias || undefined; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/section/section-views/section-views.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/section/section-views/section-views.element.ts index 890f27e0a9..a75bcc02fc 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/section/section-views/section-views.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/section/section-views/section-views.element.ts @@ -3,7 +3,8 @@ import { css, html, nothing } from 'lit'; import { customElement, property, state } from 'lit/decorators.js'; import { map, of } from 'rxjs'; import { UmbSectionContext, UMB_SECTION_CONTEXT_TOKEN } from '../section.context'; -import { UmbRouterSlotChangeEvent, UmbRouterSlotInitEvent } from '@umbraco-cms/internal/router'; +import type { IRoute } from '@umbraco-cms/backoffice/router'; +import type { UmbRouterSlotChangeEvent, UmbRouterSlotInitEvent } from '@umbraco-cms/internal/router'; import type { ManifestDashboard, ManifestSectionView } from '@umbraco-cms/backoffice/extensions-registry'; import { createExtensionElement, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extensions-api'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @@ -21,7 +22,7 @@ export class UmbSectionViewsElement extends UmbLitElement { display: flex; justify-content: space-between; align-items: center; - height:var(--umb-header-layout-height); + height: var(--umb-header-layout-height); box-sizing: border-box; } @@ -52,7 +53,7 @@ export class UmbSectionViewsElement extends UmbLitElement { private _activePath?: string; @state() - private _routes: Array = []; + private _routes: Array = []; private _sectionContext?: UmbSectionContext; private _extensionsObserver?: UmbObserverController; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/section/section.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/section/section.element.ts index 3cc798c083..2a9b530b68 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/section/section.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/section/section.element.ts @@ -6,7 +6,7 @@ import type { UmbWorkspaceElement } from '../workspace/workspace.element'; import type { UmbSectionViewsElement } from './section-views/section-views.element'; import type { ManifestSection, ManifestSectionSidebarApp } from '@umbraco-cms/backoffice/extensions-registry'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extensions-api'; -import type { IRoutingInfo } from '@umbraco-cms/internal/router'; +import type { IRoute } from '@umbraco-cms/backoffice/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import './section-sidebar-menu/section-sidebar-menu.element'; @@ -37,7 +37,7 @@ export class UmbSectionElement extends UmbLitElement { public manifest?: ManifestSection; @state() - private _routes?: Array; + private _routes?: Array; @state() private _menus?: Array>; @@ -55,15 +55,15 @@ export class UmbSectionElement extends UmbLitElement { { path: 'workspace/:entityType', component: () => import('../workspace/workspace.element'), - setup: (element: UmbWorkspaceElement, info: IRoutingInfo) => { - element.entityType = info.match.params.entityType; + setup: (element, info) => { + (element as UmbWorkspaceElement).entityType = info.match.params.entityType; }, }, { path: '**', component: () => import('../section/section-views/section-views.element'), - setup: (element: UmbSectionViewsElement) => { - element.sectionAlias = this.manifest?.alias; + setup: (element) => { + (element as UmbSectionViewsElement).sectionAlias = this.manifest?.alias; }, }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/table/table.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/table/table.element.ts index 192818c781..0ab0b54030 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/table/table.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/table/table.element.ts @@ -1,5 +1,5 @@ import { UUITextStyles } from '@umbraco-ui/uui-css'; -import { css, html, LitElement, nothing } from 'lit'; +import { css, html, LitElement } from 'lit'; import { ifDefined } from 'lit/directives/if-defined.js'; import { when } from 'lit/directives/when.js'; import { customElement, property, state } from 'lit/decorators.js'; @@ -7,7 +7,7 @@ import { repeat } from 'lit/directives/repeat.js'; // TODO: move to UI Library - entity actions should NOT be moved to UI Library but stay in an UmbTable element export interface UmbTableItem { - key: string; + id: string; icon?: string; entityType?: string; data: Array; @@ -171,7 +171,7 @@ export class UmbTableElement extends LitElement { private _handleRowCheckboxChange(event: Event, item: UmbTableItem) { const checkboxElement = event.target as HTMLInputElement; - checkboxElement.checked ? this._selectRow(item.key) : this._deselectRow(item.key); + checkboxElement.checked ? this._selectRow(item.id) : this._deselectRow(item.id); } private _handleAllRowsCheckboxChange(event: Event) { @@ -198,7 +198,7 @@ export class UmbTableElement extends LitElement { } private _selectAllRows() { - this.selection = this.items.map((item: UmbTableItem) => item.key); + this.selection = this.items.map((item: UmbTableItem) => item.id); this._selectionMode = true; this.dispatchEvent(new UmbTableSelectedEvent()); } @@ -215,7 +215,7 @@ export class UmbTableElement extends LitElement { ${this._renderHeaderCheckboxCell()} ${this.columns.map((column) => this._renderHeaderCell(column))} - ${repeat(this.items, (item) => item.key, this._renderRow)} + ${repeat(this.items, (item) => item.id, this._renderRow)}
    `; } @@ -259,9 +259,9 @@ export class UmbTableElement extends LitElement { return html` this._selectRow(item.key)} - @unselected=${() => this._deselectRow(item.key)}> + ?selected=${this._isSelected(item.id)} + @selected=${() => this._selectRow(item.id)} + @unselected=${() => this._deselectRow(item.id)}> ${this._renderRowCheckboxCell(item)} ${this.columns.map((column) => this._renderRowCell(column, item))} `; }; @@ -277,7 +277,7 @@ export class UmbTableElement extends LitElement { label="Select Row" @click=${(e: PointerEvent) => e.stopPropagation()} @change=${(event: Event) => this._handleRowCheckboxChange(event, item)} - ?checked="${this._isSelected(item.key)}"> + ?checked="${this._isSelected(item.id)}"> ` )} `; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/table/table.stories.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/table/table.stories.ts index d7ac93c25a..f4da64de01 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/table/table.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/table/table.stories.ts @@ -1,13 +1,13 @@ import { Meta, StoryObj } from '@storybook/web-components'; import './table.element'; import { v4 as uuidv4 } from 'uuid'; -import type { UmbTableElement, UmbTableColumn, UmbTableConfig, UmbTableItem } from './table.element' +import type { UmbTableElement, UmbTableColumn, UmbTableConfig, UmbTableItem } from './table.element'; const meta: Meta = { - title: 'Components/Table', - component: 'umb-table', + title: 'Components/Table', + component: 'umb-table', }; - + export default meta; type Story = StoryObj; @@ -26,7 +26,7 @@ const columns: Array = [ const items: Array = [ { - key: uuidv4(), + id: uuidv4(), icon: 'umb:wand', data: [ { @@ -40,7 +40,7 @@ const items: Array = [ ], }, { - key: uuidv4(), + id: uuidv4(), icon: 'umb:document', data: [ { @@ -54,7 +54,7 @@ const items: Array = [ ], }, { - key: uuidv4(), + id: uuidv4(), icon: 'umb:user', data: [ { @@ -70,35 +70,34 @@ const items: Array = [ ]; export const Overview: Story = { - args: { + args: { items: items, columns: columns, config: { allowSelection: true, hideIcon: false, - } - } + }, + }, }; - export const WithDisallowedSelections: Story = { - args: { + args: { items: items, columns: columns, config: { allowSelection: false, hideIcon: false, - } - } + }, + }, }; export const WithHiddenIcons: Story = { - args: { + args: { items: items, columns: columns, config: { allowSelection: true, hideIcon: true, - } - } -}; \ No newline at end of file + }, + }, +}; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/template-card/template-card.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/template-card/template-card.element.ts index 50f8cc5484..ec7cbf1f29 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/template-card/template-card.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/template-card/template-card.element.ts @@ -15,6 +15,51 @@ import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-template-card') export class UmbTemplateCardElement extends FormControlMixin(UmbLitElement) { + @property({ type: String }) + name = ''; + + @property({ type: Boolean, reflect: true }) + default = false; + + _id = ''; + @property({ type: String }) + public set id(newId: string) { + this._id = newId; + super.value = newId; + } + public get id() { + return this._id; + } + + protected getFormElement() { + return undefined; + } + + #setSelection(e: KeyboardEvent) { + e.preventDefault(); + e.stopPropagation(); + //this.selected = true; + this.dispatchEvent(new CustomEvent('change-default', { bubbles: true, composed: true })); + } + #openTemplate(e: KeyboardEvent) { + e.preventDefault(); + e.stopPropagation(); + this.dispatchEvent(new CustomEvent('open', { bubbles: true, composed: true })); + } + + render() { + return html`
    + + + ${this.default ? '(Default template)' : 'Set default'} + + +
    `; + } + static styles = [ UUITextStyles, css` @@ -114,51 +159,6 @@ export class UmbTemplateCardElement extends FormControlMixin(UmbLitElement) { } `, ]; - - @property({ type: String }) - name = ''; - - @property({ type: Boolean, reflect: true }) - default = false; - - _key = ''; - @property({ type: String }) - public set key(newKey: string) { - this._key = newKey; - super.value = newKey; - } - public get key() { - return this._key; - } - - protected getFormElement() { - return undefined; - } - - #setSelection(e: KeyboardEvent) { - e.preventDefault(); - e.stopPropagation(); - //this.selected = true; - this.dispatchEvent(new CustomEvent('change-default', { bubbles: true, composed: true })); - } - #openTemplate(e: KeyboardEvent) { - e.preventDefault(); - e.stopPropagation(); - this.dispatchEvent(new CustomEvent('open', { bubbles: true, composed: true })); - } - - render() { - return html`
    - - - ${this.default ? '(Default template)' : 'Set default'} - - -
    `; - } } export default UmbTemplateCardElement; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/entity-tree-item/entity-tree-item.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/entity-tree-item/entity-tree-item.context.ts index 6472a47207..62db8e957c 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/entity-tree-item/entity-tree-item.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/entity-tree-item/entity-tree-item.context.ts @@ -5,6 +5,6 @@ import { EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api // TODO get unique method from an entity repository static method export class UmbEntityTreeItemContext extends UmbTreeItemContextBase { constructor(host: UmbControllerHostElement) { - super(host, (x: EntityTreeItemResponseModel) => x.key); + super(host, (x: EntityTreeItemResponseModel) => x.id); } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree.context.ts index 8f22454e4e..89020e9acd 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree.context.ts @@ -3,7 +3,6 @@ import { UmbTreeRepository } from '@umbraco-cms/backoffice/repository'; import type { ManifestTree } from '@umbraco-cms/backoffice/extensions-registry'; import { DeepState, UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; -import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import { createExtensionClass, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extensions-api'; export interface UmbTreeContext { @@ -12,7 +11,7 @@ export interface UmbTreeContext { readonly selection: Observable>; setSelectable(value: boolean): void; setSelection(value: Array): void; - select(key: string): void; + select(id: string): void; } export class UmbTreeContextBase implements UmbTreeContext { @@ -75,17 +74,17 @@ export class UmbTreeContextBase implements UmbTreeContext { this.#selection.next(value); } - public select(key: string) { + public select(id: string) { const oldSelection = this.#selection.getValue(); - if (oldSelection.indexOf(key) !== -1) return; + if (oldSelection.indexOf(id) !== -1) return; - const selection = [...oldSelection, key]; + const selection = [...oldSelection, id]; this.#selection.next(selection); } - public deselect(key: string) { + public deselect(id: string) { const selection = this.#selection.getValue(); - this.#selection.next(selection.filter((x) => x !== key)); + this.#selection.next(selection.filter((x) => x !== id)); } public async requestRootItems() { @@ -93,9 +92,9 @@ export class UmbTreeContextBase implements UmbTreeContext { return this.repository!.requestRootTreeItems(); } - public async requestChildrenOf(parentKey: string | null) { + public async requestChildrenOf(parentId: string | null) { await this.#init; - return this.repository!.requestTreeItemsOf(parentKey); + return this.repository!.requestTreeItemsOf(parentId); } public async rootItems() { @@ -103,8 +102,8 @@ export class UmbTreeContextBase implements UmbTreeContext { return this.repository!.rootTreeItems(); } - public async childrenOf(parentKey: string | null) { + public async childrenOf(parentId: string | null) { await this.#init; - return this.repository!.treeItemsOf(parentKey); + return this.repository!.treeItemsOf(parentId); } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-action-menu/workspace-action-menu.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-action-menu/workspace-action-menu.element.ts index 3f6df583d9..a3838dac24 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-action-menu/workspace-action-menu.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-action-menu/workspace-action-menu.element.ts @@ -37,7 +37,7 @@ export class UmbWorkspaceActionMenuElement extends UmbLitElement { private _workspaceContext?: typeof UMB_ENTITY_WORKSPACE_CONTEXT.TYPE; @state() - _entityKey?: string; + _entityId?: string; @state() _entityType?: string; @@ -53,7 +53,7 @@ export class UmbWorkspaceActionMenuElement extends UmbLitElement { private _observeInfo() { if (!this._workspaceContext) return; - this._entityKey = this._workspaceContext.getEntityKey(); + this._entityId = this._workspaceContext.getEntityId(); this._entityType = this._workspaceContext.getEntityType(); } @@ -75,14 +75,14 @@ export class UmbWorkspaceActionMenuElement extends UmbLitElement { } #renderActionsMenu() { - return this._entityKey + return this._entityId ? html`
    diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-content/views/collection/workspace-view-collection.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-content/views/collection/workspace-view-collection.element.ts index e7ff049ce0..87a3a06857 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-content/views/collection/workspace-view-collection.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-content/views/collection/workspace-view-collection.element.ts @@ -42,16 +42,16 @@ export class UmbWorkspaceViewCollectionElement extends UmbLitElement { } protected _provideWorkspace() { - const entityKey = this._workspaceContext?.getEntityKey(); + const entityId = this._workspaceContext?.getEntityId(); const entityType = this._workspaceContext?.getEntityType(); - if (entityKey != null && entityType != null) { + if (entityId != null && entityType != null) { const manifestMeta = this.manifest.meta; this._collectionContext = new UmbCollectionContext( this, entityType, - entityKey, + entityId, manifestMeta.storeAlias, manifestMeta.repositoryAlias ); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/entity-manager-controller.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/entity-manager-controller.ts index c1ee25b071..9704ce80c2 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/entity-manager-controller.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/entity-manager-controller.ts @@ -10,7 +10,7 @@ import { ObjectState, UmbObserverController } from '@umbraco-cms/backoffice/obse import type { EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbEntityDetailStore } from '@umbraco-cms/backoffice/store'; -// Extend entityType base type?, so we are sure to have parentKey? +// Extend entityType base type?, so we are sure to have parentId? // TODO: switch to use EntityDetailItem ? if we can have such type? export class UmbEntityWorkspaceManager< StoreType extends UmbEntityDetailStore, @@ -27,7 +27,7 @@ export class UmbEntityWorkspaceManager< #isNew = false; private _entityType; - private _entityKey!: string; + private _entityId!: string; private _createAtParentKey?: string | null; @@ -47,7 +47,7 @@ export class UmbEntityWorkspaceManager< } private _observeStore() { - if (!this._store || !this._entityKey) { + if (!this._store || !this._entityId) { return; } @@ -58,7 +58,7 @@ export class UmbEntityWorkspaceManager< this._storeSubscription?.destroy(); this._storeSubscription = new UmbObserverController( this._host, - this._store.getByKey(this._entityKey), + this._store.getByKey(this._entityId), (content) => { if (!content) return; // TODO: Handle nicely if there is no content data. this.state.next(content as any); @@ -71,7 +71,7 @@ export class UmbEntityWorkspaceManager< return this._entityType; }; getEntityKey = (): string => { - return this._entityKey; + return this._entityId; }; getStore = () => { @@ -82,16 +82,16 @@ export class UmbEntityWorkspaceManager< return this.state.getValue(); }; - load = (entityKey: string) => { + load = (entityId: string) => { this.#isNew = false; - this._entityKey = entityKey; + this._entityId = entityId; this._observeStore(); }; - create = (parentKey: string | null) => { + create = (parentId: string | null) => { this.#isNew = true; - this._entityKey = uuidv4(); - this._createAtParentKey = parentKey; + this._entityId = uuidv4(); + this._createAtParentKey = parentId; }; save = (): Promise => { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/workspace-container-structure-helper.class.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/workspace-container-structure-helper.class.ts new file mode 100644 index 0000000000..25b756dfbf --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/workspace-container-structure-helper.class.ts @@ -0,0 +1,160 @@ +import { UmbDocumentWorkspaceContext } from '../../../../documents/documents/workspace/document-workspace.context'; +import { PropertyContainerTypes } from './workspace-structure-manager.class'; +import { PropertyTypeContainerResponseModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import { UmbContextConsumerController, UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-api'; +import { ArrayState, BooleanState, UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; + +export class UmbWorkspaceContainerStructureHelper { + #host: UmbControllerHostElement; + + #workspaceContext?: UmbDocumentWorkspaceContext; + + private _ownerType?: PropertyContainerTypes = 'Tab'; + private _childType?: PropertyContainerTypes = 'Group'; + private _isRoot = false; + private _ownerName?: string; + private _ownerKey?: string; + + // Containers defined in data might be more than actual containers to display as we merge them by name. + private _ownerContainers: PropertyTypeContainerResponseModelBaseModel[] = []; + + // State containing the merged containers (only one pr. name): + #containers = new ArrayState([], (x) => x.id); + readonly containers = this.#containers.asObservable(); + + #hasProperties = new BooleanState(false); + readonly hasProperties = this.#hasProperties.asObservable(); + + constructor(host: UmbControllerHostElement) { + this.#host = host; + + this.#containers.sortBy((a, b) => (a.sortOrder || 0) - (b.sortOrder || 0)); + + new UmbContextConsumerController(host, UMB_ENTITY_WORKSPACE_CONTEXT, (context) => { + this.#workspaceContext = context as UmbDocumentWorkspaceContext; + this._observeOwnerContainers(); + }); + } + + public setType(value?: PropertyContainerTypes) { + if (this._ownerType === value) return; + this._ownerType = value; + this._observeOwnerContainers(); + } + public getType() { + return this._ownerType; + } + + public setContainerChildType(value?: PropertyContainerTypes) { + if (this._childType === value) return; + this._childType = value; + this._observeOwnerContainers(); + } + public getContainerChildType() { + return this._childType; + } + + public setName(value?: string) { + if (this._ownerName === value) return; + this._ownerName = value; + this._observeOwnerContainers(); + } + public getName() { + return this._ownerName; + } + + public setIsRoot(value: boolean) { + if (this._isRoot === value) return; + this._isRoot = value; + this._observeOwnerContainers(); + } + public getIsRoot() { + return this._isRoot; + } + + private _observeOwnerContainers() { + if (!this.#workspaceContext) return; + + if (this._isRoot) { + this.#containers.next([]); + // We cannot have root properties currently, therefor we set it to false: + this.#hasProperties.next(false); + this._observeRootContainers(); + } else if (this._ownerName && this._ownerType) { + new UmbObserverController( + this.#host, + this.#workspaceContext.structure.containersByNameAndType(this._ownerName, this._ownerType), + (ownerContainers) => { + this.#containers.next([]); + this._ownerContainers = ownerContainers || []; + if (this._ownerContainers.length > 0) { + this._observeOwnerProperties(); + this._observeChildContainers(); + } + }, + '_observeOwnerContainers' + ); + } + } + + private _observeOwnerProperties() { + if (!this.#workspaceContext) return; + + this._ownerContainers.forEach((container) => { + new UmbObserverController( + this.#host, + this.#workspaceContext!.structure.hasPropertyStructuresOf(container.id!), + (hasProperties) => { + this.#hasProperties.next(hasProperties); + }, + '_observeOwnerHasProperties_' + container.id + ); + }); + } + + private _observeChildContainers() { + if (!this.#workspaceContext || !this._ownerName || !this._childType) return; + + this._ownerContainers.forEach((container) => { + new UmbObserverController( + this.#host, + this.#workspaceContext!.structure.containersOfParentKey(container.id, this._childType!), + this._insertGroupContainers, + '_observeGroupsOf_' + container.id + ); + }); + } + + private _observeRootContainers() { + if (!this.#workspaceContext || !this._isRoot) return; + + new UmbObserverController( + this.#host, + this.#workspaceContext!.structure.rootContainers(this._childType!), + (rootContainers) => { + this.#containers.next([]); + this._insertGroupContainers(rootContainers); + }, + '_observeRootContainers' + ); + } + + private _insertGroupContainers = (groupContainers: PropertyTypeContainerResponseModelBaseModel[]) => { + groupContainers.forEach((group) => { + if (group.name !== null && group.name !== undefined) { + if (!this.#containers.getValue().find((x) => x.name === group.name)) { + this.#containers.appendOne(group); + } + } + }); + }; + + /** Manipulate methods: */ + + async addGroup(ownerKey?: string, sortOrder?: number) { + if (!this.#workspaceContext) return; + + await this.#workspaceContext.structure.createContainer(null, ownerKey, this._childType, sortOrder); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/workspace-context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/workspace-context.ts index a2c6c169e6..796b258bd3 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/workspace-context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/workspace-context.ts @@ -1,7 +1,7 @@ import { UmbEntityWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; import { UmbContextProviderController, UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; -import { DeepState } from '@umbraco-cms/backoffice/observable-api'; +import { BooleanState } from '@umbraco-cms/backoffice/observable-api'; import type { BaseEntity } from '@umbraco-cms/backoffice/models'; /* @@ -15,7 +15,7 @@ export abstract class UmbWorkspaceContext public host: UmbControllerHostElement; public repository: T; - #isNew = new DeepState(false); + #isNew = new BooleanState(undefined); isNew = this.#isNew.asObservable(); constructor(host: UmbControllerHostElement, repository: T) { @@ -32,7 +32,7 @@ export abstract class UmbWorkspaceContext this.#isNew.next(isNew); } - abstract getEntityKey(): string | undefined; // COnsider if this should go away now that we have getUnique() + abstract getEntityId(): string | undefined; // COnsider if this should go away now that we have getUnique() abstract getEntityType(): string; // TODO: consider of this should be on the repository because a repo is responsible for one entity type abstract getData(): EntityType | undefined; abstract save(): Promise; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/workspace-property-structure-helper.class.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/workspace-property-structure-helper.class.ts new file mode 100644 index 0000000000..6941cd3daa --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/workspace-property-structure-helper.class.ts @@ -0,0 +1,114 @@ +import { UmbDocumentWorkspaceContext } from '../../../../documents/documents/workspace/document-workspace.context'; +import { PropertyContainerTypes } from './workspace-structure-manager.class'; +import { DocumentTypePropertyTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import { UmbContextConsumerController, UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-api'; +import { ArrayState, UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; + +export class UmbWorkspacePropertyStructureHelper { + #host: UmbControllerHostElement; + + #workspaceContext?: UmbDocumentWorkspaceContext; + + private _containerType?: PropertyContainerTypes; + private _isRoot?: boolean; + private _containerName?: string; + + #propertyStructure = new ArrayState([], (x) => x.id); + readonly propertyStructure = this.#propertyStructure.asObservable(); + + constructor(host: UmbControllerHostElement) { + this.#host = host; + new UmbContextConsumerController(host, UMB_ENTITY_WORKSPACE_CONTEXT, (context) => { + this.#workspaceContext = context as UmbDocumentWorkspaceContext; + this._observeGroupContainers(); + }); + } + + public setContainerType(value?: PropertyContainerTypes) { + if (this._containerType === value) return; + this._containerType = value; + this._observeGroupContainers(); + } + public getContainerType() { + return this._containerType; + } + + public setContainerName(value?: string) { + if (this._containerName === value) return; + this._containerName = value; + this._observeGroupContainers(); + } + public getContainerName() { + return this._containerName; + } + + public setIsRoot(value: boolean) { + if (this._isRoot === value) return; + this._isRoot = value; + this._observeGroupContainers(); + } + public getIsRoot() { + return this._isRoot; + } + + private _observeGroupContainers() { + if (!this.#workspaceContext || !this._containerType) return; + + if (this._isRoot === true) { + this._observePropertyStructureOf(null); + } else if (this._containerName !== undefined) { + new UmbObserverController( + this.#host, + this.#workspaceContext!.structure.containersByNameAndType(this._containerName, this._containerType), + (groupContainers) => { + groupContainers.forEach((group) => this._observePropertyStructureOf(group.id)); + }, + '_observeGroupContainers' + ); + } + } + + private _observePropertyStructureOf(groupId?: string | null) { + if (!this.#workspaceContext || groupId === undefined) return; + + new UmbObserverController( + this.#host, + this.#workspaceContext.structure.propertyStructuresOf(groupId), + (properties) => { + // If this need to be able to remove properties, we need to clean out the ones of this group.id before inserting them: + const _propertyStructure = this.#propertyStructure.getValue().filter((x) => x.containerId !== groupId); + + properties?.forEach((property) => { + if (!_propertyStructure.find((x) => x.alias === property.alias)) { + _propertyStructure.push(property); + } + }); + + if (_propertyStructure.length > 0) { + // TODO: End-point: Missing sort order? + //_propertyStructure = _propertyStructure.sort((a, b) => (a.sortOrder || 0) - (b.sortOrder || 0)); + } + + // Fire update to subscribers: + this.#propertyStructure.next(_propertyStructure); + }, + '_observePropertyStructureOfGroup' + groupId + ); + } + + /** Manipulate methods: */ + + async addProperty(ownerKey?: string, sortOrder?: number) { + if (!this.#workspaceContext) return; + + return await this.#workspaceContext.structure.createProperty(null, ownerKey, sortOrder); + } + + // Takes optional arguments as this is easier for the implementation in the view: + async partialUpdateProperty(propertyKey?: string, partialUpdate?: Partial) { + if (!this.#workspaceContext || !propertyKey || !partialUpdate) return; + + return await this.#workspaceContext.structure.updateProperty(null, propertyKey, partialUpdate); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/workspace-property-structure-manager.class.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/workspace-property-structure-manager.class.ts deleted file mode 100644 index df36f1db8c..0000000000 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/workspace-property-structure-manager.class.ts +++ /dev/null @@ -1,200 +0,0 @@ -import { UmbDocumentTypeRepository } from '../../../../documents/document-types/repository/document-type.repository'; -import { - DocumentTypeResponseModel, - DocumentTypePropertyTypeResponseModel, - PropertyTypeContainerResponseModelBaseModel, - ContentTypeResponseModelBaseDocumentTypePropertyTypeResponseModelDocumentTypePropertyTypeContainerResponseModel, -} from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostElement, UmbControllerInterface } from '@umbraco-cms/backoffice/controller'; -import { ArrayState, UmbObserverController, MappingFunction } from '@umbraco-cms/backoffice/observable-api'; - -export type PropertyContainerTypes = 'Group' | 'Tab'; - -// TODO: get this type from the repository, or use some generic type. -type T = DocumentTypeResponseModel; - -// TODO: make general interface for NodeTypeRepository, to replace UmbDocumentTypeRepository: -export class UmbWorkspacePropertyStructureManager { - #host: UmbControllerHostElement; - - #documentTypeRepository: R; - - #rootDocumentTypeKey?: string; - #documentTypeObservers = new Array(); - #documentTypes = new ArrayState([], (x) => x.key); - - #containers = new ArrayState([], (x) => x.key); - - constructor(host: UmbControllerHostElement, typeRepository: R) { - this.#host = host; - this.#documentTypeRepository = typeRepository; - } - - /** - * loadType will load the node type and all inherited and composed types. - * This will give us all the structure for properties and containers. - */ - public async loadType(key?: string) { - this._reset(); - - this.#rootDocumentTypeKey = key; - - return await this._loadType(key); - } - - public async createScaffold(parentKey: string) { - this._reset(); - - if (!parentKey) return {}; - - const { data } = await this.#documentTypeRepository.createScaffold(parentKey); - if (!data) return {}; - - this.#rootDocumentTypeKey = data.key; - - await this._observeDocumentType(data); - return { data }; - } - - private async _loadType(key?: string) { - if (!key) return {}; - - const { data } = await this.#documentTypeRepository.requestByKey(key); - if (!data) return {}; - - await this._observeDocumentType(data); - return { data }; - } - - public async _observeDocumentType( - data: ContentTypeResponseModelBaseDocumentTypePropertyTypeResponseModelDocumentTypePropertyTypeContainerResponseModel - ) { - if (!data.key) return; - - // Load inherited and composed types: - this._loadDocumentTypeCompositions(data); - - this.#documentTypeObservers.push( - new UmbObserverController(this.#host, await this.#documentTypeRepository.byKey(data.key), (docType) => { - if (docType) { - this.#documentTypes.appendOne(docType); - this._initDocumentTypeContainers(docType); - this._loadDocumentTypeCompositions(docType); - } - }) - ); - } - - private async _loadDocumentTypeCompositions(documentType: T) { - documentType.compositions?.forEach((composition) => { - this._loadType(composition.key); - }); - } - - private async _initDocumentTypeContainers(documentType: T) { - documentType.containers?.forEach((container) => { - this.#containers.appendOne(container); - }); - } - - /** Public methods for consuming structure: */ - - rootDocumentType() { - return this.#documentTypes.getObservablePart((x) => x.find((y) => y.key === this.#rootDocumentTypeKey)); - } - getRootDocumentType() { - return this.#documentTypes.getValue().find((y) => y.key === this.#rootDocumentTypeKey); - } - updateRootDocumentType(entry: T) { - return this.#documentTypes.updateOne(this.#rootDocumentTypeKey, entry); - } - - /* - rootDocumentTypeName() { - return this.#documentTypes.getObservablePart((docTypes) => { - const docType = docTypes.find((x) => x.key === this.#rootDocumentTypeKey); - return docType?.name ?? ''; - }); - } - */ - - rootDocumentTypeObservablePart(mappingFunction: MappingFunction) { - return this.#documentTypes.getObservablePart((docTypes) => { - const docType = docTypes.find((x) => x.key === this.#rootDocumentTypeKey); - return docType ? mappingFunction(docType) : undefined; - }); - } - /* - nameOfDocumentType(key: string) { - return this.#documentTypes.getObservablePart((docTypes) => { - const docType = docTypes.find((x) => x.key === key); - return docType?.name ?? ''; - }); - } - */ - - hasPropertyStructuresOf(containerKey: string | null) { - return this.#documentTypes.getObservablePart((docTypes) => { - return ( - docTypes.find((docType) => { - return docType.properties?.find((property) => property.containerKey === containerKey); - }) !== undefined - ); - }); - } - rootPropertyStructures() { - return this.propertyStructuresOf(null); - } - propertyStructuresOf(containerKey: string | null) { - return this.#documentTypes.getObservablePart((docTypes) => { - const props: DocumentTypePropertyTypeResponseModel[] = []; - docTypes.forEach((docType) => { - docType.properties?.forEach((property) => { - if (property.containerKey === containerKey) { - props.push(property); - } - }); - }); - return props; - }); - } - - rootContainers(containerType: PropertyContainerTypes) { - return this.#containers.getObservablePart((data) => { - return data.filter((x) => x.parentKey === null && x.type === containerType); - }); - } - - hasRootContainers(containerType: PropertyContainerTypes) { - return this.#containers.getObservablePart((data) => { - return data.filter((x) => x.parentKey === null && x.type === containerType).length > 0; - }); - } - - containersOfParentKey( - parentKey: PropertyTypeContainerResponseModelBaseModel['parentKey'], - containerType: PropertyContainerTypes - ) { - return this.#containers.getObservablePart((data) => { - return data.filter((x) => x.parentKey === parentKey && x.type === containerType); - }); - } - - containersByNameAndType(name: string, containerType: PropertyContainerTypes) { - return this.#containers.getObservablePart((data) => { - return data.filter((x) => x.name === name && x.type === containerType); - }); - } - - private _reset() { - this.#documentTypeObservers.forEach((observer) => observer.destroy()); - this.#documentTypeObservers = []; - this.#documentTypes.next([]); - this.#containers.next([]); - } - public destroy() { - this._reset(); - this.#documentTypes.complete(); - this.#containers.complete(); - } -} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/workspace-structure-manager.class.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/workspace-structure-manager.class.ts new file mode 100644 index 0000000000..8a7b24dc23 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/workspace-structure-manager.class.ts @@ -0,0 +1,310 @@ +import { UmbDocumentTypeRepository } from '../../../../documents/document-types/repository/document-type.repository'; +import { generateGuid } from '@umbraco-cms/backoffice/utils'; +import { + DocumentTypeResponseModel, + DocumentTypePropertyTypeResponseModel, + PropertyTypeContainerResponseModelBaseModel, + ContentTypeResponseModelBaseDocumentTypePropertyTypeResponseModelDocumentTypePropertyTypeContainerResponseModel, + PropertyTypeResponseModelBaseModel, +} from '@umbraco-cms/backoffice/backend-api'; +import { UmbControllerHostElement, UmbControllerInterface } from '@umbraco-cms/backoffice/controller'; +import { + ArrayState, + UmbObserverController, + MappingFunction, + partialUpdateFrozenArray, +} from '@umbraco-cms/backoffice/observable-api'; + +export type PropertyContainerTypes = 'Group' | 'Tab'; + +// TODO: get this type from the repository, or use some generic type. +type T = DocumentTypeResponseModel; + +// TODO: make general interface for NodeTypeRepository, to replace UmbDocumentTypeRepository: +export class UmbWorkspacePropertyStructureManager { + #host: UmbControllerHostElement; + #init!: Promise; + + #documentTypeRepository: R; + + #rootDocumentTypeKey?: string; + #documentTypeObservers = new Array(); + #documentTypes = new ArrayState([], (x) => x.id); + readonly documentTypes = this.#documentTypes.asObservable(); + private readonly _documentTypeContainers = this.#documentTypes.getObservablePart((x) => + x.flatMap((x) => x.containers ?? []) + ); + + #containers = new ArrayState([], (x) => x.id); + + constructor(host: UmbControllerHostElement, typeRepository: R) { + this.#host = host; + this.#documentTypeRepository = typeRepository; + + new UmbObserverController(host, this.documentTypes, (documentTypes) => { + documentTypes.forEach((documentType) => { + // We could cache by docType Key? + // TODO: how do we ensure a container goes away? + + //this._initDocumentTypeContainers(documentType); + this._loadDocumentTypeCompositions(documentType); + }); + }); + new UmbObserverController(host, this._documentTypeContainers, (documentTypeContainers) => { + this.#containers.next(documentTypeContainers); + }); + } + + /** + * loadType will load the node type and all inherited and composed types. + * This will give us all the structure for properties and containers. + */ + public async loadType(id?: string) { + this._reset(); + + this.#rootDocumentTypeKey = id; + + const promiseResult = this._loadType(id); + this.#init = promiseResult; + await this.#init; + return promiseResult; + } + + public async createScaffold(parentId: string) { + this._reset(); + + if (!parentId) return {}; + + const { data } = await this.#documentTypeRepository.createScaffold(parentId); + if (!data) return {}; + + this.#rootDocumentTypeKey = data.id; + + this.#init = this._observeDocumentType(data); + await this.#init; + return { data }; + } + + private async _ensureType(id?: string) { + if (!id) return; + if (this.#documentTypes.getValue().find((x) => x.id === id)) return; + await this._loadType(id); + } + + private async _loadType(id?: string) { + if (!id) return {}; + + const { data } = await this.#documentTypeRepository.requestById(id); + if (!data) return {}; + + await this._observeDocumentType(data); + return { data }; + } + + public async _observeDocumentType( + data: ContentTypeResponseModelBaseDocumentTypePropertyTypeResponseModelDocumentTypePropertyTypeContainerResponseModel + ) { + if (!data.id) return; + + // Load inherited and composed types: + this._loadDocumentTypeCompositions(data); + + this.#documentTypeObservers.push( + new UmbObserverController(this.#host, await this.#documentTypeRepository.byId(data.id), (docType) => { + if (docType) { + // TODO: Handle if there was changes made to the specific document type in this context. + /* + possible easy solutions could be to notify user wether they want to update(Discard the changes to accept the new ones). + */ + this.#documentTypes.appendOne(docType); + } + }) + ); + } + + private async _loadDocumentTypeCompositions(documentType: T) { + documentType.compositions?.forEach((composition) => { + this._ensureType(composition.id); + }); + } + + /* + private async _initDocumentTypeContainers(documentType: T) { + documentType.containers?.forEach((container) => { + this.#containers.appendOne({ ...container, _ownerDocumentTypeKey: documentType.id }); + }); + } + */ + + /** Public methods for consuming structure: */ + + rootDocumentType() { + return this.#documentTypes.getObservablePart((x) => x.find((y) => y.id === this.#rootDocumentTypeKey)); + } + getRootDocumentType() { + return this.#documentTypes.getValue().find((y) => y.id === this.#rootDocumentTypeKey); + } + updateRootDocumentType(entry: T) { + this.#documentTypes.updateOne(this.#rootDocumentTypeKey, entry); + } + + // We could move the actions to another class? + + async createContainer( + documentTypeKey: string | null, + parentId: string | null = null, + type: PropertyContainerTypes = 'Group', + sortOrder?: number + ) { + await this.#init; + documentTypeKey = documentTypeKey ?? this.#rootDocumentTypeKey!; + + const container: PropertyTypeContainerResponseModelBaseModel = { + id: generateGuid(), + parentId: parentId, + name: 'New', + type: type, + sortOrder: sortOrder ?? 0, + }; + + const containers = [...(this.#documentTypes.getValue().find((x) => x.id === documentTypeKey)?.containers ?? [])]; + containers.push(container); + + this.#documentTypes.updateOne(documentTypeKey, { containers }); + + return container; + } + + async removeContainer(documentTypeKey: string | null, containerId: string | null = null) { + await this.#init; + documentTypeKey = documentTypeKey ?? this.#rootDocumentTypeKey!; + + const frozenContainers = this.#documentTypes.getValue().find((x) => x.id === documentTypeKey)?.containers ?? []; + const containers = frozenContainers.filter((x) => x.id !== containerId); + + this.#documentTypes.updateOne(documentTypeKey, { containers }); + } + + async createProperty(documentTypeKey: string | null, containerId: string | null = null, sortOrder?: number) { + await this.#init; + documentTypeKey = documentTypeKey ?? this.#rootDocumentTypeKey!; + + const property: PropertyTypeResponseModelBaseModel = { + id: generateGuid(), + containerId: containerId, + //sortOrder: sortOrder ?? 0, + }; + + const properties = [...(this.#documentTypes.getValue().find((x) => x.id === documentTypeKey)?.properties ?? [])]; + properties.push(property); + + this.#documentTypes.updateOne(documentTypeKey, { properties }); + + return property; + } + + async updateProperty( + documentTypeKey: string | null, + propertyKey: string, + partialUpdate: Partial + ) { + await this.#init; + documentTypeKey = documentTypeKey ?? this.#rootDocumentTypeKey!; + + const frozenProperties = this.#documentTypes.getValue().find((x) => x.id === documentTypeKey)?.properties ?? []; + + const properties = partialUpdateFrozenArray(frozenProperties, partialUpdate, (x) => x.id === propertyKey!); + + this.#documentTypes.updateOne(documentTypeKey, { properties }); + } + + /* + rootDocumentTypeName() { + return this.#documentTypes.getObservablePart((docTypes) => { + const docType = docTypes.find((x) => x.id === this.#rootDocumentTypeKey); + return docType?.name ?? ''; + }); + } + */ + + rootDocumentTypeObservablePart(mappingFunction: MappingFunction) { + return this.#documentTypes.getObservablePart((docTypes) => { + const docType = docTypes.find((x) => x.id === this.#rootDocumentTypeKey); + return docType ? mappingFunction(docType) : undefined; + }); + } + /* + nameOfDocumentType(id: string) { + return this.#documentTypes.getObservablePart((docTypes) => { + const docType = docTypes.find((x) => x.id === id); + return docType?.name ?? ''; + }); + } + */ + + hasPropertyStructuresOf(containerId: string | null) { + return this.#documentTypes.getObservablePart((docTypes) => { + return ( + docTypes.find((docType) => { + return docType.properties?.find((property) => property.containerId === containerId); + }) !== undefined + ); + }); + } + rootPropertyStructures() { + return this.propertyStructuresOf(null); + } + propertyStructuresOf(containerId: string | null) { + return this.#documentTypes.getObservablePart((docTypes) => { + const props: DocumentTypePropertyTypeResponseModel[] = []; + docTypes.forEach((docType) => { + docType.properties?.forEach((property) => { + if (property.containerId === containerId) { + props.push(property); + } + }); + }); + return props; + }); + } + + rootContainers(containerType: PropertyContainerTypes) { + return this.#containers.getObservablePart((data) => { + return data.filter((x) => x.parentId === null && x.type === containerType); + }); + } + + hasRootContainers(containerType: PropertyContainerTypes) { + return this.#containers.getObservablePart((data) => { + return data.filter((x) => x.parentId === null && x.type === containerType).length > 0; + }); + } + + containersOfParentKey( + parentId: PropertyTypeContainerResponseModelBaseModel['parentId'], + containerType: PropertyContainerTypes + ) { + return this.#containers.getObservablePart((data) => { + return data.filter((x) => x.parentId === parentId && x.type === containerType); + }); + } + + // TODO: Maybe this must take parentId into account as well? + containersByNameAndType(name: string, containerType: PropertyContainerTypes) { + return this.#containers.getObservablePart((data) => { + return data.filter((x) => x.name === name && x.type === containerType); + }); + } + + private _reset() { + this.#documentTypeObservers.forEach((observer) => observer.destroy()); + this.#documentTypeObservers = []; + this.#documentTypes.next([]); + this.#containers.next([]); + } + public destroy() { + this._reset(); + this.#documentTypes.complete(); + this.#containers.complete(); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-layout/workspace-layout.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-layout/workspace-layout.element.ts index b41fd563ea..2e635d9114 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-layout/workspace-layout.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-layout/workspace-layout.element.ts @@ -4,7 +4,8 @@ import { customElement, property, state } from 'lit/decorators.js'; import { map } from 'rxjs'; import { repeat } from 'lit/directives/repeat.js'; -import type { UmbRouterSlotInitEvent, UmbRouterSlotChangeEvent, IRoutingInfo } from '@umbraco-cms/internal/router'; +import type { IRoute } from '@umbraco-cms/backoffice/router'; +import type { UmbRouterSlotInitEvent, UmbRouterSlotChangeEvent } from '@umbraco-cms/internal/router'; import { createExtensionElement, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extensions-api'; import type { ManifestWorkspaceView, @@ -19,6 +20,7 @@ import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; * @element umb-workspace-layout * @description * @slot icon - Slot for icon + * @slot header - Slot for workspace header * @slot name - Slot for name * @slot footer - Slot for workspace footer * @slot actions - Slot for workspace footer actions @@ -96,7 +98,7 @@ export class UmbWorkspaceLayoutElement extends UmbLitElement { private _workspaceViews: Array = []; @state() - private _routes?: any[]; + private _routes?: IRoute[]; @state() private _routerPath?: string; @@ -129,16 +131,21 @@ export class UmbWorkspaceLayoutElement extends UmbLitElement { if (view.type === 'workspaceViewCollection') { return import( '../../../../shared/components/workspace/workspace-content/views/collection/workspace-view-collection.element' - ); + ) as unknown as Promise; } return createExtensionElement(view); }, - setup: (component: Promise | HTMLElement, info: IRoutingInfo) => { - // When its using import, we get an element, when using createExtensionElement we get a Promise. - if ((component as any).then) { - (component as any).then((el: any) => (el.manifest = view)); + setup: (component, info) => { + if (component && 'manifest' in component) { + component.manifest = view; } else { - (component as any).manifest = view; + /* + TODO: Too noisy for my taste, so I would investigate if there is otherwise to make this more visible. + console.group(`[UmbWorkspaceLayout] Failed to setup component for route: ${info.match.route.path}`); + console.log('Matched route', info.match.route); + console.error('Missing property "manifest" on component', component); + console.groupEnd(); + */ } }, }; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-property-layout/workspace-property-layout.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-property-layout/workspace-property-layout.element.ts index 96cedd6512..0363bb948b 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-property-layout/workspace-property-layout.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-property-layout/workspace-property-layout.element.ts @@ -11,49 +11,6 @@ import { customElement, property } from 'lit/decorators.js'; */ @customElement('umb-workspace-property-layout') export class UmbWorkspacePropertyLayoutElement extends LitElement { - static styles = [ - UUITextStyles, - css` - :host { - display: grid; - grid-template-columns: 200px auto; - column-gap: var(--uui-size-layout-2); - border-bottom: 1px solid var(--uui-color-divider); - padding: var(--uui-size-layout-1) 0; - container-type: inline-size; - } - - :host > div { - grid-column: span 2; - } - - @container (width > 600px) { - :host(:not([orientation='vertical'])) > div { - grid-column: span 1; - } - } - - :host(:last-of-type) { - border-bottom: none; - } - - :host-context(umb-variantable-property:first-of-type) { - padding-top: 0; - } - - p { - margin-bottom: 0; - } - - #header { - position: sticky; - top: var(--uui-size-space-4); - height: min-content; - z-index: 2; - } - `, - ]; - /** * Alias. The technical name of the property. * @type {string} @@ -107,6 +64,49 @@ export class UmbWorkspacePropertyLayoutElement extends LitElement { `; } + + static styles = [ + UUITextStyles, + css` + :host { + display: grid; + grid-template-columns: 200px auto; + column-gap: var(--uui-size-layout-2); + border-bottom: 1px solid var(--uui-color-divider); + padding: var(--uui-size-layout-1) 0; + container-type: inline-size; + } + + :host > div { + grid-column: span 2; + } + + @container (width > 600px) { + :host(:not([orientation='vertical'])) > div { + grid-column: span 1; + } + } + + :host(:last-of-type) { + border-bottom: none; + } + + :host-context(umb-variantable-property:first-of-type) { + padding-top: 0; + } + + p { + margin-bottom: 0; + } + + #header { + position: sticky; + top: var(--uui-size-space-4); + height: min-content; + z-index: 2; + } + `, + ]; } declare global { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/template/template-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/template/template-modal.element.ts index 1ad00017e4..f1771e6a34 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/template/template-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/template/template-modal.element.ts @@ -15,7 +15,7 @@ import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @customElement('umb-template-modal') export class UmbTemplateModalElement extends UmbModalBaseElement { @state() - _key = ''; + _id = ''; @state() _template?: TemplateResponseModel; @@ -26,16 +26,16 @@ export class UmbTemplateModalElement extends UmbModalBaseElement { return import('./property-editor-ui-block-grid-inner-test.element'); }, - setup: (component: Promise | HTMLElement, info: IRoutingInfo) => { + setup: (component, info) => { console.log('block route inner', info); if (component instanceof HTMLElement) { (component as any).name = 'inner-1'; @@ -41,7 +41,7 @@ export class UmbPropertyEditorUIBlockGridInnerTestElement extends UmbLitElement component: () => { return import('./property-editor-ui-block-grid-inner-test.element'); }, - setup: (component: Promise | HTMLElement, info: IRoutingInfo) => { + setup: (component, info) => { console.log('block route inner', info); if (component instanceof HTMLElement) { (component as any).name = 'inner-2'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/block-grid/property-editor-ui-block-grid.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/block-grid/property-editor-ui-block-grid.element.ts index 8939911174..774bdc20b0 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/block-grid/property-editor-ui-block-grid.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/block-grid/property-editor-ui-block-grid.element.ts @@ -1,11 +1,11 @@ import { html } from 'lit'; import { customElement, property, state } from 'lit/decorators.js'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; -import { IRoute, IRoutingInfo } from 'router-slot'; import { UmbVariantId } from '../../../../shared/variants/variant-id.class'; import { UMB_WORKSPACE_VARIANT_CONTEXT_TOKEN } from '../../../../shared/components/workspace/workspace-variant/workspace-variant.context'; import { UMB_WORKSPACE_PROPERTY_CONTEXT_TOKEN } from '../../../../shared/components/workspace-property/workspace-property.context'; -import { UmbRouterSlotChangeEvent, UmbRouterSlotInitEvent } from '@umbraco-cms/internal/router'; +import type { IRoute } from '@umbraco-cms/backoffice/router'; +import type { UmbRouterSlotChangeEvent, UmbRouterSlotInitEvent } from '@umbraco-cms/internal/router'; import { UmbPropertyEditorElement } from '@umbraco-cms/backoffice/property-editor'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @@ -56,7 +56,7 @@ export class UmbPropertyEditorUIBlockGridElement extends UmbLitElement implement component: () => { return import('./property-editor-ui-block-grid-inner-test.element'); }, - setup: (component: Promise | HTMLElement, info: IRoutingInfo) => { + setup: (component, info) => { console.log('block route', info); if (component instanceof HTMLElement) { (component as any).name = 'block-grid-1'; @@ -69,7 +69,7 @@ export class UmbPropertyEditorUIBlockGridElement extends UmbLitElement implement component: () => { return import('./property-editor-ui-block-grid-inner-test.element'); }, - setup: (component: Promise | HTMLElement, info: IRoutingInfo) => { + setup: (component, info) => { console.log('block route', info); if (component instanceof HTMLElement) { (component as any).name = 'block-grid-2'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/checkbox-list/property-editor-ui-checkbox-list.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/checkbox-list/property-editor-ui-checkbox-list.element.ts index 4d2ab5e342..b161988d4d 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/checkbox-list/property-editor-ui-checkbox-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/checkbox-list/property-editor-ui-checkbox-list.element.ts @@ -54,7 +54,7 @@ export class UmbPropertyEditorUICheckboxListElement extends UmbLitElement implem render() { return html``; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/document-picker/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/document-picker/manifests.ts index 8a3e5d81df..2a8e59cc62 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/document-picker/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/document-picker/manifests.ts @@ -28,7 +28,7 @@ export const manifest: ManifestPropertyEditorUI = { alias: 'ignoreUserStartNodes', label: 'Ignore User Start Nodes', description: 'Selecting this option allows a user to choose nodes that they normally dont have access to', - propertyEditorUI: 'Umb.PropertyEditorUI.Boolean', + propertyEditorUI: 'Umb.PropertyEditorUI.Toggle', }, ], }, diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/document-picker/property-editor-ui-document-picker.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/document-picker/property-editor-ui-document-picker.element.ts index 5d44e40a4b..d2e02efa43 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/document-picker/property-editor-ui-document-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/document-picker/property-editor-ui-document-picker.element.ts @@ -32,7 +32,7 @@ export class UmbPropertyEditorUIContentPickerElement extends UmbLitElement imple private _limitMax?: number; private _onChange(event: CustomEvent) { - this.value = (event.target as UmbInputDocumentPickerElement).selectedKeys; + this.value = (event.target as UmbInputDocumentPickerElement).selectedIds; this.dispatchEvent(new CustomEvent('property-value-change')); } @@ -41,7 +41,7 @@ export class UmbPropertyEditorUIContentPickerElement extends UmbLitElement imple return html` AddAdd) { + const fileExtensions = config.find((x) => x.alias === 'fileExtensions'); + if (fileExtensions) this._fileExtensions = fileExtensions.value; + + const multiple = config.find((x) => x.alias === 'multiple'); + if (multiple) this._multiple = multiple.value; + } + + @state() + private _fileExtensions?: Array; + + @state() + private _multiple?: boolean; + + private _onChange(event: CustomEvent) { + this.value = (event.target as unknown as UmbInputUploadFieldElement).value as string; + this.dispatchEvent(new CustomEvent('property-value-change')); + } render() { - return html`
    umb-property-editor-ui-upload-field
    `; + return html``; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/repository/sources/stylesheet.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/repository/sources/stylesheet.server.data.ts index 1e29622343..6ce1917236 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/repository/sources/stylesheet.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/repository/sources/stylesheet.server.data.ts @@ -19,7 +19,7 @@ export class UmbStylesheetServerDataSource implements UmbDataSource> { + createScaffold(parentId: string | null): Promise> { throw new Error('Method not implemented.'); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/repository/sources/stylesheet.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/repository/sources/stylesheet.tree.server.data.ts index 1618d1ee59..5b7674f6df 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/repository/sources/stylesheet.tree.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/repository/sources/stylesheet.tree.server.data.ts @@ -60,7 +60,7 @@ export class UmbStylesheetTreeServerDataSource async getItems(path: Array) { return tryExecuteAndNotify( this.#host, - StylesheetResource.getTreeStylesheetItem({ + StylesheetResource.getStylesheetItem({ path, }) ); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/workspace/stylesheet-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/workspace/stylesheet-workspace.context.ts index 4eb287b166..a973a00a4b 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/workspace/stylesheet-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/workspace/stylesheet-workspace.context.ts @@ -20,7 +20,7 @@ export class UmbStylesheetWorkspaceContext extends UmbWorkspaceContext this.#element, - setup: (component: HTMLElement, info: IRoutingInfo) => { + setup: (_component, info) => { const path = info.match.params.path; const serverPath = serverFilePathFromUrlFriendlyPath(path); this.#workspaceContext.load(serverPath); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/sources/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/sources/index.ts index b30af84dcf..934e2e05ed 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/sources/index.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/sources/index.ts @@ -1,11 +1,8 @@ import type { DataSourceResponse } from '@umbraco-cms/backoffice/repository'; -import type { - EntityTreeItemResponseModel, - PagedEntityTreeItemResponseModel, -} from '@umbraco-cms/backoffice/backend-api'; +import type { ItemResponseModelBaseModel, PagedEntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; export interface TemplateTreeDataSource { getRootItems(): Promise>; - getChildrenOf(parentKey: string): Promise>; - getItems(key: Array): Promise>; + getChildrenOf(parentId: string): Promise>; + getItems(ids: Array): Promise>; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/sources/template.detail.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/sources/template.detail.server.data.ts index 7705f1ac6d..5fdffe4c7e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/sources/template.detail.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/sources/template.detail.server.data.ts @@ -1,16 +1,13 @@ import { v4 as uuid } from 'uuid'; -import { ProblemDetailsModel, TemplateResponseModel, TemplateResource } from '@umbraco-cms/backoffice/backend-api'; +import { + TemplateResponseModel, + TemplateResource, + CreateTemplateRequestModel, + UpdateTemplateRequestModel, +} from '@umbraco-cms/backoffice/backend-api'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; -import type { DataSourceResponse } from '@umbraco-cms/backoffice/repository'; - -export interface TemplateDetailDataSource { - createScaffold(): Promise>; - get(key: string): Promise>; - insert(template: TemplateResponseModel): Promise; - update(template: TemplateResponseModel): Promise; - delete(key: string): Promise; -} +import type { UmbDataSource } from '@umbraco-cms/backoffice/repository'; /** * A data source for the Template detail that fetches data from the server @@ -18,7 +15,9 @@ export interface TemplateDetailDataSource { * @class UmbTemplateDetailServerDataSource * @implements {TemplateDetailDataSource} */ -export class UmbTemplateDetailServerDataSource implements TemplateDetailDataSource { +export class UmbTemplateDetailServerDataSource + implements UmbDataSource +{ #host: UmbControllerHostElement; /** @@ -31,18 +30,18 @@ export class UmbTemplateDetailServerDataSource implements TemplateDetailDataSour } /** - * Fetches a Template with the given key from the server - * @param {string} key + * Fetches a Template with the given id from the server + * @param {string} id * @return {*} * @memberof UmbTemplateDetailServerDataSource */ - get(key: string) { - return tryExecuteAndNotify(this.#host, TemplateResource.getTemplateByKey({ key })); + get(id: string) { + return tryExecuteAndNotify(this.#host, TemplateResource.getTemplateById({ id })); } /** * Creates a new Template scaffold - * @param {(string | null)} parentKey + * @param {(string | null)} parentId * @return {*} * @memberof UmbTemplateDetailServerDataSource */ @@ -50,7 +49,7 @@ export class UmbTemplateDetailServerDataSource implements TemplateDetailDataSour const error = undefined; const data: TemplateResponseModel = { $type: '', - key: uuid(), + id: uuid(), name: '', alias: '', content: '', @@ -77,13 +76,13 @@ export class UmbTemplateDetailServerDataSource implements TemplateDetailDataSour * @return {*} * @memberof UmbTemplateDetailServerDataSource */ - async insert(template: TemplateResponseModel) { - const payload = { requestBody: template }; - // TODO: fix type mismatch + async insert(template: CreateTemplateRequestModel) { + if (!template) throw new Error('Template is missing'); + return tryExecuteAndNotify( this.#host, - tryExecuteAndNotify(this.#host, TemplateResource.postTemplate(payload)) as any - ) as any; + tryExecuteAndNotify(this.#host, TemplateResource.postTemplate({ requestBody: template })) + ); } /** @@ -92,28 +91,20 @@ export class UmbTemplateDetailServerDataSource implements TemplateDetailDataSour * @return {*} * @memberof UmbTemplateDetailServerDataSource */ - async update(template: TemplateResponseModel) { - if (!template.key) { - const error: ProblemDetailsModel = { title: 'Template key is missing' }; - return { error }; - } - - const payload = { key: template.key, requestBody: template }; - return tryExecuteAndNotify(this.#host, TemplateResource.putTemplateByKey(payload)); + async update(id: string, template: UpdateTemplateRequestModel) { + if (!id) throw new Error('Id is missing'); + if (!template) throw new Error('Template is missing'); + return tryExecuteAndNotify(this.#host, TemplateResource.putTemplateById({ id, requestBody: template })); } /** * Deletes a Template on the server - * @param {string} key + * @param {string} id * @return {*} * @memberof UmbTemplateDetailServerDataSource */ - async delete(key: string) { - if (!key) { - const error: ProblemDetailsModel = { title: 'Key is missing' }; - return { error }; - } - - return await tryExecuteAndNotify(this.#host, TemplateResource.deleteTemplateByKey({ key })); + async delete(id: string) { + if (!id) throw new Error('Id is missing'); + return await tryExecuteAndNotify(this.#host, TemplateResource.deleteTemplateById({ id })); } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/sources/template.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/sources/template.tree.server.data.ts index 219e8cc807..ed7be4b8d9 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/sources/template.tree.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/sources/template.tree.server.data.ts @@ -31,41 +31,41 @@ export class TemplateTreeServerDataSource implements TemplateTreeDataSource { } /** - * Fetches the children of a given parent key from the server - * @param {(string | null)} parentKey + * Fetches the children of a given parent id from the server + * @param {(string | null)} parentId * @return {*} * @memberof TemplateTreeServerDataSource */ - async getChildrenOf(parentKey: string | null) { - if (!parentKey) { - const error: ProblemDetailsModel = { title: 'Parent key is missing' }; + async getChildrenOf(parentId: string | null) { + if (!parentId) { + const error: ProblemDetailsModel = { title: 'Parent id is missing' }; return { error }; } return tryExecuteAndNotify( this.#host, TemplateResource.getTreeTemplateChildren({ - parentKey, + parentId, }) ); } /** - * Fetches the items for the given keys from the server - * @param {Array} keys + * Fetches the items for the given ids from the server + * @param {Array} id * @return {*} * @memberof TemplateTreeServerDataSource */ - async getItems(keys: Array) { - if (!keys) { - const error: ProblemDetailsModel = { title: 'Keys are missing' }; + async getItems(ids: Array) { + if (!ids) { + const error: ProblemDetailsModel = { title: 'Ids are missing' }; return { error }; } return tryExecuteAndNotify( this.#host, - TemplateResource.getTreeTemplateItem({ - key: keys, + TemplateResource.getTemplateItem({ + id: ids, }) ); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/template.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/template.repository.ts index 5567f76759..0ec0c4baa7 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/template.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/template.repository.ts @@ -6,9 +6,18 @@ import type { UmbDetailRepository, UmbTreeRepository } from '@umbraco-cms/backof import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; -import { ProblemDetailsModel, TemplateResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import { + CreateTemplateRequestModel, + ProblemDetailsModel, + TemplateResponseModel, + UpdateTemplateRequestModel, +} from '@umbraco-cms/backoffice/backend-api'; -export class UmbTemplateRepository implements UmbTreeRepository, UmbDetailRepository { +export class UmbTemplateRepository + implements + UmbTreeRepository, + UmbDetailRepository +{ #init; #host: UmbControllerHostElement; @@ -56,34 +65,34 @@ export class UmbTemplateRepository implements UmbTreeRepository, UmbDetailR return { data, error, asObservable: () => this.#treeStore!.rootItems }; } - async requestTreeItemsOf(parentKey: string | null) { + async requestTreeItemsOf(parentId: string | null) { await this.#init; - if (!parentKey) { - const error: ProblemDetailsModel = { title: 'Parent key is missing' }; + if (!parentId) { + const error: ProblemDetailsModel = { title: 'Parent id is missing' }; return { data: undefined, error }; } - const { data, error } = await this.#treeDataSource.getChildrenOf(parentKey); + const { data, error } = await this.#treeDataSource.getChildrenOf(parentId); if (data) { this.#treeStore?.appendItems(data.items); } - return { data, error, asObservable: () => this.#treeStore!.childrenOf(parentKey) }; + return { data, error, asObservable: () => this.#treeStore!.childrenOf(parentId) }; } - async requestTreeItems(keys: Array) { + async requestTreeItems(ids: Array) { await this.#init; - if (!keys) { + if (!ids) { const error: ProblemDetailsModel = { title: 'Keys are missing' }; return { data: undefined, error }; } - const { data, error } = await this.#treeDataSource.getItems(keys); + const { data, error } = await this.#treeDataSource.getItems(ids); - return { data, error, asObservable: () => this.#treeStore!.items(keys) }; + return { data, error, asObservable: () => this.#treeStore!.items(ids) }; } async rootTreeItems() { @@ -91,39 +100,39 @@ export class UmbTemplateRepository implements UmbTreeRepository, UmbDetailR return this.#treeStore!.rootItems; } - async treeItemsOf(parentKey: string | null) { + async treeItemsOf(parentId: string | null) { await this.#init; - return this.#treeStore!.childrenOf(parentKey); + return this.#treeStore!.childrenOf(parentId); } - async treeItems(keys: Array) { + async treeItems(ids: Array) { await this.#init; - return this.#treeStore!.items(keys); + return this.#treeStore!.items(ids); } // DETAILS: - async createScaffold(parentKey: string | null) { + async createScaffold(parentId: string | null) { await this.#init; - if (!parentKey) { - throw new Error('Parent key is missing'); + if (!parentId) { + throw new Error('Parent id is missing'); } - // TODO: add parent key to create scaffold + // TODO: add parent id to create scaffold return this.#detailDataSource.createScaffold(); } - async requestByKey(key: string) { + async requestById(id: string) { await this.#init; - // TODO: should we show a notification if the key is missing? + // TODO: should we show a notification if the id is missing? // Investigate what is best for Acceptance testing, cause in that perspective a thrown error might be the best choice? - if (!key) { + if (!id) { const error: ProblemDetailsModel = { title: 'Key is missing' }; return { error }; } - const { data, error } = await this.#detailDataSource.get(key); + const { data, error } = await this.#detailDataSource.get(id); if (data) { this.#store?.append(data); @@ -137,7 +146,7 @@ export class UmbTemplateRepository implements UmbTreeRepository, UmbDetailR async create(template: TemplateResponseModel) { await this.#init; - if (!template || !template.key) { + if (!template || !template.id) { throw new Error('Template is missing'); } @@ -156,40 +165,39 @@ export class UmbTemplateRepository implements UmbTreeRepository, UmbDetailR return { error }; } - async save(template: TemplateResponseModel) { + async save(id: string, template: UpdateTemplateRequestModel) { + if (!id) throw new Error('Id is missing'); + if (!template) throw new Error('Template is missing'); + await this.#init; - if (!template || !template.key) { - throw new Error('Template is missing'); - } - - const { error } = await this.#detailDataSource.update(template); + const { error } = await this.#detailDataSource.update(id, template); if (!error) { const notification = { data: { message: `Template saved` } }; this.#notificationContext?.peek('positive', notification); - } - // TODO: we currently don't use the detail store for anything. - // Consider to look up the data before fetching from the server - // Consider notify a workspace if a template is updated in the store while someone is editing it. - this.#store?.append(template); - this.#treeStore?.updateItem(template.key, { name: template.name }); - // TODO: would be nice to align the stores on methods/methodNames. + // TODO: we currently don't use the detail store for anything. + // Consider to look up the data before fetching from the server + // Consider notify a workspace if a template is updated in the store while someone is editing it. + // TODO: would be nice to align the stores on methods/methodNames. + //this.#store?.append(template); + this.#treeStore?.updateItem(id, template); + } return { error }; } // General: - async delete(key: string) { + async delete(id: string) { await this.#init; - if (!key) { - throw new Error('Template key is missing'); + if (!id) { + throw new Error('Template id is missing'); } - const { error } = await this.#detailDataSource.delete(key); + const { error } = await this.#detailDataSource.delete(id); if (!error) { const notification = { data: { message: `Template deleted` } }; @@ -199,8 +207,8 @@ export class UmbTemplateRepository implements UmbTreeRepository, UmbDetailR // TODO: we currently don't use the detail store for anything. // Consider to look up the data before fetching from the server. // Consider notify a workspace if a template is deleted from the store while someone is editing it. - this.#store?.remove([key]); - this.#treeStore?.removeItem(key); + this.#store?.remove([id]); + this.#treeStore?.removeItem(id); // TODO: would be nice to align the stores on methods/methodNames. return { error }; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/template.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/template.store.ts index bda7548eb7..edebf64d61 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/template.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/template.store.ts @@ -11,7 +11,7 @@ import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controlle * @description - Data Store for Templates */ export class UmbTemplateStore extends UmbStoreBase { - #data = new ArrayState([], (x) => x.key); + #data = new ArrayState([], (x) => x.id); /** * Creates an instance of UmbTemplateStore. diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/workspace/template-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/workspace/template-workspace.context.ts index 8685dbdc5a..d4f7541846 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/workspace/template-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/workspace/template-workspace.context.ts @@ -18,8 +18,8 @@ export class UmbTemplateWorkspaceContext extends UmbWorkspaceContext { - // key is name to allow filtering on the displayed value + // id is set to name to allow filtering on the displayed value const tableItem: UmbTableItem = { - key: dictionary.name ?? '', + id: dictionary.name ?? '', icon: 'umb:book-alt', data: [ { columnAlias: 'name', - value: html` + value: html` ${dictionary.name} `, }, @@ -148,13 +148,14 @@ export class UmbDashboardTranslationDictionaryElement extends UmbLitElement { #filter(e: { target: HTMLInputElement }) { this._tableItemsFiltered = e.target.value - ? this.#tableItems.filter((t) => t.key.includes(e.target.value)) + ? this.#tableItems.filter((t) => t.id.includes(e.target.value)) : this.#tableItems; } async #create() { // TODO: what to do if modal service is not available? if (!this.#modalContext) return; + if (!this.#repo) return; const modalHandler = this.#modalContext?.open(UMB_CREATE_DICTIONARY_MODAL, { unique: null }); @@ -162,10 +163,9 @@ export class UmbDashboardTranslationDictionaryElement extends UmbLitElement { const { name } = await modalHandler.onSubmit(); if (!name) return; - const result = await this.#repo?.create({ $type: '', name, parentKey: null, translations: [], key: '' }); - + const { data } = await this.#repo.createScaffold(null); + console.log(data); // TODO => get location header to route to new item - console.log(result); } render() { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/create/create.action.ts b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/create/create.action.ts index 8f7f3eae7e..34bb2459bf 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/create/create.action.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/create/create.action.ts @@ -34,6 +34,7 @@ export default class UmbCreateDictionaryEntityAction extends UmbEntityActionBase async execute() { // TODO: what to do if modal service is not available? if (!this.#modalContext) return; + if (!this.repository) return; // TODO: how can we get the current entity detail in the modal? Passing the observable // feels a bit hacky. Works, but hacky. @@ -46,15 +47,9 @@ export default class UmbCreateDictionaryEntityAction extends UmbEntityActionBase const { name } = await modalHandler.onSubmit(); if (!name) return; - const result = await this.repository?.create({ - $type: '', - name, - parentKey: this.unique, - translations: [], - key: '', - }); + const { data } = await this.repository.createScaffold(this.unique, name); // TODO => get location header to route to new item - console.log(result); + console.log(data); } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/import/import-dictionary-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/import/import-dictionary-modal.element.ts index 92e2e6f507..f92fc6a94b 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/import/import-dictionary-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/import/import-dictionary-modal.element.ts @@ -6,7 +6,7 @@ import { repeat } from 'lit/directives/repeat.js'; import { UmbTreeElement } from '../../../../shared/components/tree/tree.element'; import { UmbDictionaryRepository } from '../../repository/dictionary.repository'; import { UmbImportDictionaryModalData, UmbImportDictionaryModalResult } from '@umbraco-cms/backoffice/modal'; -import { UploadDictionaryResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import { DictionaryItemResponseModel, ImportDictionaryRequestModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbModalBaseElement } from '@umbraco-cms/internal/modal'; @customElement('umb-import-dictionary-modal') @@ -27,7 +27,7 @@ export class UmbImportDictionaryModalLayout extends UmbModalBaseElement< private _form!: HTMLFormElement; @state() - private _uploadedDictionary?: UploadDictionaryResponseModel; + private _uploadedDictionaryTempId?: string; @state() private _showUploadView = true; @@ -44,11 +44,11 @@ export class UmbImportDictionaryModalLayout extends UmbModalBaseElement< #detailRepo = new UmbDictionaryRepository(this); async #importDictionary() { - if (!this._uploadedDictionary?.fileName) return; + if (!this._uploadedDictionaryTempId) return; this.modalHandler?.submit({ - fileName: this._uploadedDictionary.fileName, - parentKey: this._selection[0], + temporaryFileId: this._uploadedDictionaryTempId, + parentId: this._selection[0], }); } @@ -66,11 +66,21 @@ export class UmbImportDictionaryModalLayout extends UmbModalBaseElement< if (!this._form.checkValidity()) return; const formData = new FormData(this._form); - const { data } = await this.#detailRepo.upload(formData); - this._uploadedDictionary = data; + const uploadData: ImportDictionaryRequestModel = { + temporaryFileId: formData.get('file')?.toString() ?? '', + }; - if (!this._uploadedDictionary) { + // TODO: fix this upload experience. We need to update our form so it gets temporary file id from the server: + const { data } = await this.#detailRepo.upload(uploadData); + + if (!data) return; + + this._uploadedDictionaryTempId = data; + // TODO: We need to find another way to gather the data of the uploaded dictionary, to represent the dictionaryItems? See further below. + //this._uploadedDictionary = data; + + if (!this._uploadedDictionaryTempId) { this._showErrorView = true; this._showImportView = false; return; @@ -113,6 +123,8 @@ export class UmbImportDictionaryModalLayout extends UmbModalBaseElement< /// TODO => Tree view needs isolation and single-select option #renderImportView() { + //TODO: gather this data in some other way, we cannot use the feedback from the server anymore. can we use info about the file directly? or is a change to the end point required? + /* if (!this._uploadedDictionary?.dictionaryItems) return; return html` @@ -140,6 +152,7 @@ export class UmbImportDictionaryModalLayout extends UmbModalBaseElement< look="primary" @click=${this.#importDictionary}> `; + */ } // TODO => Determine what to display when dictionary import/upload fails diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/import/import.action.ts b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/import/import.action.ts index 0ba63c6352..2ab539bca3 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/import/import.action.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/entity-actions/import/import.action.ts @@ -27,10 +27,10 @@ export default class UmbImportDictionaryEntityAction extends UmbEntityActionBase const modalHandler = this.#modalContext?.open(UMB_IMPORT_DICTIONARY_MODAL, { unique: this.unique }); // TODO: get type from modal result - const { fileName, parentKey } = await modalHandler.onSubmit(); - if (!fileName) return; + const { temporaryFileId, parentId } = await modalHandler.onSubmit(); + if (!temporaryFileId) return; - const result = await this.repository?.import(fileName, parentKey); + const result = await this.repository?.import(temporaryFileId, parentId); // TODO => get location header to route to new item console.log(result); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/index.ts deleted file mode 100644 index 8caa4f12a7..0000000000 --- a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { DictionaryItemTranslationModel, EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; - -export interface DictionaryDetails extends EntityTreeItemResponseModel { - key: string; // TODO: Remove this when the backend is fixed - translations: DictionaryItemTranslationModel[]; -} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/dictionary.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/dictionary.repository.ts index 925f993f48..0ce6e7db0f 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/dictionary.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/dictionary.repository.ts @@ -1,4 +1,3 @@ -import type { DictionaryDetails } from '../'; import { UmbDictionaryStore, UMB_DICTIONARY_STORE_CONTEXT_TOKEN } from './dictionary.store'; import { UmbDictionaryDetailServerDataSource } from './sources/dictionary.detail.server.data'; import { UmbDictionaryTreeStore, UMB_DICTIONARY_TREE_STORE_CONTEXT_TOKEN } from './dictionary.tree.store'; @@ -6,10 +5,24 @@ import { DictionaryTreeServerDataSource } from './sources/dictionary.tree.server import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import { UmbTreeDataSource, UmbDetailRepository, UmbTreeRepository } from '@umbraco-cms/backoffice/repository'; -import { ProblemDetailsModel } from '@umbraco-cms/backoffice/backend-api'; +import { + CreateDictionaryItemRequestModel, + DictionaryOverviewResponseModel, + ImportDictionaryRequestModel, + ProblemDetailsModel, + UpdateDictionaryItemRequestModel, +} from '@umbraco-cms/backoffice/backend-api'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; -export class UmbDictionaryRepository implements UmbTreeRepository, UmbDetailRepository { +export class UmbDictionaryRepository + implements + UmbTreeRepository, + UmbDetailRepository< + CreateDictionaryItemRequestModel, + UpdateDictionaryItemRequestModel, + DictionaryOverviewResponseModel + > +{ #init!: Promise; #host: UmbControllerHostElement; @@ -56,34 +69,34 @@ export class UmbDictionaryRepository implements UmbTreeRepository, UmbDetailRepo return { data, error, asObservable: () => this.#treeStore!.rootItems }; } - async requestTreeItemsOf(parentKey: string | null) { + async requestTreeItemsOf(parentId: string | null) { await this.#init; - if (!parentKey) { - const error: ProblemDetailsModel = { title: 'Parent key is missing' }; + if (!parentId) { + const error: ProblemDetailsModel = { title: 'Parent id is missing' }; return { data: undefined, error }; } - const { data, error } = await this.#treeSource.getChildrenOf(parentKey); + const { data, error } = await this.#treeSource.getChildrenOf(parentId); if (data) { this.#treeStore?.appendItems(data.items); } - return { data, error, asObservable: () => this.#treeStore!.childrenOf(parentKey) }; + return { data, error, asObservable: () => this.#treeStore!.childrenOf(parentId) }; } - async requestTreeItems(keys: Array) { + async requestTreeItems(ids: Array) { await this.#init; - if (!keys) { + if (!ids) { const error: ProblemDetailsModel = { title: 'Keys are missing' }; return { data: undefined, error }; } - const { data, error } = await this.#treeSource.getItems(keys); + const { data, error } = await this.#treeSource.getItems(ids); - return { data, error, asObservable: () => this.#treeStore!.items(keys) }; + return { data, error, asObservable: () => this.#treeStore!.items(ids) }; } async rootTreeItems() { @@ -91,39 +104,29 @@ export class UmbDictionaryRepository implements UmbTreeRepository, UmbDetailRepo return this.#treeStore!.rootItems; } - async treeItemsOf(parentKey: string | null) { + async treeItemsOf(parentId: string | null) { await this.#init; - return this.#treeStore!.childrenOf(parentKey); + return this.#treeStore!.childrenOf(parentId); } - async treeItems(keys: Array) { + async treeItems(ids: Array) { await this.#init; - return this.#treeStore!.items(keys); + return this.#treeStore!.items(ids); } // DETAILS - async createScaffold(parentKey: string | null) { + async createScaffold(parentId: string | null, name?: string) { + if (parentId === undefined) throw new Error('Parent id is missing'); await this.#init; - - if (!parentKey) { - const error: ProblemDetailsModel = { title: 'Parent key is missing' }; - return { data: undefined, error }; - } - - return this.#detailSource.createScaffold(parentKey); + return this.#detailSource.createScaffold(parentId, name); } - async requestByKey(key: string) { + async requestById(id: string) { + if (!id) throw new Error('Id is missing'); await this.#init; - // TODO: should we show a notification if the key is missing? - // Investigate what is best for Acceptance testing, cause in that perspective a thrown error might be the best choice? - if (!key) { - const error: ProblemDetailsModel = { title: 'Key is missing' }; - return { error }; - } - const { data, error } = await this.#detailSource.get(key); + const { data, error } = await this.#detailSource.get(id); if (data) { this.#detailStore?.append(data); @@ -136,39 +139,35 @@ export class UmbDictionaryRepository implements UmbTreeRepository, UmbDetailRepo return this.#detailSource.list(skip, take); } - async delete(key: string) { + async delete(id: string) { await this.#init; - return this.#detailSource.delete(key); + return this.#detailSource.delete(id); } - async save(dictionary: DictionaryDetails) { + async save(id: string, updatedDictionary: UpdateDictionaryItemRequestModel) { + if (!id) throw new Error('Id is missing'); + if (!updatedDictionary) throw new Error('Dictionary is missing'); + await this.#init; - // TODO: should we show a notification if the dictionary is missing? - // Investigate what is best for Acceptance testing, cause in that perspective a thrown error might be the best choice? - if (!dictionary || !dictionary.key) { - const error: ProblemDetailsModel = { title: 'Dictionary is missing' }; - return { error }; - } - - const { error } = await this.#detailSource.update(dictionary); + const { error } = await this.#detailSource.update(id, updatedDictionary); if (!error) { - const notification = { data: { message: `Dictionary '${dictionary.name}' saved` } }; + // TODO: we currently don't use the detail store for anything. + // Consider to look up the data before fetching from the server + // Consider notify a workspace if a dictionary is updated in the store while someone is editing it. + // TODO: would be nice to align the stores on methods/methodNames. + //this.#detailStore?.append(dictionary); + this.#treeStore?.updateItem(id, { name: updatedDictionary.name }); + + const notification = { data: { message: `Dictionary '${updatedDictionary.name}' saved` } }; this.#notificationContext?.peek('positive', notification); } - // TODO: we currently don't use the detail store for anything. - // Consider to look up the data before fetching from the server - // Consider notify a workspace if a dictionary is updated in the store while someone is editing it. - this.#detailStore?.append(dictionary); - this.#treeStore?.updateItem(dictionary.key, { name: dictionary.name }); - // TODO: would be nice to align the stores on methods/methodNames. - return { error }; } - async create(detail: DictionaryDetails) { + async create(detail: CreateDictionaryItemRequestModel) { await this.#init; if (!detail.name) { @@ -186,29 +185,29 @@ export class UmbDictionaryRepository implements UmbTreeRepository, UmbDetailRepo return { data, error }; } - async export(key: string, includeChildren = false) { + async export(id: string, includeChildren = false) { await this.#init; - if (!key) { + if (!id) { const error: ProblemDetailsModel = { title: 'Key is missing' }; return { error }; } - return this.#detailSource.export(key, includeChildren); + return this.#detailSource.export(id, includeChildren); } - async import(fileName: string, parentKey?: string) { + async import(temporaryFileId: string, parentId?: string) { await this.#init; - if (!fileName) { + if (!temporaryFileId) { const error: ProblemDetailsModel = { title: 'File is missing' }; return { error }; } - return this.#detailSource.import(fileName, parentKey); + return this.#detailSource.import(temporaryFileId, parentId); } - async upload(formData: FormData) { + async upload(formData: ImportDictionaryRequestModel) { await this.#init; if (!formData) { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/dictionary.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/dictionary.store.ts index 45ec7a5f5f..c4b62e7c82 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/dictionary.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/dictionary.store.ts @@ -1,8 +1,8 @@ -import type { DictionaryDetails } from '../'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbStoreBase } from '@umbraco-cms/backoffice/store'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { ArrayState } from '@umbraco-cms/backoffice/observable-api'; +import { DictionaryItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; /** * @export @@ -11,13 +11,13 @@ import { ArrayState } from '@umbraco-cms/backoffice/observable-api'; * @description - Data Store for Dictionary */ export class UmbDictionaryStore extends UmbStoreBase { - #data = new ArrayState([], (x) => x.key); + #data = new ArrayState([], (x) => x.id); constructor(host: UmbControllerHostElement) { super(host, UMB_DICTIONARY_STORE_CONTEXT_TOKEN.toString()); } - append(dictionary: DictionaryDetails) { + append(dictionary: DictionaryItemResponseModel) { this.#data.append([dictionary]); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/sources/dictionary.detail.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/sources/dictionary.detail.server.data.ts index 109d5a3924..3479db2d77 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/sources/dictionary.detail.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/sources/dictionary.detail.server.data.ts @@ -1,13 +1,16 @@ -import type { DictionaryDetails } from '../../'; -import { DictionaryDetailDataSource } from './dictionary.details.server.data.interface'; +import { v4 as uuidv4 } from 'uuid'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; import { CreateDictionaryItemRequestModel, + DictionaryItemResponseModel, DictionaryResource, + ImportDictionaryRequestModel, LanguageResource, ProblemDetailsModel, + UpdateDictionaryItemRequestModel, } from '@umbraco-cms/backoffice/backend-api'; +import { UmbDataSource } from '@umbraco-cms/backoffice/repository'; /** * @description - A data source for the Dictionary detail that fetches data from the server @@ -15,7 +18,10 @@ import { * @class UmbDictionaryDetailServerDataSource * @implements {DictionaryDetailDataSource} */ -export class UmbDictionaryDetailServerDataSource implements DictionaryDetailDataSource { +export class UmbDictionaryDetailServerDataSource + implements + UmbDataSource +{ #host: UmbControllerHostElement; constructor(host: UmbControllerHostElement) { @@ -24,27 +30,29 @@ export class UmbDictionaryDetailServerDataSource implements DictionaryDetailData /** * @description - Creates a new Dictionary scaffold - * @param {string} parentKey + * @param {string} parentId * @return {*} * @memberof UmbDictionaryDetailServerDataSource */ - async createScaffold(parentKey: string) { - const data: DictionaryDetails = { - name: '', - parentKey, - } as DictionaryDetails; + async createScaffold(parentId?: string | null, name?: string) { + const data = { + id: uuidv4(), + parentId, + name, + translations: [], + }; return { data }; } /** - * @description - Fetches a Dictionary with the given key from the server - * @param {string} key + * @description - Fetches a Dictionary with the given id from the server + * @param {string} id * @return {*} * @memberof UmbDictionaryDetailServerDataSource */ - get(key: string) { - return tryExecuteAndNotify(this.#host, DictionaryResource.getDictionaryByKey({ key })) as any; + get(id: string) { + return tryExecuteAndNotify(this.#host, DictionaryResource.getDictionaryById({ id })); } /** @@ -63,14 +71,12 @@ export class UmbDictionaryDetailServerDataSource implements DictionaryDetailData * @return {*} * @memberof UmbDictionaryDetailServerDataSource */ - async update(dictionary: DictionaryDetails) { - if (!dictionary.key) { - const error: ProblemDetailsModel = { title: 'Dictionary key is missing' }; - return { error }; - } + async update(id: string, dictionary: UpdateDictionaryItemRequestModel) { + if (!id) throw new Error('Id is missing'); + if (!dictionary) throw new Error('Dictionary is missing'); - const payload = { key: dictionary.key, requestBody: dictionary }; - return tryExecuteAndNotify(this.#host, DictionaryResource.putDictionaryByKey(payload)); + const payload = { id, requestBody: dictionary }; + return tryExecuteAndNotify(this.#host, DictionaryResource.putDictionaryById(payload)); } /** @@ -79,56 +85,50 @@ export class UmbDictionaryDetailServerDataSource implements DictionaryDetailData * @return {*} * @memberof UmbDictionaryDetailServerDataSource */ - async insert(data: DictionaryDetails) { - const requestBody: CreateDictionaryItemRequestModel = { - parentKey: data.parentKey, - name: data.name, - }; - - // TODO: fix type mismatch: - return tryExecuteAndNotify(this.#host, DictionaryResource.postDictionary({ requestBody })) as any; + async insert(data: CreateDictionaryItemRequestModel) { + return tryExecuteAndNotify(this.#host, DictionaryResource.postDictionary({ requestBody: data })); } /** * @description - Deletes a Dictionary on the server - * @param {string} key + * @param {string} id * @return {*} * @memberof UmbDictionaryDetailServerDataSource */ - async delete(key: string) { - if (!key) { + async delete(id: string) { + if (!id) { const error: ProblemDetailsModel = { title: 'Key is missing' }; return { error }; } - return await tryExecuteAndNotify(this.#host, DictionaryResource.deleteDictionaryByKey({ key })); + return await tryExecuteAndNotify(this.#host, DictionaryResource.deleteDictionaryById({ id })); } /** * @description - Import a dictionary - * @param {string} fileName - * @param {string?} parentKey + * @param {string} temporaryFileId + * @param {string?} parentId * @returns {*} * @memberof UmbDictionaryDetailServerDataSource */ - async import(fileName: string, parentKey?: string) { - // TODO => parentKey will be a guid param once #13786 is merged and API regenerated + async import(temporaryFileId: string, parentId?: string) { + // TODO => parentId will be a guid param once #13786 is merged and API regenerated return await tryExecuteAndNotify( this.#host, - DictionaryResource.postDictionaryImport({ requestBody: { fileName, parentKey } }) + DictionaryResource.postDictionaryImport({ requestBody: { temporaryFileId, parentId } }) ); } /** * @description - Upload a Dictionary - * @param {FormData} formData + * @param {ImportDictionaryRequestModel} formData * @return {*} * @memberof UmbDictionaryDetailServerDataSource */ - async upload(formData: FormData) { + async upload(formData: ImportDictionaryRequestModel) { return await tryExecuteAndNotify( this.#host, - DictionaryResource.postDictionaryUpload({ + DictionaryResource.postDictionaryImport({ requestBody: formData, }) ); @@ -136,13 +136,13 @@ export class UmbDictionaryDetailServerDataSource implements DictionaryDetailData /** * @description - Export a Dictionary, optionally including child items. - * @param {string} key + * @param {string} id * @param {boolean} includeChildren * @return {*} * @memberof UmbDictionaryDetailServerDataSource */ - async export(key: string, includeChildren: boolean) { - return await tryExecuteAndNotify(this.#host, DictionaryResource.getDictionaryByKeyExport({ key, includeChildren })); + async export(id: string, includeChildren: boolean) { + return await tryExecuteAndNotify(this.#host, DictionaryResource.getDictionaryByIdExport({ id, includeChildren })); } async getLanguages() { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/sources/dictionary.details.server.data.interface.ts b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/sources/dictionary.details.server.data.interface.ts deleted file mode 100644 index 1b3c74e3b8..0000000000 --- a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/sources/dictionary.details.server.data.interface.ts +++ /dev/null @@ -1,22 +0,0 @@ -import type { DictionaryDetails } from '../../'; -import { - DictionaryItemResponseModel, - UploadDictionaryResponseModel, - PagedDictionaryOverviewResponseModel, - PagedLanguageResponseModel, -} from '@umbraco-cms/backoffice/backend-api'; -import type { DataSourceResponse } from '@umbraco-cms/backoffice/repository'; - -export interface DictionaryDetailDataSource { - createScaffold(parentKey: string): Promise>; - list(skip?: number, take?: number): Promise>; - get(key: string): Promise>; - insert(data: DictionaryDetails): Promise; - update(dictionary: DictionaryItemResponseModel): Promise; - delete(key: string): Promise; - export(key: string, includeChildren: boolean): Promise>; - import(fileName: string, parentKey?: string): Promise>; - upload(formData: FormData): Promise>; - // TODO - temp only - getLanguages(): Promise>; -} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/sources/dictionary.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/sources/dictionary.tree.server.data.ts index fa073716ed..a24572eb9f 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/sources/dictionary.tree.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/sources/dictionary.tree.server.data.ts @@ -31,41 +31,41 @@ export class DictionaryTreeServerDataSource implements UmbTreeDataSource { } /** - * Fetches the children of a given parent key from the server - * @param {(string | null)} parentKey + * Fetches the children of a given parent id from the server + * @param {(string | null)} parentId * @return {*} * @memberof DictionaryTreeServerDataSource */ - async getChildrenOf(parentKey: string | null) { - if (!parentKey) { - const error: ProblemDetailsModel = { title: 'Parent key is missing' }; + async getChildrenOf(parentId: string | null) { + if (!parentId) { + const error: ProblemDetailsModel = { title: 'Parent id is missing' }; return { error }; } return tryExecuteAndNotify( this.#host, DictionaryResource.getTreeDictionaryChildren({ - parentKey, + parentId, }) ); } /** - * Fetches the items for the given keys from the server - * @param {Array} keys + * Fetches the items for the given ids from the server + * @param {Array} ids * @return {*} * @memberof DictionaryTreeServerDataSource */ - async getItems(keys: Array) { - if (!keys || keys.length === 0) { - const error: ProblemDetailsModel = { title: 'Keys are missing' }; + async getItems(ids: Array) { + if (!ids || ids.length === 0) { + const error: ProblemDetailsModel = { title: 'Ids are missing' }; return { error }; } return tryExecuteAndNotify( this.#host, - DictionaryResource.getTreeDictionaryItem({ - key: keys, + DictionaryResource.getDictionaryItem({ + id: ids, }) ); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/workspace/dictionary-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/workspace/dictionary-workspace.context.ts index 054de18f3f..2d2eb3039d 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/workspace/dictionary-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/workspace/dictionary-workspace.context.ts @@ -1,18 +1,17 @@ import { UmbDictionaryRepository } from '../repository/dictionary.repository'; import { UmbWorkspaceContext } from '../../../../backoffice/shared/components/workspace/workspace-context/workspace-context'; -import type { DictionaryDetails } from '../'; import { UmbEntityWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { ObjectState } from '@umbraco-cms/backoffice/observable-api'; - -type EntityType = DictionaryDetails; +import { DictionaryItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; export class UmbDictionaryWorkspaceContext - extends UmbWorkspaceContext - implements UmbEntityWorkspaceContextInterface + extends UmbWorkspaceContext + implements UmbEntityWorkspaceContextInterface { - #data = new ObjectState(undefined); + #data = new ObjectState(undefined); data = this.#data.asObservable(); + name = this.#data.getObservablePart((data) => data?.name); dictionary = this.#data.getObservablePart((data) => data); @@ -24,8 +23,8 @@ export class UmbDictionaryWorkspaceContext return this.#data.getValue(); } - getEntityKey() { - return this.getData()?.key || ''; + getEntityId() { + return this.getData()?.id || ''; } getEntityType() { @@ -56,24 +55,27 @@ export class UmbDictionaryWorkspaceContext this.#data.next({ ...this.#data.value, translations: updatedValue }); } - async load(entityKey: string) { - const { data } = await this.repository.requestByKey(entityKey); + async load(entityId: string) { + const { data } = await this.repository.requestById(entityId); if (data) { this.setIsNew(false); this.#data.next(data); } } - async createScaffold(parentKey: string | null) { - const { data } = await this.repository.createScaffold(parentKey); + async createScaffold(parentId: string | null) { + const { data } = await this.repository.createScaffold(parentId); if (!data) return; this.setIsNew(true); - this.#data.next(data); + // TODO: This is a hack to get around the fact that the data is not typed correctly. + // Create and response models are different. We need to look into this. + this.#data.next(data as unknown as DictionaryItemResponseModel); } async save() { if (!this.#data.value) return; - await this.repository.save(this.#data.value); + if (!this.#data.value.id) return; + await this.repository.save(this.#data.value.id, this.#data.value); this.setIsNew(false); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/workspace/dictionary-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/workspace/dictionary-workspace.element.ts index e73ac5b743..68d93ba9c5 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/workspace/dictionary-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/workspace/dictionary-workspace.element.ts @@ -1,9 +1,9 @@ import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; -import { IRoutingInfo } from 'router-slot'; import { UmbDictionaryWorkspaceContext } from './dictionary-workspace.context'; import { UmbDictionaryWorkspaceEditElement } from './dictionary-workspace-edit.element'; +import type { IRoute } from '@umbraco-cms/backoffice/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-dictionary-workspace') @@ -14,13 +14,13 @@ export class UmbWorkspaceDictionaryElement extends UmbLitElement { #element = new UmbDictionaryWorkspaceEditElement(); @state() - _routes: any[] = [ + _routes: IRoute[] = [ { - path: 'edit/:key', + path: 'edit/:id', component: () => this.#element, - setup: (component: HTMLElement, info: IRoutingInfo) => { - const key = info.match.params.key; - this.#workspaceContext.load(key); + setup: (_component, info) => { + const id = info.match.params.id; + this.#workspaceContext.load(id); }, }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/workspace/dictionary-workspace.stories.ts b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/workspace/dictionary-workspace.stories.ts index 3c1afd4dad..b38f37a57d 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/workspace/dictionary-workspace.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/workspace/dictionary-workspace.stories.ts @@ -1,6 +1,7 @@ import './dictionary-workspace.element'; import { Meta, Story } from '@storybook/web-components'; import { html } from 'lit'; +import { ifDefined } from 'lit/directives/if-defined.js'; import { data } from '../../../../core/mocks/data/dictionary.data'; import type { UmbWorkspaceDictionaryElement } from './dictionary-workspace.element'; @@ -11,6 +12,6 @@ export default { } as Meta; export const AAAOverview: Story = () => - html` `; + html` `; AAAOverview.storyName = 'Overview'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/modals/current-user/current-user-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/modals/current-user/current-user-modal.element.ts index 88dfb0be81..862d2e5823 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/modals/current-user/current-user-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/modals/current-user/current-user-modal.element.ts @@ -1,10 +1,10 @@ import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { css, CSSResultGroup, html } from 'lit'; import { customElement, property, state } from 'lit/decorators.js'; +import { UmbCurrentUserStore, UMB_CURRENT_USER_STORE_CONTEXT_TOKEN } from '../../current-user.store'; import { UmbModalHandler } from '@umbraco-cms/backoffice/modal'; import type { UserDetails } from '@umbraco-cms/backoffice/models'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UmbCurrentUserStore, UMB_CURRENT_USER_STORE_CONTEXT_TOKEN } from '../../current-user.store'; @customElement('umb-current-user-modal') export class UmbCurrentUserModalElement extends UmbLitElement { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/user-profile-apps/user-profile-app-history.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/user-profile-apps/user-profile-app-history.element.ts index 6c6c792a0c..ffdd50ace4 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/user-profile-apps/user-profile-app-history.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/user-profile-apps/user-profile-app-history.element.ts @@ -1,12 +1,12 @@ import { css, html, nothing } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, state } from 'lit/decorators.js'; -import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { UmbCurrentUserHistoryItem, UmbCurrentUserHistoryStore, UMB_CURRENT_USER_HISTORY_STORE_CONTEXT_TOKEN, } from '../current-user-history.store'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-user-profile-app-history') export class UmbUserProfileAppHistoryElement extends UmbLitElement { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/user-profile-apps/user-profile-app-profile.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/user-profile-apps/user-profile-app-profile.element.ts index a08664367d..840b280c6a 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/user-profile-apps/user-profile-app-profile.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/user-profile-apps/user-profile-app-profile.element.ts @@ -42,7 +42,7 @@ export class UmbUserProfileAppProfileElement extends UmbLitElement { private _edit() { if (!this._currentUser) return; - history.pushState(null, '', '/section/users/view/users/user/' + this._currentUser.key); //TODO Change to a tag with href and make dynamic + history.pushState(null, '', 'section/users/view/users/user/' + this._currentUser.id); //TODO Change to a tag with href and make dynamic //TODO Implement modal routing for the current-user-modal, so that the modal closes when navigating to the edit profile page } private _changePassword() { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/user-profile-apps/user-profile-app-themes.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/user-profile-apps/user-profile-app-themes.element.ts index 423b7509f0..b6bc69938f 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/user-profile-apps/user-profile-app-themes.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/user-profile-apps/user-profile-app-themes.element.ts @@ -2,10 +2,10 @@ import { css, html } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, state } from 'lit/decorators.js'; import { UUISelectEvent } from '@umbraco-ui/uui'; +import { UmbThemeContext, UMB_THEME_CONTEXT_TOKEN } from '../../../themes/theme.context'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extensions-api'; import { ManifestTheme } from '@umbraco-cms/backoffice/extensions-registry'; -import { UmbThemeContext, UMB_THEME_CONTEXT_TOKEN } from '../../../themes/theme.context'; @customElement('umb-user-profile-app-themes') export class UmbUserProfileAppThemesElement extends UmbLitElement { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/modals/user-group-picker/user-group-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/modals/user-group-picker/user-group-picker-modal.element.ts index 39866a547a..3a06069852 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/modals/user-group-picker/user-group-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/modals/user-group-picker/user-group-picker-modal.element.ts @@ -81,9 +81,9 @@ export class UmbUserGroupPickerModalElement extends UmbModalElementPickerBase html`
    this.handleSelection(item.key)} - @keydown=${(e: KeyboardEvent) => this._handleKeydown(e, item.key)} - class=${this.isSelected(item.key) ? 'item selected' : 'item'}> + @click=${() => this.handleSelection(item.id)} + @keydown=${(e: KeyboardEvent) => this._handleKeydown(e, item.id)} + class=${this.isSelected(item.id) ? 'item selected' : 'item'}> ${item.name}
    diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/repository/user-group.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/repository/user-group.store.ts index 2b4fd90559..64197bb05b 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/repository/user-group.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/repository/user-group.store.ts @@ -16,21 +16,21 @@ export const UMB_USER_GROUP_STORE_CONTEXT_TOKEN = new UmbContextToken { - #groups = new ArrayState([], (x) => x.key); + #groups = new ArrayState([], (x) => x.id); public groups = this.#groups.asObservable(); constructor(host: UmbControllerHostElement) { super(host, UMB_USER_GROUP_STORE_CONTEXT_TOKEN.toString()); } - getScaffold(entityType: string, parentKey: string | null) { + getScaffold(entityType: string, parentId: string | null) { return { - key: '', + id: '', name: '', icon: '', type: 'user-group', hasChildren: false, - parentKey: '', + parentId: '', sections: [], permissions: [], users: [], @@ -49,27 +49,27 @@ export class UmbUserGroupStore extends UmbStoreBase implements UmbEntityDetailSt return this.groups; } - getByKey(key: string) { + getByKey(id: string) { // TODO: use Fetcher API. // TODO: only fetch if the data type is not in the store? - fetch(`/umbraco/backoffice/user-groups/details/${key}`) + fetch(`/umbraco/backoffice/user-groups/details/${id}`) .then((res) => res.json()) .then((data) => { this.#groups.append([data]); }); - return this.#groups.getObservablePart((userGroups) => userGroups.find((userGroup) => userGroup.key === key)); + return this.#groups.getObservablePart((userGroups) => userGroups.find((userGroup) => userGroup.id === id)); } - getByKeys(keys: Array) { - const params = keys.map((key) => `key=${key}`).join('&'); + getByKeys(ids: Array) { + const params = ids.map((id) => `id=${id}`).join('&'); fetch(`/umbraco/backoffice/user-groups/getByKeys?${params}`) .then((res) => res.json()) .then((data) => { this.#groups.append(data); }); - return this.#groups.getObservablePart((items) => items.filter((node) => keys.includes(node.key))); + return this.#groups.getObservablePart((items) => items.filter((node) => ids.includes(node.id))); } async save(userGroups: Array) { @@ -78,7 +78,7 @@ export class UmbUserGroupStore extends UmbStoreBase implements UmbEntityDetailSt // TODO: implement so user group store updates the users, but these needs to save as well..? /* if (this._userStore && userGroup.users) { - await this._userStore.updateUserGroup(userGroup.users, userGroup.key); + await this._userStore.updateUserGroup(userGroup.users, userGroup.id); } */ diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-workspace-edit.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-workspace-edit.element.ts index 53064d9801..a997c5133a 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-workspace-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-workspace-edit.element.ts @@ -214,9 +214,9 @@ export class UmbUserGroupWorkspaceEditElement extends UmbLitElement { this.observe(this._userStore.getAll(), (users) => { // TODO: handle if there is no users. if (!this._userKeys && users.length > 0) { - const entityKey = this.#workspaceContext?.getEntityKey(); - if (!entityKey) return; - this._userKeys = users.filter((user) => user.userGroups.includes(entityKey)).map((user) => user.key); + const entityId = this.#workspaceContext?.getEntityId(); + if (!entityId) return; + this._userKeys = users.filter((user) => user.userGroups.includes(entityId)).map((user) => user.id); //this._updateProperty('users', this._userKeys); // TODO: make a method on the UmbWorkspaceUserGroupContext: //this._workspaceContext.setUsers(); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-workspace.context.ts index 8aa55263d8..19a5fe183b 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-workspace.context.ts @@ -28,7 +28,7 @@ export class UmbUserGroupWorkspaceContext } getEntityType = this.#manager.getEntityType; getUnique = this.#manager.getEntityKey; - getEntityKey = this.#manager.getEntityKey; + getEntityId = this.#manager.getEntityKey; getStore = this.#manager.getStore; getData = this.#manager.getData as any; // TODO: fix type mismatch, but this will be done when we move to repositories. load = this.#manager.load; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-workspace.element.ts index e232947181..e27f918e93 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-workspace.element.ts @@ -7,7 +7,7 @@ import { UmbSaveWorkspaceAction } from '@umbraco-cms/backoffice/workspace'; import type { ManifestWorkspaceAction } from '@umbraco-cms/backoffice/extensions-registry'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extensions-api'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { IRoutingInfo } from '@umbraco-cms/internal/router'; +import type { IRoute } from '@umbraco-cms/backoffice/router'; @customElement('umb-user-group-workspace') export class UmbUserGroupWorkspaceElement extends UmbLitElement { @@ -47,13 +47,13 @@ export class UmbUserGroupWorkspaceElement extends UmbLitElement { } @state() - _routes: any[] = [ + _routes: IRoute[] = [ { - path: 'edit/:key', + path: 'edit/:id', component: () => this.#element, - setup: (component: HTMLElement, info: IRoutingInfo) => { - const key = info.match.params.key; - this.#workspaceContext.load(key); + setup: (_component, info) => { + const id = info.match.params.id; + this.#workspaceContext.load(id); }, }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/user-groups/user-group-table-name-column-layout.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/user-groups/user-group-table-name-column-layout.element.ts index 4a1f79127f..b60dc36c88 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/user-groups/user-group-table-name-column-layout.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/user-groups/user-group-table-name-column-layout.element.ts @@ -11,7 +11,7 @@ export class UmbUserGroupTableNameColumnLayoutElement extends LitElement { value!: any; render() { - return html` + return html` ${this.value.name} `; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/user-groups/workspace-view-user-groups.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/user-groups/workspace-view-user-groups.element.ts index 0fa5dd071d..61ae8d8384 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/user-groups/workspace-view-user-groups.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/user-groups/workspace-view-user-groups.element.ts @@ -31,11 +31,11 @@ export class UmbWorkspaceViewUserGroupsElement extends UmbLitElement { height: 100%; display: flex; flex-direction: column; - margin:var(--uui-size-layout-1); + margin: var(--uui-size-layout-1); } umb-table { - padding:0; + padding: 0; } `, ]; @@ -99,7 +99,7 @@ export class UmbWorkspaceViewUserGroupsElement extends UmbLitElement { private _createTableItems(userGroups: Array) { this._tableItems = userGroups.map((userGroup) => { return { - key: userGroup.key, + id: userGroup.id, icon: userGroup.icon, data: [ { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/list-view-layouts/grid/workspace-view-users-grid.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/list-view-layouts/grid/workspace-view-users-grid.element.ts index 99f10ee203..0cdb0edede 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/list-view-layouts/grid/workspace-view-users-grid.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/list-view-layouts/grid/workspace-view-users-grid.element.ts @@ -85,27 +85,27 @@ export class UmbWorkspaceViewUsersGridElement extends UmbLitElement { this.observe(this._usersContext.selection, (selection) => (this._selection = selection)); } - private _isSelected(key: string) { - return this._selection.includes(key); + private _isSelected(id: string) { + return this._selection.includes(id); } //TODO How should we handle url stuff? - private _handleOpenCard(key: string) { - history.pushState(null, '', 'section/users/view/users/user/' + key); //TODO Change to a tag with href and make dynamic + private _handleOpenCard(id: string) { + history.pushState(null, '', 'section/users/view/users/user/' + id); //TODO Change to a tag with href and make dynamic } private _selectRowHandler(user: UserEntity) { - this._usersContext?.select(user.key); + this._usersContext?.select(user.id); } private _deselectRowHandler(user: UserEntity) { - this._usersContext?.deselect(user.key); + this._usersContext?.deselect(user.id); } - private _getUserGroupNames(keys: Array) { - return keys - .map((key: string) => { - return this._userGroups.find((x) => x.key === key)?.name; + private _getUserGroupNames(ids: Array) { + return ids + .map((id: string) => { + return this._userGroups.find((x) => x.id === id)?.name; }) .join(', '); } @@ -120,8 +120,8 @@ export class UmbWorkspaceViewUsersGridElement extends UmbLitElement { .name=${user.name} selectable ?select-only=${this._selection.length > 0} - ?selected=${this._isSelected(user.key)} - @open=${() => this._handleOpenCard(user.key)} + ?selected=${this._isSelected(user.id)} + @open=${() => this._handleOpenCard(user.id)} @selected=${() => this._selectRowHandler(user)} @unselected=${() => this._deselectRowHandler(user)}> ${user.status && user.status !== 'enabled' @@ -149,7 +149,7 @@ export class UmbWorkspaceViewUsersGridElement extends UmbLitElement {
    ${repeat( this._users, - (user) => user.key, + (user) => user.id, (user) => this.renderUserCard(user) )}
    diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/list-view-layouts/table/column-layouts/name/user-table-name-column-layout.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/list-view-layouts/table/column-layouts/name/user-table-name-column-layout.element.ts index bf6d9fa7af..ed36318416 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/list-view-layouts/table/column-layouts/name/user-table-name-column-layout.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/list-view-layouts/table/column-layouts/name/user-table-name-column-layout.element.ts @@ -16,7 +16,7 @@ export class UmbUserTableNameColumnLayoutElement extends LitElement { render() { return html` `; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/list-view-layouts/table/workspace-view-users-table.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/list-view-layouts/table/workspace-view-users-table.element.ts index c3c8519b36..33b8e1aa1e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/list-view-layouts/table/workspace-view-users-table.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/list-view-layouts/table/workspace-view-users-table.element.ts @@ -119,10 +119,10 @@ export class UmbWorkspaceViewUsersTableElement extends UmbLitElement { }); } - private _getUserGroupNames(keys: Array) { - return keys - .map((key: string) => { - return this._userGroups.find((x) => x.key === key)?.name; + private _getUserGroupNames(ids: Array) { + return ids + .map((id: string) => { + return this._userGroups.find((x) => x.id === id)?.name; }) .join(', '); } @@ -130,7 +130,7 @@ export class UmbWorkspaceViewUsersTableElement extends UmbLitElement { private _createTableItems(users: Array) { this._tableItems = users.map((user) => { return { - key: user.key, + id: user.id, icon: 'umb:user', data: [ { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/section-view-users.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/section-view-users.element.ts index d84ed8a6c1..2cebe636ce 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/section-view-users.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/section-view-users.element.ts @@ -2,7 +2,7 @@ import { css, html } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, state } from 'lit/decorators.js'; import { UmbUserStore, UMB_USER_STORE_CONTEXT_TOKEN } from '../../../users/repository/user.store'; -import type { IRoute, IRoutingInfo } from '@umbraco-cms/internal/router'; +import type { IRoute } from '@umbraco-cms/backoffice/router'; import { umbExtensionsRegistry, createExtensionElement } from '@umbraco-cms/backoffice/extensions-api'; import './list-view-layouts/table/workspace-view-users-table.element'; @@ -21,7 +21,7 @@ export class UmbSectionViewUsersElement extends UmbLitElement { css` :host { height: 100%; - } + } #router-slot { height: calc(100% - var(--umb-header-layout-height)); @@ -65,7 +65,7 @@ export class UmbSectionViewUsersElement extends UmbLitElement { } private _createRoutes() { - const routes: any[] = [ + const routes: IRoute[] = [ { path: 'overview', component: () => import('./workspace-view-users-overview.element'), @@ -75,12 +75,12 @@ export class UmbSectionViewUsersElement extends UmbLitElement { // TODO: find a way to make this reuseable across: this._workspaces?.map((workspace: ManifestWorkspace) => { routes.push({ - path: `${workspace.meta.entityType}/:key`, + path: `${workspace.meta.entityType}/:id`, component: () => createExtensionElement(workspace), - setup: (component: Promise, info: IRoutingInfo) => { - component.then((el: HTMLElement) => { - (el as any).entityKey = info.match.params.key; - }); + setup: (component, info) => { + if (component) { + (component as any).entityId = info.match.params.id; + } }, }); routes.push({ @@ -118,17 +118,17 @@ export class UmbSectionViewUsersElement extends UmbLitElement { this.requestUpdate('selection'); } - public select(key: string) { + public select(id: string) { const oldSelection = this.#selection.getValue(); - if (oldSelection.indexOf(key) !== -1) return; + if (oldSelection.indexOf(id) !== -1) return; - this.#selection.next([...oldSelection, key]); + this.#selection.next([...oldSelection, id]); this.requestUpdate('selection'); } - public deselect(key: string) { + public deselect(id: string) { const selection = this.#selection.getValue(); - this.#selection.next(selection.filter((k) => k !== key)); + this.#selection.next(selection.filter((k) => k !== id)); this.requestUpdate('selection'); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/workspace-view-users-overview.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/workspace-view-users-overview.element.ts index 5aa001acf5..b770de3c2b 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/workspace-view-users-overview.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/workspace-view-users-overview.element.ts @@ -9,7 +9,7 @@ import { UMB_INVITE_USER_MODAL, UMB_CREATE_USER_MODAL, } from '@umbraco-cms/backoffice/modal'; -import type { IRoute } from '@umbraco-cms/internal/router'; +import type { IRoute } from '@umbraco-cms/backoffice/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/create-user/create-user-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/create-user/create-user-modal.element.ts index 73dc26085b..39573a4e2c 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/create-user/create-user-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/create-user/create-user-modal.element.ts @@ -126,7 +126,7 @@ export class UmbCreateUserModalElement extends UmbModalBaseElement { if (!this._createdUser) return; this._closeModal(); - history.pushState(null, '', '/section/users/view/users/user/' + this._createdUser?.key); //TODO: URL Should be dynamic + history.pushState(null, '', 'section/users/view/users/user/' + this._createdUser?.id); //TODO: URL Should be dynamic } private _renderForm() { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/invite-user/invite-user-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/invite-user/invite-user-modal.element.ts index 492590d4ce..2c1eaed271 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/invite-user/invite-user-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/invite-user/invite-user-modal.element.ts @@ -105,7 +105,7 @@ export class UmbInviteUserModalElement extends UmbModalBaseElement { if (!this._invitedUser) return; this._closeModal(); - history.pushState(null, '', 'section/users/view/users/user/' + this._invitedUser?.key); //TODO: URL Should be dynamic + history.pushState(null, '', 'section/users/view/users/user/' + this._invitedUser?.id); //TODO: URL Should be dynamic } private _renderForm() { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/user-picker/user-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/user-picker/user-picker-modal.element.ts index faa135b3de..a1f18890a1 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/user-picker/user-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/user-picker/user-picker-modal.element.ts @@ -86,9 +86,9 @@ export class UmbUserPickerModalElement extends UmbModalElementPickerBase html`
    this.handleSelection(item.key)} - @keydown=${(e: KeyboardEvent) => this._handleKeydown(e, item.key)} - class=${this.isSelected(item.key) ? 'item selected' : 'item'}> + @click=${() => this.handleSelection(item.id)} + @keydown=${(e: KeyboardEvent) => this._handleKeydown(e, item.id)} + class=${this.isSelected(item.id) ? 'item selected' : 'item'}> ${item.name}
    diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/repository/user.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/repository/user.store.ts index 4c6791de91..a52581484d 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/repository/user.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/repository/user.store.ts @@ -15,7 +15,7 @@ export const UMB_USER_STORE_CONTEXT_TOKEN = new UmbContextToken('U * @description - Data Store for Users */ export class UmbUserStore extends UmbStoreBase implements UmbEntityDetailStore { - #users = new ArrayState([], (x) => x.key); + #users = new ArrayState([], (x) => x.id); public users = this.#users.asObservable(); #totalUsers = new NumberState(0); @@ -25,14 +25,14 @@ export class UmbUserStore extends UmbStoreBase implements UmbEntityDetailStore)} * @memberof UmbDataTypeStore */ - getByKey(key: string) { + getByKey(id: string) { // TODO: use Fetcher API. // TODO: only fetch if the data type is not in the store? - fetch(`/umbraco/backoffice/users/details/${key}`) + fetch(`/umbraco/backoffice/users/details/${id}`) .then((res) => res.json()) .then((data) => { this.#users.appendOne(data); }); return this.#users.getObservablePart((users: Array) => - users.find((user: UmbUserStoreItemType) => user.key === key) + users.find((user: UmbUserStoreItemType) => user.id === id) ); } /** - * @description - Request Users by keys. - * @param {string} key + * @description - Request Users by ids. + * @param {string} id * @return {*} {(Observable)} * @memberof UmbDataTypeStore */ - getByKeys(keys: Array) { - const params = keys.map((key) => `key=${key}`).join('&'); + getByKeys(ids: Array) { + const params = ids.map((id) => `id=${id}`).join('&'); fetch(`/umbraco/backoffice/users/getByKeys?${params}`) .then((res) => res.json()) .then((data) => { @@ -93,7 +93,7 @@ export class UmbUserStore extends UmbStoreBase implements UmbEntityDetailStore) => - users.filter((user: UmbUserStoreItemType) => keys.includes(user.key)) + users.filter((user: UmbUserStoreItemType) => ids.includes(user.id)) ); } @@ -124,7 +124,7 @@ export class UmbUserStore extends UmbStoreBase implements UmbEntityDetailStore enabledKeys.includes(user.key)); + const storedUsers = this.#users.getValue().filter((user) => enabledKeys.includes(user.id)); storedUsers.forEach((user) => { user.status = 'enabled'; @@ -147,10 +147,10 @@ export class UmbUserStore extends UmbStoreBase implements UmbEntityDetailStore enabledKeys.includes(user.key)); + const storedUsers = this.#users.getValue().filter((user) => enabledKeys.includes(user.id)); storedUsers.forEach((user) => { - if (userKeys.includes(user.key)) { + if (userKeys.includes(user.id)) { user.userGroups.push(userGroup); } else { user.userGroups = user.userGroups.filter((group) => group !== userGroup); @@ -174,7 +174,7 @@ export class UmbUserStore extends UmbStoreBase implements UmbEntityDetailStore enabledKeys.includes(user.key)); + const storedUsers = this.#users.getValue().filter((user) => enabledKeys.includes(user.id)); storedUsers.forEach((user) => { user.userGroups = user.userGroups.filter((group) => group !== userGroup); @@ -197,7 +197,7 @@ export class UmbUserStore extends UmbStoreBase implements UmbEntityDetailStore disabledKeys.includes(user.key)); + const storedUsers = this.#users.getValue().filter((user) => disabledKeys.includes(user.id)); storedUsers.forEach((user) => { user.status = 'disabled'; @@ -265,7 +265,7 @@ export class UmbUserStore extends UmbStoreBase implements UmbEntityDetailStore u.key === user.key); + // const index = users.findIndex((u) => u.id === user.id); // if (index === -1) return; // users[index] = { ...users[index], ...user }; // console.log('updateUser', user, users[index]); @@ -277,7 +277,7 @@ export class UmbUserStore extends UmbStoreBase implements UmbEntityDetailStore u.key === key); + // const index = users.findIndex((u) => u.id === id); // if (index === -1) return; // users.splice(index, 1); // this._users.next(users); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/user-workspace-edit.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/user-workspace-edit.element.ts index 06e603d4d9..c0a9430280 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/user-workspace-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/user-workspace-edit.element.ts @@ -127,8 +127,8 @@ export class UmbUserWorkspaceEditElement extends UmbLitElement { // TODO: make sure we use the workspace for this: /* isDisabled - ? this._workspaceContext.getStore()?.enableUsers([this._user.key]) - : this._workspaceContext.getStore()?.disableUsers([this._user.key]); + ? this._workspaceContext.getStore()?.enableUsers([this._user.id]) + : this._workspaceContext.getStore()?.disableUsers([this._user.id]); */ } @@ -136,7 +136,7 @@ export class UmbUserWorkspaceEditElement extends UmbLitElement { if (!this._user || !this._workspaceContext) return; // TODO: make sure we use the workspace for this: - //this._workspaceContext.getStore()?.deleteUsers([this._user.key]); + //this._workspaceContext.getStore()?.deleteUsers([this._user.id]); history.pushState(null, '', 'section/users/view/users/overview'); } @@ -166,7 +166,7 @@ export class UmbUserWorkspaceEditElement extends UmbLitElement { `; - //TODO Render the name of the content start node instead of it's key. + //TODO Render the name of the content start node instead of it's id. return repeat( this._user.contentStartNodes, (node) => node, @@ -204,7 +204,7 @@ export class UmbUserWorkspaceEditElement extends UmbLitElement { ` ); - if (this._currentUser?.key !== this._user?.key) + if (this._currentUser?.id !== this._user?.id) buttons.push(html`
    Key: - ${this._user.key} + ${this._user.id}
    `; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/user-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/user-workspace.context.ts index 545a9e3c1b..66d6589d2c 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/user-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/user-workspace.context.ts @@ -31,7 +31,7 @@ export class UmbUserWorkspaceContext } getEntityType = this.#manager.getEntityType; getUnique = this.#manager.getEntityKey; - getEntityKey = this.#manager.getEntityKey; + getEntityId = this.#manager.getEntityKey; getStore = this.#manager.getStore; getData = this.#manager.getData as any; // TODO: fix type mismatch, this will mos likely be handled when switching to repositories. load = this.#manager.load; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/user-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/user-workspace.element.ts index 1a531ae058..7cfea7028f 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/user-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/user-workspace.element.ts @@ -4,7 +4,7 @@ import { customElement, state } from 'lit/decorators.js'; import { UmbUserWorkspaceContext } from './user-workspace.context'; import { UmbUserWorkspaceEditElement } from './user-workspace-edit.element'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { IRoutingInfo } from '@umbraco-cms/internal/router'; +import type { IRoute } from '@umbraco-cms/backoffice/router'; import '../../../shared/components/input-user-group/input-user-group.element'; import '../../../shared/property-editors/uis/document-picker/property-editor-ui-document-picker.element'; @@ -18,13 +18,13 @@ export class UmbUserWorkspaceElement extends UmbLitElement { #element = new UmbUserWorkspaceEditElement(); @state() - _routes: any[] = [ + _routes: IRoute[] = [ { - path: 'edit/:key', + path: 'edit/:id', component: () => this.#element, - setup: (component: HTMLElement, info: IRoutingInfo) => { - const key = info.match.params.key; - this.#workspaceContext.load(key); + setup: (component, info) => { + const id = info.match.params.id; + this.#workspaceContext.load(id); }, }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/browser-handlers.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/browser-handlers.ts index a756d4c727..e899c2aaf6 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/browser-handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/browser-handlers.ts @@ -1,4 +1,4 @@ -import { handlers as dataTypeHandlers } from './domains/data-type.handlers'; +import { handlers as dataTypeHandlers } from './domains/data-type'; import { handlers as relationTypeHandlers } from './domains/relation-type.handlers'; import { handlers as documentTypeHandlers } from './domains/document-type.handlers'; import { handlers as installHandlers } from './domains/install.handlers'; diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/data-type.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/data-type.data.ts index 83e6cd42e3..fccf52dbfa 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/data-type.data.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/data-type.data.ts @@ -12,15 +12,15 @@ export const data: Array<(DataTypeResponseModel & { type: 'data-type' }) | Folde $type: 'data-type', type: 'data-type', name: 'Folder 1', - key: 'dt-folder1', - parentKey: null, + id: 'dt-folder1', + parentId: null, isFolder: true, }, { $type: 'data-type', type: 'data-type', - key: '0cc0eba1-9960-42c9-bf9b-60e150b429ae', - parentKey: null, + id: '0cc0eba1-9960-42c9-bf9b-60e150b429ae', + parentId: null, name: 'Textstring', propertyEditorAlias: 'Umbraco.TextBox', propertyEditorUiAlias: 'Umb.PropertyEditorUI.TextBox', @@ -30,8 +30,8 @@ export const data: Array<(DataTypeResponseModel & { type: 'data-type' }) | Folde $type: 'data-type', type: 'data-type', name: 'Text', - key: 'dt-textBox', - parentKey: null, + id: 'dt-textBox', + parentId: null, propertyEditorAlias: 'Umbraco.TextBox', propertyEditorUiAlias: 'Umb.PropertyEditorUI.TextBox', values: [ @@ -45,8 +45,8 @@ export const data: Array<(DataTypeResponseModel & { type: 'data-type' }) | Folde $type: 'data-type', type: 'data-type', name: 'Text Area', - key: 'dt-textArea', - parentKey: null, + id: 'dt-textArea', + parentId: null, propertyEditorAlias: 'Umbraco.TextArea', propertyEditorUiAlias: 'Umb.PropertyEditorUI.TextArea', values: [], @@ -55,8 +55,8 @@ export const data: Array<(DataTypeResponseModel & { type: 'data-type' }) | Folde $type: 'data-type', type: 'data-type', name: 'My JS Property Editor', - key: 'dt-custom', - parentKey: null, + id: 'dt-custom', + parentId: null, propertyEditorAlias: 'Umbraco.JSON', propertyEditorUiAlias: 'My.PropertyEditorUI.Custom', values: [], @@ -65,8 +65,8 @@ export const data: Array<(DataTypeResponseModel & { type: 'data-type' }) | Folde $type: 'data-type', type: 'data-type', name: 'Color Picker', - key: 'dt-colorPicker', - parentKey: null, + id: 'dt-colorPicker', + parentId: null, propertyEditorAlias: 'Umbraco.ColorPicker', propertyEditorUiAlias: 'Umb.PropertyEditorUI.ColorPicker', values: [ @@ -121,8 +121,8 @@ export const data: Array<(DataTypeResponseModel & { type: 'data-type' }) | Folde $type: 'data-type', type: 'data-type', name: 'Content Picker', - key: 'dt-contentPicker', - parentKey: null, + id: 'dt-contentPicker', + parentId: null, propertyEditorAlias: 'Umbraco.ContentPicker', propertyEditorUiAlias: 'Umb.PropertyEditorUI.DocumentPicker', values: [ @@ -136,8 +136,8 @@ export const data: Array<(DataTypeResponseModel & { type: 'data-type' }) | Folde $type: 'data-type', type: 'data-type', name: 'Eye Dropper', - key: 'dt-eyeDropper', - parentKey: null, + id: 'dt-eyeDropper', + parentId: null, propertyEditorAlias: 'Umbraco.ColorPicker.EyeDropper', propertyEditorUiAlias: 'Umb.PropertyEditorUI.EyeDropper', values: [ @@ -173,8 +173,8 @@ export const data: Array<(DataTypeResponseModel & { type: 'data-type' }) | Folde $type: 'data-type', type: 'data-type', name: 'Multi URL Picker', - key: 'dt-multiUrlPicker', - parentKey: null, + id: 'dt-multiUrlPicker', + parentId: null, propertyEditorAlias: 'Umbraco.MultiUrlPicker', propertyEditorUiAlias: 'Umb.PropertyEditorUI.MultiUrlPicker', values: [ @@ -204,8 +204,8 @@ export const data: Array<(DataTypeResponseModel & { type: 'data-type' }) | Folde $type: 'data-type', type: 'data-type', name: 'Multi Node Tree Picker', - key: 'dt-multiNodeTreePicker', - parentKey: null, + id: 'dt-multiNodeTreePicker', + parentId: null, propertyEditorAlias: 'Umbraco.MultiNodeTreePicker', propertyEditorUiAlias: 'Umb.PropertyEditorUI.TreePicker', values: [], @@ -214,8 +214,8 @@ export const data: Array<(DataTypeResponseModel & { type: 'data-type' }) | Folde $type: 'data-type', type: 'data-type', name: 'Date Picker', - key: 'dt-datePicker', - parentKey: null, + id: 'dt-datePicker', + parentId: null, propertyEditorAlias: 'Umbraco.DateTime', propertyEditorUiAlias: 'Umb.PropertyEditorUI.DatePicker', values: [ @@ -233,8 +233,8 @@ export const data: Array<(DataTypeResponseModel & { type: 'data-type' }) | Folde $type: 'data-type', name: 'Date Picker With Time', type: 'data-type', - key: 'dt-datePicker-time', - parentKey: null, + id: 'dt-datePicker-time', + parentId: null, propertyEditorAlias: 'Umbraco.DateTime', propertyEditorUiAlias: 'Umb.PropertyEditorUI.DatePicker', values: [ @@ -252,8 +252,8 @@ export const data: Array<(DataTypeResponseModel & { type: 'data-type' }) | Folde $type: 'data-type', name: 'Time', type: 'data-type', - key: 'dt-time', - parentKey: null, + id: 'dt-time', + parentId: null, propertyEditorAlias: 'Umbraco.DateTime', propertyEditorUiAlias: 'Umb.PropertyEditorUI.DatePicker', values: [ @@ -271,8 +271,8 @@ export const data: Array<(DataTypeResponseModel & { type: 'data-type' }) | Folde $type: 'data-type', type: 'data-type', name: 'Email', - key: 'dt-email', - parentKey: null, + id: 'dt-email', + parentId: null, propertyEditorAlias: 'Umbraco.EmailAddress', propertyEditorUiAlias: 'Umb.PropertyEditorUI.Email', values: [], @@ -281,8 +281,8 @@ export const data: Array<(DataTypeResponseModel & { type: 'data-type' }) | Folde $type: 'data-type', type: 'data-type', name: 'Multiple Text String', - key: 'dt-multipleTextString', - parentKey: null, + id: 'dt-multipleTextString', + parentId: null, propertyEditorAlias: 'Umbraco.MultipleTextString', propertyEditorUiAlias: 'Umb.PropertyEditorUI.MultipleTextString', values: [ @@ -300,8 +300,8 @@ export const data: Array<(DataTypeResponseModel & { type: 'data-type' }) | Folde $type: 'data-type', type: 'data-type', name: 'Dropdown', - key: 'dt-dropdown', - parentKey: null, + id: 'dt-dropdown', + parentId: null, propertyEditorAlias: 'Umbraco.DropDown.Flexible', propertyEditorUiAlias: 'Umb.PropertyEditorUI.Dropdown', values: [], @@ -310,8 +310,8 @@ export const data: Array<(DataTypeResponseModel & { type: 'data-type' }) | Folde $type: 'data-type', type: 'data-type', name: 'Slider', - key: 'dt-slider', - parentKey: null, + id: 'dt-slider', + parentId: null, propertyEditorAlias: 'Umbraco.Slider', propertyEditorUiAlias: 'Umb.PropertyEditorUI.Slider', values: [ @@ -345,8 +345,8 @@ export const data: Array<(DataTypeResponseModel & { type: 'data-type' }) | Folde $type: 'data-type', type: 'data-type', name: 'Toggle', - key: 'dt-toggle', - parentKey: null, + id: 'dt-toggle', + parentId: null, propertyEditorAlias: 'Umbraco.TrueFalse', propertyEditorUiAlias: 'Umb.PropertyEditorUI.Toggle', values: [ @@ -372,8 +372,8 @@ export const data: Array<(DataTypeResponseModel & { type: 'data-type' }) | Folde $type: 'data-type', type: 'data-type', name: 'Tags', - key: 'dt-tags', - parentKey: null, + id: 'dt-tags', + parentId: null, propertyEditorAlias: 'Umbraco.Tags', propertyEditorUiAlias: 'Umb.PropertyEditorUI.Tags', values: [], @@ -382,8 +382,8 @@ export const data: Array<(DataTypeResponseModel & { type: 'data-type' }) | Folde $type: 'data-type', type: 'data-type', name: 'Markdown Editor', - key: 'dt-markdownEditor', - parentKey: null, + id: 'dt-markdownEditor', + parentId: null, propertyEditorAlias: 'Umbraco.MarkdownEditor', propertyEditorUiAlias: 'Umb.PropertyEditorUI.MarkdownEditor', values: [], @@ -392,8 +392,8 @@ export const data: Array<(DataTypeResponseModel & { type: 'data-type' }) | Folde $type: 'data-type', type: 'data-type', name: 'Radio Button List', - key: 'dt-radioButtonList', - parentKey: null, + id: 'dt-radioButtonList', + parentId: null, propertyEditorAlias: 'Umbraco.RadioButtonList', propertyEditorUiAlias: 'Umb.PropertyEditorUI.RadioButtonList', values: [ @@ -411,8 +411,8 @@ export const data: Array<(DataTypeResponseModel & { type: 'data-type' }) | Folde $type: 'data-type', type: 'data-type', name: 'Checkbox List', - key: 'dt-checkboxList', - parentKey: null, + id: 'dt-checkboxList', + parentId: null, propertyEditorAlias: 'Umbraco.CheckboxList', propertyEditorUiAlias: 'Umb.PropertyEditorUI.CheckboxList', values: [ @@ -430,8 +430,8 @@ export const data: Array<(DataTypeResponseModel & { type: 'data-type' }) | Folde $type: 'data-type', type: 'data-type', name: 'Block List', - key: 'dt-blockList', - parentKey: null, + id: 'dt-blockList', + parentId: null, propertyEditorAlias: 'Umbraco.BlockList', propertyEditorUiAlias: 'Umb.PropertyEditorUI.BlockList', values: [], @@ -440,8 +440,8 @@ export const data: Array<(DataTypeResponseModel & { type: 'data-type' }) | Folde $type: 'data-type', type: 'data-type', name: 'Media Picker', - key: 'dt-mediaPicker', - parentKey: null, + id: 'dt-mediaPicker', + parentId: null, propertyEditorAlias: 'Umbraco.MediaPicker3', propertyEditorUiAlias: 'Umb.PropertyEditorUI.MediaPicker', values: [], @@ -450,8 +450,8 @@ export const data: Array<(DataTypeResponseModel & { type: 'data-type' }) | Folde $type: 'data-type', type: 'data-type', name: 'Image Cropper', - key: 'dt-imageCropper', - parentKey: null, + id: 'dt-imageCropper', + parentId: null, propertyEditorAlias: 'Umbraco.ImageCropper', propertyEditorUiAlias: 'Umb.PropertyEditorUI.ImageCropper', values: [], @@ -460,18 +460,23 @@ export const data: Array<(DataTypeResponseModel & { type: 'data-type' }) | Folde $type: 'data-type', type: 'data-type', name: 'Upload Field', - key: 'dt-uploadField', - parentKey: null, + id: 'dt-uploadField', + parentId: null, propertyEditorAlias: 'Umbraco.UploadField', propertyEditorUiAlias: 'Umb.PropertyEditorUI.UploadField', - values: [], + values: [ + { + alias: 'fileExtensions', + value: ['jpg', 'jpeg', 'png'], + }, + ], }, { $type: 'data-type', type: 'data-type', name: 'Block Grid', - key: 'dt-blockGrid', - parentKey: null, + id: 'dt-blockGrid', + parentId: null, propertyEditorAlias: 'Umbraco.BlockGrid', propertyEditorUiAlias: 'Umb.PropertyEditorUI.BlockGrid', values: [], @@ -480,8 +485,8 @@ export const data: Array<(DataTypeResponseModel & { type: 'data-type' }) | Folde $type: 'data-type', type: 'data-type', name: 'Collection View', - key: 'dt-collectionView', - parentKey: null, + id: 'dt-collectionView', + parentId: null, propertyEditorAlias: 'Umbraco.ListView', propertyEditorUiAlias: 'Umb.PropertyEditorUI.CollectionView', values: [], @@ -490,8 +495,8 @@ export const data: Array<(DataTypeResponseModel & { type: 'data-type' }) | Folde $type: 'data-type', type: 'data-type', name: 'Icon Picker', - key: 'dt-iconPicker', - parentKey: null, + id: 'dt-iconPicker', + parentId: null, propertyEditorAlias: 'Umbraco.IconPicker', propertyEditorUiAlias: 'Umb.PropertyEditorUI.IconPicker', values: [], @@ -500,8 +505,8 @@ export const data: Array<(DataTypeResponseModel & { type: 'data-type' }) | Folde $type: 'data-type', type: 'data-type', name: 'Number Range', - key: 'dt-numberRange', - parentKey: null, + id: 'dt-numberRange', + parentId: null, propertyEditorAlias: 'Umbraco.JSON', propertyEditorUiAlias: 'Umb.PropertyEditorUI.NumberRange', values: [], @@ -510,8 +515,8 @@ export const data: Array<(DataTypeResponseModel & { type: 'data-type' }) | Folde $type: 'data-type', type: 'data-type', name: 'Order Direction', - key: 'dt-orderDirection', - parentKey: null, + id: 'dt-orderDirection', + parentId: null, propertyEditorAlias: 'Umbraco.JSON', propertyEditorUiAlias: 'Umb.PropertyEditorUI.OrderDirection', values: [], @@ -520,8 +525,8 @@ export const data: Array<(DataTypeResponseModel & { type: 'data-type' }) | Folde $type: 'data-type', type: 'data-type', name: 'Overlay Size', - key: 'dt-overlaySize', - parentKey: null, + id: 'dt-overlaySize', + parentId: null, propertyEditorAlias: 'Umbraco.JSON', propertyEditorUiAlias: 'Umb.PropertyEditorUI.OverlaySize', values: [], @@ -530,8 +535,8 @@ export const data: Array<(DataTypeResponseModel & { type: 'data-type' }) | Folde $type: 'data-type', type: 'data-type', name: 'Rich Text Editor', - key: 'dt-richTextEditor', - parentKey: null, + id: 'dt-richTextEditor', + parentId: null, propertyEditorAlias: 'Umbraco.TinyMCE', propertyEditorUiAlias: 'Umb.PropertyEditorUI.TinyMCE', values: [], @@ -540,8 +545,8 @@ export const data: Array<(DataTypeResponseModel & { type: 'data-type' }) | Folde $type: 'data-type', type: 'data-type', name: 'Label', - key: 'dt-label', - parentKey: null, + id: 'dt-label', + parentId: null, propertyEditorAlias: 'Umbraco.Label', propertyEditorUiAlias: 'Umb.PropertyEditorUI.Label', values: [], @@ -550,8 +555,8 @@ export const data: Array<(DataTypeResponseModel & { type: 'data-type' }) | Folde $type: 'data-type', type: 'data-type', name: 'Integer', - key: 'dt-integer', - parentKey: null, + id: 'dt-integer', + parentId: null, propertyEditorAlias: 'Umbraco.Integer', propertyEditorUiAlias: 'Umb.PropertyEditorUI.Integer', values: [], @@ -560,8 +565,8 @@ export const data: Array<(DataTypeResponseModel & { type: 'data-type' }) | Folde $type: 'data-type', type: 'data-type', name: 'Decimal', - key: 'dt-decimal', - parentKey: null, + id: 'dt-decimal', + parentId: null, propertyEditorAlias: 'Umbraco.Decimal', propertyEditorUiAlias: 'Umb.PropertyEditorUI.Decimal', values: [], @@ -570,8 +575,8 @@ export const data: Array<(DataTypeResponseModel & { type: 'data-type' }) | Folde $type: 'data-type', type: 'data-type', name: 'User Picker', - key: 'dt-userPicker', - parentKey: null, + id: 'dt-userPicker', + parentId: null, propertyEditorAlias: 'Umbraco.UserPicker', propertyEditorUiAlias: 'Umb.PropertyEditorUI.UserPicker', values: [], @@ -580,8 +585,8 @@ export const data: Array<(DataTypeResponseModel & { type: 'data-type' }) | Folde $type: 'data-type', type: 'data-type', name: 'Member Picker', - key: 'dt-memberPicker', - parentKey: null, + id: 'dt-memberPicker', + parentId: null, propertyEditorAlias: 'Umbraco.MemberPicker', propertyEditorUiAlias: 'Umb.PropertyEditorUI.MemberPicker', values: [], @@ -590,8 +595,8 @@ export const data: Array<(DataTypeResponseModel & { type: 'data-type' }) | Folde $type: 'data-type', type: 'data-type', name: 'Member Group Picker', - key: 'dt-memberGroupPicker', - parentKey: null, + id: 'dt-memberGroupPicker', + parentId: null, propertyEditorAlias: 'Umbraco.MemberGroupPicker', propertyEditorUiAlias: 'Umb.PropertyEditorUI.MemberGroupPicker', values: [], @@ -608,25 +613,25 @@ class UmbDataTypeData extends UmbEntityData { - const rootItems = this.data.filter((item) => item.parentKey === null); + const rootItems = this.data.filter((item) => item.parentId === null); return rootItems.map((item) => createFolderTreeItem(item)); } - getTreeItemChildren(key: string): Array { - const childItems = this.data.filter((item) => item.parentKey === key); + getTreeItemChildren(id: string): Array { + const childItems = this.data.filter((item) => item.parentId === id); return childItems.map((item) => createFolderTreeItem(item)); } - getTreeItem(keys: Array): Array { - const items = this.data.filter((item) => keys.includes(item.key ?? '')); + getTreeItem(ids: Array): Array { + const items = this.data.filter((item) => ids.includes(item.id ?? '')); return items.map((item) => createFolderTreeItem(item)); } - createFolder(folder: CreateFolderRequestModel & { key: string | undefined }) { + createFolder(folder: CreateFolderRequestModel & { id: string | undefined }) { const newFolder: FolderTreeItemResponseModel = { name: folder.name, - key: folder.key, - parentKey: folder.parentKey, + id: folder.id, + parentId: folder.parentId, $type: 'data-type', type: 'data-type', isFolder: true, @@ -637,11 +642,11 @@ class UmbDataTypeData extends UmbEntityData item.key !== key); + deleteFolder(id: string) { + const item = this.getById(id) as FolderTreeItemResponseModel; + if (!item) throw new Error(`Item with id ${id} not found`); + if (!item.isFolder) throw new Error(`Item with id ${id} is not a folder`); + this.data = this.data.filter((item) => item.id !== id); } } diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/dictionary.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/dictionary.data.ts index 8a76f7c398..aaf776a892 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/dictionary.data.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/dictionary.data.ts @@ -1,18 +1,12 @@ -import type { DictionaryDetails } from '../../../backoffice/translation/dictionary'; import { UmbEntityData } from './entity.data'; import { createEntityTreeItem } from './utils'; -import type { EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { DictionaryItemResponseModel, EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; -export const data: Array = [ +export const data: Array = [ { $type: '', - parentKey: null, name: 'Hello', - key: 'aae7d0ab-53ba-485d-b8bd-12537f9925cb', - hasChildren: true, - type: 'dictionary-item', - isContainer: false, - icon: 'umb:book-alt', + id: 'aae7d0ab-53ba-485d-b8bd-12537f9925cb', translations: [ { isoCode: 'en', @@ -26,13 +20,8 @@ export const data: Array = [ }, { $type: '', - parentKey: 'aae7d0ab-53ba-485d-b8bd-12537f9925cb', name: 'Hello again', - key: 'bbe7d0ab-53bb-485d-b8bd-12537f9925cb', - hasChildren: false, - type: 'dictionary-item', - isContainer: false, - icon: 'umb:book-alt', + id: 'bbe7d0ab-53bb-485d-b8bd-12537f9925cb', translations: [ { isoCode: 'en', @@ -46,27 +35,50 @@ export const data: Array = [ }, ]; +const dictionaryTree: Array = [ + { + $type: '', + parentId: null, + name: 'Hello', + id: 'aae7d0ab-53ba-485d-b8bd-12537f9925cb', + hasChildren: true, + type: 'dictionary-item', + isContainer: false, + icon: 'umb:book-alt', + }, + { + $type: '', + parentId: 'aae7d0ab-53ba-485d-b8bd-12537f9925cb', + name: 'Hello again', + id: 'bbe7d0ab-53bb-485d-b8bd-12537f9925cb', + hasChildren: false, + type: 'dictionary-item', + isContainer: false, + icon: 'umb:book-alt', + }, +]; + // Temp mocked database // TODO: all properties are optional in the server schema. I don't think this is correct. // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore -class UmbDictionaryData extends UmbEntityData { +class UmbDictionaryData extends UmbEntityData { constructor() { super(data); } getTreeRoot(): Array { - const rootItems = this.data.filter((item) => item.parentKey === null); + const rootItems = dictionaryTree.filter((item) => item.parentId === null); return rootItems.map((item) => createEntityTreeItem(item)); } - getTreeItemChildren(key: string): Array { - const childItems = this.data.filter((item) => item.parentKey === key); + getTreeItemChildren(id: string): Array { + const childItems = dictionaryTree.filter((item) => item.parentId === id); return childItems.map((item) => createEntityTreeItem(item)); } - getTreeItem(keys: Array): Array { - const items = this.data.filter((item) => keys.includes(item.key ?? '')); + getTreeItem(ids: Array): Array { + const items = dictionaryTree.filter((item) => ids.includes(item.id ?? '')); return items.map((item) => createEntityTreeItem(item)); } } diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/document-blueprint.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/document-blueprint.data.ts index 041417a449..9ac544bffd 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/document-blueprint.data.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/document-blueprint.data.ts @@ -5,7 +5,7 @@ export const data: Array = [ { name: 'Document Blueprint 1', type: 'document-blueprint', - key: '3fa85f64-5717-4562-b3fc-2c963f66afa6', + id: '3fa85f64-5717-4562-b3fc-2c963f66afa6', icon: 'umb:blueprint', documentTypeKey: 'd81c7957-153c-4b5a-aa6f-b434a4964624', properties: [], @@ -14,7 +14,7 @@ export const data: Array = [ { name: 'Document Blueprint 2', type: 'document-blueprint', - key: '3fa85f64-5717-4562-b3qc-2c963f66afa6', + id: '3fa85f64-5717-4562-b3qc-2c963f66afa6', icon: 'umb:blueprint', documentTypeKey: 'a99e4018-3ffc-486b-aa76-eecea9593d17', properties: [], diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/document-type.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/document-type.data.ts index ec6d416519..532186dde7 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/document-type.data.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/document-type.data.ts @@ -8,9 +8,9 @@ import { export const data: Array = [ { - allowedTemplateKeys: [], - defaultTemplateKey: null, - key: 'all-property-editors-document-type-key', + allowedTemplateIds: [], + defaultTemplateId: null, + id: 'all-property-editors-document-type-id', alias: 'blogPost', name: 'Blog Post', description: null, @@ -21,12 +21,12 @@ export const data: Array = [ isElement: false, properties: [ { - key: '2', - containerKey: 'all-properties-group-key', + id: '2', + containerId: 'all-properties-group-id', alias: 'colorPicker', name: 'Color Picker', description: '', - dataTypeKey: 'dt-colorPicker', + dataTypeId: 'dt-colorPicker', variesByCulture: false, variesBySegment: false, validation: { @@ -40,12 +40,12 @@ export const data: Array = [ }, }, { - key: '3', - containerKey: 'all-properties-group-key', + id: '3', + containerId: 'all-properties-group-key', alias: 'contentPicker', name: 'Content Picker', description: '', - dataTypeKey: 'dt-contentPicker', + dataTypeId: 'dt-contentPicker', variesByCulture: false, variesBySegment: false, validation: { @@ -59,12 +59,12 @@ export const data: Array = [ }, }, { - key: '4', - containerKey: 'all-properties-group-key', + id: '4', + containerId: 'all-properties-group-key', alias: 'eyeDropper', name: 'Eye Dropper', description: '', - dataTypeKey: 'dt-eyeDropper', + dataTypeId: 'dt-eyeDropper', variesByCulture: false, variesBySegment: false, validation: { @@ -78,12 +78,12 @@ export const data: Array = [ }, }, { - key: '5', - containerKey: 'all-properties-group-key', + id: '5', + containerId: 'all-properties-group-key', alias: 'multiUrlPicker', name: 'Multi URL Picker', description: '', - dataTypeKey: 'dt-multiUrlPicker', + dataTypeId: 'dt-multiUrlPicker', variesByCulture: true, variesBySegment: false, validation: { @@ -97,12 +97,12 @@ export const data: Array = [ }, }, { - key: '6', - containerKey: 'all-properties-group-key', + id: '6', + containerId: 'all-properties-group-key', alias: 'multiNodeTreePicker', name: 'Multi Node Tree Picker', description: '', - dataTypeKey: 'dt-multiNodeTreePicker', + dataTypeId: 'dt-multiNodeTreePicker', variesByCulture: false, variesBySegment: false, validation: { @@ -116,12 +116,12 @@ export const data: Array = [ }, }, { - key: '7', - containerKey: 'all-properties-group-key', + id: '7', + containerId: 'all-properties-group-key', alias: 'datePicker', name: 'Date Picker', description: '', - dataTypeKey: 'dt-datePicker', + dataTypeId: 'dt-datePicker', variesByCulture: false, variesBySegment: false, validation: { @@ -135,12 +135,12 @@ export const data: Array = [ }, }, { - key: '8', - containerKey: 'all-properties-group-key', + id: '8', + containerId: 'all-properties-group-key', alias: 'email', name: 'Email', description: '', - dataTypeKey: 'dt-email', + dataTypeId: 'dt-email', variesByCulture: false, variesBySegment: false, validation: { @@ -154,12 +154,12 @@ export const data: Array = [ }, }, { - key: '9', - containerKey: 'all-properties-group-key', + id: '9', + containerId: 'all-properties-group-key', alias: 'textBox', name: 'Text Box', description: '', - dataTypeKey: 'dt-textBox', + dataTypeId: 'dt-textBox', variesByCulture: false, variesBySegment: false, validation: { @@ -173,12 +173,12 @@ export const data: Array = [ }, }, { - key: '19', - containerKey: 'all-properties-group-key', + id: '19', + containerId: 'all-properties-group-key', alias: 'dropdown', name: 'Dropdown', description: '', - dataTypeKey: 'dt-dropdown', + dataTypeId: 'dt-dropdown', variesByCulture: false, variesBySegment: false, validation: { @@ -192,12 +192,12 @@ export const data: Array = [ }, }, { - key: '11', - containerKey: 'all-properties-group-key', + id: '11', + containerId: 'all-properties-group-key', alias: 'textArea', name: 'Text Area', description: '', - dataTypeKey: 'dt-textArea', + dataTypeId: 'dt-textArea', variesByCulture: false, variesBySegment: false, validation: { @@ -211,12 +211,12 @@ export const data: Array = [ }, }, { - key: '12', - containerKey: 'all-properties-group-key', + id: '12', + containerId: 'all-properties-group-key', alias: 'slider', name: 'Slider', description: '', - dataTypeKey: 'dt-slider', + dataTypeId: 'dt-slider', variesByCulture: false, variesBySegment: false, validation: { @@ -230,12 +230,12 @@ export const data: Array = [ }, }, { - key: '13', - containerKey: 'all-properties-group-key', + id: '13', + containerId: 'all-properties-group-key', alias: 'toggle', name: 'Toggle', description: '', - dataTypeKey: 'dt-toggle', + dataTypeId: 'dt-toggle', variesByCulture: false, variesBySegment: false, validation: { @@ -249,12 +249,12 @@ export const data: Array = [ }, }, { - key: '14', - containerKey: 'all-properties-group-key', + id: '14', + containerId: 'all-properties-group-key', alias: 'tags', name: 'Tags', description: '', - dataTypeKey: 'dt-tags', + dataTypeId: 'dt-tags', variesByCulture: false, variesBySegment: false, validation: { @@ -268,12 +268,12 @@ export const data: Array = [ }, }, { - key: '15', - containerKey: 'all-properties-group-key', + id: '15', + containerId: 'all-properties-group-key', alias: 'markdownEditor', name: 'MarkdownEditor', description: '', - dataTypeKey: 'dt-markdownEditor', + dataTypeId: 'dt-markdownEditor', variesByCulture: false, variesBySegment: false, validation: { @@ -287,12 +287,12 @@ export const data: Array = [ }, }, { - key: '16', - containerKey: 'all-properties-group-key', + id: '16', + containerId: 'all-properties-group-key', alias: 'radioButtonList', name: 'Radio Button List', description: '', - dataTypeKey: 'dt-radioButtonList', + dataTypeId: 'dt-radioButtonList', variesByCulture: false, variesBySegment: false, validation: { @@ -306,12 +306,12 @@ export const data: Array = [ }, }, { - key: '17', - containerKey: 'all-properties-group-key', + id: '17', + containerId: 'all-properties-group-key', alias: 'checkboxList', name: 'Checkbox List', description: '', - dataTypeKey: 'dt-checkboxList', + dataTypeId: 'dt-checkboxList', variesByCulture: false, variesBySegment: false, validation: { @@ -325,12 +325,12 @@ export const data: Array = [ }, }, { - key: '18', - containerKey: 'all-properties-group-key', + id: '18', + containerId: 'all-properties-group-key', alias: 'blockList', name: 'Block List', description: '', - dataTypeKey: 'dt-blockList', + dataTypeId: 'dt-blockList', variesByCulture: false, variesBySegment: false, validation: { @@ -344,12 +344,12 @@ export const data: Array = [ }, }, { - key: '19', - containerKey: 'all-properties-group-key', + id: '19', + containerId: 'all-properties-group-key', alias: 'mediaPicker', name: 'Media Picker', description: '', - dataTypeKey: 'dt-mediaPicker', + dataTypeId: 'dt-mediaPicker', variesByCulture: false, variesBySegment: false, validation: { @@ -363,12 +363,12 @@ export const data: Array = [ }, }, { - key: '20', - containerKey: 'all-properties-group-key', + id: '20', + containerId: 'all-properties-group-key', alias: 'imageCropper', name: 'Image Cropper', description: '', - dataTypeKey: 'dt-imageCropper', + dataTypeId: 'dt-imageCropper', variesByCulture: false, variesBySegment: false, validation: { @@ -382,12 +382,12 @@ export const data: Array = [ }, }, { - key: '21', - containerKey: 'all-properties-group-key', + id: '21', + containerId: 'all-properties-group-key', alias: 'uploadField', name: 'Upload Field', description: '', - dataTypeKey: 'dt-uploadField', + dataTypeId: 'dt-uploadField', variesByCulture: false, variesBySegment: false, validation: { @@ -401,12 +401,12 @@ export const data: Array = [ }, }, { - key: '22', - containerKey: 'all-properties-group-key', + id: '22', + containerId: 'all-properties-group-key', alias: 'blockGrid', name: 'Block Grid', description: '', - dataTypeKey: 'dt-blockGrid', + dataTypeId: 'dt-blockGrid', variesByCulture: false, variesBySegment: false, validation: { @@ -420,12 +420,12 @@ export const data: Array = [ }, }, { - key: '23', - containerKey: 'all-properties-group-key', + id: '23', + containerId: 'all-properties-group-key', alias: 'blockGrid', name: 'Icon Picker', description: '', - dataTypeKey: 'dt-iconPicker', + dataTypeId: 'dt-iconPicker', variesByCulture: false, variesBySegment: false, validation: { @@ -439,12 +439,12 @@ export const data: Array = [ }, }, { - key: '24', - containerKey: 'all-properties-group-key', + id: '24', + containerId: 'all-properties-group-key', alias: 'numberRange', name: 'Number Range', description: '', - dataTypeKey: 'dt-numberRange', + dataTypeId: 'dt-numberRange', variesByCulture: false, variesBySegment: false, validation: { @@ -458,12 +458,12 @@ export const data: Array = [ }, }, { - key: '25', - containerKey: 'all-properties-group-key', + id: '25', + containerId: 'all-properties-group-key', alias: 'orderDirection', name: 'Order Direction', description: '', - dataTypeKey: 'dt-orderDirection', + dataTypeId: 'dt-orderDirection', variesByCulture: false, variesBySegment: false, validation: { @@ -477,12 +477,12 @@ export const data: Array = [ }, }, { - key: '26', - containerKey: 'all-properties-group-key', + id: '26', + containerId: 'all-properties-group-key', alias: 'overlaySize', name: 'Overlay Size', description: '', - dataTypeKey: 'dt-overlaySize', + dataTypeId: 'dt-overlaySize', variesByCulture: false, variesBySegment: false, validation: { @@ -496,12 +496,12 @@ export const data: Array = [ }, }, { - key: '27', - containerKey: 'all-properties-group-key', + id: '27', + containerId: 'all-properties-group-key', alias: 'label', name: 'Label', description: '', - dataTypeKey: 'dt-label', + dataTypeId: 'dt-label', variesByCulture: false, variesBySegment: false, validation: { @@ -515,12 +515,12 @@ export const data: Array = [ }, }, { - key: '28', - containerKey: 'all-properties-group-key', + id: '28', + containerId: 'all-properties-group-key', alias: 'integer', name: 'Integer', description: '', - dataTypeKey: 'dt-integer', + dataTypeId: 'dt-integer', variesByCulture: false, variesBySegment: false, validation: { @@ -534,12 +534,12 @@ export const data: Array = [ }, }, { - key: '29', - containerKey: 'all-properties-group-key', + id: '29', + containerId: 'all-properties-group-key', alias: 'decimal', name: 'Decimal', description: '', - dataTypeKey: 'dt-decimal', + dataTypeId: 'dt-decimal', variesByCulture: false, variesBySegment: false, validation: { @@ -553,12 +553,12 @@ export const data: Array = [ }, }, { - key: '30', - containerKey: 'all-properties-group-key', + id: '30', + containerId: 'all-properties-group-key', alias: 'memberPicker', name: 'Member Picker', description: '', - dataTypeKey: 'dt-memberPicker', + dataTypeId: 'dt-memberPicker', variesByCulture: false, variesBySegment: false, validation: { @@ -572,12 +572,12 @@ export const data: Array = [ }, }, { - key: '31', - containerKey: 'all-properties-group-key', + id: '31', + containerId: 'all-properties-group-key', alias: 'memberGroupPicker', name: 'Member Group Picker', description: '', - dataTypeKey: 'dt-memberGroupPicker', + dataTypeId: 'dt-memberGroupPicker', variesByCulture: false, variesBySegment: false, validation: { @@ -591,12 +591,12 @@ export const data: Array = [ }, }, { - key: '32', - containerKey: 'all-properties-group-key', + id: '32', + containerId: 'all-properties-group-key', alias: 'userPicker', name: 'User Picker', description: '', - dataTypeKey: 'dt-userPicker', + dataTypeId: 'dt-userPicker', variesByCulture: false, variesBySegment: false, validation: { @@ -612,8 +612,8 @@ export const data: Array = [ ], containers: [ { - key: 'all-properties-group-key', - parentKey: null, + id: 'all-properties-group-key', + parentId: null, name: 'Content', type: 'Group', sortOrder: 0, @@ -629,9 +629,9 @@ export const data: Array = [ }, { - allowedTemplateKeys: [], - defaultTemplateKey: null, - key: '29643452-cff9-47f2-98cd-7de4b6807681', + allowedTemplateIds: [], + defaultTemplateId: null, + id: '29643452-cff9-47f2-98cd-7de4b6807681', alias: 'blogPost', name: 'Blog Post', description: null, @@ -642,12 +642,12 @@ export const data: Array = [ isElement: false, properties: [ { - key: '5b4ca208-134e-4865-b423-06e5e97adf3c', - containerKey: 'c3cd2f12-b7c4-4206-8d8b-27c061589f75', + id: '5b4ca208-134e-4865-b423-06e5e97adf3c', + containerId: 'c3cd2f12-b7c4-4206-8d8b-27c061589f75', alias: 'blogPostText', name: 'Blog Post Text', description: null, - dataTypeKey: '0cc0eba1-9960-42c9-bf9b-60e150b429ae', + dataTypeId: '0cc0eba1-9960-42c9-bf9b-60e150b429ae', variesByCulture: false, variesBySegment: false, validation: { @@ -661,12 +661,12 @@ export const data: Array = [ }, }, { - key: 'ef7096b6-7c9e-49ba-8d49-395111e65ea2', - containerKey: '227d6ed2-e118-4494-b8f2-deb69854a56a', + id: 'ef7096b6-7c9e-49ba-8d49-395111e65ea2', + containerId: '227d6ed2-e118-4494-b8f2-deb69854a56a', alias: 'blogTextStringUnderMasterTab', name: 'Blog text string under master tab', description: null, - dataTypeKey: '0cc0eba1-9960-42c9-bf9b-60e150b429ae', + dataTypeId: '0cc0eba1-9960-42c9-bf9b-60e150b429ae', variesByCulture: true, variesBySegment: false, validation: { @@ -680,12 +680,12 @@ export const data: Array = [ }, }, { - key: 'e010c429-b298-499a-9bfe-79687af8972a', - containerKey: '22177c49-ecba-4f2e-b7fa-3f2c04d02cfb', + id: 'e010c429-b298-499a-9bfe-79687af8972a', + containerId: '22177c49-ecba-4f2e-b7fa-3f2c04d02cfb', alias: 'blogTextStringUnderGroupUnderMasterTab', name: 'Blog text string under group under master tab', description: null, - dataTypeKey: '0cc0eba1-9960-42c9-bf9b-60e150b429ae', + dataTypeId: '0cc0eba1-9960-42c9-bf9b-60e150b429ae', variesByCulture: true, variesBySegment: false, validation: { @@ -699,12 +699,12 @@ export const data: Array = [ }, }, { - key: '1a22749a-c7d2-44bb-b36b-c977c2ced6ef', - containerKey: '2c943997-b685-432d-a6c5-601d8e7a298a', + id: '1a22749a-c7d2-44bb-b36b-c977c2ced6ef', + containerId: '2c943997-b685-432d-a6c5-601d8e7a298a', alias: 'localBlogTabString', name: 'Local Blog Tab String', description: null, - dataTypeKey: '0cc0eba1-9960-42c9-bf9b-60e150b429ae', + dataTypeId: '0cc0eba1-9960-42c9-bf9b-60e150b429ae', variesByCulture: false, variesBySegment: false, validation: { @@ -718,12 +718,12 @@ export const data: Array = [ }, }, { - key: '22', - containerKey: '2c943997-b685-432d-a6c5-601d8e7a298a', + id: '22', + containerId: '2c943997-b685-432d-a6c5-601d8e7a298a', alias: 'blockGrid', name: 'Block Grid', description: '', - dataTypeKey: 'dt-blockGrid', + dataTypeId: 'dt-blockGrid', variesByCulture: false, variesBySegment: false, validation: { @@ -739,29 +739,29 @@ export const data: Array = [ ], containers: [ { - key: 'c3cd2f12-b7c4-4206-8d8b-27c061589f75', - parentKey: null, + id: 'c3cd2f12-b7c4-4206-8d8b-27c061589f75', + parentId: null, name: 'Content-group', type: 'Group', sortOrder: 0, }, { - key: '227d6ed2-e118-4494-b8f2-deb69854a56a', - parentKey: null, + id: '227d6ed2-e118-4494-b8f2-deb69854a56a', + parentId: null, name: 'Master Tab', type: 'Tab', sortOrder: 0, }, { - key: '22177c49-ecba-4f2e-b7fa-3f2c04d02cfb', - parentKey: '227d6ed2-e118-4494-b8f2-deb69854a56a', + id: '22177c49-ecba-4f2e-b7fa-3f2c04d02cfb', + parentId: '227d6ed2-e118-4494-b8f2-deb69854a56a', name: 'Blog Group under master tab', type: 'Group', sortOrder: 0, }, { - key: '2c943997-b685-432d-a6c5-601d8e7a298a', - parentKey: null, + id: '2c943997-b685-432d-a6c5-601d8e7a298a', + parentId: null, name: 'Local blog tab', type: 'Tab', sortOrder: 1, @@ -769,17 +769,17 @@ export const data: Array = [ ], allowedContentTypes: [ { - key: '29643452-cff9-47f2-98cd-7de4b6807681', + id: '29643452-cff9-47f2-98cd-7de4b6807681', sortOrder: 0, }, ], compositions: [ { - key: '5035d7d9-0a63-415c-9e75-ee2cf931db92', + id: '5035d7d9-0a63-415c-9e75-ee2cf931db92', compositionType: ContentTypeCompositionTypeModel.INHERITANCE, }, { - key: '8f68ba66-6fb2-4778-83b8-6ab4ca3a7c5d', + id: '8f68ba66-6fb2-4778-83b8-6ab4ca3a7c5d', compositionType: ContentTypeCompositionTypeModel.COMPOSITION, }, ], @@ -790,9 +790,9 @@ export const data: Array = [ }, }, { - allowedTemplateKeys: ['916cfecc-3295-490c-a16d-c41fa9f72980'], - defaultTemplateKey: '916cfecc-3295-490c-a16d-c41fa9f72980', - key: '5035d7d9-0a63-415c-9e75-ee2cf931db92', + allowedTemplateIds: ['916cfecc-3295-490c-a16d-c41fa9f72980'], + defaultTemplateId: '916cfecc-3295-490c-a16d-c41fa9f72980', + id: '5035d7d9-0a63-415c-9e75-ee2cf931db92', alias: 'masterPage', name: 'Master Page', description: null, @@ -803,12 +803,12 @@ export const data: Array = [ isElement: false, properties: [ { - key: '5e5f7456-c751-4846-9f2b-47965cc96ec6', - containerKey: '6f281e5a-0242-4649-bd9e-d6bf87f92b41', + id: '5e5f7456-c751-4846-9f2b-47965cc96ec6', + containerId: '6f281e5a-0242-4649-bd9e-d6bf87f92b41', alias: 'masterText', name: 'Master text', description: null, - dataTypeKey: '0cc0eba1-9960-42c9-bf9b-60e150b429ae', + dataTypeId: '0cc0eba1-9960-42c9-bf9b-60e150b429ae', variesByCulture: false, variesBySegment: false, validation: { @@ -824,8 +824,8 @@ export const data: Array = [ ], containers: [ { - key: '6f281e5a-0242-4649-bd9e-d6bf87f92b41', - parentKey: null, + id: '6f281e5a-0242-4649-bd9e-d6bf87f92b41', + parentId: null, name: 'Master Tab', type: 'Tab', sortOrder: 0, @@ -840,9 +840,9 @@ export const data: Array = [ }, }, { - allowedTemplateKeys: [], - defaultTemplateKey: null, - key: '8f68ba66-6fb2-4778-83b8-6ab4ca3a7c5d', + allowedTemplateIds: [], + defaultTemplateId: null, + id: '8f68ba66-6fb2-4778-83b8-6ab4ca3a7c5d', alias: 'baseElementType', name: 'Base Element Type', description: null, @@ -853,12 +853,12 @@ export const data: Array = [ isElement: true, properties: [ { - key: 'b92de6ac-1a22-4a45-a481-b6cae1cccbbf', - containerKey: '1e845ca8-1e3e-4b03-be1d-0b4149ce2129', + id: 'b92de6ac-1a22-4a45-a481-b6cae1cccbbf', + containerId: '1e845ca8-1e3e-4b03-be1d-0b4149ce2129', alias: 'pageTitle', name: 'Page title', description: null, - dataTypeKey: '0cc0eba1-9960-42c9-bf9b-60e150b429ae', + dataTypeId: '0cc0eba1-9960-42c9-bf9b-60e150b429ae', variesByCulture: false, variesBySegment: false, validation: { @@ -874,8 +874,8 @@ export const data: Array = [ ], containers: [ { - key: '1e845ca8-1e3e-4b03-be1d-0b4149ce2129', - parentKey: null, + id: '1e845ca8-1e3e-4b03-be1d-0b4149ce2129', + parentId: null, name: 'Content-group', type: 'Group', sortOrder: 0, @@ -890,13 +890,13 @@ export const data: Array = [ }, }, { - allowedTemplateKeys: [ + allowedTemplateIds: [ '2bf464b6-3aca-4388-b043-4eb439cc2643', '9a84c0b3-03b4-4dd4-84ac-706740ac0f71', '9a84c0b3-03b4-4dd4-84ac-706740ac0f72', ], - defaultTemplateKey: '2bf464b6-3aca-4388-b043-4eb439cc2643', - key: 'simple-document-type-key', + defaultTemplateId: '2bf464b6-3aca-4388-b043-4eb439cc2643', + id: 'simple-document-type-key', alias: 'simpleDocumentType', name: 'Simple Document Type', description: null, @@ -907,12 +907,12 @@ export const data: Array = [ isElement: false, properties: [ { - key: '1680d4d2-cda8-4ac2-affd-a69fc10382b1', - containerKey: '341b8521-fd43-4333-ae7a-a10cbbc6f4b0', + id: '1680d4d2-cda8-4ac2-affd-a69fc10382b1', + containerId: '341b8521-fd43-4333-ae7a-a10cbbc6f4b0', alias: 'prop1', name: 'Prop 1', description: null, - dataTypeKey: '0cc0eba1-9960-42c9-bf9b-60e150b429ae', + dataTypeId: '0cc0eba1-9960-42c9-bf9b-60e150b429ae', variesByCulture: false, variesBySegment: false, validation: { @@ -928,16 +928,16 @@ export const data: Array = [ ], containers: [ { - key: '341b8521-fd43-4333-ae7a-a10cbbc6f4b0', - parentKey: null, + id: '341b8521-fd43-4333-ae7a-a10cbbc6f4b0', + parentId: null, name: 'Content', type: 'Group', sortOrder: 0, }, ], allowedContentTypes: [ - { key: 'simple-document-type-key', sortOrder: 0 }, - { key: 'simple-document-type-2-key', sortOrder: 0 }, + { id: 'simple-document-type-key', sortOrder: 0 }, + { id: 'simple-document-type-2-key', sortOrder: 0 }, ], compositions: [], cleanup: { @@ -947,9 +947,9 @@ export const data: Array = [ }, }, { - allowedTemplateKeys: [], - defaultTemplateKey: null, - key: 'simple-document-type-2-key', + allowedTemplateIds: [], + defaultTemplateId: null, + id: 'simple-document-type-2-key', alias: 'simpleDocumentType2', name: 'Simple Document Type 2', description: null, @@ -960,12 +960,12 @@ export const data: Array = [ isElement: false, properties: [ { - key: '82d4b050-b128-42fe-ac8e-d5586e533592', - containerKey: 'b275052a-1868-4901-bc8c-2b35b78a9ab2', + id: '82d4b050-b128-42fe-ac8e-d5586e533592', + containerId: 'b275052a-1868-4901-bc8c-2b35b78a9ab2', alias: 'prop1', name: 'Prop 1', description: null, - dataTypeKey: '0cc0eba1-9960-42c9-bf9b-60e150b429ae', + dataTypeId: '0cc0eba1-9960-42c9-bf9b-60e150b429ae', variesByCulture: false, variesBySegment: false, validation: { @@ -979,12 +979,12 @@ export const data: Array = [ }, }, { - key: 'beadc69a-d669-4d01-9919-98bafba31e57', - containerKey: 'b275052a-1868-4901-bc8c-2b35b78a9ab2', + id: 'beadc69a-d669-4d01-9919-98bafba31e57', + containerId: 'b275052a-1868-4901-bc8c-2b35b78a9ab2', alias: 'prop2', name: 'Prop 2', description: null, - dataTypeKey: '0cc0eba1-9960-42c9-bf9b-60e150b429ae', + dataTypeId: '0cc0eba1-9960-42c9-bf9b-60e150b429ae', variesByCulture: false, variesBySegment: false, validation: { @@ -1000,14 +1000,14 @@ export const data: Array = [ ], containers: [ { - key: 'b275052a-1868-4901-bc8c-2b35b78a9ab2', - parentKey: null, + id: 'b275052a-1868-4901-bc8c-2b35b78a9ab2', + parentId: null, name: 'Content', type: 'Group', sortOrder: 0, }, ], - allowedContentTypes: [{ key: 'simple-document-type-key', sortOrder: 0 }], + allowedContentTypes: [{ id: 'simple-document-type-key', sortOrder: 0 }], compositions: [], cleanup: { preventCleanup: false, @@ -1023,39 +1023,49 @@ export const treeData: Array = [ name: 'All property editors document type', type: 'document-type', hasChildren: false, - key: 'all-property-editors-document-type-key', + id: 'all-property-editors-document-type-id', isContainer: false, - parentKey: null, + parentId: null, icon: '', }, { $type: 'DocumentTypeTreeItemViewModel', - name: 'Document Type 1', + name: 'Page Document Type', type: 'document-type', hasChildren: false, - key: 'd81c7957-153c-4b5a-aa6f-b434a4964624', + id: '29643452-cff9-47f2-98cd-7de4b6807681', isContainer: false, - parentKey: null, - icon: '', + parentId: null, + icon: 'umb:document', }, { $type: 'DocumentTypeTreeItemViewModel', - name: 'Document Type 2', + name: 'Page Document Type Compositional', type: 'document-type', hasChildren: false, - key: 'a99e4018-3ffc-486b-aa76-eecea9593d17', + id: '5035d7d9-0a63-415c-9e75-ee2cf931db92', isContainer: false, - parentKey: null, - icon: '', + parentId: null, + icon: 'umb:document', + }, + { + $type: 'DocumentTypeTreeItemViewModel', + name: 'Page Document Type Inherited', + type: 'document-type', + hasChildren: false, + id: '8f68ba66-6fb2-4778-83b8-6ab4ca3a7c5d', + isContainer: false, + parentId: null, + icon: 'umb:document', }, { $type: 'DocumentTypeTreeItemViewModel', name: 'Simple Document Type', type: 'document-type', hasChildren: false, - key: 'simple-document-type-key', + id: 'simple-document-type-key', isContainer: false, - parentKey: null, + parentId: null, icon: 'umb:document', }, { @@ -1063,9 +1073,9 @@ export const treeData: Array = [ name: 'Simple Document Type 2', type: 'document-type', hasChildren: false, - key: 'simple-document-type-2-key', + id: 'simple-document-type-2-key', isContainer: false, - parentKey: null, + parentId: null, icon: 'umb:document', }, ]; @@ -1082,24 +1092,24 @@ class UmbDocumentTypeData extends UmbEntityData { } getTreeRoot(): Array { - const rootItems = this.treeData.filter((item) => item.parentKey === null); + const rootItems = this.treeData.filter((item) => item.parentId === null); return rootItems.map((item) => createDocumentTypeTreeItem(item)); } - getTreeItemChildren(key: string): Array { - const childItems = this.treeData.filter((item) => item.parentKey === key); + getTreeItemChildren(id: string): Array { + const childItems = this.treeData.filter((item) => item.parentId === id); return childItems.map((item) => createDocumentTypeTreeItem(item)); } - getTreeItem(keys: Array): Array { - const items = this.treeData.filter((item) => keys.includes(item.key ?? '')); + getTreeItem(ids: Array): Array { + const items = this.treeData.filter((item) => ids.includes(item.id ?? '')); return items.map((item) => createDocumentTypeTreeItem(item)); } - getAllowedTypesOf(key: string): Array { - const documentType = this.getByKey(key); - const allowedTypeKeys = documentType?.allowedContentTypes?.map((documentType) => documentType.key) ?? []; - const items = this.treeData.filter((item) => allowedTypeKeys.includes(item.key ?? '')); + getAllowedTypesOf(id: string): Array { + const documentType = this.getById(id); + const allowedTypeKeys = documentType?.allowedContentTypes?.map((documentType) => documentType.id) ?? []; + const items = this.treeData.filter((item) => allowedTypeKeys.includes(item.id ?? '')); return items.map((item) => createDocumentTypeTreeItem(item)); } } diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/document.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/document.data.ts index e1fa80708c..15224b187d 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/document.data.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/document.data.ts @@ -15,9 +15,9 @@ export const data: Array = [ url: '/', }, ], - templateKey: null, - key: 'all-property-editors-document-key', - contentTypeKey: 'all-property-editors-document-type-key', + templateId: null, + id: 'all-property-editors-document-id', + contentTypeId: 'all-property-editors-document-type-id', values: [ { $type: '', @@ -305,9 +305,9 @@ export const data: Array = [ url: '/', }, ], - templateKey: null, - key: 'c05da24d-7740-447b-9cdc-bd8ce2172e38', - contentTypeKey: '29643452-cff9-47f2-98cd-7de4b6807681', + templateId: null, + id: 'c05da24d-7740-447b-9cdc-bd8ce2172e38', + contentTypeId: '29643452-cff9-47f2-98cd-7de4b6807681', values: [ { $type: '', @@ -435,9 +435,9 @@ export const data: Array = [ }, { urls: [], - templateKey: null, - key: 'fd56a0b5-01a0-4da2-b428-52773bfa9cc4', - contentTypeKey: '29643452-cff9-47f2-98cd-7de4b6807681', + templateId: null, + id: 'fd56a0b5-01a0-4da2-b428-52773bfa9cc4', + contentTypeId: '29643452-cff9-47f2-98cd-7de4b6807681', values: [ { $type: '', @@ -511,9 +511,9 @@ export const data: Array = [ }, { urls: [], - templateKey: null, - key: 'simple-document-key', - contentTypeKey: 'simple-document-type-key', + templateId: null, + id: 'simple-document-id', + contentTypeId: 'simple-document-type-id', variants: [ { $type: '', @@ -537,9 +537,9 @@ export const treeData: Array = [ isEdited: false, noAccess: false, isTrashed: false, - key: 'all-property-editors-document-key', + id: 'all-property-editors-document-id', isContainer: false, - parentKey: null, + parentId: null, name: 'All property editors', type: 'document', icon: 'document', @@ -552,9 +552,9 @@ export const treeData: Array = [ isEdited: false, noAccess: false, isTrashed: false, - key: 'c05da24d-7740-447b-9cdc-bd8ce2172e38', + id: 'c05da24d-7740-447b-9cdc-bd8ce2172e38', isContainer: false, - parentKey: null, + parentId: null, name: 'Article in english', type: 'document', icon: 'document', @@ -567,9 +567,9 @@ export const treeData: Array = [ isEdited: false, noAccess: false, isTrashed: false, - key: 'fd56a0b5-01a0-4da2-b428-52773bfa9cc4', + id: 'fd56a0b5-01a0-4da2-b428-52773bfa9cc4', isContainer: false, - parentKey: 'c05da24d-7740-447b-9cdc-bd8ce2172e38', + parentId: 'c05da24d-7740-447b-9cdc-bd8ce2172e38', name: 'Blog post B', type: 'document', icon: 'document', @@ -581,9 +581,9 @@ export const treeData: Array = [ type: 'document', icon: 'document', hasChildren: false, - key: 'f6n7a5b2-e7c1-463a-956bc-6ck5b9bdf447', + id: 'f6n7a5b2-e7c1-463a-956bc-6ck5b9bdf447', isContainer: false, - parentKey: 'cdd30288-2d1c-41b4-89a9-61647b4a10d5', + parentId: 'cdd30288-2d1c-41b4-89a9-61647b4a10d5', noAccess: false, isProtected: false, isPublished: false, @@ -596,9 +596,9 @@ export const treeData: Array = [ type: 'document', icon: 'document', hasChildren: false, - key: 'simple-document-key', + id: 'simple-document-id', isContainer: false, - parentKey: null, + parentId: null, noAccess: false, isProtected: false, isPublished: false, @@ -619,21 +619,21 @@ class UmbDocumentData extends UmbEntityData { } getTreeRoot(): PagedDocumentTreeItemResponseModel { - const items = this.treeData.filter((item) => item.parentKey === null); + const items = this.treeData.filter((item) => item.parentId === null); const treeItems = items.map((item) => createDocumentTreeItem(item)); const total = items.length; return { items: treeItems, total }; } - getTreeItemChildren(key: string): PagedDocumentTreeItemResponseModel { - const items = this.treeData.filter((item) => item.parentKey === key); + getTreeItemChildren(id: string): PagedDocumentTreeItemResponseModel { + const items = this.treeData.filter((item) => item.parentId === id); const treeItems = items.map((item) => createDocumentTreeItem(item)); const total = items.length; return { items: treeItems, total }; } - getTreeItem(keys: Array): Array { - const items = this.treeData.filter((item) => keys.includes(item.key ?? '')); + getTreeItem(ids: Array): Array { + const items = this.treeData.filter((item) => ids.includes(item.id ?? '')); return items.map((item) => createDocumentTreeItem(item)); } } diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/entity.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/entity.data.ts index d2e43b9f49..d3a7356430 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/entity.data.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/entity.data.ts @@ -11,16 +11,26 @@ export class UmbEntityData extends UmbData { return this.data.slice(skip, skip + take); } - getByKey(key: string) { - return this.data.find((item) => item.key === key); + getById(id: string) { + return this.data.find((item) => item.id === id); } - getByKeys(keys: Array) { - return this.data.filter((item) => keys.includes(item.key)); + getByIds(ids: Array) { + return this.data.filter((item) => ids.includes(item.id)); + } + + insert(item: T) { + const exits = this.data.find((i) => i.id === item.id); + + if (exits) { + throw new Error(`Item with key ${item.id} already exists`); + } + + this.data.push(item); } save(saveItem: T) { - const foundIndex = this.data.findIndex((item) => item.key === saveItem.key); + const foundIndex = this.data.findIndex((item) => item.id === saveItem.id); if (foundIndex !== -1) { // update this.data[foundIndex] = saveItem; @@ -33,12 +43,12 @@ export class UmbEntityData extends UmbData { return saveItem; } - move(keys: Array, destinationKey: string) { - const items = this.getByKeys(keys); + move(ids: Array, destinationKey: string) { + const items = this.getByIds(ids); const movedItems = items.map((item) => { return { ...item, - parentKey: destinationKey, + parentId: destinationKey, }; }); @@ -46,11 +56,11 @@ export class UmbEntityData extends UmbData { return movedItems; } - trash(keys: Array) { + trash(ids: Array) { const trashedItems: Array = []; - keys.forEach((key) => { - const item = this.getByKey(key); + ids.forEach((id) => { + const item = this.getById(id); if (!item) return; // TODO: how do we handle trashed items? @@ -65,17 +75,18 @@ export class UmbEntityData extends UmbData { return trashedItems; } - delete(keys: Array) { - const deletedKeys = this.data.filter((item) => keys.includes(item.key)).map((item) => item.key); - this.data = this.data.filter((item) => keys.indexOf(item.key) === -1); + delete(ids: Array) { + const deletedKeys = this.data.filter((item) => ids.includes(item.id)).map((item) => item.id); + this.data = this.data.filter((item) => ids.indexOf(item.id) === -1); return deletedKeys; } protected updateData(updateItem: T) { - const itemIndex = this.data.findIndex((item) => item.key === updateItem.key); + const itemIndex = this.data.findIndex((item) => item.id === updateItem.id); const item = this.data[itemIndex]; if (!item) return; + // TODO: revisit this code, seems like something we can solve smarter/type safer now: const itemKeys = Object.keys(item); const newItem = {}; diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/health-check.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/health-check.data.ts index d0afe79a92..b21934a28f 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/health-check.data.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/health-check.data.ts @@ -25,7 +25,7 @@ export const healthGroups: Arrayyour@email.here.`, @@ -51,7 +51,7 @@ export const healthGroups: Array { return this.data.slice(skip, take); } - getByKey(key: string) { - return this.data.find((item) => item.isoCode === key); + getByKey(isoCode: string) { + return this.data.find((item) => item.isoCode === isoCode); } insert(language: LanguageResponseModel) { @@ -49,15 +49,15 @@ class UmbLanguagesData extends UmbData { return this.data; } - delete(keys: Array) { - keys.forEach((key) => { - const foundIndex = this.data.findIndex((item) => item.isoCode === key); + delete(isoCodes: Array) { + isoCodes.forEach((isoCode) => { + const foundIndex = this.data.findIndex((item) => item.isoCode === isoCode); if (foundIndex !== -1) { this.data.splice(foundIndex, 1); } }); - return keys; + return isoCodes; } updateData(updateItem: LanguageResponseModel) { diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/log-viewer.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/log-viewer.data.ts index fcf544de4b..30ea41f140 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/log-viewer.data.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/log-viewer.data.ts @@ -1,9 +1,13 @@ import { logs } from './logs.data'; import { UmbData } from './data'; -import { LogMessageResponseModel, LogTemplateResponseModel, SavedLogSearchResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import { + LogMessageResponseModel, + LogTemplateResponseModel, + SavedLogSearchResponseModel, +} from '@umbraco-cms/backoffice/backend-api'; // Temp mocked database -class UmbLogviewerSearchesData extends UmbData { +class UmbLogViewerSearchesData extends UmbData { constructor(data: SavedLogSearchResponseModel[]) { super(data); } @@ -405,8 +409,8 @@ export const logLevels = { ], }; -export const umbLogviewerData = { - searches: new UmbLogviewerSearchesData(savedSearches), +export const umbLogViewerData = { + searches: new UmbLogViewerSearchesData(savedSearches), templates: new UmbLogviewerTemplatesData(messageTemplates), logs: new UmbLogviewerMessagesData(logs), logLevels: logLevels, diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/media-type.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/media-type.data.ts index 151158303a..601f5fc6c3 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/media-type.data.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/media-type.data.ts @@ -9,9 +9,9 @@ export const data: Array = [ name: 'Media Type 1', type: 'media-type', hasChildren: false, - key: 'c5159663-eb82-43ee-bd23-e42dc5e71db6', + id: 'c5159663-eb82-43ee-bd23-e42dc5e71db6', isContainer: false, - parentKey: null, + parentId: null, isFolder: false, icon: '', alias: 'mediaType1', @@ -22,9 +22,9 @@ export const data: Array = [ name: 'Media Type 2', type: 'media-type', hasChildren: false, - key: '22da1b0b-c310-4730-9912-c30b3eb9802e', + id: '22da1b0b-c310-4730-9912-c30b3eb9802e', isContainer: false, - parentKey: null, + parentId: null, isFolder: false, icon: '', alias: 'mediaType2', @@ -42,21 +42,21 @@ class UmbMediaTypeData extends UmbEntityData { } getTreeRoot(): PagedFolderTreeItemResponseModel { - const items = this.data.filter((item) => item.parentKey === null); + const items = this.data.filter((item) => item.parentId === null); const treeItems = items.map((item) => createFolderTreeItem(item)); const total = items.length; return { items: treeItems, total }; } - getTreeItemChildren(key: string): PagedFolderTreeItemResponseModel { - const items = this.data.filter((item) => item.parentKey === key); + getTreeItemChildren(id: string): PagedFolderTreeItemResponseModel { + const items = this.data.filter((item) => item.parentId === id); const treeItems = items.map((item) => createFolderTreeItem(item)); const total = items.length; return { items: treeItems, total }; } - getTreeItem(keys: Array): Array { - const items = this.data.filter((item) => keys.includes(item.key ?? '')); + getTreeItem(ids: Array): Array { + const items = this.data.filter((item) => ids.includes(item.id ?? '')); return items.map((item) => createFolderTreeItem(item)); } } diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/media.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/media.data.ts index 82f1c4d25a..31a930b596 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/media.data.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/media.data.ts @@ -10,9 +10,9 @@ export const data: Array = [ type: 'media', icon: 'picture', hasChildren: false, - key: 'f2f81a40-c989-4b6b-84e2-057cecd3adc1', + id: 'f2f81a40-c989-4b6b-84e2-057cecd3adc1', isContainer: false, - parentKey: null, + parentId: null, noAccess: false, isTrashed: false, properties: [ @@ -20,7 +20,7 @@ export const data: Array = [ alias: 'myMediaHeadline', label: 'Media Headline', description: 'Text string property', - dataTypeKey: 'dt-textBox', + dataTypeId: 'dt-textBox', }, ], data: [ @@ -37,9 +37,9 @@ export const data: Array = [ type: 'media', icon: 'picture', hasChildren: false, - key: '69431027-8867-45bf-a93b-72bbdabfb177', + id: '69431027-8867-45bf-a93b-72bbdabfb177', isContainer: false, - parentKey: null, + parentId: null, noAccess: false, isTrashed: false, properties: [ @@ -47,7 +47,7 @@ export const data: Array = [ alias: 'myMediaDescription', label: 'Description', description: 'Textarea property', - dataTypeKey: 'dt-textArea', + dataTypeId: 'dt-textArea', }, ], data: [ @@ -64,9 +64,9 @@ export const data: Array = [ type: 'media', icon: 'folder', hasChildren: true, - key: '69461027-8867-45bf-a93b-72bbdabfb177', + id: '69461027-8867-45bf-a93b-72bbdabfb177', isContainer: true, - parentKey: null, + parentId: null, noAccess: false, isTrashed: false, properties: [], @@ -79,9 +79,9 @@ export const data: Array = [ type: 'media', icon: 'folder', hasChildren: true, - key: '69461027-8867-45bf-a93b-5224dabfb177', + id: '69461027-8867-45bf-a93b-5224dabfb177', isContainer: true, - parentKey: null, + parentId: null, noAccess: false, isTrashed: false, properties: [], @@ -94,9 +94,9 @@ export const data: Array = [ type: 'media', icon: 'picture', hasChildren: false, - key: '69431027-8867-45s7-a93b-7uibdabfb177', + id: '69431027-8867-45s7-a93b-7uibdabfb177', isContainer: false, - parentKey: '69461027-8867-45bf-a93b-72bbdabfb177', + parentId: '69461027-8867-45bf-a93b-72bbdabfb177', noAccess: false, isTrashed: false, properties: [ @@ -104,7 +104,7 @@ export const data: Array = [ alias: 'myMediaDescription', label: 'Description', description: 'Textarea property', - dataTypeKey: 'dt-textArea', + dataTypeId: 'dt-textArea', }, ], data: [ @@ -121,9 +121,9 @@ export const data: Array = [ type: 'media', icon: 'picture', hasChildren: false, - key: '69431027-8867-45s7-a93b-7uibdabf2147', + id: '69431027-8867-45s7-a93b-7uibdabf2147', isContainer: false, - parentKey: '69461027-8867-45bf-a93b-72bbdabfb177', + parentId: '69461027-8867-45bf-a93b-72bbdabfb177', noAccess: false, isTrashed: false, properties: [ @@ -131,7 +131,7 @@ export const data: Array = [ alias: 'myMediaDescription', label: 'Description', description: 'Textarea property', - dataTypeKey: 'dt-textArea', + dataTypeId: 'dt-textArea', }, ], data: [ @@ -148,9 +148,9 @@ export const data: Array = [ type: 'media', icon: 'picture', hasChildren: false, - key: '694hdj27-8867-45s7-a93b-7uibdabf2147', + id: '694hdj27-8867-45s7-a93b-7uibdabf2147', isContainer: false, - parentKey: '69461027-8867-45bf-a93b-5224dabfb177', + parentId: '69461027-8867-45bf-a93b-5224dabfb177', noAccess: false, isTrashed: false, properties: [ @@ -158,7 +158,7 @@ export const data: Array = [ alias: 'myMediaDescription', label: 'Description', description: 'Textarea property', - dataTypeKey: 'dt-textArea', + dataTypeId: 'dt-textArea', }, ], data: [ @@ -175,9 +175,9 @@ export const data: Array = [ type: 'media', icon: 'picture', hasChildren: false, - key: '694hdj27-1237-45s7-a93b-7uibdabfas47', + id: '694hdj27-1237-45s7-a93b-7uibdabfas47', isContainer: false, - parentKey: '69461027-8867-45bf-a93b-5224dabfb177', + parentId: '69461027-8867-45bf-a93b-5224dabfb177', noAccess: false, isTrashed: false, properties: [ @@ -185,7 +185,7 @@ export const data: Array = [ alias: 'myMediaDescription', label: 'Description', description: 'Textarea property', - dataTypeKey: 'dt-textArea', + dataTypeId: 'dt-textArea', }, ], data: [ @@ -208,21 +208,21 @@ class UmbMediaData extends UmbEntityData { } getTreeRoot(): PagedContentTreeItemResponseModel { - const items = this.data.filter((item) => item.parentKey === null); + const items = this.data.filter((item) => item.parentId === null); const treeItems = items.map((item) => createContentTreeItem(item)); const total = items.length; return { items: treeItems, total }; } - getTreeItemChildren(key: string): PagedContentTreeItemResponseModel { - const items = this.data.filter((item) => item.parentKey === key); + getTreeItemChildren(id: string): PagedContentTreeItemResponseModel { + const items = this.data.filter((item) => item.parentId === id); const treeItems = items.map((item) => createContentTreeItem(item)); const total = items.length; return { items: treeItems, total }; } - getTreeItem(keys: Array): Array { - const items = this.data.filter((item) => keys.includes(item.key)); + getTreeItem(ids: Array): Array { + const items = this.data.filter((item) => ids.includes(item.id)); return items.map((item) => createContentTreeItem(item)); } } diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/member-group.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/member-group.data.ts index 43dd431745..db2d57d5e7 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/member-group.data.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/member-group.data.ts @@ -10,9 +10,9 @@ export const data: Array = [ type: 'member-group', icon: 'umb:document', hasChildren: false, - key: '76708ccd-4179-464c-b694-6969149dd9f9', + id: '76708ccd-4179-464c-b694-6969149dd9f9', isContainer: false, - parentKey: null, + parentId: null, }, ]; @@ -26,21 +26,21 @@ class UmbMemberGroupData extends UmbEntityData { } getTreeRoot(): PagedEntityTreeItemResponseModel { - const items = this.data.filter((item) => item.parentKey === null); + const items = this.data.filter((item) => item.parentId === null); const treeItems = items.map((item) => createEntityTreeItem(item)); const total = items.length; return { items: treeItems, total }; } - getTreeItemChildren(key: string): PagedEntityTreeItemResponseModel { - const items = this.data.filter((item) => item.parentKey === key); + getTreeItemChildren(id: string): PagedEntityTreeItemResponseModel { + const items = this.data.filter((item) => item.parentId === id); const treeItems = items.map((item) => createEntityTreeItem(item)); const total = items.length; return { items: treeItems, total }; } - getTreeItem(keys: Array): Array { - const items = this.data.filter((item) => keys.includes(item.key ?? '')); + getTreeItem(ids: Array): Array { + const items = this.data.filter((item) => ids.includes(item.id ?? '')); return items.map((item) => createEntityTreeItem(item)); } } diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/member-type.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/member-type.data.ts index 0e548edd1b..7200916cb4 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/member-type.data.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/member-type.data.ts @@ -10,9 +10,9 @@ export const data: Array = [ type: 'member-type', icon: 'icon-user', hasChildren: false, - key: 'd59be02f-1df9-4228-aa1e-01917d806cda', + id: 'd59be02f-1df9-4228-aa1e-01917d806cda', isContainer: false, - parentKey: null, + parentId: null, alias: 'memberType1', properties: [], }, @@ -25,21 +25,21 @@ class UmbMemberTypeData extends UmbData { } getTreeRoot(): PagedEntityTreeItemResponseModel { - const items = this.data.filter((item) => item.parentKey === null); + const items = this.data.filter((item) => item.parentId === null); const treeItems = items.map((item) => createEntityTreeItem(item)); const total = items.length; return { items: treeItems, total }; } - getTreeItemChildren(key: string): PagedEntityTreeItemResponseModel { - const items = this.data.filter((item) => item.parentKey === key); + getTreeItemChildren(id: string): PagedEntityTreeItemResponseModel { + const items = this.data.filter((item) => item.parentId === id); const treeItems = items.map((item) => createEntityTreeItem(item)); const total = items.length; return { items: treeItems, total }; } - getTreeItem(keys: Array): Array { - const items = this.data.filter((item) => keys.includes(item.key ?? '')); + getTreeItem(ids: Array): Array { + const items = this.data.filter((item) => ids.includes(item.id ?? '')); return items.map((item) => createEntityTreeItem(item)); } } diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/member.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/member.data.ts index 5eb713016a..75faed9860 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/member.data.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/member.data.ts @@ -13,9 +13,9 @@ export const data: Array = [ type: 'member', icon: 'umb:user', hasChildren: false, - key: 'aaa08ccd-4179-464c-b634-6969149dd9f9', + id: 'aaa08ccd-4179-464c-b634-6969149dd9f9', isContainer: false, - parentKey: null, + parentId: null, }, ]; @@ -29,21 +29,21 @@ class UmbMemberData extends UmbEntityData { } getTreeRoot(): PagedEntityTreeItemResponseModel { - const items = this.data.filter((item) => item.parentKey === null); + const items = this.data.filter((item) => item.parentId === null); const treeItems = items.map((item) => createEntityTreeItem(item)); const total = items.length; return { items: treeItems, total }; } - getTreeItemChildren(key: string): PagedEntityTreeItemResponseModel { - const items = this.data.filter((item) => item.parentKey === key); + getTreeItemChildren(id: string): PagedEntityTreeItemResponseModel { + const items = this.data.filter((item) => item.parentId === id); const treeItems = items.map((item) => createEntityTreeItem(item)); const total = items.length; return { items: treeItems, total }; } - getTreeItem(keys: Array): Array { - const items = this.data.filter((item) => keys.includes(item.key ?? '')); + getTreeItem(ids: Array): Array { + const items = this.data.filter((item) => ids.includes(item.id ?? '')); return items.map((item) => createEntityTreeItem(item)); } } diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/relation-type.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/relation-type.data.ts index 93a7911735..c39f9dc2e4 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/relation-type.data.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/relation-type.data.ts @@ -5,7 +5,7 @@ import type { EntityTreeItemResponseModel, RelationTypeResponseModel } from '@um // TODO: investigate why we don't get an entity type as part of the RelationTypeResponseModel export const data: Array = [ { - key: 'e0d39ff5-71d8-453f-b682-9d8d31ee5e06', + id: 'e0d39ff5-71d8-453f-b682-9d8d31ee5e06', alias: 'relateDocumentOnCopy', name: 'Relate Document On Copy', path: '', @@ -18,7 +18,7 @@ export const data: Array = [ childObjectTypeName: 'Document', }, { - key: 'ac68cde6-763f-4231-a751-1101b57defd2', + id: 'ac68cde6-763f-4231-a751-1101b57defd2', alias: 'relateParentDocumentOnDelete', name: 'Relate Parent Document On Delete', path: '', @@ -31,7 +31,7 @@ export const data: Array = [ childObjectTypeName: 'Document', }, { - key: '6f9b800c-762c-42d4-85d9-bf40a77d689e', + id: '6f9b800c-762c-42d4-85d9-bf40a77d689e', alias: 'relateParentMediaFolderOnDelete', name: 'Relate Parent Media Folder On Delete', path: '', @@ -44,7 +44,7 @@ export const data: Array = [ childObjectTypeName: 'Document', }, { - key: 'd421727d-43de-4205-b4c6-037404f309ad', + id: 'd421727d-43de-4205-b4c6-037404f309ad', alias: 'relatedMedia', name: 'Related Media', path: '', @@ -57,7 +57,7 @@ export const data: Array = [ childObjectTypeName: 'Document', }, { - key: 'e9a0a28e-2d5b-4229-ac00-66f2df230513', + id: 'e9a0a28e-2d5b-4229-ac00-66f2df230513', alias: 'relatedDocument', name: 'Related Document', path: '', @@ -73,46 +73,46 @@ export const data: Array = [ export const treeData: Array = [ { - key: 'e0d39ff5-71d8-453f-b682-9d8d31ee5e06', + id: 'e0d39ff5-71d8-453f-b682-9d8d31ee5e06', $type: 'EntityTreeItemViewModel', isContainer: false, - parentKey: null, + parentId: null, name: 'Relate Document On Copy', icon: 'umb:trafic', type: 'relation-type', }, { - key: 'ac68cde6-763f-4231-a751-1101b57defd2', + id: 'ac68cde6-763f-4231-a751-1101b57defd2', $type: 'EntityTreeItemViewModel', isContainer: false, - parentKey: null, + parentId: null, name: 'Relate Parent Document On Delete', icon: 'umb:trafic', type: 'relation-type', }, { - key: '6f9b800c-762c-42d4-85d9-bf40a77d689e', + id: '6f9b800c-762c-42d4-85d9-bf40a77d689e', $type: 'EntityTreeItemViewModel', isContainer: false, - parentKey: null, + parentId: null, name: 'Relate Parent Media Folder On Delete', icon: 'umb:trafic', type: 'relation-type', }, { - key: 'd421727d-43de-4205-b4c6-037404f309ad', + id: 'd421727d-43de-4205-b4c6-037404f309ad', $type: 'EntityTreeItemViewModel', isContainer: false, - parentKey: null, + parentId: null, name: 'Related Media', icon: 'umb:trafic', type: 'relation-type', }, { - key: 'e9a0a28e-2d5b-4229-ac00-66f2df230513', + id: 'e9a0a28e-2d5b-4229-ac00-66f2df230513', $type: 'EntityTreeItemViewModel', isContainer: false, - parentKey: null, + parentId: null, name: 'Related Document', icon: 'umb:trafic', type: 'relation-type', @@ -136,13 +136,13 @@ class UmbRelationTypeData extends UmbEntityData { } //TODO Can relation types have children? - getTreeItemChildren(key: string): Array { - const childItems = this.treeData.filter((item) => item.parentKey === key); + getTreeItemChildren(id: string): Array { + const childItems = this.treeData.filter((item) => item.parentId === id); return childItems.map((item) => createEntityTreeItem(item)); } - getTreeItem(keys: Array): Array { - const items = this.treeData.filter((item) => keys.includes(item.key ?? '')); + getTreeItem(ids: Array): Array { + const items = this.treeData.filter((item) => ids.includes(item.id ?? '')); return items.map((item) => createEntityTreeItem(item)); } } diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/template.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/template.data.ts index 210f4b48d5..70a5fc11f8 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/template.data.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/template.data.ts @@ -14,7 +14,7 @@ type TemplateDBItem = TemplateResponseModel & EntityTreeItemResponseModel; const createTemplate = (dbItem: TemplateDBItem): TemplateResponseModel => { return { $type: '', - key: dbItem.key, + id: dbItem.id, name: dbItem.name, alias: dbItem.alias, content: dbItem.content, @@ -24,9 +24,9 @@ const createTemplate = (dbItem: TemplateDBItem): TemplateResponseModel => { export const data: Array = [ { $type: '', - key: '2bf464b6-3aca-4388-b043-4eb439cc2643', + id: '2bf464b6-3aca-4388-b043-4eb439cc2643', isContainer: false, - parentKey: null, + parentId: null, name: 'Doc 1', type: 'template', icon: 'icon-layout', @@ -37,7 +37,7 @@ export const data: Array = [ @{ if (Model?.Areas.Any() != true) { return; } } - +
    @foreach (var area in Model.Areas) @@ -48,9 +48,9 @@ export const data: Array = [ }, { $type: '', - key: '9a84c0b3-03b4-4dd4-84ac-706740ac0f71', + id: '9a84c0b3-03b4-4dd4-84ac-706740ac0f71', isContainer: false, - parentKey: null, + parentId: null, name: 'Test', type: 'template', icon: 'icon-layout', @@ -61,9 +61,9 @@ export const data: Array = [ }, { $type: '', - key: '9a84c0b3-03b4-4dd4-84ac-706740ac0f72', + id: '9a84c0b3-03b4-4dd4-84ac-706740ac0f72', isContainer: false, - parentKey: '9a84c0b3-03b4-4dd4-84ac-706740ac0f71', + parentId: '9a84c0b3-03b4-4dd4-84ac-706740ac0f71', name: 'Child', type: 'template', icon: 'icon-layout', @@ -87,8 +87,8 @@ class UmbTemplateData extends UmbEntityData { super(data); } - getByKey(key: string): TemplateResponseModel | undefined { - const item = this.data.find((item) => item.key === key); + getById(id: string): TemplateResponseModel | undefined { + const item = this.data.find((item) => item.id === id); return item ? createTemplate(item) : undefined; } @@ -101,7 +101,7 @@ class UmbTemplateData extends UmbEntityData { create(templateData: TemplateModelBaseModel) { const template = { $type: '', - key: uuid(), + id: uuid(), ...templateData, }; this.data.push(template); @@ -114,21 +114,21 @@ class UmbTemplateData extends UmbEntityData { } getTreeRoot(): PagedEntityTreeItemResponseModel { - const items = this.data.filter((item) => item.parentKey === null); + const items = this.data.filter((item) => item.parentId === null); const treeItems = items.map((item) => createEntityTreeItem(item)); const total = items.length; return { items: treeItems, total }; } - getTreeItemChildren(key: string): PagedEntityTreeItemResponseModel { - const items = this.data.filter((item) => item.parentKey === key); + getTreeItemChildren(id: string): PagedEntityTreeItemResponseModel { + const items = this.data.filter((item) => item.parentId === id); const treeItems = items.map((item) => createEntityTreeItem(item)); const total = items.length; return { items: treeItems, total }; } - getTreeItem(keys: Array): Array { - const items = this.data.filter((item) => keys.includes(item.key ?? '')); + getTreeItem(ids: Array): Array { + const items = this.data.filter((item) => ids.includes(item.id ?? '')); return items.map((item) => createEntityTreeItem(item)); } } diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/user-groups.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/user-groups.data.ts index 4da8dbb21c..3c4b99b1ca 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/user-groups.data.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/user-groups.data.ts @@ -14,10 +14,10 @@ class UmbUserGroupsData extends UmbEntityData { export const data: Array = [ { - key: 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', + id: 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', name: 'Administrators', icon: 'umb:medal', - parentKey: '', + parentId: '', type: 'user-group', hasChildren: false, sections: [ @@ -31,10 +31,10 @@ export const data: Array = [ permissions: [], }, { - key: '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', + id: '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', name: 'Workspaces', icon: 'umb:tools', - parentKey: '', + parentId: '', type: 'user-group', hasChildren: false, sections: ['Umb.Section.Members', 'Umb.Section.Media'], @@ -42,10 +42,10 @@ export const data: Array = [ contentStartNode: '74e4008a-ea4f-4793-b924-15e02fd380d1', }, { - key: 'b847398a-6875-4d7a-9f6d-231256b81471', + id: 'b847398a-6875-4d7a-9f6d-231256b81471', name: 'Sensitive Data', icon: 'umb:lock', - parentKey: '', + parentId: '', type: 'user-group', hasChildren: false, sections: ['Umb.Section.Settings', 'Umb.Section.Members', 'Umb.Section.Media', 'Umb.Section.Content'], @@ -53,10 +53,10 @@ export const data: Array = [ contentStartNode: 'cdd30288-2d1c-41b4-89a9-61647b4a10d5', }, { - key: '2668f09b-320c-48a7-a78a-95047026ec0e', + id: '2668f09b-320c-48a7-a78a-95047026ec0e', name: 'Translators', icon: 'umb:globe', - parentKey: '', + parentId: '', type: 'user-group', hasChildren: false, sections: ['Umb.Section.Packages', 'Umb.Section.Settings'], @@ -64,10 +64,10 @@ export const data: Array = [ contentStartNode: 'cdd30288-2d1c-41b4-89a9-61647b4a10d5', }, { - key: '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', + id: '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', name: 'Writers', icon: 'umb:edit', - parentKey: '', + parentId: '', type: 'user-group', hasChildren: false, sections: ['Umb.Section.Content'], diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/users.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/users.data.ts index 28440cbc10..740b6a1957 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/users.data.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/users.data.ts @@ -11,9 +11,9 @@ class UmbUsersData extends UmbEntityData { return this.data; } - updateUserGroup(keys: string[], userGroup: string) { + updateUserGroup(ids: string[], userGroup: string) { this.data.forEach((user) => { - if (keys.includes(user.key)) { + if (ids.includes(user.id)) { user.userGroups = [...user.userGroups, userGroup]; } else { user.userGroups = user.userGroups.filter((group) => group !== userGroup); @@ -22,34 +22,34 @@ class UmbUsersData extends UmbEntityData { this.updateData(user); }); - return this.data.map((user) => user.key); + return this.data.map((user) => user.id); } - enable(keys: string[]) { - const users = this.data.filter((user) => keys.includes(user.key)); + enable(ids: string[]) { + const users = this.data.filter((user) => ids.includes(user.id)); users.forEach((user) => { user.status = 'enabled'; this.updateData(user); }); - return users.map((user) => user.key); + return users.map((user) => user.id); } - disable(keys: string[]) { - const users = this.data.filter((user) => keys.includes(user.key)); + disable(ids: string[]) { + const users = this.data.filter((user) => ids.includes(user.id)); users.forEach((user) => { user.status = 'disabled'; this.updateData(user); }); - return users.map((user) => user.key); + return users.map((user) => user.id); } } export const data: Array = [ { - key: 'a953e376-89f8-46d1-bed9-1b47743aa38a', + id: 'a953e376-89f8-46d1-bed9-1b47743aa38a', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -66,10 +66,10 @@ export const data: Array = [ userGroups: ['397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1'], }, { - key: 'bca6c733-a63d-4353-a271-9a8b6bcca8bd', + id: 'bca6c733-a63d-4353-a271-9a8b6bcca8bd', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -90,10 +90,10 @@ export const data: Array = [ ], }, { - key: '9f63996f-71e9-49be-bc21-5a69ea97e72e', + id: '9f63996f-71e9-49be-bc21-5a69ea97e72e', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -114,10 +114,10 @@ export const data: Array = [ ], }, { - key: 'ff1d1bff-b6d2-444b-950a-68b5eec46277', + id: 'ff1d1bff-b6d2-444b-950a-68b5eec46277', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -138,10 +138,10 @@ export const data: Array = [ ], }, { - key: 'c9cf849f-0536-4e38-a91a-02c8c45a6f47', + id: 'c9cf849f-0536-4e38-a91a-02c8c45a6f47', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -158,10 +158,10 @@ export const data: Array = [ userGroups: ['b847398a-6875-4d7a-9f6d-231256b81471', '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949'], }, { - key: 'd9cbd4cd-6950-42b2-be57-1f5829c6dd19', + id: 'd9cbd4cd-6950-42b2-be57-1f5829c6dd19', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -178,10 +178,10 @@ export const data: Array = [ userGroups: ['397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', 'b847398a-6875-4d7a-9f6d-231256b81471'], }, { - key: '515b2c5c-c195-43f2-8e52-4733572030c7', + id: '515b2c5c-c195-43f2-8e52-4733572030c7', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -204,10 +204,10 @@ export const data: Array = [ ], }, { - key: 'db8a0800-28b3-4f0b-9152-37debea6b8d7', + id: 'db8a0800-28b3-4f0b-9152-37debea6b8d7', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -228,10 +228,10 @@ export const data: Array = [ ], }, { - key: '3fe38c9b-b5a3-4897-8507-3f062a25659e', + id: '3fe38c9b-b5a3-4897-8507-3f062a25659e', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -248,10 +248,10 @@ export const data: Array = [ userGroups: ['c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949'], }, { - key: '09e99152-bc3e-449f-9fa1-322ab3390b7d', + id: '09e99152-bc3e-449f-9fa1-322ab3390b7d', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -272,10 +272,10 @@ export const data: Array = [ ], }, { - key: '5680bd61-9b58-4ecb-ae06-bdfacebe05f2', + id: '5680bd61-9b58-4ecb-ae06-bdfacebe05f2', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -292,10 +292,10 @@ export const data: Array = [ userGroups: ['397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1'], }, { - key: '1c2cb6b5-1b96-47c0-a2b7-f5dd6bd3d325', + id: '1c2cb6b5-1b96-47c0-a2b7-f5dd6bd3d325', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -316,10 +316,10 @@ export const data: Array = [ ], }, { - key: 'ac6cc4e4-ab38-4920-8646-63c7652fc97a', + id: 'ac6cc4e4-ab38-4920-8646-63c7652fc97a', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -336,10 +336,10 @@ export const data: Array = [ userGroups: ['b847398a-6875-4d7a-9f6d-231256b81471', '2668f09b-320c-48a7-a78a-95047026ec0e'], }, { - key: 'a5e5bbe4-acb4-4c40-b15a-eab510338620', + id: 'a5e5bbe4-acb4-4c40-b15a-eab510338620', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -360,10 +360,10 @@ export const data: Array = [ ], }, { - key: 'c775af23-4aec-4d24-a2d1-5b0d666c9eb4', + id: 'c775af23-4aec-4d24-a2d1-5b0d666c9eb4', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -384,10 +384,10 @@ export const data: Array = [ ], }, { - key: '3333e2dc-b8a6-4db3-af00-ac1c1e1d5d9c', + id: '3333e2dc-b8a6-4db3-af00-ac1c1e1d5d9c', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -404,10 +404,10 @@ export const data: Array = [ userGroups: ['c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949'], }, { - key: '506126e3-2b96-4746-bd0a-1e6b2283021f', + id: '506126e3-2b96-4746-bd0a-1e6b2283021f', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -424,10 +424,10 @@ export const data: Array = [ userGroups: ['9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', 'b847398a-6875-4d7a-9f6d-231256b81471'], }, { - key: 'caf10593-3710-4417-af3d-7015f88f5fe3', + id: 'caf10593-3710-4417-af3d-7015f88f5fe3', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -448,10 +448,10 @@ export const data: Array = [ ], }, { - key: 'e2492eeb-bcc2-4c95-8893-27c45c895c9c', + id: 'e2492eeb-bcc2-4c95-8893-27c45c895c9c', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -473,10 +473,10 @@ export const data: Array = [ ], }, { - key: '8c93b359-a719-4453-991c-e2d5bcc965c3', + id: '8c93b359-a719-4453-991c-e2d5bcc965c3', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -497,10 +497,10 @@ export const data: Array = [ ], }, { - key: '4cd22c7c-baeb-463f-89e5-e0a6bb3ea27e', + id: '4cd22c7c-baeb-463f-89e5-e0a6bb3ea27e', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -521,10 +521,10 @@ export const data: Array = [ ], }, { - key: 'ccd03e29-e924-4240-a1e4-b0114c66aae9', + id: 'ccd03e29-e924-4240-a1e4-b0114c66aae9', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -547,10 +547,10 @@ export const data: Array = [ ], }, { - key: '7ffa97ca-0702-4bcf-8e32-751bae9aa156', + id: '7ffa97ca-0702-4bcf-8e32-751bae9aa156', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -571,10 +571,10 @@ export const data: Array = [ ], }, { - key: 'e139ec4b-b49a-48c0-a1a3-1c2e8e95366d', + id: 'e139ec4b-b49a-48c0-a1a3-1c2e8e95366d', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -595,10 +595,10 @@ export const data: Array = [ ], }, { - key: '30d29d56-cbb2-41fd-9154-94b0f0d9a385', + id: '30d29d56-cbb2-41fd-9154-94b0f0d9a385', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -619,10 +619,10 @@ export const data: Array = [ ], }, { - key: '3ecac483-c4df-4971-a357-a0be03c520ca', + id: '3ecac483-c4df-4971-a357-a0be03c520ca', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -639,10 +639,10 @@ export const data: Array = [ userGroups: ['c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', '2668f09b-320c-48a7-a78a-95047026ec0e'], }, { - key: '2dae8bf8-5fdd-4efa-a493-cbec11b179e2', + id: '2dae8bf8-5fdd-4efa-a493-cbec11b179e2', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -663,10 +663,10 @@ export const data: Array = [ ], }, { - key: '0397dd89-72c5-4d0b-a544-dc1c9c0a932d', + id: '0397dd89-72c5-4d0b-a544-dc1c9c0a932d', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -688,10 +688,10 @@ export const data: Array = [ ], }, { - key: '4f2f64c1-1b9b-4217-80c7-7760962215af', + id: '4f2f64c1-1b9b-4217-80c7-7760962215af', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -713,10 +713,10 @@ export const data: Array = [ ], }, { - key: '6cefa1e1-4302-4003-81df-3fa4759245a4', + id: '6cefa1e1-4302-4003-81df-3fa4759245a4', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -738,10 +738,10 @@ export const data: Array = [ ], }, { - key: '2ba9ae27-7860-42ea-b628-c5484b64b2c6', + id: '2ba9ae27-7860-42ea-b628-c5484b64b2c6', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -758,10 +758,10 @@ export const data: Array = [ userGroups: ['c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', 'b847398a-6875-4d7a-9f6d-231256b81471'], }, { - key: 'f4bee7c8-7a94-4937-8e6e-ceb55c9ec8b4', + id: 'f4bee7c8-7a94-4937-8e6e-ceb55c9ec8b4', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -778,10 +778,10 @@ export const data: Array = [ userGroups: ['c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', 'b847398a-6875-4d7a-9f6d-231256b81471'], }, { - key: '3ccfeec3-1c96-4205-ae90-3297702d0d59', + id: '3ccfeec3-1c96-4205-ae90-3297702d0d59', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -802,10 +802,10 @@ export const data: Array = [ ], }, { - key: 'cb0e3a46-1e99-4dc3-a206-462c3d985916', + id: 'cb0e3a46-1e99-4dc3-a206-462c3d985916', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -826,10 +826,10 @@ export const data: Array = [ ], }, { - key: 'eb5af046-f2af-490f-a195-b0faff73f538', + id: 'eb5af046-f2af-490f-a195-b0faff73f538', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -846,10 +846,10 @@ export const data: Array = [ userGroups: ['c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2'], }, { - key: '42037971-4e06-41a8-be76-04313571fe54', + id: '42037971-4e06-41a8-be76-04313571fe54', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -866,10 +866,10 @@ export const data: Array = [ userGroups: ['2668f09b-320c-48a7-a78a-95047026ec0e', '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2'], }, { - key: 'd71ba775-2920-42de-b5a1-09104e81cf27', + id: 'd71ba775-2920-42de-b5a1-09104e81cf27', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -892,10 +892,10 @@ export const data: Array = [ ], }, { - key: 'ed94e56b-64d5-43d0-9c9c-7149a0b26657', + id: 'ed94e56b-64d5-43d0-9c9c-7149a0b26657', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -916,10 +916,10 @@ export const data: Array = [ ], }, { - key: '8acfe50e-2e15-460d-b368-0510d08fea4c', + id: '8acfe50e-2e15-460d-b368-0510d08fea4c', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -941,10 +941,10 @@ export const data: Array = [ ], }, { - key: '73401c00-3b05-465b-ab59-8def5af4ec54', + id: '73401c00-3b05-465b-ab59-8def5af4ec54', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -965,10 +965,10 @@ export const data: Array = [ ], }, { - key: 'ffed1abb-aee0-45f1-9915-5ea7da165011', + id: 'ffed1abb-aee0-45f1-9915-5ea7da165011', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -989,10 +989,10 @@ export const data: Array = [ ], }, { - key: '754fafb2-ec86-4313-8c5a-26a0a460df70', + id: '754fafb2-ec86-4313-8c5a-26a0a460df70', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1013,10 +1013,10 @@ export const data: Array = [ ], }, { - key: 'eae3c035-1b9d-4d1d-b626-89a7c3b3bc39', + id: 'eae3c035-1b9d-4d1d-b626-89a7c3b3bc39', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1037,10 +1037,10 @@ export const data: Array = [ ], }, { - key: '4bbf5669-99ec-4e60-b159-2198990ee8f1', + id: '4bbf5669-99ec-4e60-b159-2198990ee8f1', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1057,10 +1057,10 @@ export const data: Array = [ userGroups: ['397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949'], }, { - key: 'bc17c986-9869-49f4-baee-d888bf013f27', + id: 'bc17c986-9869-49f4-baee-d888bf013f27', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1082,10 +1082,10 @@ export const data: Array = [ ], }, { - key: 'f015b8a7-35b7-4859-a506-253ee95f92f4', + id: 'f015b8a7-35b7-4859-a506-253ee95f92f4', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1107,10 +1107,10 @@ export const data: Array = [ ], }, { - key: 'b5fd8d4f-eecc-4bea-b841-b4ba3621e8ba', + id: 'b5fd8d4f-eecc-4bea-b841-b4ba3621e8ba', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1131,10 +1131,10 @@ export const data: Array = [ ], }, { - key: '0bfe956a-5293-48bf-8c43-fd9be5c8dd19', + id: '0bfe956a-5293-48bf-8c43-fd9be5c8dd19', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1155,10 +1155,10 @@ export const data: Array = [ ], }, { - key: 'f2914aaa-de0a-4285-b820-88d22ae7a566', + id: 'f2914aaa-de0a-4285-b820-88d22ae7a566', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1179,10 +1179,10 @@ export const data: Array = [ ], }, { - key: 'f5489ee0-589d-47e5-8c11-b5e2ef027519', + id: 'f5489ee0-589d-47e5-8c11-b5e2ef027519', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1203,10 +1203,10 @@ export const data: Array = [ ], }, { - key: '293074af-8188-4151-b025-2b43f6aa6c2c', + id: '293074af-8188-4151-b025-2b43f6aa6c2c', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1223,10 +1223,10 @@ export const data: Array = [ userGroups: ['2668f09b-320c-48a7-a78a-95047026ec0e', '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949'], }, { - key: '93765192-b40f-4bf2-8c06-1d5ffb6989ae', + id: '93765192-b40f-4bf2-8c06-1d5ffb6989ae', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1243,10 +1243,10 @@ export const data: Array = [ userGroups: ['397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', 'b847398a-6875-4d7a-9f6d-231256b81471'], }, { - key: '59f1023c-7ce6-4c78-a1ee-dcb4625b9281', + id: '59f1023c-7ce6-4c78-a1ee-dcb4625b9281', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1263,10 +1263,10 @@ export const data: Array = [ userGroups: ['c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2'], }, { - key: '42592a81-f584-4b77-b312-b8e268203c22', + id: '42592a81-f584-4b77-b312-b8e268203c22', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1283,10 +1283,10 @@ export const data: Array = [ userGroups: ['397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', '2668f09b-320c-48a7-a78a-95047026ec0e'], }, { - key: '8ad78a84-8183-4833-9f8b-07b3ea8a881c', + id: '8ad78a84-8183-4833-9f8b-07b3ea8a881c', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1307,10 +1307,10 @@ export const data: Array = [ ], }, { - key: '3f7bc8b5-df8b-4a79-a8bf-f379c63b8d01', + id: '3f7bc8b5-df8b-4a79-a8bf-f379c63b8d01', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1331,10 +1331,10 @@ export const data: Array = [ ], }, { - key: '09901602-688a-4c83-a977-51c16950a2c1', + id: '09901602-688a-4c83-a977-51c16950a2c1', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1355,10 +1355,10 @@ export const data: Array = [ ], }, { - key: '060972c7-9b23-4788-8dc3-c2fcec1d002e', + id: '060972c7-9b23-4788-8dc3-c2fcec1d002e', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1379,10 +1379,10 @@ export const data: Array = [ ], }, { - key: 'ccf7639c-09d9-4de6-88ec-be51be7f9d69', + id: 'ccf7639c-09d9-4de6-88ec-be51be7f9d69', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1403,10 +1403,10 @@ export const data: Array = [ ], }, { - key: '2c6b24a4-c0d2-4efe-8a09-68b61d2a17ef', + id: '2c6b24a4-c0d2-4efe-8a09-68b61d2a17ef', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1427,10 +1427,10 @@ export const data: Array = [ ], }, { - key: 'ff7a2003-f8d7-4fbc-96cb-ee221bdc01c9', + id: 'ff7a2003-f8d7-4fbc-96cb-ee221bdc01c9', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1447,10 +1447,10 @@ export const data: Array = [ userGroups: ['2668f09b-320c-48a7-a78a-95047026ec0e', 'b847398a-6875-4d7a-9f6d-231256b81471'], }, { - key: 'b7f7b275-f62d-44ba-a6b0-0e7e83fe4e49', + id: 'b7f7b275-f62d-44ba-a6b0-0e7e83fe4e49', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1471,10 +1471,10 @@ export const data: Array = [ ], }, { - key: '18a9a6bc-ae4c-49b0-8afd-43bc214053f4', + id: '18a9a6bc-ae4c-49b0-8afd-43bc214053f4', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1495,10 +1495,10 @@ export const data: Array = [ ], }, { - key: '14fa1c36-1252-433e-a1ad-63cf5c9aba62', + id: '14fa1c36-1252-433e-a1ad-63cf5c9aba62', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1521,10 +1521,10 @@ export const data: Array = [ ], }, { - key: '7cb9327f-6aeb-47af-80b3-4b85abde1f5f', + id: '7cb9327f-6aeb-47af-80b3-4b85abde1f5f', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1545,10 +1545,10 @@ export const data: Array = [ ], }, { - key: '0574e903-ba72-49ee-b838-4eb200e68612', + id: '0574e903-ba72-49ee-b838-4eb200e68612', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1570,10 +1570,10 @@ export const data: Array = [ ], }, { - key: '6e4515d6-4a67-4f47-8783-1d074c1d1f75', + id: '6e4515d6-4a67-4f47-8783-1d074c1d1f75', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1594,10 +1594,10 @@ export const data: Array = [ ], }, { - key: '4faa2064-6776-4cc0-8bc1-3ceaa5884a0f', + id: '4faa2064-6776-4cc0-8bc1-3ceaa5884a0f', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1614,10 +1614,10 @@ export const data: Array = [ userGroups: ['b847398a-6875-4d7a-9f6d-231256b81471', '2668f09b-320c-48a7-a78a-95047026ec0e'], }, { - key: '0cccec0d-d7c4-47bc-97b0-bd55dca42dd7', + id: '0cccec0d-d7c4-47bc-97b0-bd55dca42dd7', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1639,10 +1639,10 @@ export const data: Array = [ ], }, { - key: 'd6ffe266-f024-45c2-a1cd-f39bdbc00a5b', + id: 'd6ffe266-f024-45c2-a1cd-f39bdbc00a5b', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1663,10 +1663,10 @@ export const data: Array = [ ], }, { - key: '72d3047a-8c48-4425-ad11-a4a64281e7e5', + id: '72d3047a-8c48-4425-ad11-a4a64281e7e5', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1687,10 +1687,10 @@ export const data: Array = [ ], }, { - key: 'ebfe0335-6926-433d-90de-82f9661955f9', + id: 'ebfe0335-6926-433d-90de-82f9661955f9', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1711,10 +1711,10 @@ export const data: Array = [ ], }, { - key: 'e6e833fb-a872-4364-893c-b6bfc9802043', + id: 'e6e833fb-a872-4364-893c-b6bfc9802043', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1735,10 +1735,10 @@ export const data: Array = [ ], }, { - key: 'abd4d295-9ebb-4a0d-bc07-e2a662671e18', + id: 'abd4d295-9ebb-4a0d-bc07-e2a662671e18', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1759,10 +1759,10 @@ export const data: Array = [ ], }, { - key: '29d42fe1-b465-4dfe-8d29-10286474d625', + id: '29d42fe1-b465-4dfe-8d29-10286474d625', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1783,10 +1783,10 @@ export const data: Array = [ ], }, { - key: '690535f5-194a-4e32-b569-608fbf279059', + id: '690535f5-194a-4e32-b569-608fbf279059', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1807,10 +1807,10 @@ export const data: Array = [ ], }, { - key: '13b5e542-e779-48df-b7f9-2c7def0e2e55', + id: '13b5e542-e779-48df-b7f9-2c7def0e2e55', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1831,10 +1831,10 @@ export const data: Array = [ ], }, { - key: 'af5bfaaf-1597-4ad1-aa1e-206f78a91674', + id: 'af5bfaaf-1597-4ad1-aa1e-206f78a91674', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1851,10 +1851,10 @@ export const data: Array = [ userGroups: ['397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949'], }, { - key: '8f39464a-2e49-498b-b8b8-cf2926978e83', + id: '8f39464a-2e49-498b-b8b8-cf2926978e83', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1876,10 +1876,10 @@ export const data: Array = [ ], }, { - key: 'ac4785f1-b6f5-4d2d-99e6-f62a96947f8c', + id: 'ac4785f1-b6f5-4d2d-99e6-f62a96947f8c', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1896,10 +1896,10 @@ export const data: Array = [ userGroups: ['2668f09b-320c-48a7-a78a-95047026ec0e', '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949'], }, { - key: 'd89ada67-eca1-475a-9273-0c69b56116da', + id: 'd89ada67-eca1-475a-9273-0c69b56116da', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1921,10 +1921,10 @@ export const data: Array = [ ], }, { - key: '03ced59c-40b3-482a-8470-b12f56974a0f', + id: '03ced59c-40b3-482a-8470-b12f56974a0f', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1946,10 +1946,10 @@ export const data: Array = [ ], }, { - key: 'dcfba56e-5f3c-446b-a4ef-18da66df8181', + id: 'dcfba56e-5f3c-446b-a4ef-18da66df8181', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1970,10 +1970,10 @@ export const data: Array = [ ], }, { - key: '63be3c07-9178-4c2e-810a-6bbdbbe16dcb', + id: '63be3c07-9178-4c2e-810a-6bbdbbe16dcb', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -1995,10 +1995,10 @@ export const data: Array = [ ], }, { - key: 'c57661ef-8f66-4502-91cb-2069a186ce79', + id: 'c57661ef-8f66-4502-91cb-2069a186ce79', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -2019,10 +2019,10 @@ export const data: Array = [ ], }, { - key: 'b5fbd289-2900-4328-8d1f-0a6780be3585', + id: 'b5fbd289-2900-4328-8d1f-0a6780be3585', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -2043,10 +2043,10 @@ export const data: Array = [ ], }, { - key: '9ca26535-5288-4b37-8e3b-96b3530de3d1', + id: '9ca26535-5288-4b37-8e3b-96b3530de3d1', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -2067,10 +2067,10 @@ export const data: Array = [ ], }, { - key: '19998fc5-2902-4646-9cf2-395404da2b2a', + id: '19998fc5-2902-4646-9cf2-395404da2b2a', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -2092,10 +2092,10 @@ export const data: Array = [ ], }, { - key: '468a904c-f87c-4079-920b-74c6aa3a5242', + id: '468a904c-f87c-4079-920b-74c6aa3a5242', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -2117,10 +2117,10 @@ export const data: Array = [ ], }, { - key: '60336828-85ed-4b5a-abf6-869d6902ad93', + id: '60336828-85ed-4b5a-abf6-869d6902ad93', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -2142,10 +2142,10 @@ export const data: Array = [ ], }, { - key: '2b0c8ffe-4bcb-4df6-b519-3358a5c90480', + id: '2b0c8ffe-4bcb-4df6-b519-3358a5c90480', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -2166,10 +2166,10 @@ export const data: Array = [ ], }, { - key: 'c967ff49-f967-449b-9aab-e5ca72255a61', + id: 'c967ff49-f967-449b-9aab-e5ca72255a61', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -2191,10 +2191,10 @@ export const data: Array = [ ], }, { - key: '594040ce-c6f7-49e7-8f4a-ffa8c42a2102', + id: '594040ce-c6f7-49e7-8f4a-ffa8c42a2102', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -2211,10 +2211,10 @@ export const data: Array = [ userGroups: ['b847398a-6875-4d7a-9f6d-231256b81471', '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949'], }, { - key: '33806fc1-d4a9-4ddb-8d57-3c087ea1f489', + id: '33806fc1-d4a9-4ddb-8d57-3c087ea1f489', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -2235,10 +2235,10 @@ export const data: Array = [ ], }, { - key: 'a59a5259-9393-4c49-a5be-56a475b27640', + id: 'a59a5259-9393-4c49-a5be-56a475b27640', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -2259,10 +2259,10 @@ export const data: Array = [ ], }, { - key: '9e96841c-131d-420a-bdc8-4ba087f0f11c', + id: '9e96841c-131d-420a-bdc8-4ba087f0f11c', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -2283,10 +2283,10 @@ export const data: Array = [ ], }, { - key: '84eaae2a-9aa8-4745-b4c3-fad2f5632e85', + id: '84eaae2a-9aa8-4745-b4c3-fad2f5632e85', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -2308,10 +2308,10 @@ export const data: Array = [ ], }, { - key: '6fe86358-f3fd-4f7d-8d28-e867562569f2', + id: '6fe86358-f3fd-4f7d-8d28-e867562569f2', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -2328,10 +2328,10 @@ export const data: Array = [ userGroups: ['c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', 'b847398a-6875-4d7a-9f6d-231256b81471'], }, { - key: '365fd725-81c7-48f0-be68-4dbcf15f1ca9', + id: '365fd725-81c7-48f0-be68-4dbcf15f1ca9', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', @@ -2348,10 +2348,10 @@ export const data: Array = [ userGroups: ['2668f09b-320c-48a7-a78a-95047026ec0e', 'b847398a-6875-4d7a-9f6d-231256b81471'], }, { - key: 'b6028623-995e-4eee-8142-723141030692', + id: 'b6028623-995e-4eee-8142-723141030692', type: 'user', hasChildren: false, - parentKey: '', + parentId: '', contentStartNodes: [], mediaStartNodes: [], icon: 'umb:user', diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/utils.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/utils.ts index 325e8e46b0..5c847f47e8 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/utils.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/utils.ts @@ -16,9 +16,9 @@ export const createEntityTreeItem = (item: any): EntityTreeItemResponseModel => type: item.type, icon: item.icon, hasChildren: item.hasChildren, - key: item.key, + id: item.id, isContainer: item.isContainer, - parentKey: item.parentKey, + parentId: item.parentId, }; }; diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/data-type.handlers.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/data-type.handlers.ts deleted file mode 100644 index d235482f9a..0000000000 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/data-type.handlers.ts +++ /dev/null @@ -1,122 +0,0 @@ -import { rest } from 'msw'; -import { umbDataTypeData } from '../data/data-type.data'; -import { umbracoPath } from '@umbraco-cms/backoffice/utils'; -import { ProblemDetailsModel } from '@umbraco-cms/backoffice/backend-api'; - -// TODO: add schema -export const handlers = [ - // TREE - rest.get(umbracoPath('/tree/data-type/root'), (req, res, ctx) => { - const rootItems = umbDataTypeData.getTreeRoot(); - const response = { - total: rootItems.length, - items: rootItems, - }; - return res(ctx.status(200), ctx.json(response)); - }), - - rest.get(umbracoPath('/tree/data-type/children'), (req, res, ctx) => { - const parentKey = req.url.searchParams.get('parentKey'); - if (!parentKey) return; - - const children = umbDataTypeData.getTreeItemChildren(parentKey); - - const response = { - total: children.length, - items: children, - }; - - return res(ctx.status(200), ctx.json(response)); - }), - - rest.get(umbracoPath('/tree/data-type/item'), (req, res, ctx) => { - const keys = req.url.searchParams.getAll('key'); - if (!keys) return; - const items = umbDataTypeData.getTreeItem(keys); - return res(ctx.status(200), ctx.json(items)); - }), - - // FOLDERS - rest.post(umbracoPath('/data-type/folder'), async (req, res, ctx) => { - const data = await req.json(); - if (!data) return; - - umbDataTypeData.createFolder(data); - - return res(ctx.status(200)); - }), - - rest.get(umbracoPath('/data-type/folder/:key'), (req, res, ctx) => { - const key = req.params.key as string; - if (!key) return; - - const dataType = umbDataTypeData.getByKey(key); - - return res(ctx.status(200), ctx.json(dataType)); - }), - - rest.put(umbracoPath('/data-type/folder/:key'), async (req, res, ctx) => { - const data = await req.json(); - if (!data) return; - - umbDataTypeData.save(data); - - return res(ctx.status(200)); - }), - - rest.delete(umbracoPath('/data-type/folder/:key'), async (req, res, ctx) => { - const key = req.params.key as string; - if (!key) return; - - try { - umbDataTypeData.deleteFolder(key); - return res(ctx.status(200)); - } catch (error) { - return res( - ctx.status(404), - ctx.json({ - status: 404, - type: 'error', - detail: 'Not Found', - }) - ); - } - }), - - // Details - rest.post(umbracoPath('/data-type'), async (req, res, ctx) => { - const data = await req.json(); - if (!data) return; - - const saved = umbDataTypeData.save(data); - - return res(ctx.status(200), ctx.json(saved)); - }), - - rest.get(umbracoPath('/data-type/:key'), (req, res, ctx) => { - const key = req.params.key as string; - if (!key) return; - - const dataType = umbDataTypeData.getByKey(key); - - return res(ctx.status(200), ctx.json(dataType)); - }), - - rest.put(umbracoPath('/data-type/:key'), async (req, res, ctx) => { - const data = await req.json(); - if (!data) return; - - const saved = umbDataTypeData.save(data); - - return res(ctx.status(200), ctx.json(saved)); - }), - - rest.delete(umbracoPath('/data-type/:key'), async (req, res, ctx) => { - const key = req.params.key as string; - if (!key) return; - - umbDataTypeData.delete([key]); - - return res(ctx.status(200)); - }), -]; diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/data-type/detail.handlers.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/data-type/detail.handlers.ts new file mode 100644 index 0000000000..c362a16141 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/data-type/detail.handlers.ts @@ -0,0 +1,42 @@ +import { rest } from 'msw'; +import { umbDataTypeData } from '../../data/data-type.data'; +import { slug } from './slug'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const detailHandlers = [ + rest.post(umbracoPath(`${slug}`), async (req, res, ctx) => { + const data = await req.json(); + if (!data) return; + + umbDataTypeData.insert(data); + + return res(ctx.status(200)); + }), + + rest.get(umbracoPath(`${slug}/:id`), (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return; + + const dataType = umbDataTypeData.getById(id); + + return res(ctx.status(200), ctx.json(dataType)); + }), + + rest.put(umbracoPath(`${slug}/:id`), async (req, res, ctx) => { + const data = await req.json(); + if (!data) return; + + const saved = umbDataTypeData.save(data); + + return res(ctx.status(200), ctx.json(saved)); + }), + + rest.delete(umbracoPath(`${slug}/:id`), async (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return; + + umbDataTypeData.delete([id]); + + return res(ctx.status(200)); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/data-type/folder.handlers.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/data-type/folder.handlers.ts new file mode 100644 index 0000000000..9a0d5bc071 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/data-type/folder.handlers.ts @@ -0,0 +1,53 @@ +import { rest } from 'msw'; +import { umbDataTypeData } from '../../data/data-type.data'; +import { slug } from './slug'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; +import { ProblemDetailsModel } from '@umbraco-cms/backoffice/backend-api'; + +export const folderHandlers = [ + rest.post(umbracoPath(`${slug}/folder`), async (req, res, ctx) => { + const data = await req.json(); + if (!data) return; + + umbDataTypeData.createFolder(data); + + return res(ctx.status(200)); + }), + + rest.get(umbracoPath(`${slug}/folder/:id`), (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return; + + const dataType = umbDataTypeData.getById(id); + + return res(ctx.status(200), ctx.json(dataType)); + }), + + rest.put(umbracoPath(`${slug}/folder/:id`), async (req, res, ctx) => { + const data = await req.json(); + if (!data) return; + + umbDataTypeData.save(data); + + return res(ctx.status(200)); + }), + + rest.delete(umbracoPath(`${slug}/folder/:id`), async (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return; + + try { + umbDataTypeData.deleteFolder(id); + return res(ctx.status(200)); + } catch (error) { + return res( + ctx.status(404), + ctx.json({ + status: 404, + type: 'error', + detail: 'Not Found', + }) + ); + } + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/data-type/index.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/data-type/index.ts new file mode 100644 index 0000000000..fb46e23ffd --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/data-type/index.ts @@ -0,0 +1,6 @@ +import { folderHandlers } from './folder.handlers'; +import { treeHandlers } from './tree.handlers'; +import { detailHandlers } from './detail.handlers'; +import { itemHandlers } from './item.handlers'; + +export const handlers = [...treeHandlers, ...itemHandlers, ...folderHandlers, ...detailHandlers]; diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/data-type/item.handlers.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/data-type/item.handlers.ts new file mode 100644 index 0000000000..24d17c79e0 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/data-type/item.handlers.ts @@ -0,0 +1,13 @@ +import { rest } from 'msw'; +import { umbDataTypeData } from '../../data/data-type.data'; +import { slug } from './slug'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const itemHandlers = [ + rest.get(umbracoPath(`${slug}/item`), (req, res, ctx) => { + const ids = req.url.searchParams.getAll('id'); + if (!ids) return; + const items = umbDataTypeData.getTreeItem(ids); + return res(ctx.status(200), ctx.json(items)); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/data-type/slug.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/data-type/slug.ts new file mode 100644 index 0000000000..5c453df84c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/data-type/slug.ts @@ -0,0 +1 @@ +export const slug = '/data-type'; diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/data-type/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/data-type/tree.handlers.ts new file mode 100644 index 0000000000..203acd560f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/data-type/tree.handlers.ts @@ -0,0 +1,29 @@ +import { rest } from 'msw'; +import { umbDataTypeData } from '../../data/data-type.data'; +import { slug } from './slug'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const treeHandlers = [ + rest.get(umbracoPath(`/tree${slug}/root`), (req, res, ctx) => { + const rootItems = umbDataTypeData.getTreeRoot(); + const response = { + total: rootItems.length, + items: rootItems, + }; + return res(ctx.status(200), ctx.json(response)); + }), + + rest.get(umbracoPath(`/tree${slug}/children`), (req, res, ctx) => { + const parentId = req.url.searchParams.get('parentId'); + if (!parentId) return; + + const children = umbDataTypeData.getTreeItemChildren(parentId); + + const response = { + total: children.length, + items: children, + }; + + return res(ctx.status(200), ctx.json(response)); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/dictionary.handlers.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/dictionary.handlers.ts index 25df97d47a..33b51c2ad4 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/dictionary.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/dictionary.handlers.ts @@ -1,19 +1,23 @@ import { rest } from 'msw'; -import type { DictionaryDetails } from '../../../backoffice/translation/dictionary'; import { umbDictionaryData } from '../data/dictionary.data'; -import { ImportDictionaryRequestModel, DictionaryOverviewResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import { + ImportDictionaryRequestModel, + DictionaryOverviewResponseModel, + DictionaryItemResponseModel, + EntityTreeItemResponseModel, +} from '@umbraco-cms/backoffice/backend-api'; const uploadResponse: ImportDictionaryRequestModel = { - fileName: 'c:/path/to/tempfilename.udt', - parentKey: 'b7e7d0ab-53ba-485d-dddd-12537f9925aa', + temporaryFileId: 'c:/path/to/tempfilename.udt', + parentId: 'b7e7d0ab-53ba-485d-dddd-12537f9925aa', }; -/// -const importResponse: DictionaryDetails = { +/// TODO: get correct type +const importResponse: DictionaryItemResponseModel & EntityTreeItemResponseModel = { $type: '', - parentKey: null, + parentId: null, name: 'Uploaded dictionary', - key: 'b7e7d0ab-53ba-485d-dddd-12537f9925cb', + id: 'b7e7d0ab-53ba-485d-dddd-12537f9925cb', hasChildren: false, type: 'dictionary-item', isContainer: false, @@ -34,24 +38,23 @@ const importResponse: DictionaryDetails = { const overviewData: Array = [ { name: 'Hello', - key: 'aae7d0ab-53ba-485d-b8bd-12537f9925cb', + id: 'aae7d0ab-53ba-485d-b8bd-12537f9925cb', translatedIsoCodes: ['en'], }, { name: 'Hello again', - key: 'bbe7d0ab-53bb-485d-b8bd-12537f9925cb', + id: 'bbe7d0ab-53bb-485d-b8bd-12537f9925cb', translatedIsoCodes: ['en', 'fr'], }, ]; // TODO: add schema export const handlers = [ - rest.get('/umbraco/management/api/v1/dictionary/:key', (req, res, ctx) => { - const key = req.params.key as string; - if (!key) return; + rest.get('/umbraco/management/api/v1/dictionary/:id', (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return; - const dictionary = umbDictionaryData.getByKey(key); - console.log(dictionary); + const dictionary = umbDictionaryData.getById(id); return res(ctx.status(200), ctx.json(dictionary)); }), @@ -77,7 +80,6 @@ export const handlers = [ const data = await req.json(); if (!data) return; - data.parentKey = data.parentId; data.icon = 'umb:book-alt'; data.hasChildren = false; data.type = 'dictionary-item'; @@ -102,12 +104,12 @@ export const handlers = [ return res(ctx.status(200), ctx.json(createdResult)); }), - rest.patch('/umbraco/management/api/v1/dictionary/:key', async (req, res, ctx) => { + rest.patch('/umbraco/management/api/v1/dictionary/:id', async (req, res, ctx) => { const data = await req.json(); if (!data) return; - const key = req.params.key as string; - if (!key) return; + const id = req.params.id as string; + if (!id) return; const dataToSave = JSON.parse(data[0].value); const saved = umbDictionaryData.save(dataToSave); @@ -125,10 +127,10 @@ export const handlers = [ }), rest.get('/umbraco/management/api/v1/tree/dictionary/children', (req, res, ctx) => { - const parentKey = req.url.searchParams.get('parentKey'); - if (!parentKey) return; + const parentId = req.url.searchParams.get('parentId'); + if (!parentId) return; - const items = umbDictionaryData.getTreeItemChildren(parentKey); + const items = umbDictionaryData.getTreeItemChildren(parentId); const response = { total: items.length, @@ -139,30 +141,30 @@ export const handlers = [ }), rest.get('/umbraco/management/api/v1/tree/dictionary/item', (req, res, ctx) => { - const keys = req.url.searchParams.getAll('key'); - if (!keys) return; + const ids = req.url.searchParams.getAll('id'); + if (!ids) return; - const items = umbDictionaryData.getTreeItem(keys); + const items = umbDictionaryData.getTreeItem(ids); return res(ctx.status(200), ctx.json(items)); }), - rest.delete('/umbraco/management/api/v1/dictionary/:key', (req, res, ctx) => { - const key = req.params.key as string; - if (!key) return; + rest.delete('/umbraco/management/api/v1/dictionary/:id', (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return; - const deletedKeys = umbDictionaryData.delete([key]); + const deletedKeys = umbDictionaryData.delete([id]); return res(ctx.status(200), ctx.json(deletedKeys)); }), // TODO => handle properly, querystring breaks handler - rest.get('/umbraco/management/api/v1/dictionary/:key/export', (req, res, ctx) => { - const key = req.params.key as string; - if (!key) return; + rest.get('/umbraco/management/api/v1/dictionary/:id/export', (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return; const includeChildren = req.url.searchParams.get('includeChildren'); - const item = umbDictionaryData.getByKey(key); + const item = umbDictionaryData.getById(id); alert( `Downloads file for dictionary "${item?.name}", ${includeChildren === 'true' ? 'with' : 'without'} children.` @@ -179,16 +181,16 @@ export const handlers = [ rest.post('/umbraco/management/api/v1/dictionary/import', async (req, res, ctx) => { const file = req.url.searchParams.get('file'); - if (!file) return; + if (!file || !importResponse.id) return; - importResponse.parentKey = req.url.searchParams.get('parentId') ?? null; + importResponse.parentId = req.url.searchParams.get('parentId') ?? null; umbDictionaryData.save(importResponse); // build the path to the new item => reflects the expected server response const path = ['-1']; - if (importResponse.parentKey) path.push(importResponse.parentKey); + if (importResponse.parentId) path.push(importResponse.parentId); - path.push(importResponse.key); + path.push(importResponse.id); const contentResult = { content: path.join(','), diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/document-type.handlers.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/document-type.handlers.ts index b9ae6eabca..1daea0ba0f 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/document-type.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/document-type.handlers.ts @@ -4,7 +4,7 @@ import type { DocumentTypeResponseModel } from '@umbraco-cms/backoffice/backend- // TODO: add schema export const handlers = [ - rest.post('/umbraco/management/api/v1/document-type/:key', (req, res, ctx) => { + rest.post('/umbraco/management/api/v1/document-type/:id', (req, res, ctx) => { const data = req.body; if (!data) return; @@ -13,11 +13,11 @@ export const handlers = [ return res(ctx.status(200), ctx.json(saved)); }), - rest.get('/umbraco/management/api/v1/document-type/details/:key', (req, res, ctx) => { - const key = req.params.key as string; - if (!key) return; + rest.get('/umbraco/management/api/v1/document-type/details/:id', (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return; - const document = umbDocumentTypeData.getByKey(key); + const document = umbDocumentTypeData.getById(id); return res(ctx.status(200), ctx.json([document])); }), @@ -41,10 +41,10 @@ export const handlers = [ }), rest.get('/umbraco/management/api/v1/tree/document-type/children', (req, res, ctx) => { - const parentKey = req.url.searchParams.get('parentKey'); - if (!parentKey) return; + const parentId = req.url.searchParams.get('parentId'); + if (!parentId) return; - const children = umbDocumentTypeData.getTreeItemChildren(parentKey); + const children = umbDocumentTypeData.getTreeItemChildren(parentId); const response = { total: children.length, @@ -55,28 +55,28 @@ export const handlers = [ }), rest.get('/umbraco/management/api/v1/tree/document-type/item', (req, res, ctx) => { - const keys = req.url.searchParams.getAll('key'); - if (!keys) return; + const ids = req.url.searchParams.getAll('id'); + if (!ids) return; - const items = umbDocumentTypeData.getTreeItem(keys); + const items = umbDocumentTypeData.getTreeItem(ids); return res(ctx.status(200), ctx.json(items)); }), - rest.get('/umbraco/management/api/v1/document-type/:key', (req, res, ctx) => { - const key = req.params.key as string; - if (!key) return; + rest.get('/umbraco/management/api/v1/document-type/:id', (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return; - const documentType = umbDocumentTypeData.getByKey(key); + const documentType = umbDocumentTypeData.getById(id); return res(ctx.status(200), ctx.json(documentType)); }), - rest.get('/umbraco/management/api/v1/document-type/allowed-children-of/:key', (req, res, ctx) => { - const key = req.params.key as string; - if (!key) return; + rest.get('/umbraco/management/api/v1/document-type/allowed-children-of/:id', (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return; - const items = umbDocumentTypeData.getAllowedTypesOf(key); + const items = umbDocumentTypeData.getAllowedTypesOf(id); return res(ctx.status(200), ctx.json(items)); }), diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/document.handlers.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/document.handlers.ts index b20817747d..44c3eb41da 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/document.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/document.handlers.ts @@ -7,9 +7,9 @@ import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const handlers = [ rest.post('/umbraco/management/api/v1/document/trash', async (req, res, ctx) => { console.warn('Please move to schema'); - const keys = await req.json(); + const ids = await req.json(); - const trashed = umbDocumentData.trash(keys); + const trashed = umbDocumentData.trash(ids); return res(ctx.status(200), ctx.json(trashed)); }), @@ -20,22 +20,22 @@ export const handlers = [ }), rest.get('/umbraco/management/api/v1/tree/document/children', (req, res, ctx) => { - const parentKey = req.url.searchParams.get('parentKey'); - if (!parentKey) return; - const response = umbDocumentData.getTreeItemChildren(parentKey); + const parentId = req.url.searchParams.get('parentId'); + if (!parentId) return; + const response = umbDocumentData.getTreeItemChildren(parentId); return res(ctx.status(200), ctx.json(response)); }), rest.get('/umbraco/management/api/v1/tree/document/item', (req, res, ctx) => { - const keys = req.url.searchParams.getAll('key'); - if (!keys) return; + const ids = req.url.searchParams.getAll('id'); + if (!ids) return; - const items = umbDocumentData.getTreeItem(keys); + const items = umbDocumentData.getTreeItem(ids); return res(ctx.status(200), ctx.json(items)); }), - rest.post('/umbraco/management/api/v1/document/:key', async (req, res, ctx) => { + rest.post('/umbraco/management/api/v1/document/:id', async (req, res, ctx) => { const data = await req.json(); if (!data) return; @@ -44,11 +44,11 @@ export const handlers = [ return res(ctx.status(200), ctx.json(saved)); }), - rest.get(umbracoPath('/document/:key'), (req, res, ctx) => { - const key = req.params.key as string; - if (!key) return; + rest.get(umbracoPath('/document/:id'), (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return; - const document = umbDocumentData.getByKey(key); + const document = umbDocumentData.getById(id); return res(ctx.status(200), ctx.json(document)); }), diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/health-check.handlers.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/health-check.handlers.ts index de8d67686f..a4e075f140 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/health-check.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/health-check.handlers.ts @@ -54,9 +54,9 @@ export const handlers = [ rest.post(umbracoPath('/health-check/execute-action'), async (req, res, ctx) => { const body = await req.json(); - const healthCheckKey = body.healthCheckKey; - // Find the health check based on the healthCheckKey from the healthGroups[].checks - const healthCheck = healthGroups.flatMap((group) => group.checks).find((check) => check?.key === healthCheckKey); + const healthCheckId = body.healthCheckId; + // Find the health check based on the healthCheckId from the healthGroups[].checks + const healthCheck = healthGroups.flatMap((group) => group.checks).find((check) => check?.id === healthCheckId); if (!healthCheck) { return res(ctx.status(404)); diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/language.handlers.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/language.handlers.ts index 4759c1d423..41158abe5b 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/language.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/language.handlers.ts @@ -21,12 +21,12 @@ export const handlers = [ return res(ctx.status(200), ctx.json(response)); }), - rest.get(umbracoPath('/language/:key'), (req, res, ctx) => { - const key = req.params.key as string; + rest.get(umbracoPath('/language/:id'), (req, res, ctx) => { + const id = req.params.id as string; - if (!key) return; + if (!id) return; - const item = umbLanguagesData.getByKey(key); + const item = umbLanguagesData.getByKey(id); return res(ctx.status(200), ctx.json(item)); }), @@ -53,7 +53,7 @@ export const handlers = [ } }), - rest.put(umbracoPath('/language/:key'), async (req, res, ctx) => { + rest.put(umbracoPath('/language/:id'), async (req, res, ctx) => { const data = await req.json(); if (!data) return; @@ -63,7 +63,7 @@ export const handlers = [ return res(ctx.status(200)); }), - rest.delete(umbracoPath('/language/:key'), async (req, res, ctx) => { + rest.delete(umbracoPath('/language/:id'), async (req, res, ctx) => { return res(ctx.status(200)); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/log-viewer.handlers.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/log-viewer.handlers.ts index 39d9fe9422..03491bbf88 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/log-viewer.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/log-viewer.handlers.ts @@ -1,5 +1,5 @@ import { rest } from 'msw'; -import { umbLogviewerData } from '../data/log-viewer.data'; +import { umbLogViewerData } from '../data/log-viewer.data'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; import { SavedLogSearchRequestModel } from '@umbraco-cms/backoffice/backend-api'; @@ -11,7 +11,7 @@ export const handlers = [ const take = req.url.searchParams.get('take'); const takeNumber = take ? Number.parseInt(take) : undefined; - const items = umbLogviewerData.searches.getSavedSearches(skipNumber, takeNumber); + const items = umbLogViewerData.searches.getSavedSearches(skipNumber, takeNumber); const response = { total: items.length, @@ -22,11 +22,11 @@ export const handlers = [ }), rest.get(umbracoPath('/log-viewer/saved-search/:name'), (req, res, ctx) => { - const name = req.params.key as string; + const name = req.params.name as string; if (!name) return; - const item = umbLogviewerData.searches.getByName(name); + const item = umbLogViewerData.searches.getByName(name); return res(ctx.delay(), ctx.status(200), ctx.json(item)); }), @@ -35,6 +35,7 @@ export const handlers = [ }), rest.delete(umbracoPath('/log-viewer/saved-search/:name'), async (req, res, ctx) => { + // TODO: implement this return res(ctx.status(200)); }), //#endregion @@ -46,10 +47,10 @@ export const handlers = [ const take = req.url.searchParams.get('take'); const takeNumber = take ? Number.parseInt(take) : undefined; - const items = umbLogviewerData.templates.getTemplates(skipNumber, takeNumber); + const items = umbLogViewerData.templates.getTemplates(skipNumber, takeNumber); const response = { - total: umbLogviewerData.templates.total, + total: umbLogViewerData.templates.total, items, }; @@ -58,11 +59,11 @@ export const handlers = [ //#endregion //#region Logs rest.get(umbracoPath('/log-viewer/level'), (req, res, ctx) => { - return res(ctx.delay(), ctx.status(200), ctx.json(umbLogviewerData.logLevels)); + return res(ctx.delay(), ctx.status(200), ctx.json(umbLogViewerData.logLevels)); }), rest.get(umbracoPath('/log-viewer/level-count'), (req, res, ctx) => { - return res(ctx.delay(), ctx.status(200), ctx.json(umbLogviewerData.logs.getLevelCount())); + return res(ctx.delay(), ctx.status(200), ctx.json(umbLogViewerData.logs.getLevelCount())); }), rest.get(umbracoPath('/log-viewer/validate-logs-size'), (req, res, ctx) => { @@ -75,9 +76,9 @@ export const handlers = [ const take = req.url.searchParams.get('take'); const takeNumber = take ? Number.parseInt(take) : undefined; - const items = umbLogviewerData.logs.getLogs(skipNumber, takeNumber); + const items = umbLogViewerData.logs.getLogs(skipNumber, takeNumber); const response = { - total: umbLogviewerData.logs.total, + total: umbLogViewerData.logs.total, items, }; diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/media-type.handlers.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/media-type.handlers.ts index 0b16b0e0a8..c7f6cfdc13 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/media-type.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/media-type.handlers.ts @@ -9,18 +9,18 @@ export const handlers = [ }), rest.get('/umbraco/management/api/v1/tree/media-type/children', (req, res, ctx) => { - const parentKey = req.url.searchParams.get('parentKey'); - if (!parentKey) return; + const parentId = req.url.searchParams.get('parentId'); + if (!parentId) return; - const response = umbMediaTypeData.getTreeItemChildren(parentKey); + const response = umbMediaTypeData.getTreeItemChildren(parentId); return res(ctx.status(200), ctx.json(response)); }), rest.get('/umbraco/management/api/v1/tree/media-type/item', (req, res, ctx) => { - const keys = req.url.searchParams.getAll('key'); - if (!keys) return; + const ids = req.url.searchParams.getAll('id'); + if (!ids) return; - const items = umbMediaTypeData.getTreeItem(keys); + const items = umbMediaTypeData.getTreeItem(ids); return res(ctx.status(200), ctx.json(items)); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/media.handlers.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/media.handlers.ts index cd7c2479f4..efb5a91845 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/media.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/media.handlers.ts @@ -4,12 +4,12 @@ import type { MediaDetails } from '../../../backoffice/media/media'; // TODO: add schema export const handlers = [ - rest.get('/umbraco/management/api/v1/media/details/:key', (req, res, ctx) => { + rest.get('/umbraco/management/api/v1/media/details/:id', (req, res, ctx) => { console.warn('Please move to schema'); - const key = req.params.key as string; - if (!key) return; + const id = req.params.id as string; + if (!id) return; - const media = umbMediaData.getByKey(key); + const media = umbMediaData.getById(id); return res(ctx.status(200), ctx.json([media])); }), @@ -26,13 +26,13 @@ export const handlers = [ rest.post('/umbraco/management/api/v1/media/move', async (req, res, ctx) => { const data = await req.json(); if (!data) return; - const moved = umbMediaData.move(data.keys, data.destination); + const moved = umbMediaData.move(data.ids, data.destination); return res(ctx.status(200), ctx.json(moved)); }), rest.post('/umbraco/management/api/v1/media/trash', async (req, res, ctx) => { - const keys = await req.json(); - const trashed = umbMediaData.trash(keys); + const ids = await req.json(); + const trashed = umbMediaData.trash(ids); return res(ctx.status(200), ctx.json(trashed)); }), @@ -42,17 +42,17 @@ export const handlers = [ }), rest.get('/umbraco/management/api/v1/tree/media/children', (req, res, ctx) => { - const parentKey = req.url.searchParams.get('parentKey'); - if (!parentKey) return; - const response = umbMediaData.getTreeItemChildren(parentKey); + const parentId = req.url.searchParams.get('parentId'); + if (!parentId) return; + const response = umbMediaData.getTreeItemChildren(parentId); return res(ctx.status(200), ctx.json(response)); }), rest.get('/umbraco/management/api/v1/tree/media/item', (req, res, ctx) => { - const keys = req.url.searchParams.getAll('key'); - if (!keys) return; + const ids = req.url.searchParams.getAll('id'); + if (!ids) return; - const items = umbMediaData.getTreeItem(keys); + const items = umbMediaData.getTreeItem(ids); return res(ctx.status(200), ctx.json(items)); }), diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/member-group.handlers.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/member-group.handlers.ts index 04f3c6817b..a438855cdb 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/member-group.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/member-group.handlers.ts @@ -9,10 +9,10 @@ export const handlers = [ }), rest.get('/umbraco/management/api/v1/tree/member-group/item', (req, res, ctx) => { - const keys = req.url.searchParams.getAll('key'); - if (!keys) return; + const ids = req.url.searchParams.getAll('id'); + if (!ids) return; - const items = umbMemberGroupData.getTreeItem(keys); + const items = umbMemberGroupData.getTreeItem(ids); return res(ctx.status(200), ctx.json(items)); }), diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/member-type.handlers.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/member-type.handlers.ts index 9411d8a2aa..4905f5fc1e 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/member-type.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/member-type.handlers.ts @@ -9,10 +9,10 @@ export const handlers = [ }), rest.get('/umbraco/management/api/v1/tree/member-type/item', (req, res, ctx) => { - const keys = req.url.searchParams.getAll('key'); - if (!keys) return; + const ids = req.url.searchParams.getAll('id'); + if (!ids) return; - const items = umbMemberTypeData.getTreeItem(keys); + const items = umbMemberTypeData.getTreeItem(ids); return res(ctx.status(200), ctx.json(items)); }), diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/member.handlers.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/member.handlers.ts index 41555f9b2f..b3a45839ae 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/member.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/member.handlers.ts @@ -9,10 +9,10 @@ export const handlers = [ }), rest.get('/umbraco/management/api/v1/tree/member/item', (req, res, ctx) => { - const keys = req.url.searchParams.getAll('key'); - if (!keys) return; + const ids = req.url.searchParams.getAll('id'); + if (!ids) return; - const items = umbMemberData.getTreeItem(keys); + const items = umbMemberData.getTreeItem(ids); return res(ctx.status(200), ctx.json(items)); }), diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/package.handlers.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/package.handlers.ts index 886d08f5ef..840dbc0371 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/package.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/package.handlers.ts @@ -54,40 +54,40 @@ export const handlers = [ rest.post(umbracoPath('/package/created'), async (_req, res, ctx) => { //save const data: PackageMigrationStatusResponseModel = await _req.json(); - const newPackage: PackageDefinitionResponseModel = { ...data, key: uuidv4() }; + const newPackage: PackageDefinitionResponseModel = { ...data, id: uuidv4() }; packageArray.push(newPackage); return res(ctx.status(200), ctx.json(newPackage)); }), - rest.get(umbracoPath('/package/created/:key'), (_req, res, ctx) => { + rest.get(umbracoPath('/package/created/:id'), (_req, res, ctx) => { //read 1 - const key = _req.params.key as string; - if (!key) return res(ctx.status(404)); - const found = packageArray.find((p) => p.key == key); + const id = _req.params.id as string; + if (!id) return res(ctx.status(404)); + const found = packageArray.find((p) => p.id == id); if (!found) return res(ctx.status(404)); return res(ctx.status(200), ctx.json(found)); }), - rest.put(umbracoPath('/package/created/:key'), async (_req, res, ctx) => { + rest.put(umbracoPath('/package/created/:id'), async (_req, res, ctx) => { //update const data: PackageDefinitionResponseModel = await _req.json(); - if (!data.key) return; - const index = packageArray.findIndex((x) => x.key === data.key); + if (!data.id) return; + const index = packageArray.findIndex((x) => x.id === data.id); packageArray[index] = data; return res(ctx.status(200)); }), - rest.delete(umbracoPath('/package/created/:key'), (_req, res, ctx) => { + rest.delete(umbracoPath('/package/created/:id'), (_req, res, ctx) => { //delete - const key = _req.params.key as string; - if (!key) return res(ctx.status(404)); - const index = packageArray.findIndex((p) => p.key == key); + const id = _req.params.id as string; + if (!id) return res(ctx.status(404)); + const index = packageArray.findIndex((p) => p.id == id); if (index <= -1) return res(ctx.status(404)); packageArray.splice(index, 1); return res(ctx.status(200)); }), - rest.get(umbracoPath('/package/created/:key/download'), (_req, res, ctx) => { + rest.get(umbracoPath('/package/created/:id/download'), (_req, res, ctx) => { //download return res(ctx.status(200)); }), @@ -95,12 +95,12 @@ export const handlers = [ const packageArray: PackageDefinitionResponseModel[] = [ { - key: '2a0181ec-244b-4068-a1d7-2f95ed7e6da6', + id: '2a0181ec-244b-4068-a1d7-2f95ed7e6da6', packagePath: undefined, name: 'My Package', //contentNodeId?: string | null; //contentLoadChildNodes?: boolean; - //mediaKeys?: Array; + //mediaIds?: Array; //mediaLoadChildNodes?: boolean; //documentTypes?: Array; //mediaTypes?: Array; @@ -113,13 +113,13 @@ const packageArray: PackageDefinitionResponseModel[] = [ //dictionaryItems?: Array; }, { - key: '2a0181ec-244b-4068-a1d7-2f95ed7e6da7', + id: '2a0181ec-244b-4068-a1d7-2f95ed7e6da7', packagePath: undefined, name: 'My Second Package', }, { - key: '2a0181ec-244b-4068-a1d7-2f95ed7e6da8', + id: '2a0181ec-244b-4068-a1d7-2f95ed7e6da8', packagePath: undefined, name: 'My Third Package', }, diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/redirect-management.handlers.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/redirect-management.handlers.ts index 0b408a404a..af6d756e80 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/redirect-management.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/redirect-management.handlers.ts @@ -35,21 +35,21 @@ export const handlers = [ } }), - rest.get(umbracoPath('/redirect-management/:key'), async (_req, res, ctx) => { - const key = _req.params.key as string; - if (!key) return res(ctx.status(404)); - if (key === 'status') return res(ctx.status(200), ctx.json(UrlTracker)); + rest.get(umbracoPath('/redirect-management/:id'), async (_req, res, ctx) => { + const id = _req.params.id as string; + if (!id) return res(ctx.status(404)); + if (id === 'status') return res(ctx.status(200), ctx.json(UrlTracker)); - const PagedRedirectUrlObject = _getRedirectUrlByKey(key); + const PagedRedirectUrlObject = _getRedirectUrlByKey(id); return res(ctx.status(200), ctx.json(PagedRedirectUrlObject)); }), - rest.delete(umbracoPath('/redirect-management/:key'), async (_req, res, ctx) => { - const key = _req.params.key as string; - if (!key) return res(ctx.status(404)); + rest.delete(umbracoPath('/redirect-management/:id'), async (_req, res, ctx) => { + const id = _req.params.id as string; + if (!id) return res(ctx.status(404)); - const PagedRedirectUrlObject = _deleteRedirectUrlByKey(key); + const PagedRedirectUrlObject = _deleteRedirectUrlByKey(id); return res(ctx.status(200), ctx.json(PagedRedirectUrlObject)); }), @@ -69,13 +69,13 @@ export const handlers = [ const UrlTracker: RedirectUrlStatusResponseModel = { status: RedirectStatusModel.ENABLED, userIsAdmin: true }; -const _getRedirectUrlByKey = (key: string) => { +const _getRedirectUrlByKey = (id: string) => { const PagedResult: PagedRedirectUrlResponseModel = { total: 0, items: [], }; RedirectUrlData.forEach((data) => { - if (data.key?.includes(key)) { + if (data.id?.includes(id)) { PagedResult.items.push(data); PagedResult.total++; } @@ -83,8 +83,8 @@ const _getRedirectUrlByKey = (key: string) => { return PagedResult; }; -const _deleteRedirectUrlByKey = (key: string) => { - const index = RedirectUrlData.findIndex((data) => data.key === key); +const _deleteRedirectUrlByKey = (id: string) => { + const index = RedirectUrlData.findIndex((data) => data.id === id); if (index > -1) RedirectUrlData.splice(index, 1); const PagedResult: PagedRedirectUrlResponseModel = { items: RedirectUrlData, @@ -95,81 +95,81 @@ const _deleteRedirectUrlByKey = (key: string) => { const RedirectUrlData: RedirectUrlResponseModel[] = [ { - key: '1', + id: '1', created: '2022-12-05T13:59:43.6827244', destinationUrl: 'kitty.com', originalUrl: 'kitty.dk', - contentKey: '7191c911-6747-4824-849e-5208e2b31d9f2', + contentId: '7191c911-6747-4824-849e-5208e2b31d9f2', }, { - key: '2', + id: '2', created: '2022-13-05T13:59:43.6827244', destinationUrl: 'umbraco.com', originalUrl: 'umbraco.dk', - contentKey: '7191c911-6747-4824-849e-5208e2b31d9f', + contentId: '7191c911-6747-4824-849e-5208e2b31d9f', }, { - key: '3', + id: '3', created: '2022-12-05T13:59:43.6827244', destinationUrl: 'uui.umbraco.com', originalUrl: 'uui.umbraco.dk', - contentKey: '7191c911-6747-4824-849e-5208e2b31d9f23', + contentId: '7191c911-6747-4824-849e-5208e2b31d9f23', }, { - key: '4', + id: '4', created: '2022-13-05T13:59:43.6827244', destinationUrl: 'umbracoffee.com', originalUrl: 'umbracoffee.dk', - contentKey: '7191c911-6747-4824-849e-5208e2b31d9fdsaa', + contentId: '7191c911-6747-4824-849e-5208e2b31d9fdsaa', }, { - key: '5', + id: '5', created: '2022-12-05T13:59:43.6827244', destinationUrl: 'section/settings', originalUrl: 'section/settings/123', - contentKey: '7191c911-6747-4824-849e-5208e2b31d9f2e23', + contentId: '7191c911-6747-4824-849e-5208e2b31d9f2e23', }, { - key: '6', + id: '6', created: '2022-13-05T13:59:43.6827244', destinationUrl: 'dxp.com', originalUrl: 'dxp.dk', - contentKey: '7191c911-6747-4824-849e-5208e2b31d9fsafsfd', + contentId: '7191c911-6747-4824-849e-5208e2b31d9fsafsfd', }, { - key: '7', + id: '7', created: '2022-12-05T13:59:43.6827244', destinationUrl: 'google.com', originalUrl: 'google.dk', - contentKey: '7191c911-6747-4824-849e-5208e2b31d9f2cxza', + contentId: '7191c911-6747-4824-849e-5208e2b31d9f2cxza', }, { - key: '8', + id: '8', created: '2022-13-05T13:59:43.6827244', destinationUrl: 'unicorns.com', originalUrl: 'unicorns.dk', - contentKey: '7191c911-6747-4824-849e-5208e2b31d9fweds', + contentId: '7191c911-6747-4824-849e-5208e2b31d9fweds', }, { - key: '9', + id: '9', created: '2022-12-05T13:59:43.6827244', destinationUrl: 'h5yr.com', originalUrl: 'h5yr.dk', - contentKey: '7191c911-6747-4824-849e-5208e2b31ddsfsdsfadsfdx9f2', + contentId: '7191c911-6747-4824-849e-5208e2b31ddsfsdsfadsfdx9f2', }, { - key: '10', + id: '10', created: '2022-13-05T13:59:43.6827244', destinationUrl: 'our.umbraco.com', originalUrl: 'our.umbraco.dk', - contentKey: '7191c911-6747-4824-849e-52dsacx08e2b31d9dsafdsff', + contentId: '7191c911-6747-4824-849e-52dsacx08e2b31d9dsafdsff', }, { - key: '11', + id: '11', created: '2022-13-05T13:59:43.6827244', destinationUrl: 'your.umbraco.com', originalUrl: 'your.umbraco.dk', - contentKey: '7191c911-6747-4824-849e-52dsacx08e2b31d9fsda', + contentId: '7191c911-6747-4824-849e-52dsacx08e2b31d9fsda', }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/relation-type.handlers.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/relation-type.handlers.ts index d1e39b7a1b..0e4c1d4ea6 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/relation-type.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/relation-type.handlers.ts @@ -4,11 +4,11 @@ import { umbracoPath } from '@umbraco-cms/backoffice/utils'; // TODO: add schema export const handlers = [ - rest.delete('/umbraco/backoffice/relation-type/:key', async (req, res, ctx) => { - const key = req.params.key as string; - if (!key) return; + rest.delete('/umbraco/backoffice/relation-type/:id', async (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return; - umbRelationTypeData.delete([key]); + umbRelationTypeData.delete([id]); return res(ctx.status(200)); }), @@ -23,10 +23,10 @@ export const handlers = [ }), rest.get('/umbraco/management/api/v1/tree/relation-type/children', (req, res, ctx) => { - const parentKey = req.url.searchParams.get('parentKey'); - if (!parentKey) return; + const parentId = req.url.searchParams.get('parentId'); + if (!parentId) return; - const children = umbRelationTypeData.getTreeItemChildren(parentKey); + const children = umbRelationTypeData.getTreeItemChildren(parentId); const response = { total: children.length, @@ -37,22 +37,22 @@ export const handlers = [ }), rest.get('/umbraco/management/api/v1/tree/relation-type/item', (req, res, ctx) => { - const keys = req.url.searchParams.getAll('key'); - if (!keys) return; - const items = umbRelationTypeData.getTreeItem(keys); + const ids = req.url.searchParams.getAll('id'); + if (!ids) return; + const items = umbRelationTypeData.getTreeItem(ids); return res(ctx.status(200), ctx.json(items)); }), - rest.get(umbracoPath('/relation-type/:key'), (req, res, ctx) => { - const key = req.params.key as string; - if (!key) return; + rest.get(umbracoPath('/relation-type/:id'), (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return; - const RelationType = umbRelationTypeData.getByKey(key); + const RelationType = umbRelationTypeData.getById(id); return res(ctx.status(200), ctx.json(RelationType)); }), - rest.post(umbracoPath('/relation-type/:key'), async (req, res, ctx) => { + rest.post(umbracoPath('/relation-type/:id'), async (req, res, ctx) => { const data = await req.json(); if (!data) return; @@ -61,7 +61,7 @@ export const handlers = [ return res(ctx.status(200), ctx.json(saved)); }), - rest.put(umbracoPath('/relation-type/:key'), async (req, res, ctx) => { + rest.put(umbracoPath('/relation-type/:id'), async (req, res, ctx) => { const data = await req.json(); if (!data) return; diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/template.handlers.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/template.handlers.ts index e0bd906f49..55e73ea95b 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/template.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/template.handlers.ts @@ -11,18 +11,18 @@ export const handlers = [ }), rest.get(umbracoPath('/tree/template/children'), (req, res, ctx) => { - const parentKey = req.url.searchParams.get('parentKey'); - if (!parentKey) return; + const parentId = req.url.searchParams.get('parentId'); + if (!parentId) return; - const response = umbTemplateData.getTreeItemChildren(parentKey); + const response = umbTemplateData.getTreeItemChildren(parentId); return res(ctx.status(200), ctx.json(response)); }), rest.get(umbracoPath('/tree/template/item'), (req, res, ctx) => { - const keys = req.url.searchParams.getAll('key'); - if (!keys) return; + const ids = req.url.searchParams.getAll('id'); + if (!ids) return; - const items = umbTemplateData.getTreeItem(keys); + const items = umbTemplateData.getTreeItem(ids); return res(ctx.status(200), ctx.json(items)); }), @@ -34,18 +34,18 @@ export const handlers = [ return res(ctx.status(200), ctx.json(response)); }), - rest.get(umbracoPath('/template/:key'), (req, res, ctx) => { - const key = req.params.key as string; - if (!key) return; + rest.get(umbracoPath('/template/:id'), (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return; - const response = umbTemplateData.getByKey(key); + const response = umbTemplateData.getById(id); return res(ctx.status(200), ctx.json(response)); }), - rest.put(umbracoPath('/template/:key'), async (req, res, ctx) => { - const key = req.params.key as string; + rest.put(umbracoPath('/template/:id'), async (req, res, ctx) => { + const id = req.params.id as string; const data = await req.json(); - if (!key) return; + if (!id) return; umbTemplateData.update(data); return res(ctx.status(200)); diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/tree-media.handlers.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/tree-media.handlers.ts index b61126fa72..666bd348ed 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/tree-media.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/tree-media.handlers.ts @@ -9,17 +9,17 @@ export const handlers = [ }), rest.get('/umbraco/management/api/v1/tree/media/children', (req, res, ctx) => { - const parentKey = req.url.searchParams.get('parentKey'); - if (!parentKey) return; - const response = umbMediaData.getTreeItemChildren(parentKey); + const parentId = req.url.searchParams.get('parentId'); + if (!parentId) return; + const response = umbMediaData.getTreeItemChildren(parentId); return res(ctx.status(200), ctx.json(response)); }), rest.get('/umbraco/management/api/v1/tree/media/item', (req, res, ctx) => { - const keys = req.url.searchParams.getAll('key'); - if (!keys) return; + const ids = req.url.searchParams.getAll('id'); + if (!ids) return; - const items = umbMediaData.getTreeItem(keys); + const items = umbMediaData.getTreeItem(ids); return res(ctx.status(200), ctx.json(items)); }), diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/user-groups.handlers.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/user-groups.handlers.ts index e32b063ec5..929979ba43 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/user-groups.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/user-groups.handlers.ts @@ -14,19 +14,19 @@ export const handlers = [ return res(ctx.status(200), ctx.json(response)); }), - rest.get('/umbraco/backoffice/user-groups/details/:key', (req, res, ctx) => { - const key = req.params.key as string; - if (!key) return; + rest.get('/umbraco/backoffice/user-groups/details/:id', (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return; - const userGroup = umbUserGroupsData.getByKey(key); + const userGroup = umbUserGroupsData.getById(id); return res(ctx.status(200), ctx.json(userGroup)); }), rest.get('/umbraco/backoffice/user-groups/getByKeys', (req, res, ctx) => { - const keys = req.url.searchParams.getAll('key'); - if (keys.length === 0) return; - const userGroups = umbUserGroupsData.getByKeys(keys); + const ids = req.url.searchParams.getAll('id'); + if (ids.length === 0) return; + const userGroups = umbUserGroupsData.getByIds(ids); return res(ctx.status(200), ctx.json(userGroups)); }), diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/users.handlers.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/users.handlers.ts index 298b454273..e56784f793 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/users.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/users.handlers.ts @@ -16,19 +16,19 @@ export const handlers = [ return res(ctx.status(200), ctx.json(response)); }), - rest.get('/umbraco/backoffice/users/details/:key', (req, res, ctx) => { - const key = req.params.key as string; - if (!key) return; + rest.get('/umbraco/backoffice/users/details/:id', (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return; - const user = umbUsersData.getByKey(key); + const user = umbUsersData.getById(id); return res(ctx.status(200), ctx.json(user)); }), rest.get('/umbraco/backoffice/users/getByKeys', (req, res, ctx) => { - const keys = req.url.searchParams.getAll('key'); - if (keys.length === 0) return; - const users = umbUsersData.getByKeys(keys); + const ids = req.url.searchParams.getAll('id'); + if (ids.length === 0) return; + const users = umbUsersData.getByIds(ids); return res(ctx.status(200), ctx.json(users)); }), @@ -49,7 +49,7 @@ export const handlers = [ if (!data) return; const newUser: UserDetails = { - key: uuidv4(), + id: uuidv4(), name: data.name, email: data.email, status: 'invited', @@ -57,7 +57,7 @@ export const handlers = [ updateDate: new Date().toISOString(), createDate: new Date().toISOString(), failedLoginAttempts: 0, - parentKey: '', + parentId: '', hasChildren: false, type: 'user', icon: 'umb:icon-user', diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/e2e-handlers.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/e2e-handlers.ts index eb8be4c283..e0a5d8efe6 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/e2e-handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/e2e-handlers.ts @@ -1,4 +1,4 @@ -import { handlers as dataTypeHandlers } from './domains/data-type.handlers'; +import { handlers as dataTypeHandlers } from './domains/data-type'; import { handlers as documentTypeHandlers } from './domains/document-type.handlers'; import { handlers as installHandlers } from './domains/install.handlers'; import * as manifestsHandlers from './domains/manifests.handlers'; diff --git a/src/Umbraco.Web.UI.Client/src/core/router/index.ts b/src/Umbraco.Web.UI.Client/src/core/router/index.ts index d3c5361842..fbbe29d96c 100644 --- a/src/Umbraco.Web.UI.Client/src/core/router/index.ts +++ b/src/Umbraco.Web.UI.Client/src/core/router/index.ts @@ -1,4 +1,3 @@ -export * from 'router-slot'; export * from './router-slot.element'; export * from './router-slot-change.event'; export * from './router-slot-init.event'; diff --git a/src/Umbraco.Web.UI.Client/src/core/router/router-slot.element.ts b/src/Umbraco.Web.UI.Client/src/core/router/router-slot.element.ts index a7c2fbf904..d055f41278 100644 --- a/src/Umbraco.Web.UI.Client/src/core/router/router-slot.element.ts +++ b/src/Umbraco.Web.UI.Client/src/core/router/router-slot.element.ts @@ -1,5 +1,5 @@ -import type { IRoute } from 'router-slot/model'; -import { RouterSlot } from 'router-slot'; +// eslint-disable-next-line local-rules/no-external-imports +import { RouterSlot } from 'router-slot/router-slot'; import { css, html, PropertyValueMap } from 'lit'; import { customElement, property } from 'lit/decorators.js'; import { UmbLitElement } from '../lit-element'; @@ -36,10 +36,10 @@ export class UmbRouterSlotElement extends UmbLitElement { @property() public get routes(): UmbRoute[] | undefined { - return (this.#router as any).routes; + return this.#router.routes; } public set routes(value: UmbRoute[] | undefined) { - this.#router.routes = (value as IRoute[]) || []; + this.#router.routes = value || []; } private _routerPath?: string; @@ -57,7 +57,7 @@ export class UmbRouterSlotElement extends UmbLitElement { } #routeContext = new UmbRouteContext(this, (contextRoutes) => { - (this.#modalRouter as any).routes = contextRoutes; + this.#modalRouter.routes = contextRoutes; // Force a render? this.#modalRouter.render(); }); diff --git a/src/Umbraco.Web.UI.Client/src/installer/database/installer-database.element.ts b/src/Umbraco.Web.UI.Client/src/installer/database/installer-database.element.ts index 7bb1c6c9e4..7b6f8921df 100644 --- a/src/Umbraco.Web.UI.Client/src/installer/database/installer-database.element.ts +++ b/src/Umbraco.Web.UI.Client/src/installer/database/installer-database.element.ts @@ -253,7 +253,7 @@ export class UmbInstallerDatabaseElement extends UmbLitElement { // TODO: The post install will probably return a user in the future, so we have to set that context somewhere to let the client know that it is authenticated console.warn('TODO: Set up real authentication'); sessionStorage.setItem('is-authenticated', 'true'); - history.replaceState(null, '', '/content'); + history.replaceState(null, '', 'section/content'); } private _handleRejected(e: ProblemDetailsModel) { diff --git a/src/Umbraco.Web.UI.Client/src/stories/store.mdx b/src/Umbraco.Web.UI.Client/src/stories/store.mdx index 667afd9124..1140ee8e40 100644 --- a/src/Umbraco.Web.UI.Client/src/stories/store.mdx +++ b/src/Umbraco.Web.UI.Client/src/stories/store.mdx @@ -11,7 +11,7 @@ Generally a Store will be holding one or more RxJS Subjects, each Subject is mad ```typescript class MyProductStore { - #products = new ArrayState(>[], (product) => product.key); + #products = new ArrayState(>[], (product) => product.id); public readonly products = this.#products.asObservable(); @@ -65,10 +65,10 @@ class MyProductStore { ... - getByKey(key: string) { + getByKey(id: string) { // Request data via a Resource to then take part of this state when recieved. - tryExecuteAndNotify(this.host, ProductResource.getByKey({key})).then(({ data }) => { + tryExecuteAndNotify(this.host, ProductResource.getByKey({id})).then(({ data }) => { if (data) { this.#products.append(data.items); } @@ -76,7 +76,7 @@ class MyProductStore { // Return a Observable part, to listen for this specific product and the future changes of it. return this.#data.getObservablePart((documents) => - documents.find((document) => document.key === key) + documents.find((document) => document.id === id) ); } } @@ -134,11 +134,11 @@ With this we can make a high performant application, only triggering the parts t ### Ensure unique data: For incoming data to replace existing data, we need to clarify what makes a entry of the array unique. -In the examples of this guide each product has a key, and we have clarified this to the State by giving it the little method `(product) => product.key` as part of the its creation: +In the examples of this guide each product has a id, and we have clarified this to the State by giving it the little method `(product) => product.id` as part of the its creation: ```typescript class MyProductStore { - #products = new ArrayState(>[], (product) => product.key); + #products = new ArrayState(>[], (product) => product.id); ... } ``` diff --git a/src/Umbraco.Web.UI.Client/src/upgrader/upgrader.element.ts b/src/Umbraco.Web.UI.Client/src/upgrader/upgrader.element.ts index 2ff39b81f7..b483b5c8e2 100644 --- a/src/Umbraco.Web.UI.Client/src/upgrader/upgrader.element.ts +++ b/src/Umbraco.Web.UI.Client/src/upgrader/upgrader.element.ts @@ -64,7 +64,7 @@ export class UmbUpgraderElement extends UmbLitElement { if (error) { this.errorMessage = error.detail || 'Unknown error, please try again'; } else { - history.pushState(null, '', '/'); + history.pushState(null, '', 'section/content'); } this.upgrading = false;