@gipisistemas/ngx-core 1.0.16 → 1.0.17

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.
@@ -4864,12 +4864,12 @@ class FilterPersistenceService {
4864
4864
  this._injector = inject(EnvironmentInjector);
4865
4865
  this._baseAuthServiceToken = inject(BaseAuthServiceToken);
4866
4866
  this._localStorageToken = inject(LocalStorageToken);
4867
+ this._STORAGE_KEY = 'gipi.filters';
4867
4868
  }
4868
4869
  /** Inicializa os filtros a partir da URL ou localStorage */
4869
- initializeFilter(storageKey, defaultFilter, useUserSegregation = true) {
4870
+ initializeFilter(screenKey, defaultFilter) {
4870
4871
  return runInInjectionContext(this._injector, () => {
4871
4872
  const activatedRoute = inject(ActivatedRoute);
4872
- const normalizedStorageKey = this._normalizeStorageKey(storageKey, useUserSegregation);
4873
4873
  const rawQueryParams = activatedRoute.snapshot.queryParams;
4874
4874
  const hasAnyQueryParams = Object.keys(rawQueryParams).some((key) => {
4875
4875
  const value = rawQueryParams[key];
@@ -4888,7 +4888,7 @@ class FilterPersistenceService {
4888
4888
  return snapshotParams;
4889
4889
  }
4890
4890
  // FALLBACK do localStorage (somente se NÃO tiver nada na URL)
4891
- const saved = this._loadFromStorage(normalizedStorageKey);
4891
+ const saved = this._loadFromStorage(screenKey);
4892
4892
  if (saved) {
4893
4893
  this._updateUrl(this._serializeToQueryParams(saved));
4894
4894
  return saved;
@@ -4897,32 +4897,20 @@ class FilterPersistenceService {
4897
4897
  });
4898
4898
  }
4899
4899
  /** Atualiza URL e storage quando os filtros mudam */
4900
- updateFilter(storageKey, filters, useUserSegregation = true) {
4900
+ updateFilter(screenKey, filters) {
4901
4901
  const queryParams = this._serializeToQueryParams(filters);
4902
4902
  const cleanedParams = this._cleanQueryParams(queryParams);
4903
4903
  const mergedParams = this._mergeWithCurrentQueryParams(filters, cleanedParams);
4904
- const normalizedStorageKey = this._normalizeStorageKey(storageKey, useUserSegregation);
4905
4904
  // Atualiza URL
4906
4905
  this._updateUrl(mergedParams);
4907
4906
  // Salva no localStorage
4908
- this._saveToStorage(normalizedStorageKey, filters);
4907
+ this._saveToStorage(screenKey, filters);
4909
4908
  }
4910
4909
  /** Limpa filtros da URL e storage */
4911
- clearFilter(storageKey, defaultFilter, useUserSegregation = true) {
4912
- const normalizedStorageKey = this._normalizeStorageKey(storageKey, useUserSegregation);
4910
+ clearFilter(screenKey, defaultFilter) {
4913
4911
  const mergedParams = this._mergeWithCurrentQueryParams(defaultFilter, {});
4914
4912
  this._updateUrl(mergedParams);
4915
- this._saveToStorage(normalizedStorageKey, defaultFilter);
4916
- }
4917
- /** Normaliza a chave de storage incluindo o usuário quando necessário */
4918
- _normalizeStorageKey(storageKey, useUserSegregation = true) {
4919
- const prefix = 'gipi.filter';
4920
- let key = storageKey.startsWith(prefix) ? storageKey : `${prefix}${storageKey}`;
4921
- if (useUserSegregation) {
4922
- const userAndCompanyId = this._getCurrentUserAndCompanyId();
4923
- key = `${key}.user.${userAndCompanyId}`;
4924
- }
4925
- return key;
4913
+ this._saveToStorage(screenKey, defaultFilter);
4926
4914
  }
4927
4915
  /** Obtém o ID do usuário atual */
4928
4916
  _getCurrentUserAndCompanyId() {
@@ -5047,21 +5035,29 @@ class FilterPersistenceService {
5047
5035
  });
5048
5036
  return { ...defaultFilter, ...parsed };
5049
5037
  }
5050
- _hasQueryParams(filters, defaultFilter) {
5051
- return JSON.stringify(filters) !== JSON.stringify(defaultFilter);
5052
- }
5053
- _saveToStorage(storageKey, filters) {
5038
+ _saveToStorage(screenKey, filters) {
5054
5039
  try {
5055
- this._localStorageToken.setItem(storageKey, JSON.stringify(filters));
5040
+ const userCompany = this._getCurrentUserAndCompanyId();
5041
+ const storageRaw = this._localStorageToken.getItem(this._STORAGE_KEY);
5042
+ const storage = storageRaw ? JSON.parse(storageRaw) : {};
5043
+ if (!storage[userCompany]) {
5044
+ storage[userCompany] = {};
5045
+ }
5046
+ storage[userCompany][screenKey] = filters;
5047
+ this._localStorageToken.setItem(this._STORAGE_KEY, JSON.stringify(storage));
5056
5048
  }
5057
5049
  catch (error) {
5058
5050
  console.warn('Could not save filters to storage:', error);
5059
5051
  }
5060
5052
  }
5061
- _loadFromStorage(storageKey) {
5053
+ _loadFromStorage(screenKey) {
5062
5054
  try {
5063
- const saved = this._localStorageToken.getItem(storageKey);
5064
- return saved ? JSON.parse(saved) : null;
5055
+ const userCompany = this._getCurrentUserAndCompanyId();
5056
+ const storageRaw = this._localStorageToken.getItem(this._STORAGE_KEY);
5057
+ if (!storageRaw)
5058
+ return null;
5059
+ const storage = JSON.parse(storageRaw);
5060
+ return storage?.[userCompany]?.[screenKey] ?? null;
5065
5061
  }
5066
5062
  catch {
5067
5063
  return null;
@@ -5112,8 +5108,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
5112
5108
  * const { filter, isInitializing, resetFilter } = useFilterPersistence({
5113
5109
  * defaultFilter: new MyFilter(),
5114
5110
  *
5115
- * // Recomendado iniciar com 'gipi.filter.'
5116
- * storageKey: 'gipi.filter.default',
5111
+ * // Recomendação: this.getPath();
5112
+ * screenKey: 'page/filter/default',
5117
5113
  *
5118
5114
  * // Opcional, padrão 100ms
5119
5115
  * debounceTime: 200,
@@ -5125,13 +5121,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
5125
5121
  */
5126
5122
  function useFilterPersistence(config) {
5127
5123
  const filterPersistenceService = inject(FilterPersistenceService);
5128
- const { storageKey = 'gipi.filter.undefined', defaultFilter, debounceTime = 100, onFilterInit, useUserSegregation = true, } = config;
5124
+ const { screenKey = 'page/filter/undefined', defaultFilter, debounceTime = 100, onFilterInit, } = config;
5129
5125
  const isInitializing = signal(true, ...(ngDevMode ? [{ debugName: "isInitializing" }] : []));
5130
5126
  const filter = signal(defaultFilter, ...(ngDevMode ? [{ debugName: "filter" }] : []));
5131
5127
  // Inicialização
5132
5128
  const initializeFilter = () => {
5133
5129
  try {
5134
- const persistedFilter = filterPersistenceService.initializeFilter(storageKey, defaultFilter, useUserSegregation);
5130
+ const persistedFilter = filterPersistenceService.initializeFilter(screenKey, defaultFilter);
5135
5131
  filter.set(persistedFilter);
5136
5132
  if (onFilterInit) {
5137
5133
  onFilterInit(persistedFilter);
@@ -5139,7 +5135,7 @@ function useFilterPersistence(config) {
5139
5135
  }
5140
5136
  catch {
5141
5137
  filter.set(defaultFilter);
5142
- filterPersistenceService.clearFilter(storageKey, defaultFilter, useUserSegregation);
5138
+ filterPersistenceService.clearFilter(screenKey, defaultFilter);
5143
5139
  if (onFilterInit) {
5144
5140
  onFilterInit(defaultFilter);
5145
5141
  }
@@ -5152,7 +5148,7 @@ function useFilterPersistence(config) {
5152
5148
  const init = isInitializing();
5153
5149
  if (init)
5154
5150
  return;
5155
- const timeoutId = setTimeout(() => filterPersistenceService.updateFilter(storageKey, currentFilter, useUserSegregation), debounceTime);
5151
+ const timeoutId = setTimeout(() => filterPersistenceService.updateFilter(screenKey, currentFilter), debounceTime);
5156
5152
  return () => clearTimeout(timeoutId);
5157
5153
  });
5158
5154
  afterNextRender(() => initializeFilter());
@@ -5161,7 +5157,7 @@ function useFilterPersistence(config) {
5161
5157
  isInitializing: isInitializing.asReadonly(),
5162
5158
  reset: () => {
5163
5159
  filter.set(defaultFilter);
5164
- filterPersistenceService.clearFilter(storageKey, defaultFilter, useUserSegregation);
5160
+ filterPersistenceService.clearFilter(screenKey, defaultFilter);
5165
5161
  },
5166
5162
  set: (newFilter) => {
5167
5163
  filter.set(newFilter);
@@ -5178,7 +5174,6 @@ class BaseListComponent extends BaseComponent {
5178
5174
  this.service = service;
5179
5175
  this.filterPersistenceService = inject(FilterPersistenceService);
5180
5176
  this.pageAdjustService = inject(PageAdjustService);
5181
- this._SESSION_STORAGE_FILTER = `gipi.filter.${this.getFilterStorageKey()}`;
5182
5177
  this._isHydrating = signal(true, ...(ngDevMode ? [{ debugName: "_isHydrating" }] : []));
5183
5178
  this._persistTimer = null;
5184
5179
  this.filter = signal(this.newFilter(), ...(ngDevMode ? [{ debugName: "filter" }] : []));
@@ -5229,7 +5224,7 @@ class BaseListComponent extends BaseComponent {
5229
5224
  // Debounce manual para evitar muitas atualizações
5230
5225
  this._persistTimer = setTimeout(() => {
5231
5226
  const toPersist = this._filterToPersist(currentFilter);
5232
- this.filterPersistenceService.updateFilter(this._SESSION_STORAGE_FILTER, toPersist);
5227
+ this.filterPersistenceService.updateFilter(this.getFilterStorageKey(), toPersist);
5233
5228
  }, 150);
5234
5229
  });
5235
5230
  }
@@ -5275,7 +5270,7 @@ class BaseListComponent extends BaseComponent {
5275
5270
  this._isHydrating.set(true);
5276
5271
  this.page.set(this.newPage());
5277
5272
  const defaultFilter = this.newFilter();
5278
- const persistedFilter = this.filterPersistenceService.initializeFilter(this._SESSION_STORAGE_FILTER, defaultFilter);
5273
+ const persistedFilter = this.filterPersistenceService.initializeFilter(this.getFilterStorageKey(), defaultFilter);
5279
5274
  this.filter.set(persistedFilter);
5280
5275
  this.afterFilterInit();
5281
5276
  this.tableColumns.set(this.createTableColumns());
@@ -5630,7 +5625,7 @@ class BaseListComponent extends BaseComponent {
5630
5625
  }
5631
5626
  resetFilter() {
5632
5627
  // Limpa a persistência dos filtros
5633
- this.filterPersistenceService.clearFilter(this._SESSION_STORAGE_FILTER, this.newFilter());
5628
+ this.filterPersistenceService.clearFilter(this.getFilterStorageKey(), this.newFilter());
5634
5629
  this.page.set(this.newPage());
5635
5630
  this.filter.set(this.newFilter());
5636
5631
  this.appliedFilters.set([]);
@@ -5685,13 +5680,6 @@ class BaseReportComponent extends BaseComponent {
5685
5680
  get currentReportType() {
5686
5681
  return this._currentReportType();
5687
5682
  }
5688
- get _SESSION_STORAGE_FILTER() {
5689
- const current = this._currentReportType();
5690
- if (!current) {
5691
- return `gipi.filter.unknown`;
5692
- }
5693
- return `gipi.filter.${current.getFilterStorageKey()}`;
5694
- }
5695
5683
  // Computed para facilitar o acesso ao tipo atual
5696
5684
  get currentType() {
5697
5685
  return computed(() => this._currentReportType()?.type || '');
@@ -5708,6 +5696,13 @@ class BaseReportComponent extends BaseComponent {
5708
5696
  this.filterPersistenceService = inject(FilterPersistenceService);
5709
5697
  this._isInitializingScreen = signal(true, ...(ngDevMode ? [{ debugName: "_isInitializingScreen" }] : []));
5710
5698
  this._currentReportType = signal(null, ...(ngDevMode ? [{ debugName: "_currentReportType" }] : []));
5699
+ this._STORAGE_FILTER = computed(() => {
5700
+ const current = this._currentReportType();
5701
+ if (!current) {
5702
+ return `gipi/filter/unknown`;
5703
+ }
5704
+ return current.getFilterStorageKey();
5705
+ }, ...(ngDevMode ? [{ debugName: "_STORAGE_FILTER" }] : []));
5711
5706
  // Effect para persistência automática dos filtros
5712
5707
  effect(() => {
5713
5708
  const currentFilter = this._currentReportType().filter();
@@ -5717,7 +5712,7 @@ class BaseReportComponent extends BaseComponent {
5717
5712
  return;
5718
5713
  }
5719
5714
  // Debounce manual para evitar muitas atualizações
5720
- setTimeout(() => this.filterPersistenceService.updateFilter(this._SESSION_STORAGE_FILTER, currentFilter), 100);
5715
+ setTimeout(() => this.filterPersistenceService.updateFilter(this._STORAGE_FILTER(), currentFilter), 100);
5721
5716
  });
5722
5717
  // Effect para reagir à mudança de tipo de relatório
5723
5718
  effect(() => {
@@ -5737,7 +5732,7 @@ class BaseReportComponent extends BaseComponent {
5737
5732
  this.currentReportType = this.reportTypes[0];
5738
5733
  }
5739
5734
  const defaultFilter = this.currentReportType.newFilter();
5740
- const persistedFilter = this.filterPersistenceService.initializeFilter(this._SESSION_STORAGE_FILTER, defaultFilter);
5735
+ const persistedFilter = this.filterPersistenceService.initializeFilter(this._STORAGE_FILTER(), defaultFilter);
5741
5736
  this.currentReportType.filter.set(persistedFilter);
5742
5737
  // Hook para ações após a inicialização do filtro
5743
5738
  this.currentReportType.afterFilterInit();
@@ -5882,14 +5877,14 @@ class BaseReportComponent extends BaseComponent {
5882
5877
  _persistCurrentTypeState() {
5883
5878
  if (this.currentReportType) {
5884
5879
  const currentFilter = this.currentReportType.filter();
5885
- this.filterPersistenceService.updateFilter(`gipi.filter.${this.currentReportType.getFilterStorageKey()}`, currentFilter);
5880
+ this.filterPersistenceService.updateFilter(this.currentReportType.getFilterStorageKey(), currentFilter);
5886
5881
  }
5887
5882
  }
5888
5883
  /** Carrega o estado do novo tipo */
5889
5884
  _loadNewTypeState() {
5890
5885
  this._isInitializingScreen.set(true);
5891
5886
  const defaultFilter = this.currentReportType.newFilter();
5892
- const persistedFilter = this.filterPersistenceService.initializeFilter(this._SESSION_STORAGE_FILTER, defaultFilter);
5887
+ const persistedFilter = this.filterPersistenceService.initializeFilter(this._STORAGE_FILTER(), defaultFilter);
5893
5888
  this.currentReportType.filter.set(persistedFilter);
5894
5889
  this.currentReportType.afterFilterInit();
5895
5890
  // Força uma busca dos dados