uicore-ts 1.1.127 → 1.1.128

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.
@@ -7,6 +7,8 @@ export interface UIRootViewControllerLazyViewControllerObject<T extends typeof U
7
7
  class: T;
8
8
  shouldShow: () => (Promise<boolean> | boolean);
9
9
  isInitialized: boolean;
10
+ deleteOnUnload: boolean;
11
+ deleteInstance: () => void;
10
12
  }
11
13
  export interface UIRootViewControllerLazyViewControllersObject {
12
14
  [x: string]: UIRootViewControllerLazyViewControllerObject<typeof UIViewController>;
@@ -24,7 +26,10 @@ export declare class UIRootViewController extends UIViewController {
24
26
  _detailsViewController?: UIViewController;
25
27
  detailsViewControllers: UIRootViewControllerLazyViewControllersObject;
26
28
  constructor(view: UIView);
27
- lazyViewControllerObjectWithClass<T extends typeof UIViewController>(classObject: T, shouldShow?: () => (Promise<boolean> | boolean)): UIRootViewControllerLazyViewControllerObject<T>;
29
+ lazyViewControllerObjectWithClass<T extends typeof UIViewController>(classObject: T, options?: {
30
+ shouldShow?: () => (Promise<boolean> | boolean);
31
+ deleteOnUnload?: boolean;
32
+ }): UIRootViewControllerLazyViewControllerObject<T>;
28
33
  handleRoute(route: UIRoute): Promise<void>;
29
34
  setContentViewControllerForRoute(route: UIRoute): Promise<void>;
30
35
  setDetailsViewControllerForRoute(route: UIRoute): Promise<void>;
@@ -79,23 +79,36 @@ class UIRootViewController extends import_UIViewController.UIViewController {
79
79
  this.detailsViewControllers = {};
80
80
  this.view.addSubview(this.backgroundView);
81
81
  }
82
- lazyViewControllerObjectWithClass(classObject, shouldShow = () => import_UIObject.YES) {
82
+ lazyViewControllerObjectWithClass(classObject, options = {}) {
83
+ var _a, _b;
84
+ const shouldShow = (_a = options.shouldShow) != null ? _a : () => import_UIObject.YES;
85
+ const deleteOnUnload = (_b = options.deleteOnUnload) != null ? _b : import_UIObject.NO;
83
86
  const result = {
84
87
  class: classObject,
85
88
  instance: import_UIObject.nil,
86
89
  shouldShow,
87
- isInitialized: import_UIObject.NO
88
- };
89
- import_UIObject.UIObject.configureWithObject(result, {
90
- instance: (0, import_UIObject.LAZY_VALUE)(
91
- () => {
92
- result.isInitialized = import_UIObject.YES;
93
- return new classObject(
94
- new import_UIView.UIView(classObject.name.replace("ViewController", "View"))
95
- );
90
+ isInitialized: import_UIObject.NO,
91
+ deleteOnUnload,
92
+ deleteInstance: () => {
93
+ if (result.isInitialized) {
94
+ result.isInitialized = import_UIObject.NO;
95
+ initializeLazyInstance();
96
96
  }
97
- )
98
- });
97
+ }
98
+ };
99
+ const initializeLazyInstance = () => {
100
+ import_UIObject.UIObject.configureWithObject(result, {
101
+ instance: (0, import_UIObject.LAZY_VALUE)(
102
+ () => {
103
+ result.isInitialized = import_UIObject.YES;
104
+ return new classObject(
105
+ new import_UIView.UIView(classObject.name.replace("ViewController", "View"))
106
+ );
107
+ }
108
+ )
109
+ });
110
+ };
111
+ initializeLazyInstance();
99
112
  return result;
100
113
  }
101
114
  handleRoute(route) {
@@ -116,6 +129,14 @@ class UIRootViewController extends import_UIViewController.UIViewController {
116
129
  ),
117
130
  this.contentViewControllers.mainViewController
118
131
  );
132
+ if ((0, import_UIObject.IS)(this._contentViewController) && this._contentViewController !== contentViewControllerObject.instance) {
133
+ const oldViewControllerObject = this.contentViewControllers.allValues.find(
134
+ (value) => value.isInitialized && value.instance === this._contentViewController
135
+ );
136
+ if (oldViewControllerObject == null ? void 0 : oldViewControllerObject.deleteOnUnload) {
137
+ oldViewControllerObject.deleteInstance();
138
+ }
139
+ }
119
140
  this.contentViewController = contentViewControllerObject.instance;
120
141
  });
121
142
  }
@@ -129,12 +150,26 @@ class UIRootViewController extends import_UIViewController.UIViewController {
129
150
  )
130
151
  );
131
152
  if ((0, import_UIObject.IS)(route) && (0, import_UIObject.IS)(this.detailsViewController) && (0, import_UIObject.IS_NOT)(detailsViewControllerObject)) {
153
+ const oldViewControllerObject = this.detailsViewControllers.allValues.find(
154
+ (value) => value.isInitialized && value.instance === this._detailsViewController
155
+ );
156
+ if (oldViewControllerObject == null ? void 0 : oldViewControllerObject.deleteOnUnload) {
157
+ oldViewControllerObject.deleteInstance();
158
+ }
132
159
  this.detailsViewController = void 0;
133
160
  this._detailsDialogView.dismiss();
134
161
  this.view.setNeedsLayout();
135
162
  return;
136
163
  }
137
- this.detailsViewController = detailsViewControllerObject.instance;
164
+ if ((0, import_UIObject.IS)(this._detailsViewController) && this._detailsViewController !== (detailsViewControllerObject == null ? void 0 : detailsViewControllerObject.instance)) {
165
+ const oldViewControllerObject = this.detailsViewControllers.allValues.find(
166
+ (value) => value.isInitialized && value.instance === this._detailsViewController
167
+ );
168
+ if (oldViewControllerObject == null ? void 0 : oldViewControllerObject.deleteOnUnload) {
169
+ oldViewControllerObject.deleteInstance();
170
+ }
171
+ }
172
+ this.detailsViewController = detailsViewControllerObject == null ? void 0 : detailsViewControllerObject.instance;
138
173
  });
139
174
  }
140
175
  get contentViewController() {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../scripts/UIRootViewController.ts"],
4
- "sourcesContent": ["import { UIColor } from \"./UIColor\"\nimport { UICore } from \"./UICore\"\nimport { UIDialogView } from \"./UIDialogView\"\nimport { EXTEND, FIRST, FIRST_OR_NIL, IS, IS_NOT, LAZY_VALUE, nil, NO, UIObject, wrapInNil, YES } from \"./UIObject\"\nimport { UIRectangle } from \"./UIRectangle\"\nimport { UIRoute } from \"./UIRoute\"\nimport { UIView } from \"./UIView\"\nimport { UIViewController } from \"./UIViewController\"\n\n\nexport interface UIRootViewControllerLazyViewControllerObject<T extends typeof UIViewController> {\n instance: InstanceType<T>;\n class: T;\n shouldShow: () => (Promise<boolean> | boolean);\n isInitialized: boolean\n}\n\n\nexport interface UIRootViewControllerLazyViewControllersObject {\n [x: string]: UIRootViewControllerLazyViewControllerObject<typeof UIViewController>\n}\n\n\nexport interface UIRootViewControllerLazyContentViewControllersObject extends UIRootViewControllerLazyViewControllersObject {\n mainViewController: UIRootViewControllerLazyViewControllerObject<typeof UIViewController>\n}\n\n\nexport class UIRootViewController extends UIViewController {\n \n topBarView?: UIView\n backgroundView: UIView = new UIView(this.view.elementID + \"BackgroundView\").configuredWithObject({\n style: {\n background: \"linear-gradient(\" + UIColor.whiteColor.stringValue + \", \" + UIColor.blueColor.stringValue + \")\",\n backgroundSize: \"cover\",\n backgroundRepeat: \"no-repeat\"\n }\n })\n bottomBarView?: UIView\n \n _contentViewController?: UIViewController\n contentViewControllers: UIRootViewControllerLazyContentViewControllersObject = {\n mainViewController: this.lazyViewControllerObjectWithClass(UIViewController)\n }\n \n _detailsDialogView: UIDialogView = new UIDialogView(this.view.elementID + \"DetailsDialogView\")\n .configuredWithObject({\n dismiss: EXTEND(() => {\n const route = UIRoute.currentRoute\n this.detailsViewControllers.allValues.forEach(\n value => route.routeByRemovingComponentNamed(value.class.routeComponentName)\n )\n route.apply()\n }\n )\n })\n _detailsViewController?: UIViewController\n detailsViewControllers: UIRootViewControllerLazyViewControllersObject = {}\n \n \n constructor(view: UIView) {\n \n super(view)\n \n this.view.addSubview(this.backgroundView)\n \n }\n \n \n lazyViewControllerObjectWithClass<T extends typeof UIViewController>(\n classObject: T,\n shouldShow: () => (Promise<boolean> | boolean) = () => YES\n ): UIRootViewControllerLazyViewControllerObject<T> {\n const result: UIRootViewControllerLazyViewControllerObject<T> = {\n class: classObject,\n instance: nil,\n shouldShow: shouldShow,\n isInitialized: NO\n }\n UIObject.configureWithObject(result, {\n // @ts-ignore\n instance: LAZY_VALUE(\n () => {\n result.isInitialized = YES\n return new classObject(\n new UIView(classObject.name.replace(\"ViewController\", \"View\"))\n )\n }\n )\n })\n return result\n }\n \n \n override async handleRoute(route: UIRoute) {\n \n await super.handleRoute(route)\n \n UICore.languageService.updateCurrentLanguageKey()\n \n // Show content view\n await this.setContentViewControllerForRoute(route)\n \n await this.setDetailsViewControllerForRoute(route)\n \n }\n \n \n async setContentViewControllerForRoute(route: UIRoute) {\n const contentViewControllerObject = FIRST(\n await this.contentViewControllers.allValues.findAsyncSequential(\n async value => IS(route.componentWithViewController(value.class)) && await value.shouldShow()\n ),\n this.contentViewControllers.mainViewController\n )\n this.contentViewController = contentViewControllerObject.instance\n }\n \n async setDetailsViewControllerForRoute(route: UIRoute) {\n const detailsViewControllerObject = FIRST_OR_NIL(\n await this.detailsViewControllers.allValues.findAsyncSequential(\n async value => IS(route.componentWithViewController(value.class)) && await value.shouldShow()\n )\n )\n if (IS(route) && IS(this.detailsViewController) && IS_NOT(detailsViewControllerObject)) {\n this.detailsViewController = undefined\n this._detailsDialogView.dismiss()\n this.view.setNeedsLayout()\n return\n }\n this.detailsViewController = detailsViewControllerObject.instance\n }\n \n get contentViewController(): UIViewController | undefined {\n return this._contentViewController\n }\n \n set contentViewController(controller: UIViewController) {\n \n if (this.contentViewController == controller) {\n return\n }\n \n if (this.contentViewController) {\n this.removeChildViewController(this.contentViewController)\n }\n \n this._contentViewController = controller\n this.addChildViewControllerInContainer(controller, this.backgroundView)\n this._triggerLayoutViewSubviews()\n \n if (this.contentViewController) {\n this.contentViewController.view.style.boxShadow = \"0 3px 6px 0 rgba(0, 0, 0, 0.1)\"\n }\n \n this.view.setNeedsLayout()\n \n }\n \n \n get detailsViewController(): UIViewController | undefined {\n return this._detailsViewController\n }\n \n set detailsViewController(controller: UIViewController | undefined) {\n \n if (this.detailsViewController == controller) {\n return\n }\n \n if (IS(this.detailsViewController)) {\n this.removeChildViewController(this.detailsViewController)\n }\n \n this._detailsViewController = controller\n \n if (!IS(controller)) {\n return\n }\n \n this.addChildViewControllerInDialogView(controller, this._detailsDialogView)\n this._triggerLayoutViewSubviews()\n \n FIRST_OR_NIL(this.detailsViewController).view.style.borderRadius = \"5px\"\n \n this._detailsDialogView.showInView(this.view, YES)\n \n }\n \n updatePageScale(\n {\n minScaleWidth = 700,\n maxScaleWidth = 1500,\n minScale = 0.7,\n maxScale = 1\n } = {}\n ) {\n const actualPageWidth = window.innerWidth ?? (UIView.pageWidth * UIView.pageScale).integerValue\n let scale = minScale + (maxScale - minScale) *\n ((actualPageWidth - minScaleWidth) / (maxScaleWidth - minScaleWidth))\n scale = Math.min(scale, maxScale)\n scale = Math.max(scale, minScale)\n UIView.pageScale = scale\n }\n \n \n performDefaultLayout(\n {\n paddingLength = 20,\n contentViewMaxWidth = 1000,\n topBarHeight = 65,\n bottomBarMinHeight = 100\n } = {}\n ) {\n \n // View bounds\n const bounds = this.view.bounds\n \n if (this.topBarView) {\n this.topBarView.frame = new UIRectangle(0, 0, topBarHeight, bounds.width)\n }\n \n this.backgroundView.style.top = \"\" + (this.topBarView?.frame.height.integerValue ?? 0) + \"px\"\n this.backgroundView.style.width = \"100%\"\n this.backgroundView.style.height = \"fit-content\"\n this.backgroundView.style.minHeight = \"\" +\n (bounds.height - (this.topBarView?.frame.height ?? 0) - (this.bottomBarView?.frame.height ?? 0)).integerValue + \"px\"\n \n const contentView: UIView = this.contentViewController?.view ?? nil\n \n //var contentViewStyleString = contentView.viewHTMLElement.style.cssText\n \n contentView.style.position = \"relative\"\n contentView.style.bottom = \"0\"\n contentView.style.top = \"0\"\n contentView.style.width = \"100%\"\n contentView.setPaddings(nil, nil, paddingLength, nil)\n \n \n if (contentViewMaxWidth < this.backgroundView.bounds.width) {\n \n contentView.style.marginBottom = \"\" +\n Math.min(\n (this.backgroundView.bounds.width - contentViewMaxWidth) * 0.5,\n paddingLength\n ).integerValue + \"px\"\n contentView.style.marginTop = \"\" +\n Math.min(\n (this.backgroundView.bounds.width - contentViewMaxWidth) * 0.5,\n paddingLength\n ).integerValue + \"px\"\n contentView.style.maxWidth = contentViewMaxWidth + \"px\"\n \n contentView.style.left = \"\" +\n ((this.backgroundView.bounds.width - contentView.bounds.width) * 0.5).integerValue +\n \"px\"\n \n }\n else {\n \n contentView.style.margin = \"\"\n contentView.style.left = \"\"\n contentView.style.maxWidth = \"\"\n \n }\n \n // if (contentViewStyleString != contentView.style.cssText) {\n //\n // contentView.setNeedsLayout()\n //\n // }\n \n \n \n // Triggering immediate layout to ensure that the intrinsicContentHeight calculations work well\n this.contentViewController?._triggerLayoutViewSubviews()\n \n let contentViewControllerViewHeight = contentView.intrinsicContentHeight(\n contentView.bounds.width\n )\n \n const detailsViewControllerViewHeight = FIRST_OR_NIL(this.detailsViewController).view.intrinsicContentHeight(\n contentView.bounds.width)\n if (detailsViewControllerViewHeight > contentViewControllerViewHeight) {\n contentViewControllerViewHeight = detailsViewControllerViewHeight\n }\n \n \n contentView.style.height = \"\" + contentViewControllerViewHeight.integerValue + \"px\"\n //contentView.setNeedsLayout()\n \n if (IS(this.detailsViewController)) {\n \n contentView.style.transform = \"translateX(\" + 0 + \"px)\"\n \n this.detailsViewController.view.frame = this.backgroundView.frame.rectangleWithInset(\n paddingLength\n ).rectangleWithWidth(\n contentView.bounds.width,\n 0.5\n ).rectangleWithHeight(\n Math.max(\n this.detailsViewController.view.intrinsicContentHeight(\n this.detailsViewController.view.bounds.width\n ),\n contentView.bounds.height\n )\n )\n \n }\n else {\n \n contentView.style.transform = \"translateX(\" + 0 + \"px)\"\n \n }\n \n if (this.bottomBarView) {\n this.bottomBarView.frame = this.backgroundView.frame.rectangleWithY(\n this.backgroundView.frame.max.y\n ).rectangleWithHeight(\n Math.max(bottomBarMinHeight, this.bottomBarView.intrinsicContentHeight(this.backgroundView.frame.width))\n )\n }\n \n \n wrapInNil(this._detailsDialogView).setMaxSizes(this.bottomBarView?.frame.max.y ?? 0)\n \n }\n \n \n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { UIColor } from \"./UIColor\"\nimport { UICore } from \"./UICore\"\nimport { UIDialogView } from \"./UIDialogView\"\nimport { EXTEND, FIRST, FIRST_OR_NIL, IS, IS_NOT, LAZY_VALUE, nil, NO, UIObject, wrapInNil, YES } from \"./UIObject\"\nimport { UIRectangle } from \"./UIRectangle\"\nimport { UIRoute } from \"./UIRoute\"\nimport { UIView } from \"./UIView\"\nimport { UIViewController } from \"./UIViewController\"\n\n\nexport interface UIRootViewControllerLazyViewControllerObject<T extends typeof UIViewController> {\n instance: InstanceType<T>;\n class: T;\n shouldShow: () => (Promise<boolean> | boolean);\n isInitialized: boolean;\n deleteOnUnload: boolean;\n deleteInstance: () => void\n}\n\n\nexport interface UIRootViewControllerLazyViewControllersObject {\n [x: string]: UIRootViewControllerLazyViewControllerObject<typeof UIViewController>\n}\n\n\nexport interface UIRootViewControllerLazyContentViewControllersObject extends UIRootViewControllerLazyViewControllersObject {\n mainViewController: UIRootViewControllerLazyViewControllerObject<typeof UIViewController>\n}\n\n\nexport class UIRootViewController extends UIViewController {\n \n topBarView?: UIView\n backgroundView: UIView = new UIView(this.view.elementID + \"BackgroundView\").configuredWithObject({\n style: {\n background: \"linear-gradient(\" + UIColor.whiteColor.stringValue + \", \" + UIColor.blueColor.stringValue + \")\",\n backgroundSize: \"cover\",\n backgroundRepeat: \"no-repeat\"\n }\n })\n bottomBarView?: UIView\n \n _contentViewController?: UIViewController\n contentViewControllers: UIRootViewControllerLazyContentViewControllersObject = {\n mainViewController: this.lazyViewControllerObjectWithClass(UIViewController)\n }\n \n _detailsDialogView: UIDialogView = new UIDialogView(this.view.elementID + \"DetailsDialogView\")\n .configuredWithObject({\n dismiss: EXTEND(() => {\n const route = UIRoute.currentRoute\n this.detailsViewControllers.allValues.forEach(\n value => route.routeByRemovingComponentNamed(value.class.routeComponentName)\n )\n route.apply()\n }\n )\n })\n _detailsViewController?: UIViewController\n detailsViewControllers: UIRootViewControllerLazyViewControllersObject = {}\n \n \n constructor(view: UIView) {\n \n super(view)\n \n this.view.addSubview(this.backgroundView)\n \n }\n \n \n lazyViewControllerObjectWithClass<T extends typeof UIViewController>(\n classObject: T,\n options: {\n shouldShow?: () => (Promise<boolean> | boolean),\n deleteOnUnload?: boolean\n } = {}\n ): UIRootViewControllerLazyViewControllerObject<T> {\n const shouldShow = options.shouldShow ?? (() => YES)\n const deleteOnUnload = options.deleteOnUnload ?? NO\n \n const result: UIRootViewControllerLazyViewControllerObject<T> = {\n class: classObject,\n instance: nil,\n shouldShow: shouldShow,\n isInitialized: NO,\n deleteOnUnload: deleteOnUnload,\n deleteInstance: () => {\n if (result.isInitialized) {\n result.isInitialized = NO\n initializeLazyInstance()\n }\n }\n }\n \n const initializeLazyInstance = () => {\n UIObject.configureWithObject(result, {\n // @ts-ignore\n instance: LAZY_VALUE(\n () => {\n result.isInitialized = YES\n return new classObject(\n new UIView(classObject.name.replace(\"ViewController\", \"View\"))\n )\n }\n )\n })\n }\n \n initializeLazyInstance()\n \n return result\n }\n \n \n override async handleRoute(route: UIRoute) {\n \n await super.handleRoute(route)\n \n UICore.languageService.updateCurrentLanguageKey()\n \n // Show content view\n await this.setContentViewControllerForRoute(route)\n \n await this.setDetailsViewControllerForRoute(route)\n \n }\n \n \n async setContentViewControllerForRoute(route: UIRoute) {\n const contentViewControllerObject = FIRST(\n await this.contentViewControllers.allValues.findAsyncSequential(\n async value => IS(route.componentWithViewController(value.class)) && await value.shouldShow()\n ),\n this.contentViewControllers.mainViewController\n )\n \n // Delete old view controller if it has deleteOnUnload flag set\n if (IS(this._contentViewController) && this._contentViewController !== contentViewControllerObject.instance) {\n const oldViewControllerObject = this.contentViewControllers.allValues.find(\n value => value.isInitialized && value.instance === this._contentViewController\n )\n if (oldViewControllerObject?.deleteOnUnload) {\n oldViewControllerObject.deleteInstance()\n }\n }\n \n this.contentViewController = contentViewControllerObject.instance\n }\n \n async setDetailsViewControllerForRoute(route: UIRoute) {\n const detailsViewControllerObject = FIRST_OR_NIL(\n await this.detailsViewControllers.allValues.findAsyncSequential(\n async value => IS(route.componentWithViewController(value.class)) && await value.shouldShow()\n )\n )\n if (IS(route) && IS(this.detailsViewController) && IS_NOT(detailsViewControllerObject)) {\n // Delete old details view controller if it has deleteOnUnload flag set\n const oldViewControllerObject = this.detailsViewControllers.allValues.find(\n value => value.isInitialized && value.instance === this._detailsViewController\n )\n if (oldViewControllerObject?.deleteOnUnload) {\n oldViewControllerObject.deleteInstance()\n }\n \n this.detailsViewController = undefined\n this._detailsDialogView.dismiss()\n this.view.setNeedsLayout()\n return\n }\n \n // Delete old details view controller if it has deleteOnUnload flag set and is being replaced\n if (IS(this._detailsViewController) && this._detailsViewController !== detailsViewControllerObject?.instance) {\n const oldViewControllerObject = this.detailsViewControllers.allValues.find(\n value => value.isInitialized && value.instance === this._detailsViewController\n )\n if (oldViewControllerObject?.deleteOnUnload) {\n oldViewControllerObject.deleteInstance()\n }\n }\n \n this.detailsViewController = detailsViewControllerObject?.instance\n }\n \n get contentViewController(): UIViewController | undefined {\n return this._contentViewController\n }\n \n set contentViewController(controller: UIViewController) {\n \n if (this.contentViewController == controller) {\n return\n }\n \n if (this.contentViewController) {\n this.removeChildViewController(this.contentViewController)\n }\n \n this._contentViewController = controller\n this.addChildViewControllerInContainer(controller, this.backgroundView)\n this._triggerLayoutViewSubviews()\n \n if (this.contentViewController) {\n this.contentViewController.view.style.boxShadow = \"0 3px 6px 0 rgba(0, 0, 0, 0.1)\"\n }\n \n this.view.setNeedsLayout()\n \n }\n \n \n get detailsViewController(): UIViewController | undefined {\n return this._detailsViewController\n }\n \n set detailsViewController(controller: UIViewController | undefined) {\n \n if (this.detailsViewController == controller) {\n return\n }\n \n if (IS(this.detailsViewController)) {\n this.removeChildViewController(this.detailsViewController)\n }\n \n this._detailsViewController = controller\n \n if (!IS(controller)) {\n return\n }\n \n this.addChildViewControllerInDialogView(controller, this._detailsDialogView)\n this._triggerLayoutViewSubviews()\n \n FIRST_OR_NIL(this.detailsViewController).view.style.borderRadius = \"5px\"\n \n this._detailsDialogView.showInView(this.view, YES)\n \n }\n \n updatePageScale(\n {\n minScaleWidth = 700,\n maxScaleWidth = 1500,\n minScale = 0.7,\n maxScale = 1\n } = {}\n ) {\n const actualPageWidth = window.innerWidth ?? (UIView.pageWidth * UIView.pageScale).integerValue\n let scale = minScale + (maxScale - minScale) *\n ((actualPageWidth - minScaleWidth) / (maxScaleWidth - minScaleWidth))\n scale = Math.min(scale, maxScale)\n scale = Math.max(scale, minScale)\n UIView.pageScale = scale\n }\n \n \n performDefaultLayout(\n {\n paddingLength = 20,\n contentViewMaxWidth = 1000,\n topBarHeight = 65,\n bottomBarMinHeight = 100\n } = {}\n ) {\n \n // View bounds\n const bounds = this.view.bounds\n \n if (this.topBarView) {\n this.topBarView.frame = new UIRectangle(0, 0, topBarHeight, bounds.width)\n }\n \n this.backgroundView.style.top = \"\" + (this.topBarView?.frame.height.integerValue ?? 0) + \"px\"\n this.backgroundView.style.width = \"100%\"\n this.backgroundView.style.height = \"fit-content\"\n this.backgroundView.style.minHeight = \"\" +\n (bounds.height - (this.topBarView?.frame.height ?? 0) - (this.bottomBarView?.frame.height ?? 0)).integerValue + \"px\"\n \n const contentView: UIView = this.contentViewController?.view ?? nil\n \n //var contentViewStyleString = contentView.viewHTMLElement.style.cssText\n \n contentView.style.position = \"relative\"\n contentView.style.bottom = \"0\"\n contentView.style.top = \"0\"\n contentView.style.width = \"100%\"\n contentView.setPaddings(nil, nil, paddingLength, nil)\n \n \n if (contentViewMaxWidth < this.backgroundView.bounds.width) {\n \n contentView.style.marginBottom = \"\" +\n Math.min(\n (this.backgroundView.bounds.width - contentViewMaxWidth) * 0.5,\n paddingLength\n ).integerValue + \"px\"\n contentView.style.marginTop = \"\" +\n Math.min(\n (this.backgroundView.bounds.width - contentViewMaxWidth) * 0.5,\n paddingLength\n ).integerValue + \"px\"\n contentView.style.maxWidth = contentViewMaxWidth + \"px\"\n \n contentView.style.left = \"\" +\n ((this.backgroundView.bounds.width - contentView.bounds.width) * 0.5).integerValue +\n \"px\"\n \n }\n else {\n \n contentView.style.margin = \"\"\n contentView.style.left = \"\"\n contentView.style.maxWidth = \"\"\n \n }\n \n // if (contentViewStyleString != contentView.style.cssText) {\n //\n // contentView.setNeedsLayout()\n //\n // }\n \n \n \n // Triggering immediate layout to ensure that the intrinsicContentHeight calculations work well\n this.contentViewController?._triggerLayoutViewSubviews()\n \n let contentViewControllerViewHeight = contentView.intrinsicContentHeight(\n contentView.bounds.width\n )\n \n const detailsViewControllerViewHeight = FIRST_OR_NIL(this.detailsViewController).view.intrinsicContentHeight(\n contentView.bounds.width)\n if (detailsViewControllerViewHeight > contentViewControllerViewHeight) {\n contentViewControllerViewHeight = detailsViewControllerViewHeight\n }\n \n \n contentView.style.height = \"\" + contentViewControllerViewHeight.integerValue + \"px\"\n //contentView.setNeedsLayout()\n \n if (IS(this.detailsViewController)) {\n \n contentView.style.transform = \"translateX(\" + 0 + \"px)\"\n \n this.detailsViewController.view.frame = this.backgroundView.frame.rectangleWithInset(\n paddingLength\n ).rectangleWithWidth(\n contentView.bounds.width,\n 0.5\n ).rectangleWithHeight(\n Math.max(\n this.detailsViewController.view.intrinsicContentHeight(\n this.detailsViewController.view.bounds.width\n ),\n contentView.bounds.height\n )\n )\n \n }\n else {\n \n contentView.style.transform = \"translateX(\" + 0 + \"px)\"\n \n }\n \n if (this.bottomBarView) {\n this.bottomBarView.frame = this.backgroundView.frame.rectangleWithY(\n this.backgroundView.frame.max.y\n ).rectangleWithHeight(\n Math.max(bottomBarMinHeight, this.bottomBarView.intrinsicContentHeight(this.backgroundView.frame.width))\n )\n }\n \n \n wrapInNil(this._detailsDialogView).setMaxSizes(this.bottomBarView?.frame.max.y ?? 0)\n \n }\n \n \n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "uicore-ts",
3
- "version": "1.1.127",
3
+ "version": "1.1.128",
4
4
  "description": "UICore is a library to build native-like user interfaces using pure Typescript. No HTML is needed at all. Components are described as TS classes and all user interactions are handled explicitly. This library is strongly inspired by the UIKit framework that is used in IOS. In addition, UICore has tools to handle URL based routing, array sorting and filtering and adds a number of other utilities for convenience.",
5
5
  "main": "compiledScripts/index.js",
6
6
  "types": "compiledScripts/index.d.ts",
@@ -12,7 +12,9 @@ export interface UIRootViewControllerLazyViewControllerObject<T extends typeof U
12
12
  instance: InstanceType<T>;
13
13
  class: T;
14
14
  shouldShow: () => (Promise<boolean> | boolean);
15
- isInitialized: boolean
15
+ isInitialized: boolean;
16
+ deleteOnUnload: boolean;
17
+ deleteInstance: () => void
16
18
  }
17
19
 
18
20
 
@@ -69,38 +71,57 @@ export class UIRootViewController extends UIViewController {
69
71
 
70
72
  lazyViewControllerObjectWithClass<T extends typeof UIViewController>(
71
73
  classObject: T,
72
- shouldShow: () => (Promise<boolean> | boolean) = () => YES
74
+ options: {
75
+ shouldShow?: () => (Promise<boolean> | boolean),
76
+ deleteOnUnload?: boolean
77
+ } = {}
73
78
  ): UIRootViewControllerLazyViewControllerObject<T> {
79
+ const shouldShow = options.shouldShow ?? (() => YES)
80
+ const deleteOnUnload = options.deleteOnUnload ?? NO
81
+
74
82
  const result: UIRootViewControllerLazyViewControllerObject<T> = {
75
83
  class: classObject,
76
84
  instance: nil,
77
85
  shouldShow: shouldShow,
78
- isInitialized: NO
79
- }
80
- UIObject.configureWithObject(result, {
81
- // @ts-ignore
82
- instance: LAZY_VALUE(
83
- () => {
84
- result.isInitialized = YES
85
- return new classObject(
86
- new UIView(classObject.name.replace("ViewController", "View"))
87
- )
86
+ isInitialized: NO,
87
+ deleteOnUnload: deleteOnUnload,
88
+ deleteInstance: () => {
89
+ if (result.isInitialized) {
90
+ result.isInitialized = NO
91
+ initializeLazyInstance()
88
92
  }
89
- )
90
- })
93
+ }
94
+ }
95
+
96
+ const initializeLazyInstance = () => {
97
+ UIObject.configureWithObject(result, {
98
+ // @ts-ignore
99
+ instance: LAZY_VALUE(
100
+ () => {
101
+ result.isInitialized = YES
102
+ return new classObject(
103
+ new UIView(classObject.name.replace("ViewController", "View"))
104
+ )
105
+ }
106
+ )
107
+ })
108
+ }
109
+
110
+ initializeLazyInstance()
111
+
91
112
  return result
92
113
  }
93
114
 
94
115
 
95
116
  override async handleRoute(route: UIRoute) {
96
-
117
+
97
118
  await super.handleRoute(route)
98
-
119
+
99
120
  UICore.languageService.updateCurrentLanguageKey()
100
-
121
+
101
122
  // Show content view
102
123
  await this.setContentViewControllerForRoute(route)
103
-
124
+
104
125
  await this.setDetailsViewControllerForRoute(route)
105
126
 
106
127
  }
@@ -113,6 +134,17 @@ export class UIRootViewController extends UIViewController {
113
134
  ),
114
135
  this.contentViewControllers.mainViewController
115
136
  )
137
+
138
+ // Delete old view controller if it has deleteOnUnload flag set
139
+ if (IS(this._contentViewController) && this._contentViewController !== contentViewControllerObject.instance) {
140
+ const oldViewControllerObject = this.contentViewControllers.allValues.find(
141
+ value => value.isInitialized && value.instance === this._contentViewController
142
+ )
143
+ if (oldViewControllerObject?.deleteOnUnload) {
144
+ oldViewControllerObject.deleteInstance()
145
+ }
146
+ }
147
+
116
148
  this.contentViewController = contentViewControllerObject.instance
117
149
  }
118
150
 
@@ -123,12 +155,31 @@ export class UIRootViewController extends UIViewController {
123
155
  )
124
156
  )
125
157
  if (IS(route) && IS(this.detailsViewController) && IS_NOT(detailsViewControllerObject)) {
158
+ // Delete old details view controller if it has deleteOnUnload flag set
159
+ const oldViewControllerObject = this.detailsViewControllers.allValues.find(
160
+ value => value.isInitialized && value.instance === this._detailsViewController
161
+ )
162
+ if (oldViewControllerObject?.deleteOnUnload) {
163
+ oldViewControllerObject.deleteInstance()
164
+ }
165
+
126
166
  this.detailsViewController = undefined
127
167
  this._detailsDialogView.dismiss()
128
168
  this.view.setNeedsLayout()
129
169
  return
130
170
  }
131
- this.detailsViewController = detailsViewControllerObject.instance
171
+
172
+ // Delete old details view controller if it has deleteOnUnload flag set and is being replaced
173
+ if (IS(this._detailsViewController) && this._detailsViewController !== detailsViewControllerObject?.instance) {
174
+ const oldViewControllerObject = this.detailsViewControllers.allValues.find(
175
+ value => value.isInitialized && value.instance === this._detailsViewController
176
+ )
177
+ if (oldViewControllerObject?.deleteOnUnload) {
178
+ oldViewControllerObject.deleteInstance()
179
+ }
180
+ }
181
+
182
+ this.detailsViewController = detailsViewControllerObject?.instance
132
183
  }
133
184
 
134
185
  get contentViewController(): UIViewController | undefined {