@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,229 +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
-
17
- </div>
18
- </template>
19
- <script>
20
- import InputMixin from './input-mixin';
21
-
22
-
23
-
24
- function isUndefined(entry) {
25
- return entry === undefined || typeof entry === 'undefined' || entry === null || String(entry) === 'null' || String(entry) === 'undefined';
26
- }
27
-
28
- //////////////////////////
29
-
30
- export default {
31
- props: {
32
- title:{
33
- type:String,
34
- },
35
- modelValue: {
36
- // type: [Object, Array],
37
- },
38
- },
39
- mixins: [InputMixin],
40
- created() {
41
- this.model = this.model;
42
- },
43
- methods: {
44
- cleanOutput(val) {
45
- var self = this;
46
-
47
- if (isUndefined(val)) {
48
- if (self.multiValue) {
49
- val = [];
50
- } else {
51
- val = undefined;
52
- }
53
- } else {
54
- if (self.multiValue) {
55
- val = (val || []).filter(Boolean).map(function(i) {
56
- return self.getValue(i);
57
- })
58
- } else {
59
- val = self.getValue(val);
60
- }
61
- }
62
-
63
- return val;
64
- },
65
- cleanInput(val) {
66
-
67
- var self = this;
68
-
69
- if (self.multiValue) {
70
- if (!val) {
71
- val = [];
72
- }
73
-
74
- if (!Array.isArray(val)) {
75
- val = [val];
76
- }
77
-
78
- /////////////////////////////////
79
-
80
- if (self.maximum) {
81
- if (val.length > self.maximum) {
82
- val.length = self.maximum;
83
- }
84
- }
85
-
86
-
87
- val = val.filter(Boolean).map(function(v) {
88
- var valueKey = self.getValue(v);
89
- return self.returnObject ? self.optionLookup[valueKey] : valueKey;
90
- })
91
-
92
- } else {
93
- var valueKey = self.getValue(val);
94
- val = self.returnObject ? self.optionLookup[valueKey] : valueKey;
95
- }
96
-
97
- return val;
98
- },
99
- },
100
- computed: {
101
- returnObject() {
102
- return this.type == 'reference';
103
- },
104
- classes() {
105
- var array = []
106
-
107
- if (this.multiValue) {
108
- array.push('multiple');
109
- } else {
110
- array.push('single');
111
- }
112
-
113
- return array;
114
- },
115
- // model: {
116
- // get() {
117
- // let val = this.cleanOutput(this.value);
118
- // return val;
119
- // },
120
- // set(val) {
121
- // val = this.cleanInput(val);
122
- // // // var val = this.cleanOutput(newValue);
123
- // // // var existing = this.cleanOutput(this.value);
124
-
125
- // // if (newValue != existing) {
126
- // // newValue = this.cleanInput(val);
127
- // // this.value = newValue;
128
- // // this.dispatch();
129
- // // }
130
-
131
- // this.value = val;
132
- // this.dispatch();
133
-
134
- // }
135
- // },
136
- optionLookup() {
137
- var self = this;
138
- return self.options.reduce(function(set, option) {
139
- const key = self.getValue(option);
140
- set[key] = option;
141
- return set;
142
- }, {})
143
- },
144
- summary() {
145
- return this.model ? this.getLabel(this.optionLookup[this.model]) : this.title || 'Click to select';
146
- },
147
-
148
- selectableOptions() {
149
- return this.options
150
- // .sort(function(option) {
151
- // return option.title;
152
- // });
153
- // if(this.type == 'reference') {
154
-
155
- // } else {
156
-
157
- // }
158
-
159
- },
160
- }
161
- }
162
- </script>
163
- <style lang="scss" scoped>
164
- .native-select {
165
-
166
- cursor: pointer;
167
-
168
- &.multiple {
169
- select {
170
- width: 100%;
171
- font-size:1em;
172
- border:1px solid rgba(#000, 0.1);
173
- appearance:none;
174
-
175
- &:focus {
176
- border:1px solid $primary;
177
- }
178
- }
179
- }
180
-
181
- &.single {
182
- position: relative;
183
-
184
- .ui-select-button {
185
- position: relative;
186
- width:100%;
187
-
188
-
189
-
190
- & > .ux-btn {
191
- display: block;
192
- position:relative;
193
- text-align: left;
194
-
195
- &:after {
196
- content:'▼';
197
- position:absolute;
198
- right:0;
199
- line-height: 3.5em;
200
- top:0;
201
- bottom: 0;
202
- height:100%;
203
- font-size: 0.6em;
204
- width:4em;
205
- text-align: center;
206
- opacity: 0.5;
207
-
208
- }
209
- }
210
- }
211
-
212
- select {
213
- cursor: pointer;
214
- opacity: 0;
215
- appearance: none;
216
- width: 100%;
217
- height: 100%;
218
- position: absolute;
219
- top: 0;
220
- left: 0;
221
- bottom: 0;
222
- right: 0;
223
- }
224
- }
225
-
226
-
227
- }
228
-
229
- </style>
@@ -1,87 +0,0 @@
1
- <template>
2
- <flex-row @click="touch()">
3
- <flex-cell vcenter shrink>
4
- <ux-switch :value="model" @click="model = !model" />
5
- </flex-cell>
6
- <flex-spacer />
7
- <flex-cell vcenter>
8
- <div>
9
- <label class="ux-field-title" v-if="showLabel">
10
- {{label}} <span class="ux-required-marker" v-if="required">*</span>
11
- </label>
12
- <div class="ux-field-description" v-if="showDescription">{{description}}</div>
13
- </div>
14
- </flex-cell>
15
- </flex-row>
16
- </template>
17
- <script>
18
- import InputMixin from './input-mixin';
19
-
20
- export default {
21
- mixins: [InputMixin],
22
- props: {
23
- modelValue: {
24
- type: Boolean,
25
- default () {
26
- return false;
27
- },
28
- },
29
- },
30
- data() {
31
- return {
32
- value: this.modelValue,
33
- }
34
- },
35
- watch: {
36
- modelValue(val, old) {
37
- this.value = val;
38
- this.model = val;
39
-
40
- }
41
- },
42
- computed: {
43
- longDescription() {
44
- return String(this.description).length > 2;
45
- },
46
- defaultValue() {
47
- return false;
48
- },
49
- model: {
50
- get() {
51
- return !!this.value;
52
- },
53
- set(value) {
54
- this.value = !!value;
55
- this.$emit('update:modelValue', this.value);
56
- }
57
- }
58
- }
59
- }
60
- </script>
61
- <style lang="scss" scoped>
62
- .ux-checkbox {
63
- margin-right: 0.5em;
64
- line-height: 1;
65
- height: 1.5em;
66
- width: 1.5em;
67
- padding: 0;
68
-
69
- &:hover {
70
- border-color: $primary;
71
- }
72
-
73
- &.ux-checkbox-true {
74
- background: $primary;
75
- border-color: $primary;
76
- color: #fff;
77
- }
78
- }
79
-
80
- .ux-field-title {
81
- margin: 0 !important;
82
- }
83
-
84
- .ux-field-description-long {
85
- margin-top: 0.5em;
86
- }
87
- </style>
@@ -1,80 +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
- <div v-if="multiValue">
5
- <flex-row class="ux-text-row" :key="index" v-for="(entry, index) in model">
6
- <flex-cell>
7
- <textarea contenteditable @focus="touch" ref="input" v-model="model[index]" class="ux-textarea ux-field-focus ux-text-area-multiple"/>
8
- </flex-cell>
9
- <flex-cell shrink vcenter>
10
- <ux-button tag="a" icon v-if="canRemoveValue" @click="remove(entry)">
11
- <ux-icon icon="fa-times" />
12
- </ux-button>
13
- </flex-cell>
14
- </flex-row>
15
- <ux-button v-if="canAddValue" @click="add()">{{addLabel}}</ux-button>
16
- </div>
17
- <template v-else>
18
- <textarea class="ux-textarea ux-field-focus ux-text-area-single" @focus="touch" v-model="model" role="textbox" contenteditable/>
19
-
20
- <!-- <textarea class="ux-field-focus ux-text-area-single" @focus="touch" v-model="model" /> -->
21
- </template>
22
- </template>
23
- <script>
24
- import InputMixin from './input-mixin';
25
-
26
- export default {
27
- props: {
28
- modelValue: {
29
- type: [String, Array],
30
- },
31
- },
32
- mixins: [InputMixin],
33
- methods: {
34
- getNewDefaultEntry() {
35
- return '';
36
- },
37
- },
38
- }
39
- </script>
40
- <style lang="scss" scoped>
41
- .ux-text-row {
42
- margin-bottom: 0.5em;
43
- }
44
-
45
- .ux-textarea,
46
- textarea {
47
- border-radius: 0.1em;
48
- padding: 0.5em;
49
- box-sizing: border-box;
50
- background: rgba(#000, 0.05);
51
- border: 1px solid rgba(#000, 0.1);
52
- font-size: inherit;
53
- appearance: none;
54
- line-height: 1;
55
- min-height: 5em;
56
- font-family: inherit;
57
- resize: vertical;
58
- overflow: hidden;
59
-
60
- &:focus {
61
- background: none;
62
- border: 1px solid $primary;
63
- outline: none;
64
- }
65
- }
66
-
67
- .ux-text-row .ux-btn {
68
- margin-left: 0.25em;
69
- }
70
-
71
- .ux-text-area-multiple {
72
- width: 100%;
73
- }
74
-
75
- .ux-text-area-single {
76
- width:100%;
77
- // width: calc(100% - 0.5em);
78
- // margin: 0 0.5em 0 0;
79
- }
80
- </style>
@@ -1,185 +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
- <div v-if="multiValue">
5
- <flex-row class="ux-text-row" :key="index" v-for="(entry, index) in model">
6
- <flex-cell>
7
- <div class="ux-text-wrap">
8
- <span class="ux-text-prefix" v-if="prefix">{{prefix}}</span>
9
- <input :type="inputType" v-if="lazy" class="ux-field-focus ux-text-input-multiple" :placeholder="actualPlaceholder" @focus="touch" ref="input" @keydown.enter.stop.prevent="add()" v-model.lazy="model[index]" />
10
- <input :type="inputType" v-if="!lazy" class="ux-field-focus ux-text-input-multiple" :placeholder="actualPlaceholder" @focus="touch" ref="input" @keydown.enter.stop.prevent="add()" v-model="model[index]" />
11
- <span class="ux-text-suffix" v-if="suffix">{{suffix}}</span>
12
- </div>
13
- </flex-cell>
14
- <flex-cell shrink vcenter>
15
- <ux-button tag="a" icon v-if="canRemoveValue" @click="remove(entry)">
16
- <ux-icon icon="fa-times" />
17
- </ux-button>
18
- </flex-cell>
19
- </flex-row>
20
- <ux-button v-if="canAddValue" @click="add()">{{addLabel}} <ux-icon icon="fa-plus" right/></ux-button>
21
- </div>
22
- <template v-else>
23
- <div class="ux-text-wrap">
24
- <span class="ux-text-prefix" v-if="prefix">{{prefix}}</span>
25
- <input :type="inputType" v-if="lazy" ref="input" class="ux-field-focus ux-text-input-single" :placeholder="actualPlaceholder" @focus="touch" v-model.lazy="model" />
26
- <input :type="inputType" v-if="!lazy" ref="input" class="ux-field-focus ux-text-input-single" :placeholder="actualPlaceholder" @focus="touch" v-model="model" />
27
- <span class="ux-text-suffix" v-if="suffix">{{suffix}}</span>
28
- </div>
29
- </template>
30
-
31
- </template>
32
- <script>
33
- import InputMixin from './input-mixin';
34
-
35
-
36
-
37
-
38
- export default {
39
- props: {
40
- modelValue: {
41
- type: [String, Array],
42
- },
43
- },
44
- mixins: [InputMixin],
45
- computed: {
46
- inputType() {
47
- switch(this.field.widget) {
48
- case 'password':
49
- case 'email':
50
- return this.field.widget;
51
- break;
52
- default:
53
-
54
- switch(this.field.type) {
55
- case 'email':
56
- return 'email';
57
- break;
58
- default:
59
- return 'text';
60
- break;
61
- }
62
- break;
63
- }
64
- },
65
- lazy() {
66
- switch (this.type) {
67
- case 'integer':
68
- case 'number':
69
- case 'decimal':
70
- case 'float':
71
- case 'url':
72
- case 'key':
73
- return true;
74
- break;
75
- }
76
- },
77
- actualPlaceholder() {
78
- if(this.field.placeholder) {
79
- return this.field.placeholder;
80
- }
81
-
82
- switch(this.type) {
83
- case 'integer':
84
- case 'number':
85
- case 'decimal':
86
- case 'float':
87
- return '0';
88
- break;
89
- case 'url':
90
- return 'https://www.website.com'
91
- break;
92
- case 'email':
93
- return 'you@youremail.com'
94
- break;
95
- }
96
- }
97
- },
98
- methods: {
99
- cleanOutputValue(v) {
100
- var cleaned = this.cleanTextInput(v, this.type, this);
101
- return cleaned ? String(cleaned) : '';
102
- },
103
- cleanInputValue(v) {
104
- return this.cleanTextInput(v, this.type, this);
105
- },
106
- getNewDefaultEntry() {
107
- return '';
108
- },
109
- },
110
- }
111
- </script>
112
- <style lang="scss" scoped>
113
- .ux-text-row {
114
- margin-bottom: 0.5em;
115
- }
116
-
117
- input {
118
- border-radius: 0.1em;
119
- padding: 0.5em;
120
- box-sizing: border-box;
121
- background: rgba(#000, 0.05);
122
- border: 1px solid rgba(#000, 0.1);
123
- font-size: inherit;
124
- appearance: none;
125
- line-height: 1;
126
- height: 2.5em;
127
-
128
- &:focus {
129
- background: none;
130
- border: 1px solid $primary;
131
- outline: none;
132
- }
133
- }
134
-
135
-
136
- .ux-text-wrap {
137
- position: relative;
138
-
139
- &.prefixed {
140
- input {
141
- padding-left: 1.2em;
142
- }
143
- }
144
-
145
- .ux-text-prefix {
146
- position: absolute;
147
- left: 0;
148
- top: 0;
149
- bottom: 0;
150
- width: 1em;
151
- pointer-events: none;
152
- display: flex;
153
- align-items: center;
154
- padding: 0.5em 0;
155
- justify-content: right;
156
- opacity: 0.5;
157
- }
158
-
159
- .ux-text-suffix {
160
- position: absolute;
161
- top: 0;
162
- bottom: 0;
163
- right: 0;
164
- pointer-events: none;
165
- display: flex;
166
- align-items: center;
167
- padding: 0.5em;
168
- opacity: 0.5;
169
- }
170
- }
171
-
172
- .ux-text-row .ux-btn {
173
- margin-left: 0.25em;
174
- }
175
-
176
- .ux-text-input-multiple {
177
- width: 100%;
178
- }
179
-
180
- .ux-text-input-single {
181
- width: 100%;
182
- // width: calc(100% - 0.5em);
183
- // margin: 0 0.5em 0 0;
184
- }
185
- </style>