diff --git a/app/views/plugins/recommended.html.haml b/app/views/plugins/recommended.html.haml index 4cd0ce9..c0f9e7e 100644 --- a/app/views/plugins/recommended.html.haml +++ b/app/views/plugins/recommended.html.haml @@ -1,61 +1,61 @@ - page_title t('.page_title') -%table{class: "table table-striped table-hover", id: "plugins-table"} - %thead - %tr - %th{scope: "col", width: "24"} - %th{scope: "col"}= t('plugins.common.name') - %th{scope: "col"}= t('plugins.common.api_version') - %th{scope: "col"}= t('plugins.common.category') - %th{scope: "col"}= t('plugins.common.status') - %th{scope: "col"} - %tbody - - @plugins.each do |plugin| - %tr - %td - - unless plugin.installed? || plugin.processing? - = link_to t("terms.install"), install_plugins_path, class: "js-install btn btn-primary", data: { url: install_plugins_path, name: plugin.gem_name} - %td - %label{for: "plugin_#{plugin.gem_name}"} - = plugin.gem_name - %td - = plugin.api_version - %td - = plugin.category - %td - = plugin.status - %td - = link_to t('plugins.view_on_rubygems_org'), plugin.rubygems_org_page, target: "_blank" - +#plugins-table + %b-form-group.float-right(horizontal){"label" => t("terms.search")} + %b-input-group + %b-form-input{"v-model" => "filter"} + %b-input-group-append + %b-btn{ "v-bind:disabled" => "!filter", "v-on:click" => "filter = ''" } + = t("terms.clear") + %b-table(stripped hover small){"v-bind:items" => "items", + "v-bind:fields" => "fields", + "v-bind:filter" => "filter"} + %template{"slot" => "is_installed", "slot-scope" => "row"} + %template{"v-if" => "row.item.is_installed || row.item.is_processing"} +   + %template(v-else) + %b-button{"variant" => "primary", + "data-url" => install_plugins_path, + "v-bind:data-name" => "row.item.name", + "v-on:click" => "installPlugin"} + = t("terms.install") + %template{"slot" => "rubygems_org_page", "slot-scope" => "row"} + %a{"target" => "_blank", "v-bind:href" => "row.item.rubygems_org_page"} + = t("plugins.view_on_rubygems_org") :javascript window.addEventListener("load", () => { - $('#plugins-table').dataTable({ - "autoWidth": false, - "ordering": true, - "paging": false, - "info": false, - "searching": true, - "language": { - "search": "#{t("terms.search")} " + new Vue({ + name: "RecommendedPlugins", + el: "#plugins-table", + data() { + return { + fields: { + is_installed: { label: "" }, + name: { label: "#{t("plugins.common.name")}", sortable: true }, + api_version: { label: "#{t("plugins.common.api_version")}", sortable: true }, + category: { label: "#{t("plugins.common.category")}", sortable: true }, + status: { label: "#{t("plugins.common.status")}", sortable: true }, + rubygems_org_page: { label: "" } + }, + items: #{plugins_json.html_safe}, + filter: null + }; + }, + methods: { + installPlugin(event) { + $.ajax({ + url: `${event.target.dataset.url}.json`, + data: {"plugins[]": event.target.dataset.name, "_method": "PATCH"}, + method: "POST" + }).then((data) => { + console.log("installed", data); + let item = this.items.find(item => item.name === event.target.dataset.name); + item.is_processing = true; + item.status = "#{t("terms.processing")}"; + this.update(); + }); + } } }); - $('#plugins-table').on('click', '.js-install', function(ev){ - ev.preventDefault(); - var $anchor = $(ev.target); - var url = $anchor.attr('href'); - $anchor.removeClass('js-install'); - $anchor.attr("href", "#"); - $anchor.css({color: "green"}); - var name = $anchor.attr('data-name'); - $.ajax({ - url: url, - data: {"plugins[]": name, "_method": "PATCH"}, - method: "POST" - }).done(function(){ - $anchor.fadeOut(); - var status = $anchor.parent().closest('tr').children()[3]; - $(status).text("#{t("terms.processing")}"); - });; - }); });