You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					134 lines
				
				4.0 KiB
			
		
		
			
		
	
	
					134 lines
				
				4.0 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								{@link LayoutElement} is used to change the default layout of `edit`, `show` and `new` {@link Action actions}.
							 | 
						||
| 
								 | 
							
								You define the layout as an {@link Array<LayoutElement>} and AdminJS renders it with React components.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								You don't have to know React, to create a usable Layout for your actions but be sure
							 | 
						||
| 
								 | 
							
								to take a look at the possible **Props** which can be used to style the components.
							 | 
						||
| 
								 | 
							
								The most often used props are {@link BoxProps}, because {@link Box} is the default wrapper.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Available values for a {@link LayoutElement} type
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								To {@link Action#layout } you have to pass an {@link Array<LayoutElement>}. Where each
							 | 
						||
| 
								 | 
							
								{@link LayoutElement} could have a different type defining its position and purpose.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Type definition
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Those are available types for {@link LayoutElement}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								| Type    | Purpose | Example |
							 | 
						||
| 
								 | 
							
								|---------------|--------------------------------------------------------------|------------------|
							 | 
						||
| 
								 | 
							
								| string        | It will be changed to the property in vertical layout        | `layout: ['name']` |
							 | 
						||
| 
								 | 
							
								| {@link Array<string>} |  It will be changed to the properties in vertical layout     | `layout: [['name', 'surname']]` |
							 | 
						||
| 
								 | 
							
								| [string, {@link BoxProps}] | property wrapped by {@link Box} component with {@link BoxProps} | `layout: [['name', {width: 1/2}]]` |
							 | 
						||
| 
								 | 
							
								| [{@link BoxProps}, {@link Array<LayoutElement>}] | Creates a Box and nest all the child LayoutElements inside. | `layout: [[{width: 1/2}, ['name', 'surname']]]` |
							 | 
						||
| 
								 | 
							
								| {@link Array<LayoutElement>} | For grouping LayoutElements inside a wrapper          | `layout: [['name', {mt: 'xl'}], ['surname', , {ml: 'xl'}]]` |
							 | 
						||
| 
								 | 
							
								| [@ComponentName, PropsWithChildren<ComponentProps>] | if you precede first item with "@" it will create component of this name | `layout: [['@Header', {children: 'User Data'}]]` |
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Examples
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Let say you have following properties in your database: `companyName`, `email`, `address` and `companySize`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#### 1. The simplest horizontal layout:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								const layout = [
							 | 
						||
| 
								 | 
							
								 'companyName',
							 | 
						||
| 
								 | 
							
								 'email',
							 | 
						||
| 
								 | 
							
								 'address',
							 | 
						||
| 
								 | 
							
								 'companySize',
							 | 
						||
| 
								 | 
							
								]
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								generates:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<img src='./images/layout1.png' style="margin-bottom: 20px">
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#### 2. Now Wrap everything with a {@link Box} of `2/3` max-width and horizontal margin (mx) set to auto. This will center all inputs
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								const layout = [
							 | 
						||
| 
								 | 
							
								  [{ width: 2 / 3, mx: 'auto' }, [
							 | 
						||
| 
								 | 
							
								    'companyName',
							 | 
						||
| 
								 | 
							
								    'email',
							 | 
						||
| 
								 | 
							
								    'address',
							 | 
						||
| 
								 | 
							
								    'companySize',
							 | 
						||
| 
								 | 
							
								  ]],
							 | 
						||
| 
								 | 
							
								]
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								generates:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<img src='./images/layout2.png'>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								> Hint: you can also pass an array to `width` to define how it will behave in a different responsive breakpoints.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#### 3. Add headers between sections
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								const layout = [
							 | 
						||
| 
								 | 
							
								  [{ width: 2 / 3, mx: 'auto' }, [
							 | 
						||
| 
								 | 
							
								    ['@H3', { children: 'Company data' }],
							 | 
						||
| 
								 | 
							
								    'companyName',
							 | 
						||
| 
								 | 
							
								    'companySize',
							 | 
						||
| 
								 | 
							
								    ['@H3', { children: 'Contact Info' }],
							 | 
						||
| 
								 | 
							
								    'email',
							 | 
						||
| 
								 | 
							
								    'address',
							 | 
						||
| 
								 | 
							
								  ]],
							 | 
						||
| 
								 | 
							
								]
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								generates:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<img src='./images/layout3.png' style="margin-bottom: 20px" >
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								> To inject content inside the given Component pass children props to it.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#### 4. Make email and address 50% width
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								We will wrap them with a {@link Box} (default component) which is a flex.
							 | 
						||
| 
								 | 
							
								Then we will have to wrap also each of them with extra box to define paddings.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								I will also align to left top section that by removing `{ mx: auto }` and changing width to `1 / 2`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								const layout = [{ width: 1 / 2 }, [
							 | 
						||
| 
								 | 
							
								    ['@H3', { children: 'Company data' }],
							 | 
						||
| 
								 | 
							
								    'companyName',
							 | 
						||
| 
								 | 
							
								    'companySize',
							 | 
						||
| 
								 | 
							
								  ]],
							 | 
						||
| 
								 | 
							
								  [
							 | 
						||
| 
								 | 
							
								    ['@H3', { children: 'Contact Info' }],
							 | 
						||
| 
								 | 
							
								    [{ flexDirection: 'row', flex: true }, [
							 | 
						||
| 
								 | 
							
								      ['email', { pr: 'default', flexGrow: 1 }],
							 | 
						||
| 
								 | 
							
								      ['address', { flexGrow: 1 }],
							 | 
						||
| 
								 | 
							
								    ]],
							 | 
						||
| 
								 | 
							
								  ],
							 | 
						||
| 
								 | 
							
								]
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								generates:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<img src='./images/layout4.png' style="margin-bottom: 20px">
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#### 5. Lastly, take a look at the example with a function instead of {@link LayoutElement}.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								const layout = currentAdmin => ([
							 | 
						||
| 
								 | 
							
								 ['@MessageBox', {
							 | 
						||
| 
								 | 
							
								   message: `Welcome ${currentAdmin && currentAdmin.email}`,
							 | 
						||
| 
								 | 
							
								   children: 'On this page yo can do whatever you like',
							 | 
						||
| 
								 | 
							
								   variant: 'info',
							 | 
						||
| 
								 | 
							
								   mb: 'xxl',
							 | 
						||
| 
								 | 
							
								 }],
							 | 
						||
| 
								 | 
							
								 [
							 | 
						||
| 
								 | 
							
								   'companyName',
							 | 
						||
| 
								 | 
							
								   'companySize',
							 | 
						||
| 
								 | 
							
								   'email',
							 | 
						||
| 
								 | 
							
								   'address',
							 | 
						||
| 
								 | 
							
								 ],
							 | 
						||
| 
								 | 
							
								])
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Generates following **Show** page:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<img src='./images/layout5.png'>
							 |