@api-client/ui 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/src/bindings/base/IoThread.d.ts +2 -2
- package/build/src/bindings/base/IoThread.d.ts.map +1 -1
- package/build/src/bindings/base/IoThread.js +4 -4
- package/build/src/bindings/base/IoThread.js.map +1 -1
- package/build/src/bindings/base/PlatformBindings.js +2 -2
- package/build/src/bindings/base/PlatformBindings.js.map +1 -1
- package/build/src/core/Activity.d.ts +3 -3
- package/build/src/core/Activity.d.ts.map +1 -1
- package/build/src/core/Activity.js +8 -7
- package/build/src/core/Activity.js.map +1 -1
- package/build/src/core/ActivityManager.d.ts +9 -0
- package/build/src/core/ActivityManager.d.ts.map +1 -1
- package/build/src/core/ActivityManager.js +57 -12
- package/build/src/core/ActivityManager.js.map +1 -1
- package/build/src/core/Application.d.ts +1 -0
- package/build/src/core/Application.d.ts.map +1 -1
- package/build/src/core/Application.js +3 -0
- package/build/src/core/Application.js.map +1 -1
- package/build/src/core/Fragment.d.ts +9 -3
- package/build/src/core/Fragment.d.ts.map +1 -1
- package/build/src/core/Fragment.js +17 -8
- package/build/src/core/Fragment.js.map +1 -1
- package/build/src/core/FragmentManager.d.ts +17 -0
- package/build/src/core/FragmentManager.d.ts.map +1 -1
- package/build/src/core/FragmentManager.js +58 -2
- package/build/src/core/FragmentManager.js.map +1 -1
- package/build/src/core/renderer/Renderer.d.ts +4 -1
- package/build/src/core/renderer/Renderer.d.ts.map +1 -1
- package/build/src/core/renderer/Renderer.js +3 -0
- package/build/src/core/renderer/Renderer.js.map +1 -1
- package/build/src/elements/data-table/DataTable.d.ts +7 -0
- package/build/src/elements/data-table/DataTable.d.ts.map +1 -1
- package/build/src/elements/data-table/DataTable.js +8 -0
- package/build/src/elements/data-table/DataTable.js.map +1 -1
- package/package.json +1 -1
- package/src/bindings/base/IoThread.ts +7 -7
- package/src/bindings/base/PlatformBindings.ts +3 -3
- package/src/core/Activity.ts +8 -7
- package/src/core/ActivityManager.ts +58 -12
- package/src/core/Application.ts +4 -0
- package/src/core/Fragment.ts +18 -8
- package/src/core/FragmentManager.ts +61 -3
- package/src/core/renderer/Renderer.ts +4 -1
- package/src/elements/data-table/DataTable.ts +7 -0
- package/test/core/activity.spec.ts +235 -2
- package/test/core/activity_manager.spec.ts +544 -0
- package/test/core/application.spec.ts +218 -0
- package/test/core/fragment.spec.ts +472 -0
- package/test/core/fragment_manager.spec.ts +404 -0
- package/web-test-runner.config.js +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Application.js","sourceRoot":"","sources":["../../../src/core/Application.ts"],"names":[],"mappings":"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","sourcesContent":["import { nothing, type TemplateResult } from 'lit'\nimport { ActivityManager, ActivityState } from './ActivityManager.js'\nimport type { Activity } from './Activity.js'\nimport { ApplicationRenderer } from './renderer/ApplicationRenderer.js'\nimport { ThemeManager } from './ThemeManager.js'\n\n/**\n * Allows to fine-tune the update request.\n * For example, if a `Fragment` wants to update only itself, then\n * list other types should be set to false.\n */\nexport interface UpdateRequest {\n /**\n * Whether the whole application should be updated.\n * Default to true.\n */\n app?: boolean\n /**\n * Whether the activity should be updated.\n * Default to true.\n */\n activity?: boolean\n /**\n * Whether the fragment should be updated.\n * Default to true.\n */\n fragment?: boolean\n}\n/**\n * The application represents an application screen that hosts\n * Activities. Activities are managed by the Activity manager.\n *\n * An application is a separate app within the ecosystem. For example,\n * the file browser is one application. The domain designer is another.\n *\n * Each application manages it's own lifecycle. The application is rendered\n * by the lit's library `render()` function. Activities can call application's\n * main `requestUpdate()` function to render the entire application.\n *\n * Activities have the render function that renders its UI.\n * The Activity's UI can be composed of fragments, but this is optional.\n * When an activity uses fragments, they receive control over rendering their\n * UIs. An activity implementation has to take care of passing HTMLElement\n * references to their Fragments to make that happen. Otherwise, the activity\n * has to communicate with their fragments to request to re-render the application.\n */\nexport abstract class Application extends EventTarget {\n private activityUpdateListener = this.handleActivityUpdate.bind(this)\n\n #activities: ActivityManager\n\n #theme: ThemeManager\n\n /**\n * Application's theme manager.\n */\n get theme(): ThemeManager {\n return this.#theme\n }\n\n /**\n * Returns the application's activity manager.\n */\n get manager(): ActivityManager {\n return this.#activities\n }\n\n #events: EventTarget\n\n /**\n * The application main event bus.\n * All activities and fragments use it to communicate.\n * This way, events do not leak outside the application.\n */\n get events(): EventTarget {\n return this.#events\n }\n\n #renderer: ApplicationRenderer\n\n get renderer(): ApplicationRenderer {\n return this.#renderer\n }\n\n /**\n * @type A promise resolved when the render finished.\n */\n get updateComplete(): Promise<void> | undefined {\n return this.#renderer.updateComplete\n }\n\n /**\n * @type True when the application was first rendered.\n */\n get firstRendered(): boolean {\n return this.#renderer.firstRendered\n }\n\n /**\n * @param renderRoot The element or a CSS query to the element where the application will be rendered.\n */\n constructor(renderRoot: HTMLElement | string) {\n super()\n this.#events = new EventTarget()\n this.#activities = new ActivityManager(this)\n this.#renderer = new ApplicationRenderer(this)\n this.#renderer.setRenderRoot(renderRoot)\n this.#theme = new ThemeManager()\n\n // Listen for activity updates\n this.#events.addEventListener('activity:update', this.activityUpdateListener as EventListener)\n }\n\n /**\n * @see {@link ./Renderer.js}\n */\n public setRenderRoot(renderRoot: HTMLElement | string): void {\n this.#renderer.setRenderRoot(renderRoot)\n }\n\n /**\n * Called when the application starts.\n * This is where you should start the initial Activity using\n * `ActivityManager.startActivity(...)`.\n */\n abstract onStart(): void | Promise<void>\n\n /**\n * Called when the application is stopped/closed.\n * Perform cleanup here.\n */\n onStop(): void | Promise<void> {\n //\n }\n\n /**\n * Called when the application was rendered for the first time.\n * Call `super.onFirstRender()` when overriding this method.\n */\n onFirstRender(): void {\n this.#events.dispatchEvent(new Event('app:first-render'))\n }\n\n /**\n * Called when the application was rendered.\n */\n onRendered(): void {\n //\n }\n\n /**\n * The main render method for the Application. Called whenever an activity\n * requests an update. Renders the currently active Activity's content.\n *\n * If you override this method then any activity won't be rendered.\n *\n * @returns The Lit template to render.\n */\n render(): TemplateResult | typeof nothing {\n const currentActivity = this.#activities.getCurrentActivity()\n // Only render if started or beyond\n if (currentActivity && currentActivity.state >= ActivityState.Started) {\n return currentActivity.render()\n }\n return nothing\n }\n\n /**\n * Handles activity update requests and re-renders the application.\n */\n private handleActivityUpdate(e: CustomEvent<UpdateRequest | undefined>): void {\n this.requestUpdate(e.detail || undefined)\n }\n\n /**\n * Requests an update of the application UI. This will call the `render()` method\n * and update the DOM.\n */\n requestUpdate(opts: UpdateRequest = {}): void {\n const { app = true } = opts\n if (app) {\n this.#renderer.requestUpdate()\n }\n }\n\n /**\n * Starts the application by calling onStart and performing an initial render.\n */\n public async run(): Promise<void> {\n await this.onStart()\n this.requestUpdate()\n }\n\n /**\n * Stops the application, performing cleanup if necessary.\n */\n public async stop(): Promise<void> {\n this.#events.removeEventListener('activity:update', this.activityUpdateListener as EventListener)\n // Allow subclasses to clean up\n await this.onStop()\n // ... any other application-level cleanup\n }\n\n getCurrentActivity(): Activity | undefined {\n return this.#activities.getCurrentActivity()\n }\n\n /**\n * Unifies Fragment and Application interfaces.\n * @returns `this`\n */\n getApplication() {\n return this\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Application.js","sourceRoot":"","sources":["../../../src/core/Application.ts"],"names":[],"mappings":"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","sourcesContent":["import { nothing, type TemplateResult } from 'lit'\nimport { ActivityManager, ActivityState } from './ActivityManager.js'\nimport type { Activity } from './Activity.js'\nimport { ApplicationRenderer } from './renderer/ApplicationRenderer.js'\nimport { ThemeManager } from './ThemeManager.js'\n\n/**\n * Allows to fine-tune the update request.\n * For example, if a `Fragment` wants to update only itself, then\n * list other types should be set to false.\n */\nexport interface UpdateRequest {\n /**\n * Whether the whole application should be updated.\n * Default to true.\n */\n app?: boolean\n /**\n * Whether the activity should be updated.\n * Default to true.\n */\n activity?: boolean\n /**\n * Whether the fragment should be updated.\n * Default to true.\n */\n fragment?: boolean\n}\n/**\n * The application represents an application screen that hosts\n * Activities. Activities are managed by the Activity manager.\n *\n * An application is a separate app within the ecosystem. For example,\n * the file browser is one application. The domain designer is another.\n *\n * Each application manages it's own lifecycle. The application is rendered\n * by the lit's library `render()` function. Activities can call application's\n * main `requestUpdate()` function to render the entire application.\n *\n * Activities have the render function that renders its UI.\n * The Activity's UI can be composed of fragments, but this is optional.\n * When an activity uses fragments, they receive control over rendering their\n * UIs. An activity implementation has to take care of passing HTMLElement\n * references to their Fragments to make that happen. Otherwise, the activity\n * has to communicate with their fragments to request to re-render the application.\n */\nexport abstract class Application extends EventTarget {\n private activityUpdateListener = this.handleActivityUpdate.bind(this)\n\n #activities: ActivityManager\n\n #theme: ThemeManager\n\n /**\n * Application's theme manager.\n */\n get theme(): ThemeManager {\n return this.#theme\n }\n\n /**\n * Returns the application's activity manager.\n */\n get manager(): ActivityManager {\n return this.#activities\n }\n\n #events: EventTarget\n\n /**\n * The application main event bus.\n * All activities and fragments use it to communicate.\n * This way, events do not leak outside the application.\n */\n get events(): EventTarget {\n return this.#events\n }\n\n #renderer: ApplicationRenderer\n\n get renderer(): ApplicationRenderer {\n return this.#renderer\n }\n\n /**\n * @type A promise resolved when the render finished.\n */\n get updateComplete(): Promise<void> | undefined {\n return this.#renderer.updateComplete\n }\n\n /**\n * @type True when the application was first rendered.\n */\n get firstRendered(): boolean {\n return this.#renderer.firstRendered\n }\n\n /**\n * @param renderRoot The element or a CSS query to the element where the application will be rendered.\n */\n constructor(renderRoot: HTMLElement | string) {\n super()\n this.#events = new EventTarget()\n this.#activities = new ActivityManager(this)\n this.#renderer = new ApplicationRenderer(this)\n this.#renderer.setRenderRoot(renderRoot)\n this.#theme = new ThemeManager()\n\n // Listen for activity updates\n this.#events.addEventListener('activity:update', this.activityUpdateListener as EventListener)\n }\n\n /**\n * @see {@link ./Renderer.js}\n */\n public setRenderRoot(renderRoot: HTMLElement | string): void {\n this.#renderer.setRenderRoot(renderRoot)\n }\n\n /**\n * Called when the application starts.\n * This is where you should start the initial Activity using\n * `ActivityManager.startActivity(...)`.\n */\n abstract onStart(): void | Promise<void>\n\n /**\n * Called when the application is stopped/closed.\n * Perform cleanup here.\n */\n onStop(): void | Promise<void> {\n //\n }\n\n /**\n * Called when the application was rendered for the first time.\n * Call `super.onFirstRender()` when overriding this method.\n */\n onFirstRender(): void {\n this.#events.dispatchEvent(new Event('app:first-render'))\n }\n\n /**\n * Called when the application was rendered.\n */\n onRendered(): void {\n //\n }\n\n /**\n * The main render method for the Application. Called whenever an activity\n * requests an update. Renders the currently active Activity's content.\n *\n * If you override this method then any activity won't be rendered.\n *\n * @returns The Lit template to render.\n */\n render(): TemplateResult | typeof nothing {\n const currentActivity = this.#activities.getCurrentActivity()\n // Only render if started or beyond\n if (currentActivity && currentActivity.state >= ActivityState.Started) {\n return currentActivity.render()\n }\n return nothing\n }\n\n /**\n * Handles activity update requests and re-renders the application.\n */\n private handleActivityUpdate(e: CustomEvent<UpdateRequest | undefined>): void {\n this.requestUpdate(e.detail || undefined)\n }\n\n /**\n * Requests an update of the application UI. This will call the `render()` method\n * and update the DOM.\n */\n requestUpdate(opts: UpdateRequest = {}): void {\n const { app = true } = opts\n if (app) {\n this.#renderer.requestUpdate()\n }\n }\n\n /**\n * Starts the application by calling onStart and performing an initial render.\n */\n public async run(): Promise<void> {\n await this.onStart()\n this.requestUpdate()\n }\n\n /**\n * Stops the application, performing cleanup if necessary.\n */\n public async stop(): Promise<void> {\n this.#events.removeEventListener('activity:update', this.activityUpdateListener as EventListener)\n // Allow subclasses to clean up\n await this.onStop()\n // ... any other application-level cleanup\n }\n\n getCurrentActivity(): Activity | undefined {\n return this.#activities.getCurrentActivity()\n }\n\n /**\n * Unifies Fragment and Application interfaces.\n * @returns `this`\n */\n getApplication() {\n return this\n }\n\n findActiveActivity(id: string): Activity | undefined {\n return this.#activities.findActiveActivity(id)\n }\n}\n"]}
|
|
@@ -40,6 +40,12 @@ export declare class Fragment extends EventTarget {
|
|
|
40
40
|
pendingActivityResult: Map<number, PendingActivityResult>;
|
|
41
41
|
get renderer(): FragmentRenderer;
|
|
42
42
|
constructor(options?: FragmentOptions);
|
|
43
|
+
/**
|
|
44
|
+
* When implemented, this method returns the class name to be used as a root class for the fragment.
|
|
45
|
+
* This class name can be used to apply styles or identify the fragment in the DOM.
|
|
46
|
+
* @returns The class name to be used as a root class for the fragment.
|
|
47
|
+
*/
|
|
48
|
+
rootClass(): string | undefined;
|
|
43
49
|
/**
|
|
44
50
|
* @see {@link ./Renderer.js}
|
|
45
51
|
*/
|
|
@@ -112,12 +118,12 @@ export declare class Fragment extends EventTarget {
|
|
|
112
118
|
* @param key The name of the fragment.
|
|
113
119
|
* @param fragment The fragment to add.
|
|
114
120
|
*/
|
|
115
|
-
addChild(key: string, fragment: Fragment, data?: unknown): void
|
|
121
|
+
addChild(key: string, fragment: Fragment, data?: unknown): Promise<void>;
|
|
116
122
|
/**
|
|
117
123
|
* Removes a fragment from this fragment.
|
|
118
124
|
* @param key The name of the fragment to remove.
|
|
119
125
|
*/
|
|
120
|
-
removeChild(key: string): void
|
|
126
|
+
removeChild(key: string): Promise<void>;
|
|
121
127
|
/**
|
|
122
128
|
* A helper to request an update.
|
|
123
129
|
* Application or parent Fragment will handle rendering.
|
|
@@ -144,7 +150,7 @@ export declare class Fragment extends EventTarget {
|
|
|
144
150
|
* @param intent The intent that was used to start the activity.
|
|
145
151
|
*/
|
|
146
152
|
onActivityResult(requestCode: number, resultCode: IntentResult, intent: Intent): Promise<void>;
|
|
147
|
-
|
|
153
|
+
hasRequestCode(requestCode: number): boolean;
|
|
148
154
|
/**
|
|
149
155
|
* A handler for the intent event dispatched by web components hosted by this fragment.
|
|
150
156
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Fragment.d.ts","sourceRoot":"","sources":["../../../src/core/Fragment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,KAAK,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,KAAK,eAAe,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC3F,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACjE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAE3D,OAAO,KAAK,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAA;AAGzF,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CACrD;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,QAAS,SAAQ,WAAW;;IAChC,KAAK,EAAE,aAAa,CAA4B;IAChD,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAA;IACnC,SAAS,CAAC,QAAQ,wBAA8B;IAChD,SAAS,CAAC,eAAe,EAAE,eAAe,CAAA;IAE1C;;OAEG;IACH,WAAW,SAAK;IAEhB;;;;;;OAMG;IACH,qBAAqB,EAAE,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAA2C;IAIpG,IAAI,QAAQ,IAAI,gBAAgB,CAE/B;gBAEW,OAAO,CAAC,EAAE,eAAe;IAOrC;;OAEG;IACI,aAAa,CAAC,UAAU,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI;IAI5D,MAAM,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3C;;;;;;OAMG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C;;OAEG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C;;OAEG;IACH,OAAO,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/B;;OAEG;IACH,QAAQ,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhC;;OAEG;IACH,OAAO,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/B;;OAEG;IACH,MAAM,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9B;;OAEG;IACH,QAAQ,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhC;;OAEG;IACH,SAAS,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"Fragment.d.ts","sourceRoot":"","sources":["../../../src/core/Fragment.ts"],"names":[],"mappings":"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"}
|
|
@@ -53,6 +53,14 @@ let Fragment = (() => {
|
|
|
53
53
|
this.fragmentManager = new FragmentManager(this);
|
|
54
54
|
this.#renderer = new FragmentRenderer(this);
|
|
55
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* When implemented, this method returns the class name to be used as a root class for the fragment.
|
|
58
|
+
* This class name can be used to apply styles or identify the fragment in the DOM.
|
|
59
|
+
* @returns The class name to be used as a root class for the fragment.
|
|
60
|
+
*/
|
|
61
|
+
rootClass() {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
56
64
|
/**
|
|
57
65
|
* @see {@link ./Renderer.js}
|
|
58
66
|
*/
|
|
@@ -113,6 +121,7 @@ let Fragment = (() => {
|
|
|
113
121
|
*/
|
|
114
122
|
onDestroy() {
|
|
115
123
|
this.dispatchEvent(new CustomEvent('fragment:destroy', { detail: null }));
|
|
124
|
+
this.fragmentManager.onDestroy();
|
|
116
125
|
}
|
|
117
126
|
/**
|
|
118
127
|
* Called by the renderer when the fragment is rendered for the first time.
|
|
@@ -163,18 +172,18 @@ let Fragment = (() => {
|
|
|
163
172
|
* @param key The name of the fragment.
|
|
164
173
|
* @param fragment The fragment to add.
|
|
165
174
|
*/
|
|
166
|
-
addChild(key, fragment, data) {
|
|
175
|
+
async addChild(key, fragment, data) {
|
|
167
176
|
this.children.set(key, fragment);
|
|
168
|
-
this.fragmentManager.attachFragment(key, fragment, this, data);
|
|
177
|
+
await this.fragmentManager.attachFragment(key, fragment, this, data);
|
|
169
178
|
}
|
|
170
179
|
/**
|
|
171
180
|
* Removes a fragment from this fragment.
|
|
172
181
|
* @param key The name of the fragment to remove.
|
|
173
182
|
*/
|
|
174
|
-
removeChild(key) {
|
|
183
|
+
async removeChild(key) {
|
|
175
184
|
const child = this.children.get(key);
|
|
176
185
|
if (child) {
|
|
177
|
-
this.fragmentManager.detachFragment(key);
|
|
186
|
+
await this.fragmentManager.detachFragment(key);
|
|
178
187
|
this.children.delete(key);
|
|
179
188
|
}
|
|
180
189
|
}
|
|
@@ -235,7 +244,7 @@ let Fragment = (() => {
|
|
|
235
244
|
return;
|
|
236
245
|
}
|
|
237
246
|
for (const fragment of children.values()) {
|
|
238
|
-
if (fragment.
|
|
247
|
+
if (fragment.hasRequestCode(requestCode)) {
|
|
239
248
|
fragment.onActivityResult(requestCode, resultCode, intent);
|
|
240
249
|
return;
|
|
241
250
|
}
|
|
@@ -246,9 +255,9 @@ let Fragment = (() => {
|
|
|
246
255
|
console.info('Fragment#onActivityResult() not implemented', requestCode, resultCode, intent);
|
|
247
256
|
}
|
|
248
257
|
}
|
|
249
|
-
|
|
258
|
+
hasRequestCode(requestCode) {
|
|
250
259
|
for (const fragment of this.children.values()) {
|
|
251
|
-
if (fragment.
|
|
260
|
+
if (fragment.hasRequestCode(requestCode)) {
|
|
252
261
|
return true;
|
|
253
262
|
}
|
|
254
263
|
}
|
|
@@ -283,7 +292,7 @@ let Fragment = (() => {
|
|
|
283
292
|
});
|
|
284
293
|
}
|
|
285
294
|
else if (event.type === EventTypes.Intent.startActivity) {
|
|
286
|
-
activity.startActivity(event.detail.intent);
|
|
295
|
+
await activity.startActivity(event.detail.intent);
|
|
287
296
|
}
|
|
288
297
|
else {
|
|
289
298
|
throw new Error(`Unrecognized intent event: ${event.type}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Fragment.js","sourceRoot":"","sources":["../../../src/core/Fragment.ts"],"names":[],"mappings":"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","sourcesContent":["import { nothing, TemplateResult } from 'lit'\nimport { Activity } from './Activity.js'\nimport { FragmentState, type FragmentOptions, FragmentManager } from './FragmentManager.js'\nimport type { Application, UpdateRequest } from './Application.js'\nimport { FragmentRenderer } from './renderer/FragmentRenderer.js'\nimport { Intent, IntentResult } from './ActivityManager.js'\nimport { bound } from '../decorators/bound.js'\nimport type { ActivityDetail, ActivityWithResultDetail } from '../events/IntentEvents.js'\nimport { EventTypes } from '../events/EventTypes.js'\n\nexport interface PendingActivityResult {\n onResult(result: IntentResult, intent: Intent): void\n}\n\n/**\n * Similar to Activity, with lifecycle methods (onCreate, onAttach, onDetach, etc.).\n * The crucial difference is that a Fragment is always hosted by an `Activity` or\n * another `Fragment`.\n *\n * A `Fragment` represents a reusable portion of the app's UI.\n * A fragment defines and manages its own layout, has its own lifecycle,\n * and can handle its own input events.\n * Fragments can't live on their own. They must be hosted by an activity or another\n * fragment. The fragment’s view hierarchy becomes part of, or attaches to,\n * the host’s view hierarchy.\n */\nexport class Fragment extends EventTarget {\n public state: FragmentState = FragmentState.Initialized\n public parent?: Activity | Fragment\n protected children = new Map<string, Fragment>()\n protected fragmentManager: FragmentManager\n\n /**\n * The request code used to start an activity for a result.\n */\n requestCode = -1\n\n /**\n * A list of pending activity results that were requested by the components\n * hosted in this fragment.\n * The key is the request code and the value contains the callback\n * that will be called when the activity result is received.\n * The callback is called with the result code and the resulting intent.\n */\n pendingActivityResult: Map<number, PendingActivityResult> = new Map<number, PendingActivityResult>()\n\n #renderer: FragmentRenderer\n\n get renderer(): FragmentRenderer {\n return this.#renderer\n }\n\n constructor(options?: FragmentOptions) {\n super()\n this.parent = options?.parent\n this.fragmentManager = new FragmentManager(this)\n this.#renderer = new FragmentRenderer(this)\n }\n\n /**\n * @see {@link ./Renderer.js}\n */\n public setRenderRoot(renderRoot: HTMLElement | string): void {\n this.#renderer.setRenderRoot(renderRoot)\n }\n\n onData(data: unknown): void | Promise<void> {\n this.dispatchEvent(new CustomEvent('fragment:data', { detail: data }))\n }\n\n /**\n * Called once when the fragment is created.\n *\n * In the `onCreate()` method, perform basic fragment startup logic that happens only once\n * for the entire life of the fragment.\n * @param data Optional init data.\n */\n onCreate(data?: unknown): void | Promise<void> {\n this.dispatchEvent(new CustomEvent('fragment:create', { detail: data }))\n }\n\n /**\n * Called when the fragment is attached to a parent\n */\n onAttach(data?: unknown): void | Promise<void> {\n this.dispatchEvent(new CustomEvent('fragment:attach', { detail: data }))\n }\n\n /**\n * Called when the fragment becomes visible.\n */\n onStart(): void | Promise<void> {\n this.dispatchEvent(new CustomEvent('fragment:start', { detail: null }))\n }\n\n /**\n * Called when the fragment gains focus.\n */\n onResume(): void | Promise<void> {\n this.dispatchEvent(new CustomEvent('fragment:resume', { detail: null }))\n }\n\n /**\n * Called when the fragment loses focus.\n */\n onPause(): void | Promise<void> {\n this.dispatchEvent(new CustomEvent('fragment:pause', { detail: null }))\n }\n\n /**\n * Called when the fragment is no longer visible.\n */\n onStop(): void | Promise<void> {\n this.dispatchEvent(new CustomEvent('fragment:stop', { detail: null }))\n }\n\n /**\n * Called when the fragment is detached from a parent\n */\n onDetach(): void | Promise<void> {\n this.dispatchEvent(new CustomEvent('fragment:detach', { detail: null }))\n }\n\n /**\n * Called before the fragment is destroyed.\n */\n onDestroy(): void | Promise<void> {\n this.dispatchEvent(new CustomEvent('fragment:destroy', { detail: null }))\n }\n\n /**\n * Called by the renderer when the fragment is rendered for the first time.\n */\n onFirstRender(): void {\n //\n }\n\n /**\n * A function called when it should render the view.\n * By default it renders a fragment view if the fragment hosts other fragments and only one is visible.\n */\n render(): TemplateResult | typeof nothing {\n const fragment = this.getSingleVisibleFragment()\n if (fragment) {\n // we can manage the default rendering.\n // we make an assumption that by default only one fragment is rendered,\n // otherwise the parent activity or fragment would have to setup render roots.\n return fragment.render()\n }\n return nothing\n }\n\n /**\n * Checks whether there's only one `Fragment` that is in the `Resumed` state\n * and returns it. It returns `null` if there is no `Fragment`s or more than a single\n * visible `Fragment`.\n * @returns A Fragment that is the only fragment that should be visible.\n */\n getSingleVisibleFragment(): Fragment | null {\n const fragments = this.getVisibleFragments()\n return fragments.length === 1 ? fragments[0] : null\n }\n\n /**\n * Checks whether this fragment is a host for other fragments.\n * @returns `true` when this fragment hosts other fragments.\n */\n isRenderingFragments(): boolean {\n return this.children.size > 0\n }\n\n /**\n * @returns The list of all fragments that are in the Resumed state.\n */\n getVisibleFragments(): Fragment[] {\n return this.fragmentManager.getVisible()\n }\n\n /**\n * Adds a child fragment to this fragment.\n * The FragmentManager will handle lifecycle.\n * @param key The name of the fragment.\n * @param fragment The fragment to add.\n */\n addChild(key: string, fragment: Fragment, data?: unknown): void {\n this.children.set(key, fragment)\n this.fragmentManager.attachFragment(key, fragment, this, data)\n }\n\n /**\n * Removes a fragment from this fragment.\n * @param key The name of the fragment to remove.\n */\n removeChild(key: string): void {\n const child = this.children.get(key)\n if (child) {\n this.fragmentManager.detachFragment(key)\n this.children.delete(key)\n }\n }\n\n /**\n * A helper to request an update.\n * Application or parent Fragment will handle rendering.\n */\n requestUpdate(opts: UpdateRequest = {}): void {\n const { fragment = true } = opts\n if (fragment) {\n this.#renderer.requestUpdate()\n }\n this.parent?.requestUpdate(opts)\n // If no parent, do nothing (or maybe throw an error?)\n }\n\n getApplication(): Application | undefined {\n return this.parent?.getApplication()\n }\n\n getActivity(): Activity | undefined {\n return this.parent?.getActivity()\n }\n\n /**\n * Starts an activity for result.\n * @param intent The intent to start.\n */\n async startActivityForResult(intent: Intent): Promise<void> {\n const activity = this.getActivity()\n if (!activity) {\n throw new Error(`The fragment has no activity. Unable to start an intent.`)\n }\n this.requestCode = await activity.startActivityForResult(intent)\n }\n\n /**\n * Starts another activity.\n * @param intent The intent to start.\n */\n async startActivity(intent: Intent): Promise<void> {\n const activity = this.getActivity()\n if (!activity) {\n throw new Error(`The fragment has no activity. Unable to start an intent.`)\n }\n await activity.startActivity(intent)\n }\n\n /**\n * The callback method that is triggered when another activity that was\n * started for result finishes.\n *\n * @param requestCode The request code that was used to start the activity.\n * @param data The data that was passed back.\n * @param intent The intent that was used to start the activity.\n */\n async onActivityResult(requestCode: number, resultCode: IntentResult, intent: Intent): Promise<void> {\n const { pendingActivityResult, children } = this\n if (pendingActivityResult.has(requestCode)) {\n const { onResult } = pendingActivityResult.get(requestCode) as PendingActivityResult\n pendingActivityResult.delete(requestCode)\n onResult(resultCode, intent)\n return\n }\n for (const fragment of children.values()) {\n if (fragment.hasRequstCode(requestCode)) {\n fragment.onActivityResult(requestCode, resultCode, intent)\n return\n }\n }\n this.requestCode = -1\n if (this.constructor === Fragment) {\n // eslint-disable-next-line no-console\n console.info('Fragment#onActivityResult() not implemented', requestCode, resultCode, intent)\n }\n }\n\n hasRequstCode(requestCode: number): boolean {\n for (const fragment of this.children.values()) {\n if (fragment.hasRequstCode(requestCode)) {\n return true\n }\n }\n return this.requestCode === requestCode\n }\n\n /**\n * A handler for the intent event dispatched by web components hosted by this fragment.\n *\n * **Usage example:**\n *\n * ```ts\n * <custom-element @startactivity=\"${this.handleIntentEvent}\"></custom-element>\n * <custom-element @startactivityforresult=\"${this.handleIntentEvent}\"></custom-element>\n * ```\n *\n * @param event The event that was dispatched.\n * @returns A promise that resolves when the intent is handled.\n * @throws An error if the fragment has no activity.\n * @throws An error if the event type is not recognized.\n */\n @bound\n async handleIntentEvent(event: CustomEvent<ActivityDetail | ActivityWithResultDetail>): Promise<void> {\n const activity = this.getActivity()\n if (!activity) {\n throw new Error(`The fragment has no activity. Unable to start an intent.`)\n }\n if (event.type === EventTypes.Intent.startActivityForResult) {\n const info = event.detail as ActivityWithResultDetail\n const code = await activity.startActivityForResult(info.intent)\n this.requestCode = code\n this.pendingActivityResult.set(code, {\n onResult: info.onResult,\n })\n } else if (event.type === EventTypes.Intent.startActivity) {\n activity.startActivity(event.detail.intent)\n } else {\n throw new Error(`Unrecognized intent event: ${event.type}`)\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Fragment.js","sourceRoot":"","sources":["../../../src/core/Fragment.ts"],"names":[],"mappings":"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","sourcesContent":["import { nothing, TemplateResult } from 'lit'\nimport { Activity } from './Activity.js'\nimport { FragmentState, type FragmentOptions, FragmentManager } from './FragmentManager.js'\nimport type { Application, UpdateRequest } from './Application.js'\nimport { FragmentRenderer } from './renderer/FragmentRenderer.js'\nimport { Intent, IntentResult } from './ActivityManager.js'\nimport { bound } from '../decorators/bound.js'\nimport type { ActivityDetail, ActivityWithResultDetail } from '../events/IntentEvents.js'\nimport { EventTypes } from '../events/EventTypes.js'\n\nexport interface PendingActivityResult {\n onResult(result: IntentResult, intent: Intent): void\n}\n\n/**\n * Similar to Activity, with lifecycle methods (onCreate, onAttach, onDetach, etc.).\n * The crucial difference is that a Fragment is always hosted by an `Activity` or\n * another `Fragment`.\n *\n * A `Fragment` represents a reusable portion of the app's UI.\n * A fragment defines and manages its own layout, has its own lifecycle,\n * and can handle its own input events.\n * Fragments can't live on their own. They must be hosted by an activity or another\n * fragment. The fragment’s view hierarchy becomes part of, or attaches to,\n * the host’s view hierarchy.\n */\nexport class Fragment extends EventTarget {\n public state: FragmentState = FragmentState.Initialized\n public parent?: Activity | Fragment\n protected children = new Map<string, Fragment>()\n protected fragmentManager: FragmentManager\n\n /**\n * The request code used to start an activity for a result.\n */\n requestCode = -1\n\n /**\n * A list of pending activity results that were requested by the components\n * hosted in this fragment.\n * The key is the request code and the value contains the callback\n * that will be called when the activity result is received.\n * The callback is called with the result code and the resulting intent.\n */\n pendingActivityResult: Map<number, PendingActivityResult> = new Map<number, PendingActivityResult>()\n\n #renderer: FragmentRenderer\n\n get renderer(): FragmentRenderer {\n return this.#renderer\n }\n\n constructor(options?: FragmentOptions) {\n super()\n this.parent = options?.parent\n this.fragmentManager = new FragmentManager(this)\n this.#renderer = new FragmentRenderer(this)\n }\n\n /**\n * When implemented, this method returns the class name to be used as a root class for the fragment.\n * This class name can be used to apply styles or identify the fragment in the DOM.\n * @returns The class name to be used as a root class for the fragment.\n */\n public rootClass(): string | undefined {\n return undefined\n }\n\n /**\n * @see {@link ./Renderer.js}\n */\n public setRenderRoot(renderRoot: HTMLElement | string): void {\n this.#renderer.setRenderRoot(renderRoot)\n }\n\n onData(data: unknown): void | Promise<void> {\n this.dispatchEvent(new CustomEvent('fragment:data', { detail: data }))\n }\n\n /**\n * Called once when the fragment is created.\n *\n * In the `onCreate()` method, perform basic fragment startup logic that happens only once\n * for the entire life of the fragment.\n * @param data Optional init data.\n */\n onCreate(data?: unknown): void | Promise<void> {\n this.dispatchEvent(new CustomEvent('fragment:create', { detail: data }))\n }\n\n /**\n * Called when the fragment is attached to a parent\n */\n onAttach(data?: unknown): void | Promise<void> {\n this.dispatchEvent(new CustomEvent('fragment:attach', { detail: data }))\n }\n\n /**\n * Called when the fragment becomes visible.\n */\n onStart(): void | Promise<void> {\n this.dispatchEvent(new CustomEvent('fragment:start', { detail: null }))\n }\n\n /**\n * Called when the fragment gains focus.\n */\n onResume(): void | Promise<void> {\n this.dispatchEvent(new CustomEvent('fragment:resume', { detail: null }))\n }\n\n /**\n * Called when the fragment loses focus.\n */\n onPause(): void | Promise<void> {\n this.dispatchEvent(new CustomEvent('fragment:pause', { detail: null }))\n }\n\n /**\n * Called when the fragment is no longer visible.\n */\n onStop(): void | Promise<void> {\n this.dispatchEvent(new CustomEvent('fragment:stop', { detail: null }))\n }\n\n /**\n * Called when the fragment is detached from a parent\n */\n onDetach(): void | Promise<void> {\n this.dispatchEvent(new CustomEvent('fragment:detach', { detail: null }))\n }\n\n /**\n * Called before the fragment is destroyed.\n */\n onDestroy(): void | Promise<void> {\n this.dispatchEvent(new CustomEvent('fragment:destroy', { detail: null }))\n this.fragmentManager.onDestroy()\n }\n\n /**\n * Called by the renderer when the fragment is rendered for the first time.\n */\n onFirstRender(): void {\n //\n }\n\n /**\n * A function called when it should render the view.\n * By default it renders a fragment view if the fragment hosts other fragments and only one is visible.\n */\n render(): TemplateResult | typeof nothing {\n const fragment = this.getSingleVisibleFragment()\n if (fragment) {\n // we can manage the default rendering.\n // we make an assumption that by default only one fragment is rendered,\n // otherwise the parent activity or fragment would have to setup render roots.\n return fragment.render()\n }\n return nothing\n }\n\n /**\n * Checks whether there's only one `Fragment` that is in the `Resumed` state\n * and returns it. It returns `null` if there is no `Fragment`s or more than a single\n * visible `Fragment`.\n * @returns A Fragment that is the only fragment that should be visible.\n */\n getSingleVisibleFragment(): Fragment | null {\n const fragments = this.getVisibleFragments()\n return fragments.length === 1 ? fragments[0] : null\n }\n\n /**\n * Checks whether this fragment is a host for other fragments.\n * @returns `true` when this fragment hosts other fragments.\n */\n isRenderingFragments(): boolean {\n return this.children.size > 0\n }\n\n /**\n * @returns The list of all fragments that are in the Resumed state.\n */\n getVisibleFragments(): Fragment[] {\n return this.fragmentManager.getVisible()\n }\n\n /**\n * Adds a child fragment to this fragment.\n * The FragmentManager will handle lifecycle.\n * @param key The name of the fragment.\n * @param fragment The fragment to add.\n */\n async addChild(key: string, fragment: Fragment, data?: unknown): Promise<void> {\n this.children.set(key, fragment)\n await this.fragmentManager.attachFragment(key, fragment, this, data)\n }\n\n /**\n * Removes a fragment from this fragment.\n * @param key The name of the fragment to remove.\n */\n async removeChild(key: string): Promise<void> {\n const child = this.children.get(key)\n if (child) {\n await this.fragmentManager.detachFragment(key)\n this.children.delete(key)\n }\n }\n\n /**\n * A helper to request an update.\n * Application or parent Fragment will handle rendering.\n */\n requestUpdate(opts: UpdateRequest = {}): void {\n const { fragment = true } = opts\n if (fragment) {\n this.#renderer.requestUpdate()\n }\n this.parent?.requestUpdate(opts)\n // If no parent, do nothing (or maybe throw an error?)\n }\n\n getApplication(): Application | undefined {\n return this.parent?.getApplication()\n }\n\n getActivity(): Activity | undefined {\n return this.parent?.getActivity()\n }\n\n /**\n * Starts an activity for result.\n * @param intent The intent to start.\n */\n async startActivityForResult(intent: Intent): Promise<void> {\n const activity = this.getActivity()\n if (!activity) {\n throw new Error(`The fragment has no activity. Unable to start an intent.`)\n }\n this.requestCode = await activity.startActivityForResult(intent)\n }\n\n /**\n * Starts another activity.\n * @param intent The intent to start.\n */\n async startActivity(intent: Intent): Promise<void> {\n const activity = this.getActivity()\n if (!activity) {\n throw new Error(`The fragment has no activity. Unable to start an intent.`)\n }\n await activity.startActivity(intent)\n }\n\n /**\n * The callback method that is triggered when another activity that was\n * started for result finishes.\n *\n * @param requestCode The request code that was used to start the activity.\n * @param data The data that was passed back.\n * @param intent The intent that was used to start the activity.\n */\n async onActivityResult(requestCode: number, resultCode: IntentResult, intent: Intent): Promise<void> {\n const { pendingActivityResult, children } = this\n if (pendingActivityResult.has(requestCode)) {\n const { onResult } = pendingActivityResult.get(requestCode) as PendingActivityResult\n pendingActivityResult.delete(requestCode)\n onResult(resultCode, intent)\n return\n }\n for (const fragment of children.values()) {\n if (fragment.hasRequestCode(requestCode)) {\n fragment.onActivityResult(requestCode, resultCode, intent)\n return\n }\n }\n this.requestCode = -1\n if (this.constructor === Fragment) {\n // eslint-disable-next-line no-console\n console.info('Fragment#onActivityResult() not implemented', requestCode, resultCode, intent)\n }\n }\n\n hasRequestCode(requestCode: number): boolean {\n for (const fragment of this.children.values()) {\n if (fragment.hasRequestCode(requestCode)) {\n return true\n }\n }\n return this.requestCode === requestCode\n }\n\n /**\n * A handler for the intent event dispatched by web components hosted by this fragment.\n *\n * **Usage example:**\n *\n * ```ts\n * <custom-element @startactivity=\"${this.handleIntentEvent}\"></custom-element>\n * <custom-element @startactivityforresult=\"${this.handleIntentEvent}\"></custom-element>\n * ```\n *\n * @param event The event that was dispatched.\n * @returns A promise that resolves when the intent is handled.\n * @throws An error if the fragment has no activity.\n * @throws An error if the event type is not recognized.\n */\n @bound\n async handleIntentEvent(event: CustomEvent<ActivityDetail | ActivityWithResultDetail>): Promise<void> {\n const activity = this.getActivity()\n if (!activity) {\n throw new Error(`The fragment has no activity. Unable to start an intent.`)\n }\n if (event.type === EventTypes.Intent.startActivityForResult) {\n const info = event.detail as ActivityWithResultDetail\n const code = await activity.startActivityForResult(info.intent)\n this.requestCode = code\n this.pendingActivityResult.set(code, {\n onResult: info.onResult,\n })\n } else if (event.type === EventTypes.Intent.startActivity) {\n await activity.startActivity(event.detail.intent)\n } else {\n throw new Error(`Unrecognized intent event: ${event.type}`)\n }\n }\n}\n"]}
|
|
@@ -30,6 +30,7 @@ export declare class FragmentManager {
|
|
|
30
30
|
*/
|
|
31
31
|
private host;
|
|
32
32
|
constructor(host: Activity | Fragment);
|
|
33
|
+
onDestroy(): Promise<void>;
|
|
33
34
|
/**
|
|
34
35
|
* Attaches a fragment to a parent Activity or Fragment
|
|
35
36
|
*
|
|
@@ -51,6 +52,22 @@ export declare class FragmentManager {
|
|
|
51
52
|
* @param renderTarget Optional render target, if any.
|
|
52
53
|
*/
|
|
53
54
|
showFragment(key: string, renderTarget?: HTMLElement): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* Sets styles for a fragment by adding a class to the root element.
|
|
57
|
+
* This is useful for applying specific styles to fragments.
|
|
58
|
+
*
|
|
59
|
+
* The root element is either fragment's render root or the document element.
|
|
60
|
+
* @param fragment The fragment to set styles for.
|
|
61
|
+
*/
|
|
62
|
+
setFragmentStyles(fragment: Fragment): void;
|
|
63
|
+
/**
|
|
64
|
+
* Removes styles for a fragment by removing a class from the root element.
|
|
65
|
+
* This is useful for cleaning up styles when a fragment is no longer visible.
|
|
66
|
+
*
|
|
67
|
+
* The root element is either fragment's render root or the document element.
|
|
68
|
+
* @param fragment The fragment to remove styles for.
|
|
69
|
+
*/
|
|
70
|
+
removeFragmentStyles(fragment: Fragment): void;
|
|
54
71
|
/**
|
|
55
72
|
* Lists all visible fragments, that is in the fragments with the `FragmentState.Resumed` state.
|
|
56
73
|
* @returns The list of visible fragments
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FragmentManager.d.ts","sourceRoot":"","sources":["../../../src/core/FragmentManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,OAAO,EAAE,MAAM,KAAK,CAAA;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAE7C,oBAAY,aAAa;IACvB,WAAW,IAAA;IACX,OAAO,IAAA;IACP,QAAQ,IAAA,CAAE,mCAAmC;IAC7C,OAAO,IAAA,CAAE,UAAU;IACnB,OAAO,IAAA,CAAE,YAAY;IACrB,MAAM,IAAA;IACN,OAAO,IAAA,CAAE,oBAAoB;IAC7B,QAAQ,IAAA,CAAE,uCAAuC;IACjD,SAAS,IAAA;CACV;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAA;CAC7B;AAED;;;;GAIG;AACH,qBAAa,eAAe;IAC1B;;OAEG;IACH,OAAO,CAAC,SAAS,CAA8B;IAC/C;;OAEG;IACH,OAAO,CAAC,IAAI,CAAqB;gBAErB,IAAI,EAAE,QAAQ,GAAG,QAAQ;
|
|
1
|
+
{"version":3,"file":"FragmentManager.d.ts","sourceRoot":"","sources":["../../../src/core/FragmentManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,OAAO,EAAE,MAAM,KAAK,CAAA;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAE7C,oBAAY,aAAa;IACvB,WAAW,IAAA;IACX,OAAO,IAAA;IACP,QAAQ,IAAA,CAAE,mCAAmC;IAC7C,OAAO,IAAA,CAAE,UAAU;IACnB,OAAO,IAAA,CAAE,YAAY;IACrB,MAAM,IAAA;IACN,OAAO,IAAA,CAAE,oBAAoB;IAC7B,QAAQ,IAAA,CAAE,uCAAuC;IACjD,SAAS,IAAA;CACV;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAA;CAC7B;AAED;;;;GAIG;AACH,qBAAa,eAAe;IAC1B;;OAEG;IACH,OAAO,CAAC,SAAS,CAA8B;IAC/C;;OAEG;IACH,OAAO,CAAC,IAAI,CAAqB;gBAErB,IAAI,EAAE,QAAQ,GAAG,QAAQ;IAI/B,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAShC;;;;;;;OAOG;IACG,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAG,QAAQ,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAWjH;;;;OAIG;IACG,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBhD;;;;OAIG;IACG,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB1E;;;;;;OAMG;IACH,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAiB3C;;;;;;OAMG;IACH,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAiB9C;;;OAGG;IACH,UAAU,IAAI,QAAQ,EAAE;IAIxB;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAUrD,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAI/C,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,OAAO,OAAO;IAQ5D,qBAAqB,IAAI,IAAI;IAQ7B;;;;OAIG;IACH,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI;CAQxD"}
|
|
@@ -28,6 +28,14 @@ export class FragmentManager {
|
|
|
28
28
|
constructor(host) {
|
|
29
29
|
this.host = host;
|
|
30
30
|
}
|
|
31
|
+
async onDestroy() {
|
|
32
|
+
// Clean up all fragments when the host is destroyed
|
|
33
|
+
for (const [key, fragment] of this.fragments) {
|
|
34
|
+
await fragment.onDestroy();
|
|
35
|
+
this.removeFragmentStyles(fragment);
|
|
36
|
+
this.fragments.delete(key);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
31
39
|
/**
|
|
32
40
|
* Attaches a fragment to a parent Activity or Fragment
|
|
33
41
|
*
|
|
@@ -89,6 +97,53 @@ export class FragmentManager {
|
|
|
89
97
|
else {
|
|
90
98
|
this.host.requestUpdate({ app: false, activity: true });
|
|
91
99
|
}
|
|
100
|
+
this.setFragmentStyles(fragment);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Sets styles for a fragment by adding a class to the root element.
|
|
104
|
+
* This is useful for applying specific styles to fragments.
|
|
105
|
+
*
|
|
106
|
+
* The root element is either fragment's render root or the document element.
|
|
107
|
+
* @param fragment The fragment to set styles for.
|
|
108
|
+
*/
|
|
109
|
+
setFragmentStyles(fragment) {
|
|
110
|
+
const root = fragment.renderer.renderRoot ?? document?.documentElement;
|
|
111
|
+
if (!root) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
const classes = [];
|
|
115
|
+
const ctor = fragment.constructor;
|
|
116
|
+
classes.push(ctor.name.toLowerCase());
|
|
117
|
+
if (typeof fragment.rootClass === 'function') {
|
|
118
|
+
const className = fragment.rootClass();
|
|
119
|
+
if (className) {
|
|
120
|
+
classes.push(className);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
root.classList.add(...classes);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Removes styles for a fragment by removing a class from the root element.
|
|
127
|
+
* This is useful for cleaning up styles when a fragment is no longer visible.
|
|
128
|
+
*
|
|
129
|
+
* The root element is either fragment's render root or the document element.
|
|
130
|
+
* @param fragment The fragment to remove styles for.
|
|
131
|
+
*/
|
|
132
|
+
removeFragmentStyles(fragment) {
|
|
133
|
+
const root = fragment.renderer.renderRoot ?? document?.documentElement;
|
|
134
|
+
if (!root) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
const classes = [];
|
|
138
|
+
const ctor = fragment.constructor;
|
|
139
|
+
classes.push(ctor.name.toLowerCase());
|
|
140
|
+
if (typeof fragment.rootClass === 'function') {
|
|
141
|
+
const className = fragment.rootClass();
|
|
142
|
+
if (className) {
|
|
143
|
+
classes.push(className);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
root.classList.remove(...classes);
|
|
92
147
|
}
|
|
93
148
|
/**
|
|
94
149
|
* Lists all visible fragments, that is in the fragments with the `FragmentState.Resumed` state.
|
|
@@ -105,6 +160,7 @@ export class FragmentManager {
|
|
|
105
160
|
fragment.state = FragmentState.Paused;
|
|
106
161
|
await fragment.onStop();
|
|
107
162
|
fragment.state = FragmentState.Stopped;
|
|
163
|
+
this.removeFragmentStyles(fragment);
|
|
108
164
|
// if necessary, you would remove its template content from the DOM
|
|
109
165
|
// however, with rendering logic encapsulated in Fragment, this isn't needed here
|
|
110
166
|
}
|
|
@@ -116,7 +172,7 @@ export class FragmentManager {
|
|
|
116
172
|
if (!fragment || fragment.state !== FragmentState.Resumed) {
|
|
117
173
|
return nothing;
|
|
118
174
|
}
|
|
119
|
-
return fragment
|
|
175
|
+
return fragment.render() || nothing;
|
|
120
176
|
}
|
|
121
177
|
updateActiveFragments() {
|
|
122
178
|
for (const [, fragment] of this.fragments) {
|
|
@@ -132,7 +188,7 @@ export class FragmentManager {
|
|
|
132
188
|
*/
|
|
133
189
|
findByRequestCode(requestCode) {
|
|
134
190
|
for (const [, fragment] of this.fragments) {
|
|
135
|
-
if (fragment.
|
|
191
|
+
if (fragment.hasRequestCode(requestCode)) {
|
|
136
192
|
return fragment;
|
|
137
193
|
}
|
|
138
194
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FragmentManager.js","sourceRoot":"","sources":["../../../src/core/FragmentManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { type TemplateResult, nothing } from 'lit'\nimport type { Activity } from './Activity.js'\nimport type { Fragment } from './Fragment.js'\n\nexport enum FragmentState {\n Initialized,\n Created,\n Attached, // Added to an Activity or Fragment\n Started, // Visible\n Resumed, // Has focus\n Paused,\n Stopped, // No longer visible\n Detached, // Removed from an Activity or Fragment\n Destroyed,\n}\n\nexport interface FragmentOptions {\n parent?: Activity | Fragment\n}\n\n/**\n * `FragmentManager` is the class responsible for performing actions\n * on the app's fragments, such as adding, removing, or replacing them\n * and adding them to the back stack.\n */\nexport class FragmentManager {\n /**\n * Stores fragments by I\n */\n private fragments = new Map<string, Fragment>()\n /**\n * The reference to the host activity or fragment.\n */\n private host: Activity | Fragment\n\n constructor(host: Activity | Fragment) {\n this.host = host\n }\n\n /**\n * Attaches a fragment to a parent Activity or Fragment\n *\n * @param fragment The fragment to add.\n * @param parent The parent fragment or activity.\n * @param renderTarget Optional DOM target to render to.\n * @param data Optional data to pass to the `onCreate()` method.\n */\n async attachFragment(key: string, fragment: Fragment, parent: Activity | Fragment, data?: unknown): Promise<void> {\n // Ensure fragment has correct parent\n fragment.parent = parent\n\n this.fragments.set(key, fragment)\n await fragment.onCreate(data)\n fragment.state = FragmentState.Created\n await fragment.onAttach(data)\n fragment.state = FragmentState.Attached\n }\n\n /**\n * Detaches a fragment from its parent.\n * @param fragment\n * @returns\n */\n async detachFragment(key: string): Promise<void> {\n const fragment = this.findFragment(key)\n if (!fragment) {\n throw new Error(`Fragment with key ${key} not found.`)\n }\n\n this.hideFragment(fragment)\n await fragment.onDetach()\n fragment.state = FragmentState.Detached\n await fragment.onDestroy()\n fragment.state = FragmentState.Destroyed\n this.fragments.delete(key)\n // Clear parent reference\n fragment.parent = undefined\n }\n\n /**\n * Shows a Fragment (calls lifecycle methods and renders)\n * @param fragment The fragment to render.\n * @param renderTarget Optional render target, if any.\n */\n async showFragment(key: string, renderTarget?: HTMLElement): Promise<void> {\n const fragment = this.findFragment(key)\n if (!fragment) {\n throw new Error(`Fragment with key ${key} not found.`)\n }\n if (fragment.state === FragmentState.Resumed) {\n return\n }\n // Tell the fragment it is now started.\n await fragment.onStart()\n fragment.state = FragmentState.Started\n await fragment.onResume()\n fragment.state = FragmentState.Resumed\n if (renderTarget) {\n fragment.setRenderRoot(renderTarget)\n fragment.requestUpdate({ app: false, activity: false })\n } else {\n this.host.requestUpdate({ app: false, activity: true })\n }\n }\n\n /**\n * Lists all visible fragments, that is in the fragments with the `FragmentState.Resumed` state.\n * @returns The list of visible fragments\n */\n getVisible(): Fragment[] {\n return Array.from(this.fragments.values()).filter((fragment) => fragment.state === FragmentState.Resumed)\n }\n\n /**\n * Hides a Fragment (calls lifecycle methods and removes from DOM if necessary)\n */\n async hideFragment(fragment: Fragment): Promise<void> {\n await fragment.onPause()\n fragment.state = FragmentState.Paused\n await fragment.onStop()\n fragment.state = FragmentState.Stopped\n\n // if necessary, you would remove its template content from the DOM\n // however, with rendering logic encapsulated in Fragment, this isn't needed here\n }\n\n findFragment(key: string): Fragment | undefined {\n return this.fragments.get(key)\n }\n\n renderFragment(key: string): TemplateResult | typeof nothing {\n const fragment = this.findFragment(key)\n if (!fragment || fragment.state !== FragmentState.Resumed) {\n return nothing\n }\n return fragment?.render() || nothing\n }\n\n updateActiveFragments(): void {\n for (const [, fragment] of this.fragments) {\n if ([FragmentState.Started, FragmentState.Resumed].includes(fragment.state)) {\n fragment.requestUpdate({ app: false, activity: false })\n }\n }\n }\n\n /**\n * Finds a fragment by activity request code.\n * @param requestCode The request code to find the fragment by.\n * @returns The corresponding fragment or `null`.\n */\n findByRequestCode(requestCode: number): Fragment | null {\n for (const [, fragment] of this.fragments) {\n if (fragment.hasRequstCode(requestCode)) {\n return fragment\n }\n }\n return null\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"FragmentManager.js","sourceRoot":"","sources":["../../../src/core/FragmentManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { type TemplateResult, nothing } from 'lit'\nimport type { Activity } from './Activity.js'\nimport type { Fragment } from './Fragment.js'\n\nexport enum FragmentState {\n Initialized,\n Created,\n Attached, // Added to an Activity or Fragment\n Started, // Visible\n Resumed, // Has focus\n Paused,\n Stopped, // No longer visible\n Detached, // Removed from an Activity or Fragment\n Destroyed,\n}\n\nexport interface FragmentOptions {\n parent?: Activity | Fragment\n}\n\n/**\n * `FragmentManager` is the class responsible for performing actions\n * on the app's fragments, such as adding, removing, or replacing them\n * and adding them to the back stack.\n */\nexport class FragmentManager {\n /**\n * Stores fragments by I\n */\n private fragments = new Map<string, Fragment>()\n /**\n * The reference to the host activity or fragment.\n */\n private host: Activity | Fragment\n\n constructor(host: Activity | Fragment) {\n this.host = host\n }\n\n async onDestroy(): Promise<void> {\n // Clean up all fragments when the host is destroyed\n for (const [key, fragment] of this.fragments) {\n await fragment.onDestroy()\n this.removeFragmentStyles(fragment)\n this.fragments.delete(key)\n }\n }\n\n /**\n * Attaches a fragment to a parent Activity or Fragment\n *\n * @param fragment The fragment to add.\n * @param parent The parent fragment or activity.\n * @param renderTarget Optional DOM target to render to.\n * @param data Optional data to pass to the `onCreate()` method.\n */\n async attachFragment(key: string, fragment: Fragment, parent: Activity | Fragment, data?: unknown): Promise<void> {\n // Ensure fragment has correct parent\n fragment.parent = parent\n\n this.fragments.set(key, fragment)\n await fragment.onCreate(data)\n fragment.state = FragmentState.Created\n await fragment.onAttach(data)\n fragment.state = FragmentState.Attached\n }\n\n /**\n * Detaches a fragment from its parent.\n * @param fragment\n * @returns\n */\n async detachFragment(key: string): Promise<void> {\n const fragment = this.findFragment(key)\n if (!fragment) {\n throw new Error(`Fragment with key ${key} not found.`)\n }\n\n this.hideFragment(fragment)\n await fragment.onDetach()\n fragment.state = FragmentState.Detached\n await fragment.onDestroy()\n fragment.state = FragmentState.Destroyed\n this.fragments.delete(key)\n // Clear parent reference\n fragment.parent = undefined\n }\n\n /**\n * Shows a Fragment (calls lifecycle methods and renders)\n * @param fragment The fragment to render.\n * @param renderTarget Optional render target, if any.\n */\n async showFragment(key: string, renderTarget?: HTMLElement): Promise<void> {\n const fragment = this.findFragment(key)\n if (!fragment) {\n throw new Error(`Fragment with key ${key} not found.`)\n }\n if (fragment.state === FragmentState.Resumed) {\n return\n }\n // Tell the fragment it is now started.\n await fragment.onStart()\n fragment.state = FragmentState.Started\n await fragment.onResume()\n fragment.state = FragmentState.Resumed\n if (renderTarget) {\n fragment.setRenderRoot(renderTarget)\n fragment.requestUpdate({ app: false, activity: false })\n } else {\n this.host.requestUpdate({ app: false, activity: true })\n }\n this.setFragmentStyles(fragment)\n }\n\n /**\n * Sets styles for a fragment by adding a class to the root element.\n * This is useful for applying specific styles to fragments.\n *\n * The root element is either fragment's render root or the document element.\n * @param fragment The fragment to set styles for.\n */\n setFragmentStyles(fragment: Fragment): void {\n const root = fragment.renderer.renderRoot ?? document?.documentElement\n if (!root) {\n return\n }\n const classes: string[] = []\n const ctor = fragment.constructor\n classes.push(ctor.name.toLowerCase())\n if (typeof fragment.rootClass === 'function') {\n const className = fragment.rootClass()\n if (className) {\n classes.push(className)\n }\n }\n root.classList.add(...classes)\n }\n\n /**\n * Removes styles for a fragment by removing a class from the root element.\n * This is useful for cleaning up styles when a fragment is no longer visible.\n *\n * The root element is either fragment's render root or the document element.\n * @param fragment The fragment to remove styles for.\n */\n removeFragmentStyles(fragment: Fragment): void {\n const root = fragment.renderer.renderRoot ?? document?.documentElement\n if (!root) {\n return\n }\n const classes: string[] = []\n const ctor = fragment.constructor\n classes.push(ctor.name.toLowerCase())\n if (typeof fragment.rootClass === 'function') {\n const className = fragment.rootClass()\n if (className) {\n classes.push(className)\n }\n }\n root.classList.remove(...classes)\n }\n\n /**\n * Lists all visible fragments, that is in the fragments with the `FragmentState.Resumed` state.\n * @returns The list of visible fragments\n */\n getVisible(): Fragment[] {\n return Array.from(this.fragments.values()).filter((fragment) => fragment.state === FragmentState.Resumed)\n }\n\n /**\n * Hides a Fragment (calls lifecycle methods and removes from DOM if necessary)\n */\n async hideFragment(fragment: Fragment): Promise<void> {\n await fragment.onPause()\n fragment.state = FragmentState.Paused\n await fragment.onStop()\n fragment.state = FragmentState.Stopped\n this.removeFragmentStyles(fragment)\n // if necessary, you would remove its template content from the DOM\n // however, with rendering logic encapsulated in Fragment, this isn't needed here\n }\n\n findFragment(key: string): Fragment | undefined {\n return this.fragments.get(key)\n }\n\n renderFragment(key: string): TemplateResult | typeof nothing {\n const fragment = this.findFragment(key)\n if (!fragment || fragment.state !== FragmentState.Resumed) {\n return nothing\n }\n return fragment.render() || nothing\n }\n\n updateActiveFragments(): void {\n for (const [, fragment] of this.fragments) {\n if ([FragmentState.Started, FragmentState.Resumed].includes(fragment.state)) {\n fragment.requestUpdate({ app: false, activity: false })\n }\n }\n }\n\n /**\n * Finds a fragment by activity request code.\n * @param requestCode The request code to find the fragment by.\n * @returns The corresponding fragment or `null`.\n */\n findByRequestCode(requestCode: number): Fragment | null {\n for (const [, fragment] of this.fragments) {\n if (fragment.hasRequestCode(requestCode)) {\n return fragment\n }\n }\n return null\n }\n}\n"]}
|
|
@@ -8,7 +8,10 @@ export declare const renderFn: unique symbol;
|
|
|
8
8
|
*/
|
|
9
9
|
export declare abstract class Renderer {
|
|
10
10
|
#private;
|
|
11
|
-
|
|
11
|
+
/**
|
|
12
|
+
* The root element where the activity or fragment will be rendered.
|
|
13
|
+
*/
|
|
14
|
+
renderRoot: HTMLElement | null;
|
|
12
15
|
/**
|
|
13
16
|
* @type A promise resolved when the render finished.
|
|
14
17
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Renderer.d.ts","sourceRoot":"","sources":["../../../../src/core/renderer/Renderer.ts"],"names":[],"mappings":"AAAA,oBAAY,cAAc;IACxB,IAAI,IAAA;IACJ,SAAS,IAAA;CACV;AAED,eAAO,MAAM,QAAQ,eAAqB,CAAA;AAE1C;;GAEG;AACH,8BAAsB,QAAQ;;IAC5B,
|
|
1
|
+
{"version":3,"file":"Renderer.d.ts","sourceRoot":"","sources":["../../../../src/core/renderer/Renderer.ts"],"names":[],"mappings":"AAAA,oBAAY,cAAc;IACxB,IAAI,IAAA;IACJ,SAAS,IAAA;CACV;AAED,eAAO,MAAM,QAAQ,eAAqB,CAAA;AAE1C;;GAEG;AACH,8BAAsB,QAAQ;;IAC5B;;OAEG;IACH,UAAU,EAAE,WAAW,GAAG,IAAI,CAAO;IAErC;;OAEG;IACH,IAAI,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAE9C;IAED;;;OAGG;IACH,aAAa,CAAC,UAAU,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI;IAQrD;;;OAGG;IACH,aAAa,IAAI,IAAI;IAerB,SAAS,CAAC,iBAAiB,UAAQ;IAEnC;;;OAGG;IACH,IAAI,aAAa,IAAI,OAAO,CAE3B;IAsBD;;OAEG;IACH,QAAQ,CAAC,CAAC,QAAQ,CAAC,IAAI,IAAI;IAS3B,SAAS,CAAC,oBAAoB,IAAI,IAAI;CAUvC"}
|
|
@@ -8,6 +8,9 @@ export const renderFn = Symbol('renderFn');
|
|
|
8
8
|
* A class that manages rendering of the application screen.
|
|
9
9
|
*/
|
|
10
10
|
export class Renderer {
|
|
11
|
+
/**
|
|
12
|
+
* The root element where the activity or fragment will be rendered.
|
|
13
|
+
*/
|
|
11
14
|
renderRoot = null;
|
|
12
15
|
/**
|
|
13
16
|
* @type A promise resolved when the render finished.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Renderer.js","sourceRoot":"","sources":["../../../../src/core/renderer/Renderer.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,cAGX;AAHD,WAAY,cAAc;IACxB,mDAAI,CAAA;IACJ,6DAAS,CAAA;AACX,CAAC,EAHW,cAAc,KAAd,cAAc,QAGzB;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,CAAA;AAE1C;;GAEG;AACH,MAAM,OAAgB,QAAQ;
|
|
1
|
+
{"version":3,"file":"Renderer.js","sourceRoot":"","sources":["../../../../src/core/renderer/Renderer.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,cAGX;AAHD,WAAY,cAAc;IACxB,mDAAI,CAAA;IACJ,6DAAS,CAAA;AACX,CAAC,EAHW,cAAc,KAAd,cAAc,QAGzB;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,CAAA;AAE1C;;GAEG;AACH,MAAM,OAAgB,QAAQ;IAC5B;;OAEG;IACH,UAAU,GAAuB,IAAI,CAAA;IAErC;;OAEG;IACH,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,eAAe,CAAA;IAC7B,CAAC;IAED;;;OAGG;IACH,aAAa,CAAC,UAAgC;QAC5C,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;YACnC,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAc,UAAU,CAAC,CAAA;QACnE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;QAC9B,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,aAAa;QACX,IAAI,IAAI,CAAC,eAAe,KAAK,cAAc,CAAC,IAAI,EAAE,CAAC;YACjD,kCAAkC;YAClC,OAAM;QACR,CAAC;QACD,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC,SAAS,CAAA;QAC/C,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,CAAC;YACnC,IAAI,CAAC,iBAAiB,EAAE,CAAA;QAC1B,CAAC;QACD,qBAAqB,CAAC,GAAG,EAAE;YACzB,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAA;YAChB,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC,IAAI,CAAA;QAC5C,CAAC,CAAC,CAAA;IACJ,CAAC;IAES,iBAAiB,GAAG,KAAK,CAAA;IAEnC;;;OAGG;IACH,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,iBAAiB,CAAA;IAC/B,CAAC;IAED;;OAEG;IACH,eAAe,GAAG,cAAc,CAAC,IAAI,CAAA;IAErC;;OAEG;IACH,wBAAwB,GAAG,KAAK,CAAA;IAEhC;;OAEG;IACH,eAAe,CAAgB;IAE/B;;OAEG;IACH,eAAe,CAAc;IAO7B,iBAAiB;QACf,IAAI,CAAC,eAAe,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACnD,IAAI,CAAC,eAAe,GAAG,OAAO,CAAA;YAC9B,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAA;QACtC,CAAC,CAAC,CAAA;IACJ,CAAC;IAES,oBAAoB;QAC5B,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,CAAC;YACnC,OAAM;QACR,CAAC;QACD,IAAI,CAAC,wBAAwB,GAAG,KAAK,CAAA;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAA;QACrC,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,EAAE,CAAA;QACZ,CAAC;IACH,CAAC;CACF","sourcesContent":["export enum RenderingState {\n Idle,\n Rendering,\n}\n\nexport const renderFn = Symbol('renderFn')\n\n/**\n * A class that manages rendering of the application screen.\n */\nexport abstract class Renderer {\n /**\n * The root element where the activity or fragment will be rendered.\n */\n renderRoot: HTMLElement | null = null\n\n /**\n * @type A promise resolved when the render finished.\n */\n get updateComplete(): Promise<void> | undefined {\n return this.#updateComplete\n }\n\n /**\n * Sets the root element where the application will be rendered.\n * @param renderRoot The root element or its selector.\n */\n setRenderRoot(renderRoot: HTMLElement | string): void {\n if (typeof renderRoot === 'string') {\n this.renderRoot = document.querySelector<HTMLElement>(renderRoot)\n } else {\n this.renderRoot = renderRoot\n }\n }\n\n /**\n * Requests an update of the application UI. This will call the `render()` method\n * and update the DOM.\n */\n requestUpdate(): void {\n if (this.#renderingState !== RenderingState.Idle) {\n // An update is already scheduled.\n return\n }\n this.#renderingState = RenderingState.Rendering\n if (!this.#hasPendingUpdatePromise) {\n this.#setUpdatePromise()\n }\n requestAnimationFrame(() => {\n this[renderFn]()\n this.#renderingState = RenderingState.Idle\n })\n }\n\n protected firstRenderedFlag = false\n\n /**\n * Determines whether the initial render had run and the `onFirstRender()`\n * function was called.\n */\n get firstRendered(): boolean {\n return this.firstRenderedFlag\n }\n\n /**\n * A flag used to determine in which rendering state the UI is.\n */\n #renderingState = RenderingState.Idle\n\n /**\n * A flag that helps to determine whether the `updateComplete` is setup.\n */\n #hasPendingUpdatePromise = false\n\n /**\n * A hidden value for the `updateComplete` getter.\n */\n #updateComplete?: Promise<void>\n\n /**\n * The resolver to call when the update completes.\n */\n #updateResolver?: () => void;\n\n /**\n * Manages the rendering of the UI.\n */\n abstract [renderFn](): void\n\n #setUpdatePromise(): void {\n this.#updateComplete = new Promise<void>((resolve) => {\n this.#updateResolver = resolve\n this.#hasPendingUpdatePromise = true\n })\n }\n\n protected resolveUpdatePromise(): void {\n if (!this.#hasPendingUpdatePromise) {\n return\n }\n this.#hasPendingUpdatePromise = false\n const resolver = this.#updateResolver\n if (resolver) {\n resolver()\n }\n }\n}\n"]}
|
|
@@ -216,9 +216,16 @@ export declare abstract class DataTable<T extends object> extends LitElement {
|
|
|
216
216
|
/**
|
|
217
217
|
* The name of the property to sort the table by. If set, the table will
|
|
218
218
|
* automatically indicate the sortable header.
|
|
219
|
+
* @attribute
|
|
219
220
|
* @default undefined
|
|
220
221
|
*/
|
|
221
222
|
accessor sort: string | undefined;
|
|
223
|
+
/**
|
|
224
|
+
* The direction of the sort. Can be "asc" (ascending) or "desc" (descending).
|
|
225
|
+
* If `sort` is set, this property will be used to determine the sort direction.
|
|
226
|
+
* @attribute
|
|
227
|
+
* @default undefined
|
|
228
|
+
*/
|
|
222
229
|
accessor sortDirection: 'asc' | 'desc' | undefined;
|
|
223
230
|
protected lastSelectedIndex: number;
|
|
224
231
|
protected observer?: IntersectionObserver;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataTable.d.ts","sourceRoot":"","sources":["../../../../src/elements/data-table/DataTable.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,UAAU,EAAW,cAAc,EAAE,cAAc,EAAE,MAAM,KAAK,CAAA;AAK/E,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAErD,OAAO,4BAA4B,CAAA;AACnC,OAAO,4BAA4B,CAAA;AACnC,OAAO,iCAAiC,CAAA;AACxC,OAAO,sCAAsC,CAAA;AAG7C;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAA;IAChD;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAwB,SAAQ,iBAAiB;IAChE;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,GAAG,EAAE,MAAM,CAAA;IACX;;OAEG;IACH,GAAG,EAAE,MAAM,CAAA;IAEX;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,IAAI,EAAE,WAAW,CAAA;IACjB;;OAEG;IACH,GAAG,EAAE,MAAM,CAAA;IACX;;OAEG;IACH,GAAG,EAAE,MAAM,CAAA;CACZ;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiGG;AACH,8BAAsB,SAAS,CAAC,CAAC,SAAS,MAAM,CAAE,SAAQ,UAAU;IAClE;;OAEG;IACyB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAA;IAErE;;;;;;;OAOG;IACwC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAS;IAEnG;;;OAGG;IACwB,QAAQ,CAAC,aAAa,EAAE,CAAC,EAAE,CAAK;IAE3D;;;;OAIG;IACH,SAA6D,SAAS,SAAe;IAErF;;;;;;;;OAQG;IAC0B,QAAQ,CAAC,MAAM,UAAQ;IAEpD;;;;;;;OAOG;IACyC,QAAQ,CAAC,QAAQ,UAAQ;IAErE
|
|
1
|
+
{"version":3,"file":"DataTable.d.ts","sourceRoot":"","sources":["../../../../src/elements/data-table/DataTable.ts"],"names":[],"mappings":"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"}
|
|
@@ -238,6 +238,7 @@ let DataTable = (() => {
|
|
|
238
238
|
/**
|
|
239
239
|
* The name of the property to sort the table by. If set, the table will
|
|
240
240
|
* automatically indicate the sortable header.
|
|
241
|
+
* @attribute
|
|
241
242
|
* @default undefined
|
|
242
243
|
*/
|
|
243
244
|
));
|
|
@@ -255,11 +256,18 @@ let DataTable = (() => {
|
|
|
255
256
|
/**
|
|
256
257
|
* The name of the property to sort the table by. If set, the table will
|
|
257
258
|
* automatically indicate the sortable header.
|
|
259
|
+
* @attribute
|
|
258
260
|
* @default undefined
|
|
259
261
|
*/
|
|
260
262
|
get sort() { return this.#sort_accessor_storage; }
|
|
261
263
|
set sort(value) { this.#sort_accessor_storage = value; }
|
|
262
264
|
#sortDirection_accessor_storage = (__runInitializers(this, _sort_extraInitializers), __runInitializers(this, _sortDirection_initializers, void 0));
|
|
265
|
+
/**
|
|
266
|
+
* The direction of the sort. Can be "asc" (ascending) or "desc" (descending).
|
|
267
|
+
* If `sort` is set, this property will be used to determine the sort direction.
|
|
268
|
+
* @attribute
|
|
269
|
+
* @default undefined
|
|
270
|
+
*/
|
|
263
271
|
get sortDirection() { return this.#sortDirection_accessor_storage; }
|
|
264
272
|
set sortDirection(value) { this.#sortDirection_accessor_storage = value; }
|
|
265
273
|
lastSelectedIndex = (__runInitializers(this, _sortDirection_extraInitializers), -1);
|