feat: 移动端筛选区块二期:支持更多类型 (#702)
Reviewed-on: daoyoucloud/tachycode#702 Co-authored-by: wjh <wwwjh0710@163.com> Co-committed-by: wjh <wwwjh0710@163.com>
This commit is contained in:
		
							parent
							
								
									ec406f25ef
								
							
						
					
					
						commit
						a1223960e2
					
				
							
								
								
									
										5
									
								
								.changeset/friendly-dingos-call.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								.changeset/friendly-dingos-call.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,5 @@ | |||||||
|  | --- | ||||||
|  | "@hera/plugin-mobile": patch | ||||||
|  | --- | ||||||
|  | 
 | ||||||
|  | 新增mobile筛选类型 | ||||||
| @ -73,7 +73,7 @@ export const SwiperFieldSettings = new SchemaSettings({ | |||||||
|           dn.refresh(); |           dn.refresh(); | ||||||
|         }; |         }; | ||||||
|         return { |         return { | ||||||
|           title: t('SetShowfield'), |           title: t('Set show field'), | ||||||
|           options, |           options, | ||||||
|           value: fieldSchema['x-component-props'].fieldValue, |           value: fieldSchema['x-component-props'].fieldValue, | ||||||
|           onChange, |           onChange, | ||||||
| @ -86,6 +86,7 @@ export const SwiperFieldSettings = new SchemaSettings({ | |||||||
|       useComponentProps() { |       useComponentProps() { | ||||||
|         const fieldSchema = useFieldSchema(); |         const fieldSchema = useFieldSchema(); | ||||||
|         const { dn } = useDesignable(); |         const { dn } = useDesignable(); | ||||||
|  |         const { t } = useTranslation(); | ||||||
|         const options = []; |         const options = []; | ||||||
|         for (let i = 1; i <= 20; i++) { |         for (let i = 1; i <= 20; i++) { | ||||||
|           options.push({ |           options.push({ | ||||||
| @ -104,7 +105,7 @@ export const SwiperFieldSettings = new SchemaSettings({ | |||||||
|           dn.refresh(); |           dn.refresh(); | ||||||
|         }; |         }; | ||||||
|         return { |         return { | ||||||
|           title: 'setFieldCount', |           title: t('Set field count'), | ||||||
|           options, |           options, | ||||||
|           value: fieldSchema['x-component-props'].pageSize || 5, |           value: fieldSchema['x-component-props'].pageSize || 5, | ||||||
|           onChange, |           onChange, | ||||||
|  | |||||||
| @ -1,36 +1,74 @@ | |||||||
| import { useMemo, useState } from 'react'; | import { useMemo, useState } from 'react'; | ||||||
| import { useFieldSchema } from '@nocobase/schema'; | import { useFieldSchema } from '@nocobase/schema'; | ||||||
| import { useTranslation } from '../../../../locale'; | import { useCollection, useCollectionManager, useDesignable, useDesigner } from '@nocobase/client'; | ||||||
| import { useCollection, useDesigner } from '@nocobase/client'; | import { canBeDataField, canBeRelatedField, convertFormat, isTabSearchCollapsibleInputItem } from '../../utils'; | ||||||
| import { isTabSearchCollapsibleInputItem } from '../../utils'; |  | ||||||
| import { useTabSearchCollapsibleInputItem } from './hooks'; | import { useTabSearchCollapsibleInputItem } from './hooks'; | ||||||
|  | import { dayjs } from '@nocobase/utils/client'; | ||||||
| 
 | 
 | ||||||
| export const useTabSearchCollapsibleInputItemAction = (props) => { | export const useTabSearchCollapsibleInputItemAction = (props) => { | ||||||
|   const { onSelected } = useTabSearchCollapsibleInputItem(); |   const { onSelected } = useTabSearchCollapsibleInputItem(); | ||||||
|   const fieldSchema = useFieldSchema(); |   const fieldSchema = useFieldSchema(); | ||||||
|   const collection = useCollection(); |   const collection = useCollection(); | ||||||
|  |   const cm = useCollectionManager(); | ||||||
|  |   const { dn } = useDesignable(); | ||||||
|   const collectionField = useMemo(() => collection?.getField(fieldSchema.name as any), [collection, fieldSchema.name]); |   const collectionField = useMemo(() => collection?.getField(fieldSchema.name as any), [collection, fieldSchema.name]); | ||||||
|   const properties = fieldSchema.parent.properties; |   const properties = fieldSchema.parent.properties; | ||||||
|   const Designer = useDesigner(); |   const Designer = useDesigner(); | ||||||
|   const [value, setValue] = useState(''); |  | ||||||
|   const [customLabelKey, setCustomLabelKey] = useState(fieldSchema['name'] as string); |   const [customLabelKey, setCustomLabelKey] = useState(fieldSchema['name'] as string); | ||||||
| 
 |   const [fieldInterface, setFieldInterface] = useState(fieldSchema['x-component-props'].interface); | ||||||
|  |   const defaultValue = canBeDataField(fieldInterface) | ||||||
|  |     ? convertFormat(new Date()) + '&' + convertFormat(new Date()) | ||||||
|  |     : ''; | ||||||
|  |   const [value, setValue] = useState(defaultValue); | ||||||
|   const options = Object.values(properties) |   const options = Object.values(properties) | ||||||
|     .map((option) => { |     .map((option) => { | ||||||
|       if (isTabSearchCollapsibleInputItem(option['x-component'])) { |       if (isTabSearchCollapsibleInputItem(option['x-component'])) { | ||||||
|         return { |         return { | ||||||
|           label: option['title'], |           label: option['title'], | ||||||
|           value: option['name'], |           value: option['name'], | ||||||
|  |           interface: option['x-component-props'].interface, | ||||||
|         }; |         }; | ||||||
|       } |       } | ||||||
|     }) |     }) | ||||||
|     .filter(Boolean); |     .filter(Boolean); | ||||||
| 
 | 
 | ||||||
|   const onSelect = (value) => { |   const onSelect = (value) => { | ||||||
|     onSelected([value], customLabelKey); |     let time; | ||||||
|  |     let filterKey = `${customLabelKey}.$includes`; | ||||||
|  |     if (canBeDataField(fieldInterface)) { | ||||||
|  |       time = value.split('&'); | ||||||
|  |       filterKey = `${customLabelKey}.$dateBetween`; | ||||||
|  |     } | ||||||
|  |     if (canBeRelatedField(fieldInterface)) { | ||||||
|  |       const label = fieldSchema['x-component-props']['fieldNames'].label; | ||||||
|  |       const correlation = fieldSchema['x-component-props']['correlation']; | ||||||
|  |       filterKey = `${correlation}.${label}.$includes`; | ||||||
|  |     } | ||||||
|  |     onSelected(time || [value], filterKey); | ||||||
|   }; |   }; | ||||||
| 
 | 
 | ||||||
|   const onSelectChange = (label) => setCustomLabelKey(label as string); |   const onSelectChange = (label) => { | ||||||
|  |     const type = Object.values(properties).find((value) => value.name === label)['x-component-props'].interface; | ||||||
|  |     if (canBeRelatedField(type)) { | ||||||
|  |       const titleField = cm.getCollection(collection.name + '.' + label).titleField; | ||||||
|  |       fieldSchema['x-component-props']['correlation'] = label; | ||||||
|  |       fieldSchema['x-component-props']['fieldNames'] = { label: titleField }; | ||||||
|  |       dn.emit('patch', { | ||||||
|  |         schema: { | ||||||
|  |           ['u-id']: fieldSchema['u-id'], | ||||||
|  |           ['x-component-props']: fieldSchema['x-component-props'], | ||||||
|  |         }, | ||||||
|  |       }); | ||||||
|  |       dn.refresh(); | ||||||
|  |     } | ||||||
|  |     setFieldInterface(type); | ||||||
|  |     if (canBeDataField(type)) { | ||||||
|  |       setValue(convertFormat(new Date()) + '&' + convertFormat(new Date())); | ||||||
|  |     } else { | ||||||
|  |       setValue(''); | ||||||
|  |     } | ||||||
|  |     setCustomLabelKey(label as string); | ||||||
|  |   }; | ||||||
|   const onInputChange = (v) => { |   const onInputChange = (v) => { | ||||||
|     const inputValue = v.target?.value || v; |     const inputValue = v.target?.value || v; | ||||||
|     setValue(inputValue); |     setValue(inputValue); | ||||||
| @ -41,6 +79,20 @@ export const useTabSearchCollapsibleInputItemAction = (props) => { | |||||||
|   const onButtonClick = () => { |   const onButtonClick = () => { | ||||||
|     onSelect(value); |     onSelect(value); | ||||||
|   }; |   }; | ||||||
|  |   const onDateClick = (time) => { | ||||||
|  |     onSelect(time); | ||||||
|  |   }; | ||||||
| 
 | 
 | ||||||
|   return { collectionField, Designer, options, value, onSelectChange, onInputChange, onButtonClick, customLabelKey }; |   return { | ||||||
|  |     collectionField, | ||||||
|  |     Designer, | ||||||
|  |     options, | ||||||
|  |     value, | ||||||
|  |     onSelectChange, | ||||||
|  |     onInputChange, | ||||||
|  |     onButtonClick, | ||||||
|  |     customLabelKey, | ||||||
|  |     fieldInterface, | ||||||
|  |     onDateClick, | ||||||
|  |   }; | ||||||
| }; | }; | ||||||
|  | |||||||
| @ -2,24 +2,40 @@ import { SortableItem, withDynamicSchemaProps } from '@nocobase/client'; | |||||||
| import { Grid } from 'antd-mobile'; | import { Grid } from 'antd-mobile'; | ||||||
| import React from 'react'; | import React from 'react'; | ||||||
| import { useTabSearchCollapsibleInputItemAction } from './TabSearchCollapsibleInputItemAction'; | import { useTabSearchCollapsibleInputItemAction } from './TabSearchCollapsibleInputItemAction'; | ||||||
| import { IButton, IInput, ISelect } from './TabSearchCollapsibleInputMItemChild'; | import { IButton, IDatePicker, IInput, ISelect } from './TabSearchCollapsibleInputMItemChild'; | ||||||
|  | import { canBeDataField } from '../../utils'; | ||||||
| 
 | 
 | ||||||
| export const TabSearchCollapsibleInputMItem = withDynamicSchemaProps( | export const TabSearchCollapsibleInputMItem = withDynamicSchemaProps( | ||||||
|   (props) => { |   (props) => { | ||||||
|     const { collectionField, Designer, options, value, onSelectChange, onInputChange, onButtonClick, customLabelKey } = |     const { | ||||||
|       useTabSearchCollapsibleInputItemAction(props); |       collectionField, | ||||||
|  |       Designer, | ||||||
|  |       options, | ||||||
|  |       value, | ||||||
|  |       onSelectChange, | ||||||
|  |       onInputChange, | ||||||
|  |       onButtonClick, | ||||||
|  |       customLabelKey, | ||||||
|  |       fieldInterface, | ||||||
|  |       onDateClick, | ||||||
|  |     } = useTabSearchCollapsibleInputItemAction(props); | ||||||
| 
 | 
 | ||||||
|     if (!collectionField) { |     if (!collectionField) { | ||||||
|       return null; |       return null; | ||||||
|     } |     } | ||||||
| 
 |  | ||||||
|     return ( |     return ( | ||||||
|       <SortableItem> |       <SortableItem> | ||||||
|         <Designer /> |         <Designer /> | ||||||
|         <Grid columns={4} style={{ backgroundColor: '#f9f9f9', borderRadius: '5px', margin: '5px 0 0 0' }}> |         <Grid columns={4} style={{ backgroundColor: '#f9f9f9', borderRadius: '5px', margin: '5px 0 0 0' }}> | ||||||
|           <ISelect options={options} onChange={onSelectChange} customLabelKey={customLabelKey} /> |           <ISelect options={options} onChange={onSelectChange} customLabelKey={customLabelKey} /> | ||||||
|           <IInput options={options} value={value} onChange={onInputChange} /> |           {canBeDataField(fieldInterface) ? ( | ||||||
|           <IButton onClick={onButtonClick} /> |             <IDatePicker value={value} onChange={onDateClick} onInputChange={onInputChange} options={options} /> | ||||||
|  |           ) : ( | ||||||
|  |             <> | ||||||
|  |               <IInput options={options} value={value} onChange={onInputChange} /> | ||||||
|  |               <IButton onClick={onButtonClick} /> | ||||||
|  |             </> | ||||||
|  |           )} | ||||||
|         </Grid> |         </Grid> | ||||||
|       </SortableItem> |       </SortableItem> | ||||||
|     ); |     ); | ||||||
|  | |||||||
| @ -1,8 +1,9 @@ | |||||||
| import React, { useState } from 'react'; | import React, { useState } from 'react'; | ||||||
| import { useTranslation } from '../../../../locale'; | import { useTranslation } from '../../../../locale'; | ||||||
| import { Grid, Divider, Picker, Input, Space, ActionSheet } from 'antd-mobile'; | import { Grid, Divider, Picker, Input, Space, ActionSheet, DatePicker, CalendarPicker } from 'antd-mobile'; | ||||||
| import { DownOutline } from 'antd-mobile-icons'; | import { DownOutline } from 'antd-mobile-icons'; | ||||||
| import type { Action } from 'antd-mobile/es/components/action-sheet'; | import type { Action } from 'antd-mobile/es/components/action-sheet'; | ||||||
|  | import { convertFormat } from '../../utils'; | ||||||
| 
 | 
 | ||||||
| export const ISelect = (props) => { | export const ISelect = (props) => { | ||||||
|   const { options, onChange, customLabelKey } = props; |   const { options, onChange, customLabelKey } = props; | ||||||
| @ -53,6 +54,43 @@ export const ISelect = (props) => { | |||||||
|   ) : null; |   ) : null; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | export const IDatePicker = (props) => { | ||||||
|  |   const { options, value, onChange, onInputChange } = props; | ||||||
|  |   const time = value.split('&'); | ||||||
|  |   const [visible, setVisible] = useState(false); | ||||||
|  |   return ( | ||||||
|  |     <Grid.Item span={options.length > 1 ? 3 : 4}> | ||||||
|  |       <div | ||||||
|  |         onClick={() => { | ||||||
|  |           setVisible(true); | ||||||
|  |         }} | ||||||
|  |       > | ||||||
|  |         <Grid columns={5}> | ||||||
|  |           <Grid.Item span={2} style={{ textAlign: 'end' }}> | ||||||
|  |             {time[0]} | ||||||
|  |           </Grid.Item> | ||||||
|  |           <Grid.Item span={1} style={{ textAlign: 'center' }}> | ||||||
|  |             - | ||||||
|  |           </Grid.Item> | ||||||
|  |           <Grid.Item span={2} style={{ textAlign: 'start' }}> | ||||||
|  |             {time[1]} | ||||||
|  |           </Grid.Item> | ||||||
|  |         </Grid> | ||||||
|  |       </div> | ||||||
|  |       <CalendarPicker | ||||||
|  |         visible={visible} | ||||||
|  |         selectionMode="range" | ||||||
|  |         onMaskClick={() => setVisible(false)} | ||||||
|  |         onClose={() => setVisible(false)} | ||||||
|  |         onConfirm={(v) => { | ||||||
|  |           onInputChange(convertFormat(v[0]) + '&' + convertFormat(v[1])); | ||||||
|  |           onChange(convertFormat(v[0]) + '&' + convertFormat(v[1])); | ||||||
|  |         }} | ||||||
|  |       /> | ||||||
|  |     </Grid.Item> | ||||||
|  |   ); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| export const IInput = (props) => { | export const IInput = (props) => { | ||||||
|   const { options, value, onChange } = props; |   const { options, value, onChange } = props; | ||||||
|   const { t } = useTranslation(); |   const { t } = useTranslation(); | ||||||
| @ -71,7 +109,6 @@ export const IInput = (props) => { | |||||||
| export const IButton = (props) => { | export const IButton = (props) => { | ||||||
|   const { onClick } = props; |   const { onClick } = props; | ||||||
|   const { t } = useTranslation(); |   const { t } = useTranslation(); | ||||||
| 
 |  | ||||||
|   return ( |   return ( | ||||||
|     <Grid.Item onClick={onClick} style={{ color: '#2c6eff', textAlign: 'center', cursor: 'pointer' }}> |     <Grid.Item onClick={onClick} style={{ color: '#2c6eff', textAlign: 'center', cursor: 'pointer' }}> | ||||||
|       {t('Search')} |       {t('Search')} | ||||||
|  | |||||||
| @ -15,7 +15,7 @@ export const useTabSearchFieldItemAction = (props) => { | |||||||
|   const labelKey = _labelKey || fieldSchema['x-component-props']?.fieldNames?.label || valueKey; |   const labelKey = _labelKey || fieldSchema['x-component-props']?.fieldNames?.label || valueKey; | ||||||
|   const onSelect = (itemKey) => { |   const onSelect = (itemKey) => { | ||||||
|     const key = itemKey.keyPath?.[0] || itemKey; |     const key = itemKey.keyPath?.[0] || itemKey; | ||||||
|     onSelected([key], null, filterKey); |     onSelected([key], filterKey); | ||||||
|   }; |   }; | ||||||
|   const fieldNames = { |   const fieldNames = { | ||||||
|     title: labelKey || valueKey, |     title: labelKey || valueKey, | ||||||
|  | |||||||
| @ -8,7 +8,6 @@ import { canBeOptionalField } from '../../utils'; | |||||||
| export const useTabSearchFieldItemProps = () => { | export const useTabSearchFieldItemProps = () => { | ||||||
|   const fieldSchema = useFieldSchema(); |   const fieldSchema = useFieldSchema(); | ||||||
|   const collection = useCollection(); |   const collection = useCollection(); | ||||||
| 
 |  | ||||||
|   const optionalFieldList = useOptionalFieldList(); |   const optionalFieldList = useOptionalFieldList(); | ||||||
|   const cm = useCollectionManager(); |   const cm = useCollectionManager(); | ||||||
|   const collectionField = useMemo(() => collection?.getField(fieldSchema.name as any), [collection, fieldSchema.name]); |   const collectionField = useMemo(() => collection?.getField(fieldSchema.name as any), [collection, fieldSchema.name]); | ||||||
|  | |||||||
| @ -9,16 +9,13 @@ export const useTabSearchCollapsibleInputItem = () => { | |||||||
|   const { getDataBlocks } = useFilterBlock(); |   const { getDataBlocks } = useFilterBlock(); | ||||||
|   const collectionField = useMemo(() => collection?.getField(fieldSchema.name as any), [collection, fieldSchema.name]); |   const collectionField = useMemo(() => collection?.getField(fieldSchema.name as any), [collection, fieldSchema.name]); | ||||||
| 
 | 
 | ||||||
|   const onSelected = (value, customLabelKey?, filterKey?) => { |   const onSelected = (value, filterKey) => { | ||||||
|     const { targets, uid } = findFilterTargets(fieldSchema); |     const { targets, uid } = findFilterTargets(fieldSchema); | ||||||
|     getDataBlocks().forEach((block) => { |     getDataBlocks().forEach((block) => { | ||||||
|       const target = targets.find((target) => target.uid === block.uid); |       const target = targets.find((target) => target.uid === block.uid); | ||||||
|       if (!target) return; |       if (!target) return; | ||||||
|       const key = `${uid}${fieldSchema.name}`; |       const key = `${uid}${fieldSchema.name}`; | ||||||
|       const param = block.service.params?.[0] || {}; |       const param = block.service.params?.[0] || {}; | ||||||
|       if (!collectionField?.target && customLabelKey) { |  | ||||||
|         filterKey = `${customLabelKey}.$includes`; |  | ||||||
|       } |  | ||||||
|       // 保留原有的 filter
 |       // 保留原有的 filter
 | ||||||
|       let storedFilter = block.service.params?.[1]?.filters || {}; |       let storedFilter = block.service.params?.[1]?.filters || {}; | ||||||
|       if (value.length) { |       if (value.length) { | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| export const createTabSearchItemSchema = (options) => { | export const createTabSearchItemSchema = (options) => { | ||||||
|   const { field, itemComponent, label, itemUseProps } = options; |   const { field, itemComponent, label, itemUseProps, collection } = options; | ||||||
|   return { |   return { | ||||||
|     name: field.key, |     name: field.key, | ||||||
|     title: field.uiSchema?.title, |     title: field.uiSchema?.title, | ||||||
| @ -17,6 +17,8 @@ export const createTabSearchItemSchema = (options) => { | |||||||
|           label, |           label, | ||||||
|         }, |         }, | ||||||
|         interface: field.interface, |         interface: field.interface, | ||||||
|  |         collectionName: collection?.name, | ||||||
|  |         correlation: field.name, | ||||||
|       }, |       }, | ||||||
|       properties: {}, |       properties: {}, | ||||||
|     }, |     }, | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| import { SchemaInitializer, SchemaInitializerItemType, useCollection, useCollectionManager } from '@nocobase/client'; | import { SchemaInitializer, SchemaInitializerItemType, useCollection, useCollectionManager } from '@nocobase/client'; | ||||||
| import _ from 'lodash'; | import _ from 'lodash'; | ||||||
| import { tval } from '../../../locale'; | import { tval } from '../../../locale'; | ||||||
| import { canBeOptionalField, canBeRelatedField, canBeSearchField } from '../utils'; | import { canBeDataField, canBeOptionalField, canBeRelatedField, canBeSearchField } from '../utils'; | ||||||
| import { createTabSearchItemSchema } from '../create/createTabSearchItemSchema'; | import { createTabSearchItemSchema } from '../create/createTabSearchItemSchema'; | ||||||
| import { useIsMobile } from '../components/field-item/hooks'; | import { useIsMobile } from '../components/field-item/hooks'; | ||||||
| 
 | 
 | ||||||
| @ -12,13 +12,19 @@ const textFieldsItem: SchemaInitializerItemType<any> = { | |||||||
|   useChildren() { |   useChildren() { | ||||||
|     const collection = useCollection(); |     const collection = useCollection(); | ||||||
|     const associatedFields = collection.fields; |     const associatedFields = collection.fields; | ||||||
|  |     const cm = useCollectionManager(); | ||||||
|     const isMobield = useIsMobile(); |     const isMobield = useIsMobile(); | ||||||
|     const itemComponent = isMobield ? 'TabSearchCollapsibleInputMItem' : 'TabSearchCollapsibleInputItem'; |     const itemComponent = isMobield ? 'TabSearchCollapsibleInputMItem' : 'TabSearchCollapsibleInputItem'; | ||||||
|     const children = associatedFields |     const children = associatedFields | ||||||
|       .map((field) => { |       .map((field) => { | ||||||
|         if (canBeSearchField(field.interface) || (canBeOptionalField(field.interface) && !field['isForeignKey'])) { |         if ( | ||||||
|           const label = field.name; |           !field['isForeignKey'] && | ||||||
|           return createTabSearchItemSchema({ field, itemComponent, label }); |           (canBeSearchField(field.interface) || canBeRelatedField(field.interface) || canBeDataField(field.interface)) | ||||||
|  |         ) { | ||||||
|  |           const label = canBeRelatedField(field.interface) | ||||||
|  |             ? cm.getCollection(`${collection.name}.${field.name}`).titleField | ||||||
|  |             : field.name; | ||||||
|  |           return createTabSearchItemSchema({ field, itemComponent, label, collection }); | ||||||
|         } |         } | ||||||
|       }) |       }) | ||||||
|       .filter(Boolean); |       .filter(Boolean); | ||||||
|  | |||||||
| @ -72,8 +72,12 @@ export const TabSearchItemFieldSettings = new SchemaSettings({ | |||||||
|               const { t } = useTranslation(); |               const { t } = useTranslation(); | ||||||
|               const cm = useCollectionManager(); |               const cm = useCollectionManager(); | ||||||
|               const c = useCollection(); |               const c = useCollection(); | ||||||
|  |               const fieldCollection = fieldSchema['x-component-props']?.['collectionName']; | ||||||
|  |               const correlation = fieldSchema['x-component-props']?.['correlation']; | ||||||
|               const collectionField = |               const collectionField = | ||||||
|                 c.getField(fieldSchema['name']) || cm.getCollectionField(fieldSchema['x-collection-field']); |                 c.getField(fieldSchema['name']) || | ||||||
|  |                 cm.getCollectionField(fieldSchema['x-collection-field']) || | ||||||
|  |                 cm.getCollection(fieldCollection + '.' + correlation); | ||||||
|               const compile = useCompile(); |               const compile = useCompile(); | ||||||
|               const { dn } = useDesignable(); |               const { dn } = useDesignable(); | ||||||
|               const targetFields = collectionField?.target ? cm.getCollectionFields(collectionField?.target) : []; |               const targetFields = collectionField?.target ? cm.getCollectionFields(collectionField?.target) : []; | ||||||
| @ -87,6 +91,7 @@ export const TabSearchItemFieldSettings = new SchemaSettings({ | |||||||
|                 const schema = { |                 const schema = { | ||||||
|                   ['x-uid']: fieldSchema['x-uid'], |                   ['x-uid']: fieldSchema['x-uid'], | ||||||
|                 }; |                 }; | ||||||
|  | 
 | ||||||
|                 const fieldNames = { |                 const fieldNames = { | ||||||
|                   ...collectionField?.uiSchema?.['x-component-props']?.['fieldNames'], |                   ...collectionField?.uiSchema?.['x-component-props']?.['fieldNames'], | ||||||
|                   ...fieldSchema['x-component-props']?.['fieldNames'], |                   ...fieldSchema['x-component-props']?.['fieldNames'], | ||||||
| @ -94,6 +99,7 @@ export const TabSearchItemFieldSettings = new SchemaSettings({ | |||||||
|                 }; |                 }; | ||||||
|                 fieldSchema['x-component-props'] = fieldSchema['x-component-props'] || {}; |                 fieldSchema['x-component-props'] = fieldSchema['x-component-props'] || {}; | ||||||
|                 fieldSchema['x-component-props']['fieldNames'] = fieldNames; |                 fieldSchema['x-component-props']['fieldNames'] = fieldNames; | ||||||
|  | 
 | ||||||
|                 schema['x-component-props'] = fieldSchema['x-component-props']; |                 schema['x-component-props'] = fieldSchema['x-component-props']; | ||||||
|                 dn.emit('patch', { |                 dn.emit('patch', { | ||||||
|                   schema, |                   schema, | ||||||
| @ -111,7 +117,10 @@ export const TabSearchItemFieldSettings = new SchemaSettings({ | |||||||
|             }, |             }, | ||||||
|             useVisible() { |             useVisible() { | ||||||
|               const fieldSchema = useFieldSchema(); |               const fieldSchema = useFieldSchema(); | ||||||
|               return !isTabSearchCollapsibleInputItem(fieldSchema['x-component']); |               return ( | ||||||
|  |                 isTabSearchCollapsibleInputItem(fieldSchema['x-component']) || | ||||||
|  |                 fieldSchema['x-component-props']?.['correlation'] | ||||||
|  |               ); | ||||||
|             }, |             }, | ||||||
|           }, |           }, | ||||||
|         ]; |         ]; | ||||||
|  | |||||||
| @ -1,5 +1,8 @@ | |||||||
|  | import { dayjs } from '@nocobase/utils/client'; | ||||||
|  | 
 | ||||||
| const canBeOptionalFields = ['select', 'multipleSelect', 'radioGroup', 'checkboxGroup']; | const canBeOptionalFields = ['select', 'multipleSelect', 'radioGroup', 'checkboxGroup']; | ||||||
| const canBeRelatedFields = ['oho', 'obo', 'o2m', 'm2o', 'm2m']; | const canBeRelatedFields = ['oho', 'obo', 'o2m', 'm2o', 'm2m']; | ||||||
|  | const canBeDataFields = ['datetime']; | ||||||
| 
 | 
 | ||||||
| const canBeSearchFields = [ | const canBeSearchFields = [ | ||||||
|   'input', |   'input', | ||||||
| @ -22,5 +25,9 @@ export const isTabSearchCollapsibleInputItem = (component: string) => | |||||||
| 
 | 
 | ||||||
| export const canBeOptionalField = (_interface: string) => canBeOptionalFields.includes(_interface); | export const canBeOptionalField = (_interface: string) => canBeOptionalFields.includes(_interface); | ||||||
| export const canBeRelatedField = (_interface: string) => canBeRelatedFields.includes(_interface); | export const canBeRelatedField = (_interface: string) => canBeRelatedFields.includes(_interface); | ||||||
| 
 | export const canBeDataField = (_interface: string) => canBeDataFields.includes(_interface); | ||||||
| export const canBeSearchField = (_interface: string) => canBeSearchFields.includes(_interface); | export const canBeSearchField = (_interface: string) => canBeSearchFields.includes(_interface); | ||||||
|  | 
 | ||||||
|  | export const convertFormat = (currentDate) => { | ||||||
|  |   return dayjs(currentDate).format('YYYY-MM-DD'); | ||||||
|  | }; | ||||||
|  | |||||||
							
								
								
									
										14
									
								
								packages/plugins/@hera/plugin-mobile/src/locale/en-US.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								packages/plugins/@hera/plugin-mobile/src/locale/en-US.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | |||||||
|  | { | ||||||
|  |   "Choices fields":"Choices fields", | ||||||
|  |   "Text fields":"Text fields", | ||||||
|  |   "Generic properties":"Generic properties", | ||||||
|  |   "Search":"Search", | ||||||
|  |   "Please enter search content":"Please enter search content", | ||||||
|  |   "Title field":"Title field", | ||||||
|  |   "Set show field":"Set show field", | ||||||
|  |   "Set field count":"Set field count", | ||||||
|  |   "Configure field": "Configure field", | ||||||
|  |   "Configure fields": "Configure fields", | ||||||
|  |   "Configure columns": "Configure columns", | ||||||
|  |   "Add block": "Add block" | ||||||
|  | } | ||||||
							
								
								
									
										14
									
								
								packages/plugins/@hera/plugin-mobile/src/locale/zh-CN.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								packages/plugins/@hera/plugin-mobile/src/locale/zh-CN.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | |||||||
|  | { | ||||||
|  |   "Choices fields":"选择字段", | ||||||
|  |   "Text fields":"文本字段", | ||||||
|  |   "Generic properties":"通用属性", | ||||||
|  |   "Search":"搜索", | ||||||
|  |   "Please enter search content":"请输入查询内容", | ||||||
|  |   "Title field":"标题字段", | ||||||
|  |   "Set show field":"设置展示字段", | ||||||
|  |   "Set field count":"设置展示数量", | ||||||
|  |   "Configure field": "配置字段", | ||||||
|  |   "Configure fields": "配置字段", | ||||||
|  |   "Configure columns": "配置字段", | ||||||
|  |   "Add block": "创建区块" | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user