diff --git a/.gitignore b/.gitignore
index 8744ee3b0..2683e54cd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -51,6 +51,7 @@ testem.log
.protractor-fail-fast
.protractor-smartrunner
/protractorFailuresReport
+/storage-state
# System Files
.DS_Store
diff --git a/e2e/playwright/shared/fixtures/page-initialization.ts b/e2e/playwright/shared/fixtures/page-initialization.ts
new file mode 100644
index 000000000..f8aa98bf0
--- /dev/null
+++ b/e2e/playwright/shared/fixtures/page-initialization.ts
@@ -0,0 +1,47 @@
+/*!
+ * Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
+ *
+ * Alfresco Example Content Application
+ *
+ * This file is part of the Alfresco Example Content Application.
+ * If the software was purchased under a paid Alfresco license, the terms of
+ * the paid license agreement will prevail. Otherwise, the software is
+ * provided under the following open source license terms:
+ *
+ * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * The Alfresco Example Content Application is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * from Hyland Software. If not, see .
+ */
+
+import { PersonalFilesPage } from '../page-objects';
+import { test as base } from '@playwright/test';
+import { ApiClientFactory } from '@alfresco/playwright-shared';
+
+interface Pages {
+ personalFiles: PersonalFilesPage;
+}
+
+interface Api {
+ apiClient: ApiClientFactory;
+}
+
+export const test = base.extend({
+ personalFiles: async ({ page }, use) => {
+ await use(new PersonalFilesPage(page));
+ },
+ // eslint-disable-next-line no-empty-pattern
+ apiClient: async ({}, use) => {
+ const apiClient = new ApiClientFactory();
+ await apiClient.setUpAcaBackend('admin');
+ await use(apiClient);
+ }
+});
diff --git a/e2e/playwright/shared/page-objects/components/aca-page-layout-header.component.ts b/e2e/playwright/shared/page-objects/components/aca-page-layout-header.component.ts
new file mode 100644
index 000000000..6af77531c
--- /dev/null
+++ b/e2e/playwright/shared/page-objects/components/aca-page-layout-header.component.ts
@@ -0,0 +1,35 @@
+/*!
+ * Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
+ *
+ * Alfresco Example Content Application
+ *
+ * This file is part of the Alfresco Example Content Application.
+ * If the software was purchased under a paid Alfresco license, the terms of
+ * the paid license agreement will prevail. Otherwise, the software is
+ * provided under the following open source license terms:
+ *
+ * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * The Alfresco Example Content Application is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * from Hyland Software. If not, see .
+ */
+
+import { BaseComponent } from './base.component';
+import { Page } from '@playwright/test';
+
+export class AcaPageLayoutHeader extends BaseComponent {
+ private static rootElement = 'adf-toolbar';
+ public createButton = this.getChild('[id="app.toolbar.create"]');
+
+ constructor(page: Page) {
+ super(page, AcaPageLayoutHeader.rootElement);
+ }
+}
diff --git a/e2e/playwright/shared/page-objects/components/adf-folder-dialog.component.ts b/e2e/playwright/shared/page-objects/components/adf-folder-dialog.component.ts
new file mode 100644
index 000000000..5a50d0ff0
--- /dev/null
+++ b/e2e/playwright/shared/page-objects/components/adf-folder-dialog.component.ts
@@ -0,0 +1,37 @@
+/*!
+ * Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
+ *
+ * Alfresco Example Content Application
+ *
+ * This file is part of the Alfresco Example Content Application.
+ * If the software was purchased under a paid Alfresco license, the terms of
+ * the paid license agreement will prevail. Otherwise, the software is
+ * provided under the following open source license terms:
+ *
+ * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * The Alfresco Example Content Application is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * from Hyland Software. If not, see .
+ */
+
+import { BaseComponent } from './base.component';
+import { Page } from '@playwright/test';
+
+export class AdfFolderDialogComponent extends BaseComponent {
+ private static rootElement = 'adf-folder-dialog';
+
+ public folderNameInputLocator = this.getChild('[id="adf-folder-name-input"]');
+ public createButton = this.getChild('[id="adf-folder-create-button"]');
+
+ constructor(page: Page) {
+ super(page, AdfFolderDialogComponent.rootElement);
+ }
+}
diff --git a/e2e/playwright/shared/page-objects/components/mat-menu.component.ts b/e2e/playwright/shared/page-objects/components/mat-menu.component.ts
index f25c0a7ad..f79ca4027 100644
--- a/e2e/playwright/shared/page-objects/components/mat-menu.component.ts
+++ b/e2e/playwright/shared/page-objects/components/mat-menu.component.ts
@@ -36,4 +36,5 @@ export class MatMenuComponent extends BaseComponent {
public getMenuItemTextLocator = this.getChild('[data-automation-id="menu-item-title"]');
public getButtonByText = (text: string) => this.getChild('button', { hasText: text });
+ public createFolder = this.getChild('[id="app.create.folder"]');
}
diff --git a/e2e/playwright/shared/page-objects/index.ts b/e2e/playwright/shared/page-objects/index.ts
index 7d4708465..a54a1d387 100644
--- a/e2e/playwright/shared/page-objects/index.ts
+++ b/e2e/playwright/shared/page-objects/index.ts
@@ -27,3 +27,4 @@ export * from './playwright-base';
export * from './components';
export * from './components/dataTable';
export * from './pages';
+export * from './pages/personal-files.page';
diff --git a/e2e/playwright/shared/page-objects/pages/personal-files.page.ts b/e2e/playwright/shared/page-objects/pages/personal-files.page.ts
new file mode 100644
index 000000000..f8d9edeb3
--- /dev/null
+++ b/e2e/playwright/shared/page-objects/pages/personal-files.page.ts
@@ -0,0 +1,45 @@
+/*!
+ * Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
+ *
+ * Alfresco Example Content Application
+ *
+ * This file is part of the Alfresco Example Content Application.
+ * If the software was purchased under a paid Alfresco license, the terms of
+ * the paid license agreement will prevail. Otherwise, the software is
+ * provided under the following open source license terms:
+ *
+ * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * The Alfresco Example Content Application is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * from Hyland Software. If not, see .
+ */
+
+import { BasePage, DataTableComponent } from '@alfresco/playwright-shared';
+import { Page } from '@playwright/test';
+import { AcaPageLayoutHeader } from '../components/aca-page-layout-header.component';
+import { MatMenuComponent } from '../components/mat-menu.component';
+import { AdfFolderDialogComponent } from '../components/adf-folder-dialog.component';
+
+export class PersonalFilesPage extends BasePage {
+ private static pageUrl = 'personal-files';
+
+ constructor(page: Page) {
+ super(page, PersonalFilesPage.pageUrl);
+ }
+
+ public acaHeader = new AcaPageLayoutHeader(this.page);
+
+ public matMenu = new MatMenuComponent(this.page);
+
+ public folderDialog = new AdfFolderDialogComponent(this.page);
+
+ public dataTable = new DataTableComponent(this.page);
+}
diff --git a/e2e/playwright/tests/actions/create/create-folder.spec.ts b/e2e/playwright/tests/actions/create/create-folder.spec.ts
new file mode 100644
index 000000000..2ef412d5d
--- /dev/null
+++ b/e2e/playwright/tests/actions/create/create-folder.spec.ts
@@ -0,0 +1,43 @@
+/*!
+ * Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
+ *
+ * Alfresco Example Content Application
+ *
+ * This file is part of the Alfresco Example Content Application.
+ * If the software was purchased under a paid Alfresco license, the terms of
+ * the paid license agreement will prevail. Otherwise, the software is
+ * provided under the following open source license terms:
+ *
+ * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * The Alfresco Example Content Application is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * from Hyland Software. If not, see .
+ */
+
+import { test } from '../../../shared/fixtures/page-initialization';
+import { expect } from '@playwright/test';
+
+test.describe('Create actions', () => {
+ const randomFolderName = `playwright-folder-${(Math.random() + 1).toString(36).substring(6)}`;
+
+ test.beforeEach(async ({ personalFiles }) => {
+ await personalFiles.navigate({ waitUntil: 'domcontentloaded' });
+ });
+
+ test('Create a folder with name only', async ({ personalFiles }) => {
+ await personalFiles.acaHeader.createButton.click();
+ await personalFiles.matMenu.createFolder.click();
+ await personalFiles.folderDialog.folderNameInputLocator.type(randomFolderName, { delay: 50 });
+ await personalFiles.folderDialog.createButton.click();
+
+ await expect(personalFiles.dataTable.getRowByName(randomFolderName)).toBeVisible();
+ });
+});