matestack-ui-core 0.7.4 → 0.7.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e645c4e03f7a9cbc1104d1d84b20c108125a384534dc3da249aad457fa7974a7
4
- data.tar.gz: c6bb027cd246f3ad8ca3ce317362b9437e09a88fe8fcc7ce61e8c2e2909e0033
3
+ metadata.gz: 3b08e2fe0f19b178aa377ca1cac852e56f5faee7abdf5ec08f0738c1c11c5b59
4
+ data.tar.gz: b79c9bc5a5609a50b274a83103c23bc659cca9ae582b49c931b34c2921f723f0
5
5
  SHA512:
6
- metadata.gz: a13177effcfb1a6d26f7cb920f71a10dee6946c0d7a2c8d3dc09d4c18651c642e62bbf79f7793e4ae9e36cfbcd9ac645e7ab8c7fabea611d27930ae17c7aa628
7
- data.tar.gz: 3896719f9b477a9745fd2cec800669dcb8257e21f87f2bc8fd10d7f26ca79610e77caaa04642c571e6a2ded10e64270a2d6f862d9f5a03c74d8a8e2a6bbcdc9d
6
+ metadata.gz: 668b12bb85128ca1cd306e256fa8e75159f1e1f62edc7af46807fcb2537ea090ac9aeafab3fddfc5f437e76dfcb522c3db4fb01997165795811770e0d16b216d
7
+ data.tar.gz: 1bac122005918a5c46b5526e3d619ddf9fd1371e15b664e6c5c64293656d1f2c9706f5fbbfb369eb355e875fe38f2e4f68f9165dc788661aa41ae0f1ac47a72c
@@ -10,12 +10,20 @@ const componentDef = {
10
10
  },
11
11
  computed: Vuex.mapState({
12
12
  asyncTemplate: state => state.pageTemplate,
13
+ currentPathName: state => state.currentPathName,
14
+ currentSearch: state => state.currentSearch,
15
+ currentOrigin: state => state.currentOrigin,
13
16
  }),
14
17
  mounted: function(){
18
+ const self = this;
15
19
  window.onpopstate = (event) => {
16
- if (isNavigatingToAnotherPage(document.location, event)) {
17
- this.$store.dispatch("navigateTo", {url: document.location.pathname, backwards: true} );
18
- };
20
+ if (isNavigatingToAnotherPage({
21
+ origin: self.currentOrigin,
22
+ pathName: self.currentPathName,
23
+ search: self.currentSearch
24
+ }, document.location)){
25
+ self.$store.dispatch("navigateTo", {url: document.location.pathname, backwards: true} );
26
+ }
19
27
  }
20
28
  },
21
29
  components: {
@@ -1,8 +1,7 @@
1
- const isNavigatingToAnotherPage = function(currentLocation, popstateEvent) {
2
- const targetLocation = popstateEvent.target.location;
1
+ const isNavigatingToAnotherPage = function(currentLocation, targetLocation) {
3
2
 
4
3
  // omits hash by design
5
- return currentLocation.pathname !== targetLocation.pathname ||
4
+ return currentLocation.pathName !== targetLocation.pathname ||
6
5
  currentLocation.origin !== targetLocation.origin ||
7
6
  currentLocation.search !== targetLocation.search
8
7
  }
@@ -8,14 +8,21 @@ Vue.use(Vuex)
8
8
  const store = new Vuex.Store({
9
9
  state: {
10
10
  pageTemplate: null,
11
- currentPath: document.location.pathname
11
+ currentPathName: document.location.pathname,
12
+ currentSearch: document.location.search,
13
+ currentOrigin: document.location.origin
12
14
  },
13
15
  mutations: {
14
16
  setPageTemplate (state, serverResponse){
15
17
  state.pageTemplate = serverResponse
16
18
  },
17
- setCurrentPath (state, path){
18
- state.currentPath = path
19
+ setCurrentLocation (state, current){
20
+ state.currentPathName = current.path
21
+ state.currentSearch = current.search
22
+ state.currentOrigin = current.origin
23
+ },
24
+ resetPageTemplate (state) {
25
+ state.pageTemplate = null;
19
26
  }
20
27
  },
21
28
  actions: {
@@ -46,7 +53,7 @@ const store = new Vuex.Store({
46
53
  setTimeout(function () {
47
54
  resolve(response["data"])
48
55
  commit('setPageTemplate', response["data"])
49
- commit('setCurrentPath', url)
56
+ commit('setCurrentLocation', { path: url, search: document.location.search, origin: document.location.origin })
50
57
  matestackEventHub.$emit("page_loaded", url);
51
58
  if (typeof matestackUiCoreTransitionSuccess !== 'undefined') {
52
59
  matestackUiCoreTransitionSuccess(url);
@@ -0,0 +1,3 @@
1
+ %datalist{@tag_attributes}
2
+ - if block_given?
3
+ = yield
@@ -0,0 +1,5 @@
1
+ module Matestack::Ui::Core::Datalist
2
+ class Datalist < Matestack::Ui::Core::Component::Static
3
+
4
+ end
5
+ end
@@ -137,7 +137,7 @@ const componentDef = {
137
137
  && self.componentConfig["success"]["transition"]["follow_response"] === true
138
138
  && self.$store != undefined
139
139
  ) {
140
- let path = response.data["transition_to"]
140
+ let path = response.data["transition_to"] || response.request.responseURL
141
141
  self.$store.dispatch('navigateTo', {url: path, backwards: false})
142
142
  return;
143
143
  }
@@ -1,27 +1,38 @@
1
- - if options[:label]
2
- %label=options[:label]
1
+ - if label
2
+ %label=label
3
3
 
4
- - if [:text, :number, :email, :date, :password].include?(options[:type])
5
- %input{@tag_attributes,
6
- "v-model#{'.number' if options[:type] == :number}": input_key,
7
- type: options[:type],
4
+ - if [:text, :number, :email, :date, :password].include?(type)
5
+ %input{ @tag_attributes,
6
+ "v-model#{'.number' if type == :number}": input_key,
7
+ type: type,
8
8
  "@change": "inputChanged(\"#{attr_key}\")",
9
9
  ref: "input.#{attr_key}",
10
- placeholder: options[:placeholder],
11
- "init-value": init_value}
12
- %span{class: "errors", "v-if": error_key }
13
- %span{class: "error", "v-for": "error in #{error_key}"}
14
- {{ error }}
10
+ placeholder: placeholder,
11
+ "init-value": init_value }
15
12
 
16
- - if options[:type] == :textarea
17
- %textarea{@tag_attributes,
13
+ - if type == :textarea
14
+ %textarea{ @tag_attributes,
18
15
  "v-model": input_key,
19
16
  "@change": "inputChanged(\"#{attr_key}\")",
20
17
  ref: "input.#{attr_key}",
21
- placeholder: options[:placeholder],
18
+ placeholder: placeholder,
22
19
  "init-value": init_value,
23
20
  rows: options[:rows],
24
- cols: options[:cols]}
25
- %span{class: "errors", "v-if": error_key }
26
- %span{class: "error", "v-for": "error in #{error_key}"}
27
- {{ error }}
21
+ cols: options[:cols] }
22
+
23
+ - if type == :range
24
+ %input{ @tag_attributes,
25
+ "v-model": input_key,
26
+ type: :range,
27
+ "@change": "inputChanged(\"#{attr_key}\")",
28
+ ref: "input.#{attr_key}",
29
+ placeholder: placeholder,
30
+ "init-value": init_value,
31
+ min: options[:min],
32
+ max: options[:max],
33
+ step: options[:step],
34
+ list: options[:list] }
35
+
36
+ %span{ class: "errors", "v-if": error_key }
37
+ %span{ class: "error", "v-for": "error in #{error_key}" }
38
+ {{ error }}
@@ -7,21 +7,35 @@ module Matestack::Ui::Core::Form::Input
7
7
  raise "included form config is missing, please add ':include' to parent form component" if @included_config.nil?
8
8
  end
9
9
 
10
+ def key
11
+ options[:key]
12
+ end
13
+
14
+ def label
15
+ options[:label]
16
+ end
17
+
18
+ def type
19
+ options[:type]
20
+ end
21
+
22
+ def placeholder
23
+ options[:placeholder]
24
+ end
25
+
10
26
  def input_key
11
- 'data["' + options[:key].to_s + '"]'
27
+ "data['#{key.to_s}']"
12
28
  end
13
29
 
14
30
  def error_key
15
- 'errors["' + options[:key].to_s + '"]'
31
+ "errors['#{key.to_s}']"
16
32
  end
17
33
 
18
34
  def input_wrapper
19
35
  case options[:for]
20
36
  when nil
21
37
  return nil
22
- when Symbol
23
- return options[:for]
24
- when String
38
+ when Symbol, String
25
39
  return options[:for]
26
40
  end
27
41
  if options[:for].respond_to?(:model_name)
@@ -31,44 +45,37 @@ module Matestack::Ui::Core::Form::Input
31
45
 
32
46
  def attr_key
33
47
  if input_wrapper.nil?
34
- return options[:key].to_s
48
+ return key.to_s
35
49
  else
36
- return "#{input_wrapper}.#{options[:key].to_s}"
50
+ return "#{input_wrapper}.#{key.to_s}"
37
51
  end
38
52
  end
39
53
 
40
54
  def init_value
41
- unless options[:init].nil?
42
- return options[:init]
43
- end
55
+ return options[:init] unless options[:init].nil?
44
56
 
45
57
  unless options[:for].nil?
46
- value = options[:for].send(options[:key])
47
- if [true, false].include? value
48
- value ? 1 : 0
49
- else
50
- return value
51
- end
58
+ value = parse_value(options[:for].send key)
52
59
  else
53
60
  unless @included_config.nil? && @included_config[:for].nil?
54
- if @included_config[:for].respond_to?(options[:key])
55
- value = @included_config[:for].send(options[:key])
56
- if [true, false].include? value
57
- value ? 1 : 0
58
- else
59
- return value
60
- end
61
+ if @included_config[:for].respond_to?(key)
62
+ value = parse_value(@included_config[:for].send key)
61
63
  else
62
- if @included_config[:for].is_a?(Symbol) || @included_config[:for].is_a?(String)
63
- return nil
64
- end
65
- if @included_config[:for].is_a?(Hash)
66
- return @included_config[:for][options[:key]]
67
- end
64
+ @included_config[:for][key] if @included_config[:for].is_a?(Hash)
68
65
  end
69
66
  end
70
67
  end
71
68
  end
72
69
 
70
+ private
71
+
72
+ def parse_value(value)
73
+ if [true, false].include? value
74
+ value ? 1 : 0
75
+ else
76
+ return value
77
+ end
78
+ end
79
+
73
80
  end
74
81
  end
@@ -1,3 +1,2 @@
1
- %input{@tag_attributes}
2
- - if block_given?
3
- = yield
1
+ %input{ @tag_attributes,
2
+ type: type }
@@ -1,5 +1,9 @@
1
1
  module Matestack::Ui::Core::Input
2
2
  class Input < Matestack::Ui::Core::Component::Static
3
3
 
4
+ def type
5
+ options[:type]
6
+ end
7
+
4
8
  end
5
9
  end
@@ -1,4 +1,5 @@
1
1
  import Vue from 'vue/dist/vue.esm'
2
+ import { turbolinksAdapterMixin } from 'vue-turbolinks';
2
3
 
3
4
  // Import from app/concepts/matestack/ui/core:
4
5
  import app from '../app/app'
@@ -18,13 +19,35 @@ import collectionOrder from '../collection/order/order'
18
19
 
19
20
  let matestackUiApp = undefined
20
21
 
22
+ // this event fires first and always
21
23
  document.addEventListener('DOMContentLoaded', () => {
22
-
23
- matestackUiApp = new Vue({
24
+ // somehow we need to inject the turbolinks mixin even
25
+ // if the turbolinks:load event will recreate the vue instance
26
+ // skipping the injection here caused errors when submitting forms or action
27
+ // if they were present on the first page, which was loaded and activated turbolinks
28
+ // the mixin does not impact the app when turbolinks is disabled
29
+ matestackUiApp = new Vue({
24
30
  el: "#matestack_ui",
31
+ mixins: [turbolinksAdapterMixin],
25
32
  store: store
26
- })
33
+ })
34
+ })
27
35
 
36
+ // this event fires after DOMContentLoaded and only if turbolinks are enabled
37
+ document.addEventListener('turbolinks:load', () => {
38
+ // we need to empty the currently stored pageTemplate state variable
39
+ // otherwise the matestack page will jump back to the latest pageTemplate
40
+ // fetched during the last matestack transition as the turbolinks powered
41
+ // page transition does not write the matestack store pageTemplate state variable
42
+ store.commit('resetPageTemplate')
43
+ // we need to destroy the vue app instance
44
+ matestackUiApp.$destroy();
45
+ // and recreate it right afterwards in order to work when used with turbolinks
46
+ matestackUiApp = new Vue({
47
+ el: "#matestack_ui",
48
+ mixins: [turbolinksAdapterMixin],
49
+ store: store
50
+ })
28
51
  })
29
52
 
30
53
  export default Vue
@@ -5,6 +5,10 @@ module Matestack::Ui::Core::HasViewContext
5
5
  end
6
6
 
7
7
  def method_missing(*args, &block)
8
- @view_context.send(*args, &block)
8
+ if @view_context.respond_to? args.first
9
+ @view_context.send(*args, &block)
10
+ else
11
+ super
12
+ end
9
13
  end
10
14
  end
@@ -1,7 +1,7 @@
1
1
  module Matestack
2
2
  module Ui
3
3
  module Core
4
- VERSION = '0.7.4'
4
+ VERSION = '0.7.5'
5
5
  end
6
6
  end
7
7
  end
@@ -2,17 +2,21 @@
2
2
  "entrypoints": {
3
3
  "matestack-ui-core": {
4
4
  "css": [
5
- "/dist/matestack-ui-core.min.css"
5
+ "/dist/matestack-ui-core.css"
6
6
  ],
7
7
  "js": [
8
- "/dist/matestack-ui-core.min.js"
8
+ "/dist/matestack-ui-core.js"
9
+ ],
10
+ "css.map": [
11
+ "/dist/matestack-ui-core.css.map"
9
12
  ],
10
13
  "js.map": [
11
- "/dist/matestack-ui-core.min.js.map"
14
+ "/dist/matestack-ui-core.js.map"
12
15
  ]
13
16
  }
14
17
  },
15
- "matestack-ui-core.css": "/dist/matestack-ui-core.min.css",
16
- "matestack-ui-core.js": "/dist/matestack-ui-core.min.js",
17
- "matestack-ui-core.js.map": "/dist/matestack-ui-core.min.js.map"
18
+ "matestack-ui-core.css": "/dist/matestack-ui-core.css",
19
+ "matestack-ui-core.css.map": "/dist/matestack-ui-core.css.map",
20
+ "matestack-ui-core.js": "/dist/matestack-ui-core.js",
21
+ "matestack-ui-core.js.map": "/dist/matestack-ui-core.js.map"
18
22
  }
@@ -201,12 +201,20 @@ const componentDef = {
201
201
  },
202
202
  computed: vuex__WEBPACK_IMPORTED_MODULE_2__["default"].mapState({
203
203
  asyncTemplate: state => state.pageTemplate,
204
+ currentPathName: state => state.currentPathName,
205
+ currentSearch: state => state.currentSearch,
206
+ currentOrigin: state => state.currentOrigin,
204
207
  }),
205
208
  mounted: function(){
209
+ const self = this;
206
210
  window.onpopstate = (event) => {
207
- if (Object(_location__WEBPACK_IMPORTED_MODULE_3__["default"])(document.location, event)) {
208
- this.$store.dispatch("navigateTo", {url: document.location.pathname, backwards: true} );
209
- };
211
+ if (Object(_location__WEBPACK_IMPORTED_MODULE_3__["default"])({
212
+ origin: self.currentOrigin,
213
+ pathName: self.currentPathName,
214
+ search: self.currentSearch
215
+ }, document.location)){
216
+ self.$store.dispatch("navigateTo", {url: document.location.pathname, backwards: true} );
217
+ }
210
218
  }
211
219
  },
212
220
  components: {
@@ -232,11 +240,10 @@ let component = vue_dist_vue_esm__WEBPACK_IMPORTED_MODULE_0__["default"].compone
232
240
 
233
241
  "use strict";
234
242
  __webpack_require__.r(__webpack_exports__);
235
- const isNavigatingToAnotherPage = function(currentLocation, popstateEvent) {
236
- const targetLocation = popstateEvent.target.location;
243
+ const isNavigatingToAnotherPage = function(currentLocation, targetLocation) {
237
244
 
238
245
  // omits hash by design
239
- return currentLocation.pathname !== targetLocation.pathname ||
246
+ return currentLocation.pathName !== targetLocation.pathname ||
240
247
  currentLocation.origin !== targetLocation.origin ||
241
248
  currentLocation.search !== targetLocation.search
242
249
  }
@@ -270,14 +277,21 @@ vue_dist_vue_esm__WEBPACK_IMPORTED_MODULE_0__["default"].use(vuex__WEBPACK_IMPOR
270
277
  const store = new vuex__WEBPACK_IMPORTED_MODULE_1__["default"].Store({
271
278
  state: {
272
279
  pageTemplate: null,
273
- currentPath: document.location.pathname
280
+ currentPathName: document.location.pathname,
281
+ currentSearch: document.location.search,
282
+ currentOrigin: document.location.origin
274
283
  },
275
284
  mutations: {
276
285
  setPageTemplate (state, serverResponse){
277
286
  state.pageTemplate = serverResponse
278
287
  },
279
- setCurrentPath (state, path){
280
- state.currentPath = path
288
+ setCurrentLocation (state, current){
289
+ state.currentPathName = current.path
290
+ state.currentSearch = current.search
291
+ state.currentOrigin = current.origin
292
+ },
293
+ resetPageTemplate (state) {
294
+ state.pageTemplate = null;
281
295
  }
282
296
  },
283
297
  actions: {
@@ -308,7 +322,7 @@ const store = new vuex__WEBPACK_IMPORTED_MODULE_1__["default"].Store({
308
322
  setTimeout(function () {
309
323
  resolve(response["data"])
310
324
  commit('setPageTemplate', response["data"])
311
- commit('setCurrentPath', url)
325
+ commit('setCurrentLocation', { path: url, search: document.location.search, origin: document.location.origin })
312
326
  _js_event_hub__WEBPACK_IMPORTED_MODULE_3__["default"].$emit("page_loaded", url);
313
327
  if (typeof matestackUiCoreTransitionSuccess !== 'undefined') {
314
328
  matestackUiCoreTransitionSuccess(url);
@@ -936,7 +950,7 @@ const componentDef = {
936
950
  && self.componentConfig["success"]["transition"]["follow_response"] === true
937
951
  && self.$store != undefined
938
952
  ) {
939
- let path = response.data["transition_to"]
953
+ let path = response.data["transition_to"] || response.request.responseURL
940
954
  self.$store.dispatch('navigateTo', {url: path, backwards: false})
941
955
  return;
942
956
  }
@@ -1008,20 +1022,22 @@ let component = vue_dist_vue_esm__WEBPACK_IMPORTED_MODULE_0__["default"].compone
1008
1022
  "use strict";
1009
1023
  __webpack_require__.r(__webpack_exports__);
1010
1024
  /* harmony import */ var vue_dist_vue_esm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue/dist/vue.esm */ "../node_modules/vue/dist/vue.esm.js");
1011
- /* harmony import */ var _app_app__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../app/app */ "../app/concepts/matestack/ui/core/app/app.js");
1012
- /* harmony import */ var _async_async__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../async/async */ "../app/concepts/matestack/ui/core/async/async.js");
1013
- /* harmony import */ var _page_content__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../page/content */ "../app/concepts/matestack/ui/core/page/content.js");
1014
- /* harmony import */ var _app_store__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../app/store */ "../app/concepts/matestack/ui/core/app/store.js");
1015
- /* harmony import */ var _component_component__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../component/component */ "../app/concepts/matestack/ui/core/component/component.js");
1016
- /* harmony import */ var _component_anonym_dynamic_component__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../component/anonym-dynamic-component */ "../app/concepts/matestack/ui/core/component/anonym-dynamic-component.js");
1017
- /* harmony import */ var _html_html__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../html/html */ "../app/concepts/matestack/ui/core/html/html.js");
1018
- /* harmony import */ var _transition_transition__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../transition/transition */ "../app/concepts/matestack/ui/core/transition/transition.js");
1019
- /* harmony import */ var _action_action__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../action/action */ "../app/concepts/matestack/ui/core/action/action.js");
1020
- /* harmony import */ var _form_form__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../form/form */ "../app/concepts/matestack/ui/core/form/form.js");
1021
- /* harmony import */ var _onclick_onclick__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../onclick/onclick */ "../app/concepts/matestack/ui/core/onclick/onclick.js");
1022
- /* harmony import */ var _collection_content_content__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../collection/content/content */ "../app/concepts/matestack/ui/core/collection/content/content.js");
1023
- /* harmony import */ var _collection_filter_filter__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../collection/filter/filter */ "../app/concepts/matestack/ui/core/collection/filter/filter.js");
1024
- /* harmony import */ var _collection_order_order__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../collection/order/order */ "../app/concepts/matestack/ui/core/collection/order/order.js");
1025
+ /* harmony import */ var vue_turbolinks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-turbolinks */ "../node_modules/vue-turbolinks/index.js");
1026
+ /* harmony import */ var _app_app__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../app/app */ "../app/concepts/matestack/ui/core/app/app.js");
1027
+ /* harmony import */ var _async_async__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../async/async */ "../app/concepts/matestack/ui/core/async/async.js");
1028
+ /* harmony import */ var _page_content__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../page/content */ "../app/concepts/matestack/ui/core/page/content.js");
1029
+ /* harmony import */ var _app_store__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../app/store */ "../app/concepts/matestack/ui/core/app/store.js");
1030
+ /* harmony import */ var _component_component__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../component/component */ "../app/concepts/matestack/ui/core/component/component.js");
1031
+ /* harmony import */ var _component_anonym_dynamic_component__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../component/anonym-dynamic-component */ "../app/concepts/matestack/ui/core/component/anonym-dynamic-component.js");
1032
+ /* harmony import */ var _html_html__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../html/html */ "../app/concepts/matestack/ui/core/html/html.js");
1033
+ /* harmony import */ var _transition_transition__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../transition/transition */ "../app/concepts/matestack/ui/core/transition/transition.js");
1034
+ /* harmony import */ var _action_action__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../action/action */ "../app/concepts/matestack/ui/core/action/action.js");
1035
+ /* harmony import */ var _form_form__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../form/form */ "../app/concepts/matestack/ui/core/form/form.js");
1036
+ /* harmony import */ var _onclick_onclick__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../onclick/onclick */ "../app/concepts/matestack/ui/core/onclick/onclick.js");
1037
+ /* harmony import */ var _collection_content_content__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../collection/content/content */ "../app/concepts/matestack/ui/core/collection/content/content.js");
1038
+ /* harmony import */ var _collection_filter_filter__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../collection/filter/filter */ "../app/concepts/matestack/ui/core/collection/filter/filter.js");
1039
+ /* harmony import */ var _collection_order_order__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../collection/order/order */ "../app/concepts/matestack/ui/core/collection/order/order.js");
1040
+
1025
1041
 
1026
1042
 
1027
1043
  // Import from app/concepts/matestack/ui/core:
@@ -1042,13 +1058,35 @@ __webpack_require__.r(__webpack_exports__);
1042
1058
 
1043
1059
  let matestackUiApp = undefined
1044
1060
 
1061
+ // this event fires first and always
1045
1062
  document.addEventListener('DOMContentLoaded', () => {
1046
-
1047
- matestackUiApp = new vue_dist_vue_esm__WEBPACK_IMPORTED_MODULE_0__["default"]({
1063
+ // somehow we need to inject the turbolinks mixin even
1064
+ // if the turbolinks:load event will recreate the vue instance
1065
+ // skipping the injection here caused errors when submitting forms or action
1066
+ // if they were present on the first page, which was loaded and activated turbolinks
1067
+ // the mixin does not impact the app when turbolinks is disabled
1068
+ matestackUiApp = new vue_dist_vue_esm__WEBPACK_IMPORTED_MODULE_0__["default"]({
1048
1069
  el: "#matestack_ui",
1049
- store: _app_store__WEBPACK_IMPORTED_MODULE_4__["default"]
1050
- })
1070
+ mixins: [vue_turbolinks__WEBPACK_IMPORTED_MODULE_1__["turbolinksAdapterMixin"]],
1071
+ store: _app_store__WEBPACK_IMPORTED_MODULE_5__["default"]
1072
+ })
1073
+ })
1051
1074
 
1075
+ // this event fires after DOMContentLoaded and only if turbolinks are enabled
1076
+ document.addEventListener('turbolinks:load', () => {
1077
+ // we need to empty the currently stored pageTemplate state variable
1078
+ // otherwise the matestack page will jump back to the latest pageTemplate
1079
+ // fetched during the last matestack transition as the turbolinks powered
1080
+ // page transition does not write the matestack store pageTemplate state variable
1081
+ _app_store__WEBPACK_IMPORTED_MODULE_5__["default"].commit('resetPageTemplate')
1082
+ // we need to destroy the vue app instance
1083
+ matestackUiApp.$destroy();
1084
+ // and recreate it right afterwards in order to work when used with turbolinks
1085
+ matestackUiApp = new vue_dist_vue_esm__WEBPACK_IMPORTED_MODULE_0__["default"]({
1086
+ el: "#matestack_ui",
1087
+ mixins: [vue_turbolinks__WEBPACK_IMPORTED_MODULE_1__["turbolinksAdapterMixin"]],
1088
+ store: _app_store__WEBPACK_IMPORTED_MODULE_5__["default"]
1089
+ })
1052
1090
  })
1053
1091
 
1054
1092
  /* harmony default export */ __webpack_exports__["default"] = (vue_dist_vue_esm__WEBPACK_IMPORTED_MODULE_0__["default"]);
@@ -2981,6 +3019,50 @@ var t = function t(_t, o, e) {
2981
3019
 
2982
3020
  /***/ }),
2983
3021
 
3022
+ /***/ "../node_modules/vue-turbolinks/index.js":
3023
+ /*!***********************************************!*\
3024
+ !*** ../node_modules/vue-turbolinks/index.js ***!
3025
+ \***********************************************/
3026
+ /*! exports provided: turbolinksAdapterMixin, default */
3027
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
3028
+
3029
+ "use strict";
3030
+ __webpack_require__.r(__webpack_exports__);
3031
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "turbolinksAdapterMixin", function() { return turbolinksAdapterMixin; });
3032
+ function handleVueDestruction(vue) {
3033
+ var turbolinksEvent = vue.$options.turbolinksDestroyEvent || 'turbolinks:visit';
3034
+ document.addEventListener(turbolinksEvent, function teardown() {
3035
+ vue.$destroy();
3036
+ document.removeEventListener(turbolinksEvent, teardown);
3037
+ });
3038
+ }
3039
+
3040
+ var turbolinksAdapterMixin = {
3041
+ beforeMount: function beforeMount() {
3042
+ // If this is the root component, we want to cache the original element contents to replace later
3043
+ // We don't care about sub-components, just the root
3044
+ if (this === this.$root && this.$el) {
3045
+ handleVueDestruction(this); // cache original element
3046
+
3047
+ this.$turbolinksCachedHTML = this.$el.outerHTML; // register root hook to restore original element on destroy
3048
+
3049
+ this.$once('hook:destroyed', function () {
3050
+ this.$el.outerHTML = this.$turbolinksCachedHTML;
3051
+ });
3052
+ }
3053
+ }
3054
+ };
3055
+
3056
+ function plugin(Vue, options) {
3057
+ // Install a global mixin
3058
+ Vue.mixin(turbolinksAdapterMixin);
3059
+ }
3060
+
3061
+
3062
+ /* harmony default export */ __webpack_exports__["default"] = (plugin);
3063
+
3064
+ /***/ }),
3065
+
2984
3066
  /***/ "../node_modules/vue/dist/vue.esm.js":
2985
3067
  /*!*******************************************!*\
2986
3068
  !*** ../node_modules/vue/dist/vue.esm.js ***!