@koumoul/vjsf 3.0.0-beta.37 → 3.0.0-beta.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@koumoul/vjsf",
3
- "version": "3.0.0-beta.37",
3
+ "version": "3.0.0-beta.38",
4
4
  "description": "Generate forms for the vuetify UI library (vuejs) based on annotated JSON schemas.",
5
5
  "scripts": {
6
6
  "test": "vitest",
@@ -40,7 +40,7 @@ const menuProps = computed(() => {
40
40
  })
41
41
 
42
42
  const textField = ref(null)
43
- const menuOpened = ref(false)
43
+ const menuOpened = defineModel('menuOpened', { type: Boolean, default: false })
44
44
 
45
45
  </script>
46
46
 
@@ -2,8 +2,8 @@
2
2
  import TextFieldMenu from '../fragments/text-field-menu.vue'
3
3
  import { VDatePicker } from 'vuetify/components/VDatePicker'
4
4
  import { useDate, useDefaults } from 'vuetify'
5
- import { computed } from 'vue'
6
- import { getCompProps, getDateTimeParts } from '../../utils/index.js'
5
+ import { computed, ref } from 'vue'
6
+ import { getCompProps, getDateTimeParts, getDateTimeWithOffset } from '../../utils/index.js'
7
7
 
8
8
  useDefaults({}, 'VjsfDatePicker')
9
9
 
@@ -22,25 +22,32 @@ const props = defineProps({
22
22
 
23
23
  const vDate = useDate()
24
24
 
25
+ const menuOpened = ref(false)
26
+
25
27
  const datePickerProps = computed(() => {
26
28
  const datePickerProps = getCompProps(props.modelValue, true)
27
29
  datePickerProps.hideActions = true
28
30
  if (props.modelValue.data) datePickerProps.modelValue = new Date(props.modelValue.data)
31
+ datePickerProps['onUpdate:modelValue'] = (/** @type {Date} */value) => {
32
+ if (!value) return
33
+ if (props.modelValue.layout.format === 'date-time') {
34
+ props.statefulLayout.input(props.modelValue, getDateTimeWithOffset(value))
35
+ } else {
36
+ props.statefulLayout.input(props.modelValue, getDateTimeParts(/** @type Date */(/** @type unknown */(value)))[0])
37
+ }
38
+ menuOpened.value = false
39
+ }
29
40
  return datePickerProps
30
41
  })
31
42
  </script>
32
43
 
33
44
  <template>
34
45
  <text-field-menu
46
+ v-model:menu-opened="menuOpened"
35
47
  :model-value="modelValue"
36
48
  :stateful-layout="statefulLayout"
37
49
  :formatted-value="modelValue.data && vDate.format(modelValue.data, 'fullDateWithWeekday')"
38
50
  >
39
- <template #default="{close}">
40
- <v-date-picker
41
- v-bind="datePickerProps"
42
- @update:model-value="value => {statefulLayout.input(modelValue, value && getDateTimeParts(/** @type Date */(/** @type unknown */(value)))[0]); close()}"
43
- />
44
- </template>
51
+ <v-date-picker v-bind="datePickerProps" />
45
52
  </text-field-menu>
46
53
  </template>
@@ -1,11 +1,19 @@
1
1
  <script setup>
2
- import { useDefaults } from 'vuetify'
2
+ import TextFieldMenu from '../fragments/text-field-menu.vue'
3
+ import { VDatePicker } from 'vuetify/components/VDatePicker'
4
+ import { VTimePicker } from 'vuetify/labs/VTimePicker'
5
+ import { VTabs, VTab, VTabsWindow, VTabsWindowItem } from 'vuetify/components/VTabs'
6
+ import { VIcon } from 'vuetify/components/VIcon'
7
+ import { VSheet } from 'vuetify/components/VSheet'
8
+ import { useDate, useDefaults } from 'vuetify'
9
+ import { computed, ref, watch } from 'vue'
10
+ import { getCompProps, getDateTimeParts, getLongTime, getDateTimeWithOffset, getShortTime } from '../../utils/index.js'
3
11
 
4
- useDefaults({}, 'VjsfDateTimePicker')
12
+ useDefaults({}, 'VjsfDatePicker')
5
13
 
6
- defineProps({
14
+ const props = defineProps({
7
15
  modelValue: {
8
- /** @type import('vue').PropType<import('../../types.js').VjsfDateTimePickerNode> */
16
+ /** @type import('vue').PropType<import('../../types.js').VjsfDatePickerNode> */
9
17
  type: Object,
10
18
  required: true
11
19
  },
@@ -16,8 +24,74 @@ defineProps({
16
24
  }
17
25
  })
18
26
 
27
+ const vDate = useDate()
28
+
29
+ const tab = ref('date')
30
+ const menuOpened = ref(false)
31
+ watch(menuOpened, () => { tab.value = 'date' })
32
+
33
+ const datePickerProps = computed(() => {
34
+ const datePickerProps = getCompProps(props.modelValue, false)
35
+ datePickerProps.hideActions = true
36
+ if (props.modelValue.data) datePickerProps.modelValue = new Date(props.modelValue.data)
37
+ datePickerProps['onUpdate:modelValue'] = (/** @type {Date} */value) => {
38
+ if (!value) return
39
+
40
+ if (props.modelValue.data) {
41
+ // replace date part of current value
42
+ const datePart = value && getDateTimeParts(/** @type Date */(/** @type unknown */(value)))[0]
43
+ props.statefulLayout.input(props.modelValue, datePart + props.modelValue.data.slice(10))
44
+ } else {
45
+ props.statefulLayout.input(props.modelValue, getDateTimeWithOffset(value))
46
+ }
47
+ tab.value = 'time'
48
+ }
49
+ return datePickerProps
50
+ })
51
+
52
+ const timePickerProps = computed(() => {
53
+ const timePickerProps = getCompProps(props.modelValue, false)
54
+ timePickerProps['ampm-in-title'] = true
55
+ if (props.modelValue.data) timePickerProps.modelValue = getShortTime(props.modelValue.data.slice(11))
56
+ timePickerProps['onUpdate:modelValue'] = (/** @type {string} */value) => {
57
+ if (!props.modelValue.data) return
58
+ console.log('set time', value, props.modelValue.data.slice(0, 10), props.modelValue.data.slice(15))
59
+ props.statefulLayout.input(props.modelValue, props.modelValue.data.slice(0, 11) + value + props.modelValue.data.slice(16))
60
+ }
61
+ return timePickerProps
62
+ })
19
63
  </script>
20
64
 
21
65
  <template>
22
- TODO date-time
66
+ <text-field-menu
67
+ v-model:menu-opened="menuOpened"
68
+ :model-value="modelValue"
69
+ :stateful-layout="statefulLayout"
70
+ :formatted-value="modelValue.data && vDate.format(modelValue.data, 'fullDateTime')"
71
+ >
72
+ <v-sheet style="width: 328px">
73
+ <v-tabs
74
+ v-model="tab"
75
+ align-tabs="center"
76
+ >
77
+ <v-tab value="date">
78
+ <v-icon>mdi-calendar</v-icon>
79
+ </v-tab>
80
+ <v-tab
81
+ value="time"
82
+ :disabled="!modelValue.data"
83
+ >
84
+ <v-icon>mdi-clock</v-icon>
85
+ </v-tab>
86
+ </v-tabs>
87
+ <v-tabs-window v-model="tab">
88
+ <v-tabs-window-item value="date">
89
+ <v-date-picker v-bind="datePickerProps" />
90
+ </v-tabs-window-item>
91
+ <v-tabs-window-item value="time">
92
+ <v-time-picker v-bind="timePickerProps" />
93
+ </v-tabs-window-item>
94
+ </v-tabs-window>
95
+ </v-sheet>
96
+ </text-field-menu>
23
97
  </template>
@@ -1,7 +1,44 @@
1
1
  <script setup>
2
+ import TextFieldMenu from '../fragments/text-field-menu.vue'
3
+ import { VTimePicker } from 'vuetify/labs/VTimePicker'
4
+ import { useDate, useDefaults } from 'vuetify'
5
+ import { computed } from 'vue'
6
+ import { getCompProps, getShortTime, getLongTime } from '../../utils/index.js'
2
7
 
8
+ useDefaults({}, 'VjsfDatePicker')
9
+
10
+ const props = defineProps({
11
+ modelValue: {
12
+ /** @type import('vue').PropType<import('../../types.js').VjsfDatePickerNode> */
13
+ type: Object,
14
+ required: true
15
+ },
16
+ statefulLayout: {
17
+ /** @type import('vue').PropType<import('../../types.js').VjsfStatefulLayout> */
18
+ type: Object,
19
+ required: true
20
+ }
21
+ })
22
+
23
+ const vDate = useDate()
24
+
25
+ const timePickerProps = computed(() => {
26
+ const timePickerProps = getCompProps(props.modelValue, true)
27
+ timePickerProps['ampm-in-title'] = true
28
+ if (props.modelValue.data) timePickerProps.modelValue = getShortTime(props.modelValue.data)
29
+ return timePickerProps
30
+ })
3
31
  </script>
4
32
 
5
33
  <template>
6
- TODO time
34
+ <text-field-menu
35
+ :model-value="modelValue"
36
+ :stateful-layout="statefulLayout"
37
+ :formatted-value="timePickerProps.modelValue && vDate.format('2010-04-13T' + timePickerProps.modelValue, 'fullTime')"
38
+ >
39
+ <v-time-picker
40
+ v-bind="timePickerProps"
41
+ @update:model-value="value => {statefulLayout.input(modelValue, value && getLongTime(value))}"
42
+ />
43
+ </text-field-menu>
7
44
  </template>
@@ -14,6 +14,7 @@ import NodeSwitch from './nodes/switch.vue'
14
14
  import NodeNumberField from './nodes/number-field.vue'
15
15
  import NodeSlider from './nodes/slider.vue'
16
16
  import NodeDatePicker from './nodes/date-picker.vue'
17
+ import NodeTimePicker from './nodes/time-picker.vue'
17
18
  import NodeDateTimePicker from './nodes/date-time-picker.vue'
18
19
  import NodeColorPicker from './nodes/color-picker.vue'
19
20
  import NodeSelect from './nodes/select.vue'
@@ -42,6 +43,7 @@ const nodeComponents = {
42
43
  'number-field': NodeNumberField,
43
44
  slider: NodeSlider,
44
45
  'date-picker': NodeDatePicker,
46
+ 'time-picker': NodeTimePicker,
45
47
  'date-time-picker': NodeDateTimePicker,
46
48
  'color-picker': NodeColorPicker,
47
49
  select: NodeSelect,
@@ -1,11 +1,11 @@
1
1
  declare const _default: import("vue").DefineComponent<{}, {
2
2
  multiple: boolean;
3
- item: import("../../../../node_modules/@json-layout/vocabulary/types/normalized-layout/types.js").SelectItem;
4
3
  itemProps: Record<string, any>;
4
+ item: import("../../../../node_modules/@json-layout/vocabulary/types/normalized-layout/types.js").SelectItem;
5
5
  $props: {
6
6
  readonly multiple?: boolean | undefined;
7
- readonly item?: import("../../../../node_modules/@json-layout/vocabulary/types/normalized-layout/types.js").SelectItem | undefined;
8
7
  readonly itemProps?: Record<string, any> | undefined;
8
+ readonly item?: import("../../../../node_modules/@json-layout/vocabulary/types/normalized-layout/types.js").SelectItem | undefined;
9
9
  };
10
10
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{}>>, {}, {}>;
11
11
  export default _default;
@@ -1,10 +1,10 @@
1
1
  declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{}, {
2
- statefulLayout: import("../../types.js").VjsfStatefulLayout;
3
2
  modelValue: import("../../types.js").VjsfNode;
3
+ statefulLayout: import("../../types.js").VjsfStatefulLayout;
4
4
  formattedValue: string | null;
5
5
  $props: {
6
- readonly statefulLayout?: import("../../types.js").VjsfStatefulLayout | undefined;
7
6
  readonly modelValue?: import("../../types.js").VjsfNode | undefined;
7
+ readonly statefulLayout?: import("../../types.js").VjsfStatefulLayout | undefined;
8
8
  readonly formattedValue?: string | null | undefined;
9
9
  };
10
10
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{}>>, {}, {}>, {
@@ -1 +1 @@
1
- {"version":3,"file":"text-field-menu.vue.d.ts","sourceRoot":"","sources":["../../../src/components/fragments/text-field-menu.vue.js"],"names":[],"mappings":";;;;;;;;;;6BAuIsC,GAAG;;;QACX,GAAG"}
1
+ {"version":3,"file":"text-field-menu.vue.d.ts","sourceRoot":"","sources":["../../../src/components/fragments/text-field-menu.vue.js"],"names":[],"mappings":";;;;;;;;;;6BA0IsC,GAAG;;;QACX,GAAG"}
@@ -1,9 +1,9 @@
1
1
  declare const _default: import("vue").DefineComponent<{}, {
2
- statefulLayout: import("../../types.js").VjsfStatefulLayout;
3
2
  modelValue: import("../../types.js").VjsfCheckboxNode;
3
+ statefulLayout: import("../../types.js").VjsfStatefulLayout;
4
4
  $props: {
5
- readonly statefulLayout?: import("../../types.js").VjsfStatefulLayout | undefined;
6
5
  readonly modelValue?: import("../../types.js").VjsfCheckboxNode | undefined;
6
+ readonly statefulLayout?: import("../../types.js").VjsfStatefulLayout | undefined;
7
7
  };
8
8
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{}>>, {}, {}>;
9
9
  export default _default;
@@ -1,9 +1,9 @@
1
1
  declare const _default: import("vue").DefineComponent<{}, {
2
- statefulLayout: import("../../types.js").VjsfStatefulLayout;
3
2
  modelValue: import("../../types.js").VjsfColorPickerNode;
3
+ statefulLayout: import("../../types.js").VjsfStatefulLayout;
4
4
  $props: {
5
- readonly statefulLayout?: import("../../types.js").VjsfStatefulLayout | undefined;
6
5
  readonly modelValue?: import("../../types.js").VjsfColorPickerNode | undefined;
6
+ readonly statefulLayout?: import("../../types.js").VjsfStatefulLayout | undefined;
7
7
  };
8
8
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{}>>, {}, {}>;
9
9
  export default _default;
@@ -1,9 +1,9 @@
1
1
  declare const _default: import("vue").DefineComponent<{}, {
2
- statefulLayout: import("../../types.js").VjsfStatefulLayout;
3
2
  modelValue: import("../../types.js").VjsfDatePickerNode;
3
+ statefulLayout: import("../../types.js").VjsfStatefulLayout;
4
4
  $props: {
5
- readonly statefulLayout?: import("../../types.js").VjsfStatefulLayout | undefined;
6
5
  readonly modelValue?: import("../../types.js").VjsfDatePickerNode | undefined;
6
+ readonly statefulLayout?: import("../../types.js").VjsfStatefulLayout | undefined;
7
7
  };
8
8
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{}>>, {}, {}>;
9
9
  export default _default;
@@ -1,8 +1,8 @@
1
1
  declare const _default: import("vue").DefineComponent<{}, {
2
- modelValue: import("../../types.js").VjsfDateTimePickerNode;
2
+ modelValue: import("../../types.js").VjsfDatePickerNode;
3
3
  statefulLayout: import("../../types.js").VjsfStatefulLayout;
4
4
  $props: {
5
- readonly modelValue?: import("../../types.js").VjsfDateTimePickerNode | undefined;
5
+ readonly modelValue?: import("../../types.js").VjsfDatePickerNode | undefined;
6
6
  readonly statefulLayout?: import("../../types.js").VjsfStatefulLayout | undefined;
7
7
  };
8
8
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{}>>, {}, {}>;
@@ -1,9 +1,9 @@
1
1
  declare const _default: import("vue").DefineComponent<{}, {
2
- statefulLayout: import("../../types.js").VjsfStatefulLayout;
3
2
  modelValue: import("../../types.js").VjsfExpansionPanelsNode;
3
+ statefulLayout: import("../../types.js").VjsfStatefulLayout;
4
4
  $props: {
5
- readonly statefulLayout?: import("../../types.js").VjsfStatefulLayout | undefined;
6
5
  readonly modelValue?: import("../../types.js").VjsfExpansionPanelsNode | undefined;
6
+ readonly statefulLayout?: import("../../types.js").VjsfStatefulLayout | undefined;
7
7
  };
8
8
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{}>>, {}, {}>;
9
9
  export default _default;
@@ -1,9 +1,9 @@
1
1
  declare const _default: import("vue").DefineComponent<{}, {
2
- statefulLayout: import("../../types.js").VjsfStatefulLayout;
3
2
  modelValue: import("../../types.js").VjsfListNode;
3
+ statefulLayout: import("../../types.js").VjsfStatefulLayout;
4
4
  $props: {
5
- readonly statefulLayout?: import("../../types.js").VjsfStatefulLayout | undefined;
6
5
  readonly modelValue?: import("../../types.js").VjsfListNode | undefined;
6
+ readonly statefulLayout?: import("../../types.js").VjsfStatefulLayout | undefined;
7
7
  };
8
8
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{}>>, {}, {}>;
9
9
  export default _default;
@@ -1,9 +1,9 @@
1
1
  declare const _default: import("vue").DefineComponent<{}, {
2
- statefulLayout: import("../../types.js").VjsfStatefulLayout;
3
2
  modelValue: import("../../types.js").VjsfOneOfSelectNode;
3
+ statefulLayout: import("../../types.js").VjsfStatefulLayout;
4
4
  $props: {
5
- readonly statefulLayout?: import("../../types.js").VjsfStatefulLayout | undefined;
6
5
  readonly modelValue?: import("../../types.js").VjsfOneOfSelectNode | undefined;
6
+ readonly statefulLayout?: import("../../types.js").VjsfStatefulLayout | undefined;
7
7
  };
8
8
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{}>>, {}, {}>;
9
9
  export default _default;
@@ -1,9 +1,9 @@
1
1
  declare const _default: import("vue").DefineComponent<{}, {
2
- statefulLayout: import("../../types.js").VjsfStatefulLayout;
3
2
  modelValue: import("../../types.js").VjsfSliderNode;
3
+ statefulLayout: import("../../types.js").VjsfStatefulLayout;
4
4
  $props: {
5
- readonly statefulLayout?: import("../../types.js").VjsfStatefulLayout | undefined;
6
5
  readonly modelValue?: import("../../types.js").VjsfSliderNode | undefined;
6
+ readonly statefulLayout?: import("../../types.js").VjsfStatefulLayout | undefined;
7
7
  };
8
8
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{}>>, {}, {}>;
9
9
  export default _default;
@@ -1,9 +1,9 @@
1
1
  declare const _default: import("vue").DefineComponent<{}, {
2
- statefulLayout: import("../../types.js").VjsfStatefulLayout;
3
2
  modelValue: import("../../types.js").VjsfSwitchNode;
3
+ statefulLayout: import("../../types.js").VjsfStatefulLayout;
4
4
  $props: {
5
- readonly statefulLayout?: import("../../types.js").VjsfStatefulLayout | undefined;
6
5
  readonly modelValue?: import("../../types.js").VjsfSwitchNode | undefined;
6
+ readonly statefulLayout?: import("../../types.js").VjsfStatefulLayout | undefined;
7
7
  };
8
8
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{}>>, {}, {}>;
9
9
  export default _default;
@@ -1,3 +1,10 @@
1
- declare const _default: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{}>>, {}, {}>;
1
+ declare const _default: import("vue").DefineComponent<{}, {
2
+ modelValue: import("../../types.js").VjsfDatePickerNode;
3
+ statefulLayout: import("../../types.js").VjsfStatefulLayout;
4
+ $props: {
5
+ readonly modelValue?: import("../../types.js").VjsfDatePickerNode | undefined;
6
+ readonly statefulLayout?: import("../../types.js").VjsfStatefulLayout | undefined;
7
+ };
8
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{}>>, {}, {}>;
2
9
  export default _default;
3
10
  //# sourceMappingURL=time-picker.vue.d.ts.map
@@ -1,12 +1,12 @@
1
1
  declare const _default: import("vue").DefineComponent<{}, {
2
2
  $emit: ((event: "update:modelValue", data: any) => void) & ((event: "update:state", state: import("../types.js").VjsfStatefulLayout) => void);
3
- options: Partial<Omit<import("../types.js").VjsfOptions, "width" | "onData" | "onUpdate" | "onAutofocus" | "vjsfSlots">> | null;
4
3
  modelValue: any;
4
+ options: Partial<Omit<import("../types.js").VjsfOptions, "width" | "onData" | "onUpdate" | "onAutofocus" | "vjsfSlots">> | null;
5
5
  schema: Record<string, any>;
6
6
  precompiledLayout: import("../../../node_modules/@json-layout/core/types/compile/types.js").CompiledLayout;
7
7
  $props: {
8
- readonly options?: Partial<Omit<import("../types.js").VjsfOptions, "width" | "onData" | "onUpdate" | "onAutofocus" | "vjsfSlots">> | null | undefined;
9
8
  readonly modelValue?: any;
9
+ readonly options?: Partial<Omit<import("../types.js").VjsfOptions, "width" | "onData" | "onUpdate" | "onAutofocus" | "vjsfSlots">> | null | undefined;
10
10
  readonly schema?: Record<string, any> | undefined;
11
11
  readonly precompiledLayout?: import("../../../node_modules/@json-layout/core/types/compile/types.js").CompiledLayout | undefined;
12
12
  };