mirror of
https://gitee.com/nocobase/nocobase.git
synced 2025-05-09 15:39:24 +08:00
* refactor: plugin manager page * fix: bug * feat: addByNpm api * fix: improve the addByNpm * feat: improve applicationPlugins:list api * fix: re-download npm package when restart app * fix: plugin delete api * feat: plugin detail api * feat: zipUrl add api * fix: upload api bug * fix: plugin detail info * feat: upgrade api * fix: upload api * feat: handle plugin load error * feat: support authToken * feat: muti lang * fix: build error * fix: self review * Update plugin-manager.ts * fix: bug * fix: bug * fix: bug * fix: bug * fix: bug * fix: bugs * fix: detail click and remove isOfficial * fix: upgrade no refresh * fix: file size and type check * fix: bug * fix: upgrade error * fix: bug * fix: bug * fix: plugin card layout * fix: handling exceptional cases * fix: tgz file support * fix: macos compress file * fix: bug * fix: bug * fix: bug * fix: bug * fix: add upgrade npm type * fix: bugs * fix: bug * fix: change plugins static expose url * fix: api prefix * fix: bug * fix: add nginx `/static/plugin/` path * fix: bugs and pr docker build no dts * fix: bug * fix: build tools bug * fix: improve code * fix: build bug * feat: improve plugin info * fix: ui bug * fix: plugin document bug * feat: improve code * feat: improve code * feat: process dev deps check * feat: improve code * feat: process.env.IS_DEV_CMD * fix: do not delete the plugin package * feat: plugin symlink * fix: tsx watch --ignore=./storage/plugins/** * fix: test error * fix: improve code * fix: improve code * fix: emitStartedEvent * fix: improve code * fix: type error * fix: test error * test: console.log * fix: createStoragePluginSymLink * fix: clientStaticMiddleware rename to clientStaticUtils * feat: build tools support plugins folder * fix: 350px * fix: error * feat: client dev support plugin folder * fix: clear cli options * fix: typeError: Converting circular structure to JSON * fix: plugin name * chore: restart application after command * feat: upgrade error & docs * Update v14-changelog.md * Update v14-changelog.md * Update v14-changelog.md * fix: gateway test * refactor(plugin-workflow): add ready state for gracefully tearing down * Revert "chore: restart application after command" This reverts commit 5015274f8e4e06e506e15754b672330330e8c7f8. * chore: stop application whe restart * T 1218 change plugin folder (#2629) * feat: change folder name * feat: change `pm create` command * feat: revert plugin name change * fix: delete samples * feat: change plugins folder * fix: pm create * feat: update docs * fix: link package error * fix: docs * fix: create command * fix: pm add error * fix: create add build * fix: pm creatre + add * feat: add tar command * fix: docs * fix: bug * fix: docs --------- Co-authored-by: chenos <chenlinxh@gmail.com> * feat: docs * Update your-fisrt-plugin.md * Update your-fisrt-plugin.md * chore: application reload * chore: test * fix: pm add error * chore: preset install skip exists plugin * fix: createIfNotExists --------- Co-authored-by: chenos <chenlinxh@gmail.com> Co-authored-by: chareice <chareice@live.com> Co-authored-by: Zhou <zhou.working@gmail.com> Co-authored-by: mytharcher <mytharcher@gmail.com>
205 lines
6.4 KiB
TypeScript
205 lines
6.4 KiB
TypeScript
import { ArrayField } from '@formily/core';
|
|
import { ISchema, Schema, useForm } from '@formily/react';
|
|
import { CollectionFieldOptions, useACLRoleContext, useCollectionManager } from '@nocobase/client';
|
|
import { useContext } from 'react';
|
|
import { useTranslation } from 'react-i18next';
|
|
import { ChartConfigContext } from '../configure/ChartConfigure';
|
|
import formatters from '../block/formatters';
|
|
import { useChartsTranslation } from '../locale';
|
|
import { ChartRendererContext } from '../renderer';
|
|
import { getField, getSelectedFields, parseField, processData } from '../utils';
|
|
|
|
export type FieldOption = {
|
|
value: string;
|
|
label: string;
|
|
key: string;
|
|
alias?: string;
|
|
name?: string;
|
|
type?: string;
|
|
interface?: string;
|
|
uiSchema?: ISchema;
|
|
target?: string;
|
|
targetFields?: FieldOption[];
|
|
};
|
|
|
|
export const useFields = (
|
|
collection?: string,
|
|
): (CollectionFieldOptions & {
|
|
key: string;
|
|
label: string;
|
|
value: string;
|
|
})[] => {
|
|
const { current } = useContext(ChartConfigContext);
|
|
if (!collection) {
|
|
collection = current?.collection || '';
|
|
}
|
|
const { getCollectionFields } = useCollectionManager();
|
|
const fields = (getCollectionFields(collection) || [])
|
|
.filter((field) => {
|
|
return field.interface;
|
|
})
|
|
.map((field) => ({
|
|
...field,
|
|
key: field.name,
|
|
label: field.uiSchema?.title || field.name,
|
|
value: field.name,
|
|
}));
|
|
return fields;
|
|
};
|
|
|
|
export const useFieldsWithAssociation = (collection?: string) => {
|
|
const { getCollectionFields, getInterface } = useCollectionManager();
|
|
const { t } = useTranslation();
|
|
const fields = useFields(collection);
|
|
return fields.map((field) => {
|
|
const filterable = getInterface(field.interface)?.filterable;
|
|
const label = Schema.compile(field.uiSchema?.title || field.name, { t });
|
|
if (!(filterable && (filterable?.nested || filterable?.children?.length))) {
|
|
return { ...field, label };
|
|
}
|
|
let targetFields = [];
|
|
if (filterable?.nested) {
|
|
const nestedFields = (getCollectionFields(field.target) || [])
|
|
.filter((targetField) => {
|
|
return targetField.interface;
|
|
})
|
|
.map((targetField) => ({
|
|
...targetField,
|
|
key: `${field.name}.${targetField.name}`,
|
|
label: `${label} / ${Schema.compile(targetField.uiSchema?.title || targetField.name, { t })}`,
|
|
value: `${field.name}.${targetField.name}`,
|
|
}));
|
|
targetFields = [...targetFields, ...nestedFields];
|
|
}
|
|
|
|
if (filterable?.children?.length) {
|
|
const children = filterable.children.map((child: any) => ({
|
|
...child,
|
|
key: `${field.name}.${child.name}`,
|
|
label: `${label} / ${Schema.compile(child.schema?.title || child.title || child.name, { t })}`,
|
|
value: `${field.name}.${child.name}`,
|
|
}));
|
|
targetFields = [...targetFields, ...children];
|
|
}
|
|
|
|
return {
|
|
...field,
|
|
label,
|
|
targetFields,
|
|
};
|
|
});
|
|
};
|
|
|
|
export const useChartFields = (fields: FieldOption[]) => (field: any) => {
|
|
const query = field.query('query').get('value') || {};
|
|
const selectedFields = getSelectedFields(fields, query);
|
|
field.dataSource = selectedFields;
|
|
};
|
|
|
|
export const useFormatters = (fields: FieldOption[]) => (field: any) => {
|
|
const selectedField = field.query('.field').get('value');
|
|
if (!selectedField) {
|
|
field.dataSource = [];
|
|
return;
|
|
}
|
|
let options = [];
|
|
const fieldInterface = getField(fields, selectedField)?.interface;
|
|
switch (fieldInterface) {
|
|
case 'datetime':
|
|
case 'createdAt':
|
|
case 'updatedAt':
|
|
options = formatters.datetime;
|
|
break;
|
|
case 'date':
|
|
options = formatters.date;
|
|
break;
|
|
case 'time':
|
|
options = formatters.time;
|
|
break;
|
|
default:
|
|
options = [];
|
|
}
|
|
field.dataSource = options;
|
|
};
|
|
|
|
export const useCollectionOptions = () => {
|
|
const { t } = useTranslation();
|
|
const { collections } = useCollectionManager();
|
|
const { allowAll, parseAction } = useACLRoleContext();
|
|
const options = collections
|
|
.filter((collection: { name: string }) => {
|
|
if (allowAll) {
|
|
return true;
|
|
}
|
|
const params = parseAction(`${collection.name}:list`);
|
|
return params;
|
|
})
|
|
.map((collection: { name: string; title: string }) => ({
|
|
label: collection.title,
|
|
value: collection.name,
|
|
key: collection.name,
|
|
}));
|
|
return Schema.compile(options, { t });
|
|
};
|
|
|
|
export const useOrderFieldsOptions = (defaultOptions: any[], fields: FieldOption[]) => (field: any) => {
|
|
const query = field.query('query').get('value') || {};
|
|
const { measures = [] } = query;
|
|
const hasAgg = measures.some((measure: { aggregation?: string }) => measure.aggregation);
|
|
if (!hasAgg) {
|
|
field.componentProps.fieldNames = {
|
|
label: 'title',
|
|
value: 'name',
|
|
children: 'children',
|
|
};
|
|
field.dataSource = defaultOptions;
|
|
return;
|
|
}
|
|
const selectedFields = getSelectedFields(fields, query);
|
|
field.componentProps.fieldNames = {};
|
|
field.dataSource = selectedFields;
|
|
};
|
|
|
|
export const useOrderReaction = (defaultOptions: any[], fields: FieldOption[]) => (field: ArrayField) => {
|
|
const query = field.query('query').get('value') || {};
|
|
const { measures = [] } = query;
|
|
const hasAgg = measures.some((measure: { aggregation?: string }) => measure.aggregation);
|
|
let dataSource = defaultOptions;
|
|
const allValues = [];
|
|
if (hasAgg) {
|
|
dataSource = getSelectedFields(fields, query);
|
|
dataSource.forEach((field) => {
|
|
allValues.push(field.value);
|
|
});
|
|
} else {
|
|
dataSource.forEach((field) => {
|
|
const children = field.children || [];
|
|
if (!children.length) {
|
|
allValues.push(field.value || field.name);
|
|
}
|
|
children.forEach((child: any) => {
|
|
allValues.push(`${field.name}.${child.name}`);
|
|
});
|
|
});
|
|
}
|
|
|
|
const orders = field.value || [];
|
|
const newOrders = orders.reduce((newOrders: any[], item: any) => {
|
|
const { alias } = parseField(item.field);
|
|
if (!item.field || allValues.includes(alias)) {
|
|
newOrders.push(item);
|
|
}
|
|
return newOrders;
|
|
}, []);
|
|
field.setValue(newOrders);
|
|
};
|
|
|
|
export const useData = (data?: any[], collection?: string) => {
|
|
const { t } = useChartsTranslation();
|
|
const { service, query } = useContext(ChartRendererContext);
|
|
const fields = useFieldsWithAssociation(collection);
|
|
const form = useForm();
|
|
const selectedFields = getSelectedFields(fields, form?.values?.query || query);
|
|
return processData(selectedFields, service?.data || data || [], { t });
|
|
};
|