@onereach/ui-components 3.0.4-beta.2486.0 → 3.0.4-beta.2487.0

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.
Files changed (111) hide show
  1. package/dist/bundled/v2/{OrCardCollection-ad2240ac.js → OrCardCollection-a10920a3.js} +1 -1
  2. package/dist/bundled/v2/{OrDateTimePicker-60e1a7ee.js → OrDateTimePicker-11b6d4dd.js} +261 -165
  3. package/dist/bundled/v2/{OrMenu-cbb0c2c8.js → OrMenu-0c2c348c.js} +6 -1
  4. package/dist/bundled/v2/{OrPagination-cf47d71c.js → OrPagination-00ab6954.js} +1 -1
  5. package/dist/bundled/v2/{OrTabs-10f7e668.js → OrTabs-f7c9f754.js} +1 -1
  6. package/dist/bundled/v2/components/index.js +5 -5
  7. package/dist/bundled/v2/components/or-card-collection-v3/index.js +2 -2
  8. package/dist/bundled/v2/components/or-date-time-picker-v3/OrDateTimePicker.vue.d.ts +2 -0
  9. package/dist/bundled/v2/components/or-date-time-picker-v3/hooks/useDefaultDate.d.ts +1 -0
  10. package/dist/bundled/v2/components/or-date-time-picker-v3/hooks/useDefaultHours.d.ts +1 -0
  11. package/dist/bundled/v2/components/or-date-time-picker-v3/hooks/useDefaultMinutes.d.ts +1 -0
  12. package/dist/bundled/v2/components/or-date-time-picker-v3/hooks/useDefaultMonth.d.ts +1 -0
  13. package/dist/bundled/v2/components/or-date-time-picker-v3/hooks/useDefaultYear.d.ts +1 -0
  14. package/dist/bundled/v2/components/or-date-time-picker-v3/index.js +4 -4
  15. package/dist/bundled/v2/components/or-date-time-picker-v3/partials/{or-date-time-picker-date-select/OrDateTimePickerDateSelect.vue.d.ts → or-date-time-picker-day-select/OrDateTimePickerDaySelect.vue.d.ts} +8 -0
  16. package/dist/bundled/v2/components/or-date-time-picker-v3/partials/or-date-time-picker-day-select/styles.d.ts +3 -0
  17. package/dist/bundled/v2/components/or-date-time-picker-v3/partials/or-date-time-picker-month-select/OrDateTimePickerMonthSelect.vue.d.ts +26 -34
  18. package/dist/bundled/v2/components/or-date-time-picker-v3/partials/or-date-time-picker-time-select/OrDateTimePickerTimeSelect.vue.d.ts +8 -20
  19. package/dist/bundled/v2/components/or-menu-v3/OrMenu.vue.d.ts +2 -0
  20. package/dist/bundled/v2/components/or-menu-v3/index.js +1 -1
  21. package/dist/bundled/v2/components/or-pagination-v3/index.js +2 -2
  22. package/dist/bundled/v2/components/or-tabs-v3/index.js +2 -2
  23. package/dist/bundled/v2/index.js +6 -6
  24. package/dist/bundled/v3/{OrCardCollection.vue_vue_type_script_lang-61f92c57.js → OrCardCollection.vue_vue_type_script_lang-93c84377.js} +2 -2
  25. package/dist/bundled/v3/{OrDateTimePicker.vue_vue_type_script_lang-fb197c2f.js → OrDateTimePicker.vue_vue_type_script_lang-b9bc77aa.js} +243 -163
  26. package/dist/bundled/v3/{OrMenu-89afef68.js → OrMenu-101f1c62.js} +1 -1
  27. package/dist/bundled/v3/{OrMenu.vue_vue_type_script_lang-f6748a99.js → OrMenu.vue_vue_type_script_lang-7ba15d1d.js} +6 -1
  28. package/dist/bundled/v3/{OrPagination.vue_vue_type_script_lang-7673a00e.js → OrPagination.vue_vue_type_script_lang-d3e6732f.js} +2 -2
  29. package/dist/bundled/v3/{OrTabs.vue_vue_type_script_lang-ebd2a59d.js → OrTabs.vue_vue_type_script_lang-513b1e98.js} +2 -2
  30. package/dist/bundled/v3/components/index.js +6 -6
  31. package/dist/bundled/v3/components/or-card-collection-v3/index.js +3 -3
  32. package/dist/bundled/v3/components/or-date-time-picker-v3/OrDateTimePicker.vue.d.ts +2 -0
  33. package/dist/bundled/v3/components/or-date-time-picker-v3/hooks/useDefaultDate.d.ts +1 -0
  34. package/dist/bundled/v3/components/or-date-time-picker-v3/hooks/useDefaultHours.d.ts +1 -0
  35. package/dist/bundled/v3/components/or-date-time-picker-v3/hooks/useDefaultMinutes.d.ts +1 -0
  36. package/dist/bundled/v3/components/or-date-time-picker-v3/hooks/useDefaultMonth.d.ts +1 -0
  37. package/dist/bundled/v3/components/or-date-time-picker-v3/hooks/useDefaultYear.d.ts +1 -0
  38. package/dist/bundled/v3/components/or-date-time-picker-v3/index.js +5 -5
  39. package/dist/{esm/v3/components/or-date-time-picker-v3/partials/or-date-time-picker-date-select/OrDateTimePickerDateSelect.vue.d.ts → bundled/v3/components/or-date-time-picker-v3/partials/or-date-time-picker-day-select/OrDateTimePickerDaySelect.vue.d.ts} +8 -0
  40. package/dist/bundled/v3/components/or-date-time-picker-v3/partials/or-date-time-picker-day-select/styles.d.ts +3 -0
  41. package/dist/bundled/v3/components/or-date-time-picker-v3/partials/or-date-time-picker-month-select/OrDateTimePickerMonthSelect.vue.d.ts +26 -34
  42. package/dist/bundled/v3/components/or-date-time-picker-v3/partials/or-date-time-picker-time-select/OrDateTimePickerTimeSelect.vue.d.ts +8 -20
  43. package/dist/bundled/v3/components/or-menu-v3/OrMenu.vue.d.ts +2 -0
  44. package/dist/bundled/v3/components/or-menu-v3/index.js +1 -1
  45. package/dist/bundled/v3/components/or-pagination-v3/index.js +3 -3
  46. package/dist/bundled/v3/components/or-tabs-v3/index.js +3 -3
  47. package/dist/bundled/v3/index.js +36 -22
  48. package/dist/esm/v2/{OrCardCollection-662d5727.js → OrCardCollection-54079e79.js} +1 -1
  49. package/dist/esm/v2/{OrDateTimePicker-4b650aca.js → OrDateTimePicker-7411ea1f.js} +266 -170
  50. package/dist/esm/v2/{OrMenu-47b319a6.js → OrMenu-18a7f179.js} +6 -1
  51. package/dist/esm/v2/{OrPagination-4d330d4f.js → OrPagination-16f6d75b.js} +1 -1
  52. package/dist/esm/v2/{OrTabs-f0e4db08.js → OrTabs-18df1ce9.js} +1 -1
  53. package/dist/esm/v2/components/index.js +5 -5
  54. package/dist/esm/v2/components/or-card-collection-v3/index.js +2 -2
  55. package/dist/esm/v2/components/or-date-time-picker-v3/OrDateTimePicker.vue.d.ts +2 -0
  56. package/dist/esm/v2/components/or-date-time-picker-v3/hooks/useDefaultDate.d.ts +1 -0
  57. package/dist/esm/v2/components/or-date-time-picker-v3/hooks/useDefaultHours.d.ts +1 -0
  58. package/dist/esm/v2/components/or-date-time-picker-v3/hooks/useDefaultMinutes.d.ts +1 -0
  59. package/dist/esm/v2/components/or-date-time-picker-v3/hooks/useDefaultMonth.d.ts +1 -0
  60. package/dist/esm/v2/components/or-date-time-picker-v3/hooks/useDefaultYear.d.ts +1 -0
  61. package/dist/esm/v2/components/or-date-time-picker-v3/index.js +2 -2
  62. package/dist/esm/v2/components/or-date-time-picker-v3/partials/{or-date-time-picker-date-select/OrDateTimePickerDateSelect.vue.d.ts → or-date-time-picker-day-select/OrDateTimePickerDaySelect.vue.d.ts} +8 -0
  63. package/dist/esm/v2/components/or-date-time-picker-v3/partials/or-date-time-picker-day-select/styles.d.ts +3 -0
  64. package/dist/esm/v2/components/or-date-time-picker-v3/partials/or-date-time-picker-month-select/OrDateTimePickerMonthSelect.vue.d.ts +26 -34
  65. package/dist/esm/v2/components/or-date-time-picker-v3/partials/or-date-time-picker-time-select/OrDateTimePickerTimeSelect.vue.d.ts +8 -20
  66. package/dist/esm/v2/components/or-menu-v3/OrMenu.vue.d.ts +2 -0
  67. package/dist/esm/v2/components/or-menu-v3/index.js +1 -1
  68. package/dist/esm/v2/components/or-pagination-v3/index.js +2 -2
  69. package/dist/esm/v2/components/or-tabs-v3/index.js +2 -2
  70. package/dist/esm/v2/index.js +5 -5
  71. package/dist/esm/v3/{OrCardCollection-aa7f0c81.js → OrCardCollection-b937aa7a.js} +1 -1
  72. package/dist/esm/v3/{OrDateTimePicker-3e2dc067.js → OrDateTimePicker-966d5b1d.js} +267 -173
  73. package/dist/esm/v3/{OrMenu-053a9ab7.js → OrMenu-70cee836.js} +6 -1
  74. package/dist/esm/v3/{OrPagination-f2d104d9.js → OrPagination-7f4ed166.js} +1 -1
  75. package/dist/esm/v3/{OrTabs-d9e2a07e.js → OrTabs-0a5c80be.js} +1 -1
  76. package/dist/esm/v3/components/index.js +5 -5
  77. package/dist/esm/v3/components/or-card-collection-v3/index.js +2 -2
  78. package/dist/esm/v3/components/or-date-time-picker-v3/OrDateTimePicker.vue.d.ts +2 -0
  79. package/dist/esm/v3/components/or-date-time-picker-v3/hooks/useDefaultDate.d.ts +1 -0
  80. package/dist/esm/v3/components/or-date-time-picker-v3/hooks/useDefaultHours.d.ts +1 -0
  81. package/dist/esm/v3/components/or-date-time-picker-v3/hooks/useDefaultMinutes.d.ts +1 -0
  82. package/dist/esm/v3/components/or-date-time-picker-v3/hooks/useDefaultMonth.d.ts +1 -0
  83. package/dist/esm/v3/components/or-date-time-picker-v3/hooks/useDefaultYear.d.ts +1 -0
  84. package/dist/esm/v3/components/or-date-time-picker-v3/index.js +2 -2
  85. package/dist/{bundled/v3/components/or-date-time-picker-v3/partials/or-date-time-picker-date-select/OrDateTimePickerDateSelect.vue.d.ts → esm/v3/components/or-date-time-picker-v3/partials/or-date-time-picker-day-select/OrDateTimePickerDaySelect.vue.d.ts} +8 -0
  86. package/dist/esm/v3/components/or-date-time-picker-v3/partials/or-date-time-picker-day-select/styles.d.ts +3 -0
  87. package/dist/esm/v3/components/or-date-time-picker-v3/partials/or-date-time-picker-month-select/OrDateTimePickerMonthSelect.vue.d.ts +26 -34
  88. package/dist/esm/v3/components/or-date-time-picker-v3/partials/or-date-time-picker-time-select/OrDateTimePickerTimeSelect.vue.d.ts +8 -20
  89. package/dist/esm/v3/components/or-menu-v3/OrMenu.vue.d.ts +2 -0
  90. package/dist/esm/v3/components/or-menu-v3/index.js +1 -1
  91. package/dist/esm/v3/components/or-pagination-v3/index.js +2 -2
  92. package/dist/esm/v3/components/or-tabs-v3/index.js +2 -2
  93. package/dist/esm/v3/index.js +5 -5
  94. package/package.json +2 -2
  95. package/src/components/or-date-time-picker-v3/OrDateTimePicker.vue +17 -8
  96. package/src/components/or-date-time-picker-v3/hooks/useDefaultDate.ts +3 -0
  97. package/src/components/or-date-time-picker-v3/hooks/useDefaultHours.ts +3 -0
  98. package/src/components/or-date-time-picker-v3/hooks/useDefaultMinutes.ts +3 -0
  99. package/src/components/or-date-time-picker-v3/hooks/useDefaultMonth.ts +3 -0
  100. package/src/components/or-date-time-picker-v3/hooks/useDefaultYear.ts +3 -0
  101. package/src/components/or-date-time-picker-v3/partials/or-date-time-picker-day-select/OrDateTimePickerDaySelect.vue +162 -0
  102. package/src/components/or-date-time-picker-v3/partials/or-date-time-picker-day-select/styles.ts +28 -0
  103. package/src/components/or-date-time-picker-v3/partials/or-date-time-picker-month-select/OrDateTimePickerMonthSelect.vue +101 -79
  104. package/src/components/or-date-time-picker-v3/partials/or-date-time-picker-time-select/OrDateTimePickerTimeSelect.vue +58 -42
  105. package/src/components/or-menu-v3/OrMenu.vue +3 -0
  106. package/dist/bundled/v2/components/or-date-time-picker-v3/partials/or-date-time-picker-date-select/styles.d.ts +0 -1
  107. package/dist/bundled/v3/components/or-date-time-picker-v3/partials/or-date-time-picker-date-select/styles.d.ts +0 -1
  108. package/dist/esm/v2/components/or-date-time-picker-v3/partials/or-date-time-picker-date-select/styles.d.ts +0 -1
  109. package/dist/esm/v3/components/or-date-time-picker-v3/partials/or-date-time-picker-date-select/styles.d.ts +0 -1
  110. package/src/components/or-date-time-picker-v3/partials/or-date-time-picker-date-select/OrDateTimePickerDateSelect.vue +0 -63
  111. package/src/components/or-date-time-picker-v3/partials/or-date-time-picker-date-select/styles.ts +0 -10
@@ -1,11 +1,11 @@
1
1
  import './index-fa6eb4ca.js';
2
- import { defineComponent, ref, computed, reactive } from '@vue/composition-api/dist/vue-composition-api.mjs';
2
+ import { O as OrButton } from './OrButton-28addda1.js';
3
+ import { defineComponent, ref, computed, reactive, watch } from '@vue/composition-api/dist/vue-composition-api.mjs';
3
4
  import { n as normalizeComponent } from './normalize-component-6e8e3d80.js';
4
5
  import { O as OrLabel } from './OrLabel-761500d5.js';
5
- import { O as OrButton } from './OrButton-28addda1.js';
6
6
  import { O as OrIcon } from './OrIcon-05d29a78.js';
7
7
  import { O as OrIconButton } from './OrIconButton-50f3e359.js';
8
- import { O as OrMenu } from './OrMenu-cbb0c2c8.js';
8
+ import { O as OrMenu } from './OrMenu-0c2c348c.js';
9
9
  import { O as OrMenuItem } from './OrMenuItem-7eb9d387.js';
10
10
  import { O as OrError } from './OrError-1186b62f.js';
11
11
  import { O as OrHint } from './OrHint-29b31ba4.js';
@@ -17,14 +17,47 @@ import { u as useValidationAttributes } from './useValidationAttributes-6df7bcf9
17
17
  import { I as InputBoxSize } from './props-c966ae5f.js';
18
18
  import { s as styleInject } from './style-inject.es-4c6f2515.js';
19
19
 
20
- const DateTimePickerDateSelect = [
20
+ function useDefaultDate() {
21
+ return new Date().getUTCDate();
22
+ }
23
+
24
+ function useDefaultHours() {
25
+ return 0;
26
+ }
27
+
28
+ function useDefaultMinutes() {
29
+ return 0;
30
+ }
31
+
32
+ function useDefaultMonth() {
33
+ return new Date().getUTCMonth();
34
+ }
35
+
36
+ function useDefaultYear() {
37
+ return new Date().getUTCFullYear();
38
+ }
39
+
40
+ const DateTimePickerDaySelect = [
21
41
  // Layout
22
42
  'layout-column',
23
43
  // Spacing
24
44
  'px-md', 'py-md', 'gap-sm'];
45
+ const DateTimePickerDaySelectButtonGroup = [
46
+ // Layout
47
+ 'grid', 'grid-cols-7'];
48
+ const DateTimePickerDaySelectButtonGroupItem = [
49
+ // Box
50
+ 'min-w-fit',
51
+ // Spacing
52
+ '!px-sm', '!py-sm',
53
+ // Typography
54
+ 'typography-caption-regular'];
25
55
 
26
56
  var script$6 = defineComponent({
27
- name: 'OrDateTimePickerDateSelect',
57
+ name: 'OrDateTimePickerDaySelect',
58
+ components: {
59
+ OrButton
60
+ },
28
61
  model: {
29
62
  prop: 'modelValue',
30
63
  event: 'update:modelValue'
@@ -41,18 +74,49 @@ var script$6 = defineComponent({
41
74
  // Refs
42
75
  const root = ref();
43
76
  // Styles
44
- const rootStyles = computed(() => ['or-date-time-picker-date-select', ...DateTimePickerDateSelect]);
77
+ const rootStyles = computed(() => ['or-date-time-picker-day-select', ...DateTimePickerDaySelect]);
78
+ const buttonGroupStyles = computed(() => [...DateTimePickerDaySelectButtonGroup]);
79
+ const buttonGroupItemStyles = computed(() => [...DateTimePickerDaySelectButtonGroupItem]);
45
80
  // State
46
81
  const proxyModelValue = computed({
47
- get: () => props.modelValue,
82
+ get: () => {
83
+ var _a;
84
+ return (_a = props.modelValue) !== null && _a !== void 0 ? _a : new Date(Date.UTC(useDefaultYear(), useDefaultMonth(), useDefaultDate(), useDefaultHours(), useDefaultMinutes()));
85
+ },
48
86
  set: value => {
49
87
  context.emit('update:modelValue', value);
50
88
  }
51
89
  });
90
+ const dayOptions = computed(() => {
91
+ const monthStartDate = new Date(Date.UTC(proxyModelValue.value.getUTCFullYear(), proxyModelValue.value.getUTCMonth(), 1, proxyModelValue.value.getUTCHours(), proxyModelValue.value.getUTCMinutes()));
92
+ const monthEndDate = new Date(Date.UTC(proxyModelValue.value.getUTCFullYear(), proxyModelValue.value.getUTCMonth() + 1, 0, proxyModelValue.value.getUTCHours(), proxyModelValue.value.getUTCMinutes()));
93
+ const calendarStartDate = new Date(Date.UTC(monthStartDate.getUTCFullYear(), monthStartDate.getUTCMonth(), 1 - (monthStartDate.getUTCDay() + 6) % 7, monthStartDate.getUTCHours(), monthStartDate.getUTCMinutes()));
94
+ const calendarEndDate = new Date(Date.UTC(monthEndDate.getUTCFullYear(), monthEndDate.getUTCMonth() + 1, (7 - monthEndDate.getUTCDay()) % 7, monthEndDate.getUTCHours(), monthEndDate.getUTCMinutes()));
95
+ return (() => {
96
+ let options = [],
97
+ value = calendarStartDate;
98
+ while (Number(value) !== Number(calendarEndDate)) {
99
+ options = [...options, value];
100
+ value = new Date(Date.UTC(value.getUTCFullYear(), value.getUTCMonth(), value.getUTCDate() + 1, value.getUTCHours(), value.getUTCMinutes()));
101
+ }
102
+ return options;
103
+ })();
104
+ });
105
+ // Methods
106
+ function formatDay(value) {
107
+ return value.toLocaleString('default', {
108
+ day: 'numeric',
109
+ timeZone: 'UTC'
110
+ });
111
+ }
52
112
  return {
53
113
  root,
54
114
  rootStyles,
55
- proxyModelValue
115
+ buttonGroupStyles,
116
+ buttonGroupItemStyles,
117
+ proxyModelValue,
118
+ dayOptions,
119
+ formatDay
56
120
  };
57
121
  }
58
122
  });
@@ -68,7 +132,24 @@ var __vue_render__$6 = function () {
68
132
  return _c('div', {
69
133
  ref: "root",
70
134
  class: _vm.rootStyles
71
- }, [_vm._v("\n Calendar\n")]);
135
+ }, [_c('div', {
136
+ class: _vm.buttonGroupStyles
137
+ }, _vm._l(_vm.dayOptions, function (value) {
138
+ return _c('OrButton', {
139
+ key: Number(value),
140
+ class: _vm.buttonGroupItemStyles,
141
+ attrs: {
142
+ "variant": Number(value) === Number(_vm.proxyModelValue) ? 'contained' : 'text',
143
+ "color": Number(value) === Number(_vm.proxyModelValue) ? 'primary' : 'inherit'
144
+ },
145
+ on: {
146
+ "click": function ($event) {
147
+ $event.stopPropagation();
148
+ _vm.proxyModelValue = value;
149
+ }
150
+ }
151
+ }, [_vm._v("\n " + _vm._s(_vm.formatDay(value)) + "\n ")]);
152
+ }), 1)]);
72
153
  };
73
154
  var __vue_staticRenderFns__$6 = [];
74
155
 
@@ -90,7 +171,7 @@ const __vue_component__$7 = /*#__PURE__*/normalizeComponent({
90
171
  render: __vue_render__$6,
91
172
  staticRenderFns: __vue_staticRenderFns__$6
92
173
  }, __vue_inject_styles__$6, __vue_script__$6, __vue_scope_id__$6, __vue_is_functional_template__$6, __vue_module_identifier__$6, false, undefined, undefined, undefined);
93
- var OrDateTimePickerDateSelect = __vue_component__$7;
174
+ var OrDateTimePickerDaySelect = __vue_component__$7;
94
175
 
95
176
  const DateTimePickerMobileControl = [
96
177
  // Layout
@@ -196,101 +277,93 @@ var script$4 = defineComponent({
196
277
  setup(props, context) {
197
278
  // Refs
198
279
  const root = ref();
199
- const monthButton = ref();
200
280
  const yearButton = ref();
281
+ const monthButton = ref();
282
+ const yearButtonRoot = computed(() => {
283
+ var _a;
284
+ return (_a = yearButton.value) === null || _a === void 0 ? void 0 : _a.root;
285
+ });
201
286
  const monthButtonRoot = computed(() => {
202
287
  var _a;
203
288
  return (_a = monthButton.value) === null || _a === void 0 ? void 0 : _a.root;
204
289
  });
205
- const yearButtonRoot = computed(() => {
290
+ const yearMenu = ref();
291
+ const monthMenu = ref();
292
+ const yearMenuState = computed(() => {
206
293
  var _a;
207
- return (_a = yearButton.value) === null || _a === void 0 ? void 0 : _a.root;
294
+ return (_a = yearMenu.value) === null || _a === void 0 ? void 0 : _a.state;
295
+ });
296
+ const monthMenuState = computed(() => {
297
+ var _a;
298
+ return (_a = monthMenu.value) === null || _a === void 0 ? void 0 : _a.state;
208
299
  });
209
- const monthMenu = ref();
210
- const yearMenu = ref();
211
- // const monthMenuState = computed(() => monthMenu.value?.state);
212
- // const yearMenuState = computed(() => yearMenu.value?.state);
213
300
  // Styles
214
301
  const rootStyles = computed(() => ['or-date-time-picker-month-select', ...DateTimePickerMonthSelect]);
215
302
  // State
216
303
  const proxyModelValue = computed({
217
- get: () => props.modelValue,
218
- set: value => {
219
- context.emit('update:modelValue', value);
220
- }
221
- });
222
- const yearValue = computed({
223
304
  get: () => {
224
- var _a, _b;
225
- return (_b = (_a = proxyModelValue.value) === null || _a === void 0 ? void 0 : _a.getUTCFullYear()) !== null && _b !== void 0 ? _b : new Date().getUTCFullYear();
305
+ var _a;
306
+ return (_a = props.modelValue) !== null && _a !== void 0 ? _a : new Date(Date.UTC(useDefaultYear(), useDefaultMonth(), useDefaultDate(), useDefaultHours(), useDefaultMinutes()));
226
307
  },
227
308
  set: value => {
228
- var _a, _b, _c, _d, _e, _f, _g, _h;
229
- proxyModelValue.value = new Date(Date.UTC(value, (_b = (_a = proxyModelValue.value) === null || _a === void 0 ? void 0 : _a.getUTCMonth()) !== null && _b !== void 0 ? _b : monthValue.value, (_d = (_c = proxyModelValue.value) === null || _c === void 0 ? void 0 : _c.getUTCDate()) !== null && _d !== void 0 ? _d : 1, (_f = (_e = proxyModelValue.value) === null || _e === void 0 ? void 0 : _e.getUTCHours()) !== null && _f !== void 0 ? _f : 0, (_h = (_g = proxyModelValue.value) === null || _g === void 0 ? void 0 : _g.getUTCMinutes()) !== null && _h !== void 0 ? _h : 0));
230
- }
231
- });
232
- const monthValue = computed({
233
- get: () => {
234
- var _a, _b;
235
- return (_b = (_a = proxyModelValue.value) === null || _a === void 0 ? void 0 : _a.getUTCMonth()) !== null && _b !== void 0 ? _b : new Date().getUTCMonth();
236
- },
237
- set: value => {
238
- var _a, _b, _c, _d, _e, _f, _g, _h;
239
- proxyModelValue.value = new Date(Date.UTC((_b = (_a = proxyModelValue.value) === null || _a === void 0 ? void 0 : _a.getUTCFullYear()) !== null && _b !== void 0 ? _b : yearValue.value, value, (_d = (_c = proxyModelValue.value) === null || _c === void 0 ? void 0 : _c.getUTCDate()) !== null && _d !== void 0 ? _d : 1, (_f = (_e = proxyModelValue.value) === null || _e === void 0 ? void 0 : _e.getUTCHours()) !== null && _f !== void 0 ? _f : 0, (_h = (_g = proxyModelValue.value) === null || _g === void 0 ? void 0 : _g.getUTCMinutes()) !== null && _h !== void 0 ? _h : 0));
309
+ context.emit('update:modelValue', value);
240
310
  }
241
311
  });
242
- const yearLabel = computed(() => {
243
- var _a;
244
- return (_a = yearOptions.find(({
245
- value
246
- }) => value === yearValue.value)) === null || _a === void 0 ? void 0 : _a.label;
247
- });
248
- const monthLabel = computed(() => {
249
- var _a;
250
- return (_a = monthOptions.find(({
251
- value
252
- }) => value === monthValue.value)) === null || _a === void 0 ? void 0 : _a.label;
253
- });
254
- const yearOptions = Array.from({
255
- length: 100
256
- }, (_value, index) => {
257
- const year = new Date().getUTCFullYear() - index;
258
- return {
259
- value: year,
260
- label: new Date(year, monthValue.value).toLocaleString([], {
261
- year: 'numeric'
262
- })
263
- };
312
+ const yearOptions = computed(() => {
313
+ return Array.from({
314
+ length: 11
315
+ }).map((_value, index, {
316
+ length
317
+ }) => {
318
+ const value = proxyModelValue.value.getUTCFullYear() - Math.floor(length / 2) + index;
319
+ return new Date(Date.UTC(value, proxyModelValue.value.getUTCMonth(), proxyModelValue.value.getUTCDate(), proxyModelValue.value.getUTCHours(), proxyModelValue.value.getUTCMinutes()));
320
+ });
264
321
  });
265
- const monthOptions = Array.from({
266
- length: 12
267
- }, (_value, index) => {
268
- const month = index;
269
- return {
270
- value: month,
271
- label: new Date(yearValue.value, month).toLocaleString([], {
272
- month: 'long'
273
- })
274
- };
322
+ const monthOptions = computed(() => {
323
+ return Array.from({
324
+ length: 12
325
+ }, (_value, index) => {
326
+ const value = index;
327
+ return new Date(Date.UTC(proxyModelValue.value.getUTCFullYear(), value, proxyModelValue.value.getUTCDate(), proxyModelValue.value.getUTCHours(), proxyModelValue.value.getUTCMinutes()));
328
+ });
275
329
  });
330
+ // Methods
331
+ function goToNextMonth() {
332
+ proxyModelValue.value = new Date(Date.UTC(proxyModelValue.value.getUTCFullYear(), proxyModelValue.value.getUTCMonth() + 1, proxyModelValue.value.getUTCDate(), proxyModelValue.value.getUTCHours(), proxyModelValue.value.getUTCMinutes()));
333
+ }
334
+ function goToPreviousMonth() {
335
+ proxyModelValue.value = new Date(Date.UTC(proxyModelValue.value.getUTCFullYear(), proxyModelValue.value.getUTCMonth() - 1, proxyModelValue.value.getUTCDate(), proxyModelValue.value.getUTCHours(), proxyModelValue.value.getUTCMinutes()));
336
+ }
337
+ function formatYear(value) {
338
+ return value.toLocaleString('default', {
339
+ year: 'numeric',
340
+ timeZone: 'UTC'
341
+ });
342
+ }
343
+ function formatMonth(value) {
344
+ return value.toLocaleString('default', {
345
+ month: 'long',
346
+ timeZone: 'UTC'
347
+ });
348
+ }
276
349
  return {
277
350
  root,
278
- monthButton,
279
351
  yearButton,
280
- monthButtonRoot,
352
+ monthButton,
281
353
  yearButtonRoot,
282
- monthMenu,
354
+ monthButtonRoot,
283
355
  yearMenu,
284
- // monthMenuState,
285
- // yearMenuState,
356
+ monthMenu,
357
+ yearMenuState,
358
+ monthMenuState,
286
359
  rootStyles,
287
360
  proxyModelValue,
288
- yearValue,
289
- monthValue,
290
- yearLabel,
291
- monthLabel,
292
361
  yearOptions,
293
- monthOptions
362
+ monthOptions,
363
+ goToNextMonth,
364
+ goToPreviousMonth,
365
+ formatYear,
366
+ formatMonth
294
367
  };
295
368
  }
296
369
  });
@@ -313,13 +386,13 @@ var __vue_render__$4 = function () {
313
386
  on: {
314
387
  "click": function ($event) {
315
388
  $event.stopPropagation();
316
- _vm.monthValue = _vm.monthValue - 1;
389
+ return _vm.goToPreviousMonth();
317
390
  }
318
391
  }
319
392
  }), _vm._v(" "), _c('div', {
320
- class: ['layout-row', 'gap-md']
393
+ class: ['layout-row-reverse', 'gap-md']
321
394
  }, [_c('OrButton', {
322
- ref: "monthButton",
395
+ ref: "yearButton",
323
396
  attrs: {
324
397
  "variant": 'link',
325
398
  "color": 'inherit'
@@ -327,15 +400,15 @@ var __vue_render__$4 = function () {
327
400
  on: {
328
401
  "click": function ($event) {
329
402
  $event.stopPropagation();
330
- return _vm.monthMenu.open();
403
+ return _vm.yearMenu.open();
331
404
  }
332
405
  }
333
- }, [_vm._v("\n " + _vm._s(_vm.monthLabel) + " "), _c('OrIcon', {
406
+ }, [_vm._v("\n " + _vm._s(_vm.formatYear(_vm.proxyModelValue)) + " "), _c('OrIcon', {
334
407
  attrs: {
335
- "icon": 'arrow_drop_down'
408
+ "icon": _vm.yearMenuState === 'open' ? 'arrow_drop_up' : 'arrow_drop_down'
336
409
  }
337
410
  })], 1), _vm._v(" "), _c('OrButton', {
338
- ref: "yearButton",
411
+ ref: "monthButton",
339
412
  attrs: {
340
413
  "variant": 'link',
341
414
  "color": 'inherit'
@@ -343,45 +416,51 @@ var __vue_render__$4 = function () {
343
416
  on: {
344
417
  "click": function ($event) {
345
418
  $event.stopPropagation();
346
- return _vm.yearMenu.open();
419
+ return _vm.monthMenu.open();
347
420
  }
348
421
  }
349
- }, [_vm._v("\n " + _vm._s(_vm.yearLabel) + " "), _c('OrIcon', {
422
+ }, [_vm._v("\n " + _vm._s(_vm.formatMonth(_vm.proxyModelValue)) + " "), _c('OrIcon', {
350
423
  attrs: {
351
- "icon": 'arrow_drop_down'
424
+ "icon": _vm.monthMenuState === 'open' ? 'arrow_drop_up' : 'arrow_drop_down'
352
425
  }
353
426
  })], 1), _vm._v(" "), _c('OrMenu', {
354
- ref: "monthMenu",
427
+ ref: "yearMenu",
355
428
  attrs: {
356
- "trigger": _vm.monthButtonRoot
429
+ "trigger": _vm.yearButtonRoot
357
430
  }
358
- }, _vm._l(_vm.monthOptions, function (option) {
431
+ }, _vm._l(_vm.yearOptions, function (value) {
359
432
  return _c('OrMenuItem', {
360
- key: option.value,
433
+ key: Number(value),
434
+ attrs: {
435
+ "selected": Number(value) === Number(_vm.proxyModelValue)
436
+ },
361
437
  on: {
362
438
  "click": function ($event) {
363
439
  $event.stopPropagation();
364
- _vm.monthValue = option.value;
365
- _vm.monthMenu.close();
440
+ _vm.proxyModelValue = value;
441
+ _vm.yearMenu.close();
366
442
  }
367
443
  }
368
- }, [_vm._v("\n " + _vm._s(option.label) + "\n ")]);
444
+ }, [_vm._v("\n " + _vm._s(_vm.formatYear(value)) + "\n ")]);
369
445
  }), 1), _vm._v(" "), _c('OrMenu', {
370
- ref: "yearMenu",
446
+ ref: "monthMenu",
371
447
  attrs: {
372
- "trigger": _vm.yearButtonRoot
448
+ "trigger": _vm.monthButtonRoot
373
449
  }
374
- }, _vm._l(_vm.yearOptions, function (option) {
450
+ }, _vm._l(_vm.monthOptions, function (value) {
375
451
  return _c('OrMenuItem', {
376
- key: option.value,
452
+ key: Number(value),
453
+ attrs: {
454
+ "selected": Number(value) === Number(_vm.proxyModelValue)
455
+ },
377
456
  on: {
378
457
  "click": function ($event) {
379
458
  $event.stopPropagation();
380
- _vm.yearValue = option.value;
381
- _vm.yearMenu.close();
459
+ _vm.proxyModelValue = value;
460
+ _vm.monthMenu.close();
382
461
  }
383
462
  }
384
- }, [_vm._v("\n " + _vm._s(option.label) + "\n ")]);
463
+ }, [_vm._v("\n " + _vm._s(_vm.formatMonth(value)) + "\n ")]);
385
464
  }), 1)], 1), _vm._v(" "), _c('OrIconButton', {
386
465
  attrs: {
387
466
  "icon": 'chevron_right'
@@ -389,7 +468,7 @@ var __vue_render__$4 = function () {
389
468
  on: {
390
469
  "click": function ($event) {
391
470
  $event.stopPropagation();
392
- _vm.monthValue = _vm.monthValue + 1;
471
+ return _vm.goToNextMonth();
393
472
  }
394
473
  }
395
474
  })], 1);
@@ -600,53 +679,53 @@ var script$1 = defineComponent({
600
679
  const buttonGroupItemStyles = computed(() => [...DateTimePickerTimeSelectButtonGroupItem]);
601
680
  // State
602
681
  const proxyModelValue = computed({
603
- get: () => props.modelValue,
604
- set: value => {
605
- context.emit('update:modelValue', value);
606
- }
607
- });
608
- const hoursValue = computed({
609
682
  get: () => {
610
- var _a, _b;
611
- return (_b = (_a = proxyModelValue.value) === null || _a === void 0 ? void 0 : _a.getUTCHours()) !== null && _b !== void 0 ? _b : 0;
683
+ var _a;
684
+ return (_a = props.modelValue) !== null && _a !== void 0 ? _a : new Date(Date.UTC(useDefaultYear(), useDefaultMonth(), useDefaultDate(), useDefaultHours(), useDefaultMinutes()));
612
685
  },
613
686
  set: value => {
614
- var _a, _b, _c, _d, _e, _f, _g, _h;
615
- proxyModelValue.value = new Date(Date.UTC((_b = (_a = proxyModelValue.value) === null || _a === void 0 ? void 0 : _a.getUTCFullYear()) !== null && _b !== void 0 ? _b : 1970, (_d = (_c = proxyModelValue.value) === null || _c === void 0 ? void 0 : _c.getUTCMonth()) !== null && _d !== void 0 ? _d : 0, (_f = (_e = proxyModelValue.value) === null || _e === void 0 ? void 0 : _e.getUTCDate()) !== null && _f !== void 0 ? _f : 1, value, (_h = (_g = proxyModelValue.value) === null || _g === void 0 ? void 0 : _g.getUTCMinutes()) !== null && _h !== void 0 ? _h : minutesValue.value));
687
+ context.emit('update:modelValue', value);
616
688
  }
617
689
  });
618
- const minutesValue = computed({
619
- get: () => {
620
- var _a, _b;
621
- return (_b = (_a = proxyModelValue.value) === null || _a === void 0 ? void 0 : _a.getUTCMinutes()) !== null && _b !== void 0 ? _b : 0;
622
- },
623
- set: value => {
624
- var _a, _b, _c, _d, _e, _f, _g, _h;
625
- proxyModelValue.value = new Date(Date.UTC((_b = (_a = proxyModelValue.value) === null || _a === void 0 ? void 0 : _a.getUTCFullYear()) !== null && _b !== void 0 ? _b : 1970, (_d = (_c = proxyModelValue.value) === null || _c === void 0 ? void 0 : _c.getUTCMonth()) !== null && _d !== void 0 ? _d : 0, (_f = (_e = proxyModelValue.value) === null || _e === void 0 ? void 0 : _e.getUTCDate()) !== null && _f !== void 0 ? _f : 1, (_h = (_g = proxyModelValue.value) === null || _g === void 0 ? void 0 : _g.getUTCHours()) !== null && _h !== void 0 ? _h : hoursValue.value, value));
626
- }
690
+ const hoursOptions = computed(() => {
691
+ return Array.from({
692
+ length: 24
693
+ }, (_value, index) => {
694
+ const value = index;
695
+ return new Date(Date.UTC(proxyModelValue.value.getUTCFullYear(), proxyModelValue.value.getUTCMonth(), proxyModelValue.value.getUTCDate(), value, proxyModelValue.value.getUTCMinutes()));
696
+ });
697
+ });
698
+ const minutesOptions = computed(() => {
699
+ return Array.from({
700
+ length: 60
701
+ }, (_value, index) => {
702
+ const value = index;
703
+ return new Date(Date.UTC(proxyModelValue.value.getUTCFullYear(), proxyModelValue.value.getUTCMonth(), proxyModelValue.value.getUTCDate(), proxyModelValue.value.getUTCHours(), value));
704
+ });
627
705
  });
628
- const hoursOptions = Array.from({
629
- length: 24
630
- }, (_value, index) => ({
631
- value: index,
632
- label: String(index).padStart(2, '0')
633
- }));
634
- const minutesOptions = Array.from({
635
- length: 60
636
- }, (_value, index) => ({
637
- value: index,
638
- label: String(index).padStart(2, '0')
639
- }));
706
+ // Methods
707
+ function formatHours(value) {
708
+ return value.toLocaleString('default', {
709
+ hour: '2-digit',
710
+ timeZone: 'UTC'
711
+ });
712
+ }
713
+ function formatMinutes(value) {
714
+ return value.toLocaleString('default', {
715
+ minute: '2-digit',
716
+ timeZone: 'UTC'
717
+ });
718
+ }
640
719
  return {
641
720
  root,
642
721
  rootStyles,
643
722
  buttonGroupStyles,
644
723
  buttonGroupItemStyles,
645
724
  proxyModelValue,
646
- hoursValue,
647
- minutesValue,
648
725
  hoursOptions,
649
- minutesOptions
726
+ minutesOptions,
727
+ formatHours,
728
+ formatMinutes
650
729
  };
651
730
  }
652
731
  });
@@ -664,38 +743,38 @@ var __vue_render__$1 = function () {
664
743
  class: _vm.rootStyles
665
744
  }, [_c('div', {
666
745
  class: _vm.buttonGroupStyles
667
- }, _vm._l(_vm.hoursOptions, function (option) {
746
+ }, _vm._l(_vm.hoursOptions, function (value) {
668
747
  return _c('OrButton', {
669
- key: option.value,
748
+ key: Number(value),
670
749
  class: _vm.buttonGroupItemStyles,
671
750
  attrs: {
672
- "variant": _vm.hoursValue === option.value ? 'contained' : 'text',
673
- "color": _vm.hoursValue === option.value ? 'primary' : 'inherit'
751
+ "variant": Number(value) === Number(_vm.proxyModelValue) ? 'contained' : 'text',
752
+ "color": Number(value) === Number(_vm.proxyModelValue) ? 'primary' : 'inherit'
674
753
  },
675
754
  on: {
676
755
  "click": function ($event) {
677
756
  $event.stopPropagation();
678
- _vm.hoursValue = option.value;
757
+ _vm.proxyModelValue = value;
679
758
  }
680
759
  }
681
- }, [_vm._v("\n " + _vm._s(option.label) + "\n ")]);
760
+ }, [_vm._v("\n " + _vm._s(_vm.formatHours(value)) + "\n ")]);
682
761
  }), 1), _vm._v("\n\n :\n\n "), _c('div', {
683
762
  class: _vm.buttonGroupStyles
684
- }, _vm._l(_vm.minutesOptions, function (option) {
763
+ }, _vm._l(_vm.minutesOptions, function (value) {
685
764
  return _c('OrButton', {
686
- key: option.value,
765
+ key: Number(value),
687
766
  class: _vm.buttonGroupItemStyles,
688
767
  attrs: {
689
- "variant": _vm.minutesValue === option.value ? 'contained' : 'text',
690
- "color": _vm.minutesValue === option.value ? 'primary' : 'inherit'
768
+ "variant": Number(value) === Number(_vm.proxyModelValue) ? 'contained' : 'text',
769
+ "color": Number(value) === Number(_vm.proxyModelValue) ? 'primary' : 'inherit'
691
770
  },
692
771
  on: {
693
772
  "click": function ($event) {
694
773
  $event.stopPropagation();
695
- _vm.minutesValue = option.value;
774
+ _vm.proxyModelValue = value;
696
775
  }
697
776
  }
698
- }, [_vm._v("\n " + _vm._s(option.label) + "\n ")]);
777
+ }, [_vm._v("\n " + _vm._s(_vm.formatMinutes(value)) + "\n ")]);
699
778
  }), 1)]);
700
779
  };
701
780
  var __vue_staticRenderFns__$1 = [];
@@ -732,7 +811,7 @@ const DateTimePickerControl = [
732
811
  var script = defineComponent({
733
812
  name: 'OrDateTimePicker',
734
813
  components: {
735
- OrDateTimePickerDateSelect,
814
+ OrDateTimePickerDaySelect,
736
815
  OrDateTimePickerMobileControl,
737
816
  OrDateTimePickerMonthSelect,
738
817
  OrDateTimePickerPopoverFooter,
@@ -823,6 +902,12 @@ var script = defineComponent({
823
902
  context.emit('update:modelValue', value);
824
903
  }
825
904
  });
905
+ const draftModelValue = ref();
906
+ watch(proxyModelValue, value => {
907
+ draftModelValue.value = value;
908
+ }, {
909
+ immediate: true
910
+ });
826
911
  // Methods
827
912
  function toggleDatePopover() {
828
913
  if (!props.readonly && !props.disabled) {
@@ -872,6 +957,7 @@ var script = defineComponent({
872
957
  controlStyles,
873
958
  controlAttributes,
874
959
  proxyModelValue,
960
+ draftModelValue,
875
961
  toggleDatePopover,
876
962
  toggleTimePopover,
877
963
  closeDatePopover,
@@ -880,7 +966,7 @@ var script = defineComponent({
880
966
  }
881
967
  });
882
968
 
883
- var css_248z = "input[data-v-84c46328]{min-width:0;background:0 0;outline:0}input[type=date][data-v-84c46328]::-webkit-datetime-edit-day-field,input[type=date][data-v-84c46328]::-webkit-datetime-edit-month-field,input[type=date][data-v-84c46328]::-webkit-datetime-edit-year-field{display:none}input[type=time][data-v-84c46328]::-webkit-datetime-edit-ampm-field,input[type=time][data-v-84c46328]::-webkit-datetime-edit-hour-field,input[type=time][data-v-84c46328]::-webkit-datetime-edit-minute-field{display:none}input[type=date][data-v-84c46328]::-webkit-datetime-edit-text,input[type=time][data-v-84c46328]::-webkit-datetime-edit-text{display:none}input[type=date][data-v-84c46328]::-webkit-calendar-picker-indicator,input[type=time][data-v-84c46328]::-webkit-calendar-picker-indicator{display:none}";
969
+ var css_248z = "input[data-v-0bec0f54]{min-width:0;background:0 0;outline:0}input[type=date][data-v-0bec0f54]::-webkit-datetime-edit-day-field,input[type=date][data-v-0bec0f54]::-webkit-datetime-edit-month-field,input[type=date][data-v-0bec0f54]::-webkit-datetime-edit-year-field{display:none}input[type=time][data-v-0bec0f54]::-webkit-datetime-edit-ampm-field,input[type=time][data-v-0bec0f54]::-webkit-datetime-edit-hour-field,input[type=time][data-v-0bec0f54]::-webkit-datetime-edit-minute-field{display:none}input[type=date][data-v-0bec0f54]::-webkit-datetime-edit-text,input[type=time][data-v-0bec0f54]::-webkit-datetime-edit-text{display:none}input[type=date][data-v-0bec0f54]::-webkit-calendar-picker-indicator,input[type=time][data-v-0bec0f54]::-webkit-calendar-picker-indicator{display:none}";
884
970
  styleInject(css_248z);
885
971
 
886
972
  /* script */
@@ -983,24 +1069,29 @@ var __vue_render__ = function () {
983
1069
  }
984
1070
  }, [_vm._v("\n 9:07\n ")])], 1), _vm._v(" "), _c('OrDateTimePickerMonthSelect', {
985
1071
  model: {
986
- value: _vm.proxyModelValue,
1072
+ value: _vm.draftModelValue,
987
1073
  callback: function ($$v) {
988
- _vm.proxyModelValue = $$v;
1074
+ _vm.draftModelValue = $$v;
989
1075
  },
990
- expression: "proxyModelValue"
1076
+ expression: "draftModelValue"
991
1077
  }
992
- }), _vm._v(" "), _c('OrDateTimePickerDateSelect', {
1078
+ }), _vm._v(" "), _c('OrDateTimePickerDaySelect', {
993
1079
  model: {
994
- value: _vm.proxyModelValue,
1080
+ value: _vm.draftModelValue,
995
1081
  callback: function ($$v) {
996
- _vm.proxyModelValue = $$v;
1082
+ _vm.draftModelValue = $$v;
997
1083
  },
998
- expression: "proxyModelValue"
1084
+ expression: "draftModelValue"
999
1085
  }
1000
1086
  }), _vm._v(" "), _c('OrDateTimePickerPopoverFooter', {
1001
1087
  on: {
1088
+ "resolve": function ($event) {
1089
+ _vm.proxyModelValue = _vm.draftModelValue;
1090
+ _vm.datePopover.close();
1091
+ },
1002
1092
  "reject": function ($event) {
1003
- return _vm.closeDatePopover();
1093
+ _vm.draftModelValue = _vm.proxyModelValue;
1094
+ _vm.datePopover.close();
1004
1095
  }
1005
1096
  }
1006
1097
  })], 1), _vm._v(" "), _c('OrPopover', {
@@ -1020,16 +1111,21 @@ var __vue_render__ = function () {
1020
1111
  }
1021
1112
  }, [_vm._v("\n 9:07\n ")])], 1), _vm._v(" "), _c('OrDateTimePickerTimeSelect', {
1022
1113
  model: {
1023
- value: _vm.proxyModelValue,
1114
+ value: _vm.draftModelValue,
1024
1115
  callback: function ($$v) {
1025
- _vm.proxyModelValue = $$v;
1116
+ _vm.draftModelValue = $$v;
1026
1117
  },
1027
- expression: "proxyModelValue"
1118
+ expression: "draftModelValue"
1028
1119
  }
1029
1120
  }), _vm._v(" "), _c('OrDateTimePickerPopoverFooter', {
1030
1121
  on: {
1122
+ "resolve": function ($event) {
1123
+ _vm.proxyModelValue = _vm.draftModelValue;
1124
+ _vm.timePopover.close();
1125
+ },
1031
1126
  "reject": function ($event) {
1032
- return _vm.closeTimePopover();
1127
+ _vm.draftModelValue = _vm.proxyModelValue;
1128
+ _vm.timePopover.close();
1033
1129
  }
1034
1130
  }
1035
1131
  })], 1), _vm._v(" "), _c('div', {
@@ -1063,7 +1159,7 @@ var __vue_staticRenderFns__ = [];
1063
1159
  /* style */
1064
1160
  const __vue_inject_styles__ = undefined;
1065
1161
  /* scoped */
1066
- const __vue_scope_id__ = "data-v-84c46328";
1162
+ const __vue_scope_id__ = "data-v-0bec0f54";
1067
1163
  /* module identifier */
1068
1164
  const __vue_module_identifier__ = undefined;
1069
1165
  /* functional template */