parent
fb997bc6b3
commit
883f1e6fd1
@ -13,4 +13,11 @@ packages/element
|
||||
esm
|
||||
doc-site
|
||||
public
|
||||
package
|
||||
packages/*/*/client.d.ts
|
||||
packages/*/*/server.d.ts
|
||||
packages/*/*/client.js
|
||||
packages/*/*/server.js
|
||||
packages/core/build
|
||||
packages/core/dumi-theme-nocobase
|
||||
packages/core/devtools
|
||||
packages/core/database/src/sql-parser/index.js
|
46
.eslintrc
46
.eslintrc
@ -1,20 +1,46 @@
|
||||
{
|
||||
"extends": [
|
||||
"eslint:recommended",
|
||||
"plugin:@typescript-eslint/recommended",
|
||||
"plugin:react/recommended",
|
||||
"plugin:react-hooks/recommended",
|
||||
"plugin:promise/recommended",
|
||||
// "plugin:import/recommended",
|
||||
"plugin:prettier/recommended"
|
||||
],
|
||||
"parser": "@typescript-eslint/parser",
|
||||
"env": {
|
||||
"node": true
|
||||
},
|
||||
"plugins": [
|
||||
"@typescript-eslint",
|
||||
"react",
|
||||
"react-hooks",
|
||||
"prettier",
|
||||
"promise"
|
||||
//"import"
|
||||
],
|
||||
"globals": {
|
||||
"sleep": true,
|
||||
"prettyFormat": true
|
||||
},
|
||||
"parserOptions": {
|
||||
"ecmaVersion": 2018,
|
||||
"sourceType": "module"
|
||||
"settings": {
|
||||
"react": {
|
||||
"version": "detect"
|
||||
}
|
||||
},
|
||||
"parserOptions": {
|
||||
"ecmaVersion": 11,
|
||||
"sourceType": "module",
|
||||
"ecmaFeatures": {
|
||||
"jsx": true
|
||||
}
|
||||
},
|
||||
"plugins": [
|
||||
"react-hooks"
|
||||
],
|
||||
"rules": {
|
||||
"react-hooks/rules-of-hooks": "error"
|
||||
"no-unused-vars": "off",
|
||||
"@typescript-eslint/no-unused-vars": "off",
|
||||
"no-empty-function": "off",
|
||||
"@typescript-eslint/no-empty-function": "off",
|
||||
"react/display-name": "off",
|
||||
"react/prop-types": "off",
|
||||
"no-explicit-any": "off",
|
||||
"@typescript-eslint/no-explicit-any": "off"
|
||||
}
|
||||
}
|
||||
|
1614
CHANGELOG.md
Normal file
1614
CHANGELOG.md
Normal file
File diff suppressed because it is too large
Load Diff
@ -1 +1 @@
|
||||
module.exports = { extends: ['@commitlint/config-conventional'] }
|
||||
module.exports = { extends: ['@commitlint/config-conventional'] };
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -32,7 +32,7 @@ app.acl.define({
|
||||
role: 'admin',
|
||||
actions: {
|
||||
'test:export': {
|
||||
fields: ['a1', 'b1']
|
||||
fields: ['a1', 'b1'],
|
||||
},
|
||||
},
|
||||
});
|
||||
|
@ -36,4 +36,3 @@ if (require.main === module) {
|
||||
}
|
||||
|
||||
export default app;
|
||||
|
||||
|
@ -37,7 +37,7 @@ app.resource({
|
||||
ctx.body = ctx.body || [];
|
||||
ctx.body.push('test list');
|
||||
await next();
|
||||
}
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
|
@ -22,6 +22,10 @@
|
||||
"postinstall": "nocobase postinstall",
|
||||
"lint": "eslint .",
|
||||
"clean": "nocobase clean",
|
||||
"changelog": "yarn changelog:root && yarn changelog:zh-CN && yarn changelog:en-US",
|
||||
"changelog:root": "auto-changelog -p -t keepachangelog",
|
||||
"changelog:zh-CN": "auto-changelog -p -t keepachangelog -o docs/zh-CN/welcome/release/index.md",
|
||||
"changelog:en-US": "auto-changelog -p -t keepachangelog -o docs/en-US/welcome/release/index.md",
|
||||
"version:alpha": "lerna version prerelease --preid alpha --force-publish=* --no-git-tag-version -m \"chore(versions): publish packages %s\"",
|
||||
"release:force": "lerna publish from-package --yes",
|
||||
"release": "lerna publish",
|
||||
@ -40,6 +44,7 @@
|
||||
"@commitlint/cli": "^16.1.0",
|
||||
"@commitlint/config-conventional": "^16.0.0",
|
||||
"@commitlint/prompt-cli": "^16.1.0",
|
||||
"auto-changelog": "^2.4.0",
|
||||
"ghooks": "^2.0.4",
|
||||
"prettier": "^2.2.1",
|
||||
"pretty-format": "^24.0.0",
|
||||
|
4
packages/app/client/typings.d.ts
vendored
4
packages/app/client/typings.d.ts
vendored
@ -2,9 +2,7 @@ declare module '*.css';
|
||||
declare module '*.less';
|
||||
declare module '*.png';
|
||||
declare module '*.svg' {
|
||||
export function ReactComponent(
|
||||
props: React.SVGProps<SVGSVGElement>,
|
||||
): React.ReactElement;
|
||||
export function ReactComponent(props: React.SVGProps<SVGSVGElement>): React.ReactElement;
|
||||
const url: string;
|
||||
export default url;
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { createDefaultCacheConfig } from '@nocobase/cache';
|
||||
|
||||
const cacheConfig = !!process.env.CACHE_CONFIG ? JSON.parse(process.env.CACHE_CONFIG) : createDefaultCacheConfig();
|
||||
const cacheConfig = process.env.CACHE_CONFIG ? JSON.parse(process.env.CACHE_CONFIG) : createDefaultCacheConfig();
|
||||
|
||||
export default cacheConfig;
|
||||
|
@ -2,5 +2,5 @@ import { AppLoggerOptions } from '@nocobase/logger';
|
||||
|
||||
export default {
|
||||
transports: process.env.LOGGER_TRANSPORT || ['console', 'dailyRotateFile'],
|
||||
level: process.env.LOGGER_LEVEL || (process.env.APP_ENV === 'development' ? 'debug' : 'info')
|
||||
level: process.env.LOGGER_LEVEL || (process.env.APP_ENV === 'development' ? 'debug' : 'info'),
|
||||
} as AppLoggerOptions;
|
||||
|
@ -87,7 +87,7 @@ export class AllowManager {
|
||||
aclMiddleware() {
|
||||
return async (ctx, next) => {
|
||||
const { resourceName, actionName } = ctx.action;
|
||||
let skip = await this.acl.allowManager.isAllowed(resourceName, actionName, ctx);
|
||||
const skip = await this.acl.allowManager.isAllowed(resourceName, actionName, ctx);
|
||||
|
||||
if (skip) {
|
||||
ctx.permission = {
|
||||
|
@ -5,4 +5,3 @@ export * from './acl-resource';
|
||||
export * from './acl-role';
|
||||
export * from './no-permission-error';
|
||||
export * from './skip-middleware';
|
||||
|
||||
|
@ -45,7 +45,7 @@ export class SortAbleCollection {
|
||||
field: SortField;
|
||||
scopeKey: string;
|
||||
|
||||
constructor(collection: Collection, fieldName: string = 'sort') {
|
||||
constructor(collection: Collection, fieldName = 'sort') {
|
||||
this.collection = collection;
|
||||
this.field = collection.getField(fieldName);
|
||||
|
||||
@ -112,7 +112,7 @@ export class SortAbleCollection {
|
||||
targetSort = targetSort + 1;
|
||||
}
|
||||
|
||||
let scopeValue = this.scopeKey ? sourceInstance.get(this.scopeKey) : null;
|
||||
const scopeValue = this.scopeKey ? sourceInstance.get(this.scopeKey) : null;
|
||||
let updateCondition;
|
||||
let change;
|
||||
|
||||
|
@ -20,8 +20,7 @@ describe('cache', () => {
|
||||
});
|
||||
|
||||
it('createCache-with-single-config', async () => {
|
||||
let cacheConfigStr =
|
||||
'{"store":"memory","ttl":1,"max":10}';
|
||||
let cacheConfigStr = '{"store":"memory","ttl":1,"max":10}';
|
||||
let cacheConfig = JSON.parse(cacheConfigStr);
|
||||
let cache = createCache(cacheConfig);
|
||||
await cache.set('name', 'Emma');
|
||||
@ -31,8 +30,7 @@ describe('cache', () => {
|
||||
await sleep(1005);
|
||||
expect(await cache.get('name')).toBeUndefined();
|
||||
|
||||
cacheConfigStr =
|
||||
'[{"store":"memory","ttl":1,"max":10}]';
|
||||
cacheConfigStr = '[{"store":"memory","ttl":1,"max":10}]';
|
||||
cacheConfig = JSON.parse(cacheConfigStr);
|
||||
cache = createCache(cacheConfig);
|
||||
await cache.set('name', 'Emma');
|
||||
|
2
packages/core/cache/src/index.ts
vendored
2
packages/core/cache/src/index.ts
vendored
@ -50,7 +50,7 @@ export function createCache(cacheConfig: ICacheConfig | ICacheConfig[] = createD
|
||||
if (cacheConfig.length === 1) {
|
||||
return createCacheByICacheConfig(cacheConfig[0]);
|
||||
} else {
|
||||
let caches = [];
|
||||
const caches = [];
|
||||
for (const cacheConfigEle of cacheConfig) {
|
||||
caches.push(createCacheByICacheConfig(cacheConfigEle));
|
||||
}
|
||||
|
@ -1,4 +1,3 @@
|
||||
// @ts-nocheck
|
||||
export * from './lib/client';
|
||||
export { default } from './lib/client';
|
||||
|
||||
|
@ -1,30 +1,65 @@
|
||||
"use strict";
|
||||
'use strict';
|
||||
|
||||
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
||||
function _getRequireWildcardCache(nodeInterop) {
|
||||
if (typeof WeakMap !== 'function') return null;
|
||||
var cacheBabelInterop = new WeakMap();
|
||||
var cacheNodeInterop = new WeakMap();
|
||||
return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {
|
||||
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
||||
})(nodeInterop);
|
||||
}
|
||||
|
||||
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
||||
function _interopRequireWildcard(obj, nodeInterop) {
|
||||
if (!nodeInterop && obj && obj.__esModule) {
|
||||
return obj;
|
||||
}
|
||||
if (obj === null || (typeof obj !== 'object' && typeof obj !== 'function')) {
|
||||
return { default: obj };
|
||||
}
|
||||
var cache = _getRequireWildcardCache(nodeInterop);
|
||||
if (cache && cache.has(obj)) {
|
||||
return cache.get(obj);
|
||||
}
|
||||
var newObj = {};
|
||||
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
||||
for (var key in obj) {
|
||||
if (key !== 'default' && Object.prototype.hasOwnProperty.call(obj, key)) {
|
||||
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
||||
if (desc && (desc.get || desc.set)) {
|
||||
Object.defineProperty(newObj, key, desc);
|
||||
} else {
|
||||
newObj[key] = obj[key];
|
||||
}
|
||||
}
|
||||
}
|
||||
newObj.default = obj;
|
||||
if (cache) {
|
||||
cache.set(obj, newObj);
|
||||
}
|
||||
return newObj;
|
||||
}
|
||||
|
||||
var _index = _interopRequireWildcard(require("./lib/client"));
|
||||
var _index = _interopRequireWildcard(require('./lib/client'));
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
Object.defineProperty(exports, '__esModule', {
|
||||
value: true,
|
||||
});
|
||||
var _exportNames = {};
|
||||
Object.defineProperty(exports, "default", {
|
||||
Object.defineProperty(exports, 'default', {
|
||||
enumerable: true,
|
||||
get: function get() {
|
||||
return _index.default;
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
Object.keys(_index).forEach(function (key) {
|
||||
if (key === "default" || key === "__esModule") return;
|
||||
if (key === 'default' || key === '__esModule') return;
|
||||
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
||||
if (key in exports && exports[key] === _index[key]) return;
|
||||
Object.defineProperty(exports, key, {
|
||||
enumerable: true,
|
||||
get: function get() {
|
||||
return _index[key];
|
||||
}
|
||||
},
|
||||
});
|
||||
});
|
||||
|
@ -1,4 +1,3 @@
|
||||
// @ts-nocheck
|
||||
export * from './lib/server';
|
||||
export { default } from './lib/server';
|
||||
|
||||
|
@ -1,30 +1,65 @@
|
||||
"use strict";
|
||||
'use strict';
|
||||
|
||||
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
||||
function _getRequireWildcardCache(nodeInterop) {
|
||||
if (typeof WeakMap !== 'function') return null;
|
||||
var cacheBabelInterop = new WeakMap();
|
||||
var cacheNodeInterop = new WeakMap();
|
||||
return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {
|
||||
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
||||
})(nodeInterop);
|
||||
}
|
||||
|
||||
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
||||
function _interopRequireWildcard(obj, nodeInterop) {
|
||||
if (!nodeInterop && obj && obj.__esModule) {
|
||||
return obj;
|
||||
}
|
||||
if (obj === null || (typeof obj !== 'object' && typeof obj !== 'function')) {
|
||||
return { default: obj };
|
||||
}
|
||||
var cache = _getRequireWildcardCache(nodeInterop);
|
||||
if (cache && cache.has(obj)) {
|
||||
return cache.get(obj);
|
||||
}
|
||||
var newObj = {};
|
||||
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
||||
for (var key in obj) {
|
||||
if (key !== 'default' && Object.prototype.hasOwnProperty.call(obj, key)) {
|
||||
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
||||
if (desc && (desc.get || desc.set)) {
|
||||
Object.defineProperty(newObj, key, desc);
|
||||
} else {
|
||||
newObj[key] = obj[key];
|
||||
}
|
||||
}
|
||||
}
|
||||
newObj.default = obj;
|
||||
if (cache) {
|
||||
cache.set(obj, newObj);
|
||||
}
|
||||
return newObj;
|
||||
}
|
||||
|
||||
var _index = _interopRequireWildcard(require("./lib/server"));
|
||||
var _index = _interopRequireWildcard(require('./lib/server'));
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
Object.defineProperty(exports, '__esModule', {
|
||||
value: true,
|
||||
});
|
||||
var _exportNames = {};
|
||||
Object.defineProperty(exports, "default", {
|
||||
Object.defineProperty(exports, 'default', {
|
||||
enumerable: true,
|
||||
get: function get() {
|
||||
return _index.default;
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
Object.keys(_index).forEach(function (key) {
|
||||
if (key === "default" || key === "__esModule") return;
|
||||
if (key === 'default' || key === '__esModule') return;
|
||||
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
||||
if (key in exports && exports[key] === _index[key]) return;
|
||||
Object.defineProperty(exports, key, {
|
||||
enumerable: true,
|
||||
get: function get() {
|
||||
return _index[key];
|
||||
}
|
||||
},
|
||||
});
|
||||
});
|
||||
|
@ -19,7 +19,7 @@ const getParentKeys = (tree, func, path = []) => {
|
||||
return [];
|
||||
};
|
||||
const getChildrenKeys = (data = [], arr = []) => {
|
||||
for (let item of data) {
|
||||
for (const item of data) {
|
||||
arr.push(item.key);
|
||||
if (item.children && item.children.length) getChildrenKeys(item.children, arr);
|
||||
}
|
||||
|
@ -31,7 +31,7 @@ const getParentUids = (tree, func, path = []) => {
|
||||
return [];
|
||||
};
|
||||
const getChildrenUids = (data = [], arr = []) => {
|
||||
for (let item of data) {
|
||||
for (const item of data) {
|
||||
arr.push(item.uid);
|
||||
if (item.children && item.children.length) getChildrenUids(item.children, arr);
|
||||
}
|
||||
@ -116,8 +116,8 @@ export const MenuConfigure = () => {
|
||||
refresh();
|
||||
message.success(t('Saved successfully'));
|
||||
}}
|
||||
/>
|
||||
{' '}{t('Accessible')}
|
||||
/>{' '}
|
||||
{t('Accessible')}
|
||||
</>
|
||||
),
|
||||
render: (_, schema) => {
|
||||
|
@ -27,7 +27,10 @@ export const RoleTable = () => {
|
||||
return (
|
||||
<div>
|
||||
<AvailableActionsProver>
|
||||
<SchemaComponent schema={roleSchema} components={{ MenuItemsProvider, SettingCenterPermissionProvider,PermissionProvider }} />
|
||||
<SchemaComponent
|
||||
schema={roleSchema}
|
||||
components={{ MenuItemsProvider, SettingCenterPermissionProvider, PermissionProvider }}
|
||||
/>
|
||||
</AvailableActionsProver>
|
||||
</div>
|
||||
);
|
||||
|
@ -22,5 +22,5 @@ describe('APIClient', () => {
|
||||
const apiClient = new APIClient(instance);
|
||||
expect(apiClient.axios).toBe(instance);
|
||||
});
|
||||
})
|
||||
});
|
||||
});
|
||||
|
@ -10,9 +10,7 @@ mock.onGet('/users:get').reply(200, {
|
||||
data: { id: 1, name: 'John Smith' },
|
||||
});
|
||||
|
||||
const providers = [
|
||||
[APIClientProvider, { apiClient }]
|
||||
];
|
||||
const providers = [[APIClientProvider, { apiClient }]];
|
||||
|
||||
export default compose(...providers)(() => {
|
||||
const { data } = useRequest({
|
||||
|
@ -10,9 +10,7 @@ mock.onGet('/users:get').reply(200, {
|
||||
data: { id: 1, name: 'John Smith' },
|
||||
});
|
||||
|
||||
const providers = [
|
||||
[APIClientProvider, { apiClient }]
|
||||
];
|
||||
const providers = [[APIClientProvider, { apiClient }]];
|
||||
|
||||
export default compose(...providers)(() => {
|
||||
const { data } = useRequest({
|
||||
|
@ -1,4 +1,3 @@
|
||||
export * from './useAPIClient';
|
||||
export * from './useRequest';
|
||||
export * from './useResource';
|
||||
|
||||
|
@ -21,7 +21,7 @@ import {
|
||||
SignupPage,
|
||||
SystemSettingsProvider,
|
||||
SystemSettingsShortcut,
|
||||
useRequest
|
||||
useRequest,
|
||||
} from '@nocobase/client';
|
||||
import { Spin } from 'antd';
|
||||
import React from 'react';
|
||||
|
@ -1,3 +1,2 @@
|
||||
export * from './Application';
|
||||
export * from './compose';
|
||||
|
||||
|
@ -12,7 +12,7 @@ const formatData = (
|
||||
fieldNames,
|
||||
tasks: any[] = [],
|
||||
projectId: any = undefined,
|
||||
hideChildren: boolean = false,
|
||||
hideChildren = false,
|
||||
checkPermassion?: Function,
|
||||
) => {
|
||||
data.forEach((item: any) => {
|
||||
|
@ -187,7 +187,7 @@ export const useTableBlockProps = () => {
|
||||
ctx.service.refresh();
|
||||
},
|
||||
onChange({ current, pageSize }, filters, sorter) {
|
||||
let sort = sorter.order
|
||||
const sort = sorter.order
|
||||
? sorter.order === `ascend`
|
||||
? [sorter.field]
|
||||
: [`-${sorter.field}`]
|
||||
|
@ -86,7 +86,7 @@ function getFormValues(filterByTk, field, form, fieldNames, getField, resource)
|
||||
}
|
||||
console.log('form.values', form.values);
|
||||
return form.values;
|
||||
let values = {};
|
||||
const values = {};
|
||||
for (const key in form.values) {
|
||||
if (fieldNames.includes(key)) {
|
||||
const collectionField = getField(key);
|
||||
@ -494,7 +494,7 @@ export const useCustomizeBulkEditActionProps = () => {
|
||||
if (!skipValidator) {
|
||||
await form.submit();
|
||||
}
|
||||
let values = cloneDeep(form.values);
|
||||
const values = cloneDeep(form.values);
|
||||
actionField.data = field.data || {};
|
||||
actionField.data.loading = true;
|
||||
for (const key in values) {
|
||||
@ -668,7 +668,7 @@ export const useUpdateActionProps = () => {
|
||||
await form.submit();
|
||||
}
|
||||
const fieldNames = fields.map((field) => field.name);
|
||||
let values = getFormValues(filterByTk, field, form, fieldNames, getField, resource);
|
||||
const values = getFormValues(filterByTk, field, form, fieldNames, getField, resource);
|
||||
actionField.data = field.data || {};
|
||||
actionField.data.loading = true;
|
||||
try {
|
||||
|
@ -9,5 +9,5 @@ export * from './TableBlockProvider';
|
||||
export * from './TableFieldProvider';
|
||||
export * from './TableSelectorProvider';
|
||||
export * from './FormFieldProvider';
|
||||
export * from './GanttBlockProvider'
|
||||
export * from './GanttBlockProvider';
|
||||
export * from './SharedFilterProvider';
|
||||
|
@ -3,22 +3,22 @@ import CardForm from './CardForm';
|
||||
|
||||
function CardAdder({ column, onConfirm }) {
|
||||
function confirmCard(card) {
|
||||
onConfirm(column, card)
|
||||
setAddingCard(false)
|
||||
onConfirm(column, card);
|
||||
setAddingCard(false);
|
||||
}
|
||||
|
||||
const [addingCard, setAddingCard] = useState(false)
|
||||
const [addingCard, setAddingCard] = useState(false);
|
||||
|
||||
return (
|
||||
<>
|
||||
{addingCard ? (
|
||||
<CardForm onConfirm={confirmCard} onCancel={() => setAddingCard(false)} />
|
||||
) : (
|
||||
<button className='react-kanban-card-adder-button' onClick={() => setAddingCard(!addingCard)}>
|
||||
<button className="react-kanban-card-adder-button" onClick={() => setAddingCard(!addingCard)}>
|
||||
+
|
||||
</button>
|
||||
)}
|
||||
</>
|
||||
)
|
||||
);
|
||||
}
|
||||
export default CardAdder;
|
||||
|
@ -3,25 +3,25 @@ import { when } from './utils';
|
||||
|
||||
function ColumnForm({ onConfirm, onCancel }) {
|
||||
// FIXME use hook
|
||||
const inputColumnTitle = createRef<any>()
|
||||
const inputColumnTitle = createRef<any>();
|
||||
|
||||
function addColumn(event) {
|
||||
event.preventDefault()
|
||||
event.preventDefault();
|
||||
|
||||
when(inputColumnTitle.current.value)(onConfirm)
|
||||
when(inputColumnTitle.current.value)(onConfirm);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className='react-kanban-column' style={{ minWidth: '230px' }}>
|
||||
<div className="react-kanban-column" style={{ minWidth: '230px' }}>
|
||||
<form style={{ display: 'flex', justifyContent: 'space-between' }} onSubmit={addColumn}>
|
||||
<input type='text' ref={inputColumnTitle} autoFocus />
|
||||
<button type='submit'>Add</button>
|
||||
<button type='button' onClick={onCancel}>
|
||||
<input type="text" ref={inputColumnTitle} autoFocus />
|
||||
<button type="submit">Add</button>
|
||||
<button type="button" onClick={onCancel}>
|
||||
Cancel
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
export default ColumnForm
|
||||
export default ColumnForm;
|
||||
|
@ -7,52 +7,58 @@ function ColumnTitle({ allowRenameColumn, onClick, children: title }) {
|
||||
</span>
|
||||
) : (
|
||||
<span>{title}</span>
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
function useRenameMode(state) {
|
||||
const [renameMode, setRenameMode] = useState(state)
|
||||
const [renameMode, setRenameMode] = useState(state);
|
||||
|
||||
function toggleRenameMode() {
|
||||
setRenameMode(!renameMode)
|
||||
setRenameMode(!renameMode);
|
||||
}
|
||||
|
||||
return [renameMode, toggleRenameMode]
|
||||
return [renameMode, toggleRenameMode];
|
||||
}
|
||||
|
||||
function DefaultColumnHeader({ children: column, allowRemoveColumn, onColumnRemove, allowRenameColumn, onColumnRename }) {
|
||||
const [renameMode, toggleRenameMode] = useRenameMode(false)
|
||||
const [titleInput, setTitleInput] = useState('')
|
||||
function DefaultColumnHeader({
|
||||
children: column,
|
||||
allowRemoveColumn,
|
||||
onColumnRemove,
|
||||
allowRenameColumn,
|
||||
onColumnRename,
|
||||
}) {
|
||||
const [renameMode, toggleRenameMode] = useRenameMode(false);
|
||||
const [titleInput, setTitleInput] = useState('');
|
||||
|
||||
function handleRenameColumn(event) {
|
||||
event.preventDefault()
|
||||
event.preventDefault();
|
||||
|
||||
onColumnRename(column, titleInput)
|
||||
toggleRenameMode()
|
||||
onColumnRename(column, titleInput);
|
||||
toggleRenameMode();
|
||||
}
|
||||
|
||||
function handleRenameMode() {
|
||||
setTitleInput(column.title)
|
||||
toggleRenameMode()
|
||||
setTitleInput(column.title);
|
||||
toggleRenameMode();
|
||||
}
|
||||
|
||||
return (
|
||||
<div className='react-kanban-column-header'>
|
||||
<div className="react-kanban-column-header">
|
||||
{renameMode ? (
|
||||
<form onSubmit={handleRenameColumn}>
|
||||
<span>
|
||||
<input
|
||||
type='text'
|
||||
type="text"
|
||||
value={titleInput}
|
||||
onChange={({ target: { value } }) => setTitleInput(value)}
|
||||
autoFocus
|
||||
/>
|
||||
</span>
|
||||
<span>
|
||||
<button className='react-kanban-column-header__button' type='submit'>
|
||||
<button className="react-kanban-column-header__button" type="submit">
|
||||
Rename
|
||||
</button>
|
||||
<button className='react-kanban-column-header__button' type='button' onClick={handleRenameMode}>
|
||||
<button className="react-kanban-column-header__button" type="button" onClick={handleRenameMode}>
|
||||
Cancel
|
||||
</button>
|
||||
</span>
|
||||
@ -66,7 +72,7 @@ function DefaultColumnHeader({ children: column, allowRemoveColumn, onColumnRemo
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
export default DefaultColumnHeader;
|
||||
|
@ -2,7 +2,7 @@ import {
|
||||
addInArrayAtPosition,
|
||||
changeElementOfPositionInArray,
|
||||
removeFromArrayAtPosition,
|
||||
replaceElementOfArray
|
||||
replaceElementOfArray,
|
||||
} from './utils';
|
||||
|
||||
function reorderCardsOnColumn(column, reorderCards) {
|
||||
|
@ -1,2 +1 @@
|
||||
export { default as Board } from './Board';
|
||||
|
||||
|
@ -1,41 +1,41 @@
|
||||
function getCoordinates(event, board) {
|
||||
if (event.destination === null) return {}
|
||||
if (event.destination === null) return {};
|
||||
|
||||
const columnSource = { fromPosition: event.source.index }
|
||||
const columnDestination = { toPosition: event.destination.index }
|
||||
const columnSource = { fromPosition: event.source.index };
|
||||
const columnDestination = { toPosition: event.destination.index };
|
||||
|
||||
if (isAColumnMove(event.type)) {
|
||||
return { source: columnSource, destination: columnDestination }
|
||||
return { source: columnSource, destination: columnDestination };
|
||||
}
|
||||
|
||||
return {
|
||||
source: { ...columnSource, fromColumnId: getColumn(board, event.source.droppableId).id },
|
||||
destination: { ...columnDestination, toColumnId: getColumn(board, event.destination.droppableId).id },
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function isAColumnMove(type) {
|
||||
return type === 'BOARD'
|
||||
return type === 'BOARD';
|
||||
}
|
||||
|
||||
function getCard(board, sourceCoordinate) {
|
||||
const column = board.columns.find((column) => column.id === sourceCoordinate.fromColumnId)
|
||||
return column.cards[sourceCoordinate.fromPosition]
|
||||
const column = board.columns.find((column) => column.id === sourceCoordinate.fromColumnId);
|
||||
return column.cards[sourceCoordinate.fromPosition];
|
||||
}
|
||||
|
||||
function getColumn(board, droppableId) {
|
||||
return board.columns.find(({ id }) => String(id) === droppableId)
|
||||
return board.columns.find(({ id }) => String(id) === droppableId);
|
||||
}
|
||||
|
||||
function isMovingAColumnToAnotherPosition(coordinates) {
|
||||
return coordinates.source.fromPosition !== coordinates.destination.toPosition
|
||||
return coordinates.source.fromPosition !== coordinates.destination.toPosition;
|
||||
}
|
||||
|
||||
function isMovingACardToAnotherPosition(coordinates) {
|
||||
return !(
|
||||
coordinates.source.fromPosition === coordinates.destination.toPosition &&
|
||||
coordinates.source.fromColumnId === coordinates.destination.toColumnId
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
export { getCard, getCoordinates, isAColumnMove, isMovingAColumnToAnotherPosition, isMovingACardToAnotherPosition }
|
||||
export { getCard, getCoordinates, isAColumnMove, isMovingAColumnToAnotherPosition, isMovingACardToAnotherPosition };
|
||||
|
@ -1,48 +1,48 @@
|
||||
function compose(...fns) {
|
||||
return (arg) => fns.reduce((acc, fn) => fn(acc), arg)
|
||||
return (arg) => fns.reduce((acc, fn) => fn(acc), arg);
|
||||
}
|
||||
|
||||
function partialRight(fn, ...args) {
|
||||
return (...leftArgs) => fn(...leftArgs, ...args)
|
||||
return (...leftArgs) => fn(...leftArgs, ...args);
|
||||
}
|
||||
|
||||
function addInArrayAtPosition(array, element, position) {
|
||||
const arrayCopy = [...array]
|
||||
arrayCopy.splice(position, 0, element)
|
||||
return arrayCopy
|
||||
const arrayCopy = [...array];
|
||||
arrayCopy.splice(position, 0, element);
|
||||
return arrayCopy;
|
||||
}
|
||||
|
||||
function removeFromArrayAtPosition(array, position) {
|
||||
return array.reduce((acc, value, idx) => (idx === position ? acc : [...acc, value]), [])
|
||||
return array.reduce((acc, value, idx) => (idx === position ? acc : [...acc, value]), []);
|
||||
}
|
||||
|
||||
function changeElementOfPositionInArray(array, from, to) {
|
||||
const removeFromArrayAtPositionFrom = partialRight(removeFromArrayAtPosition, from)
|
||||
const addInArrayAtPositionTo = partialRight(addInArrayAtPosition, array[from], to)
|
||||
const removeFromArrayAtPositionFrom = partialRight(removeFromArrayAtPosition, from);
|
||||
const addInArrayAtPositionTo = partialRight(addInArrayAtPosition, array[from], to);
|
||||
|
||||
return compose(removeFromArrayAtPositionFrom, addInArrayAtPositionTo)(array)
|
||||
return compose(removeFromArrayAtPositionFrom, addInArrayAtPositionTo)(array);
|
||||
}
|
||||
|
||||
function identity(value) {
|
||||
return value
|
||||
return value;
|
||||
}
|
||||
|
||||
function when(value, predicate = identity) {
|
||||
return function callback(callback) {
|
||||
if (predicate(value)) return callback(value)
|
||||
}
|
||||
if (predicate(value)) return callback(value);
|
||||
};
|
||||
}
|
||||
|
||||
function replaceElementOfArray(array) {
|
||||
return function (options) {
|
||||
return array.map((element) => (options.when(element) ? options.for(element) : element))
|
||||
}
|
||||
return array.map((element) => (options.when(element) ? options.for(element) : element));
|
||||
};
|
||||
}
|
||||
|
||||
function pickPropOut(object, prop) {
|
||||
return Object.keys(object).reduce((obj, key) => {
|
||||
return key === prop ? obj : { ...obj, [key]: object[key] }
|
||||
}, {})
|
||||
return key === prop ? obj : { ...obj, [key]: object[key] };
|
||||
}, {});
|
||||
}
|
||||
|
||||
export {
|
||||
@ -53,4 +53,4 @@ export {
|
||||
replaceElementOfArray,
|
||||
partialRight,
|
||||
pickPropOut,
|
||||
}
|
||||
};
|
||||
|
@ -1,5 +1,5 @@
|
||||
import React from 'react'
|
||||
import { Droppable } from 'react-beautiful-dnd'
|
||||
import React from 'react';
|
||||
import { Droppable } from 'react-beautiful-dnd';
|
||||
|
||||
function withDroppable(Component) {
|
||||
return function WrapperComponent({ children, ...droppableProps }) {
|
||||
@ -12,8 +12,8 @@ function withDroppable(Component) {
|
||||
</Component>
|
||||
)}
|
||||
</Droppable>
|
||||
)
|
||||
}
|
||||
);
|
||||
};
|
||||
}
|
||||
|
||||
export default withDroppable
|
||||
export default withDroppable;
|
||||
|
@ -100,9 +100,9 @@ export const InternalFallbackField = () => {
|
||||
|
||||
// 当字段被删除时,显示一个提示占位符
|
||||
const DeletedField = () => {
|
||||
const { t } = useTranslation()
|
||||
const { t } = useTranslation();
|
||||
return <div style={{ color: '#ccc' }}>{t('The field has bee deleted')}</div>;
|
||||
}
|
||||
};
|
||||
|
||||
export const CollectionField = connect((props) => {
|
||||
const fieldSchema = useFieldSchema();
|
||||
|
@ -5,7 +5,7 @@ import {
|
||||
CollectionFieldProvider,
|
||||
CollectionProvider,
|
||||
ResourceActionProvider,
|
||||
useDataSourceFromRAC
|
||||
useDataSourceFromRAC,
|
||||
} from './';
|
||||
import * as hooks from './action-hooks';
|
||||
import { DataSourceProvider, ds, SubFieldDataSourceProvider } from './sub-table';
|
||||
|
@ -27,7 +27,7 @@ import {
|
||||
EditCategory,
|
||||
EditCategoryAction,
|
||||
SyncFieldsAction,
|
||||
SyncFieldsActionCom
|
||||
SyncFieldsActionCom,
|
||||
} from './Configuration';
|
||||
|
||||
import { CollectionCategroriesProvider } from './CollectionManagerProvider';
|
||||
@ -84,7 +84,7 @@ export const CollectionManagerPane = () => {
|
||||
EditCategory,
|
||||
EditCategoryAction,
|
||||
SyncFieldsAction,
|
||||
SyncFieldsActionCom
|
||||
SyncFieldsActionCom,
|
||||
}}
|
||||
/>
|
||||
// </Card>
|
||||
|
@ -98,7 +98,7 @@ const getSchema = (schema, category, compile): ISchema => {
|
||||
};
|
||||
|
||||
const useDefaultCollectionFields = (values) => {
|
||||
let defaults = values.fields ? [...values.fields] : [];
|
||||
const defaults = values.fields ? [...values.fields] : [];
|
||||
const { autoGenId = true, createdAt = true, createdBy = true, updatedAt = true, updatedBy = true } = values;
|
||||
if (autoGenId) {
|
||||
const pk = values.fields.find((f) => f.primaryKey);
|
||||
|
@ -359,7 +359,8 @@ export const CollectionFields = (props) => {
|
||||
];
|
||||
|
||||
dataSource.push(
|
||||
...inherits.map((key) => {
|
||||
...inherits
|
||||
.map((key) => {
|
||||
const collection = getCollection(key);
|
||||
if (!collection) {
|
||||
return;
|
||||
@ -370,7 +371,8 @@ export const CollectionFields = (props) => {
|
||||
inherit: true,
|
||||
fields: collection?.fields || [],
|
||||
};
|
||||
}).filter(Boolean),
|
||||
})
|
||||
.filter(Boolean),
|
||||
);
|
||||
|
||||
const resourceActionProps = {
|
||||
|
@ -7,7 +7,7 @@ import {
|
||||
useDraggable,
|
||||
useDroppable,
|
||||
useSensor,
|
||||
useSensors
|
||||
useSensors,
|
||||
} from '@dnd-kit/core';
|
||||
import { RecursionField, observer } from '@formily/react';
|
||||
import { uid } from '@formily/shared';
|
||||
|
@ -115,7 +115,11 @@ export const EditSubFieldAction = (props) => {
|
||||
>
|
||||
{t('Edit')}
|
||||
</a>
|
||||
<SchemaComponent schema={schema} components={{ ...components, ArrayTable }} scope={{ useUpdateCollectionField }} />
|
||||
<SchemaComponent
|
||||
schema={schema}
|
||||
components={{ ...components, ArrayTable }}
|
||||
scope={{ useUpdateCollectionField }}
|
||||
/>
|
||||
</ActionContext.Provider>
|
||||
);
|
||||
};
|
||||
|
@ -58,8 +58,6 @@ const getSchema = (schema: IField, record: any, compile, getContainer): ISchema
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
|
||||
export const ViewCollectionField = (props) => {
|
||||
const record = useRecord();
|
||||
return <ViewFieldAction item={record} {...props} />;
|
||||
|
@ -23,7 +23,9 @@ export const FieldSummary = observer((props: any) => {
|
||||
padding: 16px;
|
||||
`}
|
||||
>
|
||||
<div className={css``}>{t('Field interface')}: <Tag>{compile(schema.title)}</Tag></div>
|
||||
<div className={css``}>
|
||||
{t('Field interface')}: <Tag>{compile(schema.title)}</Tag>
|
||||
</div>
|
||||
{schema.description ? (
|
||||
<div
|
||||
className={css`
|
||||
|
@ -23,7 +23,9 @@ export const TemplateSummay = observer((props: any) => {
|
||||
padding: 16px;
|
||||
`}
|
||||
>
|
||||
<div className={css``}>{t('Collection template')}: <Tag>{compile(schema.title)}</Tag></div>
|
||||
<div className={css``}>
|
||||
{t('Collection template')}: <Tag>{compile(schema.title)}</Tag>
|
||||
</div>
|
||||
{schema.description ? (
|
||||
<div
|
||||
className={css`
|
||||
|
@ -20,7 +20,9 @@ export const SourceForeignKey = observer(() => {
|
||||
placeholder={'留空时,自动生成 FK 字段'}
|
||||
disabled={field.disabled}
|
||||
value={field.value}
|
||||
options={getCollectionFields(collection.name).filter(field => field.type).map((field) => {
|
||||
options={getCollectionFields(collection.name)
|
||||
.filter((field) => field.type)
|
||||
.map((field) => {
|
||||
return {
|
||||
label: field?.uiSchema?.title || field.name,
|
||||
value: field.name,
|
||||
@ -42,7 +44,9 @@ export const ThroughForeignKey = observer(() => {
|
||||
placeholder={'留空时,自动生成 FK 字段'}
|
||||
disabled={field.disabled}
|
||||
value={field.value}
|
||||
options={getCollectionFields(form.values.through).filter(field => field.type).map((field) => {
|
||||
options={getCollectionFields(form.values.through)
|
||||
.filter((field) => field.type)
|
||||
.map((field) => {
|
||||
return {
|
||||
label: field?.uiSchema?.title || field.name,
|
||||
value: field.name,
|
||||
@ -53,7 +57,6 @@ export const ThroughForeignKey = observer(() => {
|
||||
);
|
||||
});
|
||||
|
||||
|
||||
export const TargetForeignKey = observer(() => {
|
||||
const field = useField<Field>();
|
||||
const form = useForm();
|
||||
@ -65,7 +68,9 @@ export const TargetForeignKey = observer(() => {
|
||||
placeholder={'留空时,自动生成 FK 字段'}
|
||||
disabled={field.disabled}
|
||||
value={field.value}
|
||||
options={getCollectionFields(form.values.target).filter(field => field.type).map((field) => {
|
||||
options={getCollectionFields(form.values.target)
|
||||
.filter((field) => field.type)
|
||||
.map((field) => {
|
||||
return {
|
||||
label: field?.uiSchema?.title || field.name,
|
||||
value: field.name,
|
||||
@ -83,7 +88,11 @@ export const SourceCollection = observer(() => {
|
||||
const compile = useCompile();
|
||||
return (
|
||||
<div>
|
||||
<Select disabled value={collection.name} options={[{ value: collection.name, label: compile(collection.title) }]} />
|
||||
<Select
|
||||
disabled
|
||||
value={collection.name}
|
||||
options={[{ value: collection.name, label: compile(collection.title) }]}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
});
|
||||
|
@ -20,7 +20,7 @@ interface ResourceActionProviderProps {
|
||||
const ResourceContext = createContext<any>(null);
|
||||
|
||||
const CollectionResourceActionProvider = (props) => {
|
||||
let { collection, request, uid, dragSort } = props;
|
||||
const { collection, request, uid, dragSort } = props;
|
||||
const api = useAPIClient();
|
||||
const record = useRecord();
|
||||
const actionName = request?.action;
|
||||
@ -52,7 +52,7 @@ const CollectionResourceActionProvider = (props) => {
|
||||
};
|
||||
|
||||
const AssociationResourceActionProvider = (props) => {
|
||||
let { collection, association, request, uid, dragSort } = props;
|
||||
const { collection, association, request, uid, dragSort } = props;
|
||||
const api = useAPIClient();
|
||||
const record = useRecord();
|
||||
const resourceOf = record[association.sourceKey];
|
||||
|
@ -3,7 +3,7 @@ import {
|
||||
AntdSchemaComponentProvider,
|
||||
CollectionManagerProvider,
|
||||
SchemaComponent,
|
||||
SchemaComponentProvider
|
||||
SchemaComponentProvider,
|
||||
} from '@nocobase/client';
|
||||
import React from 'react';
|
||||
|
||||
|
@ -18,7 +18,7 @@ import {
|
||||
SchemaComponentProvider,
|
||||
SchemaInitializer,
|
||||
SchemaInitializerProvider,
|
||||
useCollectionManager
|
||||
useCollectionManager,
|
||||
} from '@nocobase/client';
|
||||
import cloneDeep from 'lodash/cloneDeep';
|
||||
import React, { useContext } from 'react';
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { action } from '@formily/reactive';
|
||||
|
||||
import { useCollectionManager } from ".";
|
||||
import { useCompile } from "../../schema-component";
|
||||
import { useCollectionManager } from '.';
|
||||
import { useCompile } from '../../schema-component';
|
||||
|
||||
export function useCollectionDataSource(filter?: Function) {
|
||||
return (field: any) => {
|
||||
@ -9,10 +9,10 @@ export function useCollectionDataSource(filter?: Function) {
|
||||
const { collections = [] } = useCollectionManager();
|
||||
action.bound((data: any) => {
|
||||
const filtered = typeof filter === 'function' ? data.filter(filter) : data;
|
||||
field.dataSource = filtered.map(item => ({
|
||||
field.dataSource = filtered.map((item) => ({
|
||||
label: compile(item.title),
|
||||
value: item.name
|
||||
value: item.name,
|
||||
}));
|
||||
})(collections);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -276,7 +276,7 @@ export const useCollectionManager = () => {
|
||||
getInterface(name: string) {
|
||||
return interfaces[name] ? clone(interfaces[name]) : null;
|
||||
},
|
||||
getTemplate(name: string = 'general') {
|
||||
getTemplate(name = 'general') {
|
||||
return templates[name] ? clone(templates[name] || templates['general']) : null;
|
||||
},
|
||||
getParentCollectionFields: (parentCollection, currentCollection) => {
|
||||
|
@ -2,27 +2,20 @@ import { Switch } from 'antd';
|
||||
import React from 'react';
|
||||
|
||||
export const TargetKey = () => {
|
||||
return (
|
||||
<div>
|
||||
Target key
|
||||
</div>
|
||||
);
|
||||
return <div>Target key</div>;
|
||||
};
|
||||
|
||||
export const ThroughCollection = () => {
|
||||
return (
|
||||
<div>
|
||||
Through collection <Switch size={'small'} defaultChecked checkedChildren="Auto fill" unCheckedChildren="Customize"/>
|
||||
Through collection{' '}
|
||||
<Switch size={'small'} defaultChecked checkedChildren="Auto fill" unCheckedChildren="Customize" />
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export const SourceKey = () => {
|
||||
return (
|
||||
<div>
|
||||
Source key
|
||||
</div>
|
||||
);
|
||||
return <div>Source key</div>;
|
||||
};
|
||||
|
||||
export const ForeignKey = () => {
|
||||
|
@ -31,4 +31,3 @@ export * from './time';
|
||||
export * from './updatedAt';
|
||||
export * from './updatedBy';
|
||||
export * from './url';
|
||||
|
||||
|
@ -42,12 +42,14 @@ export const input: IField = {
|
||||
'x-decorator': 'FormItem',
|
||||
'x-component': 'InputNumber',
|
||||
'x-component-props': {
|
||||
precision: 0
|
||||
precision: 0,
|
||||
},
|
||||
'x-reactions': `{{(field) => {
|
||||
const targetValue = field.query('.min').value();
|
||||
field.selfErrors =
|
||||
!!targetValue && !!field.value && targetValue > field.value ? '${i18n.t('Max length must greater than min length')}' : ''
|
||||
!!targetValue && !!field.value && targetValue > field.value ? '${i18n.t(
|
||||
'Max length must greater than min length',
|
||||
)}' : ''
|
||||
}}}`,
|
||||
},
|
||||
min: {
|
||||
@ -57,13 +59,15 @@ export const input: IField = {
|
||||
'x-decorator': 'FormItem',
|
||||
'x-component': 'InputNumber',
|
||||
'x-component-props': {
|
||||
precision: 0
|
||||
precision: 0,
|
||||
},
|
||||
'x-reactions': {
|
||||
dependencies: ['.max'],
|
||||
fulfill: {
|
||||
state: {
|
||||
selfErrors: `{{!!$deps[0] && !!$self.value && $deps[0] < $self.value ? '${i18n.t('Min length must less than max length')}' : ''}}`,
|
||||
selfErrors: `{{!!$deps[0] && !!$self.value && $deps[0] < $self.value ? '${i18n.t(
|
||||
'Min length must less than max length',
|
||||
)}' : ''}}`,
|
||||
},
|
||||
},
|
||||
},
|
||||
@ -75,7 +79,7 @@ export const input: IField = {
|
||||
'x-decorator': 'FormItem',
|
||||
'x-component': 'InputNumber',
|
||||
'x-component-props': {
|
||||
precision: 0
|
||||
precision: 0,
|
||||
},
|
||||
},
|
||||
format: {
|
||||
@ -86,46 +90,60 @@ export const input: IField = {
|
||||
'x-component-props': {
|
||||
allowClear: true,
|
||||
},
|
||||
enum: [{
|
||||
enum: [
|
||||
{
|
||||
label: '{{ t("url") }}',
|
||||
value: 'url',
|
||||
}, {
|
||||
},
|
||||
{
|
||||
label: '{{ t("email") }}',
|
||||
value: 'email',
|
||||
}, {
|
||||
},
|
||||
{
|
||||
label: '{{ t("ipv6") }}',
|
||||
value: 'ipv6',
|
||||
}, {
|
||||
},
|
||||
{
|
||||
label: '{{ t("ipv4") }}',
|
||||
value: 'ipv4',
|
||||
}, {
|
||||
},
|
||||
{
|
||||
label: '{{ t("number") }}',
|
||||
value: 'number',
|
||||
}, {
|
||||
},
|
||||
{
|
||||
label: '{{ t("integer") }}',
|
||||
value: 'integer',
|
||||
}, {
|
||||
},
|
||||
{
|
||||
label: '{{ t("idcard") }}',
|
||||
value: 'idcard',
|
||||
}, {
|
||||
},
|
||||
{
|
||||
label: '{{ t("qq") }}',
|
||||
value: 'qq',
|
||||
}, {
|
||||
},
|
||||
{
|
||||
label: '{{ t("phone") }}',
|
||||
value: 'phone',
|
||||
}, {
|
||||
},
|
||||
{
|
||||
label: '{{ t("money") }}',
|
||||
value: 'money',
|
||||
}, {
|
||||
},
|
||||
{
|
||||
label: '{{ t("zh") }}',
|
||||
value: 'zh',
|
||||
}, {
|
||||
},
|
||||
{
|
||||
label: '{{ t("date") }}',
|
||||
value: 'date',
|
||||
}, {
|
||||
},
|
||||
{
|
||||
label: '{{ t("zip") }}',
|
||||
value: 'zip',
|
||||
}]
|
||||
},
|
||||
],
|
||||
},
|
||||
pattern: {
|
||||
type: 'string',
|
||||
@ -135,8 +153,8 @@ export const input: IField = {
|
||||
'x-component-props': {
|
||||
prefix: '/',
|
||||
suffix: '/',
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
}
|
||||
},
|
||||
};
|
||||
|
@ -5,7 +5,7 @@ import { IField } from './types';
|
||||
|
||||
registerValidateFormats({
|
||||
odd: /^-?\d*[13579]$/,
|
||||
even: /^-?\d*[02468]$/
|
||||
even: /^-?\d*[02468]$/,
|
||||
});
|
||||
|
||||
export const integer: IField = {
|
||||
@ -46,12 +46,14 @@ export const integer: IField = {
|
||||
'x-decorator': 'FormItem',
|
||||
'x-component': 'InputNumber',
|
||||
'x-component-props': {
|
||||
precision: 0
|
||||
precision: 0,
|
||||
},
|
||||
'x-reactions': `{{(field) => {
|
||||
const targetValue = field.query('.minimum').value();
|
||||
field.selfErrors =
|
||||
!!targetValue && !!field.value && targetValue > field.value ? '${i18n.t('Maximum must greater than minimum')}' : ''
|
||||
!!targetValue && !!field.value && targetValue > field.value ? '${i18n.t(
|
||||
'Maximum must greater than minimum',
|
||||
)}' : ''
|
||||
}}}`,
|
||||
},
|
||||
minimum: {
|
||||
@ -60,13 +62,15 @@ export const integer: IField = {
|
||||
'x-decorator': 'FormItem',
|
||||
'x-component': 'InputNumber',
|
||||
'x-component-props': {
|
||||
precision: 0
|
||||
precision: 0,
|
||||
},
|
||||
'x-reactions': {
|
||||
dependencies: ['.maximum'],
|
||||
fulfill: {
|
||||
state: {
|
||||
selfErrors: `{{!!$deps[0] && !!$self.value && $deps[0] < $self.value ? '${i18n.t('Minimum must less than maximum')}' : ''}}`,
|
||||
selfErrors: `{{!!$deps[0] && !!$self.value && $deps[0] < $self.value ? '${i18n.t(
|
||||
'Minimum must less than maximum',
|
||||
)}' : ''}}`,
|
||||
},
|
||||
},
|
||||
},
|
||||
@ -79,13 +83,16 @@ export const integer: IField = {
|
||||
'x-component-props': {
|
||||
allowClear: true,
|
||||
},
|
||||
enum: [{
|
||||
enum: [
|
||||
{
|
||||
label: '{{ t("Odd") }}',
|
||||
value: 'odd',
|
||||
}, {
|
||||
},
|
||||
{
|
||||
label: '{{ t("Even") }}',
|
||||
value: 'even',
|
||||
}]
|
||||
},
|
||||
],
|
||||
},
|
||||
pattern: {
|
||||
type: 'string',
|
||||
@ -95,8 +102,8 @@ export const integer: IField = {
|
||||
'x-component-props': {
|
||||
prefix: '/',
|
||||
suffix: '/',
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
}
|
||||
},
|
||||
};
|
||||
|
@ -10,10 +10,10 @@ registerValidateRules({
|
||||
} catch (error) {
|
||||
return {
|
||||
type: 'error',
|
||||
message: error.message
|
||||
message: error.message,
|
||||
};
|
||||
}
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
export const json: IField = {
|
||||
@ -36,7 +36,7 @@ export const json: IField = {
|
||||
// maxRows: 20,
|
||||
},
|
||||
},
|
||||
default: null
|
||||
default: null,
|
||||
},
|
||||
},
|
||||
availableTypes: ['json', 'array'],
|
||||
@ -44,6 +44,5 @@ export const json: IField = {
|
||||
properties: {
|
||||
...defaultProps,
|
||||
},
|
||||
filterable: {
|
||||
}
|
||||
filterable: {},
|
||||
};
|
||||
|
@ -5,7 +5,7 @@ import {
|
||||
recordPickerSelector,
|
||||
recordPickerViewer,
|
||||
relationshipType,
|
||||
reverseFieldProperties
|
||||
reverseFieldProperties,
|
||||
} from './properties';
|
||||
import { IField } from './types';
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { ISchema } from '@formily/react';
|
||||
import { defaultProps } from './properties';
|
||||
import { IField } from './types';
|
||||
import { i18n } from '../../i18n'
|
||||
import { i18n } from '../../i18n';
|
||||
|
||||
export const markdown: IField = {
|
||||
name: 'markdown',
|
||||
@ -37,12 +37,14 @@ export const markdown: IField = {
|
||||
'x-decorator': 'FormItem',
|
||||
'x-component': 'InputNumber',
|
||||
'x-component-props': {
|
||||
precision: 0
|
||||
precision: 0,
|
||||
},
|
||||
'x-reactions': `{{(field) => {
|
||||
const targetValue = field.query('.min').value();
|
||||
field.selfErrors =
|
||||
!!targetValue && !!field.value && targetValue > field.value ? '${i18n.t('Max length must greater than min length')}' : ''
|
||||
!!targetValue && !!field.value && targetValue > field.value ? '${i18n.t(
|
||||
'Max length must greater than min length',
|
||||
)}' : ''
|
||||
}}}`,
|
||||
},
|
||||
min: {
|
||||
@ -52,17 +54,19 @@ export const markdown: IField = {
|
||||
'x-decorator': 'FormItem',
|
||||
'x-component': 'InputNumber',
|
||||
'x-component-props': {
|
||||
precision: 0
|
||||
precision: 0,
|
||||
},
|
||||
'x-reactions': {
|
||||
dependencies: ['.max'],
|
||||
fulfill: {
|
||||
state: {
|
||||
selfErrors: `{{!!$deps[0] && !!$self.value && $deps[0] < $self.value ? '${i18n.t('Min length must less than max length')}' : ''}}`,
|
||||
selfErrors: `{{!!$deps[0] && !!$self.value && $deps[0] < $self.value ? '${i18n.t(
|
||||
'Min length must less than max length',
|
||||
)}' : ''}}`,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
}
|
||||
},
|
||||
};
|
||||
|
@ -56,7 +56,9 @@ export const number: IField = {
|
||||
'x-reactions': `{{(field) => {
|
||||
const targetValue = field.query('.minimum').value();
|
||||
field.selfErrors =
|
||||
!!targetValue && !!field.value && targetValue > field.value ? '${i18n.t('Maximum must greater than minimum')}' : ''
|
||||
!!targetValue && !!field.value && targetValue > field.value ? '${i18n.t(
|
||||
'Maximum must greater than minimum',
|
||||
)}' : ''
|
||||
}}}`,
|
||||
},
|
||||
minimum: {
|
||||
@ -68,7 +70,9 @@ export const number: IField = {
|
||||
dependencies: ['.maximum'],
|
||||
fulfill: {
|
||||
state: {
|
||||
selfErrors: `{{!!$deps[0] && !!$self.value && $deps[0] < $self.value ? '${i18n.t('Minimum must less than maximum')}' : ''}}`,
|
||||
selfErrors: `{{!!$deps[0] && !!$self.value && $deps[0] < $self.value ? '${i18n.t(
|
||||
'Minimum must less than maximum',
|
||||
)}' : ''}}`,
|
||||
},
|
||||
},
|
||||
},
|
||||
@ -81,16 +85,20 @@ export const number: IField = {
|
||||
'x-component-props': {
|
||||
allowClear: true,
|
||||
},
|
||||
enum: [{
|
||||
enum: [
|
||||
{
|
||||
label: '{{ t("Integer") }}',
|
||||
value: 'integer',
|
||||
}, {
|
||||
},
|
||||
{
|
||||
label: '{{ t("Odd") }}',
|
||||
value: 'odd',
|
||||
}, {
|
||||
},
|
||||
{
|
||||
label: '{{ t("Even") }}',
|
||||
value: 'even',
|
||||
}]
|
||||
},
|
||||
],
|
||||
},
|
||||
pattern: {
|
||||
type: 'string',
|
||||
@ -100,8 +108,8 @@ export const number: IField = {
|
||||
'x-component-props': {
|
||||
prefix: '/',
|
||||
suffix: '/',
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
}
|
||||
},
|
||||
};
|
||||
|
@ -33,12 +33,14 @@ export const password: IField = {
|
||||
'x-decorator': 'FormItem',
|
||||
'x-component': 'InputNumber',
|
||||
'x-component-props': {
|
||||
precision: 0
|
||||
precision: 0,
|
||||
},
|
||||
'x-reactions': `{{(field) => {
|
||||
const targetValue = field.query('.min').value();
|
||||
field.selfErrors =
|
||||
!!targetValue && !!field.value && targetValue > field.value ? '${i18n.t('Max length must greater than min length')}' : ''
|
||||
!!targetValue && !!field.value && targetValue > field.value ? '${i18n.t(
|
||||
'Max length must greater than min length',
|
||||
)}' : ''
|
||||
}}}`,
|
||||
},
|
||||
min: {
|
||||
@ -48,17 +50,19 @@ export const password: IField = {
|
||||
'x-decorator': 'FormItem',
|
||||
'x-component': 'InputNumber',
|
||||
'x-component-props': {
|
||||
precision: 0
|
||||
precision: 0,
|
||||
},
|
||||
'x-reactions': {
|
||||
dependencies: ['.max'],
|
||||
fulfill: {
|
||||
state: {
|
||||
selfErrors: `{{!!$deps[0] && !!$self.value && $deps[0] < $self.value ? '${i18n.t('Min length must less than max length')}' : ''}}`,
|
||||
selfErrors: `{{!!$deps[0] && !!$self.value && $deps[0] < $self.value ? '${i18n.t(
|
||||
'Min length must less than max length',
|
||||
)}' : ''}}`,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
}
|
||||
},
|
||||
};
|
||||
|
@ -16,7 +16,7 @@ export const phone: IField = {
|
||||
// title,
|
||||
'x-component': 'Input',
|
||||
'x-component-props': {
|
||||
type: 'tel'
|
||||
type: 'tel',
|
||||
},
|
||||
// 'x-validator': 'phone',
|
||||
},
|
||||
|
@ -38,12 +38,14 @@ export const richText: IField = {
|
||||
'x-decorator': 'FormItem',
|
||||
'x-component': 'InputNumber',
|
||||
'x-component-props': {
|
||||
precision: 0
|
||||
precision: 0,
|
||||
},
|
||||
'x-reactions': `{{(field) => {
|
||||
const targetValue = field.query('.min').value();
|
||||
field.selfErrors =
|
||||
!!targetValue && !!field.value && targetValue > field.value ? '${i18n.t('Max length must greater than min length')}' : ''
|
||||
!!targetValue && !!field.value && targetValue > field.value ? '${i18n.t(
|
||||
'Max length must greater than min length',
|
||||
)}' : ''
|
||||
}}}`,
|
||||
},
|
||||
min: {
|
||||
@ -53,17 +55,19 @@ export const richText: IField = {
|
||||
'x-decorator': 'FormItem',
|
||||
'x-component': 'InputNumber',
|
||||
'x-component-props': {
|
||||
precision: 0
|
||||
precision: 0,
|
||||
},
|
||||
'x-reactions': {
|
||||
dependencies: ['.max'],
|
||||
fulfill: {
|
||||
state: {
|
||||
selfErrors: `{{!!$deps[0] && !!$self.value && $deps[0] < $self.value ? '${i18n.t('Min length must less than max length')}' : ''}}`,
|
||||
selfErrors: `{{!!$deps[0] && !!$self.value && $deps[0] < $self.value ? '${i18n.t(
|
||||
'Min length must less than max length',
|
||||
)}' : ''}}`,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
}
|
||||
},
|
||||
};
|
||||
|
@ -38,12 +38,14 @@ export const textarea: IField = {
|
||||
'x-decorator': 'FormItem',
|
||||
'x-component': 'InputNumber',
|
||||
'x-component-props': {
|
||||
precision: 0
|
||||
precision: 0,
|
||||
},
|
||||
'x-reactions': `{{(field) => {
|
||||
const targetValue = field.query('.min').value();
|
||||
field.selfErrors =
|
||||
!!targetValue && !!field.value && targetValue > field.value ? '${i18n.t('Max length must greater than min length')}' : ''
|
||||
!!targetValue && !!field.value && targetValue > field.value ? '${i18n.t(
|
||||
'Max length must greater than min length',
|
||||
)}' : ''
|
||||
}}}`,
|
||||
},
|
||||
min: {
|
||||
@ -53,17 +55,19 @@ export const textarea: IField = {
|
||||
'x-decorator': 'FormItem',
|
||||
'x-component': 'InputNumber',
|
||||
'x-component-props': {
|
||||
precision: 0
|
||||
precision: 0,
|
||||
},
|
||||
'x-reactions': {
|
||||
dependencies: ['.max'],
|
||||
fulfill: {
|
||||
state: {
|
||||
selfErrors: `{{!!$deps[0] && !!$self.value && $deps[0] < $self.value ? '${i18n.t('Min length must less than max length')}' : ''}}`,
|
||||
selfErrors: `{{!!$deps[0] && !!$self.value && $deps[0] < $self.value ? '${i18n.t(
|
||||
'Min length must less than max length',
|
||||
)}' : ''}}`,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
}
|
||||
},
|
||||
};
|
||||
|
@ -9,6 +9,6 @@ interface IDefault {
|
||||
export interface IField extends ISchema {
|
||||
default?: IDefault;
|
||||
operators?: any[];
|
||||
filterable?: any,
|
||||
filterable?: any;
|
||||
[key: string]: any;
|
||||
}
|
||||
|
@ -8,7 +8,7 @@ import {
|
||||
useCollectionManager,
|
||||
useRecord,
|
||||
useRecordIndex,
|
||||
useRequest
|
||||
useRequest,
|
||||
} from '../';
|
||||
import { useAPIClient } from '../api-client';
|
||||
|
||||
|
@ -35,9 +35,9 @@ export const expression: ICollectionTemplate = {
|
||||
title: '{{t("Collection")}}',
|
||||
'x-component': 'CollectionSelect',
|
||||
'x-component-props': {
|
||||
multiple: true
|
||||
multiple: true,
|
||||
},
|
||||
},
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'expression',
|
||||
@ -47,8 +47,8 @@ export const expression: ICollectionTemplate = {
|
||||
type: 'string',
|
||||
title: '{{t("Expression")}}',
|
||||
'x-component': 'DynamicExpression',
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
availableFieldInterfaces: {
|
||||
|
@ -3,4 +3,3 @@ export * from './general';
|
||||
export * from './tree';
|
||||
export * from './expression';
|
||||
export * from './view';
|
||||
|
||||
|
@ -35,11 +35,7 @@ export const DocumentTitleProvider: React.FC<{ addonBefore?: string; addonAfter?
|
||||
|
||||
export const RemoteDocumentTitleProvider: React.FC = (props) => {
|
||||
const ctx = useSystemSettings();
|
||||
return (
|
||||
<DocumentTitleProvider addonAfter={ctx?.data?.data?.title}>
|
||||
{props.children}
|
||||
</DocumentTitleProvider>
|
||||
);
|
||||
return <DocumentTitleProvider addonAfter={ctx?.data?.data?.title}>{props.children}</DocumentTitleProvider>;
|
||||
};
|
||||
|
||||
export const useDocumentTitle = () => {
|
||||
|
@ -1,3 +1,2 @@
|
||||
export * from './FilterProvider';
|
||||
export * from './utils';
|
||||
|
||||
|
@ -6,7 +6,7 @@ import React, { useEffect, useRef, useState } from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
|
||||
function pasteHtml(html, selectPastedContent = false) {
|
||||
var sel, range;
|
||||
let sel, range;
|
||||
if (window.getSelection) {
|
||||
// IE9 and non-IE
|
||||
sel = window.getSelection();
|
||||
@ -17,15 +17,15 @@ function pasteHtml(html, selectPastedContent = false) {
|
||||
// Range.createContextualFragment() would be useful here but is
|
||||
// only relatively recently standardized and is not supported in
|
||||
// some browsers (IE9, for one)
|
||||
var el = document.createElement('div');
|
||||
const el = document.createElement('div');
|
||||
el.innerHTML = html;
|
||||
var frag = document.createDocumentFragment(),
|
||||
let frag = document.createDocumentFragment(),
|
||||
node,
|
||||
lastNode;
|
||||
while ((node = el.firstChild)) {
|
||||
lastNode = frag.appendChild(node);
|
||||
}
|
||||
var firstNode = frag.firstChild;
|
||||
const firstNode = frag.firstChild;
|
||||
range.insertNode(frag);
|
||||
|
||||
// Preserve the selection
|
||||
|
@ -27,4 +27,3 @@ export * from './schema-templates';
|
||||
export * from './settings-form';
|
||||
export * from './system-settings';
|
||||
export * from './user';
|
||||
|
||||
|
@ -2,4 +2,3 @@ export * from './context';
|
||||
export * from './PinnedPluginListProvider';
|
||||
export * from './PluginManager';
|
||||
export * from './PluginManagerProvider';
|
||||
|
||||
|
@ -1,4 +1,3 @@
|
||||
export * from './admin-layout';
|
||||
export * from './auth-layout';
|
||||
export * from './route-schema-component';
|
||||
|
||||
|
@ -4,4 +4,3 @@ export * from './hooks';
|
||||
export * from './RouteSwitch';
|
||||
export * from './RouteSwitchProvider';
|
||||
export * from './types';
|
||||
|
||||
|
@ -7,5 +7,12 @@ import { requestChartData } from './g2plot/requestChartData';
|
||||
|
||||
export const AntdSchemaComponentProvider = (props) => {
|
||||
const { children } = props;
|
||||
return <SchemaComponentOptions scope={{ requestChartData, useFilterActionProps }} components={{ ...components, ...common } as any}>{children}</SchemaComponentOptions>;
|
||||
return (
|
||||
<SchemaComponentOptions
|
||||
scope={{ requestChartData, useFilterActionProps }}
|
||||
components={{ ...components, ...common } as any}
|
||||
>
|
||||
{children}
|
||||
</SchemaComponentOptions>
|
||||
);
|
||||
};
|
||||
|
@ -6,7 +6,7 @@ import {
|
||||
Form,
|
||||
SchemaComponent,
|
||||
SchemaComponentProvider,
|
||||
useActionContext
|
||||
useActionContext,
|
||||
} from '@nocobase/client';
|
||||
import React, { useState } from 'react';
|
||||
|
||||
|
@ -8,7 +8,7 @@ import {
|
||||
FormLayout,
|
||||
Input,
|
||||
NumberPicker,
|
||||
Submit
|
||||
Submit,
|
||||
} from '@formily/antd';
|
||||
import { Select } from 'antd';
|
||||
import { createForm, Field, onFieldValueChange } from '@formily/core';
|
||||
@ -62,8 +62,10 @@ function TypeSelect(props) {
|
||||
|
||||
return (
|
||||
<Select {...props}>
|
||||
{Object.keys(types).map(key => (
|
||||
<Select.Option key={key} value={key}>{types[key].title}</Select.Option>
|
||||
{Object.keys(types).map((key) => (
|
||||
<Select.Option key={key} value={key}>
|
||||
{types[key].title}
|
||||
</Select.Option>
|
||||
))}
|
||||
</Select>
|
||||
);
|
||||
@ -163,7 +165,7 @@ const schema = {
|
||||
type: {
|
||||
type: 'string',
|
||||
'x-decorator': 'FormItem',
|
||||
'x-component': TypeSelect
|
||||
'x-component': TypeSelect,
|
||||
},
|
||||
},
|
||||
},
|
||||
@ -176,7 +178,7 @@ const schema = {
|
||||
properties: {
|
||||
options: {
|
||||
type: 'object',
|
||||
'x-component': 'ViewOptions'
|
||||
'x-component': 'ViewOptions',
|
||||
},
|
||||
},
|
||||
},
|
||||
|
@ -6,7 +6,7 @@ import {
|
||||
SchemaComponent,
|
||||
SchemaComponentProvider,
|
||||
SchemaInitializer,
|
||||
SchemaInitializerProvider
|
||||
SchemaInitializerProvider,
|
||||
} from '@nocobase/client';
|
||||
import React from 'react';
|
||||
|
||||
@ -16,7 +16,7 @@ export const AddActionButton = (props: any) => {
|
||||
<SchemaInitializer.Button
|
||||
insertPosition={insertPosition}
|
||||
style={{
|
||||
marginLeft: 8
|
||||
marginLeft: 8,
|
||||
}}
|
||||
items={[
|
||||
{
|
||||
|
@ -2,4 +2,3 @@ export * from './Action';
|
||||
export * from './ActionBar';
|
||||
export * from './context';
|
||||
export * from './hooks';
|
||||
|
||||
|
@ -1,3 +1,2 @@
|
||||
export * from './BlockItem';
|
||||
export * from './TestDesigner';
|
||||
|
||||
|
@ -69,7 +69,7 @@ const messages: any = {
|
||||
showMore: (count) => i18n.t('{{count}} more items', { count }),
|
||||
};
|
||||
|
||||
const useEvents = (dataSource: any, fieldNames: any, date: Date, view: typeof Weeks[number]) => {
|
||||
const useEvents = (dataSource: any, fieldNames: any, date: Date, view: (typeof Weeks)[number]) => {
|
||||
const { t } = useTranslation();
|
||||
return useMemo(() => {
|
||||
if (!Array.isArray(dataSource)) return [];
|
||||
@ -118,7 +118,7 @@ const useEvents = (dataSource: any, fieldNames: any, date: Date, view: typeof We
|
||||
};
|
||||
|
||||
if (cron === 'every_week') {
|
||||
let nextStart = start
|
||||
const nextStart = start
|
||||
.clone()
|
||||
.year(startDate.year())
|
||||
.month(startDate.month())
|
||||
@ -193,7 +193,7 @@ const CalendarRecordViewer = (props) => {
|
||||
export const Calendar: any = observer((props: any) => {
|
||||
const { dataSource, fieldNames, showLunar, fixedBlock } = useProps(props);
|
||||
const [date, setDate] = useState<Date>(new Date());
|
||||
const [view, setView] = useState<typeof Weeks[number]>('month');
|
||||
const [view, setView] = useState<(typeof Weeks)[number]>('month');
|
||||
const events = useEvents(dataSource, fieldNames, date, view);
|
||||
const [visible, setVisible] = useState(false);
|
||||
const [record, setRecord] = useState<any>({});
|
||||
|
@ -7,4 +7,4 @@ export const DeleteEventContext = createContext(null);
|
||||
|
||||
export const useDeleteEvent = () => {
|
||||
return useContext(DeleteEventContext);
|
||||
}
|
||||
};
|
||||
|
@ -5,7 +5,7 @@ import {
|
||||
AntdSchemaComponentProvider,
|
||||
SchemaComponent,
|
||||
SchemaComponentProvider,
|
||||
SchemaInitializerProvider
|
||||
SchemaInitializerProvider,
|
||||
} from '@nocobase/client';
|
||||
import React from 'react';
|
||||
import defaultValues from './defaultValues';
|
||||
|
@ -6,7 +6,7 @@ import {
|
||||
BlockSchemaComponentProvider,
|
||||
CollectionManagerProvider,
|
||||
SchemaComponent,
|
||||
SchemaComponentProvider
|
||||
SchemaComponentProvider,
|
||||
} from '@nocobase/client';
|
||||
import MockAdapter from 'axios-mock-adapter';
|
||||
import React from 'react';
|
||||
|
@ -21,5 +21,5 @@ export const getLunarDay = (date: moment.MomentInput) => {
|
||||
};
|
||||
|
||||
export const formatDate = (date: moment.Moment) => {
|
||||
return date.format('YYYY-MM-DDTHH:mm:ss.SSSZ')
|
||||
}
|
||||
return date.format('YYYY-MM-DDTHH:mm:ss.SSSZ');
|
||||
};
|
||||
|
@ -8,7 +8,7 @@ import {
|
||||
Cascader,
|
||||
SchemaComponent,
|
||||
SchemaComponentProvider,
|
||||
useAPIClient
|
||||
useAPIClient,
|
||||
} from '@nocobase/client';
|
||||
import MockAdapter from 'axios-mock-adapter';
|
||||
import React from 'react';
|
||||
|
@ -1,41 +1,40 @@
|
||||
import { connect, mapReadPretty, observer } from "@formily/react";
|
||||
import { Select, SelectProps, Tag } from "antd";
|
||||
import React from "react";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import { useCollectionManager } from "../../../collection-manager/hooks";
|
||||
import { useCompile } from "../../hooks";
|
||||
import { connect, mapReadPretty, observer } from '@formily/react';
|
||||
import { Select, SelectProps, Tag } from 'antd';
|
||||
import React from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { useCollectionManager } from '../../../collection-manager/hooks';
|
||||
import { useCompile } from '../../hooks';
|
||||
|
||||
export type CollectionSelectProps = SelectProps<any, any> & {
|
||||
filter?: (item: any, index: number, array: any[]) => boolean
|
||||
filter?: (item: any, index: number, array: any[]) => boolean;
|
||||
};
|
||||
|
||||
function useOptions({ filter }: CollectionSelectProps) {
|
||||
const compile = useCompile();
|
||||
const { collections = [] } = useCollectionManager();
|
||||
const filtered = typeof filter === 'function' ? collections.filter(filter) : collections;
|
||||
return filtered.filter(item => !item.hidden).map(item => ({
|
||||
return filtered
|
||||
.filter((item) => !item.hidden)
|
||||
.map((item) => ({
|
||||
label: compile(item.title),
|
||||
value: item.name,
|
||||
color: item.category?.color,
|
||||
}));
|
||||
}
|
||||
|
||||
export const CollectionSelect = connect((props: CollectionSelectProps) => {
|
||||
export const CollectionSelect = connect(
|
||||
(props: CollectionSelectProps) => {
|
||||
const { filter, ...others } = props;
|
||||
const options = useOptions(props);
|
||||
const { t } = useTranslation();
|
||||
|
||||
return (
|
||||
<Select
|
||||
placeholder={t('Select collection')}
|
||||
{...others}
|
||||
options={options}
|
||||
/>
|
||||
);
|
||||
}, mapReadPretty(observer((props: CollectionSelectProps) => {
|
||||
return <Select placeholder={t('Select collection')} {...others} options={options} />;
|
||||
},
|
||||
mapReadPretty(
|
||||
observer((props: CollectionSelectProps) => {
|
||||
const { mode } = props;
|
||||
const compile = useCompile();
|
||||
const options = useOptions(props).filter(option => {
|
||||
const options = useOptions(props).filter((option) => {
|
||||
if (mode === 'multiple') {
|
||||
return (props.value ?? []).includes(option.value);
|
||||
}
|
||||
@ -51,4 +50,6 @@ export const CollectionSelect = connect((props: CollectionSelectProps) => {
|
||||
))}
|
||||
</div>
|
||||
);
|
||||
})));
|
||||
}),
|
||||
),
|
||||
);
|
||||
|
@ -44,17 +44,13 @@ const ReadPretty = (props) => {
|
||||
return cronstrue.toString(props.value, {
|
||||
locale,
|
||||
use24HourTimeFormat: true,
|
||||
})
|
||||
});
|
||||
} catch {
|
||||
console.error(`The '${props.value}' is not a valid cron expression`)
|
||||
return props.value
|
||||
console.error(`The '${props.value}' is not a valid cron expression`);
|
||||
return props.value;
|
||||
}
|
||||
}, [props.value])
|
||||
return props.value ? (
|
||||
<span>
|
||||
{value}
|
||||
</span>
|
||||
) : null;
|
||||
}, [props.value]);
|
||||
return props.value ? <span>{value}</span> : null;
|
||||
};
|
||||
|
||||
export const Cron = connect(Input, mapReadPretty(ReadPretty)) as unknown as typeof Input & {
|
||||
|
@ -64,7 +64,14 @@ const CronSetInternal = (props: CronSetProps) => {
|
||||
return (
|
||||
<fieldset>
|
||||
<Select allowClear {...props} value={value} options={options} onChange={(value) => onCronChange(value)}></Select>
|
||||
{isCustomize ? <Cron value={value} onChange={(v) => onCronChange(v, true)} allowedDropdowns={['period', 'week-days', 'months', 'month-days']} allowedPeriods={['year', 'month', 'week', 'day', ]} /> : null}
|
||||
{isCustomize ? (
|
||||
<Cron
|
||||
value={value}
|
||||
onChange={(v) => onCronChange(v, true)}
|
||||
allowedDropdowns={['period', 'week-days', 'months', 'month-days']}
|
||||
allowedPeriods={['year', 'month', 'week', 'day']}
|
||||
/>
|
||||
) : null}
|
||||
</fieldset>
|
||||
);
|
||||
};
|
||||
@ -84,7 +91,11 @@ const ReadPretty = (props: CronSetProps) => {
|
||||
return value && options?.find((o) => o.value === value)?.label;
|
||||
}, [options, value]);
|
||||
|
||||
return <EllipsisWithTooltip ellipsis>{value && (label ? compile(label) : <Cron.ReadPretty {...props} />)}</EllipsisWithTooltip>;
|
||||
return (
|
||||
<EllipsisWithTooltip ellipsis>
|
||||
{value && (label ? compile(label) : <Cron.ReadPretty {...props} />)}
|
||||
</EllipsisWithTooltip>
|
||||
);
|
||||
};
|
||||
|
||||
export const CronSet = connect(CronSetInternal, mapReadPretty(ReadPretty));
|
||||
|
@ -76,4 +76,4 @@ export default {
|
||||
'十一月',
|
||||
'十二月',
|
||||
],
|
||||
}
|
||||
};
|
||||
|
@ -2,7 +2,7 @@ import { connect, mapProps, mapReadPretty } from '@formily/react';
|
||||
import { DatePicker as AntdDatePicker } from 'antd';
|
||||
import type {
|
||||
DatePickerProps as AntdDatePickerProps,
|
||||
RangePickerProps as AntdRangePickerProps
|
||||
RangePickerProps as AntdRangePickerProps,
|
||||
} from 'antd/lib/date-picker';
|
||||
import React from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
|
@ -3,7 +3,7 @@ import { isArr } from '@formily/shared';
|
||||
import { getDefaultFormat, str2moment } from '@nocobase/utils/client';
|
||||
import type {
|
||||
DatePickerProps as AntdDatePickerProps,
|
||||
RangePickerProps as AntdRangePickerProps
|
||||
RangePickerProps as AntdRangePickerProps,
|
||||
} from 'antd/lib/date-picker';
|
||||
import cls from 'classnames';
|
||||
import moment from 'moment';
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user