pui9-components 1.16.4

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 (60) hide show
  1. package/README.md +43 -0
  2. package/dist/demo.html +10 -0
  3. package/dist/pui9-components.common.js +81953 -0
  4. package/dist/pui9-components.common.js.map +1 -0
  5. package/dist/pui9-components.css +5 -0
  6. package/dist/pui9-components.umd.js +81963 -0
  7. package/dist/pui9-components.umd.js.map +1 -0
  8. package/dist/pui9-components.umd.min.js +308 -0
  9. package/dist/pui9-components.umd.min.js.map +1 -0
  10. package/package-lock.json +15945 -0
  11. package/package.json +78 -0
  12. package/src/App.vue +117 -0
  13. package/src/components/PuiCheckbox.vue +105 -0
  14. package/src/components/PuiCodeEditor.vue +123 -0
  15. package/src/components/PuiDateField.vue +1004 -0
  16. package/src/components/PuiField.vue +30 -0
  17. package/src/components/PuiFieldSet.vue +27 -0
  18. package/src/components/PuiFormFooter.vue +64 -0
  19. package/src/components/PuiFormFooterBtns.vue +118 -0
  20. package/src/components/PuiFormHeader.vue +25 -0
  21. package/src/components/PuiFormLoading.vue +12 -0
  22. package/src/components/PuiFormMiniAudit.vue +53 -0
  23. package/src/components/PuiMasterDetail.vue +96 -0
  24. package/src/components/PuiModalDialog.vue +87 -0
  25. package/src/components/PuiModalDialogForm.vue +205 -0
  26. package/src/components/PuiMultiSelect.vue +499 -0
  27. package/src/components/PuiNumberField.vue +503 -0
  28. package/src/components/PuiPasswordField.vue +105 -0
  29. package/src/components/PuiRadioGroup.vue +105 -0
  30. package/src/components/PuiRichTextEditor.vue +117 -0
  31. package/src/components/PuiSelect.vue +1638 -0
  32. package/src/components/PuiSelectDetailDialog.vue +106 -0
  33. package/src/components/PuiSelectTextService.vue +61 -0
  34. package/src/components/PuiSpinnerField.vue +484 -0
  35. package/src/components/PuiSwitch.vue +104 -0
  36. package/src/components/PuiTextArea.vue +203 -0
  37. package/src/components/PuiTextField.vue +272 -0
  38. package/src/dateTimeUtils.js +78 -0
  39. package/src/index.js +73 -0
  40. package/src/main.js +33 -0
  41. package/src/mixins/PuiFormComponentMixin.js +81 -0
  42. package/src/mixins/PuiMultiSelectMixin.js +106 -0
  43. package/src/mixins/PuiUtilsNumberMixin.js +19 -0
  44. package/src/plugins/vuetify.js +32 -0
  45. package/src/tests/TestAutocomplete.vue +138 -0
  46. package/src/tests/TestCodeEditor.vue +48 -0
  47. package/src/tests/TestField.vue +22 -0
  48. package/src/tests/TestFieldSet.vue +30 -0
  49. package/src/tests/TestInputCheckbox.vue +53 -0
  50. package/src/tests/TestInputDate.vue +146 -0
  51. package/src/tests/TestInputNumber.vue +77 -0
  52. package/src/tests/TestInputRadioGroup.vue +86 -0
  53. package/src/tests/TestInputSpinner.vue +77 -0
  54. package/src/tests/TestInputSwitch.vue +52 -0
  55. package/src/tests/TestInputText.vue +120 -0
  56. package/src/tests/TestInputTextArea.vue +73 -0
  57. package/src/tests/TestMultiSelect.vue +127 -0
  58. package/src/tests/TestPuiForm.vue +68 -0
  59. package/src/tests/TestRichTextEditor.vue +54 -0
  60. package/src/utils.js +148 -0
@@ -0,0 +1,127 @@
1
+ <template>
2
+ <v-container>
3
+ <v-card class="pa-4 mt-4">
4
+ <v-layout>
5
+ <v-flex xs12 md6>
6
+ <pui-multi-select
7
+ itemValue="id"
8
+ itemText="name"
9
+ :items="model1.items_all"
10
+ :itemsToSelect="model1.items_selected"
11
+ v-model="model1.items_selected"
12
+ ></pui-multi-select>
13
+ </v-flex>
14
+ <v-flex xs12 md6>
15
+ <v-layout wrap>
16
+ <v-flex xs12>
17
+ <b>Todos</b>
18
+ <div>{{ model1.items_all }}</div>
19
+ </v-flex>
20
+ <v-flex xs12>
21
+ <b>Seleccionados</b>
22
+ <div>{{ model1.items_selected }}</div>
23
+ </v-flex>
24
+ </v-layout>
25
+ </v-flex>
26
+ </v-layout>
27
+ </v-card>
28
+ <v-card class="pa-4 mt-4">
29
+ <v-layout>
30
+ <v-flex xs12 md6>
31
+ <pui-multi-select
32
+ :items="model2.items_all"
33
+ :itemsToSelect="model2.items_selected"
34
+ v-model="model2.items_selected"
35
+ :trackItemsToSelect="true"
36
+ :flat="true"
37
+ ></pui-multi-select>
38
+ </v-flex>
39
+ <v-flex xs12 md6>
40
+ <v-layout wrap>
41
+ <v-flex xs12>
42
+ <b>Todos</b>
43
+ <div>{{ model2.items_all }}</div>
44
+ </v-flex>
45
+ <v-flex xs12>
46
+ <b>Seleccionados</b>
47
+ <div>{{ model2.items_selected }}</div>
48
+ </v-flex>
49
+ </v-layout>
50
+ </v-flex>
51
+ </v-layout>
52
+ </v-card>
53
+ <v-card class="pa-4 mt-4">
54
+ <v-layout>
55
+ <v-flex xs12 md6>
56
+ <pui-multi-select
57
+ :items="model3.items_all"
58
+ :itemsToSelect="model3.items_selected"
59
+ v-model="model3.items_selected"
60
+ disabled
61
+ ></pui-multi-select>
62
+ </v-flex>
63
+ <v-flex xs12 md6>
64
+ <v-layout wrap>
65
+ <v-flex xs12>
66
+ <b>Todos</b>
67
+ <div>{{ model3.items_all }}</div>
68
+ </v-flex>
69
+ <v-flex xs12>
70
+ <b>Seleccionados</b>
71
+ <div>{{ model3.items_selected }}</div>
72
+ </v-flex>
73
+ </v-layout>
74
+ </v-flex>
75
+ </v-layout>
76
+ </v-card>
77
+ </v-container>
78
+ </template>
79
+
80
+ <script>
81
+ import PuiMultiSelect from '@/components/PuiMultiSelect';
82
+
83
+ export default {
84
+ name: 'TestMultiSelect',
85
+ components: { PuiMultiSelect },
86
+ data() {
87
+ return {
88
+ model1: {
89
+ items_selected: [{ name: 'sergi', id: 'sergi' }],
90
+ items_all: [
91
+ { name: 'sergi', id: 'sergi' },
92
+ { name: 'vicent', id: 'vicent' },
93
+ { name: 'marc', id: 'marc' },
94
+ { name: 'miquel', id: 'miquel' },
95
+ { name: 'cesar', id: 'cesar' },
96
+ { name: 'victor', id: 'victor' },
97
+ { name: 'amelia', id: 'amelia' },
98
+ { name: 'natxo', id: 'natxo' }
99
+ ]
100
+ },
101
+ model2: {
102
+ items_selected: [{ text: 'ESTEBAN', value: 'ESTEBAN' }],
103
+ items_all: [
104
+ { text: 'JOSE', value: 'JOSE' },
105
+ { text: 'JUAN', value: 'JUAN' },
106
+ { text: 'ANDRES', value: 'ANDRES' },
107
+ { text: 'ESTEBAN', value: 'ESTEBAN' }
108
+ ]
109
+ },
110
+ model3: {
111
+ items_selected: [{ text: 'ANDRES', value: 'ANDRES' }],
112
+ items_all: []
113
+ }
114
+ };
115
+ },
116
+ created() {
117
+ setTimeout(() => {
118
+ this.model3.items_all = [
119
+ { text: 'JOSE', value: 'JOSE' },
120
+ { text: 'JUAN', value: 'JUAN' },
121
+ { text: 'ANDRES', value: 'ANDRES' },
122
+ { text: 'ESTEBAN', value: 'ESTEBAN' }
123
+ ];
124
+ }, 4000);
125
+ }
126
+ };
127
+ </script>
@@ -0,0 +1,68 @@
1
+ <template>
2
+ <div class="pui-form">
3
+ <pui-form-header :showHeader="true" v-if="modelLoaded">
4
+ <div class="puiformheader">
5
+ <v-layout wrap>
6
+ <v-flex xs12>
7
+ <label>Here goes the header content</label>
8
+ </v-flex>
9
+ </v-layout>
10
+ </div>
11
+ </pui-form-header>
12
+
13
+ <v-form class="mb-4 pb-4" ref="form" v-model="valid" lazy-validation v-if="modelLoaded">
14
+ <v-layout wrap class="pui-form-layout">
15
+ <v-flex xs12>
16
+ <label>Here goes the form content</label>
17
+ </v-flex>
18
+ <pui-form-mini-audit class="pl-2" :model="model"></pui-form-mini-audit>
19
+ </v-layout>
20
+ <pui-form-footer>
21
+ <pui-form-footer-btns :formDisabled="formDisabled" :save="save" :back="back"></pui-form-footer-btns>
22
+ </pui-form-footer>
23
+ </v-form>
24
+ <pui-form-loading v-else></pui-form-loading>
25
+ </div>
26
+ </template>
27
+
28
+ <script>
29
+ import PuiFormHeader from '@/components/PuiFormHeader';
30
+ import PuiFormFooter from '@/components/PuiFormFooter';
31
+ import PuiFormFooterBtns from '@/components/PuiFormFooterBtns';
32
+ import PuiFormMiniAudit from '@/components/PuiFormMiniAudit';
33
+ import PuiFormLoading from '@/components/PuiFormLoading';
34
+
35
+ export default {
36
+ components: { PuiFormHeader, PuiFormFooter, PuiFormFooterBtns, PuiFormMiniAudit, PuiFormLoading },
37
+ data() {
38
+ return {
39
+ modelLoaded: false,
40
+ valid: true,
41
+ formDisabled: false,
42
+ model: {
43
+ usralta: 'Pepe Hortulano',
44
+ fecalta: '2019-09-05T10:26:49.441Z',
45
+ usrmodif: 'Elsa Abril',
46
+ fecmodif: '2019-09-08T12:18:43.441Z'
47
+ }
48
+ };
49
+ },
50
+ created() {
51
+ this.lazyLoadTest();
52
+ this.$store.commit('puiMenuHideMenu', true);
53
+ },
54
+ methods: {
55
+ lazyLoadTest() {
56
+ setTimeout(() => {
57
+ this.modelLoaded = true;
58
+ }, 3000);
59
+ },
60
+ save() {
61
+ console.log('Save clicked!');
62
+ },
63
+ back() {
64
+ console.log('Back clicked!');
65
+ }
66
+ }
67
+ };
68
+ </script>
@@ -0,0 +1,54 @@
1
+ <template>
2
+ <v-container>
3
+ <v-flex xs12>
4
+ <v-card class="pa-4 mt-4">
5
+ <h2 class="mb-4">Rich Text Editor</h2>
6
+ <pui-rich-text-editor id="editor1" :label="label" v-model="model1"></pui-rich-text-editor>
7
+ </v-card>
8
+ <v-card class="pa-4 mt-4">
9
+ <h2 class="mb-4">Code Editor in Form</h2>
10
+
11
+ <v-form ref="form" v-model="valid" lazy-validation v-if="modelLoaded">
12
+ <pui-rich-text-editor
13
+ id="editor2"
14
+ :label="label"
15
+ v-model="model1"
16
+ required
17
+ :validationErrors="formValidationErrors"
18
+ ></pui-rich-text-editor>
19
+ <v-btn depressed color="secondary" class="elevation-0" @click.native="save(false)">
20
+ Save
21
+ </v-btn>
22
+ </v-form>
23
+ </v-card>
24
+ </v-flex>
25
+ </v-container>
26
+ </template>
27
+
28
+ <script>
29
+ import PuiRichTextEditor from '@/components/PuiRichTextEditor';
30
+
31
+ export default {
32
+ name: 'TestRichTextEditor',
33
+ components: { PuiRichTextEditor },
34
+ data() {
35
+ return {
36
+ label: 'Etiqueta editor de texto enriquecido',
37
+ model1: 'Este texto se está editando con el componente PuiRichTextEditor',
38
+ valid: true,
39
+ modelLoaded: true,
40
+ formValidationErrors: false
41
+ };
42
+ },
43
+ methods: {
44
+ save() {
45
+ this.formValidationErrors = false;
46
+ if (this.$refs.form && this.$refs.form.validate && !this.$refs.form.validate()) {
47
+ this.formValidationErrors = true;
48
+ console.log('Hay errores de validación en el formulario');
49
+ return;
50
+ }
51
+ }
52
+ }
53
+ };
54
+ </script>
package/src/utils.js ADDED
@@ -0,0 +1,148 @@
1
+ export default {
2
+ getPathModelMethodPk: (router, modelName) => {
3
+ var path = router.currentRoute.path;
4
+ var routeTokens = path.split('/');
5
+ var tokens = [];
6
+
7
+ for (let i = 0, length = routeTokens.length; i < length; i++) {
8
+ if (routeTokens[i] !== '') {
9
+ tokens.push(routeTokens[i]);
10
+ }
11
+ }
12
+
13
+ var position = null;
14
+ for (let i = 0, length = tokens.length; i < length; i++) {
15
+ const token = tokens[i];
16
+ if (token === modelName) {
17
+ position = i;
18
+ break;
19
+ }
20
+ }
21
+
22
+ if (position == null) {
23
+ return null;
24
+ }
25
+
26
+ var method = tokens[position + 1];
27
+ var bpk = tokens[position + 2];
28
+ var pk = null;
29
+
30
+ if (bpk !== 'new') {
31
+ pk = decodeURIComponent(escape(window.atob(bpk)));
32
+ pk = JSON.parse(pk);
33
+ }
34
+
35
+ var info = {
36
+ modelName: modelName,
37
+ method: method,
38
+ pk: pk
39
+ };
40
+
41
+ var parentTokens = tokens.slice(0, position);
42
+ var parentTokensLength = parentTokens.length;
43
+ var child = info;
44
+ while (parentTokensLength >= 3) {
45
+ var parentPk = parentTokens[parentTokensLength - 1];
46
+ var parentPkJson = decodeURIComponent(escape(window.atob(parentPk)));
47
+ var parentMethod = parentTokens[parentTokensLength - 2];
48
+ var parentModelName = parentTokens[parentTokensLength - 3];
49
+
50
+ if (parentMethod === 'create' || parentMethod === 'update' || parentMethod === 'read' || parentMethod === 'action') {
51
+ child.parent = {
52
+ modelName: parentModelName,
53
+ method: parentMethod,
54
+ pk: JSON.parse(parentPkJson)
55
+ };
56
+ child = child.parent;
57
+ }
58
+
59
+ parentTokens = parentTokens.slice(0, parentTokensLength - 3);
60
+ parentTokensLength = parentTokens.length;
61
+ }
62
+
63
+ return info;
64
+ },
65
+ getComponentOffset: component => {
66
+ var rect = component.getBoundingClientRect();
67
+ var scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;
68
+ var scrollTop = window.pageYOffset || document.documentElement.scrollTop;
69
+ return { top: rect.top + scrollTop, left: rect.left + scrollLeft };
70
+ },
71
+ getModelFromRouter: router => {
72
+ var routeTokens = router.path.split('/');
73
+ var tokens = [];
74
+
75
+ for (let i = 0, length = routeTokens.length; i < length; i++) {
76
+ if (routeTokens[i] && routeTokens[i] !== router.params.pk && routeTokens[i] !== router.params.method) {
77
+ tokens.push(routeTokens[i]);
78
+ }
79
+ }
80
+
81
+ return tokens[tokens.length - 1];
82
+ },
83
+ utf8ToB64: str => {
84
+ if (str) {
85
+ return window.btoa(unescape(encodeURIComponent(str)));
86
+ }
87
+ },
88
+ b64ToUtf8: str => {
89
+ if (str) {
90
+ return decodeURIComponent(escape(window.atob(str)));
91
+ }
92
+ },
93
+ getFilenameFromHeaders: headers => {
94
+ const disposition = headers['content-disposition'];
95
+ if (disposition && disposition.indexOf('attachment') !== -1) {
96
+ var filenameRegex = /filename=((['"]).*?\2|[^;\n]*)/;
97
+ var matches = filenameRegex.exec(disposition);
98
+ if (matches != null && matches[1]) {
99
+ return matches[1].replace(/['"]/g, '');
100
+ }
101
+ }
102
+ return null;
103
+ },
104
+ compressImageFile: (file, fileReaderEvent, maxResolution, quality, compressImageFileCallback) => {
105
+ const MAX_RESOLUTION = maxResolution || 1200;
106
+ const QUALITY = quality === 'low' ? 0.1 : quality === 'medium' ? 0.5 : 1;
107
+
108
+ const img = new window.Image();
109
+ img.src = fileReaderEvent.target.result;
110
+ img.addEventListener('load', () => {
111
+ const canvas = document.createElement('canvas');
112
+ let ctx = canvas.getContext('2d');
113
+ ctx.drawImage(img, 0, 0);
114
+
115
+ // img.width and img.height will contain the original dimensions
116
+ let width = img.width;
117
+ let height = img.height;
118
+
119
+ if (width > height) {
120
+ if (width > MAX_RESOLUTION) {
121
+ height *= MAX_RESOLUTION / width;
122
+ width = MAX_RESOLUTION;
123
+ }
124
+ } else {
125
+ if (height > MAX_RESOLUTION) {
126
+ width *= MAX_RESOLUTION / height;
127
+ height = MAX_RESOLUTION;
128
+ }
129
+ }
130
+
131
+ canvas.width = width;
132
+ canvas.height = height;
133
+ ctx = canvas.getContext('2d');
134
+ ctx.drawImage(img, 0, 0, width, height);
135
+ canvas.toBlob(
136
+ blob => {
137
+ const newFile = new window.File([blob], file.name, {
138
+ type: file.type,
139
+ lastModified: Date.now()
140
+ });
141
+ compressImageFileCallback(newFile);
142
+ },
143
+ file.type,
144
+ QUALITY
145
+ );
146
+ });
147
+ }
148
+ };