diff --git a/packages/app/src/components/pages/CollectionLoader/CollectionSingle.tsx b/packages/app/src/components/pages/CollectionLoader/CollectionSingle.tsx
index 8ff164498..2c9aaa8b6 100644
--- a/packages/app/src/components/pages/CollectionLoader/CollectionSingle.tsx
+++ b/packages/app/src/components/pages/CollectionLoader/CollectionSingle.tsx
@@ -8,27 +8,38 @@ import { Spin } from '@nocobase/client';
import { Helmet } from 'umi';
export function CollectionSingle(props) {
- console.log(props);
+ // console.log(props);
const { item = {} } = props;
- const { tabs = [] } = props.collection;
- const activeTab = tabs.find(tab => tab.name == item.tabName)||{};
- console.log(activeTab);
- const { data = {}, loading } = useRequest(() => activeTab && api.resource(activeTab.collection_name).getPageInfo({
- resourceKey: item.itemId,
+ const { data: collections = [], loading: collectionLoading } = useRequest(() => api.resource(props.match.params['collection']).getCollections({
+ values: {
+ tabs: props.match.params['items']
+ }
}));
+ // const { data = {}, loading } = useRequest(() => currentTab && api.resource(currentTab.collection_name).getPageInfo({
+ // resourceKey: item.itemId,
+ // }));
+
const [activing, setActiving] = useState(false);
+ if (collectionLoading) {
+ return ;
+ }
+
+ const collection = collections[props.itemIndex]||{};
+
+ const { tabs = [] } = collection;
+ const activeTab = tabs.find(tab => tab.name == item.tabName)||{};
+ console.log({tabs, activeTab, item});
+
if (!activeTab) {
return null;
}
- if (loading) {
- return ;
- }
+
return (
- {data.pageTitle}
+ {collection.pageTitle}
Operation,
@@ -68,7 +79,7 @@ export function CollectionSingle(props) {
}
/>
-
+
);
diff --git a/packages/app/src/components/pages/CollectionLoader/index.tsx b/packages/app/src/components/pages/CollectionLoader/index.tsx
index 8df491106..e2563e6e0 100644
--- a/packages/app/src/components/pages/CollectionLoader/index.tsx
+++ b/packages/app/src/components/pages/CollectionLoader/index.tsx
@@ -3,8 +3,9 @@ import Breadcrumb from './Breadcrumb';
import CollectionIndex from './CollectionIndex';
import CollectionSingle from './CollectionSingle';
import './style.less';
-import { useRequest, request, Spin } from '@nocobase/client';
+import { request, Spin } from '@nocobase/client';
import api from '@/api-client';
+import { useRequest } from 'umi';
export function CollectionLoader(props: any) {
let { path, pagepath, collection } = props.match.params;
@@ -27,6 +28,14 @@ export function CollectionLoader(props: any) {
console.log('props.match', props.match, path);
const { data = {}, error, loading, run } = useRequest(() => api.resource(collection).getCollection());
+ // const { data: collections = [], loading } = useRequest(() => api.resource(collection).getCollections({
+ // values: {
+ // tabs: items,
+ // },
+ // }), {
+ // // refreshDeps: [items],
+ // });
+
if (loading) {
return ;
}
@@ -34,17 +43,17 @@ export function CollectionLoader(props: any) {
return (
- { items.length === 0 && }
+ { items.length === 0 && }
{items.length > 0 && (
{/*
{items.map(item => )}
*/}
- {items.map(item => {
+ {items.map((item, index) => {
return (
-
+
);
})}
diff --git a/packages/plugin-pages/src/actions/getCollections.ts b/packages/plugin-pages/src/actions/getCollections.ts
new file mode 100644
index 000000000..e79ed74f8
--- /dev/null
+++ b/packages/plugin-pages/src/actions/getCollections.ts
@@ -0,0 +1,105 @@
+import { Model, ModelCtor } from '@nocobase/database';
+import _ from 'lodash';
+
+async function getPageTitle(ctx, {resourceName, resourceKey}) {
+ // const { resourceName, resourceKey } = ctx.action.params;
+ const M = ctx.db.getModel(resourceName) as ModelCtor
;
+ const model = await M.findByPk(resourceKey);
+ const Field = ctx.db.getModel('fields') as ModelCtor;
+ const field = await Field.findOne({
+ where: {
+ collection_name: resourceName,
+ type: 'string',
+ },
+ order: [['sort', 'asc']],
+ });
+ return field ? (model.get(field.get('name')) || `#${model.get(M.primaryKeyAttribute)} 无标题`) : model.get(M.primaryKeyAttribute);
+};
+
+
+async function getCollection(ctx, resourceName) {
+ const [Collection, Field, Tab, View] = ctx.db.getModels(['collections', 'fields', 'tabs', 'views']) as ModelCtor[];
+ const collection = await Collection.findOne(Collection.parseApiJson({
+ filter: {
+ name: resourceName,
+ },
+ }));
+ const permissions = (await ctx.ac.isRoot() || collection.developerMode || collection.internal)
+ ? await ctx.ac.can(resourceName).getRootPermissions()
+ : await ctx.ac.can(resourceName).permissions();
+ const defaultView = await collection.getViews({
+ where: {
+ default: true,
+ },
+ limit: 1,
+ plain: true,
+ });
+ collection.setDataValue('defaultViewName', defaultView.get('name'));
+ const options = Tab.parseApiJson({
+ filter: ctx.state.developerMode ? {
+ 'id.in': permissions.tabs,
+ enabled: true,
+ } : {
+ 'id.in': permissions.tabs,
+ enabled: true,
+ developerMode: {'$isFalsy': true},
+ },
+ fields: {
+ appends: ['associationField'],
+ },
+ sort: ['sort'],
+ });
+ const tabs = await collection.getTabs(options) as Model[];
+ const tabItems = [];
+ for (const tab of tabs) {
+ const itemTab = {
+ ...tab.get(),
+ };
+ if (itemTab.type === 'details' && !itemTab.viewName) {
+ itemTab.viewName = 'details';
+ }
+ // if (itemTab.type == 'association') {
+ // itemTab.field = await collection.getFields({
+ // where: {
+ // name: itemTab.association,
+ // },
+ // limit: 1,
+ // plain: true,
+ // });
+ // }
+ tabItems.push(itemTab);
+ }
+ return {
+ ...collection.toJSON(),
+ tabs: tabItems,
+ };
+}
+
+export default async (ctx, next) => {
+ const { resourceName, values = {} } = ctx.action.params;
+ const { tabs: items = [] } = values;
+ // console.log({items})
+ const collection = await getCollection(ctx, resourceName);
+
+ ctx.body = [
+ collection,
+ ];
+
+ const lastItem = items.pop();
+
+ for (const item of items) {
+ const lastCollection = ctx.body[ctx.body.length-1];
+ lastCollection.pageTitle = await getPageTitle(ctx, {resourceName: lastCollection.name, resourceKey: item.itemId});
+ const activeTab = _.find(lastCollection.tabs, tab => tab.name == item.tabName)||{};
+ if (activeTab && activeTab.type === 'association') {
+ // console.log(activeTab.associationField.target);
+ const nextCollection = await getCollection(ctx, activeTab.associationField.target);
+ ctx.body.push(nextCollection);
+ }
+ }
+
+ const lastCollection = ctx.body[ctx.body.length-1];
+ lastCollection.pageTitle = await getPageTitle(ctx, {resourceName: lastCollection.name, resourceKey: lastItem.itemId});
+
+ await next();
+}
diff --git a/packages/plugin-pages/src/server.ts b/packages/plugin-pages/src/server.ts
index 7f7299dff..51f7e3d94 100644
--- a/packages/plugin-pages/src/server.ts
+++ b/packages/plugin-pages/src/server.ts
@@ -6,6 +6,7 @@ import getView from './actions/getView';
import getRoutes from './actions/getRoutes';
import getPageInfo from './actions/getPageInfo';
import * as rolesPagesActions from './actions/roles.pages';
+import getCollections from './actions/getCollections';
export default async function (options = {}) {
const database: Database = this.database;
@@ -18,6 +19,7 @@ export default async function (options = {}) {
resourcer.registerActionHandler('getCollection', getCollection);
resourcer.registerActionHandler('getView', getView);
resourcer.registerActionHandler('getPageInfo', getPageInfo);
+ resourcer.registerActionHandler('getCollections', getCollections);
resourcer.registerActionHandler('pages:getRoutes', getRoutes);
Object.keys(rolesPagesActions).forEach(actionName => {