@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(
|
|
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(
|
|
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(
|
|
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(
|
|
4907
|
+
this._saveToStorage(screenKey, filters);
|
|
4909
4908
|
}
|
|
4910
4909
|
/** Limpa filtros da URL e storage */
|
|
4911
|
-
clearFilter(
|
|
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(
|
|
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
|
-
|
|
5051
|
-
return JSON.stringify(filters) !== JSON.stringify(defaultFilter);
|
|
5052
|
-
}
|
|
5053
|
-
_saveToStorage(storageKey, filters) {
|
|
5038
|
+
_saveToStorage(screenKey, filters) {
|
|
5054
5039
|
try {
|
|
5055
|
-
this.
|
|
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(
|
|
5053
|
+
_loadFromStorage(screenKey) {
|
|
5062
5054
|
try {
|
|
5063
|
-
const
|
|
5064
|
-
|
|
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
|
-
* //
|
|
5116
|
-
*
|
|
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 {
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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(
|
|
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.
|
|
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
|