diff --git a/README.md b/README.md index e700f1a..535ac9d 100644 --- a/README.md +++ b/README.md @@ -238,6 +238,7 @@ Gem implements [Lookbook](https://lookbook.build) documentation for all componen ```ruby config.lookbook.preview_paths = [TurboMaterial::Engine.root.join('lib/lookbook')] +config.lookbook.preview_controller = 'TurboMaterial::LookbookController' ``` Or extend your existing config for `lookbook.preview_paths` with same value. diff --git a/app/assets/javascripts/turbo_material/material_data_table_controller.js b/app/assets/javascripts/turbo_material/material_data_table_controller.js new file mode 100644 index 0000000..3067977 --- /dev/null +++ b/app/assets/javascripts/turbo_material/material_data_table_controller.js @@ -0,0 +1,56 @@ +import { Controller } from "@hotwired/stimulus"; +import { Turbo } from "@hotwired/turbo-rails"; +import { put } from "@rails/request.js"; + +export default class extends Controller { + dataTable = undefined; + static values = { url: String, selectUrl: String, queryString: String, body: String, selectionType: String }; + + connect() { + this.dataTable = mdc.dataTable.MDCDataTable.attachTo(this.element); + this.dataTable.listen('MDCDataTable:sorted', this.sort.bind(this)); + this.dataTable.listen('MDCDataTable:rowSelectionChanged', this.select.bind(this)); + this.dataTable.listen('MDCDataTable:selectedAll', this.selectAll.bind(this)); + this.dataTable.listen('MDCDataTable:unselectedAll', this.unselectAll.bind(this)); + } + + sort(event) { + let params = new URLSearchParams(this.queryStringValue); + params.delete("order"); + params.delete("reverse"); + params.append("order", event.detail.columnId); + params.append("reverse", event.detail.sortValue === "descending" ? "true" : "false"); + let frame = this.element.querySelector('turbo-frame#pupils-table-data'); + Turbo.visit(`${this.urlValue}?${params.toString()}`); + // , { action: 'advance', frame: this.bodyValue } + // FIXME: get this back as soon as https://github.com/hotwired/turbo/issues/489 is fixed + } + + select(event) { + put(`${this.selectUrlValue || this.urlValue}/${event.detail.rowId}/select`, { + body: { + type: this.selectionTypeValue, + selected: event.detail.selected, + }, + responseKind: "turbo-stream", + }); + } + + selectAll(event, selected = true) { + let params = new URLSearchParams(this.queryStringValue); + put(`${this.selectUrlValue || this.urlValue}/select_all?${params.toString()}`, { + body: { + type: this.selectionTypeValue, + selected: selected, + }, + responseKind: "turbo-stream", + }); + } + + unselectAll(event) { + this.selectAll(event, false); + } + + disconnect() { + } +} diff --git a/app/controllers/turbo_material/lookbook_controller.rb b/app/controllers/turbo_material/lookbook_controller.rb new file mode 100644 index 0000000..b2e3096 --- /dev/null +++ b/app/controllers/turbo_material/lookbook_controller.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +module TurboMaterial + class LookbookController < Lookbook::PreviewController + layout 'turbo_material/lookbook' + end +end diff --git a/app/helpers/turbo_material/data_table_helper.rb b/app/helpers/turbo_material/data_table_helper.rb new file mode 100644 index 0000000..9ce9231 --- /dev/null +++ b/app/helpers/turbo_material/data_table_helper.rb @@ -0,0 +1,7 @@ +module TurboMaterial + module DataTableHelper + def material_data_table(kwargs = {}) + render "components/material_data_table", **kwargs + end + end +end diff --git a/app/views/common/_form.html.erb b/app/views/common/_form.html.erb new file mode 100644 index 0000000..605c525 --- /dev/null +++ b/app/views/common/_form.html.erb @@ -0,0 +1,7 @@ +
+
+
+
+
+
+
+
+
+ |
+ <%= render partial: table_headers_partial %>
+
---|