@indigina/ui-kit 1.1.613 → 1.1.615

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.
@@ -9531,35 +9531,46 @@ const mapGlobalSearchResult = (store, requiredPermission, dataFetcher, categoryN
9531
9531
  })));
9532
9532
  }));
9533
9533
  };
9534
- const findMatches = (obj, translatePrefix, excludedKeys = [], search, translateValueResolver) => {
9535
- const matches = [];
9536
- if (!search) {
9534
+ const findMatches = (obj, translatePrefix, searchableKeys, search, translateValueResolver) => {
9535
+ if (!search || !searchableKeys.length || !obj || typeof obj !== 'object' || Array.isArray(obj)) {
9537
9536
  return [];
9538
9537
  }
9539
- const handleObject = (obj, path) => {
9540
- for (const [key, value,] of Object.entries(obj)) {
9541
- const currentPath = path ? `${path}.${key}` : key;
9542
- const isMatch = typeof value === 'string' &&
9543
- value.toLowerCase().includes(search.toLowerCase()) &&
9544
- !excludedKeys.includes(currentPath);
9545
- if (isMatch) {
9546
- matches.push({
9547
- path: currentPath,
9548
- key,
9549
- value: translateValueResolver?.(key, value) ?? value,
9550
- translateKey: `${translatePrefix}${currentPath}`,
9551
- });
9552
- }
9553
- traverse(value, currentPath);
9554
- }
9538
+ const isStringArray = (value) => Array.isArray(value) && value.every(item => typeof item === 'string');
9539
+ const isRecord = (value) => !!value && typeof value === 'object' && !Array.isArray(value);
9540
+ const getPathKey = (path) => path.split('.').pop() || path;
9541
+ const normalizedSearch = search.toLowerCase();
9542
+ const getValueByPath = (value, path) => {
9543
+ return path.split('.').reduce((current, segment) => isRecord(current) ? current[segment] : undefined, value);
9555
9544
  };
9556
- const traverse = (current, path) => {
9557
- if (current && typeof current === 'object' && !Array.isArray(current)) {
9558
- handleObject(current, path);
9545
+ const getMatchValue = (value) => {
9546
+ if (typeof value === 'string') {
9547
+ return value.toLowerCase().includes(normalizedSearch)
9548
+ ? { matchedValue: value, resolverValue: value }
9549
+ : null;
9550
+ }
9551
+ if (isStringArray(value)) {
9552
+ const matchedItems = value.filter(item => item.toLowerCase().includes(normalizedSearch));
9553
+ if (!matchedItems.length) {
9554
+ return null;
9555
+ }
9556
+ return { matchedValue: matchedItems.join(', '), resolverValue: matchedItems };
9559
9557
  }
9558
+ return null;
9560
9559
  };
9561
- traverse(obj, '');
9562
- return matches;
9560
+ return Array.from(new Set(searchableKeys)).reduce((matches, path) => {
9561
+ const matchValue = getMatchValue(getValueByPath(obj, path));
9562
+ if (!matchValue) {
9563
+ return matches;
9564
+ }
9565
+ const key = getPathKey(path);
9566
+ matches.push({
9567
+ path,
9568
+ key,
9569
+ value: translateValueResolver?.(key, matchValue.resolverValue) ?? matchValue.matchedValue,
9570
+ translateKey: `${translatePrefix}${path}`,
9571
+ });
9572
+ return matches;
9573
+ }, []);
9563
9574
  };
9564
9575
  const changeFilterField = (filter, field) => ({
9565
9576
  ...filter,
@@ -10866,7 +10877,6 @@ class KitUsersSettingsDetailsFormComponent {
10866
10877
  Validators.email,
10867
10878
  ]),
10868
10879
  [KitUsersSettingsDetailsField.PASSWORD]: this.formBuilder.nonNullable.control('', [
10869
- Validators.required,
10870
10880
  Validators.maxLength(70),
10871
10881
  ]),
10872
10882
  [KitUsersSettingsDetailsField.MFA]: this.formBuilder.nonNullable.control(false),
@@ -10875,6 +10885,7 @@ class KitUsersSettingsDetailsFormComponent {
10875
10885
  this.isSaving = signal(false, /* @ts-ignore */
10876
10886
  ...(ngDevMode ? [{ debugName: "isSaving" }] : /* istanbul ignore next */ []));
10877
10887
  this.lastPatchedUserId = null;
10888
+ this.initialFormValue = JSON.stringify(this.form.getRawValue());
10878
10889
  effect(() => {
10879
10890
  if (!this.isCreateMode()) {
10880
10891
  const { data: userDetails, loading } = this.userDetails();
@@ -10897,6 +10908,9 @@ class KitUsersSettingsDetailsFormComponent {
10897
10908
  getFormErrorMessages(form, controlName) {
10898
10909
  return this.kitFormErrors.getErrors(form.controls[controlName]).join('. ');
10899
10910
  }
10911
+ get hasUnsavedChanges() {
10912
+ return JSON.stringify(this.form.getRawValue()) !== this.initialFormValue;
10913
+ }
10900
10914
  submit() {
10901
10915
  this.isSaving.set(true);
10902
10916
  return this.isCreateMode()
@@ -10920,6 +10934,7 @@ class KitUsersSettingsDetailsFormComponent {
10920
10934
  ...userDetails,
10921
10935
  id,
10922
10936
  })).pipe(takeUntilDestroyed(this.destroyRef), map(() => this.userDetails().data), tap(updatedUser => {
10937
+ this.initialFormValue = JSON.stringify(this.form.getRawValue());
10923
10938
  this.form.markAsPristine();
10924
10939
  if (updatedUser) {
10925
10940
  this.updated.emit(updatedUser);
@@ -10945,6 +10960,7 @@ class KitUsersSettingsDetailsFormComponent {
10945
10960
  [KitUsersSettingsDetailsField.MFA]: userDetails.mfaEnabled,
10946
10961
  [KitUsersSettingsDetailsField.FORCE_PASSWORD]: false,
10947
10962
  }, { emitEvent: false });
10963
+ this.initialFormValue = JSON.stringify(this.form.getRawValue());
10948
10964
  }
10949
10965
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: KitUsersSettingsDetailsFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
10950
10966
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.1", type: KitUsersSettingsDetailsFormComponent, isStandalone: true, selector: "kit-users-settings-details-form", inputs: { isCreateMode: { classPropertyName: "isCreateMode", publicName: "isCreateMode", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { updated: "updated" }, providers: [KitFormErrors], ngImport: i0, template: "<form class=\"kit-user-settings-details-form\"\n [formGroup]=\"form\">\n <kit-textbox [formControlName]=\"kitUsersSettingsDetailsField.USER_NAME\"\n [label]=\"'kit.usersSettings.details.loginId' | translate\"\n [readonly]=\"!isCreateMode()\"\n [showStateIcon]=\"false\"\n [state]=\"getTextboxState(form, kitUsersSettingsDetailsField.USER_NAME)\"\n [messageText]=\"getFormErrorMessages(form, kitUsersSettingsDetailsField.USER_NAME) | translate\"></kit-textbox>\n <kit-textbox [formControlName]=\"kitUsersSettingsDetailsField.FIRST_NAME\"\n [label]=\"'kit.usersSettings.details.firstName' | translate\"\n [showStateIcon]=\"false\"\n [state]=\"getTextboxState(form, kitUsersSettingsDetailsField.FIRST_NAME)\"\n [messageText]=\"getFormErrorMessages(form, kitUsersSettingsDetailsField.FIRST_NAME) | translate\"></kit-textbox>\n <kit-textbox [formControlName]=\"kitUsersSettingsDetailsField.LAST_NAME\"\n [label]=\"'kit.usersSettings.details.lastName' | translate\"\n [showStateIcon]=\"false\"\n [state]=\"getTextboxState(form, kitUsersSettingsDetailsField.LAST_NAME)\"\n [messageText]=\"getFormErrorMessages(form, kitUsersSettingsDetailsField.LAST_NAME) | translate\"></kit-textbox>\n <kit-textbox [formControlName]=\"kitUsersSettingsDetailsField.EMAIL\"\n [label]=\"'kit.usersSettings.details.email' | translate\"\n [showStateIcon]=\"false\"\n [state]=\"getTextboxState(form, kitUsersSettingsDetailsField.EMAIL)\"\n [messageText]=\"getFormErrorMessages(form, kitUsersSettingsDetailsField.EMAIL) | translate\"></kit-textbox>\n @if (isCreateMode()) {\n <kit-textbox type=\"password\"\n [formControlName]=\"kitUsersSettingsDetailsField.PASSWORD\"\n [label]=\"'kit.usersSettings.details.password' | translate\"\n [showStateIcon]=\"false\"\n [state]=\"getTextboxState(form, kitUsersSettingsDetailsField.PASSWORD)\"\n [messageText]=\"getFormErrorMessages(form, kitUsersSettingsDetailsField.PASSWORD) | translate\"></kit-textbox>\n }\n <div class=\"kit-user-settings-details-form-toggles\">\n <kit-toggle class=\"kit-user-settings-details-form-toggle\"\n [formControlName]=\"kitUsersSettingsDetailsField.MFA\"\n [label]=\"'kit.usersSettings.details.mfa' | translate\"></kit-toggle>\n @if (isCreateMode()) {\n <kit-toggle class=\"kit-user-settings-details-form-toggle\"\n [formControlName]=\"kitUsersSettingsDetailsField.FORCE_PASSWORD\"\n [label]=\"'kit.usersSettings.details.forcePassword' | translate\"></kit-toggle>\n }\n </div>\n</form>\n", styles: [".kit-user-settings-details-form{display:flex;flex-direction:column;gap:10px;width:100%}.kit-user-settings-details-form-toggles{display:flex;width:100%;gap:20px}.kit-user-settings-details-form-toggle{width:100%}.kit-user-settings-details-form-toggle ::ng-deep .kit-toggle{display:flex;align-items:center;gap:15px;justify-content:space-between;width:100%}.kit-user-settings-details-form-toggle ::ng-deep .kit-form-label{margin:0}\n"], dependencies: [{ kind: "component", type: KitTextboxComponent, selector: "kit-textbox", inputs: ["placeholder", "label", "labelTooltip", "defaultValue", "messageIcon", "messageText", "messageTemplate", "disabled", "maxlength", "state", "size", "icon", "clearButton", "showStateIcon", "readonly", "customStateIcon", "type"], outputs: ["defaultValueChange", "disabledChange", "blured", "focused", "changed"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$8.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$8.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$8.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$8.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: KitToggleComponent, selector: "kit-toggle", inputs: ["label", "disabled", "readonly", "defaultChecked", "leftLabel", "rightLabel", "messageIcon", "messageText", "size"], outputs: ["disabledChange", "defaultCheckedChange", "changed"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
@@ -11291,6 +11307,7 @@ class KitUsersSettingsEntitlementsFormComponent {
11291
11307
  ...(ngDevMode ? [{ debugName: "partners" }] : /* istanbul ignore next */ []));
11292
11308
  this.roles = signal([], /* @ts-ignore */
11293
11309
  ...(ngDevMode ? [{ debugName: "roles" }] : /* istanbul ignore next */ []));
11310
+ this.initialFormValue = JSON.stringify(this.form.getRawValue());
11294
11311
  this.creatingFormContext = toSignal(merge(this.form.controls[KitUsersSettingsEntitlementsField.IDENTITY_TYPE].valueChanges, this.form.controls[KitUsersSettingsEntitlementsField.PARTNERS].valueChanges).pipe(startWith(null), map(() => ({
11295
11312
  identityType: this.form.controls[KitUsersSettingsEntitlementsField.IDENTITY_TYPE].value,
11296
11313
  partnerId: this.form.controls[KitUsersSettingsEntitlementsField.PARTNERS].value,
@@ -11305,6 +11322,9 @@ class KitUsersSettingsEntitlementsFormComponent {
11305
11322
  getFormErrorMessages(form, controlName) {
11306
11323
  return this.kitFormErrors.getErrors(form.controls[controlName]).join('. ');
11307
11324
  }
11325
+ get hasUnsavedChanges() {
11326
+ return JSON.stringify(this.form.getRawValue()) !== this.initialFormValue;
11327
+ }
11308
11328
  submit() {
11309
11329
  const userId = this.userId();
11310
11330
  if (!userId) {
@@ -11358,7 +11378,10 @@ class KitUsersSettingsEntitlementsFormComponent {
11358
11378
  return undefined;
11359
11379
  }
11360
11380
  dispatchAndMarkPristine(action) {
11361
- return this.store.dispatch(action).pipe(tap(() => this.form.markAsPristine()), map(() => true), catchError(() => {
11381
+ return this.store.dispatch(action).pipe(tap(() => {
11382
+ this.initialFormValue = JSON.stringify(this.form.getRawValue());
11383
+ this.form.markAsPristine();
11384
+ }), map(() => true), catchError(() => {
11362
11385
  this.form.setErrors({ serverError: true });
11363
11386
  return of(false);
11364
11387
  }), finalize(() => this.isSaving.set(false)));
@@ -11375,6 +11398,7 @@ class KitUsersSettingsEntitlementsFormComponent {
11375
11398
  });
11376
11399
  this.form.get(KitUsersSettingsEntitlementsField.IDENTITY_TYPE)?.disable();
11377
11400
  this.form.get(KitUsersSettingsEntitlementsField.PARTNERS)?.disable();
11401
+ this.initialFormValue = JSON.stringify(this.form.getRawValue());
11378
11402
  this.form.markAsPristine();
11379
11403
  }
11380
11404
  }
@@ -11543,7 +11567,11 @@ class KitUsersSettingsEntitlementsComponent {
11543
11567
  }
11544
11568
  get isSaveBtnDisabled() {
11545
11569
  const formComponent = this.entitlementsForm();
11546
- return !formComponent || formComponent.form.pristine || formComponent.form.invalid || formComponent.isSaving();
11570
+ return !formComponent ||
11571
+ formComponent.form.pristine ||
11572
+ !formComponent.hasUnsavedChanges ||
11573
+ formComponent.form.invalid ||
11574
+ formComponent.isSaving();
11547
11575
  }
11548
11576
  selectItem(item) {
11549
11577
  const collapsedList = this.collapsedList();
@@ -11752,7 +11780,11 @@ class KitUsersSettingsProfileComponent {
11752
11780
  get isFormDisabled() {
11753
11781
  if (this.currentTab() === KitUsersSettingsProfileTab.DETAILS) {
11754
11782
  const detailsForm = this.detailsForm();
11755
- return !detailsForm || detailsForm.form.pristine || detailsForm.form.invalid || detailsForm.isSaving();
11783
+ return !detailsForm ||
11784
+ detailsForm.form.pristine ||
11785
+ !detailsForm.hasUnsavedChanges ||
11786
+ detailsForm.form.invalid ||
11787
+ detailsForm.isSaving();
11756
11788
  }
11757
11789
  const entitlementsForm = this.entitlementsForm();
11758
11790
  return !entitlementsForm || entitlementsForm.isSaveBtnDisabled;