UNPKG

4.08 kBJavaScriptView Raw
1import {
2 VRow, VCol, VTextField, VTextarea, VSheet, VTab, VTabItem, VIcon,
3 VWindowItem,
4} from 'vuetify/lib/components';
5import {
6 NumberField, IntegerField, PasswordField, PhoneField, EmailField,
7 SelectField, AutocompleteField, SwitchField, CheckBoxField,
8 RadioGroupField, DateField, DateTimeField, SlugField,
9 HtmlField, HasuraFileField, HasuraFilesField, ApolloRemoteAutocomplete,
10 ArrayField, MaskedInput, ComboboxField, BottomNavigation, TabsContainer,
11} from './components';
12
13export default {
14 row: {
15 component: VRow,
16 childResolver: (child) => {
17 const { props: childProps = {} } = child;
18 const allProps = ['align-self', 'cols', 'lg', 'md', 'offset', 'offset-lg', 'offset-md', 'offset-sm', 'offset-xl', 'order', 'order-lg', 'order-md', 'order-sm', 'order-xl', 'sm', 'xl'];
19 const keys = Object.keys(childProps).filter((key) => allProps.includes(key));
20 const props = Object.assign({ cols: 12 }, ...keys.map((key) => ({ [key]: childProps[key] })));
21
22 return !child
23 ? []
24 : [{
25 component: VCol, type: 'col', props, children: [child],
26 }];
27 },
28 postProcessProps: ({ props, item }) => ({ props: { ...props, item } }),
29 },
30 text: { component: VTextField },
31 mask: {
32 component: MaskedInput,
33 postProcessProps: ({ props }) => ({ props, attrs: props }),
34 },
35 sheet: { component: VSheet },
36 textArea: { component: VTextarea },
37 number: { component: NumberField, postProcess: (val) => parseFloat(val) },
38 int: { component: IntegerField, postProcess: (val) => parseInt(val, 10) },
39 password: { component: PasswordField },
40 phone: {
41 component: PhoneField,
42 postProcessProps: ({ props }) => ({ props, attrs: props }),
43 },
44 email: { component: EmailField },
45 select: { component: SelectField },
46 combobox: { component: ComboboxField },
47 autocomplete: { component: AutocompleteField },
48 switch: { component: SwitchField },
49 checkbox: { component: CheckBoxField },
50 radio: { component: RadioGroupField },
51 date: { component: DateField, postProcessProps: ({ props }) => ({ props, attrs: props }) },
52 datetime: {
53 component: DateTimeField, postProcessProps: ({ props }) => ({ props, attrs: props }),
54 },
55 slug: {
56 component: SlugField,
57 postProcessProps: ({ props, item }) => ({ props: { ...props, item } }),
58 },
59 html: { component: HtmlField },
60 file: { component: HasuraFileField },
61 files: { component: HasuraFilesField },
62 remote: {
63 component: ApolloRemoteAutocomplete,
64 methods: ['onResponse', 'onFetched'], // , 'filter'
65 postProcessProps: ({ props }) => ({ props, attrs: props }),
66 },
67 array: {
68 component: ArrayField,
69 postProcessProps: ({ props, options }) => ({ props: { ...props, $options: options } }),
70 },
71 tabs: {
72 component: TabsContainer,
73 postProcessProps: ({ props }) => ({ props, attrs: props }),
74 childResolver: (child) => {
75 const { props = {} } = child;
76 const key = props.key || `${props.label}_${props.icon}`;
77 const { tab = { class: 'pt-3' } } = props;
78
79 return [
80 {
81 component: VTab,
82 props: { key, ...props },
83 children: [
84 props.icon && { component: VIcon, class: { 'mr-2': true }, children: [props.icon] },
85 props.label,
86 ].filter((x) => !!x),
87 },
88 {
89 component: VTabItem,
90 ...tab,
91 props: { key, ...tab.props },
92 children: [child],
93 }];
94 },
95 },
96 bottomTabs: {
97 component: BottomNavigation,
98 postProcessProps: ({ props }, { renderedChildren, children }) => ({
99 props: {
100 ...props,
101 tabs: renderedChildren.map((x, i) => !!x && children[i].children[0].props).filter((x) => !!x),
102 },
103 }),
104 childResolver: (child) => {
105 const { props = {} } = child;
106 const key = props.key || `${props.label}_${props.icon}`;
107 const { tab = { class: 'pt-3' } } = props;
108
109 return [{
110 component: VWindowItem,
111 ...tab,
112 props: { key, ...tab.props },
113 children: [child],
114 }];
115 },
116 },
117};