diff --git a/.gitattributes b/.gitattributes index 8ac58cf5fedf..6e707b77968f 100644 --- a/.gitattributes +++ b/.gitattributes @@ -46,6 +46,7 @@ *.xml text=auto *.resx text=auto *.yml text eol=lf core.whitespace whitespace=tab-in-indent,trailing-space,tabwidth=2 +*.sh eol=lf *.csproj text=auto merge=union *.vbproj text=auto merge=union diff --git a/build/azure-pipelines.yml b/build/azure-pipelines.yml index 9d53b2e7108e..865d97081d2e 100644 --- a/build/azure-pipelines.yml +++ b/build/azure-pipelines.yml @@ -117,8 +117,7 @@ stages: - checkout: self submodules: false lfs: false, - fetchDepth: 1 - fetchFilter: tree:0 + fetchDepth: 500 - template: templates/backoffice-install.yml - script: npm run build:for:npm displayName: Run build:for:npm @@ -936,6 +935,7 @@ stages: inputs: archiveFilePatterns: $(Build.SourcesDirectory)/csharp-docs.zip destinationFolder: $(Build.ArtifactStagingDirectory)/csharp-docs + overwriteExistingFiles: true - task: AzureFileCopy@4 displayName: "Copy C# Docs to blob storage" inputs: @@ -959,6 +959,7 @@ stages: inputs: archiveFilePatterns: $(Build.SourcesDirectory)/ui-docs.zip destinationFolder: $(Build.ArtifactStagingDirectory)/ui-docs + overwriteExistingFiles: true - task: AzureFileCopy@4 displayName: "Copy Storybook to blob storage" inputs: @@ -982,6 +983,7 @@ stages: inputs: archiveFilePatterns: $(Build.SourcesDirectory)/ui-api-docs.zip destinationFolder: $(Build.ArtifactStagingDirectory)/ui-api-docs + overwriteExistingFiles: true - task: AzureFileCopy@4 displayName: "Copy UI API Docs to blob storage" inputs: diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index 2ef6624f2dff..720f9f606987 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -1,12 +1,12 @@ { "name": "@umbraco-cms/backoffice", - "version": "15.1.0", + "version": "15.2.0-rc", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@umbraco-cms/backoffice", - "version": "15.1.0", + "version": "15.2.0-rc", "license": "MIT", "workspaces": [ "./src/packages/*" diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index ac0729df99a7..12b8fdd0e6d6 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -1,7 +1,7 @@ { "name": "@umbraco-cms/backoffice", "license": "MIT", - "version": "15.1.0", + "version": "15.2.0-rc", "type": "module", "exports": { ".": null, diff --git a/src/Umbraco.Web.UI.Client/src/mocks/browser-handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/browser-handlers.ts index efe0bdefc2e3..7f3350388343 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/browser-handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/browser-handlers.ts @@ -1,4 +1,4 @@ -import { handlers as backofficeHandlers } from './handlers/backoffice.handlers.js'; +import { handlers as backofficeHandlers } from './handlers/backoffice/backoffice.handlers.js'; import { handlers as configHandlers } from './handlers/config.handlers.js'; import { handlers as cultureHandlers } from './handlers/culture.handlers.js'; import { handlers as dataTypeHandlers } from './handlers/data-type/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/backoffice/assets/login.jpg b/src/Umbraco.Web.UI.Client/src/mocks/handlers/backoffice/assets/login.jpg new file mode 100644 index 000000000000..ed893bf3c00f Binary files /dev/null and b/src/Umbraco.Web.UI.Client/src/mocks/handlers/backoffice/assets/login.jpg differ diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/backoffice/assets/logo.svg b/src/Umbraco.Web.UI.Client/src/mocks/handlers/backoffice/assets/logo.svg new file mode 100644 index 000000000000..9372e25d3ee9 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/backoffice/assets/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/backoffice/assets/logo_dark.svg b/src/Umbraco.Web.UI.Client/src/mocks/handlers/backoffice/assets/logo_dark.svg new file mode 100644 index 000000000000..578bf592f68e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/backoffice/assets/logo_dark.svg @@ -0,0 +1,51 @@ + + + diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/backoffice/assets/logo_light.svg b/src/Umbraco.Web.UI.Client/src/mocks/handlers/backoffice/assets/logo_light.svg new file mode 100644 index 000000000000..01f7260cd3b4 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/backoffice/assets/logo_light.svg @@ -0,0 +1,51 @@ + + + diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/backoffice.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/backoffice/backoffice.handlers.ts similarity index 55% rename from src/Umbraco.Web.UI.Client/src/mocks/handlers/backoffice.handlers.ts rename to src/Umbraco.Web.UI.Client/src/mocks/handlers/backoffice/backoffice.handlers.ts index 5ee5c0963b22..ddf3473bbf6e 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/backoffice.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/backoffice/backoffice.handlers.ts @@ -1,50 +1,46 @@ const { rest } = window.MockServiceWorker; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; -import logoUrl from '../../../../Umbraco.Cms.StaticAssets/wwwroot/umbraco/assets/logo.svg'; -import loginLogoUrl from '../../../../Umbraco.Cms.StaticAssets/wwwroot/umbraco/assets/logo_light.svg'; -import loginLogoAlternativeUrl from '../../../../Umbraco.Cms.StaticAssets/wwwroot/umbraco/assets/logo_dark.svg'; -import loginBackgroundUrl from '../../../../Umbraco.Cms.StaticAssets/wwwroot/umbraco/assets/login.jpg'; +const logoUrl = './src/mocks/handlers/backoffice/assets/logo.svg'; +const loginLogoUrl = './src/mocks/handlers/backoffice/assets/logo_light.svg'; +const loginLogoAlternativeUrl = './src/mocks/handlers/backoffice/assets/logo_dark.svg'; +const loginBackgroundUrl = './src/mocks/handlers/backoffice/assets/login.jpg'; export const handlers = [ rest.get(umbracoPath('/security/back-office/graphics/logo'), async (req, res, ctx) => { - const imageBuffer = await fetch(logoUrl) - .then((res) => res.arrayBuffer()); + const imageBuffer = await fetch(logoUrl).then((res) => res.arrayBuffer()); return res( ctx.set('Content-Length', imageBuffer.byteLength.toString()), ctx.set('Content-Type', 'image/svg+xml'), - ctx.body(imageBuffer) + ctx.body(imageBuffer), ); }), rest.get(umbracoPath('/security/back-office/graphics/login-logo'), async (req, res, ctx) => { - const imageBuffer = await fetch(loginLogoUrl) - .then((res) => res.arrayBuffer()); + const imageBuffer = await fetch(loginLogoUrl).then((res) => res.arrayBuffer()); return res( ctx.set('Content-Length', imageBuffer.byteLength.toString()), ctx.set('Content-Type', 'image/svg+xml'), - ctx.body(imageBuffer) + ctx.body(imageBuffer), ); }), rest.get(umbracoPath('/security/back-office/graphics/login-logo-alternative'), async (req, res, ctx) => { - const imageBuffer = await fetch(loginLogoAlternativeUrl) - .then((res) => res.arrayBuffer()); + const imageBuffer = await fetch(loginLogoAlternativeUrl).then((res) => res.arrayBuffer()); return res( ctx.set('Content-Length', imageBuffer.byteLength.toString()), ctx.set('Content-Type', 'image/svg+xml'), - ctx.body(imageBuffer) + ctx.body(imageBuffer), ); }), rest.get(umbracoPath('/security/back-office/graphics/login-background'), async (req, res, ctx) => { - const imageBuffer = await fetch(loginBackgroundUrl) - .then((res) => res.arrayBuffer()); + const imageBuffer = await fetch(loginBackgroundUrl).then((res) => res.arrayBuffer()); return res( ctx.set('Content-Length', imageBuffer.byteLength.toString()), ctx.set('Content-Type', 'image/jpeg'), - ctx.body(imageBuffer) + ctx.body(imageBuffer), ); }), ]; diff --git a/src/Umbraco.Web.UI.Client/utils/all-umb-consts/index.ts b/src/Umbraco.Web.UI.Client/utils/all-umb-consts/index.ts index b7973df0bbc5..53a950a28e5f 100644 --- a/src/Umbraco.Web.UI.Client/utils/all-umb-consts/index.ts +++ b/src/Umbraco.Web.UI.Client/utils/all-umb-consts/index.ts @@ -96,7 +96,7 @@ export const foundConsts = [{ }, { path: '@umbraco-cms/backoffice/content', - consts: ["UMB_CONTENT_COLLECTION_WORKSPACE_CONTEXT","UMB_CONTENT_HAS_PROPERTIES_WORKSPACE_CONDITION","UMB_CONTENT_SECTION_ALIAS","UMB_CONTENT_PROPERTY_CONTEXT","UMB_CONTENT_WORKSPACE_CONTEXT"] + consts: ["UMB_CONTENT_COLLECTION_WORKSPACE_CONTEXT","UMB_CONTENT_HAS_PROPERTIES_WORKSPACE_CONDITION","UMB_CONTENT_SECTION_ALIAS","UMB_CONTENT_PROPERTY_CONTEXT","UMB_CONTENT_PROPERTY_DATASET_CONTEXT","UMB_CONTENT_WORKSPACE_CONTEXT"] }, { path: '@umbraco-cms/backoffice/culture', @@ -216,7 +216,7 @@ export const foundConsts = [{ }, { path: '@umbraco-cms/backoffice/member', - consts: ["UMB_MEMBER_COLLECTION_ALIAS","UMB_MEMBER_COLLECTION_CONTEXT","UMB_MEMBER_COLLECTION_REPOSITORY_ALIAS","UMB_MEMBER_TABLE_COLLECTION_VIEW_ALIAS","UMB_MEMBER_PICKER_MODAL","UMB_MEMBER_CREATE_OPTIONS_MODAL","UMB_MEMBER_ENTITY_TYPE","UMB_MEMBER_ROOT_ENTITY_TYPE","UMB_MEMBER_WORKSPACE_PATH","UMB_MEMBER_ROOT_WORKSPACE_PATH","UMB_CREATE_MEMBER_WORKSPACE_PATH_PATTERN","UMB_MEMBER_VARIANT_CONTEXT","UMB_MEMBER_DETAIL_REPOSITORY_ALIAS","UMB_MEMBER_DETAIL_STORE_ALIAS","UMB_MEMBER_DETAIL_STORE_CONTEXT","UMB_MEMBER_ITEM_REPOSITORY_ALIAS","UMB_MEMBER_STORE_ALIAS","UMB_MEMBER_ITEM_STORE_CONTEXT","UMB_MEMBER_SEARCH_PROVIDER_ALIAS","UMB_MEMBER_DETAIL_MODEL_VARIANT_SCAFFOLD","UMB_MEMBER_WORKSPACE_ALIAS","UMB_MEMBER_WORKSPACE_CONTEXT","UMB_MEMBER_ROOT_WORKSPACE_ALIAS"] + consts: ["UMB_MEMBER_COLLECTION_ALIAS","UMB_MEMBER_COLLECTION_CONTEXT","UMB_MEMBER_COLLECTION_REPOSITORY_ALIAS","UMB_MEMBER_TABLE_COLLECTION_VIEW_ALIAS","UMB_MEMBER_PICKER_MODAL","UMB_MEMBER_CREATE_OPTIONS_MODAL","UMB_MEMBER_ENTITY_TYPE","UMB_MEMBER_ROOT_ENTITY_TYPE","UMB_MEMBER_WORKSPACE_PATH","UMB_MEMBER_ROOT_WORKSPACE_PATH","UMB_CREATE_MEMBER_WORKSPACE_PATH_PATTERN","UMB_MEMBER_VARIANT_CONTEXT","UMB_MEMBER_DETAIL_REPOSITORY_ALIAS","UMB_MEMBER_DETAIL_STORE_ALIAS","UMB_MEMBER_DETAIL_STORE_CONTEXT","UMB_MEMBER_ITEM_REPOSITORY_ALIAS","UMB_MEMBER_STORE_ALIAS","UMB_MEMBER_ITEM_STORE_CONTEXT","UMB_MEMBER_VALIDATION_REPOSITORY_ALIAS","UMB_MEMBER_SEARCH_PROVIDER_ALIAS","UMB_MEMBER_DETAIL_MODEL_VARIANT_SCAFFOLD","UMB_MEMBER_WORKSPACE_ALIAS","UMB_MEMBER_WORKSPACE_CONTEXT","UMB_MEMBER_ROOT_WORKSPACE_ALIAS"] }, { path: '@umbraco-cms/backoffice/menu', diff --git a/src/Umbraco.Web.UI.Client/web-test-runner.index.ts b/src/Umbraco.Web.UI.Client/web-test-runner.index.ts index 3a21fef3d112..4812325ea867 100644 --- a/src/Umbraco.Web.UI.Client/web-test-runner.index.ts +++ b/src/Umbraco.Web.UI.Client/web-test-runner.index.ts @@ -1,7 +1,7 @@ import { handlers } from './src/mocks/browser-handlers.js'; import { onUnhandledRequest } from './src/mocks/index.js'; -const { setupWorker, rest } = window.MockServiceWorker; +const { setupWorker } = window.MockServiceWorker; const worker = setupWorker(...handlers); diff --git a/templates/UmbracoProject/Dockerfile b/templates/UmbracoProject/Dockerfile index e3eda648ddfb..0e1b379b2095 100644 --- a/templates/UmbracoProject/Dockerfile +++ b/templates/UmbracoProject/Dockerfile @@ -1,10 +1,10 @@ -FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base +FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base USER $APP_UID WORKDIR /app EXPOSE 8080 EXPOSE 8081 -FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build ARG BUILD_CONFIGURATION=Release WORKDIR /src COPY ["UmbracoProject/UmbracoProject.csproj", "UmbracoProject/"] diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithImageMediaPicker.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithImageMediaPicker.spec.ts index cc99e46cf945..eff0c95a69fd 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithImageMediaPicker.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithImageMediaPicker.spec.ts @@ -72,7 +72,7 @@ test('can add an image to the image media picker', async ({umbracoApi, umbracoUi // Act await umbracoUi.content.goToContentWithName(contentName); - await umbracoUi.content.selectMediaByName(mediaName); + await umbracoUi.content.clickChooseButtonAndSelectMediaWithName(mediaName); await umbracoUi.content.clickSubmitButton(); await umbracoUi.content.clickSaveButton(); @@ -141,7 +141,7 @@ test.skip('image count can not be more than max amount set in image media picker // Act await umbracoUi.content.goToContentWithName(contentName); - await umbracoUi.content.selectMediaByName(mediaName); + await umbracoUi.content.clickChooseButtonAndSelectMediaWithName(mediaName); await umbracoUi.content.clickSubmitButton(); await umbracoUi.content.clickSaveButton(); @@ -167,7 +167,7 @@ test('can add an image from the image media picker with a start node', async ({u // Act await umbracoUi.content.goToContentWithName(contentName); - await umbracoUi.content.selectMediaByName(mediaName); + await umbracoUi.content.clickChooseButtonAndSelectMediaWithName(mediaName); await umbracoUi.content.clickSubmitButton(); await umbracoUi.content.clickSaveButton(); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithMediaPicker.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithMediaPicker.spec.ts index f85584173852..ed760248e7a0 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithMediaPicker.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithMediaPicker.spec.ts @@ -34,7 +34,7 @@ test('can create content with the media picker data type', {tag: '@smoke'}, asyn await umbracoUi.content.clickCreateButton(); await umbracoUi.content.chooseDocumentType(documentTypeName); await umbracoUi.content.enterContentName(contentName); - await umbracoUi.content.selectMediaByName(mediaFileName); + await umbracoUi.content.clickChooseButtonAndSelectMediaWithName(mediaFileName); await umbracoUi.content.clickSubmitButton(); await umbracoUi.content.clickSaveButton(); @@ -63,7 +63,7 @@ test('can publish content with the media picker data type', async ({umbracoApi, await umbracoUi.content.clickCreateButton(); await umbracoUi.content.chooseDocumentType(documentTypeName); await umbracoUi.content.enterContentName(contentName); - await umbracoUi.content.selectMediaByName(mediaFileName); + await umbracoUi.content.clickChooseButtonAndSelectMediaWithName(mediaFileName); await umbracoUi.content.clickSubmitButton(); await umbracoUi.content.clickSaveAndPublishButton(); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithMultiURLPicker.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithMultiURLPicker.spec.ts index f713427c3ed8..c1e1dd2d44f5 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithMultiURLPicker.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithMultiURLPicker.spec.ts @@ -55,8 +55,7 @@ test('can create content with the document link', {tag: '@smoke'}, async ({page, expect(contentData.values[0].value[0].icon).toEqual('icon-document'); expect(contentData.values[0].value[0].target).toBeNull(); expect(contentData.values[0].value[0].unique).toEqual(linkedDocumentId); - // Uncomment this when the front-end is ready. Currently the link title is not auto filled after choosing document to link - //expect(contentData.values[0].value[0].name).toEqual(linkedDocumentId); + expect(contentData.values[0].value[0].name).toEqual(linkedDocumentName); // Clean await umbracoApi.documentType.ensureNameNotExists(documentTypeForLinkedDocumentName); @@ -99,8 +98,7 @@ test('can publish content with the document link', async ({umbracoApi, umbracoUi expect(contentData.values[0].value[0].icon).toEqual('icon-document'); expect(contentData.values[0].value[0].target).toBeNull(); expect(contentData.values[0].value[0].unique).toEqual(linkedDocumentId); - // Uncomment this when the front-end is ready. Currently the link title is not auto filled after choosing document to link - //expect(contentData.values[0].value[0].name).toEqual(linkedDocumentId); + expect(contentData.values[0].value[0].name).toEqual(linkedDocumentName); // Clean await umbracoApi.documentType.ensureNameNotExists(documentTypeForLinkedDocumentName); @@ -166,8 +164,7 @@ test('can create content with the media link', async ({umbracoApi, umbracoUi}) = expect(contentData.values[0].value[0].type).toEqual('media'); expect(contentData.values[0].value[0].icon).toEqual('icon-picture'); expect(contentData.values[0].value[0].unique).toEqual(mediaFileId); - // Uncomment this when the front-end is ready. Currently the link title is not auto filled after choosing media to link - //expect(contentData.values[0].value[0].name).toEqual(mediaFileName); + expect(contentData.values[0].value[0].name).toEqual(mediaFileName); // Clean await umbracoApi.media.ensureNameNotExists(mediaFileName); @@ -211,8 +208,7 @@ test('can add multiple links in the content', async ({umbracoApi, umbracoUi}) => expect(contentData.values[0].value[0].type).toEqual('media'); expect(contentData.values[0].value[0].icon).toEqual('icon-picture'); expect(contentData.values[0].value[0].unique).toEqual(mediaFileId); - // Uncomment this when the front-end is ready. Currently the link title is not auto filled after choosing media to link - //expect(contentData.values[0].value[0].name).toEqual(mediaFileName); + expect(contentData.values[0].value[0].name).toEqual(mediaFileName); // Verify the information of the second URL picker expect(contentData.values[0].value[1].type).toEqual('external'); expect(contentData.values[0].value[1].icon).toEqual('icon-link'); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithMultipleImageMediaPicker.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithMultipleImageMediaPicker.spec.ts index 907889247c12..27255a01cd08 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithMultipleImageMediaPicker.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithMultipleImageMediaPicker.spec.ts @@ -79,8 +79,8 @@ test('can add multiple images to the multiple image media picker', async ({umbra // Act await umbracoUi.content.goToContentWithName(contentName); await umbracoUi.content.clickChooseMediaPickerButton(); - await umbracoUi.content.clickMediaByNameInMediaPicker(firstMediaFileName); - await umbracoUi.content.clickMediaByNameInMediaPicker(secondMediaFileName); + await umbracoUi.content.selectMediaWithName(firstMediaFileName); + await umbracoUi.content.selectMediaWithName(secondMediaFileName); await umbracoUi.content.clickSubmitButton(); await umbracoUi.content.clickSaveButton(); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithMultipleMediaPicker.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithMultipleMediaPicker.spec.ts index 2cf94e8a895f..471258ad306c 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithMultipleMediaPicker.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithMultipleMediaPicker.spec.ts @@ -80,8 +80,8 @@ test('can add multiple media files to the multiple media picker', async ({umbrac // Act await umbracoUi.content.goToContentWithName(contentName); await umbracoUi.content.clickChooseMediaPickerButton(); - await umbracoUi.content.clickMediaByNameInMediaPicker(firstMediaFileName); - await umbracoUi.content.clickMediaByNameInMediaPicker(secondMediaFileName); + await umbracoUi.content.selectMediaWithName(firstMediaFileName); + await umbracoUi.content.selectMediaWithName(secondMediaFileName); await umbracoUi.content.clickSubmitButton(); await umbracoUi.content.clickSaveButton(); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/CultureAndHostnames.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/CultureAndHostnames.spec.ts index 2f4b301ea9e1..03ff7ba55aa5 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/CultureAndHostnames.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/CultureAndHostnames.spec.ts @@ -117,6 +117,7 @@ test('can add culture and hostname for multiple languages', async ({umbracoApi, await umbracoUi.content.enterDomain(secondDomainName, 1); await umbracoUi.content.selectDomainLanguageOption(secondLanguageName, 1); await umbracoUi.content.clickSaveModalButton(); + await umbracoUi.waitForTimeout(500); // Assert const domainsData = await umbracoApi.document.getDomains(contentId); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/DataType/ListView.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/DataType/ListView.spec.ts index 83f4f03cc757..5f09f165fd5b 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/DataType/ListView.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/DataType/ListView.spec.ts @@ -192,7 +192,8 @@ for (const listViewType of listViewTypes) { expect(dataTypeData.values).toContainEqual(expectedDataTypeValues); }); - test('can update bulk action permission', async ({umbracoApi, umbracoUi}) => { + // Skip this test as currently there is no setting for bulk action permission + test.skip('can update bulk action permission', async ({umbracoApi, umbracoUi}) => { // Arrange const bulkActionPermissionValue = 'Allow bulk trash'; const expectedDataTypeValues = { diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Media/ListViewMedia.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Media/ListViewMedia.spec.ts index f28ae14ca006..b841d23cec0c 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Media/ListViewMedia.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Media/ListViewMedia.spec.ts @@ -100,20 +100,10 @@ test('can disable one view in the media section', async ({umbracoApi, umbracoUi} }); test('can allow bulk trash in the media section', async ({umbracoApi, umbracoUi}) => { - // Arrange - const updatedValue = { - "allowBulkPublish": false, - "allowBulkUnpublish": false, - "allowBulkCopy": false, - "allowBulkDelete": true, - "allowBulkMove": false - }; - // Act - await umbracoApi.dataType.updateListViewMediaDataType('bulkActionPermissions', updatedValue); await umbracoUi.media.goToSection(ConstantHelper.sections.media); - await umbracoUi.media.selectMediaByName(firstMediaFileName); - await umbracoUi.media.selectMediaByName(secondMediaFileName); + await umbracoUi.media.selectMediaWithName(firstMediaFileName); + await umbracoUi.media.selectMediaWithName(secondMediaFileName); await umbracoUi.media.clickBulkTrashButton(); await umbracoUi.media.clickConfirmTrashButton(); @@ -127,24 +117,17 @@ test('can allow bulk trash in the media section', async ({umbracoApi, umbracoUi} await umbracoUi.media.isItemVisibleInRecycleBin(secondMediaFileName, true, false); }); -test('can allow bulk move in the media section', async ({umbracoApi, umbracoUi}) => { +// TODO: Remove skip when update code to select media successfully. +test.skip('can allow bulk move in the media section', async ({umbracoApi, umbracoUi}) => { // Arrange const mediaFolderName = 'Test Folder Name'; - const updatedValue = { - "allowBulkPublish": false, - "allowBulkUnpublish": false, - "allowBulkCopy": false, - "allowBulkDelete": false, - "allowBulkMove": true - }; await umbracoApi.media.ensureNameNotExists(mediaFolderName); const mediaFolderId = await umbracoApi.media.createDefaultMediaFolder(mediaFolderName); // Act - await umbracoApi.dataType.updateListViewMediaDataType('bulkActionPermissions', updatedValue); await umbracoUi.media.goToSection(ConstantHelper.sections.media); - await umbracoUi.media.selectMediaByName(firstMediaFileName); - await umbracoUi.media.selectMediaByName(secondMediaFileName); + await umbracoUi.media.selectMediaWithName(firstMediaFileName); + await umbracoUi.media.selectMediaWithName(secondMediaFileName); await umbracoUi.media.clickBulkMoveToButton(); await umbracoUi.media.clickCaretButtonForName('Media'); await umbracoUi.media.clickModalTextByName(mediaFolderName); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Media/Media.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Media/Media.spec.ts index df5254141d78..0fd4dbcefc42 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Media/Media.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Media/Media.spec.ts @@ -116,7 +116,7 @@ test('can trash a folder', async ({umbracoApi, umbracoUi}) => { await umbracoUi.media.clickConfirmTrashButton(); // Assert - await umbracoUi.media.doesSuccessNotificationHaveText(NotificationConstantHelper.success.folderDeleted); + await umbracoUi.media.doesSuccessNotificationHaveText(NotificationConstantHelper.success.movedToRecycleBin); await umbracoUi.media.isTreeItemVisible(folderName, false); expect(await umbracoApi.media.doesNameExist(folderName)).toBeFalsy(); }); @@ -155,11 +155,11 @@ test('can search for a media file', async ({umbracoApi, umbracoUi}) => { await umbracoUi.media.goToSection(ConstantHelper.sections.media); // Act - await umbracoUi.media.searchForMediaItemByName(mediaFileName); + await umbracoUi.media.searchForMediaItemByName(secondMediaFile); // Assert await umbracoUi.media.doesMediaCardsContainAmount(1); - await umbracoUi.media.doesMediaCardContainText(mediaFileName); + await umbracoUi.media.doesMediaCardContainText(secondMediaFile); // Clean await umbracoApi.media.ensureNameNotExists(secondMediaFile); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Packages/CreatedPackages.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Packages/CreatedPackages.spec.ts index a0073862aeef..4c6b240dd2cf 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Packages/CreatedPackages.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Packages/CreatedPackages.spec.ts @@ -100,7 +100,7 @@ // await umbracoUi.package.clickCreatePackageButton(); // await umbracoUi.package.enterPackageName(packageName); // await umbracoUi.package.clickAddMediaToPackageButton(); -// await umbracoUi.media.selectMediaByName(mediaName); +// await umbracoUi.media.selectMediaWithName(mediaName); // await umbracoUi.package.clickSubmitButton(); // await umbracoUi.package.clickCreateButton(); // diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/Dashboard/Welcome.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/Dashboard/Welcome.spec.ts index 1605ddedaeda..164cea22d831 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/Dashboard/Welcome.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/Dashboard/Welcome.spec.ts @@ -7,8 +7,8 @@ test.beforeEach(async ({umbracoUi}) => { test('can click on buttons', async ({umbracoUi}) => { // Arrange - const getTheHelpYouNeedDocumentationUrl = 'https://docs.umbraco.com/umbraco-cms/umbraco-cms'; - const goToTheForumUrl = 'https://our.umbraco.com/forum'; + const getTheHelpYouNeedDocumentationUrl = 'https://docs.umbraco.com/umbraco-cms'; + const goToTheForumUrl = 'https://our.umbraco.com/forum/'; const chatWithTheCommunityUrl = 'https://discord.umbraco.com'; const getCertifiedUrl = 'https://umbraco.com/training/'; const getTheHelpYouNeedSupportUrl = 'https://umbraco.com/support/'; diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/DocumentType/DocumentTypeDesignTab.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/DocumentType/DocumentTypeDesignTab.spec.ts index f965a35e227b..b1f0efbcfbbb 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/DocumentType/DocumentTypeDesignTab.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/DocumentType/DocumentTypeDesignTab.spec.ts @@ -107,10 +107,11 @@ test('can delete a tab in a document type', async ({umbracoApi, umbracoUi}) => { await umbracoUi.documentType.clickConfirmToDeleteButton(); await umbracoUi.documentType.clickSaveButton(); - await umbracoApi.documentType.getByName(documentTypeName); // Assert await umbracoUi.documentType.isSuccessNotificationVisible(); expect(await umbracoApi.documentType.doesNameExist(documentTypeName)).toBeTruthy(); + const documentTypeData = await umbracoApi.documentType.getByName(documentTypeName); + expect(documentTypeData.containers.length).toBe(0); }); test('can delete a property editor in a document type', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => { diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/PartialView/PartialView.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/PartialView/PartialView.spec.ts index f1155332f854..6b6cbf327b8b 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/PartialView/PartialView.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/PartialView/PartialView.spec.ts @@ -34,8 +34,8 @@ test('can create an empty partial view', {tag: '@smoke'}, async ({umbracoApi, um test('can create a partial view from snippet', async ({umbracoApi, umbracoUi}) => { // Arrange - const expectedPartialViewContentWindows = '@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage\r\n@using Umbraco.Cms.Core.Routing\r\n@using Umbraco.Extensions\r\n\n@inject IPublishedUrlProvider PublishedUrlProvider\r\n@*\r\n This snippet makes a breadcrumb of parents using an unordered HTML list.\r\n\r\n How it works:\r\n - It uses the Ancestors() method to get all parents and then generates links so the visitor can go back\r\n - Finally it outputs the name of the current page (without a link)\r\n*@\r\n\r\n@{ var selection = Model.Ancestors().ToArray(); }\r\n\r\n@if (selection?.Length > 0)\r\n{\r\n
\r\n}'; - const expectedPartialViewContentLinux = '@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage\n@using Umbraco.Cms.Core.Routing\n@using Umbraco.Extensions\n\n@inject IPublishedUrlProvider PublishedUrlProvider\n@*\n This snippet makes a breadcrumb of parents using an unordered HTML list.\n\n How it works:\n - It uses the Ancestors() method to get all parents and then generates links so the visitor can go back\n - Finally it outputs the name of the current page (without a link)\n*@\n\n@{ var selection = Model.Ancestors().ToArray(); }\n\n@if (selection?.Length > 0)\n{\n \n}'; + const expectedPartialViewContentWindows = '@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage\r\n@using Umbraco.Cms.Core.PublishedCache\r\n@using Umbraco.Cms.Core.Routing\r\n@using Umbraco.Cms.Core.Services.Navigation\r\n\n@inject IPublishedContentCache PublishedContentCache\r\n@inject IDocumentNavigationQueryService DocumentNavigationQueryService\r\n@inject IPublishedUrlProvider PublishedUrlProvider\r\n@*\r\n This snippet makes a breadcrumb of parents using an unordered HTML list.\r\n\r\n How it works:\r\n - It uses the Ancestors method to get all parents and then generates links so the visitor can go back\r\n - Finally it outputs the name of the current page (without a link)\r\n*@\r\n\r\n@{ var selection = Model.Ancestors(PublishedContentCache, DocumentNavigationQueryService).ToArray(); }\r\n\r\n@if (selection?.Length > 0)\r\n{\r\n \r\n}'; + const expectedPartialViewContentLinux = '@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage\n@using Umbraco.Cms.Core.PublishedCache\n@using Umbraco.Cms.Core.Routing\n@using Umbraco.Cms.Core.Services.Navigation\n\n@inject IPublishedContentCache PublishedContentCache\n@inject IDocumentNavigationQueryService DocumentNavigationQueryService\n@inject IPublishedUrlProvider PublishedUrlProvider\n@*\n This snippet makes a breadcrumb of parents using an unordered HTML list.\n\n How it works:\n - It uses the Ancestors method to get all parents and then generates links so the visitor can go back\n - Finally it outputs the name of the current page (without a link)\n*@\n\n@{ var selection = Model.Ancestors(PublishedContentCache, DocumentNavigationQueryService).ToArray(); }\n\n@if (selection?.Length > 0)\n{\n \n}'; // Act await umbracoUi.partialView.clickActionsMenuAtRoot(); @@ -43,12 +43,14 @@ test('can create a partial view from snippet', async ({umbracoApi, umbracoUi}) = await umbracoUi.partialView.clickNewPartialViewFromSnippetButton(); await umbracoUi.partialView.clickBreadcrumbButton(); await umbracoUi.partialView.enterPartialViewName(partialViewName); + await umbracoUi.waitForTimeout(500); await umbracoUi.partialView.clickSaveButton(); // Assert await umbracoUi.partialView.doesSuccessNotificationHaveText(NotificationConstantHelper.success.created); expect(await umbracoApi.partialView.doesExist(partialViewFileName)).toBeTruthy(); const partialViewData = await umbracoApi.partialView.getByName(partialViewFileName); + console.log(partialViewData.content); switch (process.platform) { case 'win32': diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/Stylesheet/Stylesheet.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/Stylesheet/Stylesheet.spec.ts index bd6de2872563..84b6174e89d2 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/Stylesheet/Stylesheet.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/Stylesheet/Stylesheet.spec.ts @@ -94,7 +94,7 @@ test.skip('can update a stylesheet', {tag: '@smoke'}, async ({umbracoApi, umbrac test('can delete a stylesheet', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => { // Arrange - await umbracoApi.stylesheet.create(stylesheetName, '', '/'); + await umbracoApi.stylesheet.createDefaultStylesheet(stylesheetName); await umbracoUi.stylesheet.goToSection(ConstantHelper.sections.settings); //Act @@ -112,7 +112,7 @@ test('can rename a stylesheet', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) // Arrange const wrongStylesheetName = 'WrongStylesheetName.css'; await umbracoApi.stylesheet.ensureNameNotExists(wrongStylesheetName); - await umbracoApi.stylesheet.create(wrongStylesheetName, '', '/'); + await umbracoApi.stylesheet.createDefaultStylesheet(wrongStylesheetName); await umbracoUi.stylesheet.goToSection(ConstantHelper.sections.settings); //Act @@ -133,7 +133,7 @@ test('can edit rich text editor styles', async ({umbracoApi, umbracoUi}) => { const newStyleStyles = 'color: white'; const newStylesheetContent = '/**umb_name:' + newStyleName + '*/\n' + newStyleSelector + ' {\n\t' + newStyleStyles + '\n}'; const stylesheetContent = '/**umb_name:' + styleName + '*/\n' + styleSelector + ' {\n\t' + styleStyles + '\n}'; - await umbracoApi.stylesheet.create(stylesheetName, stylesheetContent, '/'); + await umbracoApi.stylesheet.create(stylesheetName, stylesheetContent); expect(await umbracoApi.stylesheet.doesExist(stylesheetName)).toBeTruthy(); await umbracoUi.stylesheet.goToSection(ConstantHelper.sections.settings); @@ -151,7 +151,7 @@ test('can edit rich text editor styles', async ({umbracoApi, umbracoUi}) => { test('can remove rich text editor styles', async ({umbracoApi, umbracoUi}) => { // Arrange const stylesheetContent = '/**umb_name:' + styleName + '*/\n' + styleSelector + ' {\n\t' + styleStyles + '\n}'; - await umbracoApi.stylesheet.create(stylesheetName, stylesheetContent, '/'); + await umbracoApi.stylesheet.create(stylesheetName, stylesheetContent); expect(await umbracoApi.stylesheet.doesExist(stylesheetName)).toBeTruthy(); await umbracoUi.stylesheet.goToSection(ConstantHelper.sections.settings); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/User.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/User.spec.ts index cee0518f9c8e..c3c83d5253d2 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/User.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/User.spec.ts @@ -238,7 +238,7 @@ test('can add media start nodes for a user', {tag: '@smoke'}, async ({umbracoApi // Act await umbracoUi.user.clickUserWithName(nameOfTheUser); await umbracoUi.user.clickChooseMediaStartNodeButton(); - await umbracoUi.user.clickMediaCardWithName(mediaName); + await umbracoUi.user.selectMediaWithName(mediaName); await umbracoUi.user.clickSubmitButton(); await umbracoUi.user.clickSaveButton(); @@ -270,7 +270,7 @@ test('can add multiple media start nodes for a user', async ({umbracoApi, umbrac // Act await umbracoUi.user.clickUserWithName(nameOfTheUser); await umbracoUi.user.clickChooseMediaStartNodeButton(); - await umbracoUi.user.clickMediaCardWithName(secondMediaName); + await umbracoUi.user.selectMediaWithName(secondMediaName); await umbracoUi.user.clickSubmitButton(); await umbracoUi.user.clickSaveButton(); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/UserGroups.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/UserGroups.spec.ts index f7ddc89c9328..72622cd213de 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/UserGroups.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/UserGroups.spec.ts @@ -54,7 +54,7 @@ test.afterEach(async ({umbracoApi}) => { test('can create an empty user group', async ({umbracoApi, umbracoUi}) => { // Act await umbracoUi.userGroup.clickUserGroupsButton(); - await umbracoUi.userGroup.clickCreateLabelButton(); + await umbracoUi.userGroup.clickCreateLink(); await umbracoUi.userGroup.enterUserGroupName(userGroupName); await umbracoUi.userGroup.clickSaveButton(); @@ -113,7 +113,7 @@ test('can delete a user group', async ({umbracoApi, umbracoUi}) => { // Act await umbracoUi.userGroup.clickActionsButton(); - await umbracoUi.userGroup.clickDeleteLabelThreeDotsButton(); + await umbracoUi.userGroup.clickDeleteButton(); await umbracoUi.userGroup.clickConfirmToDeleteButton(); // Assert @@ -327,7 +327,7 @@ test('can add a media start node to a user group', async ({umbracoApi, umbracoUi // Act await umbracoUi.userGroup.clickChooseMediaStartNodeButton(); - await umbracoUi.userGroup.clickMediaCardWithName(mediaName); + await umbracoUi.userGroup.selectMediaWithName(mediaName); await umbracoUi.userGroup.clickSubmitButton(); await umbracoUi.userGroup.clickSaveButton();