@praxisui/core 3.0.0-beta.1 → 3.0.0-beta.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.
@@ -308,6 +308,9 @@ const FieldControlType = {
308
308
  INLINE_MULTISELECT: 'inlineMultiSelect',
309
309
  INLINE_TOGGLE: 'inlineToggle',
310
310
  INLINE_RANGE: 'inlineRange',
311
+ INLINE_PERIOD_RANGE: 'inlinePeriodRange',
312
+ INLINE_YEAR_RANGE: 'inlineYearRange',
313
+ INLINE_MONTH_RANGE: 'inlineMonthRange',
311
314
  INLINE_DATE: 'inlineDate',
312
315
  INLINE_DATE_RANGE: 'inlineDateRange',
313
316
  INLINE_TIME: 'inlineTime',
@@ -394,6 +397,9 @@ const INLINE_FILTER_CONTROL_TYPES = Object.freeze({
394
397
  INPUT: FieldControlType.INLINE_INPUT,
395
398
  TOGGLE: FieldControlType.INLINE_TOGGLE,
396
399
  RANGE: FieldControlType.INLINE_RANGE,
400
+ PERIOD_RANGE: FieldControlType.INLINE_PERIOD_RANGE,
401
+ YEAR_RANGE: FieldControlType.INLINE_YEAR_RANGE,
402
+ MONTH_RANGE: FieldControlType.INLINE_MONTH_RANGE,
397
403
  DATE: FieldControlType.INLINE_DATE,
398
404
  DATE_RANGE: FieldControlType.INLINE_DATE_RANGE,
399
405
  TIME: FieldControlType.INLINE_TIME,
@@ -428,6 +434,9 @@ const INLINE_FILTER_TOKEN_TO_CONTROL_TYPE_MAP = {
428
434
  inlineinput: INLINE_FILTER_CONTROL_TYPES.INPUT,
429
435
  inlinetoggle: INLINE_FILTER_CONTROL_TYPES.TOGGLE,
430
436
  inlinerange: INLINE_FILTER_CONTROL_TYPES.RANGE,
437
+ inlineperiodrange: INLINE_FILTER_CONTROL_TYPES.PERIOD_RANGE,
438
+ inlineyearrange: INLINE_FILTER_CONTROL_TYPES.YEAR_RANGE,
439
+ inlinemonthrange: INLINE_FILTER_CONTROL_TYPES.MONTH_RANGE,
431
440
  inlinedate: INLINE_FILTER_CONTROL_TYPES.DATE,
432
441
  inlinedaterange: INLINE_FILTER_CONTROL_TYPES.DATE_RANGE,
433
442
  inlinetime: INLINE_FILTER_CONTROL_TYPES.TIME,
@@ -456,6 +465,9 @@ const INLINE_FILTER_TOKEN_TO_BASE_CONTROL_TYPE_MAP = {
456
465
  inlineinput: FieldControlType.INPUT,
457
466
  inlinetoggle: FieldControlType.TOGGLE,
458
467
  inlinerange: FieldControlType.RANGE_SLIDER,
468
+ inlineperiodrange: FieldControlType.RANGE_SLIDER,
469
+ inlineyearrange: FieldControlType.YEAR_INPUT,
470
+ inlinemonthrange: FieldControlType.MONTH_INPUT,
459
471
  inlinedate: FieldControlType.DATE_PICKER,
460
472
  inlinedaterange: FieldControlType.DATE_RANGE,
461
473
  inlinetime: FieldControlType.TIME_PICKER,
@@ -635,6 +647,50 @@ class SchemaNormalizerService {
635
647
  return { key: String(opt), value: String(opt) };
636
648
  });
637
649
  }
650
+ parseOptionSource(value) {
651
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
652
+ return undefined;
653
+ }
654
+ const optionSource = {
655
+ key: String(value.key ?? '').trim(),
656
+ };
657
+ if (!optionSource.key) {
658
+ return undefined;
659
+ }
660
+ if (value.type !== undefined)
661
+ optionSource.type = String(value.type);
662
+ if (value.resourcePath !== undefined) {
663
+ optionSource.resourcePath = String(value.resourcePath);
664
+ }
665
+ if (value.filterField !== undefined) {
666
+ optionSource.filterField = String(value.filterField);
667
+ }
668
+ if (value.propertyPath !== undefined) {
669
+ optionSource.propertyPath = String(value.propertyPath);
670
+ }
671
+ if (value.labelPropertyPath !== undefined) {
672
+ optionSource.labelPropertyPath = String(value.labelPropertyPath);
673
+ }
674
+ if (value.valuePropertyPath !== undefined) {
675
+ optionSource.valuePropertyPath = String(value.valuePropertyPath);
676
+ }
677
+ if (value.dependsOn !== undefined) {
678
+ optionSource.dependsOn = this.parseStringArray(value.dependsOn);
679
+ }
680
+ if (value.excludeSelfField !== undefined) {
681
+ optionSource.excludeSelfField = this.parseBoolean(value.excludeSelfField);
682
+ }
683
+ if (value.searchMode !== undefined) {
684
+ optionSource.searchMode = String(value.searchMode);
685
+ }
686
+ if (value.pageSize !== undefined && !Number.isNaN(Number(value.pageSize))) {
687
+ optionSource.pageSize = Number(value.pageSize);
688
+ }
689
+ if (value.includeIds !== undefined) {
690
+ optionSource.includeIds = this.parseBoolean(value.includeIds);
691
+ }
692
+ return optionSource;
693
+ }
638
694
  /**
639
695
  * Converte string/Function em função real.
640
696
  * Atenção: usa `new Function` para avaliar strings – requer backend confiável.
@@ -1060,12 +1116,21 @@ class SchemaNormalizerService {
1060
1116
  if (ui.endpoint !== undefined) {
1061
1117
  field.endpoint = ui.endpoint;
1062
1118
  }
1119
+ if (ui.resourcePath !== undefined) {
1120
+ field.resourcePath = ui.resourcePath;
1121
+ }
1122
+ if (ui.optionSource !== undefined) {
1123
+ field.optionSource = this.parseOptionSource(ui.optionSource);
1124
+ }
1063
1125
  if (ui.valueField !== undefined) {
1064
1126
  field.valueField = ui.valueField;
1065
1127
  }
1066
1128
  if (ui.displayField !== undefined) {
1067
1129
  field.displayField = ui.displayField;
1068
1130
  }
1131
+ if (ui.filterField !== undefined) {
1132
+ field.filterField = ui.filterField;
1133
+ }
1069
1134
  if (ui.multiple !== undefined) {
1070
1135
  field.multiple = this.parseBoolean(ui.multiple);
1071
1136
  }
@@ -2743,6 +2808,45 @@ class GenericCrudService {
2743
2808
  return version ? { ...body, dataVersion: version } : body;
2744
2809
  }), catchError(this.handleError));
2745
2810
  }
2811
+ /** OPTION SOURCES: POST /option-sources/{sourceKey}/options/filter */
2812
+ filterOptionSourceOptions(sourceKey, criteria, pageable, opts) {
2813
+ let params = new HttpParams()
2814
+ .set('page', pageable.pageNumber)
2815
+ .set('size', pageable.pageSize);
2816
+ pageable.sort?.forEach((s) => (params = params.append('sort', s)));
2817
+ opts?.includeIds?.forEach((id) => {
2818
+ params = params.append('includeIds', String(id));
2819
+ });
2820
+ if (opts?.search) {
2821
+ params = params.set('search', opts.search);
2822
+ }
2823
+ this.ensureConfigured();
2824
+ const entry = this.resolveEndpointEntry(opts?.endpointKey);
2825
+ const base = `${this.getResourceBaseUrl(opts)}/option-sources/${encodeURIComponent(sourceKey)}/options`;
2826
+ const url = `${base}/filter`;
2827
+ const normalizedCriteria = this.normalizeRangeCriteria(criteria);
2828
+ const observeVersion = !!opts?.observeVersionHeader;
2829
+ const req$ = observeVersion
2830
+ ? this.http.post(url, normalizedCriteria, {
2831
+ params,
2832
+ observe: 'response',
2833
+ headers: composeHeadersWithVersion(entry),
2834
+ context: opts?.httpContext,
2835
+ })
2836
+ : this.http.post(url, normalizedCriteria, {
2837
+ params,
2838
+ headers: composeHeadersWithVersion(entry),
2839
+ context: opts?.httpContext,
2840
+ });
2841
+ if (!observeVersion) {
2842
+ return req$.pipe(catchError(this.handleError));
2843
+ }
2844
+ return req$.pipe(map((resp) => {
2845
+ const body = resp.body;
2846
+ const version = resp.headers.get('X-Data-Version') || undefined;
2847
+ return version ? { ...body, dataVersion: version } : body;
2848
+ }), catchError(this.handleError));
2849
+ }
2746
2850
  /** OPTIONS: GET /options/by-ids */
2747
2851
  getOptionsByIds(ids, options) {
2748
2852
  if (!ids?.length)
@@ -2761,6 +2865,24 @@ class GenericCrudService {
2761
2865
  })
2762
2866
  .pipe(catchError(this.handleError));
2763
2867
  }
2868
+ /** OPTION SOURCES: GET /option-sources/{sourceKey}/options/by-ids */
2869
+ getOptionSourceOptionsByIds(sourceKey, ids, options) {
2870
+ if (!ids?.length)
2871
+ return of([]);
2872
+ let params = new HttpParams();
2873
+ ids.forEach((id) => (params = params.append('ids', String(id))));
2874
+ this.ensureConfigured();
2875
+ const entry = this.resolveEndpointEntry(options?.endpointKey);
2876
+ const base = `${this.getResourceBaseUrl(options)}/option-sources/${encodeURIComponent(sourceKey)}/options`;
2877
+ const url = `${base}/by-ids`;
2878
+ return this.http
2879
+ .get(url, {
2880
+ params,
2881
+ headers: composeHeadersWithVersion(entry),
2882
+ context: options?.httpContext,
2883
+ })
2884
+ .pipe(catchError(this.handleError));
2885
+ }
2764
2886
  /** CURSOR: POST /filter/cursor */
2765
2887
  filterByCursor(criteria, cursorReq = {}, options) {
2766
2888
  let params = new HttpParams();
@@ -10981,6 +11103,19 @@ function normalizeEndpoint(path) {
10981
11103
  // Remove leading slashes and any duplicated `api` segments
10982
11104
  return path.replace(/^\/+/, '').replace(/^(?:api\/)+/, '');
10983
11105
  }
11106
+ function normalizeOptionSource(optionSource) {
11107
+ if (!optionSource?.key) {
11108
+ return undefined;
11109
+ }
11110
+ const dependsOn = Array.isArray(optionSource.dependsOn)
11111
+ ? optionSource.dependsOn.filter((value) => typeof value === 'string' && value.trim().length > 0)
11112
+ : undefined;
11113
+ return {
11114
+ ...optionSource,
11115
+ resourcePath: normalizeEndpoint(optionSource.resourcePath),
11116
+ dependsOn: dependsOn?.length ? dependsOn : undefined,
11117
+ };
11118
+ }
10984
11119
  /**
10985
11120
  * Converte um FieldDefinition em FieldMetadata.
10986
11121
  *
@@ -11034,6 +11169,7 @@ function mapFieldDefinitionToMetadata(field) {
11034
11169
  'iconClass',
11035
11170
  'iconStyle',
11036
11171
  'iconFontSize',
11172
+ 'filterField',
11037
11173
  ];
11038
11174
  for (const prop of simpleProps) {
11039
11175
  const value = field[prop];
@@ -11041,7 +11177,11 @@ function mapFieldDefinitionToMetadata(field) {
11041
11177
  metadata[prop] = value;
11042
11178
  }
11043
11179
  }
11044
- const endpointPath = normalizeEndpoint(field.resourcePath ?? field.endpoint);
11180
+ const normalizedOptionSource = normalizeOptionSource(field.optionSource);
11181
+ if (normalizedOptionSource) {
11182
+ metadata.optionSource = normalizedOptionSource;
11183
+ }
11184
+ const endpointPath = normalizeEndpoint(normalizedOptionSource?.resourcePath ?? field.resourcePath ?? field.endpoint);
11045
11185
  if (endpointPath) {
11046
11186
  // Canonicalize: only expose resourcePath; do not write legacy alias
11047
11187
  metadata.resourcePath = endpointPath;
@@ -11083,9 +11223,15 @@ function mapFieldDefinitionToMetadata(field) {
11083
11223
  if (field.displayField) {
11084
11224
  metadata.optionLabelKey = field.displayField;
11085
11225
  }
11226
+ else if (normalizedOptionSource) {
11227
+ metadata.optionLabelKey = 'label';
11228
+ }
11086
11229
  if (field.valueField) {
11087
11230
  metadata.optionValueKey = field.valueField;
11088
11231
  }
11232
+ else if (normalizedOptionSource) {
11233
+ metadata.optionValueKey = 'id';
11234
+ }
11089
11235
  if (field.filter) {
11090
11236
  metadata.filterCriteria = field.filter;
11091
11237
  }