mensa 0.2.3 → 0.2.5

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 (68) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -0
  3. data/Gemfile +1 -0
  4. data/Gemfile.lock +6 -3
  5. data/README.md +17 -3
  6. data/app/assets/stylesheets/mensa/application.css +1 -1
  7. data/app/components/mensa/add_filter/component.html.slim +4 -4
  8. data/app/components/mensa/add_filter/component.rb +1 -1
  9. data/app/components/mensa/add_filter/component_controller.js +21 -23
  10. data/app/components/mensa/control_bar/component.html.slim +1 -1
  11. data/app/components/mensa/control_bar/component.rb +2 -2
  12. data/app/components/mensa/filter_pill/component.html.slim +6 -0
  13. data/app/components/mensa/filter_pill/component.rb +15 -0
  14. data/app/components/mensa/{filter → filter_pill}/component_controller.js +1 -1
  15. data/app/components/mensa/filter_pill_list/component.html.slim +8 -0
  16. data/app/components/mensa/{filter_list → filter_pill_list}/component.rb +1 -1
  17. data/app/components/mensa/filter_pill_list/component_controller.js +50 -0
  18. data/app/components/mensa/header/component.rb +1 -1
  19. data/app/components/mensa/row_action/component.rb +1 -1
  20. data/app/components/mensa/search/component.html.slim +1 -1
  21. data/app/components/mensa/search/component.rb +1 -1
  22. data/app/components/mensa/search/component_controller.js +2 -2
  23. data/app/components/mensa/table/component.html.slim +3 -3
  24. data/app/components/mensa/table/component_controller.js +14 -2
  25. data/app/components/mensa/table_row/component.rb +1 -1
  26. data/app/components/mensa/views/component.css +10 -1
  27. data/app/components/mensa/views/component.html.slim +1 -1
  28. data/app/components/mensa/views/component_controller.js +9 -0
  29. data/app/controllers/mensa/application_controller.rb +1 -1
  30. data/app/controllers/mensa/tables/filters_controller.rb +2 -1
  31. data/app/controllers/mensa/tables_controller.rb +4 -10
  32. data/app/helpers/mensa/application_helper.rb +0 -1
  33. data/app/javascript/mensa/controllers/application_controller.js +5 -21
  34. data/app/javascript/mensa/controllers/index.js +4 -4
  35. data/app/jobs/mensa/export_job.rb +10 -11
  36. data/app/tables/mensa/action.rb +3 -1
  37. data/app/tables/mensa/base.rb +10 -15
  38. data/app/tables/mensa/cell.rb +6 -6
  39. data/app/tables/mensa/column.rb +16 -24
  40. data/app/tables/mensa/config/action_dsl.rb +1 -1
  41. data/app/tables/mensa/config/dsl_logic.rb +8 -4
  42. data/app/tables/mensa/config/table_dsl.rb +4 -1
  43. data/app/tables/mensa/config/view_dsl.rb +1 -0
  44. data/app/tables/mensa/config_readers.rb +15 -3
  45. data/app/tables/mensa/filter.rb +11 -14
  46. data/app/tables/mensa/row.rb +1 -1
  47. data/app/tables/mensa/scope.rb +3 -3
  48. data/app/tables/mensa/system_view.rb +1 -2
  49. data/app/views/mensa/tables/filters/show.turbo_stream.slim +7 -6
  50. data/app/views/mensa/tables/show.html.slim +2 -0
  51. data/app/views/mensa/tables/show.turbo_stream.slim +1 -1
  52. data/bin/setup +1 -1
  53. data/config/locales/en.yml +1 -1
  54. data/config/locales/nl.yml +1 -1
  55. data/db/migrate/20251112143558_add_description_to_table_view.rb +6 -0
  56. data/lib/generators/mensa/tailwind_config_generator.rb +3 -3
  57. data/lib/generators/mensa/templates/config/initializers/mensa.rb +1 -1
  58. data/lib/mensa/configuration.rb +2 -3
  59. data/lib/mensa/engine.rb +9 -9
  60. data/lib/mensa/version.rb +1 -1
  61. data/lib/mensa.rb +2 -2
  62. data/lib/tasks/mensa_tasks.rake +1 -1
  63. data/mensa.gemspec +1 -1
  64. metadata +13 -9
  65. data/app/components/mensa/filter_list/component.html.slim +0 -14
  66. data/app/components/mensa/filter_list/component_controller.js +0 -14
  67. /data/{rubocop.yml → .rubocop.yml} +0 -0
  68. /data/app/components/mensa/{filter_list → filter_pill_list}/component.css +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d7cb98df22a002a08d25141f67df7807ebf5f2eb102831db09614f7de86b8772
4
- data.tar.gz: 301c827f9ed63c1acb745359202021723df9142e03ee190a75312b01f6642fe1
3
+ metadata.gz: fa2c03e8e00ac20aa0a68e6a19b43de5f4262bd7601bf32a51679d9b8bbe7541
4
+ data.tar.gz: b94c0a5f9a3242fde92cffd8ee19a3add4ef60f95cd594f80cc53c02f525e2f7
5
5
  SHA512:
6
- metadata.gz: a0886a37e4ac9a8d75e083d0cbd3f5ff7475990d1d8dbff823f61bfcca19485834e58e108b203061442350e5ddef3ab4fec1b9c5550c05c9bea33c4457051998
7
- data.tar.gz: 1452161b4a0b0f257c715171bb1bd1a129ffcb8cff2591d6cf0e67fee42bb01f67ef81cb36e98755f5537308c30f9dd840965016311439120e1ff4fc3b724090
6
+ metadata.gz: 623466449dc736362fed892249981bb374b1f76b541272e65205bebbea1b2b20d2f4f0b94d700040849bc297f874a4f1041197b3fb09e69a147649b87920ae56
7
+ data.tar.gz: 872085623dfbde8c840a2c4fe03f0105c23c46c60c62b00af26c34373731008a163004fa24c668dd49682d93618e0b113c2686e2a138868d08dcdef49572cc60
data/CHANGELOG.md ADDED
@@ -0,0 +1,6 @@
1
+ # Changelog
2
+
3
+ ## 0.2.4
4
+
5
+ - Renames the data column on table_views to config
6
+ - Adds descriptions to table view
data/Gemfile CHANGED
@@ -14,6 +14,7 @@ gem "selenium-webdriver", "~> 4.17"
14
14
  gem "slim", "~> 5.2"
15
15
  gem "debug"
16
16
  gem "overmind", require: false
17
+ gem "rack-mini-profiler"
17
18
 
18
19
  group :development, :test do
19
20
  gem "standard", require: false
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- mensa (0.2.2)
4
+ mensa (0.2.4)
5
5
  caxlsx_rails (~> 0)
6
6
  importmap-rails
7
7
  pagy (>= 43)
@@ -122,7 +122,7 @@ GEM
122
122
  reline (>= 0.3.8)
123
123
  diffy (3.4.4)
124
124
  drb (2.2.3)
125
- erb (5.1.3)
125
+ erb (6.0.0)
126
126
  erubi (1.13.1)
127
127
  globalid (1.3.0)
128
128
  activesupport (>= 6.1)
@@ -220,6 +220,8 @@ GEM
220
220
  nio4r (~> 2.0)
221
221
  racc (1.8.1)
222
222
  rack (3.2.4)
223
+ rack-mini-profiler (4.0.1)
224
+ rack (>= 1.2.0)
223
225
  rack-session (2.1.1)
224
226
  base64 (>= 0.1.0)
225
227
  rack (>= 3.0.0)
@@ -351,7 +353,7 @@ GEM
351
353
  rubocop-performance (~> 1.25.0)
352
354
  stimulus-rails (1.3.4)
353
355
  railties (>= 6.0.0)
354
- stringio (3.1.7)
356
+ stringio (3.1.8)
355
357
  tailwindcss-rails (3.3.2)
356
358
  railties (>= 7.0.0)
357
359
  tailwindcss-ruby (~> 3.0)
@@ -410,6 +412,7 @@ DEPENDENCIES
410
412
  overmind
411
413
  pry
412
414
  puma
415
+ rack-mini-profiler
413
416
  rubocop-rails
414
417
  ruby-lsp
415
418
  ruby-lsp-rails
data/README.md CHANGED
@@ -70,11 +70,13 @@ class UserTable < ApplicationTable
70
70
  link { |user| edit_user_path(user) }
71
71
  supports_views true # This table supports custom views
72
72
  show_header true
73
- view_columns_sorting false # Disabled for now
73
+ view_columns_ordering false # Disabled for now
74
74
  view_condensed false # Default false
75
75
  view_condensed_toggle true # Whether to show the toggle, default true
76
76
 
77
77
  # Add system views
78
+ # Mensa will always create a systemview (:default) with name 'All' showing all records.
79
+ # If you want to rename it, for example because you don't show all records in your default scope, add it and give it a name like below.
78
80
  view :concept do
79
81
  name "Concept"
80
82
  filter :state do
@@ -99,7 +101,7 @@ Custom views are views not defined by the developer (SystemViews) but by the end
99
101
 
100
102
  Initial support for custom-views is there, but pretty rudimentary:
101
103
 
102
- `Mensa::TableView.create(table: "users", name: "Guests", data: {filters: {role: {value: "guest"}}})`
104
+ `Mensa::TableView.create(table: "users", name: "Guests", config: {filters: {role: {value: "guest"}}})`
103
105
 
104
106
  ### Fast
105
107
 
@@ -124,10 +126,16 @@ end
124
126
  export BUNDLE_RUBYGEMS__PKG__GITHUB__COM=ghp_xxxxxxw
125
127
  export RBENV_VERSION=$(cat .ruby-version)
126
128
  ```
129
+
127
130
  - Run `direnv allow`
131
+
132
+ If you use devcontainers:
128
133
  - Open with Visual Studio Code (or with any other editor) and reopen in container.
129
134
  - Run `bin/overmind s`
130
135
 
136
+ If you're not using devcontainers:
137
+ - Run `bin/overmind s`
138
+
131
139
  ### Docs
132
140
 
133
141
  Using the following in your view will render Mensa::Table::Component
@@ -137,10 +145,16 @@ Using the following in your view will render Mensa::Table::Component
137
145
 
138
146
  The Mensa::Table::Component will render:
139
147
  - Mensa::Search::Component
140
- - Mensa::FilterList::Component
148
+ - Mensa::FilterPillList::Component
149
+ - Mensa::FilterPill::Component
150
+ - Mensa::AddFilter::Component
141
151
  - Mensa::Views::Component
142
152
  - renders a views list
143
153
  - Mensa::ControlBar::Component
154
+ - search icon
155
+ - filter icon
156
+ - condensed toggle
157
+ - export icon
144
158
  - turbo-frame with the actual table you see (which is rendered by Mensa::View::Component)
145
159
 
146
160
  ## Installation
@@ -1,7 +1,7 @@
1
1
  @import '../../../components/mensa/add_filter/component.css';
2
2
  @import '../../../components/mensa/cell/component.css';
3
3
  @import '../../../components/mensa/control_bar/component.css';
4
- @import '../../../components/mensa/filter_list/component.css';
4
+ @import '../../../components/mensa/filter_pill_list/component.css';
5
5
  @import '../../../components/mensa/header/component.css';
6
6
  @import '../../../components/mensa/row_action/component.css';
7
7
  @import '../../../components/mensa/search/component.css';
@@ -1,6 +1,6 @@
1
- .sts-table__add_filter data-controller="mensa-add-filter" data-mensa-add-filter-mensa-table-outlet=".mensa-table#table-#{table.table_id}"
2
- button.relative.w-full.cursor-default.rounded-md.bg-white.dark:bg-gray-800.py-1.5.pl-3.pr-6.text-left.text-gray-900.dark:text-gray-400.shadow-sm.border.border-dashed.focus:outline-none.focus:ring-2.focus:ring-primary-600.sm:text-sm.sm:leading-6 type="button" data-action="mensa-add-filter#toggle"
3
- span.block.truncate data-mensa-add-filter-target="description"
1
+ .sts-table__add_filter data-controller="mensa-add-filter" data-mensa-add-filter-mensa-filter-pill-list-outlet="#mensa-filter-pill-list-#{table.table_id}"
2
+ button.relative.w-full.cursor-default.rounded-md.bg-white.dark:bg-gray-800.py-1.5.pl-3.pr-6.text-left.text-gray-400.dark:text-gray-400.shadow-sm.border.border-dashed.focus:outline-none.focus:ring-2.focus:ring-primary-600.sm:text-sm.sm:leading-6 type="button" data-action="mensa-add-filter#toggle"
3
+ span.mr-2.block.truncate data-mensa-add-filter-target="description"
4
4
  = t('.add_filter')
5
5
  span.pointer-events-none.absolute.inset-y-0.right-0.flex.items-center.pr-2
6
6
  div class=Mensa.config.icons[:filters_add_filter]
@@ -13,4 +13,4 @@
13
13
  .check.hidden.text-primary-600.absolute.inset-y-0.left-0.flex.items-center.pl-3
14
14
  .fal.fa-check
15
15
 
16
- div.hidden.sts-table__add_filter__popover_container data-mensa-add-filter-target="valuePopover" id="mensa-filter-value-#{SecureRandom.base36}"
16
+ div.hidden.sts-table__add_filter__popover_container data-mensa-add-filter-target="valuePopover" id="mensa-filter-pill-value-#{SecureRandom.base36}"
@@ -10,4 +10,4 @@ module Mensa
10
10
  end
11
11
  end
12
12
  end
13
- end
13
+ end
@@ -4,13 +4,14 @@ import { get } from '@rails/request.js'
4
4
 
5
5
  export default class AddFilterComponentController extends ApplicationController {
6
6
  static outlets = [
7
- "mensa-table"
7
+ "mensa-filter-pill-list"
8
8
  ]
9
9
  static targets = [
10
10
  'filterList', // all filters
11
11
  'filterListItem', // individual filters
12
12
  'description', // contains the filter description in the "tab"
13
- 'valuePopover' // contains the filter-value
13
+ 'valuePopover', // contains the filter-value
14
+ 'value'
14
15
  ]
15
16
  static values = {
16
17
  supportsViews: Boolean
@@ -21,7 +22,7 @@ export default class AddFilterComponentController extends ApplicationController
21
22
 
22
23
  // this.filterValueEntered = debounce(this.filterValueEntered, 500).bind(this)
23
24
  // this.filterValueEntered = this.filterValueEntered.bind(this)
24
- this.selectedFilterColumn = null
25
+ this._selectedFilterColumn = null
25
26
  }
26
27
 
27
28
  // Called when you click add-filter
@@ -31,7 +32,7 @@ export default class AddFilterComponentController extends ApplicationController
31
32
 
32
33
  // Called when you selected a column
33
34
  openValuePopover(event) {
34
- let url = this.ourUrl
35
+ let url = this.mensaFilterPillListOutlet.ourUrl
35
36
  url.pathname += `/filters/${this.selectedFilterColumn}`
36
37
  url.searchParams.append('target', this.valuePopoverTarget.id)
37
38
 
@@ -63,26 +64,23 @@ export default class AddFilterComponentController extends ApplicationController
63
64
  filterValueEntered(event) {
64
65
  this.valuePopoverTarget.classList.add('hidden')
65
66
 
66
- let url = this.ourUrl
67
-
68
- let filters = url.searchParams.get('filters') || {}
69
- this.mensaTableOutlet.mensaFilterOutlets.forEach((filterOutlet) => {
70
- url.searchParams.append(`filters[${filterOutlet.columnNameValue}][value]`, filterOutlet.valueValue)
71
- url.searchParams.append(`filters[${filterOutlet.columnNameValue}][operator]`, filterOutlet.operatorValue)
72
- })
73
- // FIXME: Needs better way of getting value
74
- url.searchParams.append(`filters[${this.selectedFilterColumn}][value]`, event.target.value)
75
-
76
- get(url, {
77
- responseKind: 'turbo-stream'
78
- }).then(() => {
79
- // FIXME: There should be a better way to do this, possibly using
80
- // this.mensaTableOutlet.filterListTarget.addEventListener("turbo:after-stream-render", this.unhide.bind(this)) ?
81
- setTimeout(() => {
82
- this.mensaTableOutlet.filterListTarget.classList.remove('hidden')
83
- }, 50)
84
- })
67
+ this.mensaFilterPillListOutlet.refreshFilters()
85
68
  event.preventDefault()
86
69
  return false
87
70
  }
71
+
72
+ reset(event) {
73
+ this.descriptionTarget.innerText = 'Add filter'
74
+ this.selectedFilterColumn = null
75
+ this.valuePopoverTarget.classList.add('hidden')
76
+ }
77
+
78
+
79
+ get selectedFilterColumn() {
80
+ return this._selectedFilterColumn
81
+ }
82
+
83
+ set selectedFilterColumn(value) {
84
+ this._selectedFilterColumn = value
85
+ }
88
86
  }
@@ -5,7 +5,7 @@
5
5
  i class=Mensa.config.icons[:control_bar_search]
6
6
  - if table.supports_filters? && table.filters?
7
7
  i class=Mensa.config.icons[:control_bar_filter]
8
- /- if view_columns_sorting?
8
+ /- if view_columns_ordering?
9
9
  button.cursor-pointer.w-6.h-full.text-gray-400
10
10
  i class=Mensa.config.icons[:control_bar_edit]
11
11
  - if view_condensed_toggle?
@@ -9,8 +9,8 @@ module Mensa
9
9
  @table = table
10
10
  end
11
11
 
12
- def view_columns_sorting?
13
- table.view_columns_sorting?
12
+ def view_columns_ordering?
13
+ table.view_columns_ordering?
14
14
  end
15
15
 
16
16
  def view_condensed_toggle?
@@ -0,0 +1,6 @@
1
+ .relative.mensa-filter-pill data-controller="mensa-filter-pill" data-mensa-filter-pill-column-name-value=filter.column.name data-mensa-filter-pill-value-value=filter.value data-mensa-filter-pill-operator-value=filter.operator
2
+ button.relative.w-full.cursor-default.rounded-md.bg-white.dark:bg-gray-800.py-1.5.pl-3.text-left.text-gray-900.dark:text-gray-400.shadow-sm.ring-1.ring-inset.ring-gray-300.dark:ring-gray-600.focus:outline-none.focus:ring-2.focus:ring-primary-600.sm:text-sm.sm:leading-6[type="button" aria-haspopup="listbox" aria-expanded="true" aria-labelledby="listbox-label"]
3
+ span.block.truncate.pr-8
4
+ = filter
5
+ span.pointer-events-none.absolute.inset-y-0.right-0.flex.items-center.pr-2
6
+ .fa.fal.fa-xmark
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mensa
4
+ module FilterPill
5
+ class Component < ::Mensa::ApplicationComponent
6
+ with_collection_parameter :filter
7
+
8
+ attr_reader :filter
9
+
10
+ def initialize(filter:)
11
+ @filter = filter
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,6 +1,6 @@
1
1
  import ApplicationController from 'mensa/controllers/application_controller'
2
2
 
3
- export default class FilterComponentController extends ApplicationController {
3
+ export default class FilterPillComponentController extends ApplicationController {
4
4
  static values = {
5
5
  columnName: String,
6
6
  operator: String,
@@ -0,0 +1,8 @@
1
+ .mensa-table__filters.hidden id="mensa-filter-pill-list-#{table.table_id}" data-controller="mensa-filter-pill-list" data-mensa-table-target="filterList" data-mensa-filter-pill-list-mensa-table-outlet=".mensa-table#table-#{table.table_id}" data-mensa-filter-pill-list-mensa-filter-pill-outlet=".mensa-filter-pill" data-mensa-filter-pill-list-mensa-add-filter-outlet="[data-controller=mensa-add-filter]"
2
+ .block
3
+ nav
4
+ .flex.space-x-2.overflow-none.whitespace-nowrap.scroll-p-0[aria-label="Tabs"]
5
+ / existing filters first
6
+ = render Mensa::FilterPill::Component.with_collection(table.active_filters)
7
+
8
+ = render Mensa::AddFilter::Component.new(table: table)
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Mensa
4
- module FilterList
4
+ module FilterPillList
5
5
  class Component < ::Mensa::ApplicationComponent
6
6
  attr_reader :table
7
7
 
@@ -0,0 +1,50 @@
1
+ import ApplicationController from 'mensa/controllers/application_controller'
2
+ import { get } from '@rails/request.js'
3
+
4
+ export default class FilterPillListComponentController extends ApplicationController {
5
+ static outlets = [
6
+ "mensa-table",
7
+ "mensa-filter-pill",
8
+ "mensa-add-filter"
9
+ ]
10
+
11
+ static targets = [
12
+ ]
13
+
14
+ static values = {
15
+ supportsViews: Boolean
16
+ }
17
+
18
+ connect() {
19
+ super.connect()
20
+ }
21
+
22
+ refreshFilters() {
23
+ let url = this.mensaTableOutlet.ourUrl
24
+
25
+ let filters = url.searchParams.get('filters') || {}
26
+ this.mensaFilterPillOutlets.forEach((filterOutlet) => {
27
+ url.searchParams.append(`filters[${filterOutlet.columnNameValue}][value]`, filterOutlet.valueValue)
28
+ url.searchParams.append(`filters[${filterOutlet.columnNameValue}][operator]`, filterOutlet.operatorValue)
29
+ })
30
+
31
+ url.searchParams.append(`filters[${this.mensaAddFilterOutlet.selectedFilterColumn}][value]`, this.mensaAddFilterOutlet.valueTarget.value)
32
+ url.searchParams.append(`filters[${this.mensaAddFilterOutlet.selectedFilterColumn}][operator]`, 'equals')
33
+
34
+
35
+ get(url, {
36
+ responseKind: 'turbo-stream'
37
+ }).then(() => {
38
+ // FIXME: There should be a better way to do this, possibly using
39
+ // this.mensaTableOutlet.filterListTarget.addEventListener("turbo:after-stream-render", this.unhide.bind(this)) ?
40
+ setTimeout(() => {
41
+ this.mensaTableOutlet.filterListTarget.classList.remove('hidden')
42
+ }, 50)
43
+ })
44
+ }
45
+
46
+ get ourUrl() {
47
+ let url = this.mensaTableOutlet.ourUrl
48
+ return url
49
+ }
50
+ }
@@ -16,4 +16,4 @@ module Mensa
16
16
  end
17
17
  end
18
18
  end
19
- end
19
+ end
@@ -16,4 +16,4 @@ module Mensa
16
16
  end
17
17
  end
18
18
  end
19
- end
19
+ end
@@ -1,4 +1,4 @@
1
- .mensa-table__search data-mensa-table-target="search" data-controller="mensa-search" data-mensa-search-target="search" class="#{table.supports_views? ? 'hidden' : ''}" data-mensa-search-mensa-table-outlet=".mensa-table#table-#{table.table_id}"
1
+ .mensa-table__search data-mensa-table-target="search" data-controller="mensa-search" data-mensa-search-target="search" class="#{table.supports_views? ? 'hidden' : ''}" data-mensa-search-mensa-table-outlet=".mensa-table#table-#{table.table_id}"
2
2
  .flex
3
3
  .flex-none.w-6.h-22.text-right.text-gray-500.dark:text-gray-400
4
4
  i.cursor-pointer class=Mensa.config.icons[:search]
@@ -10,4 +10,4 @@ module Mensa
10
10
  end
11
11
  end
12
12
  end
13
- end
13
+ end
@@ -29,7 +29,7 @@ export default class SearchComponentController extends ApplicationController {
29
29
  this.resetSearchButtonTarget.classList.add("hidden")
30
30
 
31
31
  let turboFrame = this.element.closest("turbo-frame")
32
- let url = this.ourUrl
32
+ let url = this.mensaTableOutlet.ourUrl
33
33
  url.searchParams.delete("query")
34
34
 
35
35
  get(url, {
@@ -45,7 +45,7 @@ export default class SearchComponentController extends ApplicationController {
45
45
  }
46
46
 
47
47
  // FIXME: This doesn't prevent searching twice on enter, the turbo-frame URL doesn't change
48
- let url = this.ourUrl
48
+ let url = this.mensaTableOutlet.ourUrl
49
49
  if (url.searchParams.get("query") === this.query) {
50
50
  return
51
51
  }
@@ -1,7 +1,7 @@
1
- .mensa-table id="table-#{table.table_id}" data-mensa-table-view-condensed-value="#{table.view_condensed?}" data-mensa-table-supports-views-value="#{table.supports_views?}" data-controller="mensa-table" data-mensa-table-mensa-filter-outlet="[data-controller='mensa-filter']"
1
+ .mensa-table id="table-#{table.table_id}" data-mensa-table-view-condensed-value="#{table.view_condensed?}" data-mensa-table-supports-views-value="#{table.supports_views?}" data-controller="mensa-table" data-mensa-table-mensa-filter-pill-outlet="[data-controller='mensa-filter-pill']"
2
2
  = render Mensa::Search::Component.new(table: table)
3
3
  div id="filters-#{table.table_id}"
4
- = render Mensa::FilterList::Component.new(table: table)
4
+ = render Mensa::FilterPillList::Component.new(table: table)
5
5
  - if table.supports_views? && table.show_header?
6
6
  = render Mensa::Views::Component.new(table: table)
7
- turbo-frame id=table.table_id src=helpers.mensa.table_path(table.name, {turbo_frame_id: table.table_id}.merge(params)) target="_top" loading="lazy" data-mensa-table-target="turboFrame"
7
+ turbo-frame id=table.table_id src=helpers.mensa.table_url(table.name, {turbo_frame_id: table.table_id}.merge(params)) target="_top" loading="lazy" data-mensa-table-target="turboFrame" data-turbo-permanent=""
@@ -2,8 +2,6 @@ import ApplicationController from "mensa/controllers/application_controller";
2
2
  import { get } from "@rails/request.js";
3
3
 
4
4
  export default class TableComponentController extends ApplicationController {
5
- static outlets = ["mensa-filter"]
6
-
7
5
  static targets = [
8
6
  "controlBar", // Bar with buttons
9
7
  "condenseExpandIcon", // Icon
@@ -20,6 +18,9 @@ export default class TableComponentController extends ApplicationController {
20
18
 
21
19
  connect() {
22
20
  super.connect();
21
+
22
+ // FIXME: Workaround for https://github.com/hotwired/turbo/issues/886
23
+ this.turboFrameTarget.removeAttribute('loading');
23
24
  }
24
25
 
25
26
  openFiltersAndSearch(event) {
@@ -77,4 +78,15 @@ export default class TableComponentController extends ApplicationController {
77
78
  url.pathname += ".xlsx";
78
79
  get(url, {}).then(() => { });
79
80
  }
81
+
82
+ get ourUrl() {
83
+ let url
84
+
85
+ if (this.turboFrameTarget?.getAttribute('src')) {
86
+ url = new URL(this.turboFrameTarget.getAttribute('src'))
87
+ } else {
88
+ url = new URL(window.location.href)
89
+ }
90
+ return url
91
+ }
80
92
  }
@@ -16,4 +16,4 @@ module Mensa
16
16
  end
17
17
  end
18
18
  end
19
- end
19
+ end
@@ -10,4 +10,13 @@
10
10
  @apply bg-gray-300 text-gray-800 dark:bg-gray-500 hover:bg-gray-400;
11
11
  }
12
12
  }
13
- }
13
+ }
14
+
15
+ .tippy-box[data-theme~='mensa'] {
16
+ @apply bg-gray-200 text-gray-800 dark:text-gray-400;
17
+ }
18
+
19
+ .tippy-box[data-theme~='mensa'] .tippy-arrow {
20
+ @apply text-gray-200;
21
+ }
22
+
@@ -9,7 +9,7 @@
9
9
  nav.flex.justify-between[aria-label="Tabs"]
10
10
  .flex.space-x-2.overflow-x-auto.whitespace-nowrap.scroll-p-0
11
11
  - table.all_views.each.with_index do |view, index|
12
- = link_to(table.path(table_view_id: view.id, turbo_frame_id: table.table_id), "data-turbo-frame": table.table_id, class: "view #{(view.id == table.table_view&.id || view.id == :all && table.table_view.blank?) ? 'selected' : ''}", data: {"mensa-views-target": "view", action: "mensa-views#select"}) do
12
+ = link_to(table.path(table_view_id: view.id, turbo_frame_id: table.table_id), "data-turbo-frame": table.table_id, class: "view #{(view.id == table.table_view&.id || view.id == :default && table.table_view.blank?) ? 'selected' : ''}", data: {"mensa-views-target": "view", action: "mensa-views#select", "tippy-content": view.description}) do
13
13
  = view.name
14
14
 
15
15
  - if table.supports_custom_views?
@@ -1,10 +1,19 @@
1
1
  import ApplicationController from 'mensa/controllers/application_controller'
2
+ import tippy from 'tippy.js'
2
3
 
3
4
  export default class ViewsComponentController extends ApplicationController {
4
5
  static targets = [
5
6
  'view',
6
7
  ]
7
8
 
9
+ connect() {
10
+ tippy('[data-controller="mensa-views"] [data-tippy-content]', {
11
+ placement: "top",
12
+ theme: 'mensa',
13
+ offset: [0, 8]
14
+ });
15
+ }
16
+
8
17
  select(event) {
9
18
  this.viewTargets.forEach((element) => {
10
19
  (element === event.target) ? element.classList.add('selected') : element.classList.remove('selected')
@@ -1,4 +1,4 @@
1
1
  module Mensa
2
- class ApplicationController < ActionController::Base#::Mensa.config.base_controller.constantize
2
+ class ApplicationController < ::Mensa.config.base_controller.constantize
3
3
  end
4
4
  end
@@ -5,7 +5,8 @@ module Mensa
5
5
 
6
6
  class Filter
7
7
  include ActiveModel::Model
8
- attr_accessor :value
8
+
9
+ attr_accessor :column, :value
9
10
  end
10
11
 
11
12
  def index
@@ -1,7 +1,5 @@
1
1
  module Mensa
2
- class TablesController < ::ApplicationController
3
- layout :decide_layout
4
-
2
+ class TablesController < ApplicationController
5
3
  def show
6
4
  @table = Mensa.for_name(params[:id])
7
5
 
@@ -9,7 +7,7 @@ module Mensa
9
7
  if params[:table_view_id]
10
8
  @view = Mensa::TableView.find_by(table_name: params[:id], id: params[:table_view_id])
11
9
  @view ||= @table.system_views.find { |v| v.id == params[:table_view_id].to_sym }
12
- config = @view&.data
10
+ config = @view&.config
13
11
  end
14
12
 
15
13
  config = config.merge(params.permit!.to_h)
@@ -21,17 +19,13 @@ module Mensa
21
19
  @table.original_view_context = helpers
22
20
 
23
21
  respond_to do |format|
24
- format.turbo_stream
22
+ format.turbo_stream # Used for filterering
25
23
  format.html
26
24
  format.xlsx do
27
25
  Mensa::ExportJob.perform_later(current_user, params[:id])
28
- head 200
26
+ head :ok
29
27
  end
30
28
  end
31
29
  end
32
-
33
- def decide_layout
34
- false if params[:turbo_frame_id]
35
- end
36
30
  end
37
31
  end
@@ -1,5 +1,4 @@
1
1
  module Mensa
2
2
  module ApplicationHelper
3
-
4
3
  end
5
4
  end
@@ -2,15 +2,15 @@
2
2
  import { Controller } from '@hotwired/stimulus'
3
3
 
4
4
  export default class ApplicationController extends Controller {
5
- connect () {
5
+ connect() {
6
6
  this.element[this.identifier] = this
7
7
  }
8
8
 
9
- getController (element, identifier) {
9
+ getController(element, identifier) {
10
10
  return this.application.getControllerForElementAndIdentifier(element, identifier)
11
11
  }
12
12
 
13
- triggerEvent (el, name, data) {
13
+ triggerEvent(el, name, data) {
14
14
  let event
15
15
  if (typeof window.CustomEvent === 'function') {
16
16
  event = new CustomEvent(name, { detail: data, cancelable: true, bubbles: true })
@@ -21,14 +21,14 @@ export default class ApplicationController extends Controller {
21
21
  el.dispatchEvent(event)
22
22
  }
23
23
 
24
- elementScrolled (element) {
24
+ elementScrolled(element) {
25
25
  if (element.scrollHeight - Math.round(element.scrollTop) === element.clientHeight) {
26
26
  return true
27
27
  }
28
28
  return false
29
29
  }
30
30
 
31
- debouncedHover (element, timeout, handler) {
31
+ debouncedHover(element, timeout, handler) {
32
32
  var timeoutId = null
33
33
  element.addEventListener(marker, 'mouseover', function () {
34
34
  timeoutId = setTimeout(handler, timeout)
@@ -38,20 +38,4 @@ export default class ApplicationController extends Controller {
38
38
  clearTimeout(timeoutId)
39
39
  })
40
40
  }
41
-
42
- get ourUrl () {
43
- // This requires the mensaTableOutlet
44
- let turboFrame = this.mensaTableOutlet?.turboFrameTarget
45
- if(!turboFrame) {
46
- turboFrame = this.turboFrameTarget
47
- }
48
- let url
49
-
50
- if (turboFrame && turboFrame.getAttribute('src')) {
51
- url = new URL(turboFrame.getAttribute('src'))
52
- } else {
53
- url = new URL(window.location.href)
54
- }
55
- return url
56
- }
57
41
  }