matestack-ui-core 0.7.0 → 0.7.1

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 (65) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -9
  3. data/app/concepts/matestack/ui/core/async/async.js +20 -2
  4. data/app/concepts/matestack/ui/core/blockquote/blockquote.haml +5 -0
  5. data/app/concepts/matestack/ui/core/blockquote/blockquote.rb +9 -0
  6. data/app/concepts/matestack/ui/core/button/button.rb +6 -0
  7. data/app/concepts/matestack/ui/core/caption/caption.haml +6 -0
  8. data/app/concepts/matestack/ui/core/caption/caption.rb +5 -0
  9. data/app/concepts/matestack/ui/core/collection/content/content.js +100 -0
  10. data/app/concepts/matestack/ui/core/collection/content/content.rb +18 -0
  11. data/app/concepts/matestack/ui/core/collection/content/next/next.haml +3 -0
  12. data/app/concepts/matestack/ui/core/collection/content/next/next.rb +5 -0
  13. data/app/concepts/matestack/ui/core/collection/content/page/link/link.haml +3 -0
  14. data/app/concepts/matestack/ui/core/collection/content/page/link/link.rb +5 -0
  15. data/app/concepts/matestack/ui/core/collection/content/previous/previous.haml +3 -0
  16. data/app/concepts/matestack/ui/core/collection/content/previous/previous.rb +5 -0
  17. data/app/concepts/matestack/ui/core/collection/filter/filter.js +50 -0
  18. data/app/concepts/matestack/ui/core/collection/filter/filter.rb +17 -0
  19. data/app/concepts/matestack/ui/core/collection/filter/input/input.haml +8 -0
  20. data/app/concepts/matestack/ui/core/collection/filter/input/input.rb +13 -0
  21. data/app/concepts/matestack/ui/core/collection/filter/reset/reset.haml +3 -0
  22. data/app/concepts/matestack/ui/core/collection/filter/reset/reset.rb +5 -0
  23. data/app/concepts/matestack/ui/core/collection/filter/submit/submit.haml +3 -0
  24. data/app/concepts/matestack/ui/core/collection/filter/submit/submit.rb +5 -0
  25. data/app/concepts/matestack/ui/core/collection/helper.rb +114 -0
  26. data/app/concepts/matestack/ui/core/collection/order/order.js +58 -0
  27. data/app/concepts/matestack/ui/core/collection/order/order.rb +17 -0
  28. data/app/concepts/matestack/ui/core/collection/order/toggle/indicator/indicator.rb +11 -0
  29. data/app/concepts/matestack/ui/core/collection/order/toggle/toggle.haml +3 -0
  30. data/app/concepts/matestack/ui/core/collection/order/toggle/toggle.rb +6 -0
  31. data/app/concepts/matestack/ui/core/component/component.js +2 -2
  32. data/app/concepts/matestack/ui/core/details/details.haml +3 -0
  33. data/app/concepts/matestack/ui/core/details/details.rb +4 -0
  34. data/app/concepts/matestack/ui/core/js/core.js +3 -0
  35. data/app/concepts/matestack/ui/core/js/helpers/query-params-helper.js +56 -0
  36. data/app/concepts/matestack/ui/core/link/link.haml +5 -6
  37. data/app/concepts/matestack/ui/core/link/link.rb +4 -2
  38. data/app/concepts/matestack/ui/core/page/page.rb +19 -18
  39. data/app/concepts/matestack/ui/core/small/small.haml +5 -0
  40. data/app/concepts/matestack/ui/core/small/small.rb +5 -0
  41. data/app/concepts/matestack/ui/core/span/span.haml +3 -1
  42. data/app/concepts/matestack/ui/core/strong/strong.haml +5 -0
  43. data/app/concepts/matestack/ui/core/strong/strong.rb +5 -0
  44. data/app/concepts/matestack/ui/core/summary/summary.haml +6 -0
  45. data/app/concepts/matestack/ui/core/summary/summary.rb +4 -0
  46. data/app/concepts/matestack/ui/core/video/video.haml +1 -0
  47. data/app/concepts/matestack/ui/core/video/video.rb +7 -0
  48. data/app/lib/matestack/ui/core/page_node.rb +14 -5
  49. data/lib/generators/matestack_app/USAGE +21 -0
  50. data/lib/generators/matestack_app/matestack_app_generator.rb +26 -0
  51. data/lib/generators/matestack_app/templates/matestack_app.erb +26 -0
  52. data/lib/generators/matestack_app/templates/matestack_app_controller.erb +7 -0
  53. data/lib/generators/matestack_component/USAGE +20 -0
  54. data/lib/generators/matestack_component/matestack_component_generator.rb +30 -0
  55. data/lib/generators/matestack_component/templates/matestack_component.haml.erb +5 -0
  56. data/lib/generators/matestack_component/templates/matestack_component.js.erb +17 -0
  57. data/lib/generators/matestack_component/templates/matestack_component.rb.erb +13 -0
  58. data/lib/generators/matestack_component/templates/matestack_component.scss.erb +1 -0
  59. data/lib/generators/matestack_page/USAGE +28 -0
  60. data/lib/generators/matestack_page/matestack_page_generator.rb +41 -0
  61. data/lib/generators/matestack_page/templates/matestack_page.erb +15 -0
  62. data/lib/matestack/ui/core/version.rb +1 -1
  63. data/vendor/assets/javascripts/matestack-ui-core.js +588 -251
  64. data/vendor/assets/javascripts/matestack-ui-core.js.map +1 -1
  65. metadata +53 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 99d5baa395a0bbd08fb3dd6ba51de334b3408399aa7bde23057fc1e2c6fd7f8a
4
- data.tar.gz: 3cc9af9f8129174ae0628119476dc6c4760ffe49d6edca24478afacb74494818
3
+ metadata.gz: 1b357485aaf4b5a49cc255719c7113ffc12b0d65f540130bfa04d64e8fd9afc9
4
+ data.tar.gz: e2c691da1526db9e715eecb9609b283d49f7d7edaf30b7fe537d430cca0a7c88
5
5
  SHA512:
6
- metadata.gz: b998a602726e454b65525852bfe72e7c604c18ac4f9f789afbd0c6321c0cc752ad9837cc4b90da71789080bfc1f672d768d3b1240029e0f4c740e8b72edd7dd8
7
- data.tar.gz: acf096659352f4eca3c0f7861e291e3cbe022b8a0cb17c5391163057a60941cceef4cf604c9b3dfc26b8553f8475d466959880ed60116ff28a842985728712f0
6
+ metadata.gz: 224bb5440913ee5d88d67a9b118652e278a72d1f42d064f9ff89593f35922310533978f3014a86022bca3ec3b6a7f1220f1e5e303d4a771c5cd011792d6aedf7
7
+ data.tar.gz: b203163b2a42cdc4aa31849f799fa061826dc42509033cfb2fc9aed61f1f101d163bf0bfcf6d18e2a485448bd1b149b3b4e0fd92b6d8627c0d2e71be600292d2
data/README.md CHANGED
@@ -213,15 +213,7 @@ Changelog can be found [here](./CHANGELOG.md)
213
213
 
214
214
  ### Roadmap
215
215
 
216
- Scheduled for 0.7.0:
217
- - Better naming conventions
218
- - Webpacker/Yarn Integration
219
- - Advanced Websockets Integration
220
- - 1:n Relations in Form components
221
- - More Form Components (Multi Select Components)
222
- - Component Based Caching
223
- - Rails View Integration
224
- - Dockerized Core Development
216
+ We're currently finalizing the roadmap towards to a stable 1.0 release, supposed to happen towards the end of the year! For details make sure to check the [release management project](https://github.com/basemate/matestack-ui-core/projects/2) and get in touch via our [chat](https://gitter.im/basemate/community) for feedback!
225
217
 
226
218
  ### Community
227
219
 
@@ -18,8 +18,16 @@ const componentDef = {
18
18
  methods: {
19
19
  show: function(event_data){
20
20
  const self = this
21
+ if (this.showing === true){
22
+ return
23
+ }
21
24
  this.showing = true
22
25
  this.event.data = event_data
26
+ if(this.componentConfig["defer"] != undefined){
27
+ if(!isNaN(this.componentConfig["defer"])){
28
+ this.startDefer()
29
+ }
30
+ }
23
31
  if(this.componentConfig["hide_after"] != undefined){
24
32
  self.hide_after_timeout = setTimeout(function () {
25
33
  self.hide()
@@ -29,6 +37,12 @@ const componentDef = {
29
37
  hide: function(){
30
38
  this.showing = false
31
39
  this.event.data = {}
40
+ },
41
+ startDefer: function(){
42
+ const self = this
43
+ setTimeout(function () {
44
+ self.rerender()
45
+ }, parseInt(this.componentConfig["defer"]));
32
46
  }
33
47
  },
34
48
  created: function () {
@@ -39,8 +53,12 @@ const componentDef = {
39
53
  if(this.componentConfig["show_on"] != undefined){
40
54
  this.showing = false
41
55
  }
42
- if(this.componentConfig["hide_on"] != undefined){
43
- this.showing = true
56
+ if(this.componentConfig["defer"] != undefined){
57
+ if(!isNaN(this.componentConfig["defer"])){
58
+ if (this.componentConfig["show_on"] == undefined){
59
+ this.startDefer()
60
+ }
61
+ }
44
62
  }
45
63
  },
46
64
  beforeDestroy: function() {
@@ -0,0 +1,5 @@
1
+ %blockquote{@tag_attributes}
2
+ - if options[:text].nil? && block_given?
3
+ = yield
4
+ - else
5
+ = options[:text]
@@ -0,0 +1,9 @@
1
+ module Matestack::Ui::Core::Blockquote
2
+ class Blockquote < Matestack::Ui::Core::Component::Static
3
+ def setup
4
+ @tag_attributes.merge!({
5
+ "cite": options[:cite]
6
+ })
7
+ end
8
+ end
9
+ end
@@ -1,5 +1,11 @@
1
1
  module Matestack::Ui::Core::Button
2
2
  class Button < Matestack::Ui::Core::Component::Static
3
3
 
4
+ def setup
5
+ @tag_attributes.merge!({
6
+ "disabled": options[:disabled] ||= nil
7
+ })
8
+ end
9
+
4
10
  end
5
11
  end
@@ -0,0 +1,6 @@
1
+ %caption{@tag_attributes}
2
+ - if options[:text].nil?
3
+ - if block_given?
4
+ = yield
5
+ - else
6
+ = options[:text]
@@ -0,0 +1,5 @@
1
+ module Matestack::Ui::Core::Caption
2
+ class Caption < Matestack::Ui::Core::Component::Static
3
+
4
+ end
5
+ end
@@ -0,0 +1,100 @@
1
+ import Vue from 'vue/dist/vue.esm'
2
+
3
+ import matestackEventHub from 'js/event-hub'
4
+ import queryParamsHelper from 'js/helpers/query-params-helper'
5
+
6
+ import componentMixin from 'component/component'
7
+ import asyncMixin from 'async/async'
8
+
9
+ const componentDef = {
10
+ mixins: [componentMixin, asyncMixin],
11
+ data: function(){
12
+ return {
13
+ currentLimit: null,
14
+ currentOffset: null,
15
+ currentFilteredCount: null,
16
+ currentBaseCount: null
17
+ }
18
+ },
19
+ methods: {
20
+ next: function(){
21
+ if (this.currentTo() < this.currentCount()){
22
+ this.currentOffset += this.currentLimit
23
+ var url = queryParamsHelper.updateQueryParams(this.componentConfig["id"] + "-offset", this.currentOffset)
24
+ window.history.pushState({matestackApp: true, url: url}, null, url);
25
+ matestackEventHub.$emit(this.componentConfig["id"] + "-update")
26
+ }
27
+ },
28
+ previous: function(){
29
+ if ((this.currentOffset - this.currentLimit)*-1 != this.currentLimit){
30
+ if((this.currentOffset - this.currentLimit) < 0){
31
+ this.currentOffset = 0
32
+ } else {
33
+ this.currentOffset -= this.currentLimit
34
+ }
35
+ var url = queryParamsHelper.updateQueryParams(this.componentConfig["id"] + "-offset", this.currentOffset)
36
+ window.history.pushState({matestackApp: true, url: url}, null, url);
37
+ matestackEventHub.$emit(this.componentConfig["id"] + "-update")
38
+ }
39
+ },
40
+ currentTo: function(){
41
+ var to = parseInt(this.currentOffset) + parseInt(this.currentLimit)
42
+ if (to > parseInt(this.currentCount())){
43
+ return this.currentCount();
44
+ } else {
45
+ return to;
46
+ }
47
+ },
48
+ currentCount: function(){
49
+ if (this.currentFilteredCount != null || this.currentFilteredCount != undefined){
50
+ return this.currentFilteredCount;
51
+ } else {
52
+ return this.currentBaseCount;
53
+ }
54
+ },
55
+ goToPage: function(page){
56
+ this.currentOffset = parseInt(this.currentLimit) * (parseInt(page)-1)
57
+ var url = queryParamsHelper.updateQueryParams(this.componentConfig["id"] + "-offset", this.currentOffset)
58
+ window.history.pushState({matestackApp: true, url: url}, null, url);
59
+ matestackEventHub.$emit(this.componentConfig["id"] + "-update")
60
+ }
61
+ },
62
+ mounted: function(){
63
+ if(queryParamsHelper.getQueryParam(this.componentConfig["id"] + "-offset") != null){
64
+ this.currentOffset = parseInt(queryParamsHelper.getQueryParam(this.componentConfig["id"] + "-offset"))
65
+ } else {
66
+ if(this.componentConfig["init_offset"] != undefined){
67
+ this.currentOffset = this.componentConfig["init_offset"]
68
+ } else {
69
+ this.currentOffset = 0
70
+ }
71
+ }
72
+
73
+ if(queryParamsHelper.getQueryParam(this.componentConfig["id"] + "-limit") != null){
74
+ this.currentOffset = parseInt(queryParamsHelper.getQueryParam(this.componentConfig["id"] + "-limit"))
75
+ } else {
76
+ if(this.componentConfig["init_limit"] != undefined){
77
+ this.currentLimit = this.componentConfig["init_limit"]
78
+ } else {
79
+ this.currentLimit = 10
80
+ }
81
+ }
82
+
83
+ if(this.componentConfig["filtered_count"] != undefined){
84
+ this.currentFilteredCount = this.componentConfig["filtered_count"]
85
+ if(this.currentOffset >= this.currentFilteredCount){
86
+ this.previous()
87
+ }
88
+ }
89
+ if(this.componentConfig["base_count"] != undefined){
90
+ this.currentBaseCount = this.componentConfig["base_count"]
91
+ if(this.currentOffset >= this.currentBaseCount){
92
+ this.previous()
93
+ }
94
+ }
95
+ }
96
+ }
97
+
98
+ let component = Vue.component('matestack-ui-core-collection-content', componentDef)
99
+
100
+ export default componentDef
@@ -0,0 +1,18 @@
1
+ module Matestack::Ui::Core::Collection::Content
2
+ class Content < Matestack::Ui::Core::Component::Dynamic
3
+
4
+ def setup
5
+ @rerender = true
6
+ @component_config = @component_config.except(:data, :paginated_data)
7
+ end
8
+
9
+ def response
10
+ components {
11
+ div do
12
+ yield_components
13
+ end
14
+ }
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,3 @@
1
+ %a{@tag_attributes, "@click": "next()"}
2
+ - if block_given?
3
+ = yield
@@ -0,0 +1,5 @@
1
+ module Matestack::Ui::Core::Collection::Content::Next
2
+ class Next < Matestack::Ui::Core::Component::Static
3
+
4
+ end
5
+ end
@@ -0,0 +1,3 @@
1
+ %a{@tag_attributes, "@click": "goToPage(#{@options[:page]})"}
2
+ - if block_given?
3
+ = yield
@@ -0,0 +1,5 @@
1
+ module Matestack::Ui::Core::Collection::Content::Page::Link
2
+ class Link < Matestack::Ui::Core::Component::Static
3
+
4
+ end
5
+ end
@@ -0,0 +1,3 @@
1
+ %a{@tag_attributes, "@click": "previous()"}
2
+ - if block_given?
3
+ = yield
@@ -0,0 +1,5 @@
1
+ module Matestack::Ui::Core::Collection::Content::Previous
2
+ class Previous < Matestack::Ui::Core::Component::Static
3
+
4
+ end
5
+ end
@@ -0,0 +1,50 @@
1
+ import Vue from 'vue/dist/vue.esm'
2
+
3
+ import matestackEventHub from 'js/event-hub'
4
+ import queryParamsHelper from 'js/helpers/query-params-helper'
5
+
6
+ import componentMixin from 'component/component'
7
+
8
+ const componentDef = {
9
+ mixins: [componentMixin],
10
+ data: function(){
11
+ return {
12
+ filter: {}
13
+ }
14
+ },
15
+ methods: {
16
+ submitFilter: function(){
17
+ var url;
18
+ var filter = this.filter
19
+ for (var key in this.filter) {
20
+ url = queryParamsHelper.updateQueryParams(this.componentConfig["id"] + "-filter-" + key, this.filter[key], url)
21
+ }
22
+ url = queryParamsHelper.updateQueryParams(this.componentConfig["id"] + "-offset", 0, url)
23
+ window.history.pushState({matestackApp: true, url: url}, null, url);
24
+ matestackEventHub.$emit(this.componentConfig["id"] + "-update")
25
+ },
26
+ resetFilter: function(){
27
+ var url;
28
+ for (var key in this.filter) {
29
+ url = queryParamsHelper.updateQueryParams(this.componentConfig["id"] + "-filter-" + key, null, url)
30
+ this.filter[key] = null;
31
+ this.$forceUpdate();
32
+ }
33
+ window.history.pushState({matestackApp: true, url: url}, null, url);
34
+ matestackEventHub.$emit(this.componentConfig["id"] + "-update")
35
+ }
36
+ },
37
+ created: function(){
38
+ var self = this;
39
+ var queryParamsObject = queryParamsHelper.queryParamsToObject()
40
+ Object.keys(queryParamsObject).forEach(function(key){
41
+ if (key.startsWith(self.componentConfig["id"] + "-filter-")){
42
+ self.filter[key.replace(self.componentConfig["id"] + "-filter-", "")] = queryParamsObject[key]
43
+ }
44
+ })
45
+ }
46
+ }
47
+
48
+ let component = Vue.component('matestack-ui-core-collection-filter', componentDef)
49
+
50
+ export default componentDef
@@ -0,0 +1,17 @@
1
+ module Matestack::Ui::Core::Collection::Filter
2
+ class Filter < Matestack::Ui::Core::Component::Dynamic
3
+
4
+ def setup
5
+ @component_config = @component_config.except(:data, :paginated_data)
6
+ end
7
+
8
+ def response
9
+ components {
10
+ div do
11
+ yield_components
12
+ end
13
+ }
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,8 @@
1
+ - if [:text, :number, :email, :date, :password].include?(options[:type])
2
+ %input{"v-model#{'.number' if options[:type] == :number}": input_key,
3
+ type: options[:type],
4
+ class: options[:class],
5
+ id: component_id,
6
+ "@keyup.enter": "submitFilter()",
7
+ ref: "filter.#{attr_key}",
8
+ placeholder: options[:placeholder]}
@@ -0,0 +1,13 @@
1
+ module Matestack::Ui::Core::Collection::Filter::Input
2
+ class Input < Matestack::Ui::Core::Component::Static
3
+
4
+ def input_key
5
+ 'filter["' + options[:key].to_s + '"]'
6
+ end
7
+
8
+ def attr_key
9
+ return options[:key].to_s
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,3 @@
1
+ %a{@tag_attributes, "@click": "resetFilter()"}
2
+ - if block_given?
3
+ = yield
@@ -0,0 +1,5 @@
1
+ module Matestack::Ui::Core::Collection::Filter::Reset
2
+ class Reset < Matestack::Ui::Core::Component::Static
3
+
4
+ end
5
+ end
@@ -0,0 +1,3 @@
1
+ %a{@tag_attributes, "@click": "submitFilter()"}
2
+ - if block_given?
3
+ = yield
@@ -0,0 +1,5 @@
1
+ module Matestack::Ui::Core::Collection::Filter::Submit
2
+ class Submit < Matestack::Ui::Core::Component::Static
3
+
4
+ end
5
+ end
@@ -0,0 +1,114 @@
1
+ module Matestack::Ui::Core::Collection
2
+
3
+ CollectionConfig = Struct.new(:id, :init_offset, :init_limit, :filtered_count, :base_count, :data, :context) do
4
+
5
+ def paginated_data
6
+ resulting_data = data
7
+ resulting_data = resulting_data.offset(get_collection_offset) unless get_collection_offset == 0
8
+ resulting_data = resulting_data.limit(get_collection_limit) unless get_collection_limit == 0
9
+
10
+ return resulting_data
11
+ end
12
+
13
+ def get_collection_offset
14
+ (context[:params]["#{id}-offset".to_sym] ||= init_offset).to_i
15
+ end
16
+
17
+ def get_collection_limit
18
+ (context[:params]["#{id}-limit".to_sym] ||= init_limit).to_i
19
+ end
20
+
21
+ def pages
22
+ offset = get_collection_offset
23
+ limit = get_collection_limit
24
+ if filtered_count.present?
25
+ count = filtered_count
26
+ else
27
+ count = base_count
28
+ end
29
+ page_count = count/limit
30
+ page_count += 1 if count%limit > 0
31
+ return (1..page_count).to_a
32
+ end
33
+
34
+ def from
35
+ return get_collection_offset + 1 if to > 0
36
+ return 0 if to == 0
37
+ end
38
+
39
+ def to
40
+ current_to = get_collection_offset + get_collection_limit
41
+ if filtered_count.present?
42
+ if current_to > filtered_count
43
+ return filtered_count
44
+ else
45
+ return current_to
46
+ end
47
+ else
48
+ if current_to > base_count
49
+ return base_count
50
+ else
51
+ return current_to
52
+ end
53
+ end
54
+ end
55
+
56
+ def config
57
+ self.to_h.except(:context)
58
+ end
59
+
60
+ end
61
+
62
+
63
+ module Helper
64
+
65
+ def get_collection_filter collection_id, key=nil
66
+ filter_hash = {}
67
+ context[:params].each do |param_key, param_value|
68
+ if param_key.start_with?("#{collection_id}-filter-")
69
+ param_key.gsub("#{collection_id}-filter-", "")
70
+ filter_hash[param_key.gsub("#{collection_id}-filter-", "").to_sym] = param_value
71
+ end
72
+ end
73
+ if key.nil?
74
+ return filter_hash
75
+ else
76
+ return filter_hash[key]
77
+ end
78
+ end
79
+
80
+ def get_collection_order collection_id, key=nil
81
+ order_hash = {}
82
+ context[:params].each do |param_key, param_value|
83
+ if param_key.start_with?("#{collection_id}-order-")
84
+ param_key.gsub("#{collection_id}-order-", "")
85
+ order_hash[param_key.gsub("#{collection_id}-order-", "").to_sym] = param_value
86
+ end
87
+ end
88
+ if key.nil?
89
+ return order_hash
90
+ else
91
+ return order_hash[key]
92
+ end
93
+ end
94
+
95
+ def set_collection id: nil, init_offset: 0, init_limit: nil, base_count: nil, filtered_count: nil, data: nil
96
+ @collections = {} if @collections.nil?
97
+
98
+ collection_config = CollectionConfig.new(
99
+ id,
100
+ init_offset,
101
+ init_limit,
102
+ filtered_count,
103
+ base_count,
104
+ data,
105
+ context
106
+ )
107
+
108
+ @collections[id.to_sym] = collection_config
109
+
110
+ return collection_config
111
+ end
112
+
113
+ end
114
+ end