glib-web 0.5.77 → 0.5.78

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 (130) hide show
  1. package/README.md +0 -0
  2. package/action.js +167 -167
  3. package/actions/analytics/logEvent.js +0 -0
  4. package/actions/cables/push.js +0 -0
  5. package/actions/dialogs/notification.js +0 -0
  6. package/actions/http/patch.js +0 -0
  7. package/actions/panels/scrollTo.js +18 -18
  8. package/actions/panels/scrollToBottom.js +0 -0
  9. package/actions/timeouts/set.js +20 -20
  10. package/actions/windows/close.js +0 -0
  11. package/actions/windows/closeAll.js +0 -0
  12. package/actions/windows/closeWithReload.js +0 -0
  13. package/actions/windows/refreshState.js +5 -5
  14. package/actions/windows/reload.js +0 -0
  15. package/actions/ws/push.js +0 -0
  16. package/app.vue +180 -180
  17. package/components/_button.vue +101 -101
  18. package/components/_dropdownMenu.vue +76 -76
  19. package/components/_icon.vue +50 -50
  20. package/components/avatar.vue +16 -16
  21. package/components/banners/alert.vue +0 -0
  22. package/components/banners/select.vue +82 -82
  23. package/components/component.vue +222 -222
  24. package/components/fields/_patternText.vue +61 -61
  25. package/components/fields/_select.vue +86 -86
  26. package/components/fields/autocomplete.vue +73 -73
  27. package/components/fields/check.vue +104 -104
  28. package/components/fields/creditCard.vue +0 -0
  29. package/components/fields/dynamicGroup.vue +0 -0
  30. package/components/fields/hidden.vue +0 -0
  31. package/components/fields/location.vue +0 -0
  32. package/components/fields/newRichText.vue +0 -0
  33. package/components/fields/phone/countries.js +315 -315
  34. package/components/fields/phone/field.vue +348 -348
  35. package/components/fields/phone/sprite.css +1071 -1071
  36. package/components/fields/radio.vue +64 -64
  37. package/components/fields/radioGroup.vue +0 -0
  38. package/components/fields/rating.vue +0 -0
  39. package/components/fields/richText.vue +0 -0
  40. package/components/fields/select.vue +17 -17
  41. package/components/fields/stripe/stripeFields.vue +93 -93
  42. package/components/fields/stripe/stripeIndividualFields.vue +207 -207
  43. package/components/fields/stripeExternalAccount.vue +135 -135
  44. package/components/fields/text.vue +0 -0
  45. package/components/fields/textarea.vue +0 -0
  46. package/components/fields/timeZone.vue +22 -22
  47. package/components/fields/timer.vue +83 -83
  48. package/components/h1.vue +28 -28
  49. package/components/h2.vue +20 -20
  50. package/components/h3.vue +22 -22
  51. package/components/h4.vue +20 -20
  52. package/components/h5.vue +20 -20
  53. package/components/h6.vue +20 -20
  54. package/components/icon.vue +25 -25
  55. package/components/label.vue +62 -62
  56. package/components/map.vue +0 -0
  57. package/components/mixins/events.js +178 -178
  58. package/components/mixins/generic.js +0 -0
  59. package/components/mixins/list/autoload.js +0 -0
  60. package/components/mixins/styles.js +221 -221
  61. package/components/mixins/table/autoload.js +0 -0
  62. package/components/mixins/text.js +20 -20
  63. package/components/mixins/ws/actionCable.js +48 -48
  64. package/components/mixins/ws/phoenixSocket.js +0 -0
  65. package/components/panels/carousel.vue +55 -55
  66. package/components/panels/flow.vue +81 -81
  67. package/components/panels/form.vue +126 -126
  68. package/components/panels/list.vue +0 -0
  69. package/components/panels/scroll.vue +0 -0
  70. package/components/panels/table.vue +0 -0
  71. package/components/panels/ul.vue +34 -34
  72. package/components/panels/vertical.vue +0 -0
  73. package/components/panels/web.vue +11 -11
  74. package/components/spacer.vue +0 -0
  75. package/components/switch.vue +42 -42
  76. package/extensions/string.js +21 -21
  77. package/index.js +195 -195
  78. package/nav/content.vue +0 -0
  79. package/nav/dialog.vue +127 -127
  80. package/nav/snackbar.vue +0 -0
  81. package/package.json +42 -42
  82. package/static/plugins/alignment/alignment.js +0 -0
  83. package/static/plugins/alignment/alignment.min.js +0 -0
  84. package/static/plugins/beyondgrammar/beyondgrammar.js +0 -0
  85. package/static/plugins/beyondgrammar/beyondgrammar.min.js +0 -0
  86. package/static/plugins/blockcode/blockcode.js +0 -0
  87. package/static/plugins/blockcode/blockcode.min.js +0 -0
  88. package/static/plugins/clips/clips.js +0 -0
  89. package/static/plugins/clips/clips.min.js +0 -0
  90. package/static/plugins/counter/counter.js +0 -0
  91. package/static/plugins/counter/counter.min.js +0 -0
  92. package/static/plugins/definedlinks/definedlinks.js +0 -0
  93. package/static/plugins/definedlinks/definedlinks.min.js +0 -0
  94. package/static/plugins/handle/handle.js +0 -0
  95. package/static/plugins/handle/handle.min.js +0 -0
  96. package/static/plugins/icons/icons.js +0 -0
  97. package/static/plugins/icons/icons.min.js +0 -0
  98. package/static/plugins/imageposition/imageposition.js +0 -0
  99. package/static/plugins/imageposition/imageposition.min.js +0 -0
  100. package/static/plugins/inlineformat/inlineformat.js +0 -0
  101. package/static/plugins/inlineformat/inlineformat.min.js +0 -0
  102. package/static/plugins/removeformat/removeformat.js +0 -0
  103. package/static/plugins/removeformat/removeformat.min.js +0 -0
  104. package/static/plugins/selector/selector.js +0 -0
  105. package/static/plugins/selector/selector.min.js +0 -0
  106. package/static/plugins/specialchars/specialchars.js +0 -0
  107. package/static/plugins/specialchars/specialchars.min.js +0 -0
  108. package/static/plugins/textdirection/textdirection.js +0 -0
  109. package/static/plugins/textdirection/textdirection.min.js +0 -0
  110. package/static/plugins/textexpander/textexpander.js +0 -0
  111. package/static/plugins/textexpander/textexpander.min.js +0 -0
  112. package/static/plugins/underline/underline.js +0 -0
  113. package/static/plugins/underline/underline.min.js +0 -0
  114. package/static/redactorx.css +0 -0
  115. package/static/redactorx.js +0 -0
  116. package/static/redactorx.min.css +0 -0
  117. package/static/redactorx.min.js +0 -0
  118. package/static/redactorx.usm.min.js +0 -0
  119. package/templates/_menu.vue +38 -38
  120. package/templates/comment.vue +202 -202
  121. package/templates/featured.vue +32 -32
  122. package/templates/thumbnail.vue +138 -138
  123. package/templates/unsupported.vue +12 -12
  124. package/utils/app.js +0 -0
  125. package/utils/hash.js +0 -0
  126. package/utils/helper.js +0 -0
  127. package/utils/history.js +70 -70
  128. package/utils/http.js +209 -209
  129. package/utils/launch.js +135 -135
  130. package/utils/private/ws.js +0 -0
package/utils/http.js CHANGED
@@ -1,209 +1,209 @@
1
- import Type from "./type";
2
- import Action from "../action";
3
-
4
- let loading = false;
5
-
6
- class HttpRequest {
7
- constructor() {
8
- this.controller = new AbortController();
9
- this.canceled = false;
10
- }
11
-
12
- cancel() {
13
- this.canceled = true;
14
- this.controller.abort();
15
- }
16
- }
17
-
18
- export default class {
19
- static _extractFormData(properties, needCsrfToken) {
20
- // if (properties["formDataEncoded"]) {
21
- // return properties["formData"];
22
- // }
23
-
24
- const data = properties.formData;
25
- if (data instanceof FormData) {
26
- return data;
27
- }
28
-
29
- const formData = new FormData();
30
- var params = data || {};
31
- for (const key in params) {
32
- formData.append(key, params[key]);
33
- }
34
-
35
- if (needCsrfToken && !Type.isString(params["authenticity_token"])) {
36
- formData.append("authenticity_token", Utils.dom.getCsrf());
37
- }
38
- return formData;
39
- }
40
-
41
- static load(properties, target, component) {
42
- const url = new URL(properties["url"]);
43
- const domainMatched = window.location.hostname == url.hostname;
44
- if (Utils.settings.reactive && domainMatched) {
45
- const currentUrl = window.location.href;
46
- const htmlUrl = Utils.url.htmlUrl(properties["url"]);
47
-
48
- Utils.http.execute(properties, "GET", component, (data, response) => {
49
- if (htmlUrl !== currentUrl) {
50
- const redirectUrl = Utils.url.htmlUrl(response.url);
51
- Utils.history.pushPage(data, redirectUrl);
52
- }
53
-
54
- this.forceComponentUpdate(() => {
55
- Utils.history.resetScroll();
56
- window.vueApp.page = data;
57
- Action.execute(properties["onOpen"], target, component);
58
- });
59
- });
60
- } else {
61
- window.location = Utils.url.htmlUrl(properties["url"]);
62
- }
63
- }
64
-
65
- static analyticsHeaders(component) {
66
- const pageAnalytics =
67
- window.vueApp.temp.analytics || window.vueApp.page.analytics || {};
68
- const featureAnalytics = pageAnalytics.feature;
69
-
70
- const headers = {};
71
- if (featureAnalytics) {
72
- const componentAnalytics = component.spec.analytics || {};
73
- if (componentAnalytics.disabled) {
74
- return headers;
75
- }
76
-
77
- Utils.type.ifString(
78
- componentAnalytics.group || featureAnalytics.group,
79
- value => (headers["GApp-Analytics-Referer-Group"] = value)
80
- );
81
-
82
- Utils.type.ifString(
83
- componentAnalytics.action || featureAnalytics.action,
84
- value => (headers["GApp-Analytics-Referer-Action"] = value)
85
- );
86
-
87
- Utils.type.ifString(
88
- componentAnalytics.segment || featureAnalytics.segment,
89
- value => (headers["GApp-Analytics-Referer-Segment"] = value)
90
- );
91
-
92
- Utils.type.ifString(
93
- componentAnalytics.placement,
94
- value => (headers["GApp-Analytics-Referer-Placement"] = value)
95
- );
96
- }
97
- return headers;
98
- }
99
-
100
- static reload(properties, component) {
101
- const currentUrl = window.location.href;
102
- const data = {
103
- url: properties.url || currentUrl
104
- };
105
-
106
- Utils.http.execute(data, "GET", component, (page, response) => {
107
- Utils.http.forceComponentUpdate(() => {
108
- window.vueApp.page = page;
109
- const redirectUrl = Utils.url.htmlUrl(response.url);
110
- Utils.history.updatePage(redirectUrl);
111
-
112
- GLib.action.execute(properties["onReload"], null, component);
113
- });
114
- });
115
- }
116
-
117
- static execute(properties, methodName, component, jsonHandler) {
118
- this.startIndicator(component);
119
-
120
- // `fetch()` only supports uppercase
121
- const method = methodName.toUpperCase();
122
- let url = Utils.url.jsonUrl(properties["url"]);
123
- let body = this._extractFormData(properties, method !== "GET");
124
- if (method === "GET") {
125
- url = Utils.url.appendParams(url, body);
126
- body = null;
127
- }
128
- console.log(`${method} ${url}`);
129
-
130
- const request = new HttpRequest();
131
- let response = null;
132
- const vm = this;
133
-
134
- const analyticsHeaders = this.analyticsHeaders(component);
135
-
136
- fetch(url, {
137
- method: method,
138
- body: body,
139
- headers: Object.assign({ Accept: "text/html" }, analyticsHeaders),
140
- // Make sure to pass cookies for same origin URLs.
141
- // Needed for some browsers, e.g. Edge and Android's native.
142
- credentials: "same-origin",
143
- signal: request.controller.signal
144
- })
145
- .then(res => {
146
- vm.stopIndicator(component);
147
-
148
- if (res.status >= 500) {
149
- throw "Server error";
150
- } else if (res.status >= 400) {
151
- throw "Not accessible";
152
- } else {
153
- response = res;
154
- return res.json();
155
- }
156
- })
157
- .then(data => {
158
- console.debug("Success", data);
159
- jsonHandler(data, response);
160
- })
161
- .catch(error => {
162
- vm.stopIndicator(component);
163
- if (!request.canceled) {
164
- console.error("Error:", error);
165
- Utils.launch.snackbar.error(error);
166
- } else {
167
- console.info("Canceled");
168
- }
169
- });
170
-
171
- return request;
172
- }
173
-
174
- static startIndicator(component) {
175
- this._showIndicator();
176
- component.$data._isBusy = true;
177
- }
178
-
179
- static stopIndicator(component) {
180
- this._hideIndicator();
181
- component.$data._isBusy = false;
182
- }
183
-
184
- static _showIndicator() {
185
- loading = true;
186
- setTimeout(() => {
187
- if (loading) {
188
- loading = false;
189
- window.vueApp.indicator = true;
190
- }
191
- }, 200);
192
- }
193
-
194
- static _hideIndicator() {
195
- loading = false;
196
- window.vueApp.indicator = false;
197
- }
198
-
199
- // See generic.js
200
- static forceComponentUpdate(handler) {
201
- window.vueApp.isStale = true;
202
-
203
- // Queue the execution so the first isStale has time to resets state before handler gets executed
204
- setTimeout(() => {
205
- handler();
206
- window.vueApp.isStale = false;
207
- }, 0);
208
- }
209
- }
1
+ import Type from "./type";
2
+ import Action from "../action";
3
+
4
+ let loading = false;
5
+
6
+ class HttpRequest {
7
+ constructor() {
8
+ this.controller = new AbortController();
9
+ this.canceled = false;
10
+ }
11
+
12
+ cancel() {
13
+ this.canceled = true;
14
+ this.controller.abort();
15
+ }
16
+ }
17
+
18
+ export default class {
19
+ static _extractFormData(properties, needCsrfToken) {
20
+ // if (properties["formDataEncoded"]) {
21
+ // return properties["formData"];
22
+ // }
23
+
24
+ const data = properties.formData;
25
+ if (data instanceof FormData) {
26
+ return data;
27
+ }
28
+
29
+ const formData = new FormData();
30
+ var params = data || {};
31
+ for (const key in params) {
32
+ formData.append(key, params[key]);
33
+ }
34
+
35
+ if (needCsrfToken && !Type.isString(params["authenticity_token"])) {
36
+ formData.append("authenticity_token", Utils.dom.getCsrf());
37
+ }
38
+ return formData;
39
+ }
40
+
41
+ static load(properties, target, component) {
42
+ const url = new URL(properties["url"]);
43
+ const domainMatched = window.location.hostname == url.hostname;
44
+ if (Utils.settings.reactive && domainMatched) {
45
+ const currentUrl = window.location.href;
46
+ const htmlUrl = Utils.url.htmlUrl(properties["url"]);
47
+
48
+ Utils.http.execute(properties, "GET", component, (data, response) => {
49
+ if (htmlUrl !== currentUrl) {
50
+ const redirectUrl = Utils.url.htmlUrl(response.url);
51
+ Utils.history.pushPage(data, redirectUrl);
52
+ }
53
+
54
+ this.forceComponentUpdate(() => {
55
+ Utils.history.resetScroll();
56
+ window.vueApp.page = data;
57
+ Action.execute(properties["onOpen"], target, component);
58
+ });
59
+ });
60
+ } else {
61
+ window.location = Utils.url.htmlUrl(properties["url"]);
62
+ }
63
+ }
64
+
65
+ static analyticsHeaders(component) {
66
+ const pageAnalytics =
67
+ window.vueApp.temp.analytics || window.vueApp.page.analytics || {};
68
+ const featureAnalytics = pageAnalytics.feature;
69
+
70
+ const headers = {};
71
+ if (featureAnalytics) {
72
+ const componentAnalytics = component.spec.analytics || {};
73
+ if (componentAnalytics.disabled) {
74
+ return headers;
75
+ }
76
+
77
+ Utils.type.ifString(
78
+ componentAnalytics.group || featureAnalytics.group,
79
+ value => (headers["GApp-Analytics-Referer-Group"] = value)
80
+ );
81
+
82
+ Utils.type.ifString(
83
+ componentAnalytics.action || featureAnalytics.action,
84
+ value => (headers["GApp-Analytics-Referer-Action"] = value)
85
+ );
86
+
87
+ Utils.type.ifString(
88
+ componentAnalytics.segment || featureAnalytics.segment,
89
+ value => (headers["GApp-Analytics-Referer-Segment"] = value)
90
+ );
91
+
92
+ Utils.type.ifString(
93
+ componentAnalytics.placement,
94
+ value => (headers["GApp-Analytics-Referer-Placement"] = value)
95
+ );
96
+ }
97
+ return headers;
98
+ }
99
+
100
+ static reload(properties, component) {
101
+ const currentUrl = window.location.href;
102
+ const data = {
103
+ url: properties.url || currentUrl
104
+ };
105
+
106
+ Utils.http.execute(data, "GET", component, (page, response) => {
107
+ Utils.http.forceComponentUpdate(() => {
108
+ window.vueApp.page = page;
109
+ const redirectUrl = Utils.url.htmlUrl(response.url);
110
+ Utils.history.updatePage(redirectUrl);
111
+
112
+ GLib.action.execute(properties["onReload"], null, component);
113
+ });
114
+ });
115
+ }
116
+
117
+ static execute(properties, methodName, component, jsonHandler) {
118
+ this.startIndicator(component);
119
+
120
+ // `fetch()` only supports uppercase
121
+ const method = methodName.toUpperCase();
122
+ let url = Utils.url.jsonUrl(properties["url"]);
123
+ let body = this._extractFormData(properties, method !== "GET");
124
+ if (method === "GET") {
125
+ url = Utils.url.appendParams(url, body);
126
+ body = null;
127
+ }
128
+ console.log(`${method} ${url}`);
129
+
130
+ const request = new HttpRequest();
131
+ let response = null;
132
+ const vm = this;
133
+
134
+ const analyticsHeaders = this.analyticsHeaders(component);
135
+
136
+ fetch(url, {
137
+ method: method,
138
+ body: body,
139
+ headers: Object.assign({ Accept: "text/html" }, analyticsHeaders),
140
+ // Make sure to pass cookies for same origin URLs.
141
+ // Needed for some browsers, e.g. Edge and Android's native.
142
+ credentials: "same-origin",
143
+ signal: request.controller.signal
144
+ })
145
+ .then(res => {
146
+ vm.stopIndicator(component);
147
+
148
+ if (res.status >= 500) {
149
+ throw "Server error";
150
+ } else if (res.status >= 400) {
151
+ throw "Not accessible";
152
+ } else {
153
+ response = res;
154
+ return res.json();
155
+ }
156
+ })
157
+ .then(data => {
158
+ console.debug("Success", data);
159
+ jsonHandler(data, response);
160
+ })
161
+ .catch(error => {
162
+ vm.stopIndicator(component);
163
+ if (!request.canceled) {
164
+ console.error("Error:", error);
165
+ Utils.launch.snackbar.error(error);
166
+ } else {
167
+ console.info("Canceled");
168
+ }
169
+ });
170
+
171
+ return request;
172
+ }
173
+
174
+ static startIndicator(component) {
175
+ this._showIndicator();
176
+ component.$data._isBusy = true;
177
+ }
178
+
179
+ static stopIndicator(component) {
180
+ this._hideIndicator();
181
+ component.$data._isBusy = false;
182
+ }
183
+
184
+ static _showIndicator() {
185
+ loading = true;
186
+ setTimeout(() => {
187
+ if (loading) {
188
+ loading = false;
189
+ window.vueApp.indicator = true;
190
+ }
191
+ }, 200);
192
+ }
193
+
194
+ static _hideIndicator() {
195
+ loading = false;
196
+ window.vueApp.indicator = false;
197
+ }
198
+
199
+ // See generic.js
200
+ static forceComponentUpdate(handler) {
201
+ window.vueApp.isStale = true;
202
+
203
+ // Queue the execution so the first isStale has time to resets state before handler gets executed
204
+ setTimeout(() => {
205
+ handler();
206
+ window.vueApp.isStale = false;
207
+ }, 0);
208
+ }
209
+ }
package/utils/launch.js CHANGED
@@ -1,135 +1,135 @@
1
- import Vue from "vue";
2
- import Dialog from "../nav/dialog";
3
- import Sheet from "../nav/sheet";
4
- import Snackbar from "../nav/snackbar";
5
- import Vuetify from "vuetify";
6
-
7
- export default class {
8
- static dialog(properties, target) {
9
- if (!this.stack) {
10
- this.stack = [];
11
- }
12
-
13
- // https://css-tricks.com/creating-vue-js-component-instances-programmatically/
14
- const DialogClass = Vue.extend(Dialog);
15
- const instance = new DialogClass({
16
- vuetify: new Vuetify({
17
- theme: {
18
- themes: Utils.settings.themes
19
- }
20
- }),
21
- propsData: {
22
- spec: properties,
23
- stack: this.stack,
24
- target: target,
25
- vueApp: window.vueApp
26
- }
27
- });
28
- // instance.stack = this.stack;
29
-
30
- const placeholder = document.body.appendChild(
31
- document.createElement("div")
32
- );
33
- instance.$mount(placeholder);
34
- }
35
-
36
- static closeDialog(properties, target, component) {
37
- if (!this.stack) {
38
- this.stack = [];
39
- }
40
-
41
- Utils.type.ifObject(this.stack.last(), dialog => {
42
- dialog.close();
43
- });
44
-
45
- Utils.type.ifObject(properties["onClose"], it => {
46
- Action.execute(it, target, component);
47
- });
48
- }
49
-
50
- static get sheet() {
51
- return LaunchSheet;
52
- }
53
-
54
- static get snackbar() {
55
- return LaunchSnackbar;
56
- }
57
-
58
- static alert(message, target) {
59
- const properties = {
60
- message: message
61
- };
62
- const spec = Object.assign({}, properties, {
63
- buttons: [
64
- {
65
- text: "OK",
66
- onClick: properties.onClose
67
- }
68
- ]
69
- });
70
- this.dialog(spec, target);
71
- }
72
- }
73
-
74
- class LaunchSheet {
75
- static open(properties) {
76
- const SheetClass = Vue.extend(Sheet);
77
- const instance = new SheetClass({
78
- vuetify: new Vuetify({
79
- theme: {
80
- themes: Utils.settings.themes
81
- }
82
- }),
83
- propsData: { spec: properties }
84
- });
85
- const placeholder = document.body.appendChild(
86
- document.createElement("div")
87
- );
88
- instance.$mount(placeholder);
89
- // instance.show = true
90
- return instance;
91
- }
92
-
93
- static confirm(properties, onConfirm) {
94
- const spec = Object.assign({}, properties, {
95
- buttons: [
96
- {
97
- text: "Confirm",
98
- onClickFunction: onConfirm
99
- }
100
- ]
101
- });
102
- this.open(spec);
103
- }
104
-
105
- static alert(message, buttons) {
106
- const spec = { message: message, buttons: buttons };
107
- this.open(spec);
108
- }
109
- }
110
-
111
- class LaunchSnackbar {
112
- static open(properties) {
113
- const SnackbarClass = Vue.extend(Snackbar);
114
- const instance = new SnackbarClass({
115
- vuetify: window.vueApp.vuetify,
116
- propsData: { spec: properties, vueApp: window.vueApp }
117
- });
118
-
119
- const placeholder = document.body.appendChild(
120
- document.createElement("div")
121
- );
122
- instance.$mount(placeholder);
123
- instance.show = true;
124
- return instance;
125
- }
126
-
127
- static error(message) {
128
- this.open({ message: message, styleClasses: ["error"] });
129
- }
130
-
131
- static indicator(message) {
132
- const instance = this.open({ message: message, timeout: -1 });
133
- instance.indicator = true;
134
- }
135
- }
1
+ import Vue from "vue";
2
+ import Dialog from "../nav/dialog";
3
+ import Sheet from "../nav/sheet";
4
+ import Snackbar from "../nav/snackbar";
5
+ import Vuetify from "vuetify";
6
+
7
+ export default class {
8
+ static dialog(properties, target) {
9
+ if (!this.stack) {
10
+ this.stack = [];
11
+ }
12
+
13
+ // https://css-tricks.com/creating-vue-js-component-instances-programmatically/
14
+ const DialogClass = Vue.extend(Dialog);
15
+ const instance = new DialogClass({
16
+ vuetify: new Vuetify({
17
+ theme: {
18
+ themes: Utils.settings.themes
19
+ }
20
+ }),
21
+ propsData: {
22
+ spec: properties,
23
+ stack: this.stack,
24
+ target: target,
25
+ vueApp: window.vueApp
26
+ }
27
+ });
28
+ // instance.stack = this.stack;
29
+
30
+ const placeholder = document.body.appendChild(
31
+ document.createElement("div")
32
+ );
33
+ instance.$mount(placeholder);
34
+ }
35
+
36
+ static closeDialog(properties, target, component) {
37
+ if (!this.stack) {
38
+ this.stack = [];
39
+ }
40
+
41
+ Utils.type.ifObject(this.stack.last(), dialog => {
42
+ dialog.close();
43
+ });
44
+
45
+ Utils.type.ifObject(properties["onClose"], it => {
46
+ Action.execute(it, target, component);
47
+ });
48
+ }
49
+
50
+ static get sheet() {
51
+ return LaunchSheet;
52
+ }
53
+
54
+ static get snackbar() {
55
+ return LaunchSnackbar;
56
+ }
57
+
58
+ static alert(message, target) {
59
+ const properties = {
60
+ message: message
61
+ };
62
+ const spec = Object.assign({}, properties, {
63
+ buttons: [
64
+ {
65
+ text: "OK",
66
+ onClick: properties.onClose
67
+ }
68
+ ]
69
+ });
70
+ this.dialog(spec, target);
71
+ }
72
+ }
73
+
74
+ class LaunchSheet {
75
+ static open(properties) {
76
+ const SheetClass = Vue.extend(Sheet);
77
+ const instance = new SheetClass({
78
+ vuetify: new Vuetify({
79
+ theme: {
80
+ themes: Utils.settings.themes
81
+ }
82
+ }),
83
+ propsData: { spec: properties }
84
+ });
85
+ const placeholder = document.body.appendChild(
86
+ document.createElement("div")
87
+ );
88
+ instance.$mount(placeholder);
89
+ // instance.show = true
90
+ return instance;
91
+ }
92
+
93
+ static confirm(properties, onConfirm) {
94
+ const spec = Object.assign({}, properties, {
95
+ buttons: [
96
+ {
97
+ text: "Confirm",
98
+ onClickFunction: onConfirm
99
+ }
100
+ ]
101
+ });
102
+ this.open(spec);
103
+ }
104
+
105
+ static alert(message, buttons) {
106
+ const spec = { message: message, buttons: buttons };
107
+ this.open(spec);
108
+ }
109
+ }
110
+
111
+ class LaunchSnackbar {
112
+ static open(properties) {
113
+ const SnackbarClass = Vue.extend(Snackbar);
114
+ const instance = new SnackbarClass({
115
+ vuetify: window.vueApp.vuetify,
116
+ propsData: { spec: properties, vueApp: window.vueApp }
117
+ });
118
+
119
+ const placeholder = document.body.appendChild(
120
+ document.createElement("div")
121
+ );
122
+ instance.$mount(placeholder);
123
+ instance.show = true;
124
+ return instance;
125
+ }
126
+
127
+ static error(message) {
128
+ this.open({ message: message, styleClasses: ["error"] });
129
+ }
130
+
131
+ static indicator(message) {
132
+ const instance = this.open({ message: message, timeout: -1 });
133
+ instance.indicator = true;
134
+ }
135
+ }