@qikdev/vue-ui 0.1.1 → 0.1.7

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 (92) hide show
  1. package/README.md +4 -89
  2. package/dist/favicon.ico +0 -0
  3. package/dist/index.css +1 -0
  4. package/dist/lib.es.js +17798 -0
  5. package/dist/lib.es.js.map +1 -0
  6. package/dist/lib.umd.js +9 -0
  7. package/dist/lib.umd.js.map +1 -0
  8. package/package.json +31 -24
  9. package/.gitlab-ci.yml +0 -13
  10. package/jsdoc.conf +0 -10
  11. package/src/components.js +0 -255
  12. package/src/content/browser.vue +0 -842
  13. package/src/content/item.vue +0 -48
  14. package/src/content/render/field.vue +0 -431
  15. package/src/content/render/group.vue +0 -65
  16. package/src/content/render/render-mixin.js +0 -101
  17. package/src/content/render/render.vue +0 -86
  18. package/src/filter/FilterBuilder.vue +0 -145
  19. package/src/filter/FilterCondition.vue +0 -373
  20. package/src/filter/FilterRule.vue +0 -259
  21. package/src/form/expressions/index.js +0 -83
  22. package/src/form/field.vue +0 -640
  23. package/src/form/form.vue +0 -280
  24. package/src/form/getDefaultValue.js +0 -226
  25. package/src/form/inputs/button-select.vue +0 -208
  26. package/src/form/inputs/checkbox.vue +0 -91
  27. package/src/form/inputs/content-select.vue +0 -187
  28. package/src/form/inputs/currency.vue +0 -205
  29. package/src/form/inputs/datefield.vue +0 -132
  30. package/src/form/inputs/group.vue +0 -155
  31. package/src/form/inputs/html.vue +0 -39
  32. package/src/form/inputs/input-mixin.js +0 -440
  33. package/src/form/inputs/native-select-old.vue +0 -43
  34. package/src/form/inputs/object-field.vue +0 -50
  35. package/src/form/inputs/option.vue +0 -19
  36. package/src/form/inputs/options-manager.vue +0 -244
  37. package/src/form/inputs/phone-number-input.vue +0 -235
  38. package/src/form/inputs/search.vue +0 -117
  39. package/src/form/inputs/select.vue +0 -229
  40. package/src/form/inputs/switch.vue +0 -87
  41. package/src/form/inputs/textarea.vue +0 -80
  42. package/src/form/inputs/textfield.vue +0 -185
  43. package/src/form/inputs/timezone.vue +0 -642
  44. package/src/form/inputs/type-select.vue +0 -247
  45. package/src/form/inputs/upload/filedrop.vue +0 -72
  46. package/src/form/inputs/upload/upload.vue +0 -323
  47. package/src/form/parseBoolean.js +0 -24
  48. package/src/layout/flex-body.vue +0 -23
  49. package/src/layout/flex-cell.vue +0 -45
  50. package/src/layout/flex-column.vue +0 -31
  51. package/src/layout/flex-footer.vue +0 -14
  52. package/src/layout/flex-header.vue +0 -14
  53. package/src/layout/flex-row.vue +0 -39
  54. package/src/layout/flex-spacer.vue +0 -18
  55. package/src/layout/panel-body.vue +0 -13
  56. package/src/layout/panel-footer.vue +0 -20
  57. package/src/layout/panel-header.vue +0 -20
  58. package/src/layout/panel.vue +0 -23
  59. package/src/layout/tab.vue +0 -34
  60. package/src/layout/tabset.vue +0 -72
  61. package/src/mixins/RememberScroll.js +0 -19
  62. package/src/modal/ConfirmModal.vue +0 -50
  63. package/src/modal/ContentModal.vue +0 -107
  64. package/src/modal/Modal.vue +0 -86
  65. package/src/modal/ModalMixin.js +0 -21
  66. package/src/modal/OptionsModal.vue +0 -31
  67. package/src/modal/PromptModal.vue +0 -31
  68. package/src/services/device.js +0 -211
  69. package/src/services/selection.js +0 -165
  70. package/src/table/Table.vue +0 -336
  71. package/src/table/TableCell.vue +0 -113
  72. package/src/table/TableRow.vue +0 -82
  73. package/src/table/cells/Button.vue +0 -56
  74. package/src/table/cells/TableCellMixin.js +0 -15
  75. package/src/table/cells/Thumbnail.vue +0 -39
  76. package/src/table/cells/Value.vue +0 -46
  77. package/src/ui/button.vue +0 -255
  78. package/src/ui/checkbox.vue +0 -79
  79. package/src/ui/icon.vue +0 -57
  80. package/src/ui/image.vue +0 -158
  81. package/src/ui/link.vue +0 -62
  82. package/src/ui/list-item.vue +0 -22
  83. package/src/ui/list.vue +0 -26
  84. package/src/ui/menu.vue +0 -147
  85. package/src/ui/pager.vue +0 -156
  86. package/src/ui/progressbar.vue +0 -77
  87. package/src/ui/spinner.vue +0 -26
  88. package/src/ui/switch.vue +0 -89
  89. package/src/version.js +0 -1
  90. package/test/index.spec.js +0 -42
  91. package/test/mocha.opts +0 -0
  92. package/yarn-error.log +0 -2923
@@ -1,247 +0,0 @@
1
- <template>
2
- <div class="native-select" :class="classes">
3
- <label class="ux-field-title" v-if="showLabel">{{label}} <span class="ux-required-marker" v-if="required">*</span></label>
4
- <div class="ux-field-description" v-if="showDescription">{{description}}</div>
5
- <div class="ui-select-button" v-if="singleValue">
6
- <slot>
7
- <ux-button tag="div">
8
- {{summary}}
9
- </ux-button>
10
- </slot>
11
- </div>
12
- <select @focus="touch" :multiple="multiValue" v-model="model">
13
- <option value="" v-if="singleValue && !minimum">None</option>
14
- <option :value="option.value" v-for="option in selectableOptions">{{option.title}}</option>
15
- </select>
16
- </div>
17
- </template>
18
- <script>
19
- import InputMixin from './input-mixin';
20
-
21
-
22
-
23
- function isUndefined(entry) {
24
- return entry === undefined || typeof entry === 'undefined' || entry === null || String(entry) === 'null' || String(entry) === 'undefined';
25
- }
26
-
27
- //////////////////////////
28
-
29
- export default {
30
- props: {
31
- title: {
32
- type: String,
33
- },
34
- modelValue: {
35
- // type: [Object, Array],
36
- },
37
- },
38
- mixins: [InputMixin],
39
- async created() {
40
- this.model = this.model;
41
-
42
- var glossary = await this.$qik.content.glossary();
43
-
44
-
45
- var typeList = glossary;
46
-
47
- if (this.field.basicTypes === false) {
48
- typeList = typeList.filter(function(definition) {
49
- return !!definition.definesType
50
- })
51
- }
52
-
53
- if (this.field.definedTypes === false) {
54
- typeList = typeList.filter(function(definition) {
55
- return !definition.definesType
56
- })
57
- }
58
-
59
- ////////////////////////////
60
-
61
- typeList = typeList.map(function(definition) {
62
- return {
63
- title: definition.title,
64
- value: definition.key,
65
- }
66
- })
67
- .sort((a, b) => a.title > b.title ? 1 : -1);
68
-
69
- ////////////////////////////
70
-
71
- this.types = typeList;
72
- },
73
- data() {
74
- return {
75
- types: [],
76
- }
77
- },
78
- methods: {
79
- cleanOutput(val) {
80
- var self = this;
81
-
82
- if (isUndefined(val)) {
83
- if (self.multiValue) {
84
- val = [];
85
- } else {
86
- val = undefined;
87
- }
88
- } else {
89
- if (self.multiValue) {
90
- val = (val || []).filter(Boolean).map(function(i) {
91
- return self.getValue(i);
92
- })
93
- } else {
94
- val = self.getValue(val);
95
- }
96
- }
97
-
98
- return val;
99
- },
100
- cleanInput(val) {
101
-
102
- var self = this;
103
-
104
- if (self.multiValue) {
105
- if (!val) {
106
- val = [];
107
- }
108
-
109
- if (!Array.isArray(val)) {
110
- val = [val];
111
- }
112
-
113
- /////////////////////////////////
114
-
115
- if (self.maximum) {
116
- if (val.length > self.maximum) {
117
- val.length = self.maximum;
118
- }
119
- }
120
-
121
-
122
- val = val.filter(Boolean).map(function(v) {
123
- var valueKey = self.getValue(v);
124
- return self.returnObject ? self.optionLookup[valueKey] : valueKey;
125
- })
126
-
127
- } else {
128
- var valueKey = self.getValue(val);
129
- val = self.returnObject ? self.optionLookup[valueKey] : valueKey;
130
- }
131
-
132
- return val;
133
- },
134
- },
135
- computed: {
136
- returnObject() {
137
- return false;
138
- },
139
- classes() {
140
- var array = []
141
-
142
- if (this.multiValue) {
143
- array.push('multiple');
144
- } else {
145
- array.push('single');
146
- }
147
-
148
- return array;
149
- },
150
- // model: {
151
- // get() {
152
- // let val = this.cleanOutput(this.value);
153
- // return val;
154
- // },
155
- // set(val) {
156
- // val = this.cleanInput(val);
157
- // // // var val = this.cleanOutput(newValue);
158
- // // // var existing = this.cleanOutput(this.value);
159
-
160
- // // if (newValue != existing) {
161
- // // newValue = this.cleanInput(val);
162
- // // this.value = newValue;
163
- // // this.dispatch();
164
- // // }
165
-
166
- // this.value = val;
167
- // this.dispatch();
168
-
169
- // }
170
- // },
171
- optionLookup() {
172
- var self = this;
173
- return self.types.reduce(function(set, option) {
174
- const key = self.getValue(option);
175
- set[key] = option;
176
- return set;
177
- }, {})
178
- },
179
- summary() {
180
- return this.model ? this.getLabel(this.optionLookup[this.model]) : this.title || 'Click to select';
181
- },
182
-
183
- selectableOptions() {
184
-
185
- return this.types;
186
- // return this.options
187
- // .sort(function(option) {
188
- // return option.title;
189
- // });
190
- // if(this.type == 'reference') {
191
-
192
- // } else {
193
-
194
- // }
195
-
196
- },
197
- }
198
- }
199
- </script>
200
- <style lang="scss" scoped>
201
- .native-select {
202
-
203
- cursor: pointer;
204
-
205
- &.multiple {
206
- select {
207
- width: 100%;
208
- font-size: 1em;
209
- border: 1px solid rgba(#000, 0.1);
210
- appearance: none;
211
-
212
- &:focus {
213
- border: 1px solid $primary;
214
- }
215
- }
216
- }
217
-
218
- &.single {
219
- position: relative;
220
-
221
- .ui-select-button {
222
- position: relative;
223
- width: 100%;
224
-
225
- &>.ux-btn {
226
- display: block;
227
- text-align: left;
228
- }
229
- }
230
-
231
- select {
232
- cursor: pointer;
233
- opacity: 0;
234
- appearance: none;
235
- width: 100%;
236
- height: 100%;
237
- position: absolute;
238
- top: 0;
239
- left: 0;
240
- bottom: 0;
241
- right: 0;
242
- }
243
- }
244
-
245
-
246
- }
247
- </style>
@@ -1,72 +0,0 @@
1
- <template>
2
- <label class="file-drop" @dragover.prevent.stop="fileover" @drop.prevent.stop="filedrop">
3
- <input ref="file" type="file" :multiple="multiple" @change="filesSelected($event.target.files)">
4
- <div class="file-drop-ux" @click="clicked">
5
- <slot>
6
- <ux-button>Select Files</ux-button>
7
- </slot>
8
- </div>
9
- </label>
10
-
11
- </template>
12
- <script>
13
-
14
- ////////////////////////////////////
15
-
16
- export default {
17
- props:{
18
- multiple:{
19
- type:Boolean,
20
- }
21
- },
22
- methods: {
23
- clicked() {
24
- if(!this.multiple) {
25
- this.$refs.file.value = null;
26
- }
27
- this.$refs.file.click();
28
- },
29
- fileover(event) {
30
-
31
- },
32
- filedrop(event) {
33
-
34
- },
35
- filesSelected(files) {
36
- console.log('FILES SELECTED', files);
37
- var mapped = [];
38
-
39
- for (var f in [...files]) {
40
- var file = files[f];
41
- mapped.push({
42
- file,
43
- data: {},
44
- name: file.name,
45
- size: file.size,
46
- state: '',
47
- })
48
- }
49
-
50
- this.$emit('files', mapped);
51
- }
52
- }
53
- }
54
- </script>
55
- <style lang="scss" scoped>
56
- .file-drop {
57
- // display: block;
58
- // border: 2px solid green;
59
- // position:relative;
60
-
61
- input {
62
- // position:absolute;
63
- // left:0;
64
- // top:0;
65
- // right:0;
66
- // bottom:0;
67
- // width:100%;
68
- // height:100%;
69
- display: none;
70
- }
71
- }
72
- </style>
@@ -1,323 +0,0 @@
1
- <template>
2
- <label class="ux-field-title" v-if="showLabel">{{label}} <span class="ux-required-marker" v-if="required">*</span></label>
3
- <div class="ux-field-description" v-if="showDescription">{{description}}</div>
4
- <!-- <template v-if="multiValue">
5
- <div class="items" v-if="model && model.length">
6
- <div v-for="(item, index) in model">
7
- {{item.title}}
8
- <ux-button icon @click="remove(item)">
9
- <ux-icon icon="fa-times" />
10
- </ux-button>
11
-
12
- </div>
13
- </div>
14
- </template> -->
15
- <!-- <template v-else-if="model">
16
- <div class="items">
17
- <item :item="model">
18
- <template #actions>
19
- <ux-button icon @click="clear">
20
- <ux-icon icon="fa-times" />
21
- </ux-button>
22
- </template>
23
- </item>
24
- </div>
25
- </template> -->
26
- <div class="files" v-if="files && files.length">
27
- <div class="file-item" :key="index" v-for="(file, index) in files">
28
- <flex-row>
29
- <flex-cell>
30
- <strong>{{file.name}}</strong>
31
- <div class="size">{{filesize(file.size)}}</div>
32
- <progress-bar :value="file.progress" />
33
- </flex-cell>
34
- <flex-cell shrink>
35
- <ux-button icon @click="remove(index)">
36
- <ux-icon icon="fa-times" />
37
- </ux-button>
38
- </flex-cell>
39
- </flex-row>
40
- </div>
41
- </div>
42
- <template v-if="multiValue">
43
- <template v-if="canAddValue">
44
- <file-drop :multiple="multiValue" @files="filesSelected">
45
- <ux-button>Select Files</ux-button>
46
- </file-drop>
47
- </template>
48
- </template>
49
- <template v-else>
50
- <file-drop @files="filesSelected">
51
- <ux-button>Select File</ux-button>
52
- </file-drop>
53
- </template>
54
- <!-- <label class="file-drop" v-if="canAddValue" @dragover.prevent.stop="fileover" @drop.prevent.stop="filedrop">
55
- <input ref="file" type="file" :multiple="multiValue" @change="filesSelected($event.target.files)">
56
- </label>
57
- <ux-button @click="selectFiles">Select Files</ux-button> -->
58
- </template>
59
- <script>
60
- import InputMixin from '../input-mixin';
61
- import FileDrop from './filedrop.vue';
62
- // import _values from 'lodash/values';
63
- // import _get from 'lodash/get';
64
-
65
- ////////////////////////////////////
66
-
67
- // function uniq(array, field) {
68
-
69
- // var set = {};
70
-
71
- // for(var i in array) {
72
- // var item = array[i];
73
- // var pluckedValue = _get(item, field);
74
- // set[pluckedValue] = item;
75
- // }
76
-
77
- // return _values(set)
78
- // }
79
-
80
- ////////////////////////////////////
81
-
82
- export default {
83
- mixins: [InputMixin],
84
- components: {
85
- FileDrop,
86
- },
87
- props: {
88
- // modelValue: {
89
- // type: [Object, Array],
90
- // default () {
91
- // return [];
92
- // },
93
- // },
94
- },
95
- data() {
96
- return {
97
- files: [],
98
- bytesUploaded: 0,
99
- state: 'ready',
100
- }
101
- },
102
- methods: {
103
- filesize(size) {
104
- return this.$qik.files.filesize(size);
105
- },
106
- remove(index) {
107
-
108
- var self = this;
109
- var fileItem = self.files[index];
110
-
111
- //Cancel the upload
112
- // fileItem.cancel();
113
- if (fileItem.cancelToken) {
114
- fileItem.cancelToken.cancel('Operation canceled by the user.');
115
- }
116
-
117
- self.files.splice(index, 1);
118
- console.log('Map to values', self.files)
119
- self.mapFilesToValues();
120
- },
121
- upload(fileItem) {
122
- var self = this;
123
-
124
- switch (fileItem.state) {
125
- case 'complete':
126
- case 'processing':
127
- return;
128
- break;
129
- }
130
-
131
- fileItem.state = 'processing';
132
-
133
- //Create a new form object
134
- var body = new FormData();
135
- var jsonData = {};
136
-
137
- /////////////////////////////////////////////
138
-
139
- //Add the JSON data
140
-
141
-
142
- var allScopeIDs = self.user ? Object.keys(self.user.permissions) : [];
143
-
144
- jsonData.meta = {
145
- scopes: allScopeIDs
146
- }
147
-
148
- body.append('json', JSON.stringify(jsonData));
149
- body.append('file', fileItem.file, fileItem.name)
150
-
151
- var config = {
152
- headers: {
153
- 'Content-Type': 'multipart/form-data'
154
- },
155
- onUploadProgress: progressEvent => {
156
-
157
- let percentCompleted = Math.floor((progressEvent.loaded * 100) / progressEvent.total);
158
- fileItem.progress = percentCompleted;
159
- fileItem.bytesUploaded = progressEvent.loaded;
160
- fileItem.bytesTotal = progressEvent.total;
161
-
162
- ///////////////////////////////////////////////////
163
-
164
- //Update the bytes loaded from all the files in the array
165
- self.bytesUploaded = self.files.reduce(function(set, file) {
166
- if (file.state == 'complete') {
167
- set += file.size || file.bytesTotal || 0;
168
- } else {
169
- set += file.bytesUploaded || 0;
170
- }
171
- return set;
172
- }, 0)
173
- }
174
- }
175
-
176
- ///////////////////////////////////////////////////
177
-
178
- const CancelToken = self.$qik.api.CancelToken;
179
- const source = CancelToken.source();
180
- config.cancelToken = source.token;
181
- fileItem.cancelToken = source;
182
-
183
- //Set headers to undefined content type
184
- config.headers = {
185
- 'Content-Type': undefined
186
- }
187
-
188
- ///////////////////////////////////////////////////
189
-
190
- return self.$qik.api.post(`/file/upload`, body, config)
191
- .then(function(res) {
192
- fileItem.state = 'complete';
193
- fileItem.result = res.data;
194
- // fileItem.attachmentID = res.data._id;
195
- fileItem.cancelToken = null;
196
- self.uploadNextFile();
197
- })
198
- .catch(function(err) {
199
- fileItem.state = 'error';
200
- fileItem.cancelToken = null;
201
- self.uploadNextFile();
202
- });
203
-
204
- },
205
-
206
- uploadNextFile() {
207
- var self = this;
208
- self.state = 'uploading';
209
-
210
- ///////////////////////////////////////////
211
-
212
- var nextFile = self.files.find(function(fileItem) {
213
- switch (fileItem.state) {
214
- case 'complete':
215
- case 'error':
216
- return;
217
- break;
218
- default:
219
- return true;
220
- break;
221
- }
222
- })
223
-
224
- ///////////////////////////////////////////
225
-
226
- if (nextFile) {
227
- self.upload(nextFile);
228
- } else {
229
- self.state = 'ready';
230
- }
231
-
232
- ///////////////////////////////////////////
233
-
234
- self.mapFilesToValues();
235
- },
236
-
237
- mapFilesToValues() {
238
- var self = this;
239
-
240
- if (self.multiValue) {
241
- self.model = self.files.map(function(item) {
242
- return item.result;
243
- });
244
- } else {
245
-
246
- var first = self.files[0];
247
- if (!first) {
248
- return self.model = undefined;
249
- }
250
-
251
- self.model = first.result;
252
- }
253
-
254
- console.log('NEW MODEL', self.model)
255
- },
256
-
257
-
258
- fileover(event) {
259
-
260
- },
261
- filedrop(event) {
262
-
263
- },
264
- filesSelected(files) {
265
- this.touch();
266
-
267
- console.log('FILES SELECTED', files);
268
- if(this.multiValue) {
269
- this.files = [...this.files, ...files];
270
- } else {
271
- this.files = files;
272
- }
273
-
274
-
275
- return this.uploadNextFile();
276
-
277
- // var mapped = [];
278
-
279
- // for (var f in [...files]) {
280
- // var file = files[f];
281
- // mapped.push({
282
- // file,
283
- // data: {},
284
- // name: file.name,
285
- // size: file.size,
286
- // state: '',
287
- // })
288
- // }
289
-
290
- // this.files = mapped; //uniq([...this.files, mapped], 'name');
291
- // // console.log('FILES YO', this.files)
292
-
293
- //
294
- }
295
- },
296
- computed: {
297
-
298
- }
299
- }
300
- </script>
301
- <style lang="scss" scoped>
302
- .files {
303
- border: 1px solid rgba(#000, 0.1);
304
-
305
- .file-item {
306
- padding: 0.5em;
307
- border-bottom: 1px solid rgba(#000, 0.1);
308
-
309
- .size {
310
- font-size: 0.8em;
311
- opacity: 0.5;
312
- }
313
-
314
- .ux-progress {
315
- margin:0 !important;
316
- }
317
-
318
- &:last-child {
319
- border-bottom: none;
320
- }
321
- }
322
- }
323
- </style>
@@ -1,24 +0,0 @@
1
- export default function(value) {
2
- switch (String(value).toLowerCase()) {
3
- case 'true':
4
- case 'y':
5
- case 'yes':
6
- case '1':
7
- case 't':
8
- value = true;
9
- break;
10
- case 'false':
11
- case 'n':
12
- case 'no':
13
- case '0':
14
- case 'f':
15
- case 'undefined':
16
- case 'null':
17
- case '':
18
- case '-1':
19
- value = false;
20
- break;
21
- }
22
-
23
- return !!value;
24
- }
@@ -1,23 +0,0 @@
1
- <template>
2
- <div class="flex-column-body">
3
- <slot></slot>
4
- </div>
5
- </template>
6
- <script>
7
- export default {
8
- }
9
- </script>
10
-
11
-
12
- <style scoped lang="scss">
13
- .flex-column-body {
14
- overflow-y: auto;
15
- overflow-x: hidden;
16
- -webkit-overflow-scrolling: touch;
17
- flex: 1;
18
-
19
- overscroll-behavior-x: none !important;
20
- // overscroll-behavior-y: none !important;
21
- // overscroll-behavior: none !important;
22
- }
23
- </style>