-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.ts
More file actions
106 lines (94 loc) · 4.23 KB
/
index.ts
File metadata and controls
106 lines (94 loc) · 4.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import { AdminForthPlugin } from "adminforth";
import type { IAdminForth, AdminForthResource, AdminForthComponentDeclaration } from "adminforth";
import { AdminForthFilterOperators } from "adminforth";
import type { PluginOptions } from './types.js';
export default class extends AdminForthPlugin {
options: PluginOptions;
constructor(options: PluginOptions) {
super(options, import.meta.url);
this.options = options;
}
async modifyResourceConfig(adminforth: IAdminForth, resourceConfig: AdminForthResource) {
super.modifyResourceConfig(adminforth, resourceConfig);
const frontendOptions = this.options.filters.map(f => {
if (!f.enum && !f.searchInput) {
throw new Error(`Filter ${f.name} should have either enum or searchInput property`);
}
if (f.enum && f.searchInput) {
throw new Error(`Filter ${f.name} should not have both enum and searchInput properties, choose one of them`);
}
return {
name: f.name,
icon: f.icon,
enum: f.enum ? f.enum.map(e => ({ label: e.label, icon: e.icon })) : undefined,
hasSearchInput: !!f.searchInput,
};
});
// simply modify resourceConfig or adminforth.config. You can get access to plugin options via this.options;
if ( !resourceConfig.options.pageInjections ) {
resourceConfig.options.pageInjections = {};
}
if ( !resourceConfig.options.pageInjections.list ) {
resourceConfig.options.pageInjections.list = {};
}
if ( !resourceConfig.options.pageInjections.list.beforeActionButtons ) {
resourceConfig.options.pageInjections.list.beforeActionButtons = [];
}
(resourceConfig.options.pageInjections.list.beforeActionButtons as AdminForthComponentDeclaration[]).push(
{
file: this.componentPath('FiltersArea.vue'),
meta: {
pluginInstanceId: this.pluginInstanceId,
resourceId: this.resourceConfig.resourceId,
options: frontendOptions
}
}
);
const normalizeFilterValue = (filters: any[]) => {
const filtersToReturn = [];
for (const filter of filters) {
if (filter.field.startsWith('_universal_search_')) {
const searchTerm = filter.value as string;
if (!searchTerm) continue;
const searchFieldName = filter.field.replace('_universal_search_', '');
const filterFromSearch = this.options.filters.find(f => f.name === searchFieldName)?.searchInput?.(searchTerm) || { field: searchFieldName, operator: AdminForthFilterOperators.EQ, value: searchTerm };
filtersToReturn.push(filterFromSearch);
} else if (filter.field.startsWith('_qf_')) {
const quickFilter = this.options.filters.find(f => `_qf_${f.name}` === filter.field);
if (quickFilter?.enum) {
const enumOption = quickFilter.enum.find(e => e.label === filter.value);
if (enumOption) {
const filterFromEnum = enumOption.filters();
filtersToReturn.push(filterFromEnum);
}
}
} else {
filtersToReturn.push(filter);
}
}
return filtersToReturn;
}
const transformer = async ({ query }: { query: any }) => {
const normalizedFilters = normalizeFilterValue(query.filters);
query.filters = normalizedFilters;
console.log('Transformed filters', query.filters);
return { ok: true, error: '' };
};
const originalBefore = this.resourceConfig.hooks.list.beforeDatasourceRequest;
if (!originalBefore) {
this.resourceConfig.hooks.list.beforeDatasourceRequest = [transformer];
} else if (Array.isArray(originalBefore)) {
originalBefore.push(transformer);
this.resourceConfig.hooks.list.beforeDatasourceRequest = originalBefore;
} else {
this.resourceConfig.hooks.list.beforeDatasourceRequest = [originalBefore, transformer];
}
}
validateConfigAfterDiscover(adminforth: IAdminForth, resourceConfig: AdminForthResource) {
}
instanceUniqueRepresentation(pluginOptions: any) : string {
// optional method to return unique string representation of plugin instance.
// Needed if plugin can have multiple instances on one resource
return `${this.resourceConfig.resourceId}-quick-filters`;
}
}