@ngxviewbuilder/runtime 0.12.3 → 0.12.4

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.
Files changed (52) hide show
  1. package/fesm2022/{ngxviewbuilder-runtime-autocomplete-element-DU7SLoLr.mjs → ngxviewbuilder-runtime-autocomplete-element-DaMuvB5p.mjs} +1 -1
  2. package/fesm2022/{ngxviewbuilder-runtime-avatar-element-BWDaCDjn.mjs → ngxviewbuilder-runtime-avatar-element-DCy3AEHW.mjs} +1 -1
  3. package/fesm2022/{ngxviewbuilder-runtime-badge-element-BUv50o0Q.mjs → ngxviewbuilder-runtime-badge-element-Ci2NV1MC.mjs} +1 -1
  4. package/fesm2022/{ngxviewbuilder-runtime-breadcrumbs-element-Cb6NqxmR.mjs → ngxviewbuilder-runtime-breadcrumbs-element-Bcq5oGI8.mjs} +1 -1
  5. package/fesm2022/{ngxviewbuilder-runtime-button-element-LyUxiJtc.mjs → ngxviewbuilder-runtime-button-element-DzJfdCcx.mjs} +1 -1
  6. package/fesm2022/{ngxviewbuilder-runtime-chart-element-B1uBvHYa.mjs → ngxviewbuilder-runtime-chart-element-BCg3CI8N.mjs} +1 -1
  7. package/fesm2022/{ngxviewbuilder-runtime-checkbox-element-CQzqJqdF.mjs → ngxviewbuilder-runtime-checkbox-element-Cj3HQvkO.mjs} +1 -1
  8. package/fesm2022/ngxviewbuilder-runtime-column-p1eNMy75.mjs +43 -0
  9. package/fesm2022/{ngxviewbuilder-runtime-custom-html-element-BR66FC2H.mjs → ngxviewbuilder-runtime-custom-html-element-BMdxXckt.mjs} +2 -2
  10. package/fesm2022/{ngxviewbuilder-runtime-date-range-element-C8RBJmSj.mjs → ngxviewbuilder-runtime-date-range-element-BE_9Ba_-.mjs} +1 -1
  11. package/fesm2022/{ngxviewbuilder-runtime-datepicker-element-DT_3dhZY.mjs → ngxviewbuilder-runtime-datepicker-element-BFwwyRt-.mjs} +1 -1
  12. package/fesm2022/{ngxviewbuilder-runtime-divider-element-Dy0UbtJZ.mjs → ngxviewbuilder-runtime-divider-element-CbCCZ1Qu.mjs} +1 -1
  13. package/fesm2022/{ngxviewbuilder-runtime-element-wrapper-B7BMP_6p.mjs → ngxviewbuilder-runtime-element-wrapper-EBaWVZvf.mjs} +1 -1
  14. package/fesm2022/{ngxviewbuilder-runtime-file-upload-element-D9RXvqKq.mjs → ngxviewbuilder-runtime-file-upload-element-BYU3tLZw.mjs} +1 -1
  15. package/fesm2022/{ngxviewbuilder-runtime-icon-element-BhhGVwki.mjs → ngxviewbuilder-runtime-icon-element-CLqWvjKL.mjs} +1 -1
  16. package/fesm2022/{ngxviewbuilder-runtime-iframe-element-Cu80J5fV.mjs → ngxviewbuilder-runtime-iframe-element-Bl74Zm6Y.mjs} +1 -1
  17. package/fesm2022/{ngxviewbuilder-runtime-image-element-BcWyv_1w.mjs → ngxviewbuilder-runtime-image-element-iDSaX41Y.mjs} +1 -1
  18. package/fesm2022/{ngxviewbuilder-runtime-list-box-element-B3arqtqK.mjs → ngxviewbuilder-runtime-list-box-element-DrDTjcW5.mjs} +1 -1
  19. package/fesm2022/{ngxviewbuilder-runtime-list-grid-element-Bypg41r5.mjs → ngxviewbuilder-runtime-list-grid-element-CgiY-Lcy.mjs} +1 -1
  20. package/fesm2022/ngxviewbuilder-runtime-mark-for-check-on-property-change-WxfEoWah.mjs +1 -0
  21. package/fesm2022/{ngxviewbuilder-runtime-message-card-element-MG1HDIgX.mjs → ngxviewbuilder-runtime-message-card-element-60xyNliB.mjs} +1 -1
  22. package/fesm2022/{ngxviewbuilder-runtime-multi-select-element-BWJx77Pg.mjs → ngxviewbuilder-runtime-multi-select-element-DHqMGyjB.mjs} +1 -1
  23. package/fesm2022/ngxviewbuilder-runtime-ngx-view-builder-api.service-BYA8UfCA.mjs +4 -0
  24. package/fesm2022/{ngxviewbuilder-runtime-number-element-Cv-8UzYT.mjs → ngxviewbuilder-runtime-number-element-CdhEZPYp.mjs} +1 -1
  25. package/fesm2022/{ngxviewbuilder-runtime-number-stepper-element-BERWK0N0.mjs → ngxviewbuilder-runtime-number-stepper-element-f9KrH_YF.mjs} +1 -1
  26. package/fesm2022/{ngxviewbuilder-runtime-nvb-select-DZN__Phy.mjs → ngxviewbuilder-runtime-nvb-select-Dkh4SIap.mjs} +1 -1
  27. package/fesm2022/{ngxviewbuilder-runtime-page-title-element-BypNpk6v.mjs → ngxviewbuilder-runtime-page-title-element-8T25QlMQ.mjs} +1 -1
  28. package/fesm2022/{ngxviewbuilder-runtime-phone-input-element-Dc7vFgbW.mjs → ngxviewbuilder-runtime-phone-input-element-CZCkF7lo.mjs} +1 -1
  29. package/fesm2022/{ngxviewbuilder-runtime-progress-bar-element-CTsruGjk.mjs → ngxviewbuilder-runtime-progress-bar-element-BqCwBXpQ.mjs} +1 -1
  30. package/fesm2022/{ngxviewbuilder-runtime-radio-element-BVBDe7Ek.mjs → ngxviewbuilder-runtime-radio-element-CvVAePSa.mjs} +1 -1
  31. package/fesm2022/{ngxviewbuilder-runtime-rich-text-element-wkavxR4_.mjs → ngxviewbuilder-runtime-rich-text-element-D4knphJa.mjs} +2 -2
  32. package/fesm2022/{ngxviewbuilder-runtime-router-outlet-element-D5MWP2_E.mjs → ngxviewbuilder-runtime-router-outlet-element-BzouCbdg.mjs} +1 -1
  33. package/fesm2022/{ngxviewbuilder-runtime-select-button-element-BTHOZoYq.mjs → ngxviewbuilder-runtime-select-button-element-CtysP-cz.mjs} +1 -1
  34. package/fesm2022/{ngxviewbuilder-runtime-select-element-BmbIc2mf.mjs → ngxviewbuilder-runtime-select-element-Be-lGWkG.mjs} +1 -1
  35. package/fesm2022/{ngxviewbuilder-runtime-signature-pad-element-C8Wm6CAy.mjs → ngxviewbuilder-runtime-signature-pad-element-CJqDTYnO.mjs} +1 -1
  36. package/fesm2022/{ngxviewbuilder-runtime-single-checkbox-element-D6xFAe8I.mjs → ngxviewbuilder-runtime-single-checkbox-element-DrJcESGd.mjs} +1 -1
  37. package/fesm2022/{ngxviewbuilder-runtime-slider-element-DDrlelkb.mjs → ngxviewbuilder-runtime-slider-element-CsTb-3m4.mjs} +1 -1
  38. package/fesm2022/{ngxviewbuilder-runtime-spacer-element-Byp-9ui-.mjs → ngxviewbuilder-runtime-spacer-element-OAgkc5so.mjs} +1 -1
  39. package/fesm2022/{ngxviewbuilder-runtime-stats-card-element-BlpMA4xC.mjs → ngxviewbuilder-runtime-stats-card-element-CzjJKd-Y.mjs} +1 -1
  40. package/fesm2022/{ngxviewbuilder-runtime-table-element-DkFoz7Bs.mjs → ngxviewbuilder-runtime-table-element-C25OdqZn.mjs} +1 -1
  41. package/fesm2022/{ngxviewbuilder-runtime-text-element-x7z3vIFH.mjs → ngxviewbuilder-runtime-text-element-0eMB6sBj.mjs} +1 -1
  42. package/fesm2022/{ngxviewbuilder-runtime-textarea-element-vyeC0HZs.mjs → ngxviewbuilder-runtime-textarea-element-BRJA5Lzb.mjs} +1 -1
  43. package/fesm2022/{ngxviewbuilder-runtime-time-picker-element-Dkz84ISf.mjs → ngxviewbuilder-runtime-time-picker-element-3qN3oxZF.mjs} +1 -1
  44. package/fesm2022/{ngxviewbuilder-runtime-toast-element-C52aKUbB.mjs → ngxviewbuilder-runtime-toast-element-CzKIkQVY.mjs} +1 -1
  45. package/fesm2022/{ngxviewbuilder-runtime-toggle-switch-element-DVMw3-vu.mjs → ngxviewbuilder-runtime-toggle-switch-element-D9svjkSP.mjs} +1 -1
  46. package/fesm2022/{ngxviewbuilder-runtime-video-element-DgRSZoBA.mjs → ngxviewbuilder-runtime-video-element-CliJnlMX.mjs} +1 -1
  47. package/fesm2022/ngxviewbuilder-runtime.mjs +1 -1
  48. package/package.json +1 -1
  49. package/types/ngxviewbuilder-runtime.d.ts +138 -35
  50. package/fesm2022/ngxviewbuilder-runtime-column-C9GuN6kf.mjs +0 -43
  51. package/fesm2022/ngxviewbuilder-runtime-mark-for-check-on-property-change-CJyXJ0dU.mjs +0 -1
  52. package/fesm2022/ngxviewbuilder-runtime-ngx-view-builder-api.service-YhGi50Zx.mjs +0 -4
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ngxviewbuilder/runtime",
3
- "version": "0.12.3",
3
+ "version": "0.12.4",
4
4
  "description": "Native Angular runtime for NGX View Builder: renders forms, dashboards, data tables and guided flows defined as JSON.",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "homepage": "https://ngxviewbuilder.io",
@@ -955,6 +955,87 @@ export interface IDataSourceChangedEvent {
955
955
  result: unknown;
956
956
  dataSource: DataSourceModel;
957
957
  }
958
+ export interface ITranslationEntry {
959
+ key: string;
960
+ label: string;
961
+ sourceValue: string;
962
+ structurePath?: string;
963
+ }
964
+ /** One translatable text of a view, as `api.getContentTranslationKeys()` lists it. */
965
+ export interface INgxViewBuilderContentTranslationKey {
966
+ key: string;
967
+ label: string;
968
+ /** The text in the view's default language. */
969
+ source: string;
970
+ /** What each other language has for it so far. */
971
+ translations: Record<string, string>;
972
+ /** The view's other languages that have no text for it yet. */
973
+ missing: string[];
974
+ }
975
+ export declare class LocalizationService {
976
+ private templateEngineService;
977
+ /**
978
+ * Translations the host supplies through `api.setContentTranslations`, kept apart from
979
+ * the structure so they survive a view loaded later or replaced. Same shape and keys
980
+ * as `localization.texts`; on a key both define, the host's text wins.
981
+ */
982
+ private hostTexts;
983
+ /**
984
+ * The language the host asked for with `api.setLanguage` (or the runtime's `language`
985
+ * input). It beats the view's own `settings.language`, which is only the default: a view
986
+ * that arrives after the host picked a language still renders in that language.
987
+ */
988
+ private activeLanguage;
989
+ setActiveLanguage(language: string | null | undefined): void;
990
+ getActiveLanguage(): string;
991
+ setHostTexts(texts: Record<string, Record<string, string>>, merge?: boolean): void;
992
+ getHostTexts(): Record<string, Record<string, string>>;
993
+ /** The structure's own texts with the host's on top, per language. */
994
+ getEffectiveTexts(structure: IStructure | null | undefined): Record<string, Record<string, string>>;
995
+ /**
996
+ * Keeps translations on the item they belong to when a list is reordered or shortened.
997
+ * Keys are index paths (`elements.orders.columnsConfig[2].label`), so moving the third
998
+ * column to the front would otherwise hand its translation to whatever column landed at
999
+ * index 2. Items match by `id`, then by position when only fields changed, then by
1000
+ * `key`, `value` or `name`. A removed item's translations are dropped.
1001
+ */
1002
+ remapListTranslations(structure: IStructure | null | undefined, listPath: string, previous: unknown, next: unknown): boolean;
1003
+ private matchListItems;
1004
+ ensureLocalization(structure: IStructure | null | undefined): ILocalization;
1005
+ getTranslationEntries(structure: IStructure | null | undefined): ITranslationEntry[];
1006
+ applyTranslations(structure: IStructure): IStructure;
1007
+ /**
1008
+ * Texts an element only has as a default of its model (the two tabs a new tabs element
1009
+ * starts with, a table's empty message) are not in the saved JSON, so `applyTranslations`
1010
+ * had nothing to write their translation into. The translations editor lists them from
1011
+ * the live models, so they are translated here, on the models, once those exist.
1012
+ * `structure` is the one `applyTranslations` returned.
1013
+ */
1014
+ applyTranslationsToModels(structure: IStructure, models: Record<string, unknown> | null | undefined): void;
1015
+ private resolveDictionary;
1016
+ private collectElementEntries;
1017
+ private collectManualListEntries;
1018
+ private collectActionEntries;
1019
+ private collectTableColumnEntries;
1020
+ private collectTemplateDictionaryEntries;
1021
+ private collectStoredTemplateEntries;
1022
+ private collectNestedLocalizableEntries;
1023
+ private collectTemplateTokensFromUnknown;
1024
+ private pushTemplateTranslationEntries;
1025
+ private pushDictionaryEntry;
1026
+ private isLocalizableFieldName;
1027
+ private humanizeFieldName;
1028
+ /**
1029
+ * The built-in strings ship in English only. A view that wants another language
1030
+ * supplies it through its own localization entries, so there is nothing to branch on
1031
+ * here.
1032
+ */
1033
+ private resolveTotalTemplateFallback;
1034
+ private pushStringEntry;
1035
+ private pushStringEntryWithFallback;
1036
+ static ɵfac: i0.ɵɵFactoryDeclaration<LocalizationService, never>;
1037
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
1038
+ }
958
1039
  export type UiDictionary = Record<string, string>;
959
1040
  export type UiDictionaries = Record<string, UiDictionary>;
960
1041
  export declare class UiTranslationService {
@@ -2108,6 +2189,12 @@ export declare class NgxViewBuilderApiService {
2108
2189
  getTableCellElementTypes(): ITableCellElementType[];
2109
2190
  getLanguage(): string;
2110
2191
  setLanguage(language: string): void;
2192
+ /**
2193
+ * A view's own `settings.language` is its default. It is applied only while the host
2194
+ * has not picked a language: otherwise loading a view would switch the host back.
2195
+ */
2196
+ applyViewDefaultLanguage(language: string): void;
2197
+ private applyLanguage;
2111
2198
  resolveHostLanguage(options?: INgxViewBuilderLanguageResolveOptions): INgxViewBuilderResolvedLanguage;
2112
2199
  applyHostLanguage(options?: INgxViewBuilderLanguageResolveOptions): INgxViewBuilderResolvedLanguage;
2113
2200
  startLanguageSync(options?: INgxViewBuilderLanguageSyncOptions): INgxViewBuilderLanguageSyncHandle;
@@ -2151,6 +2238,22 @@ export declare class NgxViewBuilderApiService {
2151
2238
  private applyDefaultDataSourcesTo;
2152
2239
  setAiAssistantConfig(config: INgxViewBuilderAiAssistantConfig | null | undefined): void;
2153
2240
  getAiAssistantConfig(): INgxViewBuilderAiAssistantConfig;
2241
+ /**
2242
+ * Every text of the current view that can be translated: the key to translate it under,
2243
+ * a readable label, the text in the view's default language, and what each language has
2244
+ * for it so far (the view's own translations with the host's on top). `missing` lists the
2245
+ * view's languages that have no text yet.
2246
+ */
2247
+ getContentTranslationKeys(): INgxViewBuilderContentTranslationKey[];
2248
+ /** The view's translations with the host's on top, per language. */
2249
+ getContentTranslations(): Record<string, Record<string, string>>;
2250
+ /**
2251
+ * Content translations from the host, `{ lv: { 'elements.orders.columnsConfig[0].label': 'Vārds' } }`.
2252
+ *
2253
+ * They are kept apart from the view as well as written into it, so they can be supplied
2254
+ * before the view loads and still apply after it is replaced. On a key the view also
2255
+ * translates, the host's text wins. `getContentTranslationKeys()` lists the keys.
2256
+ */
2154
2257
  setContentTranslations(translations: Record<string, Record<string, string>>, merge?: boolean): void;
2155
2258
  requestTabChange(tab: NgxViewBuilderBuilderTabCode): void;
2156
2259
  notifyTabChanged(tab: NgxViewBuilderBuilderTabCode): void;
@@ -2192,7 +2295,14 @@ export declare class NgxViewBuilderApiService {
2192
2295
  replaceSettings(settings: IStructure['settings'] | null | undefined): boolean;
2193
2296
  updateSettings(updater: (settings: IStructure['settings']) => void): boolean;
2194
2297
  setData(data: Record<string, unknown>): void;
2195
- getData(): Record<string, unknown>;
2298
+ /**
2299
+ * The view's data as the host sees it. The library keeps its own state next to it under
2300
+ * `__` keys (`__variables`, `__route`, `__external`); those are left out unless
2301
+ * `includeInternal` asks for them, e.g. to build an expression context.
2302
+ */
2303
+ getData(options?: {
2304
+ includeInternal?: boolean;
2305
+ }): Record<string, unknown>;
2196
2306
  setTableSettings(identifier: string, settings: INgxViewBuilderTableColumnSetting[], options?: {
2197
2307
  tableName?: string | null;
2198
2308
  elementName?: string | null;
@@ -2232,6 +2342,12 @@ export declare class NgxViewBuilderApiService {
2232
2342
  private readonly inheritedRegistrations;
2233
2343
  private bridgedCallDepth;
2234
2344
  private installScopeBridging;
2345
+ /**
2346
+ * A setting the host changes again (the language every time a person switches it)
2347
+ * would otherwise pile up one replay entry per call. Only its last value matters, and a
2348
+ * full replace of the content translations makes the earlier ones irrelevant too.
2349
+ */
2350
+ private recordInheritedRegistration;
2235
2351
  private invokeBridgedMethod;
2236
2352
  private resolveViewDelegateApi;
2237
2353
  private unregisterScopedChildApi;
@@ -5177,6 +5293,12 @@ export declare class ElementActionService {
5177
5293
  static ɵfac: i0.ɵɵFactoryDeclaration<ElementActionService, never>;
5178
5294
  static ɵprov: i0.ɵɵInjectableDeclaration<any>;
5179
5295
  }
5296
+ /**
5297
+ * Events the API instance already fires on its parent itself (it does that for `<nvb-scope>`,
5298
+ * which has no bridge). Bridging them again made a host subscribed on the root API get each
5299
+ * of them twice.
5300
+ */
5301
+ export declare const NGX_VIEW_BUILDER_PARENT_FORWARDED_EVENTS: ReadonlySet<string>;
5180
5302
  /**
5181
5303
  * Forwards every event fired on an isolated (component-provided) API instance to
5182
5304
  * another instance typically the root singleton the host application injects.
@@ -5748,6 +5870,7 @@ export interface INgxViewBuilderAiSurface {
5748
5870
  */
5749
5871
  export declare class NgxViewBuilderAiApiService {
5750
5872
  private readonly ngxViewBuilderApiService;
5873
+ private readonly localizationService;
5751
5874
  private readonly elementFocusService;
5752
5875
  private readonly eventService;
5753
5876
  private selection;
@@ -6837,6 +6960,12 @@ export declare class ExpressionService {
6837
6960
  private applyPropertyChangeNotification;
6838
6961
  private evaluateAndSet;
6839
6962
  private resolveElementExpressionKey;
6963
+ /**
6964
+ * The element's own state, before any `readonlyIf` / `disableIf`. It is recorded here,
6965
+ * the first time a condition is applied: the preview recorded it lazily, after the first
6966
+ * evaluation had already switched the element off, so the condition's result became the
6967
+ * element's permanent base and the element never came back on.
6968
+ */
6840
6969
  private resolveElementBaseReadonly;
6841
6970
  private resolveElementBaseDisabled;
6842
6971
  private applyResetIfState;
@@ -10250,40 +10379,14 @@ export declare class DomInstrumentationService {
10250
10379
  static ɵfac: i0.ɵɵFactoryDeclaration<DomInstrumentationService, never>;
10251
10380
  static ɵprov: i0.ɵɵInjectableDeclaration<any>;
10252
10381
  }
10253
- export interface ITranslationEntry {
10254
- key: string;
10255
- label: string;
10256
- sourceValue: string;
10257
- structurePath?: string;
10258
- }
10259
- export declare class LocalizationService {
10260
- private templateEngineService;
10261
- ensureLocalization(structure: IStructure | null | undefined): ILocalization;
10262
- getTranslationEntries(structure: IStructure | null | undefined): ITranslationEntry[];
10263
- applyTranslations(structure: IStructure): IStructure;
10264
- private collectElementEntries;
10265
- private collectManualListEntries;
10266
- private collectActionEntries;
10267
- private collectTableColumnEntries;
10268
- private collectTemplateDictionaryEntries;
10269
- private collectStoredTemplateEntries;
10270
- private collectNestedLocalizableEntries;
10271
- private collectTemplateTokensFromUnknown;
10272
- private pushTemplateTranslationEntries;
10273
- private pushDictionaryEntry;
10274
- private isLocalizableFieldName;
10275
- private humanizeFieldName;
10276
- /**
10277
- * The built-in strings ship in English only. A view that wants another language
10278
- * supplies it through its own localization entries, so there is nothing to branch on
10279
- * here.
10280
- */
10281
- private resolveTotalTemplateFallback;
10282
- private pushStringEntry;
10283
- private pushStringEntryWithFallback;
10284
- static ɵfac: i0.ɵɵFactoryDeclaration<LocalizationService, never>;
10285
- static ɵprov: i0.ɵɵInjectableDeclaration<any>;
10286
- }
10382
+ /**
10383
+ * Drops the translations of elements the view no longer has. Content translation keys
10384
+ * start with the element's name, so deleting an element left its rows behind in every
10385
+ * language and the translations table kept listing them.
10386
+ */
10387
+ export declare function pruneElementTranslations(localization: ILocalization | null | undefined, elements: Record<string, unknown> | null | undefined): boolean;
10388
+ /** Moves an element's translations to its new name when it is renamed. */
10389
+ export declare function renameElementTranslations(localization: ILocalization | null | undefined, oldName: string, newName: string): boolean;
10287
10390
  export declare class MarkupSecurityService {
10288
10391
  private sanitizer;
10289
10392
  private documentRef;