Skip to content

Commit 0eef5e5

Browse files
committed
context
1 parent 8f9bfb4 commit 0eef5e5

File tree

8 files changed

+192
-2
lines changed

8 files changed

+192
-2
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export * from './route-path-addendum.context-token.js';
2+
export * from './route-path-addendum.context.js';
3+
export type * from './route-path-addendum.interface.js';
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import type { UmbRoutePathAddendum } from './route-path-addendum.interface.js';
2+
import { UMB_ROUTE_PATH_ADDENDUM_CONTEXT } from './route-path-addendum.context-token.js';
3+
import { UmbContextBase } from '@umbraco-cms/backoffice/class-api';
4+
import { UmbStringState } from '@umbraco-cms/backoffice/observable-api';
5+
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
6+
7+
export class UmbRoutePathAddendumResetContext
8+
extends UmbContextBase<UmbRoutePathAddendum, typeof UMB_ROUTE_PATH_ADDENDUM_CONTEXT>
9+
implements UmbRoutePathAddendum
10+
{
11+
#appendum = new UmbStringState('');
12+
readonly addendum = this.#appendum.asObservable();
13+
14+
constructor(host: UmbControllerHost) {
15+
super(host, UMB_ROUTE_PATH_ADDENDUM_CONTEXT);
16+
}
17+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import type { UmbRoutePathAddendum } from './route-path-addendum.interface.js';
2+
import { UmbContextToken } from '@umbraco-cms/backoffice/context-api';
3+
4+
export const UMB_ROUTE_PATH_ADDENDUM_CONTEXT = new UmbContextToken<UmbRoutePathAddendum>('UmbRoutePathAddendum');
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import type { UmbRoutePathAddendum } from './route-path-addendum.interface.js';
2+
import { UMB_ROUTE_PATH_ADDENDUM_CONTEXT } from './route-path-addendum.context-token.js';
3+
import { UmbContextBase } from '@umbraco-cms/backoffice/class-api';
4+
import { UmbStringState } from '@umbraco-cms/backoffice/observable-api';
5+
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
6+
7+
export class UmbRoutePathAddendumContext
8+
extends UmbContextBase<UmbRoutePathAddendum, typeof UMB_ROUTE_PATH_ADDENDUM_CONTEXT>
9+
implements UmbRoutePathAddendum
10+
{
11+
#parentAddendum?: string;
12+
#currentAddendum?: string;
13+
14+
#pathAddendum = new UmbStringState(undefined);
15+
readonly addendum = this.#pathAddendum.asObservable();
16+
17+
constructor(host: UmbControllerHost) {
18+
super(host, UMB_ROUTE_PATH_ADDENDUM_CONTEXT);
19+
20+
this.consumeContext(UMB_ROUTE_PATH_ADDENDUM_CONTEXT, (context) => {
21+
this.observe(context.addendum, (addendum) => {
22+
this.#parentAddendum = addendum;
23+
this.#update();
24+
});
25+
}).skipHost();
26+
}
27+
28+
setAddendum(addendum: string) {
29+
this.#currentAddendum = addendum;
30+
this.#update();
31+
}
32+
33+
#update() {
34+
if (this.#parentAddendum === undefined || this.#currentAddendum === undefined) {
35+
return;
36+
}
37+
this.#pathAddendum.setValue(this.#parentAddendum + this.#currentAddendum);
38+
}
39+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import type { Observable } from '@umbraco-cms/backoffice/observable-api';
2+
3+
export interface UmbRoutePathAddendum {
4+
addendum: Observable<string | undefined>;
5+
}
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
import { expect } from '@open-wc/testing';
2+
import { Observable } from '@umbraco-cms/backoffice/external/rxjs';
3+
import { customElement } from '@umbraco-cms/backoffice/external/lit';
4+
import { UmbElementMixin } from '@umbraco-cms/backoffice/element-api';
5+
import { UmbRoutePathAddendumResetContext } from './route-path-addendum-reset.context';
6+
import { UmbRoutePathAddendumContext } from './route-path-addendum.context';
7+
8+
@customElement('umb-test-host')
9+
class UmbTestHostElement extends UmbElementMixin(HTMLElement) {}
10+
11+
@customElement('umb-test-child')
12+
class UmbTestChildElement extends UmbElementMixin(HTMLElement) {}
13+
14+
describe('UmbRoutepathAddendum', () => {
15+
let resetContext: UmbRoutePathAddendumResetContext;
16+
let addendumContext: UmbRoutePathAddendumContext;
17+
let host: UmbTestHostElement;
18+
let child: UmbTestChildElement;
19+
20+
beforeEach(() => {
21+
host = new UmbTestHostElement();
22+
child = new UmbTestChildElement();
23+
host.appendChild(child);
24+
document.body.appendChild(host);
25+
resetContext = new UmbRoutePathAddendumResetContext(host);
26+
addendumContext = new UmbRoutePathAddendumContext(child);
27+
});
28+
29+
afterEach(() => {
30+
document.body.removeChild(host);
31+
resetContext.destroy();
32+
addendumContext.destroy();
33+
});
34+
35+
describe('Public API', () => {
36+
describe('properties', () => {
37+
it('has a entity type property', () => {
38+
expect(addendumContext).to.have.property('addendum').to.be.an.instanceOf(Observable);
39+
});
40+
});
41+
42+
describe('methods', () => {
43+
it('has a setAddendum method', () => {
44+
expect(addendumContext).to.have.property('setAddendum').that.is.a('function');
45+
});
46+
});
47+
});
48+
49+
describe('build up addendum', () => {
50+
it('returns early set addendum', (done) => {
51+
addendumContext.setAddendum('hello/here');
52+
addendumContext.observe(addendumContext.addendum, (addendum) => {
53+
if (addendum) {
54+
expect(addendum).to.equal('hello/here');
55+
done();
56+
}
57+
});
58+
});
59+
60+
it('returns late set addendum', (done) => {
61+
addendumContext.observe(addendumContext.addendum, (addendum) => {
62+
if (addendum) {
63+
expect(addendum).to.equal('/hello/here');
64+
done();
65+
}
66+
});
67+
addendumContext.setAddendum('/hello/here');
68+
});
69+
70+
it('returns an updated addendum', (done) => {
71+
let count = 0;
72+
addendumContext.observe(addendumContext.addendum, (addendum) => {
73+
count++;
74+
if (count === 1) {
75+
if (addendum) {
76+
expect(addendum).to.equal('/hello/here');
77+
done();
78+
}
79+
} else if (count === 2) {
80+
if (addendum) {
81+
expect(addendum).to.equal('/hello/updateded');
82+
done();
83+
}
84+
}
85+
});
86+
addendumContext.setAddendum('/hello/here');
87+
addendumContext.setAddendum('/hello/updateded');
88+
});
89+
90+
it('returns early set child addendum', (done) => {
91+
addendumContext.setAddendum('/hello/here');
92+
const innerChild = new UmbTestChildElement();
93+
child.appendChild(innerChild);
94+
const childAddendumContext = new UmbRoutePathAddendumContext(innerChild);
95+
childAddendumContext.setAddendum('/child-specification');
96+
97+
childAddendumContext.observe(childAddendumContext.addendum, (addendum) => {
98+
if (addendum) {
99+
expect(addendum).to.equal('/hello/here/child-specification');
100+
done();
101+
}
102+
});
103+
});
104+
105+
it('returns late set child addendum', (done) => {
106+
addendumContext.setAddendum('/hello/here');
107+
const innerChild = new UmbTestChildElement();
108+
child.appendChild(innerChild);
109+
const childAddendumContext = new UmbRoutePathAddendumContext(innerChild);
110+
111+
childAddendumContext.observe(childAddendumContext.addendum, (addendum) => {
112+
if (addendum) {
113+
expect(addendum).to.equal('/hello/here/child-specification');
114+
done();
115+
}
116+
});
117+
118+
childAddendumContext.setAddendum('/child-specification');
119+
});
120+
});
121+
});

src/Umbraco.Web.UI.Client/src/packages/core/router/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
export * from './components/not-found/route-not-found.element.js';
22
export * from './components/router-slot/index.js';
3+
export * from './contexts/index.js';
34
export * from './encode-folder-name.function.js';
45
export * from './modal-registration/modal-route-registration.controller.js';
56
export * from './path-pattern.class.js';

src/Umbraco.Web.UI.Client/utils/all-umb-consts/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ export const foundConsts = [{
300300
},
301301
{
302302
path: '@umbraco-cms/backoffice/router',
303-
consts: ["UMB_ROUTE_CONTEXT"]
303+
consts: ["UMB_ROUTE_CONTEXT","UMB_ROUTE_PATH_ADDENDUM_CONTEXT"]
304304
},
305305
{
306306
path: '@umbraco-cms/backoffice/rte',
@@ -420,7 +420,7 @@ export const foundConsts = [{
420420
},
421421
{
422422
path: '@umbraco-cms/backoffice/workspace',
423-
consts: ["UMB_WORKSPACE_SPLIT_VIEW_CONTEXT","UMB_WORKSPACE_HAS_COLLECTION_CONDITION_ALIAS","UMB_WORKSPACE_HAS_COLLECTION_CONDITION","UMB_WORKSPACE_ENTITY_IS_NEW_CONDITION_ALIAS","UMB_WORKSPACE_ENTITY_IS_NEW_CONDITION","UMB_WORKSPACE_CONDITION_ALIAS","UMB_ENTITY_WORKSPACE_CONTEXT","UMB_PROPERTY_STRUCTURE_WORKSPACE_CONTEXT","UMB_PUBLISHABLE_WORKSPACE_CONTEXT","UMB_ROUTABLE_WORKSPACE_CONTEXT","UMB_SUBMITTABLE_WORKSPACE_CONTEXT","UMB_VARIANT_WORKSPACE_CONTEXT","UMB_ENTITY_DETAIL_WORKSPACE_CONTEXT","UMB_WORKSPACE_MODAL","UMB_NAMABLE_WORKSPACE_CONTEXT","UMB_WORKSPACE_PATH_PATTERN","UMB_WORKSPACE_CONTEXT"]
423+
consts: ["UMB_WORKSPACE_SPLIT_VIEW_CONTEXT","UMB_WORKSPACE_HAS_COLLECTION_CONDITION_ALIAS","UMB_WORKSPACE_HAS_COLLECTION_CONDITION","UMB_WORKSPACE_ENTITY_IS_NEW_CONDITION_ALIAS","UMB_WORKSPACE_ENTITY_IS_NEW_CONDITION","UMB_WORKSPACE_CONDITION_ALIAS","UMB_ENTITY_WORKSPACE_CONTEXT","UMB_PROPERTY_STRUCTURE_WORKSPACE_CONTEXT","UMB_PUBLISHABLE_WORKSPACE_CONTEXT","UMB_ROUTABLE_WORKSPACE_CONTEXT","UMB_SUBMITTABLE_WORKSPACE_CONTEXT","UMB_VARIANT_WORKSPACE_CONTEXT","UMB_ENTITY_DETAIL_WORKSPACE_CONTEXT","UMB_WORKSPACE_MODAL","UMB_NAMABLE_WORKSPACE_CONTEXT","UMB_WORKSPACE_PATH_PATTERN","UMB_WORKSPACE_VIEW_PATH_PATTERN","UMB_WORKSPACE_CONTEXT"]
424424
},
425425
{
426426
path: '@umbraco-cms/backoffice/external/backend-api',

0 commit comments

Comments
 (0)