rails-active-ui 0.2.2 → 0.3.0
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.
- checksums.yaml +4 -4
- data/app/assets/datatables.css +15 -0
- data/app/assets/stylesheets.css +5 -1
- data/app/blocks/resource_list_block.rb +153 -0
- data/app/components/back_button_component.rb +34 -0
- data/app/components/button_component.rb +4 -2
- data/app/components/button_to_component.rb +3 -4
- data/app/components/column_component.rb +1 -1
- data/app/components/container_component.rb +1 -1
- data/app/components/dropdown_component.rb +8 -2
- data/app/components/grid_component.rb +5 -1
- data/app/components/link_to_component.rb +23 -0
- data/app/components/menu_item_component.rb +5 -1
- data/app/components/message_component.rb +3 -1
- data/app/components/modal_component.rb +23 -3
- data/app/components/paragraph_component.rb +13 -0
- data/app/components/row_component.rb +1 -1
- data/app/components/table_row_component.rb +3 -5
- data/app/components/template_component.rb +13 -0
- data/app/helpers/component_helper.rb +122 -76
- data/app/helpers/fui_helper.rb +37 -0
- data/app/javascript/datatables.js +10 -0
- data/app/javascript/ui/controllers/fui_datatable_controller.js +35 -0
- data/app/javascript/ui/controllers/fui_dropdown_controller.js +8 -1
- data/app/javascript/ui/controllers/fui_item_list_controller.js +40 -0
- data/app/javascript/ui/controllers/navigation_controller.js +23 -0
- data/app/javascript/ui/index.js +11 -0
- data/app/lib/component.rb +1 -1
- data/config/importmap.rb +3 -0
- data/config/initializers/ruby_template_handler.rb +4 -1
- data/lib/ui/engine.rb +7 -2
- data/lib/ui/version.rb +1 -1
- metadata +13 -7
- data/app/components/link_component.rb +0 -23
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b4d757cb8e531748c2dcde875e3cb392d48761d9ed189c27529b0f22aa6b4b14
|
|
4
|
+
data.tar.gz: dc1cb8fe68aa62b5043b8ac05c9a854d0e39109276b81dedaa6eb6b4066811d6
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 7b5b180f6047444c680f25dc58c0f8a576e7072b3314715595a3e71065ce45d1be09a5bbdb90daf15d362d6d6623c0856cfc2864bbde54f5340d6891666d18ae
|
|
7
|
+
data.tar.gz: 69c369de011b93a25e57ec58a0531026de888b9b393f15c56e5dac7b87eeacef1ae09bed57b2862ef420abfe54310de76f801d2c69298aacd6a111e9e3166bcb
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This combined file was created by the DataTables downloader builder:
|
|
3
|
+
* https://datatables.net/download
|
|
4
|
+
*
|
|
5
|
+
* To rebuild or modify this file with the latest versions of the included
|
|
6
|
+
* software please visit:
|
|
7
|
+
* https://datatables.net/download/#se/jq-3.7.0/dt-2.3.7
|
|
8
|
+
*
|
|
9
|
+
* Included libraries:
|
|
10
|
+
* jQuery 3.7.0, DataTables 2.3.7
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
:root{--dt-row-selected: 224, 224, 224;--dt-row-selected-text: 0, 0, 0;--dt-row-selected-link: 228, 228, 228;--dt-row-stripe: 0, 0, 0;--dt-row-hover: 0, 0, 0;--dt-column-ordering: 0, 0, 0;--dt-header-align-items: center;--dt-header-vertical-align: middle;--dt-html-background: white}:root.dark{--dt-html-background: rgb(33, 37, 41)}table.dataTable tbody td.dt-control{text-align:center;cursor:pointer}table.dataTable tbody td.dt-control:before{display:inline-block;box-sizing:border-box;content:"";border-top:5px solid transparent;border-left:10px solid rgba(0, 0, 0, 0.5);border-bottom:5px solid transparent;border-right:0px solid transparent}table.dataTable tbody tr.dt-hasChild td.dt-control:before{border-top:10px solid rgba(0, 0, 0, 0.5);border-left:5px solid transparent;border-bottom:0px solid transparent;border-right:5px solid transparent}table.dataTable tfoot:empty{display:none}html.dark table.dataTable td.dt-control:before,:root[data-bs-theme=dark] table.dataTable td.dt-control:before,:root[data-theme=dark] table.dataTable td.dt-control:before{border-left-color:rgba(255, 255, 255, 0.5)}html.dark table.dataTable tr.dt-hasChild td.dt-control:before,:root[data-bs-theme=dark] table.dataTable tr.dt-hasChild td.dt-control:before,:root[data-theme=dark] table.dataTable tr.dt-hasChild td.dt-control:before{border-top-color:rgba(255, 255, 255, 0.5);border-left-color:transparent}div.dt-scroll{width:100%}div.dt-scroll-body thead tr,div.dt-scroll-body tfoot tr{height:0}div.dt-scroll-body thead tr th,div.dt-scroll-body thead tr td,div.dt-scroll-body tfoot tr th,div.dt-scroll-body tfoot tr td{height:0 !important;padding-top:0px !important;padding-bottom:0px !important;border-top-width:0px !important;border-bottom-width:0px !important}div.dt-scroll-body thead tr th div.dt-scroll-sizing,div.dt-scroll-body thead tr td div.dt-scroll-sizing,div.dt-scroll-body tfoot tr th div.dt-scroll-sizing,div.dt-scroll-body tfoot tr td div.dt-scroll-sizing{height:0 !important;overflow:hidden !important}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead>tr>th.dt-orderable-asc .dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-asc .dt-column-order:before,table.dataTable thead>tr>td.dt-orderable-asc .dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-asc .dt-column-order:before{position:absolute;display:block;bottom:50%;content:"▲";content:"▲"/""}table.dataTable thead>tr>th.dt-orderable-desc .dt-column-order:after,table.dataTable thead>tr>th.dt-ordering-desc .dt-column-order:after,table.dataTable thead>tr>td.dt-orderable-desc .dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-desc .dt-column-order:after{position:absolute;display:block;top:50%;content:"▼";content:"▼"/""}table.dataTable thead>tr>th.dt-orderable-asc .dt-column-order,table.dataTable thead>tr>th.dt-orderable-desc .dt-column-order,table.dataTable thead>tr>th.dt-ordering-asc .dt-column-order,table.dataTable thead>tr>th.dt-ordering-desc .dt-column-order,table.dataTable thead>tr>td.dt-orderable-asc .dt-column-order,table.dataTable thead>tr>td.dt-orderable-desc .dt-column-order,table.dataTable thead>tr>td.dt-ordering-asc .dt-column-order,table.dataTable thead>tr>td.dt-ordering-desc .dt-column-order{position:relative;width:12px;height:20px}table.dataTable thead>tr>th.dt-orderable-asc .dt-column-order:before,table.dataTable thead>tr>th.dt-orderable-asc .dt-column-order:after,table.dataTable thead>tr>th.dt-orderable-desc .dt-column-order:before,table.dataTable thead>tr>th.dt-orderable-desc .dt-column-order:after,table.dataTable thead>tr>th.dt-ordering-asc .dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-asc .dt-column-order:after,table.dataTable thead>tr>th.dt-ordering-desc .dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-desc .dt-column-order:after,table.dataTable thead>tr>td.dt-orderable-asc .dt-column-order:before,table.dataTable thead>tr>td.dt-orderable-asc .dt-column-order:after,table.dataTable thead>tr>td.dt-orderable-desc .dt-column-order:before,table.dataTable thead>tr>td.dt-orderable-desc .dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-asc .dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-asc .dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-desc .dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-desc .dt-column-order:after{left:0;opacity:.125;line-height:9px;font-size:.8em}table.dataTable thead>tr>th.dt-orderable-asc,table.dataTable thead>tr>th.dt-orderable-desc,table.dataTable thead>tr>td.dt-orderable-asc,table.dataTable thead>tr>td.dt-orderable-desc{cursor:pointer}table.dataTable thead>tr>th.dt-orderable-asc:hover,table.dataTable thead>tr>th.dt-orderable-desc:hover,table.dataTable thead>tr>td.dt-orderable-asc:hover,table.dataTable thead>tr>td.dt-orderable-desc:hover{outline:2px solid rgba(0, 0, 0, 0.05);outline-offset:-2px}table.dataTable thead>tr>th.dt-ordering-asc .dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-desc .dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-asc .dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-desc .dt-column-order:after{opacity:.6}table.dataTable thead>tr>th.dt-orderable-none:not(.dt-ordering-asc,.dt-ordering-desc) .dt-column-order:empty,table.dataTable thead>tr>th.sorting_desc_disabled .dt-column-order:after,table.dataTable thead>tr>th.sorting_asc_disabled .dt-column-order:before,table.dataTable thead>tr>td.dt-orderable-none:not(.dt-ordering-asc,.dt-ordering-desc) .dt-column-order:empty,table.dataTable thead>tr>td.sorting_desc_disabled .dt-column-order:after,table.dataTable thead>tr>td.sorting_asc_disabled .dt-column-order:before{display:none}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead>tr>th div.dt-column-header,table.dataTable thead>tr>th div.dt-column-footer,table.dataTable thead>tr>td div.dt-column-header,table.dataTable thead>tr>td div.dt-column-footer,table.dataTable tfoot>tr>th div.dt-column-header,table.dataTable tfoot>tr>th div.dt-column-footer,table.dataTable tfoot>tr>td div.dt-column-header,table.dataTable tfoot>tr>td div.dt-column-footer{display:flex;justify-content:space-between;align-items:var(--dt-header-align-items);gap:4px}table.dataTable thead>tr>th div.dt-column-header .dt-column-title,table.dataTable thead>tr>th div.dt-column-footer .dt-column-title,table.dataTable thead>tr>td div.dt-column-header .dt-column-title,table.dataTable thead>tr>td div.dt-column-footer .dt-column-title,table.dataTable tfoot>tr>th div.dt-column-header .dt-column-title,table.dataTable tfoot>tr>th div.dt-column-footer .dt-column-title,table.dataTable tfoot>tr>td div.dt-column-header .dt-column-title,table.dataTable tfoot>tr>td div.dt-column-footer .dt-column-title{flex-grow:1}table.dataTable thead>tr>th div.dt-column-header .dt-column-title:empty,table.dataTable thead>tr>th div.dt-column-footer .dt-column-title:empty,table.dataTable thead>tr>td div.dt-column-header .dt-column-title:empty,table.dataTable thead>tr>td div.dt-column-footer .dt-column-title:empty,table.dataTable tfoot>tr>th div.dt-column-header .dt-column-title:empty,table.dataTable tfoot>tr>th div.dt-column-footer .dt-column-title:empty,table.dataTable tfoot>tr>td div.dt-column-header .dt-column-title:empty,table.dataTable tfoot>tr>td div.dt-column-footer .dt-column-title:empty{display:none}div.dt-scroll-body>table.dataTable>thead>tr>th,div.dt-scroll-body>table.dataTable>thead>tr>td{overflow:hidden}:root.dark table.dataTable thead>tr>th.dt-orderable-asc:hover,:root.dark table.dataTable thead>tr>th.dt-orderable-desc:hover,:root.dark table.dataTable thead>tr>td.dt-orderable-asc:hover,:root.dark table.dataTable thead>tr>td.dt-orderable-desc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>th.dt-orderable-asc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>th.dt-orderable-desc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>td.dt-orderable-asc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>td.dt-orderable-desc:hover{outline:2px solid rgba(255, 255, 255, 0.05)}div.dt-processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-22px;text-align:center;padding:2px;z-index:10}div.dt-processing>div:last-child{position:relative;width:80px;height:15px;margin:1em auto}div.dt-processing>div:last-child>div{position:absolute;top:0;width:13px;height:13px;border-radius:50%;background:rgb(224, 224, 224);background:rgb(var(--dt-row-selected));animation-timing-function:cubic-bezier(0, 1, 1, 0)}div.dt-processing>div:last-child>div:nth-child(1){left:8px;animation:datatables-loader-1 .6s infinite}div.dt-processing>div:last-child>div:nth-child(2){left:8px;animation:datatables-loader-2 .6s infinite}div.dt-processing>div:last-child>div:nth-child(3){left:32px;animation:datatables-loader-2 .6s infinite}div.dt-processing>div:last-child>div:nth-child(4){left:56px;animation:datatables-loader-3 .6s infinite}@keyframes datatables-loader-1{0%{transform:scale(0)}100%{transform:scale(1)}}@keyframes datatables-loader-3{0%{transform:scale(1)}100%{transform:scale(0)}}@keyframes datatables-loader-2{0%{transform:translate(0, 0)}100%{transform:translate(24px, 0)}}table.dataTable.ui.table.nowrap th,table.dataTable.ui.table.nowrap td{white-space:nowrap}table.dataTable.ui.table th,table.dataTable.ui.table td{box-sizing:border-box}table.dataTable.ui.table th.dt-type-numeric,table.dataTable.ui.table th.dt-type-date,table.dataTable.ui.table td.dt-type-numeric,table.dataTable.ui.table td.dt-type-date{text-align:right}table.dataTable.ui.table th.dt-type-numeric div.dt-column-header,table.dataTable.ui.table th.dt-type-numeric div.dt-column-footer,table.dataTable.ui.table th.dt-type-date div.dt-column-header,table.dataTable.ui.table th.dt-type-date div.dt-column-footer,table.dataTable.ui.table td.dt-type-numeric div.dt-column-header,table.dataTable.ui.table td.dt-type-numeric div.dt-column-footer,table.dataTable.ui.table td.dt-type-date div.dt-column-header,table.dataTable.ui.table td.dt-type-date div.dt-column-footer{flex-direction:row-reverse}table.dataTable.ui.table th.dt-left,table.dataTable.ui.table td.dt-left{text-align:left}table.dataTable.ui.table th.dt-left div.dt-column-header,table.dataTable.ui.table th.dt-left div.dt-column-footer,table.dataTable.ui.table td.dt-left div.dt-column-header,table.dataTable.ui.table td.dt-left div.dt-column-footer{flex-direction:row}table.dataTable.ui.table th.dt-center,table.dataTable.ui.table td.dt-center{text-align:center}table.dataTable.ui.table th.dt-right,table.dataTable.ui.table td.dt-right{text-align:right}table.dataTable.ui.table th.dt-right div.dt-column-header,table.dataTable.ui.table th.dt-right div.dt-column-footer,table.dataTable.ui.table td.dt-right div.dt-column-header,table.dataTable.ui.table td.dt-right div.dt-column-footer{flex-direction:row-reverse}table.dataTable.ui.table th.dt-justify,table.dataTable.ui.table td.dt-justify{text-align:justify}table.dataTable.ui.table th.dt-justify div.dt-column-header,table.dataTable.ui.table th.dt-justify div.dt-column-footer,table.dataTable.ui.table td.dt-justify div.dt-column-header,table.dataTable.ui.table td.dt-justify div.dt-column-footer{flex-direction:row}table.dataTable.ui.table th.dt-nowrap,table.dataTable.ui.table td.dt-nowrap{white-space:nowrap}table.dataTable.ui.table th.dt-empty,table.dataTable.ui.table td.dt-empty{text-align:center;vertical-align:top}table.dataTable.ui.table thead th,table.dataTable.ui.table thead td,table.dataTable.ui.table tfoot th,table.dataTable.ui.table tfoot td{text-align:left;vertical-align:var(--dt-header-vertical-align)}table.dataTable.ui.table thead th.dt-head-left,table.dataTable.ui.table thead td.dt-head-left,table.dataTable.ui.table tfoot th.dt-head-left,table.dataTable.ui.table tfoot td.dt-head-left{text-align:left}table.dataTable.ui.table thead th.dt-head-left div.dt-column-header,table.dataTable.ui.table thead th.dt-head-left div.dt-column-footer,table.dataTable.ui.table thead td.dt-head-left div.dt-column-header,table.dataTable.ui.table thead td.dt-head-left div.dt-column-footer,table.dataTable.ui.table tfoot th.dt-head-left div.dt-column-header,table.dataTable.ui.table tfoot th.dt-head-left div.dt-column-footer,table.dataTable.ui.table tfoot td.dt-head-left div.dt-column-header,table.dataTable.ui.table tfoot td.dt-head-left div.dt-column-footer{flex-direction:row}table.dataTable.ui.table thead th.dt-head-center,table.dataTable.ui.table thead td.dt-head-center,table.dataTable.ui.table tfoot th.dt-head-center,table.dataTable.ui.table tfoot td.dt-head-center{text-align:center}table.dataTable.ui.table thead th.dt-head-right,table.dataTable.ui.table thead td.dt-head-right,table.dataTable.ui.table tfoot th.dt-head-right,table.dataTable.ui.table tfoot td.dt-head-right{text-align:right}table.dataTable.ui.table thead th.dt-head-right div.dt-column-header,table.dataTable.ui.table thead th.dt-head-right div.dt-column-footer,table.dataTable.ui.table thead td.dt-head-right div.dt-column-header,table.dataTable.ui.table thead td.dt-head-right div.dt-column-footer,table.dataTable.ui.table tfoot th.dt-head-right div.dt-column-header,table.dataTable.ui.table tfoot th.dt-head-right div.dt-column-footer,table.dataTable.ui.table tfoot td.dt-head-right div.dt-column-header,table.dataTable.ui.table tfoot td.dt-head-right div.dt-column-footer{flex-direction:row-reverse}table.dataTable.ui.table thead th.dt-head-justify,table.dataTable.ui.table thead td.dt-head-justify,table.dataTable.ui.table tfoot th.dt-head-justify,table.dataTable.ui.table tfoot td.dt-head-justify{text-align:justify}table.dataTable.ui.table thead th.dt-head-justify div.dt-column-header,table.dataTable.ui.table thead th.dt-head-justify div.dt-column-footer,table.dataTable.ui.table thead td.dt-head-justify div.dt-column-header,table.dataTable.ui.table thead td.dt-head-justify div.dt-column-footer,table.dataTable.ui.table tfoot th.dt-head-justify div.dt-column-header,table.dataTable.ui.table tfoot th.dt-head-justify div.dt-column-footer,table.dataTable.ui.table tfoot td.dt-head-justify div.dt-column-header,table.dataTable.ui.table tfoot td.dt-head-justify div.dt-column-footer{flex-direction:row}table.dataTable.ui.table thead th.dt-head-nowrap,table.dataTable.ui.table thead td.dt-head-nowrap,table.dataTable.ui.table tfoot th.dt-head-nowrap,table.dataTable.ui.table tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable.ui.table tbody th.dt-body-left,table.dataTable.ui.table tbody td.dt-body-left{text-align:left}table.dataTable.ui.table tbody th.dt-body-center,table.dataTable.ui.table tbody td.dt-body-center{text-align:center}table.dataTable.ui.table tbody th.dt-body-right,table.dataTable.ui.table tbody td.dt-body-right{text-align:right}table.dataTable.ui.table tbody th.dt-body-justify,table.dataTable.ui.table tbody td.dt-body-justify{text-align:justify}table.dataTable.ui.table tbody th.dt-body-nowrap,table.dataTable.ui.table tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable.table{margin:0}table.dataTable.table.ui.striped>tbody>tr:nth-child(2n){background-color:transparent}table.dataTable.table>tbody>tr{background-color:transparent}table.dataTable.table>tbody>tr.selected>*{box-shadow:inset 0 0 0 9999px rgb(224, 224, 224);box-shadow:inset 0 0 0 9999px rgb(var(--dt-row-selected));color:rgb(0, 0, 0);color:rgb(var(--dt-row-selected-text))}table.dataTable.table>tbody>tr.selected a{color:rgb(228, 228, 228);color:rgb(var(--dt-row-selected-link))}table.dataTable.table.striped>tbody>tr:nth-child(2n)>*{box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-stripe), 0.02)}table.dataTable.table.striped>tbody>tr:nth-child(2n).selected>*{box-shadow:inset 0 0 0 9999px rgba(224, 224, 224, 0.92);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.92)}table.dataTable.table.hover>tbody>tr:hover>*{box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover), 0.05)}table.dataTable.table.hover>tbody>tr.selected:hover>*{box-shadow:inset 0 0 0 9999px rgba(224, 224, 224, 0.95);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.95)}table.dataTable.table>thead>tr>td{text-align:inherit;color:rgba(0, 0, 0, 0.87);padding:.5em .78571429em;vertical-align:inherit;font-style:none;text-transform:none;border-bottom:1px solid rgba(34, 36, 38, 0.1)}table.dataTable.table.celled>thead>tr>td:not(:first-child){border-left:1px solid rgba(34, 36, 38, 0.1)}:root{--dt-row-selected: 224, 224, 224;--dt-row-selected-text: 0, 0, 0;--dt-row-selected-link: 228, 228, 228;--dt-row-stripe: 0, 0, 0;--dt-row-hover: 0, 0, 0;--dt-column-ordering: 0, 0, 0;--dt-header-align-items: center;--dt-header-vertical-align: middle;--dt-html-background: white}:root.dark{--dt-html-background: rgb(33, 37, 41)}table.dataTable tbody td.dt-control{text-align:center;cursor:pointer}table.dataTable tbody td.dt-control:before{display:inline-block;box-sizing:border-box;content:"";border-top:5px solid transparent;border-left:10px solid rgba(0, 0, 0, 0.5);border-bottom:5px solid transparent;border-right:0px solid transparent}table.dataTable tbody tr.dt-hasChild td.dt-control:before{border-top:10px solid rgba(0, 0, 0, 0.5);border-left:5px solid transparent;border-bottom:0px solid transparent;border-right:5px solid transparent}table.dataTable tfoot:empty{display:none}html.dark table.dataTable td.dt-control:before,:root[data-bs-theme=dark] table.dataTable td.dt-control:before,:root[data-theme=dark] table.dataTable td.dt-control:before{border-left-color:rgba(255, 255, 255, 0.5)}html.dark table.dataTable tr.dt-hasChild td.dt-control:before,:root[data-bs-theme=dark] table.dataTable tr.dt-hasChild td.dt-control:before,:root[data-theme=dark] table.dataTable tr.dt-hasChild td.dt-control:before{border-top-color:rgba(255, 255, 255, 0.5);border-left-color:transparent}div.dt-scroll{width:100%}div.dt-scroll-body thead tr,div.dt-scroll-body tfoot tr{height:0}div.dt-scroll-body thead tr th,div.dt-scroll-body thead tr td,div.dt-scroll-body tfoot tr th,div.dt-scroll-body tfoot tr td{height:0 !important;padding-top:0px !important;padding-bottom:0px !important;border-top-width:0px !important;border-bottom-width:0px !important}div.dt-scroll-body thead tr th div.dt-scroll-sizing,div.dt-scroll-body thead tr td div.dt-scroll-sizing,div.dt-scroll-body tfoot tr th div.dt-scroll-sizing,div.dt-scroll-body tfoot tr td div.dt-scroll-sizing{height:0 !important;overflow:hidden !important}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead>tr>th.dt-orderable-asc .dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-asc .dt-column-order:before,table.dataTable thead>tr>td.dt-orderable-asc .dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-asc .dt-column-order:before{position:absolute;display:block;bottom:50%;content:"▲";content:"▲"/""}table.dataTable thead>tr>th.dt-orderable-desc .dt-column-order:after,table.dataTable thead>tr>th.dt-ordering-desc .dt-column-order:after,table.dataTable thead>tr>td.dt-orderable-desc .dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-desc .dt-column-order:after{position:absolute;display:block;top:50%;content:"▼";content:"▼"/""}table.dataTable thead>tr>th.dt-orderable-asc .dt-column-order,table.dataTable thead>tr>th.dt-orderable-desc .dt-column-order,table.dataTable thead>tr>th.dt-ordering-asc .dt-column-order,table.dataTable thead>tr>th.dt-ordering-desc .dt-column-order,table.dataTable thead>tr>td.dt-orderable-asc .dt-column-order,table.dataTable thead>tr>td.dt-orderable-desc .dt-column-order,table.dataTable thead>tr>td.dt-ordering-asc .dt-column-order,table.dataTable thead>tr>td.dt-ordering-desc .dt-column-order{position:relative;width:12px;height:20px}table.dataTable thead>tr>th.dt-orderable-asc .dt-column-order:before,table.dataTable thead>tr>th.dt-orderable-asc .dt-column-order:after,table.dataTable thead>tr>th.dt-orderable-desc .dt-column-order:before,table.dataTable thead>tr>th.dt-orderable-desc .dt-column-order:after,table.dataTable thead>tr>th.dt-ordering-asc .dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-asc .dt-column-order:after,table.dataTable thead>tr>th.dt-ordering-desc .dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-desc .dt-column-order:after,table.dataTable thead>tr>td.dt-orderable-asc .dt-column-order:before,table.dataTable thead>tr>td.dt-orderable-asc .dt-column-order:after,table.dataTable thead>tr>td.dt-orderable-desc .dt-column-order:before,table.dataTable thead>tr>td.dt-orderable-desc .dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-asc .dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-asc .dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-desc .dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-desc .dt-column-order:after{left:0;opacity:.125;line-height:9px;font-size:.8em}table.dataTable thead>tr>th.dt-orderable-asc,table.dataTable thead>tr>th.dt-orderable-desc,table.dataTable thead>tr>td.dt-orderable-asc,table.dataTable thead>tr>td.dt-orderable-desc{cursor:pointer}table.dataTable thead>tr>th.dt-orderable-asc:hover,table.dataTable thead>tr>th.dt-orderable-desc:hover,table.dataTable thead>tr>td.dt-orderable-asc:hover,table.dataTable thead>tr>td.dt-orderable-desc:hover{outline:2px solid rgba(0, 0, 0, 0.05);outline-offset:-2px}table.dataTable thead>tr>th.dt-ordering-asc .dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-desc .dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-asc .dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-desc .dt-column-order:after{opacity:.6}table.dataTable thead>tr>th.dt-orderable-none:not(.dt-ordering-asc,.dt-ordering-desc) .dt-column-order:empty,table.dataTable thead>tr>th.sorting_desc_disabled .dt-column-order:after,table.dataTable thead>tr>th.sorting_asc_disabled .dt-column-order:before,table.dataTable thead>tr>td.dt-orderable-none:not(.dt-ordering-asc,.dt-ordering-desc) .dt-column-order:empty,table.dataTable thead>tr>td.sorting_desc_disabled .dt-column-order:after,table.dataTable thead>tr>td.sorting_asc_disabled .dt-column-order:before{display:none}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead>tr>th div.dt-column-header,table.dataTable thead>tr>th div.dt-column-footer,table.dataTable thead>tr>td div.dt-column-header,table.dataTable thead>tr>td div.dt-column-footer,table.dataTable tfoot>tr>th div.dt-column-header,table.dataTable tfoot>tr>th div.dt-column-footer,table.dataTable tfoot>tr>td div.dt-column-header,table.dataTable tfoot>tr>td div.dt-column-footer{display:flex;justify-content:space-between;align-items:var(--dt-header-align-items);gap:4px}table.dataTable thead>tr>th div.dt-column-header .dt-column-title,table.dataTable thead>tr>th div.dt-column-footer .dt-column-title,table.dataTable thead>tr>td div.dt-column-header .dt-column-title,table.dataTable thead>tr>td div.dt-column-footer .dt-column-title,table.dataTable tfoot>tr>th div.dt-column-header .dt-column-title,table.dataTable tfoot>tr>th div.dt-column-footer .dt-column-title,table.dataTable tfoot>tr>td div.dt-column-header .dt-column-title,table.dataTable tfoot>tr>td div.dt-column-footer .dt-column-title{flex-grow:1}table.dataTable thead>tr>th div.dt-column-header .dt-column-title:empty,table.dataTable thead>tr>th div.dt-column-footer .dt-column-title:empty,table.dataTable thead>tr>td div.dt-column-header .dt-column-title:empty,table.dataTable thead>tr>td div.dt-column-footer .dt-column-title:empty,table.dataTable tfoot>tr>th div.dt-column-header .dt-column-title:empty,table.dataTable tfoot>tr>th div.dt-column-footer .dt-column-title:empty,table.dataTable tfoot>tr>td div.dt-column-header .dt-column-title:empty,table.dataTable tfoot>tr>td div.dt-column-footer .dt-column-title:empty{display:none}div.dt-scroll-body>table.dataTable>thead>tr>th,div.dt-scroll-body>table.dataTable>thead>tr>td{overflow:hidden}:root.dark table.dataTable thead>tr>th.dt-orderable-asc:hover,:root.dark table.dataTable thead>tr>th.dt-orderable-desc:hover,:root.dark table.dataTable thead>tr>td.dt-orderable-asc:hover,:root.dark table.dataTable thead>tr>td.dt-orderable-desc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>th.dt-orderable-asc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>th.dt-orderable-desc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>td.dt-orderable-asc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>td.dt-orderable-desc:hover{outline:2px solid rgba(255, 255, 255, 0.05)}div.dt-container div.dt-layout-row{display:flex;justify-content:space-between;align-items:center;width:100%;margin:.75em 0}div.dt-container div.dt-layout-row div.dt-layout-cell{display:flex;justify-content:space-between;align-items:center}div.dt-container div.dt-layout-row div.dt-layout-cell.dt-layout-start{justify-content:flex-start;margin-right:auto}div.dt-container div.dt-layout-row div.dt-layout-cell.dt-layout-end{justify-content:flex-end;margin-left:auto}div.dt-container div.dt-layout-row div.dt-layout-cell:empty{display:none}@media screen and (max-width: 767px){div.dt-container div.dt-layout-row:not(.dt-layout-table){display:block}div.dt-container div.dt-layout-row:not(.dt-layout-table) div.dt-layout-cell{display:block;text-align:center}div.dt-container div.dt-layout-row:not(.dt-layout-table) div.dt-layout-cell>*{margin:.5em 0}div.dt-container div.dt-layout-row:not(.dt-layout-table) div.dt-layout-cell.dt-layout-start{margin-right:0}div.dt-container div.dt-layout-row:not(.dt-layout-table) div.dt-layout-cell.dt-layout-end{margin-left:0}}div.dt-container div.dt-layout-start>*:not(:last-child){margin-right:1em}div.dt-container div.dt-layout-end>*:not(:first-child){margin-left:1em}div.dt-container div.dt-layout-full{width:100%}div.dt-container div.dt-layout-full>*:only-child{margin-left:auto;margin-right:auto}div.dt-container div.dt-layout-table>div{display:block !important}@media screen and (max-width: 767px){div.dt-container div.dt-layout-start>*:not(:last-child){margin-right:0}div.dt-container div.dt-layout-end>*:not(:first-child){margin-left:0}}div.dt-container.dt-semanticUI{position:relative}div.dt-container.dt-semanticUI>div.row{display:flex;padding-top:.5rem;padding-bottom:.5rem}div.dt-container.dt-semanticUI>div.row:first-child{padding-top:1rem}div.dt-container.dt-semanticUI>div.row:last-child{padding-bottom:1rem}div.dt-container.dt-semanticUI div.dt-length select{vertical-align:middle;min-height:2.7142em}div.dt-container.dt-semanticUI div.dt-length .ui.selection.dropdown{min-width:0}div.dt-container.dt-semanticUI div.dt-search span.input{margin-left:.5em}div.dt-container.dt-semanticUI div.dt-info{white-space:nowrap}div.dt-container.dt-semanticUI div.dt-processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;text-align:center}div.dt-container.dt-semanticUI div.dt-scroll{width:100%;padding:0}div.dt-container.dt-semanticUI div.dt-scroll-head table.dataTable{border-bottom-right-radius:0;border-bottom-left-radius:0;border-bottom:none}div.dt-container.dt-semanticUI div.dt-scroll-body thead .dt-orderable-asc:before,div.dt-container.dt-semanticUI div.dt-scroll-body thead .dt-orderable-desc:after{display:none}div.dt-container.dt-semanticUI div.dt-scroll-body table.dataTable{border-radius:0;border-top:none;border-bottom-width:0}div.dt-container.dt-semanticUI div.dt-scroll-body table.dataTable.no-footer{border-bottom-width:1px}div.dt-container.dt-semanticUI div.dt-scroll-foot table.dataTable{border-top-right-radius:0;border-top-left-radius:0;border-top:none}@media screen and (max-width: 767px){div.dt-container div.left,div.dt-container div.right{text-align:center !important}}
|
|
14
|
+
|
|
15
|
+
|
data/app/assets/stylesheets.css
CHANGED
|
@@ -73552,4 +73552,8 @@ body.pushable > .pusher {
|
|
|
73552
73552
|
100% {
|
|
73553
73553
|
background-color: #fcfcfd;
|
|
73554
73554
|
}
|
|
73555
|
-
}
|
|
73555
|
+
}
|
|
73556
|
+
|
|
73557
|
+
.padding {
|
|
73558
|
+
padding: 1rem;
|
|
73559
|
+
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# ResourceListBlock — a searchable, scrollable list panel for any resource.
|
|
4
|
+
#
|
|
5
|
+
# Composes Header, Input, Button, and turbo-framed partial iteration into
|
|
6
|
+
# a single reusable block. Designed for sidebar/master-list patterns where
|
|
7
|
+
# a Ransack search filters a collection rendered via a per-item partial.
|
|
8
|
+
#
|
|
9
|
+
# Usage:
|
|
10
|
+
# ResourceListBlock(
|
|
11
|
+
# heading: "Notes",
|
|
12
|
+
# search_url: notes_path,
|
|
13
|
+
# search_query: @q,
|
|
14
|
+
# search_predicate: "title_cont",
|
|
15
|
+
# resources: @notes,
|
|
16
|
+
# item_partial: "notes/note_card",
|
|
17
|
+
# item_local: "note",
|
|
18
|
+
# new_path: new_note_path,
|
|
19
|
+
# turbo_frame: "notes-list",
|
|
20
|
+
# id: "item-list-panel"
|
|
21
|
+
# )
|
|
22
|
+
#
|
|
23
|
+
# The search section is omitted when search_query is nil.
|
|
24
|
+
# The "new" button is omitted when new_path is nil.
|
|
25
|
+
# The list is wrapped in a turbo frame when turbo_frame is provided.
|
|
26
|
+
#
|
|
27
|
+
# For auto-submit / live-search behaviour, pass Stimulus wiring via
|
|
28
|
+
# search_form_data:
|
|
29
|
+
#
|
|
30
|
+
# ResourceListBlock(
|
|
31
|
+
# ...,
|
|
32
|
+
# search_form_data: {
|
|
33
|
+
# controller: "auto-submit",
|
|
34
|
+
# action: "input->auto-submit#submit",
|
|
35
|
+
# turbo_frame: "notes-list"
|
|
36
|
+
# }
|
|
37
|
+
# )
|
|
38
|
+
#
|
|
39
|
+
# HTML structure (all sections wrapped for predictable styling):
|
|
40
|
+
#
|
|
41
|
+
# div.resource-list-block
|
|
42
|
+
# div.resource-list-header
|
|
43
|
+
# [HStack with heading + button]
|
|
44
|
+
# div.resource-list-search
|
|
45
|
+
# [search_form_for with Input]
|
|
46
|
+
# turbo-frame (optional)
|
|
47
|
+
# div.resource-list-items
|
|
48
|
+
# [rendered partials]
|
|
49
|
+
|
|
50
|
+
class ResourceListBlock < Component
|
|
51
|
+
attribute :heading, :string, default: nil
|
|
52
|
+
attribute :search_url, default: nil
|
|
53
|
+
attribute :search_query, default: nil
|
|
54
|
+
attribute :search_predicate, :string, default: "title_cont"
|
|
55
|
+
attribute :search_placeholder, :string, default: "Search\u2026"
|
|
56
|
+
attribute :search_form_data, default: nil
|
|
57
|
+
attribute :new_path, :string, default: nil
|
|
58
|
+
attribute :resources, default: nil
|
|
59
|
+
attribute :item_partial, :string, default: nil
|
|
60
|
+
attribute :item_local, :string, default: "resource"
|
|
61
|
+
attribute :turbo_frame, :string, default: nil
|
|
62
|
+
|
|
63
|
+
def to_s
|
|
64
|
+
tag.div(**merge_html_options(class: "resource-list-block")) {
|
|
65
|
+
safe_join([
|
|
66
|
+
render_header,
|
|
67
|
+
render_search,
|
|
68
|
+
render_list,
|
|
69
|
+
@content
|
|
70
|
+
])
|
|
71
|
+
}
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
private
|
|
75
|
+
|
|
76
|
+
# ── Header ──────────────────────────────────────────────────────────
|
|
77
|
+
# Heading text on the left, optional "new" button on the right.
|
|
78
|
+
|
|
79
|
+
def render_header
|
|
80
|
+
return if heading.nil? && new_path.nil?
|
|
81
|
+
|
|
82
|
+
heading_html = heading ? render_component(HeaderComponent, size: :h3) { heading } : nil
|
|
83
|
+
button_html = new_path ? render_component(ButtonComponent, href: new_path, size: :mini, icon: "plus", variant: :primary) : nil
|
|
84
|
+
|
|
85
|
+
tag.div(class: "resource-list-header") {
|
|
86
|
+
render_component(HStackComponent, spacing: 8, justify: "between", align: "center") {
|
|
87
|
+
safe_join([ heading_html, button_html ])
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# ── Search ──────────────────────────────────────────────────────────
|
|
93
|
+
# Ransack search_form_for wrapping an Input. Omitted when search_query
|
|
94
|
+
# is nil. The form targets the turbo frame so only the list refreshes.
|
|
95
|
+
|
|
96
|
+
def render_search
|
|
97
|
+
return if search_query.nil?
|
|
98
|
+
|
|
99
|
+
form_html_opts = { class: "ui form" }
|
|
100
|
+
form_data = build_search_form_data
|
|
101
|
+
form_html_opts[:data] = form_data if form_data.present?
|
|
102
|
+
|
|
103
|
+
search_value = search_query.try(search_predicate)
|
|
104
|
+
|
|
105
|
+
tag.div(class: "resource-list-search") {
|
|
106
|
+
@view_context.search_form_for(search_query, url: search_url, html: form_html_opts) {
|
|
107
|
+
InputComponent.new(
|
|
108
|
+
fluid: true,
|
|
109
|
+
icon: "search",
|
|
110
|
+
placeholder: search_placeholder,
|
|
111
|
+
name: "q[#{search_predicate}]",
|
|
112
|
+
value: search_value
|
|
113
|
+
).render_in(@view_context)
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# ── List ────────────────────────────────────────────────────────────
|
|
119
|
+
# Iterates resources and renders the item partial for each one.
|
|
120
|
+
# Optionally wrapped in a turbo frame for scoped replacement.
|
|
121
|
+
|
|
122
|
+
def render_list
|
|
123
|
+
items = tag.div(class: "resource-list-items") {
|
|
124
|
+
safe_join(
|
|
125
|
+
Array(resources).map { |resource|
|
|
126
|
+
@view_context.render(partial: item_partial, locals: { item_local.to_sym => resource })
|
|
127
|
+
}
|
|
128
|
+
)
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if turbo_frame
|
|
132
|
+
@view_context.turbo_frame_tag(turbo_frame) { items }
|
|
133
|
+
else
|
|
134
|
+
items
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
# ── Helpers ─────────────────────────────────────────────────────────
|
|
139
|
+
|
|
140
|
+
def render_component(klass, **kwargs, &block)
|
|
141
|
+
klass.new(**kwargs).render_in(@view_context, &block)
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def build_search_form_data
|
|
145
|
+
data = (search_form_data || {}).dup
|
|
146
|
+
# When a turbo frame is configured and the consumer hasn't explicitly
|
|
147
|
+
# set a turbo_frame on the form, default to targeting the list frame.
|
|
148
|
+
if turbo_frame && !data.key?(:turbo_frame)
|
|
149
|
+
data[:turbo_frame] = turbo_frame
|
|
150
|
+
end
|
|
151
|
+
data
|
|
152
|
+
end
|
|
153
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# BackButton - link that restores Turbo history when possible.
|
|
4
|
+
#
|
|
5
|
+
# Usage:
|
|
6
|
+
# BackButton(href: "/dashboard")
|
|
7
|
+
# BackButton(href: "/notes", icon: "arrow left")
|
|
8
|
+
|
|
9
|
+
class BackButtonComponent < Component
|
|
10
|
+
attribute :href, :string, default: "#"
|
|
11
|
+
attribute :label, :string, default: "Back"
|
|
12
|
+
attribute :icon, :string, default: nil
|
|
13
|
+
attribute :css_class, :string, default: "item"
|
|
14
|
+
attribute :controller, :string, default: "navigation"
|
|
15
|
+
attribute :action, :string, default: "navigation#back"
|
|
16
|
+
attribute :turbo_action, :string, default: "replace"
|
|
17
|
+
|
|
18
|
+
def to_s
|
|
19
|
+
icon_el = icon ? tag.i(class: "#{icon} icon") : nil
|
|
20
|
+
content = @content.presence || ERB::Util.html_escape(label)
|
|
21
|
+
|
|
22
|
+
tag.a(
|
|
23
|
+
**merge_html_options(
|
|
24
|
+
href: href,
|
|
25
|
+
class: css_class,
|
|
26
|
+
data: {
|
|
27
|
+
controller: controller,
|
|
28
|
+
action: action,
|
|
29
|
+
turbo_action: turbo_action
|
|
30
|
+
}
|
|
31
|
+
)
|
|
32
|
+
) { safe_join([ icon_el, content ]) }
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -40,10 +40,12 @@ class ButtonComponent < Component
|
|
|
40
40
|
icon_el = icon ? tag.i(class: "#{icon} icon") : nil
|
|
41
41
|
content = safe_join([ icon_el, @content ])
|
|
42
42
|
|
|
43
|
+
opts = merge_html_options(class: classes)
|
|
44
|
+
|
|
43
45
|
if href
|
|
44
|
-
tag.a(
|
|
46
|
+
tag.a(**opts, href: href) { content }
|
|
45
47
|
else
|
|
46
|
-
tag.button(
|
|
48
|
+
tag.button(**opts, type: type) { content }
|
|
47
49
|
end
|
|
48
50
|
end
|
|
49
51
|
end
|
|
@@ -31,13 +31,12 @@ class ButtonToComponent < Component
|
|
|
31
31
|
"button"
|
|
32
32
|
)
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
html_opts = { method: method.to_sym }
|
|
35
|
+
html_opts[:form] = { data: { turbo_confirm: confirm } } if confirm
|
|
36
36
|
|
|
37
37
|
@view_context.button_to(
|
|
38
38
|
url,
|
|
39
|
-
|
|
40
|
-
class: classes
|
|
39
|
+
html_opts.merge(class: classes)
|
|
41
40
|
) { @content }
|
|
42
41
|
end
|
|
43
42
|
end
|
|
@@ -26,6 +26,7 @@ class DropdownComponent < Component
|
|
|
26
26
|
attribute :labeled, :boolean, default: false
|
|
27
27
|
attribute :loading, :boolean, default: false
|
|
28
28
|
attribute :disabled, :boolean, default: false
|
|
29
|
+
attribute :action, :string, default: nil
|
|
29
30
|
|
|
30
31
|
def to_s
|
|
31
32
|
classes = class_names(
|
|
@@ -41,13 +42,18 @@ class DropdownComponent < Component
|
|
|
41
42
|
|
|
42
43
|
data = { controller: "fui-dropdown" }
|
|
43
44
|
data[:fui_dropdown_clearable_value] = "true" if clearable
|
|
44
|
-
data[:fui_dropdown_placeholder_value] = placeholder if placeholder
|
|
45
|
+
data[:fui_dropdown_placeholder_value] = placeholder if placeholder && !inline
|
|
46
|
+
data[:fui_dropdown_action_value] = action if action
|
|
45
47
|
|
|
46
48
|
hidden_opts = { type: "hidden", value: default_value || "" }
|
|
47
49
|
hidden_opts[:name] = name if name
|
|
48
50
|
|
|
49
51
|
search_el = search ? tag.input(class: "search") : nil
|
|
50
|
-
text_el =
|
|
52
|
+
text_el = if inline
|
|
53
|
+
tag.div(class: "text") { tag.h2(class: "ui header") { placeholder || "" } }
|
|
54
|
+
else
|
|
55
|
+
tag.div(class: "text") { placeholder || "" }
|
|
56
|
+
end
|
|
51
57
|
menu_el = tag.div(class: "menu") { @content }
|
|
52
58
|
|
|
53
59
|
tag.div(class: classes, data: data) {
|
|
@@ -45,13 +45,14 @@ class GridComponent < Component
|
|
|
45
45
|
"grid"
|
|
46
46
|
)
|
|
47
47
|
|
|
48
|
-
tag.div(class: classes) { @content }
|
|
48
|
+
tag.div(**merge_html_options(class: classes)) { @content }
|
|
49
49
|
end
|
|
50
50
|
|
|
51
51
|
private
|
|
52
52
|
|
|
53
53
|
def divided_class
|
|
54
54
|
case divided
|
|
55
|
+
when "t", "1" then "divided"
|
|
55
56
|
when "vertically" then "vertically divided"
|
|
56
57
|
when "true", true then "divided"
|
|
57
58
|
when String then "#{divided} divided"
|
|
@@ -60,6 +61,7 @@ class GridComponent < Component
|
|
|
60
61
|
|
|
61
62
|
def celled_class
|
|
62
63
|
case celled
|
|
64
|
+
when "t", "1" then "celled"
|
|
63
65
|
when "internally" then "internally celled"
|
|
64
66
|
when "true", true then "celled"
|
|
65
67
|
when String then "#{celled} celled"
|
|
@@ -68,6 +70,7 @@ class GridComponent < Component
|
|
|
68
70
|
|
|
69
71
|
def padded_class
|
|
70
72
|
case padded
|
|
73
|
+
when "t", "1" then "padded"
|
|
71
74
|
when "vertically" then "vertically padded"
|
|
72
75
|
when "horizontally" then "horizontally padded"
|
|
73
76
|
when "true", true then "padded"
|
|
@@ -77,6 +80,7 @@ class GridComponent < Component
|
|
|
77
80
|
|
|
78
81
|
def relaxed_class
|
|
79
82
|
case relaxed
|
|
83
|
+
when "t", "1" then "relaxed"
|
|
80
84
|
when "very" then "very relaxed"
|
|
81
85
|
when "true", true then "relaxed"
|
|
82
86
|
when String then "#{relaxed} relaxed"
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# LinkTo - anchor element.
|
|
4
|
+
#
|
|
5
|
+
# Usage:
|
|
6
|
+
# LinkTo(href: "/about") { text "About Us" }
|
|
7
|
+
# LinkTo(href: "/help", target: "_blank") { text "Help" }
|
|
8
|
+
|
|
9
|
+
class LinkToComponent < Component
|
|
10
|
+
attribute :href, :string, default: "#"
|
|
11
|
+
attribute :target, :string, default: nil
|
|
12
|
+
attribute :rel, :string, default: nil
|
|
13
|
+
attribute :css_class, :string, default: nil
|
|
14
|
+
|
|
15
|
+
def to_s
|
|
16
|
+
opts = { href: href }
|
|
17
|
+
opts[:class] = css_class if css_class
|
|
18
|
+
opts[:target] = target if target
|
|
19
|
+
opts[:rel] = rel if rel
|
|
20
|
+
|
|
21
|
+
tag.a(**merge_html_options(**opts)) { @content }
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -23,6 +23,8 @@ class MenuItemComponent < Component
|
|
|
23
23
|
attribute :color, :string, default: nil
|
|
24
24
|
attribute :dropdown, :boolean, default: false
|
|
25
25
|
attribute :value, :string, default: nil
|
|
26
|
+
attribute :target, :string, default: nil
|
|
27
|
+
attribute :rel, :string, default: nil
|
|
26
28
|
|
|
27
29
|
def to_s
|
|
28
30
|
classes = class_names(
|
|
@@ -41,8 +43,10 @@ class MenuItemComponent < Component
|
|
|
41
43
|
icon_el = icon ? tag.i(class: "#{icon} icon") : nil
|
|
42
44
|
inner = icon_el ? safe_join([ icon_el, @content ]) : @content
|
|
43
45
|
|
|
44
|
-
opts =
|
|
46
|
+
opts = merge_html_options(class: classes)
|
|
45
47
|
opts["data-value"] = value if value
|
|
48
|
+
opts[:target] = target if target
|
|
49
|
+
opts[:rel] = rel if rel
|
|
46
50
|
|
|
47
51
|
if href
|
|
48
52
|
tag.a(**opts, href: href) { inner }
|
|
@@ -47,7 +47,9 @@ class MessageComponent < Component
|
|
|
47
47
|
content_parts = safe_join([ header_el, @content.presence ])
|
|
48
48
|
content_wrapper = icon ? tag.div(class: "content") { content_parts } : content_parts
|
|
49
49
|
|
|
50
|
-
|
|
50
|
+
opts = merge_html_options(class: classes)
|
|
51
|
+
|
|
52
|
+
tag.div(**opts) {
|
|
51
53
|
safe_join([ close_el, icon_el, content_wrapper ])
|
|
52
54
|
}
|
|
53
55
|
end
|
|
@@ -16,6 +16,10 @@
|
|
|
16
16
|
# c.header { text "Targeted Modal" }
|
|
17
17
|
# c.content { text "This modal can be targeted by DOM id." }
|
|
18
18
|
# }
|
|
19
|
+
#
|
|
20
|
+
# # Turbo-powered modal: drop in layout once, target from any link/button
|
|
21
|
+
# # with data: { turbo_frame: "modal" }
|
|
22
|
+
# Modal(turbo: true, blurring: true)
|
|
19
23
|
|
|
20
24
|
class ModalComponent < Component
|
|
21
25
|
attribute :id, :string, default: nil
|
|
@@ -26,6 +30,7 @@ class ModalComponent < Component
|
|
|
26
30
|
attribute :longer, :boolean, default: false
|
|
27
31
|
attribute :fullscreen, :boolean, default: false
|
|
28
32
|
attribute :scrolling, :boolean, default: false
|
|
33
|
+
attribute :turbo, :boolean, default: false
|
|
29
34
|
|
|
30
35
|
slot :header
|
|
31
36
|
slot :content
|
|
@@ -41,17 +46,32 @@ class ModalComponent < Component
|
|
|
41
46
|
"modal"
|
|
42
47
|
)
|
|
43
48
|
|
|
44
|
-
|
|
49
|
+
controllers = "fui-modal"
|
|
50
|
+
controllers = "fui-modal turbo-modal" if turbo
|
|
51
|
+
|
|
52
|
+
data = { controller: controllers }
|
|
45
53
|
data[:fui_modal_closable_value] = "false" unless closable
|
|
46
54
|
data[:fui_modal_blurring_value] = "true" if blurring
|
|
47
55
|
|
|
56
|
+
if turbo
|
|
57
|
+
data[:action] = "turbo:frame-load->turbo-modal#open turbo:submit-end->turbo-modal#closeOnSuccess"
|
|
58
|
+
end
|
|
59
|
+
|
|
48
60
|
close_el = closable ? tag.i(class: "close icon") : nil
|
|
49
61
|
header_el = @slots[:header] ? tag.div(class: "header") { @slots[:header] } : nil
|
|
50
62
|
content_cls = scrolling ? "scrolling content" : "content"
|
|
51
|
-
|
|
63
|
+
|
|
64
|
+
if turbo
|
|
65
|
+
frame_el = @view_context.turbo_frame_tag("modal")
|
|
66
|
+
inner = @slots[:content] ? safe_join([ @slots[:content], frame_el ]) : frame_el
|
|
67
|
+
content_el = tag.div(class: content_cls) { inner }
|
|
68
|
+
else
|
|
69
|
+
content_el = @slots[:content] ? tag.div(class: content_cls) { @slots[:content] } : nil
|
|
70
|
+
end
|
|
71
|
+
|
|
52
72
|
actions_el = @slots[:actions] ? tag.div(class: "actions") { @slots[:actions] } : nil
|
|
53
73
|
|
|
54
|
-
opts =
|
|
74
|
+
opts = merge_html_options(class: classes, data: data)
|
|
55
75
|
opts[:id] = id if id
|
|
56
76
|
|
|
57
77
|
tag.div(**opts) {
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Paragraph — a plain <p> element.
|
|
4
|
+
#
|
|
5
|
+
# Usage:
|
|
6
|
+
# Paragraph { text "Some text content" }
|
|
7
|
+
# Paragraph(id: "intro") { text "Introduction" }
|
|
8
|
+
|
|
9
|
+
class ParagraphComponent < Component
|
|
10
|
+
def to_s
|
|
11
|
+
tag.p(**merge_html_options) { @content }
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -34,10 +34,8 @@ class TableRowComponent < Component
|
|
|
34
34
|
("disabled" if disabled)
|
|
35
35
|
].compact
|
|
36
36
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
tag.tr { @content }
|
|
41
|
-
end
|
|
37
|
+
opts = {}
|
|
38
|
+
opts[:class] = classes.join(" ") if classes.any?
|
|
39
|
+
tag.tr(**merge_html_options(**opts)) { @content }
|
|
42
40
|
end
|
|
43
41
|
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Template - a plain <template> element.
|
|
4
|
+
#
|
|
5
|
+
# Usage:
|
|
6
|
+
# Template { text "content" }
|
|
7
|
+
# Template(data: { nested_form_target: "template" }) { text "..." }
|
|
8
|
+
|
|
9
|
+
class TemplateComponent < Component
|
|
10
|
+
def to_s
|
|
11
|
+
tag.template(**merge_html_options) { @content }
|
|
12
|
+
end
|
|
13
|
+
end
|