@apia/api 4.0.46 → 4.0.50

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/dist/index.d.ts CHANGED
@@ -303,6 +303,21 @@ type TFilter = {
303
303
  icon?: string;
304
304
  };
305
305
 
306
+ declare class Filter {
307
+ protected tableName?: string;
308
+ filterState: TFilter;
309
+ focus(): void;
310
+ constructor(properties: TFilter);
311
+ getInputRenderer(): react.JSX.Element;
312
+ getSelectRenderer(): react.JSX.Element;
313
+ getRangeRenderer(): react.JSX.Element;
314
+ getDateRenderer(): react.JSX.Element;
315
+ getDoubleRenderer(): react.JSX.Element;
316
+ Component: (() => react.JSX.Element) & {
317
+ displayName: string;
318
+ };
319
+ }
320
+
306
321
  type TFilterTypesElementConditions = {
307
322
  onChange: string;
308
323
  readonly: boolean;
@@ -324,21 +339,6 @@ type TFilterTypesElementConditions = {
324
339
  };
325
340
  };
326
341
 
327
- declare class Filter {
328
- protected tableName?: string;
329
- filterState: TFilter;
330
- focus(): void;
331
- constructor(properties: TFilter);
332
- getInputRenderer(): react.JSX.Element;
333
- getSelectRenderer(): react.JSX.Element;
334
- getRangeRenderer(): react.JSX.Element;
335
- getDateRenderer(): react.JSX.Element;
336
- getDoubleRenderer(): react.JSX.Element;
337
- Component: (() => react.JSX.Element) & {
338
- displayName: string;
339
- };
340
- }
341
-
342
342
  type TableControllerState = {
343
343
  finishedFirstLoad: boolean;
344
344
  columns: Map<string, TResponsiveTableColumn>;
@@ -426,7 +426,7 @@ declare class QueryController {
426
426
  conditions: TFilterTypesElementConditions[];
427
427
  constructor(ajaxUrl: string);
428
428
  protected actualRefreshMethod(serverFirstRefresh?: boolean): Promise<void>;
429
- protected areRequiredFilters(): boolean;
429
+ protected areRequiredFilters(): false | Filter[];
430
430
  protected buildTableController(): TableController;
431
431
  clearFilters(): Promise<void>;
432
432
  private timeout;
package/dist/index.js CHANGED
@@ -5,7 +5,7 @@ import { Box, Label, spacing, getVariant, Input as Input$1, Select as Select$1,
5
5
  import { debugDispatcher, parseXmlAsync, arrayOrArray, EventEmitter, useMount, encrypt, noNaN, getIndex, getLabel, StatefulEmitter, focus, focusSelector, useLatest, useIntermediateValue, formatMessage, getDateFormat, Mutex, uniqueId as uniqueId$1 } from '@apia/util';
6
6
  import { notify, getNotificationMessageObj, dispatchNotifications } from '@apia/notifications';
7
7
  import { classToValidate, Checkbox, FileInput, classToValidationFunction, Input, Radio, Select, Textarea, useFormContext, validationsStore, hasSucceedFormValidation, Form } from '@apia/validations';
8
- import { Accordion, AccordionItem, useModal, LabelBox, SimpleButton, ApiaUtil, Modal, ProgressBar, DateInput, AutocompleteController, Autocomplete, IconButton } from '@apia/components';
8
+ import { Accordion, AccordionItem, useModal, LabelBox, SimpleButton, ApiaUtil, Modal, ProgressBar, RequiredMark, DateInput, AutocompleteController, Autocomplete, IconButton } from '@apia/components';
9
9
  import axios, { AxiosError } from 'axios';
10
10
  import merge from 'lodash-es/merge';
11
11
  import QueryString from 'qs';
@@ -3244,7 +3244,7 @@ const RangeFilterRenderer = observer(({ state }) => {
3244
3244
  const lastEmittedMultiplier = useRef(1);
3245
3245
  if (lastEmittedLow.current !== state.value) {
3246
3246
  lastEmittedLow.current = state.value;
3247
- lastEmittedHigh.current = state.valueTo || "";
3247
+ lastEmittedHigh.current = state.filterToValue || "";
3248
3248
  }
3249
3249
  const emitLow = (currentValue) => {
3250
3250
  const numberValue = currentValue ?? "";
@@ -3265,11 +3265,11 @@ const RangeFilterRenderer = observer(({ state }) => {
3265
3265
  lastEmittedHigh.current = numberValue;
3266
3266
  lastEmittedMultiplier.current = multiplier.current;
3267
3267
  const emitValue = numberValue;
3268
- state.valueTo = emitValue;
3268
+ state.filterToValue = String(emitValue);
3269
3269
  state.multiplier = multiplier.current;
3270
3270
  };
3271
3271
  const [lowValue, setLowValue] = useIntermediateValue(state.value);
3272
- const [highValue, setHighValue] = useIntermediateValue(state.valueTo);
3272
+ const [highValue, setHighValue] = useIntermediateValue(state.filterToValue);
3273
3273
  const [unit, setUnit] = useIntermediateValue(state.multiplier);
3274
3274
  return /* @__PURE__ */ jsxs(
3275
3275
  Box,
@@ -3301,6 +3301,7 @@ const RangeFilterRenderer = observer(({ state }) => {
3301
3301
  Input$1,
3302
3302
  {
3303
3303
  disabled: state.readonly,
3304
+ required: state.required,
3304
3305
  onChange: ({ target: { value: currentValue } }) => {
3305
3306
  setHighValue(currentValue);
3306
3307
  emitHigh(currentValue);
@@ -3340,39 +3341,45 @@ const RangeFilterRenderer = observer(({ state }) => {
3340
3341
  });
3341
3342
 
3342
3343
  const SelectFilterRenderer = observer(({ state }) => {
3343
- return /* @__PURE__ */ jsx(
3344
- Select$1,
3345
- {
3346
- disabled: state.readonly,
3347
- value: state.value,
3348
- onChange: (ev) => {
3349
- state.value = ev.target.value;
3350
- },
3351
- children: arrayOrArray(state.options).map((c) => /* @__PURE__ */ jsx("option", { value: c.value, children: c.label }, c.value))
3352
- }
3353
- );
3344
+ return /* @__PURE__ */ jsxs(Box, { sx: { position: "relative" }, children: [
3345
+ state.required && /* @__PURE__ */ jsx(RequiredMark, { isRequired: true, sx: { position: "absolute", left: 2 } }),
3346
+ /* @__PURE__ */ jsx(
3347
+ Select$1,
3348
+ {
3349
+ disabled: state.readonly,
3350
+ value: state.value,
3351
+ onChange: (ev) => {
3352
+ state.value = ev.target.value;
3353
+ },
3354
+ children: arrayOrArray(state.options).map((c) => /* @__PURE__ */ jsx("option", { value: c.value, children: c.label }, c.value))
3355
+ }
3356
+ )
3357
+ ] });
3354
3358
  });
3355
3359
 
3356
3360
  const InputFilterRenderer = observer(({ state }) => {
3357
3361
  const { onFilterBlur, onFilterPressEnter } = useResponsiveTableContext();
3358
- return /* @__PURE__ */ jsx(
3359
- Input$1,
3360
- {
3361
- disabled: state.readonly,
3362
- value: state.value,
3363
- onChange: (ev) => {
3364
- state.value = ev.target.value;
3365
- },
3366
- onKeyDown: (ev) => {
3367
- if (ev.code === "Enter") {
3368
- onFilterPressEnter?.(state);
3362
+ return /* @__PURE__ */ jsxs(Box, { sx: { position: "relative" }, children: [
3363
+ state.required && /* @__PURE__ */ jsx(RequiredMark, { isRequired: true, sx: { position: "absolute", left: 2 } }),
3364
+ /* @__PURE__ */ jsx(
3365
+ Input$1,
3366
+ {
3367
+ disabled: state.readonly,
3368
+ value: state.value,
3369
+ onChange: (ev) => {
3370
+ state.value = ev.target.value;
3371
+ },
3372
+ onKeyDown: (ev) => {
3373
+ if (ev.code === "Enter") {
3374
+ onFilterPressEnter?.(state);
3375
+ }
3376
+ },
3377
+ onBlur: () => {
3378
+ onFilterBlur?.(state);
3369
3379
  }
3370
- },
3371
- onBlur: () => {
3372
- onFilterBlur?.(state);
3373
3380
  }
3374
- }
3375
- );
3381
+ )
3382
+ ] });
3376
3383
  });
3377
3384
 
3378
3385
  const dateFormat = getDateFormat();
@@ -3387,24 +3394,40 @@ function controlDatesOrder(first, last) {
3387
3394
  const DateFilterRenderer = observer(({ state }) => {
3388
3395
  const { onFilterBlur, onFilterChange } = useResponsiveTableContext();
3389
3396
  return /* @__PURE__ */ jsxs(Fragment, { children: [
3390
- /* @__PURE__ */ jsx(Box, { as: "span", children: state?.filterToId ? formatMessage(window.LBL_DATE_FILTER_FROM_TXT, {
3391
- TOK1: state.title ?? ""
3392
- }) : state.title }),
3393
- /* @__PURE__ */ jsx(
3394
- DateInput,
3395
- {
3396
- disabled: state.readonly,
3397
- value: state.value,
3398
- onChange: (date) => {
3399
- state.value = date;
3400
- onFilterChange?.(state);
3401
- },
3402
- onBlur: () => {
3403
- onFilterBlur?.(state);
3397
+ /* @__PURE__ */ jsxs(Box, { sx: { position: "relative" }, children: [
3398
+ state.required && /* @__PURE__ */ jsx(
3399
+ RequiredMark,
3400
+ {
3401
+ isRequired: true,
3402
+ sx: { position: "absolute", left: 2, top: 6, zIndex: 1 }
3404
3403
  }
3405
- }
3406
- ),
3407
- (state?.isAdditional || state.group) && state?.filterToId && /* @__PURE__ */ jsxs(Fragment, { children: [
3404
+ ),
3405
+ /* @__PURE__ */ jsx(Box, { as: "span", children: state?.filterToId ? formatMessage(window.LBL_DATE_FILTER_FROM_TXT, {
3406
+ TOK1: state.title ?? ""
3407
+ }) : state.title }),
3408
+ /* @__PURE__ */ jsx(
3409
+ DateInput,
3410
+ {
3411
+ disabled: state.readonly,
3412
+ value: state.value,
3413
+ onChange: (date) => {
3414
+ state.value = date;
3415
+ onFilterChange?.(state);
3416
+ },
3417
+ onBlur: () => {
3418
+ onFilterBlur?.(state);
3419
+ }
3420
+ }
3421
+ )
3422
+ ] }),
3423
+ (state?.isAdditional || state.group) && state?.filterToId && /* @__PURE__ */ jsxs(Box, { sx: { position: "relative" }, children: [
3424
+ state.required && /* @__PURE__ */ jsx(
3425
+ RequiredMark,
3426
+ {
3427
+ isRequired: true,
3428
+ sx: { position: "absolute", left: 2, top: 6, zIndex: 1 }
3429
+ }
3430
+ ),
3408
3431
  /* @__PURE__ */ jsx(Box, { as: "span", children: formatMessage(window.LBL_DATE_FILTER_TO_TXT, {
3409
3432
  TOK1: state.title ?? ""
3410
3433
  }) }),
@@ -3414,9 +3437,9 @@ const DateFilterRenderer = observer(({ state }) => {
3414
3437
  disabled: state.readonly,
3415
3438
  value: state.filterToValue,
3416
3439
  onChange: (date) => {
3417
- const result = controlDatesOrder(state.value, date);
3440
+ const result = controlDatesOrder(state.value, date ?? "");
3418
3441
  if (result) {
3419
- state.filterToValue = date;
3442
+ state.filterToValue = date ?? "";
3420
3443
  onFilterChange?.(state);
3421
3444
  } else {
3422
3445
  state.filterToValue = void 0;
@@ -3854,7 +3877,8 @@ class QueryController {
3854
3877
  }
3855
3878
  async actualRefreshMethod(serverFirstRefresh) {
3856
3879
  const newValues = this.getFiltersValuesMap();
3857
- if (!this.areRequiredFilters()) {
3880
+ const required = this.areRequiredFilters();
3881
+ if (!required) {
3858
3882
  await this.mutex.acquire();
3859
3883
  try {
3860
3884
  this.tableController.state.finishedFirstLoad = false;
@@ -3876,11 +3900,28 @@ class QueryController {
3876
3900
  this.mutex.release();
3877
3901
  }
3878
3902
  }
3903
+ if (required) {
3904
+ const names = required.map(
3905
+ (f) => f.filterState.title ?? f.filterState.column ?? f.filterState.id ?? ""
3906
+ ).filter(Boolean).join(", ");
3907
+ ApiaUtil.instance.notifications.notify({
3908
+ message: getLabel("msgQryFilterRequiredList", {
3909
+ text: { TOK1: names }
3910
+ }).text,
3911
+ type: "warning"
3912
+ });
3913
+ }
3879
3914
  }
3880
3915
  areRequiredFilters() {
3881
- return !![...this.tableController.state.filters.values()].find(
3916
+ const requiredFilters = [
3917
+ ...this.tableController.state.filters.values()
3918
+ ].filter(
3882
3919
  (c) => c.filterState.required && !c.filterState.value && !c.filterState.isHidden
3883
3920
  );
3921
+ if (requiredFilters.length > 0) {
3922
+ return requiredFilters;
3923
+ }
3924
+ return false;
3884
3925
  }
3885
3926
  buildTableController() {
3886
3927
  return new TableController();
@@ -4093,7 +4134,7 @@ class QueryController {
4093
4134
  ] : void 0,
4094
4135
  placeholder: f.title,
4095
4136
  readonly: f.readonly,
4096
- required: f.required === "true",
4137
+ required: f.required === "true" || f.required === "1" || f.dateRequired === "1",
4097
4138
  runAutomatically: typedResponse?.filters.runFiltersAutomatically || f.detectOnChange
4098
4139
  };
4099
4140
  return filter;
@@ -4260,7 +4301,7 @@ const AdditionalFiltersComponent = observer(
4260
4301
  );
4261
4302
  return [...byGroup.values()];
4262
4303
  })();
4263
- return /* @__PURE__ */ jsx(
4304
+ return /* @__PURE__ */ jsx(Box, { sx: { ".requiredMark": { display: "none" } }, children: /* @__PURE__ */ jsx(
4264
4305
  TableContextReproducer,
4265
4306
  {
4266
4307
  tableName: queryController.tableController.getTableName(),
@@ -4343,7 +4384,7 @@ const AdditionalFiltersComponent = observer(
4343
4384
  )
4344
4385
  ] })
4345
4386
  }
4346
- );
4387
+ ) });
4347
4388
  }
4348
4389
  );
4349
4390
 
@@ -4398,7 +4439,7 @@ class AdditionalFiltersModal {
4398
4439
  },
4399
4440
  draggable: true,
4400
4441
  variant: "layout.common.modals.apiaFinder.additionalFiltersModal",
4401
- size: "xl"
4442
+ size: "lg"
4402
4443
  };
4403
4444
  }
4404
4445
  async openModal(properties) {
@@ -4430,6 +4471,7 @@ const NavBarRenderer = observer(
4430
4471
  onClick: () => {
4431
4472
  queryController.refresh();
4432
4473
  },
4474
+ "data-test-id": "btn_search",
4433
4475
  children: queryController.tableController.state.isLoading ? /* @__PURE__ */ jsx(Spinner, { sx: { color: "white", height: "17px" } }) : getLabel("btnSearch").text
4434
4476
  }
4435
4477
  ),
@@ -4441,6 +4483,7 @@ const NavBarRenderer = observer(
4441
4483
  onClick: async () => {
4442
4484
  additionalFiltersController.openModal();
4443
4485
  },
4486
+ "data-test-id": "btn-additional-filters",
4444
4487
  children: getLabel("titAdmAdtFilter").text
4445
4488
  }
4446
4489
  ),
@@ -4450,6 +4493,7 @@ const NavBarRenderer = observer(
4450
4493
  size: "sm",
4451
4494
  variant: "outline",
4452
4495
  onClick: () => queryController.clearFilters(),
4496
+ "data-test-id": "btn-clear-filters",
4453
4497
  children: getLabel("btnClearFilter").text
4454
4498
  }
4455
4499
  )