Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
219 commits
Select commit Hold shift + click to select a range
148ac51
CRUD + folders + API
kjac Jul 25, 2025
b25ee76
Merge branch 'main' into v16/temp/element-poc
kjac Aug 11, 2025
eea3c57
Fix infinite recursion
kjac Aug 11, 2025
d2e0416
Distributed cache handling for Elements
kjac Aug 13, 2025
70b5c52
Publishing for Elements (incl. refactor)
kjac Aug 13, 2025
251b8a4
Fix bad file name
kjac Aug 13, 2025
fd59a8b
Added "foldersOnly" option to the siblings endpoint
kjac Aug 13, 2025
eadd6ec
Update src/Umbraco.Core/Models/UmbracoObjectTypes.cs
kjac Aug 13, 2025
523d96a
Merge branch 'main' into v16/temp/element-poc
kjac Aug 14, 2025
d6b5d57
API for publishing elements
kjac Aug 14, 2025
632b89d
Published element cache (WIP)
kjac Aug 14, 2025
ca9f0bd
Fix delete at repo level
kjac Aug 15, 2025
feb07a2
Fixing up a little tests
kjac Aug 15, 2025
3a53a9b
Element picker property editor
kjac Aug 15, 2025
d7b4fad
Added tests to prove published element status
kjac Aug 15, 2025
2ce2b51
Merge branch 'main' into v16/temp/element-poc
kjac Sep 1, 2025
28abcf3
Move scheduled content keys to base abstraction
kjac Sep 1, 2025
0a2a518
Add request caching for published element creation (similar to publis…
kjac Sep 1, 2025
264f4c1
Merge branch 'main' into v16/temp/element-poc
kjac Sep 5, 2025
e7ae4ab
Apply conditional appcache access to elements as well
kjac Sep 5, 2025
26ed5fb
Fix test build errors
kjac Sep 5, 2025
064c7bd
Merge branch 'main' into v16/temp/element-poc
kjac Sep 10, 2025
1644b0e
Fix merge from main
kjac Sep 10, 2025
0e9c45f
Merge branch 'main' into v16/temp/element-poc
kjac Oct 2, 2025
9962072
Fix merge
kjac Oct 2, 2025
5fd8f54
Merge branch 'main' into v16/temp/element-poc
kjac Oct 16, 2025
8defac5
Merge branch 'main' into v16/temp/element-poc
kjac Oct 16, 2025
908b4de
Add cache invalidation on update (like content and media)
kjac Oct 24, 2025
6359d45
Move element (incl. tests)
kjac Oct 24, 2025
f0031a7
Element copying
kjac Oct 31, 2025
922fbc8
Add items endpoint incl. variation info at item level
kjac Nov 3, 2025
8bc3b8b
Make the Element tree items look like Document tree items (with varia…
kjac Nov 19, 2025
a566528
Rename all things ElementType to DocumentType
kjac Nov 20, 2025
058798c
Move ElementRepository to the right place
kjac Nov 20, 2025
abdc2f0
Merge branch 'main' into v16/temp/element-poc
kjac Nov 20, 2025
9146adf
Fix auditing after merge (changes from #19357)
kjac Nov 24, 2025
47443fa
Fix dates after merge (changes from #19822)
kjac Nov 24, 2025
1c6ff8b
Fix NPoco querying after merge (changes from #20184)
kjac Nov 24, 2025
6f0b217
Fix various build errors after merge
kjac Nov 24, 2025
9af0d1b
Merge branch 'main' into v17/feature/global-elements
kjac Nov 24, 2025
87fadc9
Merge branch 'main' into v17/feature/global-elements
kjac Dec 5, 2025
1fa9fd5
Move containers
kjac Dec 9, 2025
b019c31
Merge branch 'main' into v17/feature/global-elements
kjac Dec 9, 2025
9ff9103
Add migration to create element tables
kjac Dec 9, 2025
223d0d9
Merge branch 'main' into v17/feature/global-elements
kjac Dec 17, 2025
6396c1f
Re-implement #21105 at base class level
kjac Dec 17, 2025
b33297e
Merge branch 'main' into v17/feature/global-elements
kjac Dec 29, 2025
c9130eb
Fix merge
kjac Dec 29, 2025
ea5a797
Add element tree recycle bin + move element to/from recycle bin
kjac Dec 30, 2025
f1d02c6
Controllers for move to recycle bin + recycle bin root
kjac Jan 2, 2026
b355e1e
Support element containers in recycle bin (no controllers)
kjac Jan 2, 2026
b3c14d6
Handle error cases for element moves and add more tests
kjac Jan 3, 2026
cf2433b
Do not allow creation of IPublishedElement for trashed elements
kjac Jan 4, 2026
42e86df
Amend recycle bin controller output and add children controller
kjac Jan 4, 2026
59e93e5
Merge branch 'main' into v17/feature/global-elements
kjac Jan 5, 2026
97782a1
Regenerate OpenApi.json with Element APIs
kjac Jan 5, 2026
ab50f7e
Housekeeping: Organize element container service tests
kjac Jan 5, 2026
e1b648e
Fix bad housekeeping
kjac Jan 5, 2026
4b2a3f3
Add missing siblings controller for recycle bin
kjac Jan 5, 2026
352dbc0
Add "delete from recycle bin" and "empty recycle bin" operations (inc…
kjac Jan 5, 2026
9e28241
Updated OpenApi.json to reflect new endpoints
kjac Jan 5, 2026
2f19a5d
chore: generate new openapi types
leekelleher Jan 5, 2026
8bbea7e
Added package/module for "Library"
leekelleher Jan 5, 2026
76fbc68
Added default dashboard for Library section
leekelleher Jan 5, 2026
a61149d
[WIP] Adds "Elements" package module
leekelleher Jan 5, 2026
765a9e1
Adds entity-actions for Create and Reload
leekelleher Jan 5, 2026
0bb6ea6
Adds entity-action for Move To
leekelleher Jan 5, 2026
c9bda7c
Adds collection workspace view
leekelleher Jan 5, 2026
657c994
Adds entity-action for Duplicate To
leekelleher Jan 6, 2026
1286cd3
"Reload Children" should only be for root & folders
leekelleher Jan 6, 2026
14ed3b9
Reworked Library sidebar app
leekelleher Jan 6, 2026
602bc79
chore: generate new openapi types
leekelleher Jan 6, 2026
0427340
Added Item repository
leekelleher Jan 6, 2026
cf0f089
Added Reference repository
leekelleher Jan 6, 2026
1b6f9b5
Added Element Recycle Bin
leekelleher Jan 6, 2026
c396eef
Adds "umb-element-tree-item" to identify the `isTrashed` state
leekelleher Jan 7, 2026
d21746a
Added `CreateDate` to `ElementTreeItemResponseModel`
leekelleher Jan 7, 2026
30f2f46
Re-generated OpenAPI.json
leekelleher Jan 7, 2026
5dc92ef
Merge branch 'v17/feature/global-elements' into v18/feature/global-el…
leekelleher Jan 7, 2026
7659b46
Add configuration endpoint for Elements
kjac Jan 7, 2026
fb38191
Re-added Library sidebar app
leekelleher Jan 7, 2026
87ce5a1
Recycle Bin type tweaks
leekelleher Jan 7, 2026
5697fa4
[WIP] Element "Create" modal
leekelleher Jan 7, 2026
3c83123
Merge branch 'v17/feature/global-elements' into v18/feature/global-el…
leekelleher Jan 8, 2026
453da71
Explicitly unpublish published elements when restoring from recycle bin.
kjac Jan 8, 2026
d50c0fb
Reverted Element "Create" modal, to use create-options + picker
leekelleher Jan 8, 2026
f7fb11b
Merge branch 'v17/feature/global-elements' into v18/feature/global-el…
leekelleher Jan 8, 2026
dff5992
chore: generate new openapi types
leekelleher Jan 8, 2026
09319d1
Added Element Detail Repository
leekelleher Jan 8, 2026
88c26c1
[WIP] Element Workspace + Context
leekelleher Jan 8, 2026
3d00fee
Merge branch 'main' into v17/feature/global-elements
kjac Jan 12, 2026
a544e9c
Merge branch 'v17/feature/global-elements' into v18/feature/global-el…
leekelleher Jan 12, 2026
fbe82fe
Elements: Add workspace views for edit and info
leekelleher Jan 12, 2026
d85df3f
Elements: Add save action and trash state handling
leekelleher Jan 12, 2026
5be05c9
Adds Workspace actions for Save, Publish, Scheduled Publish
leekelleher Jan 12, 2026
1e4f510
Adds Element Configuration repository
leekelleher Jan 12, 2026
0a21e7f
Adds mock handle + data for Elements
leekelleher Jan 12, 2026
bf0fd20
Merge branch 'v18/dev' into v17/feature/global-elements
lauraneto Jan 13, 2026
6b8719c
Adds Publish and Unpublish entity actions for Elements
leekelleher Jan 13, 2026
3f50881
Merge remote-tracking branch 'origin/v17/feature/global-elements' int…
leekelleher Jan 13, 2026
733e7fc
package-lock.json update
leekelleher Jan 13, 2026
c8c589a
Adds bulk entity actions for Publish, Unpublish, Move and Trash
leekelleher Jan 13, 2026
3ed4598
Localization keys + code tweaks
leekelleher Jan 13, 2026
7d9e40e
Adds reusable `emptyRecycleBin` `collectionAction` kind
leekelleher Jan 13, 2026
790b6c8
Adds `emptyRecycleBin` for Element Recycle Bin collection
leekelleher Jan 13, 2026
7fab966
Element Recycle Bin refactoring
leekelleher Jan 13, 2026
1ee7f0e
Elements: Remove invalid templateId from ElementVersionDto index defi…
lauraneto Jan 14, 2026
cc1dd48
Fix the ordering of items in the tree
kjac Jan 14, 2026
ec87d88
It's 2026 now...
kjac Jan 14, 2026
7776c02
Merge branch 'v17/feature/global-elements' into v18/feature/global-el…
leekelleher Jan 14, 2026
6f92c61
Fix missing project structure
kjac Jan 14, 2026
2088567
Amend empty recycle bin
kjac Jan 14, 2026
f0cb616
Elements: Fix element recycle bin node insertion on SQL Server (#21390)
lauraneto Jan 14, 2026
9db41a0
Relations: exported entity-action types
leekelleher Jan 14, 2026
cf70a0f
Restructured "Element Folder" code
leekelleher Jan 14, 2026
8e86cc5
Restructured "Trash" entity-bulk-action code
leekelleher Jan 14, 2026
7743dc6
Merge branch 'v17/feature/global-elements' into v18/feature/global-el…
leekelleher Jan 14, 2026
203d20b
Adds `trashFolder` `entityAction` kind
leekelleher Jan 14, 2026
e37399f
Adds "Trash" entity-action for Element Folders
leekelleher Jan 14, 2026
3d536b5
Tidy-up / restructuring
leekelleher Jan 14, 2026
e09b34f
[WIP] Element Picker property-editor UI
leekelleher Jan 14, 2026
d0177bf
Added tests for element
nhudinh0309 Jan 15, 2026
a3ff86f
Fix count trashed children
kjac Jan 15, 2026
ed0201c
Merge branch 'v17/feature/global-elements' into v18/feature/global-el…
leekelleher Jan 15, 2026
690281b
Renamed `UmbElementPropertyDatasetContext` to `UmbElementWorkspacePro…
leekelleher Jan 15, 2026
fd3b1ac
Moved newly added entity service tests to an isolated, per-test DB cl…
kjac Jan 15, 2026
e3fef11
Elements: Element start node permissions (#21375)
lauraneto Jan 15, 2026
98b9359
Elements: Add rollback (#21393)
kjac Jan 15, 2026
b8f4bbe
Elements: Regenerate OpenApi.json
lauraneto Jan 15, 2026
0624e3f
Added "entity-data-picker" importmap
leekelleher Jan 15, 2026
430674e
Reworking the "Element Picker" property-editor UI
leekelleher Jan 15, 2026
f82792c
Implemented "Element Item Data Resolver" helper
leekelleher Jan 15, 2026
28bc195
Merge branch 'v17/feature/global-elements' into v18/feature/global-el…
leekelleher Jan 15, 2026
ca35df8
chore: generate new openapi types
leekelleher Jan 15, 2026
4c7b056
Fixed up the mocks and types
leekelleher Jan 15, 2026
74e39a1
Added UI for "Elements Start Nodes"
leekelleher Jan 15, 2026
d6cb11f
Elements: Add default and granular permissions for Element controller…
lauraneto Jan 16, 2026
577f351
Merge branch 'v18/dev' into v17/feature/global-elements
kjac Jan 16, 2026
df358c6
Updated tests for element
nhudinh0309 Jan 19, 2026
73b53ff
Merge branch 'v17/feature/global-elements' into v18/feature/global-el…
leekelleher Jan 19, 2026
d27ece0
Added "entity-data-picker" export to the Vite config
leekelleher Jan 19, 2026
05c6609
Merge branch 'v18/feature/global-elements-backoffice' into v18/QA/glo…
nhudinh0309 Jan 19, 2026
72ff5de
Fixed Element Folder picker for "start nodes"
leekelleher Jan 19, 2026
5430265
Adds UI for Element's User Permissions
leekelleher Jan 19, 2026
8e0befb
Adds Element User Permission condition
leekelleher Jan 19, 2026
2a58892
Add element folder "item" endpoint
kjac Jan 19, 2026
79e3965
Include "isTrashed" in folder response models
kjac Jan 19, 2026
5c20ebe
Adds UI for Element's Granular Permissions
leekelleher Jan 19, 2026
0b8e82f
Merge branch 'v17/feature/global-elements' into v18/feature/global-el…
leekelleher Jan 20, 2026
8c9200a
Adds element-folder item repository
leekelleher Jan 20, 2026
816465f
Element Recycle Bin: implemented `isTrashed`
leekelleher Jan 20, 2026
62761b4
Fixed mock folder data manager
leekelleher Jan 20, 2026
4852c93
Update TODOs
kjac Jan 20, 2026
a0a0892
Adds move entity-action for element-folder
leekelleher Jan 20, 2026
095af03
Rollback a few unnecessarily breaking signature changes
kjac Jan 20, 2026
9fb413b
Fix typos and element tag name mismatches in elements package
leekelleher Jan 20, 2026
741b5ac
Added tests for element
nhudinh0309 Jan 21, 2026
1b9ca90
Added tests for element picker data types
nhudinh0309 Jan 21, 2026
dcbe217
Added tests for content with element picker
nhudinh0309 Jan 21, 2026
d5df689
Added tests for element with element picker
nhudinh0309 Jan 21, 2026
59f838a
Merge remote-tracking branch 'origin/v18/dev' into v17/feature/global…
kjac Jan 21, 2026
f522d04
Use schema constants from #21327
kjac Jan 21, 2026
e6f7c88
Elements: Add admin group element permissions during upgrade (#21452)
lauraneto Jan 21, 2026
f56fc57
Merge branch 'v18/feature/global-elements-backoffice' into v18/QA/glo…
nhudinh0309 Jan 22, 2026
94bf319
Elements: Fix Writer expected status codes in Element controller perm…
lauraneto Jan 22, 2026
3bd1ba4
Updated tests for duplicate element
nhudinh0309 Jan 22, 2026
512f8db
Added tests for element folder
nhudinh0309 Jan 22, 2026
c895e4b
Added tests for bulk action in element folder
nhudinh0309 Jan 22, 2026
d91a829
Elements: Fix duplicate column name in DocumentVersionDto index defin…
lauraneto Jan 22, 2026
7e01fc0
Add missing element mapper and allow deleting element types with acti…
kjac Jan 22, 2026
c85d9d7
Update src/Umbraco.Core/Cache/Refreshers/Implement/ElementCacheRefres…
kjac Jan 22, 2026
5dab68b
Review comment: ReadOnlyUserGroup constructor
kjac Jan 22, 2026
0d907b0
Merge remote-tracking branch 'origin/v17/feature/global-elements' int…
kjac Jan 22, 2026
625e814
Update comments in ElementEditingService
kjac Jan 22, 2026
085602e
Add Library section access to content, media, and member tree policies
lauraneto Jan 23, 2026
4a01c22
Added tests for element recycle bin
nhudinh0309 Jan 23, 2026
58252f6
Elements: Add Elements access to data type, document type, and relati…
lauraneto Jan 23, 2026
90c2c6d
Merge branch 'v18/dev' into v17/feature/global-elements
kjac Jan 23, 2026
5178304
Updated tests for delete element from recycle bin
nhudinh0309 Jan 26, 2026
4ca8ff4
Updated tests for content permission to match the test helper changes
nhudinh0309 Jan 26, 2026
b763437
Merge branch 'v17/feature/global-elements' into v18/feature/global-el…
lauraneto Jan 27, 2026
886ff16
Merge branch 'v18/dev' into v17/feature/global-elements
kjac Jan 27, 2026
204ce53
Amend merge from v18/dev
kjac Jan 27, 2026
705624f
Ignore local Claude settings in UI Client
leekelleher Jan 27, 2026
2948747
Updated workspace assign access,
leekelleher Jan 27, 2026
dc391af
Merge branch 'v17/feature/global-elements' into v18/feature/global-el…
leekelleher Jan 27, 2026
21d3ecb
Elements: Display trashed state in Element workspace info panel (#21542)
lauraneto Jan 27, 2026
bf1d832
Elements: Fix folder link in recycle bin list view (#21543)
lauraneto Jan 27, 2026
8b2197d
Elements: Add missing delete permission conditions to recycle bin act…
lauraneto Jan 27, 2026
2db5885
Updated tests to match the test helper changes
nhudinh0309 Jan 28, 2026
688419a
Added tests for element start node in user
nhudinh0309 Jan 28, 2026
5efc055
Added tests for element start node in user group
nhudinh0309 Jan 28, 2026
7c509f1
Added tests for element permission in user group
nhudinh0309 Jan 28, 2026
2ce904f
Merge branch 'v18/feature/global-elements-backoffice' into v18/QA/glo…
nhudinh0309 Jan 28, 2026
95e1217
Format code
nhudinh0309 Jan 28, 2026
62a52a4
Added tests for user with element start nodes
nhudinh0309 Jan 28, 2026
6fc7f28
Added tests for user group with element start nodes
nhudinh0309 Jan 28, 2026
c6cee65
Merge branch 'v18/dev' into v18/QA/global-element-tests
nhudinh0309 Feb 3, 2026
2b6c1e5
Bumped version
nhudinh0309 Feb 3, 2026
bc4d657
Added tests for variant element
nhudinh0309 Feb 3, 2026
ef5e720
Formatted code
nhudinh0309 Feb 3, 2026
a10de6a
Updated tests to match with test helper
nhudinh0309 Feb 3, 2026
6e950bc
Updated tests for document property value permission in block due to …
nhudinh0309 Feb 6, 2026
82ef97e
Updated tests for user groups default config
nhudinh0309 Feb 6, 2026
5f51ab9
Updated tests for user groups for document permission
nhudinh0309 Feb 6, 2026
5c5be21
Added tests for granular permission in element
nhudinh0309 Feb 9, 2026
313662a
Avoid hard code in tests for content start nodes
nhudinh0309 Feb 9, 2026
e7de149
Added .fixme tags for tests that still have issues
nhudinh0309 Feb 9, 2026
446a122
Fixed tests for default permission in element
nhudinh0309 Feb 9, 2026
00f610b
Added .fixme tag
nhudinh0309 Feb 9, 2026
7b958c3
Merge branch 'v18/dev' into v18/QA/global-element-tests
nhudinh0309 Feb 10, 2026
d868711
Bumped version
nhudinh0309 Feb 10, 2026
db0fe0f
Updated tests to match the test helper changes
nhudinh0309 Feb 10, 2026
6a45e18
Merge branch 'v18/QA/variant-element-tests' into v18/QA/global-elemen…
nhudinh0309 Feb 10, 2026
443f8c9
Removed tests for element picker
nhudinh0309 Feb 11, 2026
7979227
Added .fixme tags
nhudinh0309 Feb 11, 2026
2f476cf
Added .fixme tag
nhudinh0309 Feb 11, 2026
c3aa293
Merge branch 'v18/dev' into v18/QA/global-element-tests
nhudinh0309 Feb 13, 2026
cf8b751
Bumped version
nhudinh0309 Feb 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions tests/Umbraco.Tests.AcceptanceTest/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions tests/Umbraco.Tests.AcceptanceTest/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@
"typescript": "^4.8.3"
},
"dependencies": {
"@umbraco/json-models-builders": "^2.0.44",
"@umbraco/playwright-testhelpers": "^17.0.34",
"@umbraco/json-models-builders": "^18.0.1",
"@umbraco/playwright-testhelpers": "^18.0.3",
"camelize": "^1.0.0",
"dotenv": "^16.3.1",
"node-fetch": "^2.6.7"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
import {test} from '@umbraco/playwright-testhelpers';
import {expect} from "@playwright/test";

const dataTypeName = 'Element Picker';
const customDataTypeName = 'Custom Element Picker';
const editorAlias = 'Umbraco.ElementPicker';
const editorUiAlias = 'Umb.PropertyEditorUi.ElementPicker';

test.beforeEach(async ({umbracoUi, umbracoApi}) => {
await umbracoUi.goToBackOffice();
await umbracoUi.dataType.goToSettingsTreeItem('Data Types');
await umbracoApi.dataType.ensureNameNotExists(customDataTypeName);
});

test.afterEach(async ({umbracoApi}) => {
await umbracoApi.dataType.ensureNameNotExists(customDataTypeName);
});

test('can create an element picker data type', async ({umbracoApi, umbracoUi}) => {
// Act
await umbracoUi.dataType.clickActionsMenuForName('Data Types');
await umbracoUi.dataType.clickCreateActionMenuOption();
await umbracoUi.dataType.clickDataTypeButton();
await umbracoUi.dataType.enterDataTypeName(customDataTypeName);
await umbracoUi.dataType.clickSelectAPropertyEditorButton();
await umbracoUi.dataType.selectAPropertyEditor(dataTypeName);
await umbracoUi.dataType.clickSaveButtonAndWaitForDataTypeToBeCreated();

// Assert
await umbracoUi.dataType.isDataTypeTreeItemVisible(customDataTypeName);
expect(await umbracoApi.dataType.doesNameExist(customDataTypeName)).toBeTruthy();
const dataTypeData = await umbracoApi.dataType.getByName(customDataTypeName);
expect(dataTypeData.editorAlias).toBe(editorAlias);
expect(dataTypeData.editorUiAlias).toBe(editorUiAlias);
expect(dataTypeData.values).toEqual([]);
});

test('can set minimum amount', async ({umbracoApi, umbracoUi}) => {
// Arrange
const minAmount = 2;
await umbracoApi.dataType.createDefaultElementPickerDataType(customDataTypeName);
await umbracoUi.dataType.goToDataType(customDataTypeName);

// Act
await umbracoUi.dataType.enterMinAmount(minAmount.toString());
await umbracoUi.dataType.clickSaveButtonAndWaitForDataTypeToBeUpdated();

// Assert
expect(await umbracoApi.dataType.doesElementPickerHaveMinAndMaxAmount(customDataTypeName, minAmount)).toBeTruthy();
});

test('can set maximum amount', async ({umbracoApi, umbracoUi}) => {
// Arrange
const maxAmount = 5;
await umbracoApi.dataType.createDefaultElementPickerDataType(customDataTypeName);
await umbracoUi.dataType.goToDataType(customDataTypeName);

// Act
await umbracoUi.dataType.enterMaxAmount(maxAmount.toString());
await umbracoUi.dataType.clickSaveButtonAndWaitForDataTypeToBeUpdated();

// Assert
expect(await umbracoApi.dataType.doesElementPickerHaveMinAndMaxAmount(customDataTypeName, undefined, maxAmount)).toBeTruthy();
});

test('can set minimum and maximum amount', async ({umbracoApi, umbracoUi}) => {
// Arrange
const minAmount = 1;
const maxAmount = 10;
await umbracoApi.dataType.createDefaultElementPickerDataType(customDataTypeName);
await umbracoUi.dataType.goToDataType(customDataTypeName);

// Act
await umbracoUi.dataType.enterAmountValue(minAmount.toString(), maxAmount.toString());
await umbracoUi.dataType.clickSaveButtonAndWaitForDataTypeToBeUpdated();

// Assert
expect(await umbracoApi.dataType.doesElementPickerHaveMinAndMaxAmount(customDataTypeName, minAmount, maxAmount)).toBeTruthy();
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,212 @@
import {ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers';
import {expect} from "@playwright/test";

let elementTypeId = '';
let elementId = '';
const elementName = 'TestElement';
const elementTypeName = 'TestElementTypeForElement3';
const dataTypeName = 'Textstring';
const elementText = 'This is test element text';

test.beforeEach(async ({umbracoApi}) => {
await umbracoApi.element.ensureNameNotExists(elementName);
const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName);
elementTypeId = await umbracoApi.documentType.createElementTypeWithPropertyInTab(elementTypeName, 'TestTab', 'TestGroup', dataTypeName, dataTypeData.id);
});

test.afterEach(async ({umbracoApi}) => {
await umbracoApi.element.ensureNameNotExists(elementName);
await umbracoApi.documentType.ensureNameNotExists(elementTypeName);
});

test('can create empty element', async ({umbracoApi, umbracoUi}) => {
// Arrange
const expectedState = 'Draft';
await umbracoUi.goToBackOffice();
await umbracoUi.library.goToSection(ConstantHelper.sections.library);

// Act
await umbracoUi.library.clickActionsMenuAtRoot();
await umbracoUi.library.clickCreateActionMenuOption();
await umbracoUi.library.clickElementButton();
await umbracoUi.library.clickModalMenuItemWithName(elementTypeName);
await umbracoUi.library.clickChooseModalButton();
await umbracoUi.library.enterElementName(elementName);
await umbracoUi.library.clickSaveButtonAndWaitForElementToBeCreated();

// Assert
expect(await umbracoApi.element.doesNameExist(elementName)).toBeTruthy();
const elementData = await umbracoApi.element.getByName(elementName);
expect(elementData.variants[0].state).toBe(expectedState);
});

test('can save and publish empty element', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const expectedState = 'Published';
await umbracoUi.goToBackOffice();
await umbracoUi.library.goToSection(ConstantHelper.sections.library);

// Act
await umbracoUi.library.clickActionsMenuAtRoot();
await umbracoUi.library.clickCreateActionMenuOption();
await umbracoUi.library.clickElementButton();
await umbracoUi.library.clickModalMenuItemWithName(elementTypeName);
await umbracoUi.library.clickChooseModalButton();
await umbracoUi.library.enterElementName(elementName);
await umbracoUi.library.clickSaveAndPublishButtonAndWaitForElementToBeCreated();

// Assert
expect(await umbracoApi.element.doesNameExist(elementName)).toBeTruthy();
const elementData = await umbracoApi.element.getByName(elementName);
expect(elementData.variants[0].state).toBe(expectedState);
});

test('can create element', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
await umbracoUi.goToBackOffice();
await umbracoUi.library.goToSection(ConstantHelper.sections.library);

// Act
await umbracoUi.library.clickActionsMenuAtRoot();
await umbracoUi.library.clickCreateActionMenuOption();
await umbracoUi.library.clickElementButton();
await umbracoUi.library.clickModalMenuItemWithName(elementTypeName);
await umbracoUi.library.clickChooseModalButton();
await umbracoUi.library.enterElementName(elementName);
await umbracoUi.library.enterTextstring(elementText);
await umbracoUi.library.clickSaveButtonAndWaitForElementToBeCreated();

// Assert
expect(await umbracoApi.element.doesNameExist(elementName)).toBeTruthy();
const elementData = await umbracoApi.element.getByName(elementName);
expect(elementData.values[0].value).toBe(elementText);
});

test('can rename element', async ({umbracoApi, umbracoUi}) => {
// Arrange
const wrongElementName = 'Wrong Element Name';
elementId = await umbracoApi.element.createDefaultElement(wrongElementName, elementTypeId);
expect(await umbracoApi.element.doesNameExist(wrongElementName)).toBeTruthy();
await umbracoUi.goToBackOffice();
await umbracoUi.library.goToSection(ConstantHelper.sections.library);

// Act
await umbracoUi.library.goToElementWithName(wrongElementName);
await umbracoUi.library.enterElementName(elementName);
await umbracoUi.library.clickSaveButtonAndWaitForElementToBeUpdated();

// Assert
const updatedelementData = await umbracoApi.element.get(elementId);
expect(updatedelementData.variants[0].name).toEqual(elementName);
});

test('can update element', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const wrongElementText = 'This is wrong test element text';
elementId = await umbracoApi.element.createElementWithTextContent(elementName, elementTypeId, wrongElementText, dataTypeName);
await umbracoUi.goToBackOffice();
await umbracoUi.library.goToSection(ConstantHelper.sections.library);

// Act
await umbracoUi.library.goToElementWithName(elementName);
await umbracoUi.library.enterTextstring(elementText);
await umbracoUi.library.clickSaveButtonAndWaitForElementToBeUpdated();

// Assert
const updatedelementData = await umbracoApi.element.getByName(elementName);
expect(updatedelementData.values[0].value).toBe(elementText);
});

test('can unpublish element', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
elementId = await umbracoApi.element.createElementWithTextContent(elementName, elementTypeId, elementText, dataTypeName);
await umbracoApi.element.publish(elementId);
await umbracoUi.goToBackOffice();
await umbracoUi.library.goToSection(ConstantHelper.sections.library);

// Act
await umbracoUi.library.clickActionsMenuForElement(elementName);
await umbracoUi.library.clickUnpublishActionMenuOption();
await umbracoUi.library.clickConfirmToUnpublishButton();

// Assert
await umbracoUi.library.doesSuccessNotificationHaveText(NotificationConstantHelper.success.unpublished);
const elementData = await umbracoApi.element.getByName(elementName);
expect(elementData.variants[0].state).toBe('Draft');
});

test('can duplicate a element node to root', async ({umbracoApi, umbracoUi}) => {
// Arrange
const duplicatedElementName = elementName + ' (1)';
elementId = await umbracoApi.element.createElementWithTextContent(elementName, elementTypeId, elementText, dataTypeName);
await umbracoUi.goToBackOffice();
await umbracoUi.library.goToSection(ConstantHelper.sections.library);

// Act
await umbracoUi.library.clickActionsMenuForElement(elementName);
// Duplicate to root
await umbracoUi.library.clickDuplicateToActionMenuOption();
await umbracoUi.library.clickLabelWithName('Elements');
await umbracoUi.library.clickDuplicateButton();

// Assert
await umbracoUi.library.doesSuccessNotificationHaveText(NotificationConstantHelper.success.duplicated);
expect(await umbracoApi.element.doesNameExist(elementName)).toBeTruthy();
expect(await umbracoApi.element.doesNameExist(duplicatedElementName)).toBeTruthy();
await umbracoUi.library.isElementInTreeVisible(elementName);
await umbracoUi.library.isElementInTreeVisible(duplicatedElementName);
const elementData = await umbracoApi.element.getByName(elementName);
const duplicatedElementData = await umbracoApi.element.getByName(duplicatedElementName);
expect(elementData.values[0].value).toEqual(duplicatedElementData.values[0].value);

// Clean
await umbracoApi.element.ensureNameNotExists(duplicatedElementName);
});

test('can duplicate a element node to other parent', async ({umbracoApi, umbracoUi}) => {
// Arrange
const elementFolderName = 'TestElementFolder';
await umbracoApi.element.createDefaultElementFolder(elementFolderName);
elementId = await umbracoApi.element.createElementWithTextContent(elementName, elementTypeId, elementText, dataTypeName);
await umbracoUi.goToBackOffice();
await umbracoUi.library.goToSection(ConstantHelper.sections.library);

// Act
await umbracoUi.library.clickActionsMenuForElement(elementName);
await umbracoUi.library.clickDuplicateToActionMenuOption();
await umbracoUi.library.clickModalMenuItemWithName(elementFolderName);
await umbracoUi.library.clickDuplicateButton();

// Assert
await umbracoUi.library.doesSuccessNotificationHaveText(NotificationConstantHelper.success.duplicated);
await umbracoUi.library.isElementInTreeVisible(elementName);
await umbracoUi.library.isElementInTreeVisible(elementFolderName);
await umbracoUi.library.goToElementWithName(elementFolderName);

// Clean
await umbracoApi.element.ensureNameNotExists(elementFolderName);
});

test('can move a element node to other parent', async ({umbracoApi, umbracoUi}) => {
// Arrange
const elementFolderName = 'TestElementFolder';
const elementFolderId = await umbracoApi.element.createDefaultElementFolder(elementFolderName);
elementId = await umbracoApi.element.createElementWithTextContent(elementName, elementTypeId, elementText, dataTypeName);
await umbracoUi.goToBackOffice();
await umbracoUi.library.goToSection(ConstantHelper.sections.library);

// Act;
await umbracoUi.library.clickActionsMenuForElement(elementName);
await umbracoUi.library.clickMoveToActionMenuOption();
await umbracoUi.library.moveToElementWithName([], elementFolderName);

// Assert
await umbracoUi.library.doesSuccessNotificationHaveText(NotificationConstantHelper.success.moved);
await umbracoUi.library.clickActionsMenuForElement(elementFolderName);
await umbracoUi.library.clickReloadChildrenActionMenuOption();
await umbracoUi.library.isCaretButtonVisibleForElementName(elementFolderName, true);
await umbracoUi.library.openElementCaretButtonForName(elementFolderName);
await umbracoUi.library.isChildElementInTreeVisible(elementFolderName, elementName, true);
await umbracoUi.library.isCaretButtonVisibleForElementName(elementName, false);
expect(await umbracoApi.element.getChildrenAmount(elementFolderId)).toEqual(1);
});
Loading
Loading