@vgip/meta-ui 1.5.6 → 1.5.8
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/esm2020/lib/fieldAbstract.mjs +6 -6
- package/esm2020/lib/fieldComposite/index.mjs +65 -0
- package/esm2020/lib/fieldList/index.mjs +68 -0
- package/esm2020/lib/fieldReference/index.mjs +823 -0
- package/esm2020/lib/fieldSelect/index.mjs +488 -0
- package/esm2020/lib/index.mjs +10 -18
- package/esm2020/lib/layout/index.mjs +151 -0
- package/esm2020/lib/metaField/index.mjs +139 -0
- package/esm2020/lib/refDialog/index.mjs +127 -0
- package/esm2020/lib/resource/index.mjs +480 -0
- package/esm2020/lib/resourceCard/index.mjs +42 -0
- package/esm2020/lib/services/metaReference/index.mjs +2 -3
- package/fesm2015/vgip-meta-ui-fieldAbstract-2d0882f1.mjs +382 -0
- package/fesm2015/vgip-meta-ui-fieldAbstract-2d0882f1.mjs.map +1 -0
- package/fesm2015/vgip-meta-ui-index-0068fb77.mjs +368 -0
- package/fesm2015/vgip-meta-ui-index-0068fb77.mjs.map +1 -0
- package/fesm2015/vgip-meta-ui-index-3488da98.mjs +130 -0
- package/fesm2015/vgip-meta-ui-index-3488da98.mjs.map +1 -0
- package/fesm2015/vgip-meta-ui-index-4d489d76.mjs +71 -0
- package/fesm2015/vgip-meta-ui-index-4d489d76.mjs.map +1 -0
- package/fesm2015/vgip-meta-ui-index-5615e618.mjs +95 -0
- package/fesm2015/vgip-meta-ui-index-5615e618.mjs.map +1 -0
- package/fesm2015/vgip-meta-ui-index-65c10356.mjs +57 -0
- package/fesm2015/vgip-meta-ui-index-65c10356.mjs.map +1 -0
- package/fesm2015/vgip-meta-ui-index-6a77fa96.mjs +74 -0
- package/fesm2015/vgip-meta-ui-index-6a77fa96.mjs.map +1 -0
- package/fesm2015/vgip-meta-ui-index-6bd006d4.mjs +496 -0
- package/fesm2015/vgip-meta-ui-index-6bd006d4.mjs.map +1 -0
- package/fesm2015/vgip-meta-ui-index-8f5be5a7.mjs +24 -0
- package/fesm2015/vgip-meta-ui-index-8f5be5a7.mjs.map +1 -0
- package/fesm2015/vgip-meta-ui-index-92be02c0.mjs +145 -0
- package/fesm2015/vgip-meta-ui-index-92be02c0.mjs.map +1 -0
- package/fesm2015/vgip-meta-ui-index-934aeabf.mjs +68 -0
- package/fesm2015/vgip-meta-ui-index-934aeabf.mjs.map +1 -0
- package/fesm2015/vgip-meta-ui-index-9b5ee0c4.mjs +88 -0
- package/fesm2015/vgip-meta-ui-index-9b5ee0c4.mjs.map +1 -0
- package/fesm2015/vgip-meta-ui-index-a308ba4f.mjs +856 -0
- package/fesm2015/vgip-meta-ui-index-a308ba4f.mjs.map +1 -0
- package/fesm2015/vgip-meta-ui-index-def34ca9.mjs +1882 -0
- package/fesm2015/vgip-meta-ui-index-def34ca9.mjs.map +1 -0
- package/fesm2015/vgip-meta-ui-index-fa0b1b8b.mjs +460 -0
- package/fesm2015/vgip-meta-ui-index-fa0b1b8b.mjs.map +1 -0
- package/fesm2015/vgip-meta-ui-metaModel.pipe-725f401c.mjs +28 -0
- package/fesm2015/vgip-meta-ui-metaModel.pipe-725f401c.mjs.map +1 -0
- package/fesm2015/vgip-meta-ui-relativeTimeBuilder-31791ce4.mjs +51 -0
- package/fesm2015/vgip-meta-ui-relativeTimeBuilder-31791ce4.mjs.map +1 -0
- package/fesm2015/vgip-meta-ui.mjs +40 -5083
- package/fesm2015/vgip-meta-ui.mjs.map +1 -1
- package/fesm2020/vgip-meta-ui-fieldAbstract-2d0882f1.mjs +382 -0
- package/fesm2020/vgip-meta-ui-fieldAbstract-2d0882f1.mjs.map +1 -0
- package/fesm2020/vgip-meta-ui-index-0068fb77.mjs +368 -0
- package/fesm2020/vgip-meta-ui-index-0068fb77.mjs.map +1 -0
- package/fesm2020/vgip-meta-ui-index-3488da98.mjs +130 -0
- package/fesm2020/vgip-meta-ui-index-3488da98.mjs.map +1 -0
- package/fesm2020/vgip-meta-ui-index-3907f4b1.mjs +1879 -0
- package/fesm2020/vgip-meta-ui-index-3907f4b1.mjs.map +1 -0
- package/fesm2020/vgip-meta-ui-index-3d8c2fcd.mjs +856 -0
- package/fesm2020/vgip-meta-ui-index-3d8c2fcd.mjs.map +1 -0
- package/fesm2020/vgip-meta-ui-index-5615e618.mjs +95 -0
- package/fesm2020/vgip-meta-ui-index-5615e618.mjs.map +1 -0
- package/fesm2020/vgip-meta-ui-index-65c10356.mjs +57 -0
- package/fesm2020/vgip-meta-ui-index-65c10356.mjs.map +1 -0
- package/fesm2020/vgip-meta-ui-index-6f96198b.mjs +70 -0
- package/fesm2020/vgip-meta-ui-index-6f96198b.mjs.map +1 -0
- package/fesm2020/vgip-meta-ui-index-710246ac.mjs +73 -0
- package/fesm2020/vgip-meta-ui-index-710246ac.mjs.map +1 -0
- package/fesm2020/vgip-meta-ui-index-8f5be5a7.mjs +24 -0
- package/fesm2020/vgip-meta-ui-index-8f5be5a7.mjs.map +1 -0
- package/fesm2020/vgip-meta-ui-index-934aeabf.mjs +68 -0
- package/fesm2020/vgip-meta-ui-index-934aeabf.mjs.map +1 -0
- package/fesm2020/vgip-meta-ui-index-9b5ee0c4.mjs +88 -0
- package/fesm2020/vgip-meta-ui-index-9b5ee0c4.mjs.map +1 -0
- package/fesm2020/vgip-meta-ui-index-e743527e.mjs +495 -0
- package/fesm2020/vgip-meta-ui-index-e743527e.mjs.map +1 -0
- package/fesm2020/vgip-meta-ui-index-e8e3b16a.mjs +142 -0
- package/fesm2020/vgip-meta-ui-index-e8e3b16a.mjs.map +1 -0
- package/fesm2020/vgip-meta-ui-index-fa0b1b8b.mjs +460 -0
- package/fesm2020/vgip-meta-ui-index-fa0b1b8b.mjs.map +1 -0
- package/fesm2020/vgip-meta-ui-metaModel.pipe-725f401c.mjs +28 -0
- package/fesm2020/vgip-meta-ui-metaModel.pipe-725f401c.mjs.map +1 -0
- package/fesm2020/vgip-meta-ui-relativeTimeBuilder-31791ce4.mjs +51 -0
- package/fesm2020/vgip-meta-ui-relativeTimeBuilder-31791ce4.mjs.map +1 -0
- package/fesm2020/vgip-meta-ui.mjs +39 -5083
- package/fesm2020/vgip-meta-ui.mjs.map +1 -1
- package/lib/fieldComposite/index.d.ts +12 -0
- package/lib/fieldList/index.d.ts +14 -0
- package/lib/fieldReference/index.d.ts +73 -0
- package/lib/fieldSelect/index.d.ts +48 -0
- package/lib/index.d.ts +31 -23
- package/lib/layout/index.d.ts +39 -0
- package/lib/metaField/index.d.ts +26 -0
- package/lib/refDialog/index.d.ts +33 -0
- package/lib/resource/index.d.ts +58 -0
- package/lib/resourceCard/index.d.ts +18 -0
- package/lib/services/metaReference/index.d.ts +1 -1
- package/package.json +1 -1
- package/esm2020/lib/field.mjs +0 -2325
- package/lib/field.d.ts +0 -292
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { Component } from '@angular/core';
|
|
3
|
+
import * as i2 from '@angular/forms';
|
|
4
|
+
import { ControlContainer, NgForm } from '@angular/forms';
|
|
5
|
+
import { F as FieldAbstract } from './vgip-meta-ui-fieldAbstract-2d0882f1.mjs';
|
|
6
|
+
import { r as relativeTimeBuilder } from './vgip-meta-ui-relativeTimeBuilder-31791ce4.mjs';
|
|
7
|
+
import * as i1 from '@angular/common';
|
|
8
|
+
import { M as MetaModelPipe } from './vgip-meta-ui-metaModel.pipe-725f401c.mjs';
|
|
9
|
+
import 'rxjs';
|
|
10
|
+
import 'rxjs/operators';
|
|
11
|
+
|
|
12
|
+
/*
|
|
13
|
+
* @Author: Alexander.Vangelov@vonage.com
|
|
14
|
+
* @Date: 2020-04-18 18:05:46
|
|
15
|
+
* @Last Modified by: Alexander.Vangelov@vonage.com
|
|
16
|
+
* @Last Modified time: 2020-04-18 21:09:16
|
|
17
|
+
*/
|
|
18
|
+
class FieldDatetime extends FieldAbstract {
|
|
19
|
+
constructor() {
|
|
20
|
+
super(...arguments);
|
|
21
|
+
this.placeholder = 'dd/mm/yyyy';
|
|
22
|
+
this.clickout = (event) => {
|
|
23
|
+
if (event.target.className === 'Vlt-dropdown__link' && this.elementRef.nativeElement.contains(event.target)) {
|
|
24
|
+
this.focus();
|
|
25
|
+
// this.dismissDropdown();
|
|
26
|
+
// this.parent[this.meta.name] = event.target.textContent;
|
|
27
|
+
}
|
|
28
|
+
else if (event.target !== this.input && event.target.className !== 'Vlt-dropdown__title') {
|
|
29
|
+
this.dismissDropdown();
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
this.focus();
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
this.keydown = (event) => {
|
|
36
|
+
switch (event.key) {
|
|
37
|
+
case 'ArrowDown': {
|
|
38
|
+
if (['datetime', 'time', 'date', 'datetime-local'].indexOf(this.meta.type || this.meta.subtype) !== -1) {
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
this.showDropdown();
|
|
42
|
+
event.preventDefault();
|
|
43
|
+
if (typeof (this.activeSuggestionIndex) === 'undefined') {
|
|
44
|
+
this.activeSuggestionIndex = 0;
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
this.activeSuggestionIndex++;
|
|
48
|
+
if (this.activeSuggestionIndex >= this.suggestions.length) {
|
|
49
|
+
this.activeSuggestionIndex = 0;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
case 'ArrowUp': {
|
|
55
|
+
if (['datetime', 'time', 'date', 'datetime-local'].indexOf(this.meta.type || this.meta.subtype) !== -1) {
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
this.showDropdown();
|
|
59
|
+
event.preventDefault();
|
|
60
|
+
if (typeof (this.activeSuggestionIndex) === 'undefined') {
|
|
61
|
+
this.activeSuggestionIndex = this.suggestions.length - 1;
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
this.activeSuggestionIndex--;
|
|
65
|
+
if (this.activeSuggestionIndex < 0) {
|
|
66
|
+
this.activeSuggestionIndex = this.suggestions.length - 1;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
case 'Space':
|
|
72
|
+
case 'Enter': {
|
|
73
|
+
if (typeof (this.activeSuggestionIndex) !== 'undefined') {
|
|
74
|
+
event.preventDefault();
|
|
75
|
+
event.stopPropagation();
|
|
76
|
+
this.onSuggestionSelect(event, this.suggestions[this.activeSuggestionIndex]);
|
|
77
|
+
delete this.activeSuggestionIndex;
|
|
78
|
+
}
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
case 'Escape': {
|
|
82
|
+
event.preventDefault();
|
|
83
|
+
event.stopPropagation();
|
|
84
|
+
this.dismissDropdown();
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
get suggestions() {
|
|
91
|
+
return this.meta.suggestions || [];
|
|
92
|
+
}
|
|
93
|
+
ngOnInit() {
|
|
94
|
+
this.validationAttributes = ['required', 'min', 'max', 'step'];
|
|
95
|
+
this.type = this.meta.type;
|
|
96
|
+
if (this.meta.type === 'datetime') {
|
|
97
|
+
this.type = 'datetime-local';
|
|
98
|
+
this.placeholder += ' --:-- --';
|
|
99
|
+
}
|
|
100
|
+
else if (this.meta.type === 'time') {
|
|
101
|
+
this.placeholder = '--:-- --';
|
|
102
|
+
}
|
|
103
|
+
const origValue = this.parent[this.meta.name];
|
|
104
|
+
Object.defineProperty(this.parent, this.meta.name, {
|
|
105
|
+
set: (value) => {
|
|
106
|
+
if (value) {
|
|
107
|
+
if (['datetime', 'date', 'datetime-local'].indexOf(this.meta.type || this.meta.subtype) !== -1 && value) {
|
|
108
|
+
try {
|
|
109
|
+
let date;
|
|
110
|
+
if ((typeof (value) === 'number')) {
|
|
111
|
+
date = new Date(parseInt(value, 10));
|
|
112
|
+
if ('date' === (this.meta.type || this.meta.subtype)) {
|
|
113
|
+
date = new Date(date.getTime() + (date.getTimezoneOffset() * 60000));
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
if ('date' === (this.meta.type || this.meta.subtype)) {
|
|
118
|
+
date = new Date(Date.parse(value));
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
date = new Date(Date.parse(`${value}Z`) + (new Date().getTimezoneOffset() * 60000));
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (typeof (value) === 'number') {
|
|
125
|
+
switch (this.meta.type || this.meta.subtype) {
|
|
126
|
+
case 'datetime-local':
|
|
127
|
+
case 'datetime': {
|
|
128
|
+
this.model = `${date.getFullYear()}-${('00' + (date.getMonth() + 1)).slice(-2)}-${('00' + date.getDate()).slice(-2)}`;
|
|
129
|
+
this.model += `T${('00' + date.getHours()).slice(-2)}:${('00' + date.getMinutes()).slice(-2)}`;
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
case 'date': {
|
|
133
|
+
this.model = date.toISOString().split('T')[0];
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (this.meta.valueType === 'isostring') {
|
|
139
|
+
this.value = date.toISOString();
|
|
140
|
+
}
|
|
141
|
+
else if (this.meta.valueType === 'string') {
|
|
142
|
+
if ((this.meta.type || this.meta.subtype) === 'date') {
|
|
143
|
+
this.value = date.toISOString().split('T')[0];
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
this.value = date.toISOString();
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
if ((this.meta.type || this.meta.subtype) === 'date') {
|
|
151
|
+
date.setFullYear(date.getUTCFullYear());
|
|
152
|
+
date.setMonth(date.getUTCMonth());
|
|
153
|
+
date.setDate(date.getUTCDate());
|
|
154
|
+
date.setMinutes(0);
|
|
155
|
+
date.setHours(0);
|
|
156
|
+
date.setSeconds(0);
|
|
157
|
+
date.setMilliseconds(0);
|
|
158
|
+
this.value = new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).getTime();
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
this.value = date.getTime();
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
catch (e) {
|
|
166
|
+
console.error('Date parse error', e.message, `"${value}"`, `(${typeof (value)})`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
else if ('time' === (this.meta.type || this.meta.subtype)) {
|
|
170
|
+
try {
|
|
171
|
+
let date;
|
|
172
|
+
if (typeof (value) === 'number') {
|
|
173
|
+
date = new Date(parseInt(value, 10));
|
|
174
|
+
if (value < 86400000) {
|
|
175
|
+
date = new Date(date.getTime() + (date.getTimezoneOffset() * 60000));
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
date = new Date(Date.parse(new Date().toISOString().replace(/T.*Z/, `T${value}Z`)) + (new Date().getTimezoneOffset() * 60000));
|
|
180
|
+
}
|
|
181
|
+
this.model = date.toTimeString().split(' ')[0];
|
|
182
|
+
if (this.meta.valueType === 'isostring') {
|
|
183
|
+
this.value = date.toISOString();
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
date.setFullYear(1970);
|
|
187
|
+
date.setMonth(0);
|
|
188
|
+
date.setDate(1);
|
|
189
|
+
date.setMilliseconds(0);
|
|
190
|
+
if (this.meta.valueType === 'string') {
|
|
191
|
+
this.value = new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).toISOString().split('T')[1].substring(0, 8);
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
this.value = new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).getTime();
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
catch (e) {
|
|
199
|
+
console.error('Date parse error', e.message, `"${value}"`, `(${typeof (value)})`);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
delete this.model;
|
|
205
|
+
delete this.value;
|
|
206
|
+
}
|
|
207
|
+
this.meta.$optional = this.isOptional;
|
|
208
|
+
},
|
|
209
|
+
get: () => this.value,
|
|
210
|
+
enumerable: this.sendToServer,
|
|
211
|
+
configurable: true
|
|
212
|
+
});
|
|
213
|
+
if (typeof (origValue) !== 'undefined') {
|
|
214
|
+
this.parent[this.meta.name] = origValue;
|
|
215
|
+
}
|
|
216
|
+
const d = this.meta.default || this.meta.defaultValue;
|
|
217
|
+
if (d && typeof (this.model) === 'undefined') {
|
|
218
|
+
const defaultValue = (typeof (d) === 'string') ? d : (d.id || d.value);
|
|
219
|
+
if (defaultValue || defaultValue === 0) {
|
|
220
|
+
if (/^(date|time)/.test(this.meta.type || this.meta.subtype) && typeof (defaultValue) === 'string') {
|
|
221
|
+
this.parent[this.meta.name] = relativeTimeBuilder(this.meta.type || this.meta.subtype, defaultValue, this.validations.step);
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
this.parent[this.meta.name] = defaultValue;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
if (typeof (this.meta.auto) === 'object') {
|
|
229
|
+
Object.keys(this.meta.auto || {}).filter(n => ['gt', 'lt'].indexOf(n) !== -1).map(v => this.setupLogicalValidation(v));
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
onActivated(ev) {
|
|
233
|
+
this.input = ev.srcElement;
|
|
234
|
+
if (!this.dropdown) {
|
|
235
|
+
this.dropdown = ev.srcElement.parentNode.parentNode;
|
|
236
|
+
}
|
|
237
|
+
this.showDropdown();
|
|
238
|
+
}
|
|
239
|
+
clear(ev) {
|
|
240
|
+
delete this.model;
|
|
241
|
+
this.onModelChange(this.model);
|
|
242
|
+
if (ev) {
|
|
243
|
+
ev.preventDefault();
|
|
244
|
+
ev.stopPropagation();
|
|
245
|
+
return false;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
onBlur(ev) {
|
|
249
|
+
let internalControl = false;
|
|
250
|
+
if (ev.relatedTarget) {
|
|
251
|
+
if (!this.elementRef.nativeElement.contains(ev.relatedTarget)) {
|
|
252
|
+
this.dismissDropdown();
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
internalControl = true;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
if (this.keyListenerActive && !internalControl) {
|
|
259
|
+
this.input.removeEventListener('keydown', this.keydown);
|
|
260
|
+
setTimeout(() => {
|
|
261
|
+
if (!this.keyListenerActive) {
|
|
262
|
+
document.removeEventListener('click', this.clickout);
|
|
263
|
+
}
|
|
264
|
+
}, 400);
|
|
265
|
+
delete this.keyListenerActive;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
onSuggestionSelect(ev, suggestion) {
|
|
269
|
+
if (!suggestion) {
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
ev.preventDefault();
|
|
273
|
+
ev.stopPropagation();
|
|
274
|
+
this.focus();
|
|
275
|
+
this.dismissDropdown();
|
|
276
|
+
this.model = suggestion;
|
|
277
|
+
this.onModelChange(suggestion);
|
|
278
|
+
}
|
|
279
|
+
dismissDropdown(event) {
|
|
280
|
+
if (event) {
|
|
281
|
+
this.focus();
|
|
282
|
+
}
|
|
283
|
+
if (this.dropdown) {
|
|
284
|
+
this.dropdown.classList.remove('Vlt-dropdown--expanded');
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
ensureDropdownIsVisible() {
|
|
288
|
+
setTimeout(() => {
|
|
289
|
+
const holder = this.dropdown.closest('.Vlt-card__content');
|
|
290
|
+
const el = this.elementRef.nativeElement.querySelector('.Vlt-dropdown__panel');
|
|
291
|
+
const elRect = el.getBoundingClientRect();
|
|
292
|
+
const holderRect = holder.getBoundingClientRect();
|
|
293
|
+
if (holderRect.top + holderRect.height < elRect.top + elRect.height) {
|
|
294
|
+
el.scrollIntoView({ block: 'end' });
|
|
295
|
+
}
|
|
296
|
+
}, 400);
|
|
297
|
+
}
|
|
298
|
+
showDropdown() {
|
|
299
|
+
if (this.meta.suggestions && this.meta.suggestions.length) {
|
|
300
|
+
this.dropdown.classList.add('Vlt-dropdown--expanded');
|
|
301
|
+
this.ensureDropdownIsVisible();
|
|
302
|
+
}
|
|
303
|
+
if (!this.keyListenerActive) {
|
|
304
|
+
this.input.addEventListener('keydown', this.keydown);
|
|
305
|
+
setTimeout(() => {
|
|
306
|
+
document.addEventListener('click', this.clickout);
|
|
307
|
+
}, 200);
|
|
308
|
+
this.keyListenerActive = true;
|
|
309
|
+
if (this.parent[this.meta.name]) {
|
|
310
|
+
for (let suggestionIndex = 0; suggestionIndex < (this.meta.suggestions || []).length; suggestionIndex++) {
|
|
311
|
+
if (this.meta.suggestions[suggestionIndex] === this.parent[this.meta.name]) {
|
|
312
|
+
this.activeSuggestionIndex = suggestionIndex;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
autoSetValue(againstTimestamp, v, cfg) {
|
|
319
|
+
const compareValue = relativeTimeBuilder(this.meta.type, cfg.offset, this.validations.step, againstTimestamp);
|
|
320
|
+
if (this.model) {
|
|
321
|
+
const currentValue = new Date(this.model).getTime();
|
|
322
|
+
let isInvalid;
|
|
323
|
+
if (v === 'gt') {
|
|
324
|
+
isInvalid = compareValue > currentValue;
|
|
325
|
+
}
|
|
326
|
+
else if (v === 'lt') {
|
|
327
|
+
isInvalid = currentValue > compareValue;
|
|
328
|
+
}
|
|
329
|
+
if (isInvalid) {
|
|
330
|
+
this.parent[this.meta.name] = compareValue;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
else {
|
|
334
|
+
this.parent[this.meta.name] = compareValue;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
setupLogicalValidation(v) {
|
|
338
|
+
const cfg = this.meta.auto[v];
|
|
339
|
+
if (typeof (cfg.against) === 'string') {
|
|
340
|
+
let againstValue = this.parent[cfg.against];
|
|
341
|
+
try {
|
|
342
|
+
let againstTimestamp = Date.parse(`${againstValue}Z`) + (new Date().getTimezoneOffset() * 60000);
|
|
343
|
+
if (againstValue) {
|
|
344
|
+
this.autoSetValue(againstTimestamp, v, cfg);
|
|
345
|
+
}
|
|
346
|
+
this.parentChangeSubject.subscribe((value) => {
|
|
347
|
+
if (value && value.hasOwnProperty(cfg.against)) {
|
|
348
|
+
againstValue = value[cfg.against];
|
|
349
|
+
if (againstValue) {
|
|
350
|
+
againstTimestamp = Date.parse(`${againstValue}Z`) + (new Date().getTimezoneOffset() * 60000);
|
|
351
|
+
this.autoSetValue(againstTimestamp, v, cfg);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
catch (e) { }
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
FieldDatetime.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: FieldDatetime, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
361
|
+
FieldDatetime.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.0", type: FieldDatetime, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "<div class='vgip-meta-field-preview' *ngIf='preview && model'>\n <div class='vgip-meta-field-label'>{{meta.label || meta.name}}</div>\n <div class='vgip-meta-field-value __gu'>{{model}}</div>\n</div>\n<div *ngIf='!preview' class=\"Vlt-form__element Vlt-form__element--big\" [ngClass]=\"{'Vlt-form__element--error': f.invalid && ((f | metaModel)._parent.submitted || (f | metaModel ).touched), 'has-value': f.value, active: keyListenerActive }\">\n <div class=\"Vlt-input\">\n <label class='wrapper'>\n <input class='main model' [pattern]=\"validations.pattern ? validations.pattern.value || validations.pattern : null\" [required]='validations.required' [minlength]='validations.minlength' [maxlength]='validations.maxlength' [min]='validations.min' [max]='validations.max' [step]='validations.step' [disabled]='disabled' [readonly]='readonly' [(ngModel)]='model' (ngModelChange)=\"onModelChange($event)\" #f='ngModel' [name]='name' [type]=\"type\" [placeholder]=\"placeholder\" (click)='onActivated($event)' (focus)='onActivated($event)' (blur)='onBlur($event)'/>\n <label class='Vlt-truncate'>{{meta.label || meta.name}}<span *ngIf='validations.required' class='Vlt-red'>*</span></label>\n </label>\n <div class='Vlt-composite__append right-actions'>\n <div *ngIf='model' class=\"Vlt-composite__append--icon\" (click)='clear()'>\n <div class=\"Vlt-composite__icon\">\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-cross\"/></svg>\n </div>\n </div>\n </div>\n </div>\n <small *ngIf='f.invalid && ((f | metaModel)._parent.submitted || ((f | metaModel ).touched && keyListenerActive))' class=\"Vlt-form__element__error\">\n <span *ngIf=\"f.errors.required\">Required. </span>\n <span *ngIf=\"f.errors.min\">Must be later than {{validations.min}}. </span>\n <span *ngIf=\"f.errors.max\">Must be no later than {{validations}}. </span>\n <span *ngIf=\"f.errors.custom\">{{f.errors.custom}} </span>\n </small>\n <small *ngIf='meta.hint' class=\"Vlt-form__element__hint\">{{meta.hint}}</small>\n</div>", styles: [".Vlt-form__element--big.Vlt-form__element--error input.main,.Vlt-form__element--big.Vlt-form__element--error .Vlt-composite__append button{background:var(--vgip-meta-input-bg-color);border-color:#f25a6b;box-shadow:none}@-moz-document url-prefix(){.Vlt-composite__append.right-actions{right:10px!important}}.Vlt-composite__append.right-actions{position:absolute;top:5px;right:10px;cursor:pointer}@media screen and (-webkit-min-device-pixel-ratio: 0) and (-webkit-min-device-pixel-ratio: 0),screen and (-webkit-min-device-pixel-ratio: 0) and (min-resolution: .001dpcm){.Vlt-composite__append.right-actions{right:53px}}.Vlt-composite__append.right-actions .Vlt-composite__append--icon{width:36px;outline:none;position:initial;display:inline-block}.Vlt-composite__append.right-actions .Vlt-composite__append--icon svg{height:14px;width:14px}.Vlt-composite__append.right-actions .Vlt-composite__append--icon:hover svg,.Vlt-composite__append.right-actions .Vlt-composite__append--icon:focus svg{fill:#2c2d30}:host-context ::ng-deep input::-webkit-calendar-picker-indicator{height:48px;width:51px;margin-top:-15px;margin-right:-15px;padding:0 2px 0 0;cursor:pointer;color:transparent;background-origin:content-box;background-size:initial;background-repeat:no-repeat;background-position:center;opacity:1;visibility:visible;background-image:var(--vgip-meta-date-icon)}:host-context ::ng-deep input::-webkit-calendar-picker-indicator:hover{background-color:var(--vgip-meta-input-action-hover-bg-color)}:host-context ::ng-deep input[type=time]::-webkit-calendar-picker-indicator{background-image:var(--vgip-meta-time-icon)}:host-context ::ng-deep input[readonly]::-webkit-calendar-picker-indicator{visibility:visible}:host-context ::ng-deep input:enabled:read-write:-webkit-any(:focus,:hover)::-webkit-clear-button{opacity:0;pointer-events:none}:host-context ::ng-deep input:enabled:read-write:-webkit-any(:focus,:hover)::-webkit-inner-spin-button{opacity:0;pointer-events:none}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.MinLengthValidator, selector: "[minlength][formControlName],[minlength][formControl],[minlength][ngModel]", inputs: ["minlength"] }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: MetaModelPipe, name: "metaModel" }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }] });
|
|
362
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: FieldDatetime, decorators: [{
|
|
363
|
+
type: Component,
|
|
364
|
+
args: [{ viewProviders: [{ provide: ControlContainer, useExisting: NgForm }], template: "<div class='vgip-meta-field-preview' *ngIf='preview && model'>\n <div class='vgip-meta-field-label'>{{meta.label || meta.name}}</div>\n <div class='vgip-meta-field-value __gu'>{{model}}</div>\n</div>\n<div *ngIf='!preview' class=\"Vlt-form__element Vlt-form__element--big\" [ngClass]=\"{'Vlt-form__element--error': f.invalid && ((f | metaModel)._parent.submitted || (f | metaModel ).touched), 'has-value': f.value, active: keyListenerActive }\">\n <div class=\"Vlt-input\">\n <label class='wrapper'>\n <input class='main model' [pattern]=\"validations.pattern ? validations.pattern.value || validations.pattern : null\" [required]='validations.required' [minlength]='validations.minlength' [maxlength]='validations.maxlength' [min]='validations.min' [max]='validations.max' [step]='validations.step' [disabled]='disabled' [readonly]='readonly' [(ngModel)]='model' (ngModelChange)=\"onModelChange($event)\" #f='ngModel' [name]='name' [type]=\"type\" [placeholder]=\"placeholder\" (click)='onActivated($event)' (focus)='onActivated($event)' (blur)='onBlur($event)'/>\n <label class='Vlt-truncate'>{{meta.label || meta.name}}<span *ngIf='validations.required' class='Vlt-red'>*</span></label>\n </label>\n <div class='Vlt-composite__append right-actions'>\n <div *ngIf='model' class=\"Vlt-composite__append--icon\" (click)='clear()'>\n <div class=\"Vlt-composite__icon\">\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-cross\"/></svg>\n </div>\n </div>\n </div>\n </div>\n <small *ngIf='f.invalid && ((f | metaModel)._parent.submitted || ((f | metaModel ).touched && keyListenerActive))' class=\"Vlt-form__element__error\">\n <span *ngIf=\"f.errors.required\">Required. </span>\n <span *ngIf=\"f.errors.min\">Must be later than {{validations.min}}. </span>\n <span *ngIf=\"f.errors.max\">Must be no later than {{validations}}. </span>\n <span *ngIf=\"f.errors.custom\">{{f.errors.custom}} </span>\n </small>\n <small *ngIf='meta.hint' class=\"Vlt-form__element__hint\">{{meta.hint}}</small>\n</div>", styles: [".Vlt-form__element--big.Vlt-form__element--error input.main,.Vlt-form__element--big.Vlt-form__element--error .Vlt-composite__append button{background:var(--vgip-meta-input-bg-color);border-color:#f25a6b;box-shadow:none}@-moz-document url-prefix(){.Vlt-composite__append.right-actions{right:10px!important}}.Vlt-composite__append.right-actions{position:absolute;top:5px;right:10px;cursor:pointer}@media screen and (-webkit-min-device-pixel-ratio: 0) and (-webkit-min-device-pixel-ratio: 0),screen and (-webkit-min-device-pixel-ratio: 0) and (min-resolution: .001dpcm){.Vlt-composite__append.right-actions{right:53px}}.Vlt-composite__append.right-actions .Vlt-composite__append--icon{width:36px;outline:none;position:initial;display:inline-block}.Vlt-composite__append.right-actions .Vlt-composite__append--icon svg{height:14px;width:14px}.Vlt-composite__append.right-actions .Vlt-composite__append--icon:hover svg,.Vlt-composite__append.right-actions .Vlt-composite__append--icon:focus svg{fill:#2c2d30}:host-context ::ng-deep input::-webkit-calendar-picker-indicator{height:48px;width:51px;margin-top:-15px;margin-right:-15px;padding:0 2px 0 0;cursor:pointer;color:transparent;background-origin:content-box;background-size:initial;background-repeat:no-repeat;background-position:center;opacity:1;visibility:visible;background-image:var(--vgip-meta-date-icon)}:host-context ::ng-deep input::-webkit-calendar-picker-indicator:hover{background-color:var(--vgip-meta-input-action-hover-bg-color)}:host-context ::ng-deep input[type=time]::-webkit-calendar-picker-indicator{background-image:var(--vgip-meta-time-icon)}:host-context ::ng-deep input[readonly]::-webkit-calendar-picker-indicator{visibility:visible}:host-context ::ng-deep input:enabled:read-write:-webkit-any(:focus,:hover)::-webkit-clear-button{opacity:0;pointer-events:none}:host-context ::ng-deep input:enabled:read-write:-webkit-any(:focus,:hover)::-webkit-inner-spin-button{opacity:0;pointer-events:none}\n"] }]
|
|
365
|
+
}] });
|
|
366
|
+
|
|
367
|
+
export { FieldDatetime };
|
|
368
|
+
//# sourceMappingURL=vgip-meta-ui-index-0068fb77.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vgip-meta-ui-index-0068fb77.mjs","sources":["../../../projects/meta-ui/src/lib/fieldDatetime/index.ts","../../../projects/meta-ui/src/lib/fieldDatetime/view.html"],"sourcesContent":["/*\n* @Author: Alexander.Vangelov@vonage.com\n* @Date: 2020-04-18 18:05:46\n * @Last Modified by: Alexander.Vangelov@vonage.com\n * @Last Modified time: 2020-04-18 21:09:16\n*/\n\nimport { Component, OnInit, ViewChild, ElementRef } from '@angular/core';\nimport { ControlContainer, NgForm } from '@angular/forms';\n\nimport { FieldAbstract } from '../fieldAbstract';\nimport { relativeTimeBuilder } from '../common/utils/relativeTimeBuilder';\n\n@Component({\n templateUrl: './view.html',\n styleUrls: ['./style.scss'],\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class FieldDatetime extends FieldAbstract implements OnInit {\n input: any;\n dropdown: any;\n activeSuggestionIndex: number;\n value: any;\n type: string;\n placeholder = 'dd/mm/yyyy';\n\n get suggestions() {\n return this.meta.suggestions || [];\n }\n\n ngOnInit() {\n this.validationAttributes = ['required', 'min', 'max', 'step'];\n this.type = this.meta.type;\n if (this.meta.type === 'datetime') {\n this.type = 'datetime-local';\n this.placeholder += ' --:-- --';\n } else if (this.meta.type === 'time') {\n this.placeholder = '--:-- --';\n }\n const origValue = this.parent[this.meta.name];\n Object.defineProperty(this.parent, this.meta.name, {\n set: (value) => {\n if (value) {\n if (['datetime', 'date', 'datetime-local'].indexOf(this.meta.type || this.meta.subtype) !== -1 && value) {\n try {\n let date: Date;\n if ((typeof (value) === 'number')) {\n date = new Date(parseInt(value as any, 10));\n if ('date' === (this.meta.type || this.meta.subtype)) {\n date = new Date(date.getTime() + (date.getTimezoneOffset() * 60000));\n }\n } else {\n if ('date' === (this.meta.type || this.meta.subtype)) {\n date = new Date(Date.parse(value));\n } else {\n date = new Date(Date.parse(`${value}Z`) + (new Date().getTimezoneOffset() * 60000));\n }\n }\n if (typeof (value) === 'number') {\n switch (this.meta.type || this.meta.subtype) {\n case 'datetime-local':\n case 'datetime': {\n this.model = `${date.getFullYear()}-${('00' + (date.getMonth() + 1)).slice(-2)}-${('00' + date.getDate()).slice(-2)}`;\n this.model += `T${('00' + date.getHours()).slice(-2)}:${('00' + date.getMinutes()).slice(-2)}`;\n break;\n }\n case 'date': {\n this.model = date.toISOString().split('T')[0];\n break;\n }\n }\n }\n if (this.meta.valueType === 'isostring') {\n this.value = date.toISOString();\n } else if (this.meta.valueType === 'string') {\n if ((this.meta.type || this.meta.subtype) === 'date') {\n this.value = date.toISOString().split('T')[0];\n } else {\n this.value = date.toISOString();\n }\n } else {\n if ((this.meta.type || this.meta.subtype) === 'date') {\n date.setFullYear(date.getUTCFullYear());\n date.setMonth(date.getUTCMonth());\n date.setDate(date.getUTCDate());\n date.setMinutes(0);\n date.setHours(0);\n date.setSeconds(0);\n date.setMilliseconds(0);\n this.value = new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).getTime();\n } else {\n this.value = date.getTime();\n }\n }\n } catch (e) {\n console.error('Date parse error', e.message, `\"${value}\"`, `(${typeof (value)})`);\n }\n } else if ('time' === (this.meta.type || this.meta.subtype)) {\n try {\n let date: Date;\n if (typeof (value) === 'number') {\n date = new Date(parseInt(value as any, 10));\n if (value < 86400000) {\n date = new Date(date.getTime() + (date.getTimezoneOffset() * 60000));\n }\n } else {\n date = new Date(\n Date.parse(new Date().toISOString().replace(/T.*Z/, `T${value}Z`)) + (new Date().getTimezoneOffset() * 60000)\n );\n }\n this.model = date.toTimeString().split(' ')[0];\n if (this.meta.valueType === 'isostring') {\n this.value = date.toISOString();\n } else {\n date.setFullYear(1970);\n date.setMonth(0);\n date.setDate(1);\n date.setMilliseconds(0);\n if (this.meta.valueType === 'string') {\n this.value = new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).toISOString().split('T')[1].substring(0,8);\n } else {\n this.value = new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).getTime();\n }\n }\n } catch (e) {\n console.error('Date parse error', e.message, `\"${value}\"`, `(${typeof (value)})`);\n }\n }\n } else {\n delete this.model;\n delete this.value;\n }\n this.meta.$optional = this.isOptional;\n },\n get: () => this.value,\n enumerable: this.sendToServer,\n configurable: true\n });\n if (typeof(origValue) !== 'undefined') {\n this.parent[this.meta.name] = origValue;\n }\n const d = this.meta.default || this.meta.defaultValue;\n if (d && typeof(this.model) === 'undefined') {\n const defaultValue = (typeof (d) === 'string') ? d : (d.id || d.value);\n if (defaultValue || defaultValue === 0) {\n if (/^(date|time)/.test(this.meta.type || this.meta.subtype) && typeof(defaultValue) === 'string') {\n this.parent[this.meta.name] = relativeTimeBuilder(this.meta.type || this.meta.subtype, defaultValue, this.validations.step);\n } else {\n this.parent[this.meta.name] = defaultValue;\n }\n }\n }\n if (typeof(this.meta.auto) === 'object') {\n Object.keys(this.meta.auto || {}).filter(n => ['gt', 'lt'].indexOf(n) !== -1).map(v => this.setupLogicalValidation(v));\n }\n }\n\n onActivated(ev) {\n this.input = ev.srcElement;\n if (!this.dropdown) {\n this.dropdown = ev.srcElement.parentNode.parentNode;\n }\n this.showDropdown();\n }\n\n clear(ev?) {\n delete this.model;\n this.onModelChange(this.model);\n if (ev) {\n ev.preventDefault();\n ev.stopPropagation();\n return false;\n }\n }\n\n onBlur(ev) {\n let internalControl = false;\n if (ev.relatedTarget) {\n if (!this.elementRef.nativeElement.contains(ev.relatedTarget)) {\n this.dismissDropdown();\n } else {\n internalControl = true;\n }\n }\n if (this.keyListenerActive && !internalControl) {\n this.input.removeEventListener('keydown', this.keydown);\n setTimeout(() => {\n if (!this.keyListenerActive) {\n document.removeEventListener('click', this.clickout);\n }\n }, 400);\n delete this.keyListenerActive;\n }\n }\n\n onSuggestionSelect(ev, suggestion) {\n if (!suggestion) {\n return;\n }\n ev.preventDefault();\n ev.stopPropagation();\n this.focus();\n this.dismissDropdown();\n this.model = suggestion;\n this.onModelChange(suggestion);\n }\n\n dismissDropdown(event?) {\n if (event) {\n this.focus();\n }\n if (this.dropdown) {\n this.dropdown.classList.remove('Vlt-dropdown--expanded');\n }\n }\n\n private ensureDropdownIsVisible() {\n setTimeout(() => {\n const holder = this.dropdown.closest('.Vlt-card__content');\n const el = this.elementRef.nativeElement.querySelector('.Vlt-dropdown__panel');\n const elRect = el.getBoundingClientRect();\n const holderRect = holder.getBoundingClientRect();\n if (holderRect.top + holderRect.height < elRect.top + elRect.height) {\n el.scrollIntoView({ block: 'end' });\n }\n }, 400);\n }\n\n private showDropdown() {\n if (this.meta.suggestions && this.meta.suggestions.length) {\n this.dropdown.classList.add('Vlt-dropdown--expanded');\n this.ensureDropdownIsVisible();\n }\n if (!this.keyListenerActive) {\n this.input.addEventListener('keydown', this.keydown);\n setTimeout(() => {\n document.addEventListener('click', this.clickout);\n }, 200);\n this.keyListenerActive = true;\n if (this.parent[this.meta.name]) {\n for (let suggestionIndex = 0; suggestionIndex < (this.meta.suggestions || []).length; suggestionIndex++) {\n if (this.meta.suggestions[suggestionIndex] === this.parent[this.meta.name]) {\n this.activeSuggestionIndex = suggestionIndex;\n }\n }\n }\n }\n }\n\n private clickout = (event) => {\n if (event.target.className === 'Vlt-dropdown__link' && this.elementRef.nativeElement.contains(event.target)) {\n this.focus();\n // this.dismissDropdown();\n // this.parent[this.meta.name] = event.target.textContent;\n\n } else if (event.target !== this.input && event.target.className !== 'Vlt-dropdown__title') {\n this.dismissDropdown();\n } else {\n this.focus();\n }\n };\n\n private keydown = (event) => {\n switch (event.key) {\n case 'ArrowDown': {\n if (['datetime', 'time', 'date', 'datetime-local'].indexOf(this.meta.type || this.meta.subtype) !== -1) {\n break;\n }\n this.showDropdown();\n event.preventDefault();\n if (typeof (this.activeSuggestionIndex) === 'undefined') {\n this.activeSuggestionIndex = 0;\n } else {\n this.activeSuggestionIndex++;\n if (this.activeSuggestionIndex >= this.suggestions.length) {\n this.activeSuggestionIndex = 0;\n }\n }\n break;\n }\n case 'ArrowUp': {\n if (['datetime', 'time', 'date', 'datetime-local'].indexOf(this.meta.type || this.meta.subtype) !== -1) {\n break;\n }\n this.showDropdown();\n event.preventDefault();\n if (typeof (this.activeSuggestionIndex) === 'undefined') {\n this.activeSuggestionIndex = this.suggestions.length - 1;\n } else {\n this.activeSuggestionIndex--;\n if (this.activeSuggestionIndex < 0) {\n this.activeSuggestionIndex = this.suggestions.length - 1;\n }\n }\n break;\n }\n case 'Space':\n case 'Enter': {\n if (typeof (this.activeSuggestionIndex) !== 'undefined') {\n event.preventDefault();\n event.stopPropagation();\n this.onSuggestionSelect(event, this.suggestions[this.activeSuggestionIndex]);\n delete this.activeSuggestionIndex;\n }\n break;\n }\n case 'Escape': {\n event.preventDefault();\n event.stopPropagation();\n this.dismissDropdown();\n break;\n }\n }\n };\n\n\n private autoSetValue(againstTimestamp, v, cfg) {\n const compareValue = relativeTimeBuilder(this.meta.type, cfg.offset, this.validations.step, againstTimestamp);\n if (this.model) {\n const currentValue = new Date(this.model).getTime();\n let isInvalid: boolean;\n if (v === 'gt') {\n isInvalid = compareValue > currentValue;\n } else if (v === 'lt') {\n isInvalid = currentValue > compareValue;\n }\n if (isInvalid) {\n this.parent[this.meta.name] = compareValue;\n }\n } else {\n this.parent[this.meta.name] = compareValue;\n }\n }\n\n private setupLogicalValidation(v: string) {\n const cfg = this.meta.auto[v];\n if (typeof(cfg.against) === 'string') {\n let againstValue = this.parent[cfg.against];\n try {\n let againstTimestamp = Date.parse(`${againstValue}Z`) + (new Date().getTimezoneOffset() * 60000);\n if (againstValue) {\n this.autoSetValue(againstTimestamp, v, cfg);\n }\n this.parentChangeSubject.subscribe((value) => {\n if (value && value.hasOwnProperty(cfg.against)) {\n againstValue = value[cfg.against];\n if (againstValue) {\n againstTimestamp = Date.parse(`${againstValue}Z`) + (new Date().getTimezoneOffset() * 60000);\n this.autoSetValue(againstTimestamp, v, cfg);\n }\n }\n });\n } catch (e) {}\n }\n }\n}\n","<div class='vgip-meta-field-preview' *ngIf='preview && model'>\n <div class='vgip-meta-field-label'>{{meta.label || meta.name}}</div>\n <div class='vgip-meta-field-value __gu'>{{model}}</div>\n</div>\n<div *ngIf='!preview' class=\"Vlt-form__element Vlt-form__element--big\" [ngClass]=\"{'Vlt-form__element--error': f.invalid && ((f | metaModel)._parent.submitted || (f | metaModel ).touched), 'has-value': f.value, active: keyListenerActive }\">\n <div class=\"Vlt-input\">\n <label class='wrapper'>\n <input class='main model' [pattern]=\"validations.pattern ? validations.pattern.value || validations.pattern : null\" [required]='validations.required' [minlength]='validations.minlength' [maxlength]='validations.maxlength' [min]='validations.min' [max]='validations.max' [step]='validations.step' [disabled]='disabled' [readonly]='readonly' [(ngModel)]='model' (ngModelChange)=\"onModelChange($event)\" #f='ngModel' [name]='name' [type]=\"type\" [placeholder]=\"placeholder\" (click)='onActivated($event)' (focus)='onActivated($event)' (blur)='onBlur($event)'/>\n <label class='Vlt-truncate'>{{meta.label || meta.name}}<span *ngIf='validations.required' class='Vlt-red'>*</span></label>\n </label>\n <div class='Vlt-composite__append right-actions'>\n <div *ngIf='model' class=\"Vlt-composite__append--icon\" (click)='clear()'>\n <div class=\"Vlt-composite__icon\">\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-cross\"/></svg>\n </div>\n </div>\n </div>\n </div>\n <small *ngIf='f.invalid && ((f | metaModel)._parent.submitted || ((f | metaModel ).touched && keyListenerActive))' class=\"Vlt-form__element__error\">\n <span *ngIf=\"f.errors.required\">Required. </span>\n <span *ngIf=\"f.errors.min\">Must be later than {{validations.min}}. </span>\n <span *ngIf=\"f.errors.max\">Must be no later than {{validations}}. </span>\n <span *ngIf=\"f.errors.custom\">{{f.errors.custom}} </span>\n </small>\n <small *ngIf='meta.hint' class=\"Vlt-form__element__hint\">{{meta.hint}}</small>\n</div>"],"names":["i3.MetaModelPipe"],"mappings":"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"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { Injectable } from '@angular/core';
|
|
3
|
+
|
|
4
|
+
const templateBuilder = (metaContext, pattern) => {
|
|
5
|
+
const context = (metaContext || {}).context;
|
|
6
|
+
if (!context) {
|
|
7
|
+
if (!pattern || typeof (pattern) !== 'string') {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
else {
|
|
11
|
+
return (pattern || '').replace(/\${\s*([\w\.]+)\s*}/g, 'N/A');
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
const padTime = (t) => t < 10 ? '0' + t : t;
|
|
15
|
+
const patternBuilder = (pattern || '').replace(/\${\s*([\w\.]+)\s*}/g, (match, value) => {
|
|
16
|
+
switch (value) {
|
|
17
|
+
case 'direction': {
|
|
18
|
+
return (context[value] || '').toUpperCase() === 'INBOUND' ? 'Inbound' : 'Outbound';
|
|
19
|
+
}
|
|
20
|
+
case 'name': {
|
|
21
|
+
return context.contact ? context.contact.name : (context.callerId || 'Unknown');
|
|
22
|
+
}
|
|
23
|
+
case 'contact': { // (FE-BE contract violation)
|
|
24
|
+
return context.contact ? context.contact.name : (context.callerId || 'Unknown');
|
|
25
|
+
}
|
|
26
|
+
case 'type': {
|
|
27
|
+
return context.type ? context.type : '';
|
|
28
|
+
}
|
|
29
|
+
case 'phoneNumber': {
|
|
30
|
+
return context[value];
|
|
31
|
+
}
|
|
32
|
+
case 'directionArrow': {
|
|
33
|
+
return (context.direction || '').toUpperCase() === 'INBOUND' ? '⬇' : '⬆';
|
|
34
|
+
}
|
|
35
|
+
case 'timestamp': {
|
|
36
|
+
try {
|
|
37
|
+
const callTime = new Date(context.answerTime || context.startTime || Date.now());
|
|
38
|
+
const date = callTime.toDateString();
|
|
39
|
+
const time = callTime.toLocaleTimeString();
|
|
40
|
+
return date + ', ' + time;
|
|
41
|
+
}
|
|
42
|
+
catch (e) {
|
|
43
|
+
console.error('context without startTime', e);
|
|
44
|
+
}
|
|
45
|
+
return '';
|
|
46
|
+
}
|
|
47
|
+
case 'duration': {
|
|
48
|
+
try {
|
|
49
|
+
if (typeof (context[value]) === 'number' && context.endTime) {
|
|
50
|
+
return '(' + (context[value]).toFixed() + 'ms)';
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch (e) {
|
|
54
|
+
console.error('context without duration', e);
|
|
55
|
+
}
|
|
56
|
+
return '(0ms)';
|
|
57
|
+
}
|
|
58
|
+
case 'durationSec': {
|
|
59
|
+
try {
|
|
60
|
+
if (typeof (context.duration) === 'number' && context.endTime) {
|
|
61
|
+
return '(' + (context.duration / 1000).toFixed() + 's)';
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch (e) {
|
|
65
|
+
console.error('call without duration', e);
|
|
66
|
+
}
|
|
67
|
+
return '(0s)';
|
|
68
|
+
}
|
|
69
|
+
case 'durationTime': {
|
|
70
|
+
try {
|
|
71
|
+
if (typeof (context.duration) === 'number' && context.endTime) {
|
|
72
|
+
const duration = context.duration / 1000; // convert it to seconds
|
|
73
|
+
if (duration < 0) {
|
|
74
|
+
return '00:00';
|
|
75
|
+
}
|
|
76
|
+
const hours = Math.floor(duration / 3600);
|
|
77
|
+
const minutes = Math.floor((duration % 3600) / 60);
|
|
78
|
+
const seconds = Math.floor(duration % 60);
|
|
79
|
+
const checkHours = hours ? padTime(hours) + ':' : '';
|
|
80
|
+
return checkHours + padTime(minutes) + ':' + padTime(seconds);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch (e) {
|
|
84
|
+
console.error('context without duration', e);
|
|
85
|
+
}
|
|
86
|
+
return '00:00';
|
|
87
|
+
}
|
|
88
|
+
default: {
|
|
89
|
+
return context[value];
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
return patternBuilder;
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
/*
|
|
97
|
+
* @Author: Alexander.Vangelov@vonage.com
|
|
98
|
+
* @Date: 2019-09-19 17:35:19
|
|
99
|
+
* @Last Modified by: Alexander.Vangelov@vonage.com
|
|
100
|
+
* @Last Modified time: 2020-03-06 10:10:09
|
|
101
|
+
*/
|
|
102
|
+
class MetaContextService {
|
|
103
|
+
constructor() {
|
|
104
|
+
this.defaultContactables = {};
|
|
105
|
+
this.workers = {};
|
|
106
|
+
this.contactables = {};
|
|
107
|
+
this.profiles = {};
|
|
108
|
+
}
|
|
109
|
+
set(context) {
|
|
110
|
+
if (context) {
|
|
111
|
+
if (context.phoneNumber) {
|
|
112
|
+
this.phoneNumber = context.phoneNumber;
|
|
113
|
+
}
|
|
114
|
+
if (context.displayName) {
|
|
115
|
+
this.displayName = context.displayName;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
MetaContextService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: MetaContextService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
121
|
+
MetaContextService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: MetaContextService, providedIn: 'root' });
|
|
122
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: MetaContextService, decorators: [{
|
|
123
|
+
type: Injectable,
|
|
124
|
+
args: [{
|
|
125
|
+
providedIn: 'root'
|
|
126
|
+
}]
|
|
127
|
+
}], ctorParameters: function () { return []; } });
|
|
128
|
+
|
|
129
|
+
export { MetaContextService as M, templateBuilder as t };
|
|
130
|
+
//# sourceMappingURL=vgip-meta-ui-index-3488da98.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vgip-meta-ui-index-3488da98.mjs","sources":["../../../projects/meta-ui/src/lib/common/utils/templateBuilder.ts","../../../projects/meta-ui/src/lib/services/metaContext/index.ts"],"sourcesContent":["export const templateBuilder = (metaContext, pattern) => {\n const context = (metaContext || {}).context;\n if (!context) {\n if (!pattern || typeof(pattern) !== 'string') {\n return;\n } else {\n return (pattern || '').replace(/\\${\\s*([\\w\\.]+)\\s*}/g, 'N/A');\n }\n }\n\n const padTime = (t) => t < 10 ? '0' + t : t;\n\n const patternBuilder = (pattern || '').replace(/\\${\\s*([\\w\\.]+)\\s*}/g, (match, value) => {\n switch (value) {\n case 'direction': {\n return (context[value] || '').toUpperCase() === 'INBOUND' ? 'Inbound' : 'Outbound';\n }\n case 'name': {\n return context.contact ? context.contact.name : (context.callerId || 'Unknown');\n }\n case 'contact': { // (FE-BE contract violation)\n return context.contact ? context.contact.name : (context.callerId || 'Unknown');\n }\n case 'type': {\n return context.type ? context.type : '';\n }\n case 'phoneNumber': {\n return context[value];\n }\n case 'directionArrow': {\n return (context.direction || '').toUpperCase() === 'INBOUND' ? '⬇' : '⬆';\n }\n case 'timestamp': {\n try {\n const callTime = new Date(context.answerTime || context.startTime || Date.now());\n const date = callTime.toDateString();\n const time = callTime.toLocaleTimeString();\n return date + ', ' + time;\n } catch (e) {\n console.error('context without startTime', e);\n }\n return '';\n }\n case 'duration': {\n try {\n if (typeof (context[value]) === 'number' && context.endTime) {\n return '(' + (context[value]).toFixed() + 'ms)';\n }\n } catch (e) {\n console.error('context without duration', e);\n }\n return '(0ms)';\n }\n case 'durationSec': {\n try {\n if (typeof (context.duration) === 'number' && context.endTime) {\n return '(' + (context.duration / 1000).toFixed() + 's)';\n }\n } catch (e) {\n console.error('call without duration', e);\n }\n return '(0s)';\n }\n case 'durationTime': {\n try {\n if (typeof (context.duration) === 'number' && context.endTime) {\n const duration = context.duration / 1000; // convert it to seconds\n if (duration < 0) {\n return '00:00';\n }\n\n const hours = Math.floor(duration / 3600);\n const minutes = Math.floor((duration % 3600) / 60);\n const seconds = Math.floor(duration % 60);\n\n const checkHours = hours ? padTime(hours) + ':' : '';\n return checkHours + padTime(minutes) + ':' + padTime(seconds);\n }\n } catch (e) {\n console.error('context without duration', e);\n }\n return '00:00';\n }\n default: {\n return context[value];\n }\n }\n });\n return patternBuilder;\n};\n","/*\n * @Author: Alexander.Vangelov@vonage.com\n * @Date: 2019-09-19 17:35:19\n * @Last Modified by: Alexander.Vangelov@vonage.com\n * @Last Modified time: 2020-03-06 10:10:09\n */\n\nimport { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class MetaContextService {\n phoneNumber: string;\n displayName: string;\n defaultContactables: {[integrationCode: string]: any} = {};\n workers: {[integrationCode: string]: any} = {};\n contactables: {[integrationCode: string]: any} = {};\n profiles: {[integrationCode: string]: any} = {};\n vgipEventId: string;\n vgipUserId: string;\n context: any;\n uid: string;\n subject: string;\n\n constructor() {\n\n }\n\n set(context?) {\n if (context) {\n if (context.phoneNumber) {\n this.phoneNumber = context.phoneNumber;\n }\n if (context.displayName) {\n this.displayName = context.displayName;\n }\n }\n }\n}\n"],"names":[],"mappings":"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"}
|