diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/tree/member-groups/tree-member-groups.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/tree/member-groups/tree-member-groups.context.ts
new file mode 100644
index 0000000000..2724d9519f
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/tree/member-groups/tree-member-groups.context.ts
@@ -0,0 +1,19 @@
+import { ITreeService } from '../tree.service';
+
+export class UmbTreeMemberGroupsContext implements ITreeService {
+ public async getRoot() {
+ return {
+ id: -1,
+ key: 'd46d144e-33d8-41e3-bf7a-545287e16e3c',
+ name: 'Member Groups',
+ hasChildren: true,
+ };
+ }
+
+ public async getChildren(id: string) {
+ // TODO: figure out url structure
+ const res = await fetch(`/umbraco/backoffice/trees/member-groups/${id}`);
+ const json = await res.json();
+ return json;
+ }
+}
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/tree/member-groups/tree-member-groups.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/tree/member-groups/tree-member-groups.element.ts
new file mode 100644
index 0000000000..b72a52731e
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/tree/member-groups/tree-member-groups.element.ts
@@ -0,0 +1,37 @@
+import { css, html, LitElement } from 'lit';
+import { UUITextStyles } from '@umbraco-ui/uui-css/lib';
+import { customElement, property } from 'lit/decorators.js';
+
+import '../shared/tree-navigator.element';
+
+import { UmbContextProviderMixin } from '../../../core/context';
+import { UmbExtensionManifestTree } from '../../../core/extension';
+import { UmbTreeMemberGroupsContext } from './tree-member-groups.context';
+
+@customElement('umb-tree-member-groups')
+export class UmbTreeMemberGroups extends UmbContextProviderMixin(LitElement) {
+ static styles = [UUITextStyles, css``];
+
+ private _treeContext?: UmbTreeMemberGroupsContext;
+
+ @property({ attribute: false })
+ public tree?: UmbExtensionManifestTree;
+
+ connectedCallback() {
+ super.connectedCallback();
+ this._treeContext = new UmbTreeMemberGroupsContext();
+ this.provideContext('umbTreeService', this._treeContext);
+ }
+
+ render() {
+ return html``;
+ }
+}
+
+export default UmbTreeMemberGroups;
+
+declare global {
+ interface HTMLElementTagNameMap {
+ 'umb-tree-member-groups': UmbTreeMemberGroups;
+ }
+}
diff --git a/src/Umbraco.Web.UI.Client/src/mocks/domains/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/domains/tree.handlers.ts
index 3e1e4c0921..54d7910843 100644
--- a/src/Umbraco.Web.UI.Client/src/mocks/domains/tree.handlers.ts
+++ b/src/Umbraco.Web.UI.Client/src/mocks/domains/tree.handlers.ts
@@ -23,4 +23,36 @@ export const handlers = [
return res(ctx.status(200), ctx.json(items));
}),
+
+ rest.get('/umbraco/backoffice/trees/member-groups/:id', (req, res, ctx) => {
+ console.warn('Please move to schema');
+ const id = req.params.id as string;
+ if (!id) return;
+
+ //const int = parseInt(id);
+ //const document = umbNodeData.getById(int);
+
+ const items = [
+ {
+ id: '1',
+ key: 'fcb3f468-97de-469d-8090-d14d068ad968',
+ name: 'Group 1',
+ hasChildren: false,
+ },
+ {
+ id: '2',
+ key: 'd99bfca4-551d-427d-a842-d47b756b8977',
+ name: 'Group 2',
+ hasChildren: false,
+ },
+ {
+ id: '3',
+ key: 'b7b7ec7c-1c4a-4a78-9a6a-0652e891972a',
+ name: 'Group 3',
+ hasChildren: false,
+ },
+ ];
+
+ return res(ctx.status(200), ctx.json(items));
+ }),
];
diff --git a/src/Umbraco.Web.UI.Client/src/temp-internal-manifests.ts b/src/Umbraco.Web.UI.Client/src/temp-internal-manifests.ts
index 416ba8f0f8..3e90b454f8 100644
--- a/src/Umbraco.Web.UI.Client/src/temp-internal-manifests.ts
+++ b/src/Umbraco.Web.UI.Client/src/temp-internal-manifests.ts
@@ -289,4 +289,15 @@ export const internalManifests: Array = [
sections: ['Umb.Section.Members'],
},
},
+ {
+ type: 'tree',
+ alias: 'Umb.Tree.MemberGroups',
+ name: 'Members Groups Tree',
+ js: () => import('./backoffice/tree/member-groups/tree-member-groups.element'),
+ meta: {
+ label: 'Member Groups',
+ weight: -10,
+ sections: ['Umb.Section.Members'],
+ },
+ },
];