@qikdev/vue-ui 0.0.1 → 0.0.2

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 (72) hide show
  1. package/package.json +6 -2
  2. package/src/components.js +209 -6
  3. package/src/content/browser.vue +477 -0
  4. package/src/content/item.vue +48 -0
  5. package/src/content/render/field.vue +423 -0
  6. package/src/content/render/group.vue +65 -0
  7. package/src/content/render/render-mixin.js +101 -0
  8. package/src/content/render/render.vue +86 -0
  9. package/src/filter/FilterBuilder.vue +147 -0
  10. package/src/filter/FilterCondition.vue +335 -0
  11. package/src/filter/FilterRule.vue +257 -0
  12. package/src/form/expressions/index.js +83 -0
  13. package/src/form/field.vue +624 -0
  14. package/src/form/form.vue +280 -0
  15. package/src/form/getDefaultValue.js +224 -0
  16. package/src/form/inputs/button-select.vue +208 -0
  17. package/src/form/inputs/checkbox.vue +91 -0
  18. package/src/form/inputs/content-select.vue +187 -0
  19. package/src/form/inputs/currency.vue +205 -0
  20. package/src/form/inputs/datefield.vue +132 -0
  21. package/src/form/inputs/group.vue +155 -0
  22. package/src/form/inputs/input-mixin.js +440 -0
  23. package/src/form/inputs/native-select-old.vue +43 -0
  24. package/src/form/inputs/object-field.vue +50 -0
  25. package/src/form/inputs/option.vue +19 -0
  26. package/src/form/inputs/options-manager.vue +244 -0
  27. package/src/form/inputs/phone-number-input.vue +235 -0
  28. package/src/form/inputs/search.vue +117 -0
  29. package/src/form/inputs/select.vue +211 -0
  30. package/src/form/inputs/switch.vue +87 -0
  31. package/src/form/inputs/textarea.vue +80 -0
  32. package/src/form/inputs/textfield.vue +165 -0
  33. package/src/form/inputs/timezone.vue +642 -0
  34. package/src/form/inputs/upload/filedrop.vue +72 -0
  35. package/src/form/inputs/upload/upload.vue +323 -0
  36. package/src/form/parseBoolean.js +24 -0
  37. package/src/layout/flex-body.vue +3 -2
  38. package/src/layout/flex-cell.vue +45 -0
  39. package/src/layout/flex-column.vue +1 -1
  40. package/src/layout/flex-footer.vue +3 -2
  41. package/src/layout/flex-header.vue +3 -2
  42. package/src/layout/flex-row.vue +35 -0
  43. package/src/layout/flex-spacer.vue +17 -0
  44. package/src/layout/panel-body.vue +13 -0
  45. package/src/layout/panel-footer.vue +20 -0
  46. package/src/layout/panel-header.vue +20 -0
  47. package/src/layout/panel.vue +23 -0
  48. package/src/modal/ConfirmModal.vue +50 -0
  49. package/src/modal/ContentModal.vue +99 -0
  50. package/src/modal/Modal.vue +85 -0
  51. package/src/modal/ModalMixin.js +21 -0
  52. package/src/modal/OptionsModal.vue +31 -0
  53. package/src/modal/PromptModal.vue +31 -0
  54. package/src/services/selection.js +140 -0
  55. package/src/table/Table.vue +269 -0
  56. package/src/table/TableCell.vue +64 -0
  57. package/src/table/TableRow.vue +94 -0
  58. package/src/table/cells/TableCellMixin.js +15 -0
  59. package/src/table/cells/Thumbnail.vue +38 -0
  60. package/src/ui/button.vue +254 -0
  61. package/src/ui/checkbox.vue +79 -0
  62. package/src/ui/icon.vue +57 -0
  63. package/src/ui/image.vue +158 -0
  64. package/src/ui/link.vue +62 -0
  65. package/src/ui/list-item.vue +16 -0
  66. package/src/ui/list.vue +26 -0
  67. package/src/ui/menu.vue +135 -0
  68. package/src/ui/progressbar.vue +77 -0
  69. package/src/ui/spinner.vue +26 -0
  70. package/src/ui/switch.vue +89 -0
  71. package/yarn-error.log +2923 -0
  72. package/index.js +0 -14
@@ -0,0 +1,72 @@
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>
@@ -0,0 +1,323 @@
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>
@@ -0,0 +1,24 @@
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
+ }
@@ -4,11 +4,12 @@
4
4
  </div>
5
5
  </template>
6
6
  <script>
7
- export default {}
7
+ export default {
8
+ }
8
9
  </script>
9
10
 
10
11
 
11
- <style lang="scss">
12
+ <style scoped lang="scss">
12
13
  .flex-column-body {
13
14
  overflow-y: auto;
14
15
  overflow-x: hidden;
@@ -0,0 +1,45 @@
1
+ <template>
2
+ <div class="flex-cell">
3
+ <slot></slot>
4
+ </div>
5
+ </template>
6
+ <script>
7
+
8
+ export default {
9
+ }
10
+
11
+ </script>
12
+ <style scoped lang="scss">
13
+ .flex-cell {
14
+ overflow: hidden;
15
+ flex: 1;
16
+ flex-direction: row;
17
+
18
+ &[flex] {
19
+ display: flex;
20
+ }
21
+
22
+ &[center] {
23
+ display: flex;
24
+ align-items: center;
25
+ justify-content: center;
26
+ }
27
+
28
+ &[vcenter] {
29
+ display: flex;
30
+ align-items: center;
31
+ }
32
+
33
+ &[align-bottom] {
34
+ display: flex;
35
+ align-items: self-end;
36
+ }
37
+
38
+ &[shrink] {
39
+ flex:none;
40
+ }
41
+ }
42
+
43
+
44
+
45
+ </style>
@@ -9,7 +9,7 @@ export default {
9
9
  }
10
10
 
11
11
  </script>
12
- <style lang="scss">
12
+ <style scoped lang="scss">
13
13
  .flex-column {
14
14
  display: flex;
15
15
  overflow: hidden;
@@ -4,9 +4,10 @@
4
4
  </div>
5
5
  </template>
6
6
  <script>
7
- export default {}
7
+ export default {
8
+ }
8
9
  </script>
9
- <style lang="scss">
10
+ <style scoped lang="scss">
10
11
  .flex-column-footer {
11
12
  flex: none;
12
13
  }
@@ -4,9 +4,10 @@
4
4
  </div>
5
5
  </template>
6
6
  <script>
7
- export default {}
7
+ export default {
8
+ }
8
9
  </script>
9
- <style lang="scss">
10
+ <style scoped lang="scss">
10
11
  .flex-column-header {
11
12
  flex: none;
12
13
  }
@@ -0,0 +1,35 @@
1
+ <template>
2
+ <div class="flex-row">
3
+ <slot></slot>
4
+ </div>
5
+ </template>
6
+ <script>
7
+
8
+ export default {
9
+ }
10
+
11
+ </script>
12
+ <style scoped lang="scss">
13
+ .flex-row {
14
+ display: flex;
15
+ overflow: hidden;
16
+ flex: 1;
17
+ flex-direction: row;
18
+
19
+ &[center] {
20
+ align-items: center;
21
+ justify-content: center;
22
+ }
23
+
24
+ &[vcenter] {
25
+ align-items: center;
26
+ }
27
+
28
+ &[wrap] {
29
+ flex-wrap: wrap;
30
+ }
31
+ }
32
+
33
+
34
+
35
+ </style>
@@ -0,0 +1,17 @@
1
+ <template>
2
+ <div class="flex-spacer"/>
3
+ </template>
4
+ <script>
5
+
6
+ export default {
7
+ }
8
+
9
+ </script>
10
+ <style scoped lang="scss">
11
+ .flex-spacer {
12
+ padding:0.25em;
13
+ }
14
+
15
+
16
+
17
+ </style>
@@ -0,0 +1,13 @@
1
+ <template>
2
+ <div class="panel-body">
3
+ <slot></slot>
4
+ </div>
5
+ </template>
6
+ <script>
7
+ export default {}
8
+ </script>
9
+ <style lang="scss" scoped>
10
+ .panel-body {
11
+ padding: 1em;
12
+ }
13
+ </style>
@@ -0,0 +1,20 @@
1
+ <template>
2
+ <div class="panel-footer">
3
+ <slot></slot>
4
+ </div>
5
+ </template>
6
+ <script>
7
+
8
+ export default {
9
+ }
10
+
11
+ </script>
12
+ <style lang="scss" scoped>
13
+ .panel-footer {
14
+ padding:0.5em 1em;
15
+ border-top:1px solid rgba(#000,0.1);
16
+ }
17
+
18
+
19
+
20
+ </style>
@@ -0,0 +1,20 @@
1
+ <template>
2
+ <div class="panel-header">
3
+ <slot></slot>
4
+ </div>
5
+ </template>
6
+ <script>
7
+
8
+ export default {
9
+ }
10
+
11
+ </script>
12
+ <style lang="scss" scoped>
13
+ .panel-header {
14
+ padding:0.5em 0.5em 0.5em 1em;
15
+ border-bottom:1px solid rgba(#000,0.1);
16
+ }
17
+
18
+
19
+
20
+ </style>
@@ -0,0 +1,23 @@
1
+ <template>
2
+ <div class="panel">
3
+ <slot></slot>
4
+ </div>
5
+ </template>
6
+ <script>
7
+
8
+ export default {
9
+ }
10
+
11
+ </script>
12
+ <style lang="scss" scoped>
13
+ .panel {
14
+ border-radius: 0.3em;
15
+ border:1px solid rgba(#000,0.1);
16
+ margin-bottom: 1em;
17
+ box-shadow: 0 4px 4px 0px rgba(0, 0, 0, 0.02);
18
+
19
+ }
20
+
21
+
22
+
23
+ </style>