glib-web 0.5.98 → 0.6.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 (204) hide show
  1. package/LICENSE +0 -0
  2. package/README.md +0 -0
  3. package/action.js +167 -167
  4. package/actions/analytics/logEvent.js +0 -0
  5. package/actions/auth/creditCard.js +0 -0
  6. package/actions/auth/restart.js +0 -0
  7. package/actions/auth/saveCsrfToken.js +0 -0
  8. package/actions/cables/push.js +0 -0
  9. package/actions/dialogs/alert.js +0 -0
  10. package/actions/dialogs/notification.js +0 -0
  11. package/actions/dialogs/oauth.js +0 -0
  12. package/actions/dialogs/open.js +0 -0
  13. package/actions/dialogs/options.js +0 -0
  14. package/actions/dialogs/show.js +0 -0
  15. package/actions/forms/submit.js +0 -0
  16. package/actions/http/delete.js +0 -0
  17. package/actions/http/patch.js +0 -0
  18. package/actions/http/post.js +0 -0
  19. package/actions/http/put.js +0 -0
  20. package/actions/panels/scrollTo.js +18 -18
  21. package/actions/panels/scrollToBottom.js +0 -0
  22. package/actions/runMultiple.js +0 -0
  23. package/actions/sheets/select.js +0 -0
  24. package/actions/snackbars/alert.js +0 -0
  25. package/actions/snackbars/select.js +0 -0
  26. package/actions/timeouts/set.js +20 -20
  27. package/actions/windows/close.js +0 -0
  28. package/actions/windows/closeAll.js +0 -0
  29. package/actions/windows/closeWithReload.js +0 -0
  30. package/actions/windows/open.js +0 -0
  31. package/actions/windows/openWeb.js +0 -0
  32. package/actions/windows/refreshState.js +5 -5
  33. package/actions/windows/reload.js +0 -0
  34. package/actions/ws/push.js +0 -0
  35. package/app.vue +180 -180
  36. package/components/_badge.vue +23 -23
  37. package/components/_button.vue +107 -107
  38. package/components/_dropdownMenu.vue +76 -76
  39. package/components/_icon.vue +50 -50
  40. package/components/_message.vue +0 -0
  41. package/components/avatar.vue +18 -18
  42. package/components/banners/alert.vue +0 -0
  43. package/components/banners/select.vue +82 -82
  44. package/components/button.vue +33 -40
  45. package/components/calendar.vue +0 -0
  46. package/components/charts/column.vue +47 -34
  47. package/components/charts/line.vue +67 -65
  48. package/components/chip.vue +51 -26
  49. package/components/component.vue +225 -225
  50. package/components/datetime.vue +0 -0
  51. package/components/fab.vue +0 -0
  52. package/components/fields/_patternText.vue +65 -65
  53. package/components/fields/_select.vue +86 -86
  54. package/components/fields/autocomplete.vue +73 -73
  55. package/components/fields/check.vue +91 -81
  56. package/components/fields/checkGroup.vue +58 -58
  57. package/components/fields/country/countries.js +0 -0
  58. package/components/fields/country/field.vue +0 -0
  59. package/components/fields/country/regions.js +0 -0
  60. package/components/fields/creditCard.vue +22 -13
  61. package/components/fields/date.vue +24 -24
  62. package/components/fields/datetime.vue +0 -0
  63. package/components/fields/dynamicGroup.vue +0 -0
  64. package/components/fields/dynamicSelect.vue +0 -0
  65. package/components/fields/file.vue +0 -0
  66. package/components/fields/googlePlace.vue +0 -0
  67. package/components/fields/hidden.vue +0 -0
  68. package/components/fields/location.vue +198 -198
  69. package/components/fields/newRichText.vue +0 -0
  70. package/components/fields/phone/countries.js +315 -315
  71. package/components/fields/phone/field.vue +351 -351
  72. package/components/fields/phone/sprite.css +1071 -1071
  73. package/components/fields/radio.vue +16 -16
  74. package/components/fields/radioGroup.vue +42 -42
  75. package/components/fields/rating.vue +0 -0
  76. package/components/fields/richText.vue +0 -0
  77. package/components/fields/select.vue +17 -17
  78. package/components/fields/stripe/stripeFields.vue +93 -93
  79. package/components/fields/stripe/stripeIndividualFields.vue +207 -207
  80. package/components/fields/stripeExternalAccount.vue +135 -135
  81. package/components/fields/text.vue +0 -0
  82. package/components/fields/textarea.vue +0 -0
  83. package/components/fields/timeZone.vue +22 -22
  84. package/components/fields/timer.vue +83 -83
  85. package/components/h1.vue +28 -28
  86. package/components/h2.vue +28 -20
  87. package/components/h3.vue +29 -22
  88. package/components/h4.vue +28 -20
  89. package/components/h5.vue +28 -20
  90. package/components/h6.vue +28 -20
  91. package/components/hr.vue +0 -0
  92. package/components/html.vue +0 -0
  93. package/components/icon.vue +25 -25
  94. package/components/image.vue +0 -0
  95. package/components/label.vue +62 -62
  96. package/components/map.vue +0 -0
  97. package/components/markdown.vue +0 -0
  98. package/components/mixins/{chart.js → chart/annotation.js} +73 -73
  99. package/components/mixins/chart/tooltip.js +31 -0
  100. package/components/mixins/events.js +178 -178
  101. package/components/mixins/generic.js +0 -0
  102. package/components/mixins/list/autoload.js +0 -0
  103. package/components/mixins/longClick.js +0 -0
  104. package/components/mixins/scrolling.js +0 -0
  105. package/components/mixins/styles.js +222 -222
  106. package/components/mixins/table/autoload.js +0 -0
  107. package/components/mixins/table/export.js +0 -0
  108. package/components/mixins/table/import.js +0 -0
  109. package/components/mixins/text.js +20 -20
  110. package/components/mixins/tooltip.js +11 -0
  111. package/components/mixins/ws/actionCable.js +48 -48
  112. package/components/mixins/ws/phoenixSocket.js +0 -0
  113. package/components/p.vue +0 -0
  114. package/components/panels/carousel.vue +55 -55
  115. package/components/panels/column.vue +0 -0
  116. package/components/panels/custom.vue +0 -0
  117. package/components/panels/flow.vue +81 -81
  118. package/components/panels/form.vue +130 -130
  119. package/components/panels/horizontal.vue +0 -0
  120. package/components/panels/list.vue +247 -247
  121. package/components/panels/responsive.vue +94 -94
  122. package/components/panels/scroll.vue +0 -0
  123. package/components/panels/split.vue +0 -0
  124. package/components/panels/table.vue +0 -0
  125. package/components/panels/ul.vue +34 -34
  126. package/components/panels/vertical.vue +0 -0
  127. package/components/panels/web.vue +11 -11
  128. package/components/progressbar.vue +36 -36
  129. package/components/spacer.vue +0 -0
  130. package/components/switch.vue +42 -42
  131. package/components/tabBar.vue +68 -68
  132. package/extensions/array.js +0 -0
  133. package/extensions/string.js +21 -21
  134. package/index.js +199 -199
  135. package/keys.js +0 -0
  136. package/nav/appbar.vue +136 -136
  137. package/nav/content.vue +0 -0
  138. package/nav/dialog.vue +127 -127
  139. package/nav/drawer.vue +105 -105
  140. package/nav/drawerButton.vue +31 -31
  141. package/nav/drawerLabel.vue +0 -0
  142. package/nav/sheet.vue +0 -0
  143. package/nav/snackbar.vue +0 -0
  144. package/package.json +44 -44
  145. package/settings.json.example +0 -0
  146. package/static/plugins/alignment/alignment.js +0 -0
  147. package/static/plugins/alignment/alignment.min.js +0 -0
  148. package/static/plugins/beyondgrammar/beyondgrammar.js +0 -0
  149. package/static/plugins/beyondgrammar/beyondgrammar.min.js +0 -0
  150. package/static/plugins/blockcode/blockcode.js +0 -0
  151. package/static/plugins/blockcode/blockcode.min.js +0 -0
  152. package/static/plugins/clips/clips.js +0 -0
  153. package/static/plugins/clips/clips.min.js +0 -0
  154. package/static/plugins/counter/counter.js +0 -0
  155. package/static/plugins/counter/counter.min.js +0 -0
  156. package/static/plugins/definedlinks/definedlinks.js +0 -0
  157. package/static/plugins/definedlinks/definedlinks.min.js +0 -0
  158. package/static/plugins/handle/handle.js +0 -0
  159. package/static/plugins/handle/handle.min.js +0 -0
  160. package/static/plugins/icons/icons.js +0 -0
  161. package/static/plugins/icons/icons.min.js +0 -0
  162. package/static/plugins/imageposition/imageposition.js +0 -0
  163. package/static/plugins/imageposition/imageposition.min.js +0 -0
  164. package/static/plugins/inlineformat/inlineformat.js +0 -0
  165. package/static/plugins/inlineformat/inlineformat.min.js +0 -0
  166. package/static/plugins/removeformat/removeformat.js +0 -0
  167. package/static/plugins/removeformat/removeformat.min.js +0 -0
  168. package/static/plugins/selector/selector.js +0 -0
  169. package/static/plugins/selector/selector.min.js +0 -0
  170. package/static/plugins/specialchars/specialchars.js +0 -0
  171. package/static/plugins/specialchars/specialchars.min.js +0 -0
  172. package/static/plugins/textdirection/textdirection.js +0 -0
  173. package/static/plugins/textdirection/textdirection.min.js +0 -0
  174. package/static/plugins/textexpander/textexpander.js +0 -0
  175. package/static/plugins/textexpander/textexpander.min.js +0 -0
  176. package/static/plugins/underline/underline.js +0 -0
  177. package/static/plugins/underline/underline.min.js +0 -0
  178. package/static/redactorx.css +0 -0
  179. package/static/redactorx.js +0 -0
  180. package/static/redactorx.min.css +0 -0
  181. package/static/redactorx.min.js +0 -0
  182. package/static/redactorx.usm.min.js +0 -0
  183. package/styles/test.sass +0 -0
  184. package/styles/test.scss +0 -0
  185. package/templates/_menu.vue +38 -38
  186. package/templates/comment.vue +202 -202
  187. package/templates/featured.vue +32 -32
  188. package/templates/thumbnail.vue +145 -145
  189. package/templates/unsupported.vue +12 -12
  190. package/utils/app.js +0 -0
  191. package/utils/dom.js +0 -0
  192. package/utils/form.js +0 -0
  193. package/utils/hash.js +0 -0
  194. package/utils/helper.js +0 -0
  195. package/utils/history.js +70 -70
  196. package/utils/http.js +209 -209
  197. package/utils/launch.js +135 -135
  198. package/utils/private/ws.js +0 -0
  199. package/utils/public.js +0 -0
  200. package/utils/settings.js +0 -0
  201. package/utils/storage.js +0 -0
  202. package/utils/type.js +0 -0
  203. package/utils/uploader.js +0 -0
  204. package/utils/url.js +136 -136
@@ -1,55 +1,55 @@
1
- <template>
2
- <v-card flat tile :style="$styles()">
3
- <v-window v-model="selectedIndex">
4
- <v-window-item v-for="(item, index) in spec.childViews" :key="index">
5
- <ui-component :spec="item" />
6
- </v-window-item>
7
- </v-window>
8
-
9
- <v-card-actions class="justify-space-between">
10
- <v-btn text @click="prev">
11
- <v-icon>chevron_left</v-icon>
12
- </v-btn>
13
- <v-item-group v-model="selectedIndex" class="text-center" mandatory>
14
- <v-item v-for="(item, index) in spec.childViews" :key="index">
15
- <v-btn
16
- slot-scope="{ active, toggle }"
17
- :input-value="active"
18
- icon
19
- @click="toggle"
20
- >
21
- <v-icon size="8">lens</v-icon>
22
- </v-btn>
23
- </v-item>
24
- </v-item-group>
25
- <v-btn text @click="next">
26
- <v-icon>chevron_right</v-icon>
27
- </v-btn>
28
- </v-card-actions>
29
- </v-card>
30
- </template>
31
-
32
- <script>
33
- export default {
34
- props: {
35
- spec: { type: Object, required: true }
36
- },
37
- data: () => ({
38
- selectedIndex: 0
39
- }),
40
- methods: {
41
- next() {
42
- const length = this.spec.childViews.length;
43
- this.selectedIndex =
44
- this.selectedIndex + 1 === length ? 0 : this.selectedIndex + 1;
45
- },
46
- prev() {
47
- const length = this.spec.childViews.length;
48
- this.selectedIndex =
49
- this.selectedIndex - 1 < 0 ? length - 1 : this.selectedIndex - 1;
50
- }
51
- }
52
- };
53
- </script>
54
-
55
- <style scoped></style>
1
+ <template>
2
+ <v-card flat tile :style="$styles()">
3
+ <v-window v-model="selectedIndex">
4
+ <v-window-item v-for="(item, index) in spec.childViews" :key="index">
5
+ <ui-component :spec="item" />
6
+ </v-window-item>
7
+ </v-window>
8
+
9
+ <v-card-actions class="justify-space-between">
10
+ <v-btn text @click="prev">
11
+ <v-icon>chevron_left</v-icon>
12
+ </v-btn>
13
+ <v-item-group v-model="selectedIndex" class="text-center" mandatory>
14
+ <v-item v-for="(item, index) in spec.childViews" :key="index">
15
+ <v-btn
16
+ slot-scope="{ active, toggle }"
17
+ :input-value="active"
18
+ icon
19
+ @click="toggle"
20
+ >
21
+ <v-icon size="8">lens</v-icon>
22
+ </v-btn>
23
+ </v-item>
24
+ </v-item-group>
25
+ <v-btn text @click="next">
26
+ <v-icon>chevron_right</v-icon>
27
+ </v-btn>
28
+ </v-card-actions>
29
+ </v-card>
30
+ </template>
31
+
32
+ <script>
33
+ export default {
34
+ props: {
35
+ spec: { type: Object, required: true }
36
+ },
37
+ data: () => ({
38
+ selectedIndex: 0
39
+ }),
40
+ methods: {
41
+ next() {
42
+ const length = this.spec.childViews.length;
43
+ this.selectedIndex =
44
+ this.selectedIndex + 1 === length ? 0 : this.selectedIndex + 1;
45
+ },
46
+ prev() {
47
+ const length = this.spec.childViews.length;
48
+ this.selectedIndex =
49
+ this.selectedIndex - 1 < 0 ? length - 1 : this.selectedIndex - 1;
50
+ }
51
+ }
52
+ };
53
+ </script>
54
+
55
+ <style scoped></style>
File without changes
File without changes
@@ -1,81 +1,81 @@
1
- <template>
2
- <div :class="cssClasses" :style="cssStyles">
3
- <template v-for="(item, index) in spec.childViews">
4
- <!--
5
- The wrapper prevents its content (e.g. image component) from getting stretched to fill
6
- remaining space on the new line.
7
- -->
8
- <div :key="index" :style="innerStyles">
9
- <ui-component :spec="item" />
10
- </div>
11
- </template>
12
- </div>
13
- </template>
14
-
15
- <script>
16
- export default {
17
- props: {
18
- spec: { type: Object, required: true }
19
- },
20
- computed: {
21
- cssClasses: function() {
22
- const classes = this.$classes().concat("layouts-flow");
23
- // switch(this.spec.distribution) {
24
- // case 'fillEqually':
25
- // classes.push('layouts-horizontal--fill-equally')
26
- // break
27
- // case 'spaceEqually':
28
- // classes.push('layouts-horizontal--space-equally')
29
- // break
30
- // }
31
- return classes;
32
- },
33
- cssStyles: function() {
34
- const styles = this.$styles();
35
- // switch(this.spec.align) {
36
- // case 'middle':
37
- // styles['align-items'] = 'center'
38
- // break
39
- // case 'bottom':
40
- // styles['align-items'] = 'flex-end'
41
- // break
42
- // default:
43
- // styles['align-items'] = 'flex-start'
44
- // }
45
- return styles;
46
- },
47
- innerStyles() {
48
- const styles = {};
49
- Utils.type.ifObject(this.spec.innerPadding, padding => {
50
- Utils.type.ifNumber(
51
- padding.top,
52
- top => (styles["padding-top"] = `${top}px`)
53
- );
54
- Utils.type.ifNumber(
55
- padding.bottom,
56
- bottom => (styles["padding-bottom"] = `${bottom}px`)
57
- );
58
- Utils.type.ifNumber(
59
- padding.left,
60
- left => (styles["padding-left"] = `${left}px`)
61
- );
62
- Utils.type.ifNumber(
63
- padding.right,
64
- right => (styles["padding-right"] = `${right}px`)
65
- );
66
- });
67
- return styles;
68
- }
69
- }
70
- };
71
- </script>
72
-
73
- <style lang="scss" scoped>
74
- .layouts-flow {
75
- display: flex;
76
- flex-wrap: wrap;
77
- }
78
- /* .layouts-horizontal > div {
79
- display: inline-block;
80
- } */
81
- </style>
1
+ <template>
2
+ <div :class="cssClasses" :style="cssStyles">
3
+ <template v-for="(item, index) in spec.childViews">
4
+ <!--
5
+ The wrapper prevents its content (e.g. image component) from getting stretched to fill
6
+ remaining space on the new line.
7
+ -->
8
+ <div :key="index" :style="innerStyles">
9
+ <ui-component :spec="item" />
10
+ </div>
11
+ </template>
12
+ </div>
13
+ </template>
14
+
15
+ <script>
16
+ export default {
17
+ props: {
18
+ spec: { type: Object, required: true }
19
+ },
20
+ computed: {
21
+ cssClasses: function() {
22
+ const classes = this.$classes().concat("layouts-flow");
23
+ // switch(this.spec.distribution) {
24
+ // case 'fillEqually':
25
+ // classes.push('layouts-horizontal--fill-equally')
26
+ // break
27
+ // case 'spaceEqually':
28
+ // classes.push('layouts-horizontal--space-equally')
29
+ // break
30
+ // }
31
+ return classes;
32
+ },
33
+ cssStyles: function() {
34
+ const styles = this.$styles();
35
+ // switch(this.spec.align) {
36
+ // case 'middle':
37
+ // styles['align-items'] = 'center'
38
+ // break
39
+ // case 'bottom':
40
+ // styles['align-items'] = 'flex-end'
41
+ // break
42
+ // default:
43
+ // styles['align-items'] = 'flex-start'
44
+ // }
45
+ return styles;
46
+ },
47
+ innerStyles() {
48
+ const styles = {};
49
+ Utils.type.ifObject(this.spec.innerPadding, padding => {
50
+ Utils.type.ifNumber(
51
+ padding.top,
52
+ top => (styles["padding-top"] = `${top}px`)
53
+ );
54
+ Utils.type.ifNumber(
55
+ padding.bottom,
56
+ bottom => (styles["padding-bottom"] = `${bottom}px`)
57
+ );
58
+ Utils.type.ifNumber(
59
+ padding.left,
60
+ left => (styles["padding-left"] = `${left}px`)
61
+ );
62
+ Utils.type.ifNumber(
63
+ padding.right,
64
+ right => (styles["padding-right"] = `${right}px`)
65
+ );
66
+ });
67
+ return styles;
68
+ }
69
+ }
70
+ };
71
+ </script>
72
+
73
+ <style lang="scss" scoped>
74
+ .layouts-flow {
75
+ display: flex;
76
+ flex-wrap: wrap;
77
+ }
78
+ /* .layouts-horizontal > div {
79
+ display: inline-block;
80
+ } */
81
+ </style>
@@ -1,130 +1,130 @@
1
- <template>
2
- <v-form
3
- ref="form"
4
- :style="parentStyles"
5
- :action="url"
6
- :method="spec.method"
7
- :data-local="spec.local"
8
- @submit="onSubmit"
9
- >
10
- <template v-for="(value, key, index) in params">
11
- <input
12
- :key="`hidden_${index}`"
13
- type="hidden"
14
- :name="key"
15
- :value="value"
16
- />
17
- </template>
18
-
19
- <panels-responsive :spec="modifiedSpec" />
20
- </v-form>
21
- </template>
22
-
23
- <script>
24
- // import ActionsFormsSubmit from "../../actions/forms/submit";
25
-
26
- export default {
27
- props: {
28
- spec: { type: Object, required: true }
29
- },
30
- data: () => ({
31
- url: null,
32
- params: null,
33
- parentStyles: {},
34
- formElement: null,
35
- submitButtons: [],
36
- modifiedSpec: {}
37
- }),
38
- watch: {
39
- $isBusy: function(val, oldVal) {
40
- for (const button of this.submitButtons) {
41
- button._isBusy = val;
42
- }
43
- }
44
- },
45
- methods: {
46
- $ready: function() {
47
- this.$onEvent("forms/addSubmit", e => {
48
- this.submitButtons.push(e.data);
49
- });
50
-
51
- this.$onEvent("forms/setBusy", e => {
52
- if (e.data.value) {
53
- Utils.http.startIndicator(this);
54
- } else {
55
- Utils.http.stopIndicator(this);
56
- }
57
- });
58
-
59
- this.$onEvent("forms/submit", e => {
60
- this.submit();
61
- });
62
-
63
- this.formElement = this.$refs.form.$el;
64
- this.parentStyles = this.genericStyles({ width: this.spec.width });
65
-
66
- const { url: url, params: params } = Utils.url.extractFormActionData(
67
- this.spec.url,
68
- this.spec.local
69
- );
70
- this.url = url;
71
- this.params = params;
72
-
73
- let firstAutoFocus = false;
74
- this.modifiedSpec = this.spec;
75
- this.modifiedSpec.childViews.map(childView => {
76
- if (
77
- childView.view.startsWith("fields/") &&
78
- childView.view !== "fields/hidden-v1" &&
79
- !firstAutoFocus
80
- ) {
81
- childView.autoFocus = true;
82
- firstAutoFocus = true;
83
- }
84
-
85
- return childView;
86
- });
87
- },
88
- onSubmit(event) {
89
- event.preventDefault();
90
- event.stopPropagation();
91
-
92
- this.submit();
93
- },
94
- submit() {
95
- if (this.$refs.form.validate()) {
96
- // Remove focus from current input field to avoid double submit if the user presses ENTER again.
97
- document.activeElement.blur();
98
-
99
- Utils.type.ifObject(
100
- this.spec.onSubmit,
101
- onSubmit => {
102
- const formData = Utils.url.toMap(new FormData(this.formElement));
103
- const params = {
104
- [this.spec.paramNameForFormData || "formData"]: formData
105
- };
106
- const data = Object.assign({}, onSubmit, params);
107
- GLib.action.execute(data, null, this);
108
- },
109
- () => {
110
- GLib.form.submitData(this.formElement, this);
111
- }
112
- );
113
- } else {
114
- Utils.launch.alert("Make sure all fields are valid");
115
- }
116
- },
117
- action_clear() {
118
- this.formElement.reset();
119
- }
120
- }
121
- };
122
- </script>
123
-
124
- <style scoped>
125
- /* .panels-form {
126
- display: flex;
127
- flex-direction: column;
128
- align-items: flex-start;
129
- } */
130
- </style>
1
+ <template>
2
+ <v-form
3
+ ref="form"
4
+ :style="parentStyles"
5
+ :action="url"
6
+ :method="spec.method"
7
+ :data-local="spec.local"
8
+ @submit="onSubmit"
9
+ >
10
+ <template v-for="(value, key, index) in params">
11
+ <input
12
+ :key="`hidden_${index}`"
13
+ type="hidden"
14
+ :name="key"
15
+ :value="value"
16
+ />
17
+ </template>
18
+
19
+ <panels-responsive :spec="modifiedSpec" />
20
+ </v-form>
21
+ </template>
22
+
23
+ <script>
24
+ // import ActionsFormsSubmit from "../../actions/forms/submit";
25
+
26
+ export default {
27
+ props: {
28
+ spec: { type: Object, required: true }
29
+ },
30
+ data: () => ({
31
+ url: null,
32
+ params: null,
33
+ parentStyles: {},
34
+ formElement: null,
35
+ submitButtons: [],
36
+ modifiedSpec: {}
37
+ }),
38
+ watch: {
39
+ $isBusy: function(val, oldVal) {
40
+ for (const button of this.submitButtons) {
41
+ button._isBusy = val;
42
+ }
43
+ }
44
+ },
45
+ methods: {
46
+ $ready: function() {
47
+ this.$onEvent("forms/addSubmit", e => {
48
+ this.submitButtons.push(e.data);
49
+ });
50
+
51
+ this.$onEvent("forms/setBusy", e => {
52
+ if (e.data.value) {
53
+ Utils.http.startIndicator(this);
54
+ } else {
55
+ Utils.http.stopIndicator(this);
56
+ }
57
+ });
58
+
59
+ this.$onEvent("forms/submit", e => {
60
+ this.submit();
61
+ });
62
+
63
+ this.formElement = this.$refs.form.$el;
64
+ this.parentStyles = this.genericStyles({ width: this.spec.width });
65
+
66
+ const { url: url, params: params } = Utils.url.extractFormActionData(
67
+ this.spec.url,
68
+ this.spec.local
69
+ );
70
+ this.url = url;
71
+ this.params = params;
72
+
73
+ let firstAutoFocus = false;
74
+ this.modifiedSpec = this.spec;
75
+ this.modifiedSpec.childViews.map(childView => {
76
+ if (
77
+ childView.view.startsWith("fields/") &&
78
+ childView.view !== "fields/hidden-v1" &&
79
+ !firstAutoFocus
80
+ ) {
81
+ childView.autoFocus = true;
82
+ firstAutoFocus = true;
83
+ }
84
+
85
+ return childView;
86
+ });
87
+ },
88
+ onSubmit(event) {
89
+ event.preventDefault();
90
+ event.stopPropagation();
91
+
92
+ this.submit();
93
+ },
94
+ submit() {
95
+ if (this.$refs.form.validate()) {
96
+ // Remove focus from current input field to avoid double submit if the user presses ENTER again.
97
+ document.activeElement.blur();
98
+
99
+ Utils.type.ifObject(
100
+ this.spec.onSubmit,
101
+ onSubmit => {
102
+ const formData = Utils.url.toMap(new FormData(this.formElement));
103
+ const params = {
104
+ [this.spec.paramNameForFormData || "formData"]: formData
105
+ };
106
+ const data = Object.assign({}, onSubmit, params);
107
+ GLib.action.execute(data, null, this);
108
+ },
109
+ () => {
110
+ GLib.form.submitData(this.formElement, this);
111
+ }
112
+ );
113
+ } else {
114
+ Utils.launch.alert("Make sure all fields are valid");
115
+ }
116
+ },
117
+ action_clear() {
118
+ this.formElement.reset();
119
+ }
120
+ }
121
+ };
122
+ </script>
123
+
124
+ <style scoped>
125
+ /* .panels-form {
126
+ display: flex;
127
+ flex-direction: column;
128
+ align-items: flex-start;
129
+ } */
130
+ </style>
File without changes