tramway-admin 1.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.
Files changed (45) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +28 -0
  4. data/Rakefile +36 -0
  5. data/app/assets/config/tramway_admin_manifest.js +2 -0
  6. data/app/assets/javascripts/tramway/admin/application.js.coffee +3 -0
  7. data/app/assets/javascripts/tramway/admin/records.js +2 -0
  8. data/app/assets/javascripts/tramway/admin/tramway/admin/records.js +2 -0
  9. data/app/assets/javascripts/tramway/admin/welcome.js +2 -0
  10. data/app/assets/stylesheets/tramway/admin/application.css.sass +7 -0
  11. data/app/assets/stylesheets/tramway/admin/records.css +4 -0
  12. data/app/assets/stylesheets/tramway/admin/tramway/admin/records.css +4 -0
  13. data/app/controllers/tramway/admin/application_controller.rb +58 -0
  14. data/app/controllers/tramway/admin/records_controller.rb +62 -0
  15. data/app/controllers/tramway/admin/singletons_controller.rb +31 -0
  16. data/app/controllers/tramway/admin/welcome_controller.rb +10 -0
  17. data/app/helpers/tramway/admin/application_helper.rb +21 -0
  18. data/app/helpers/tramway/admin/records_helper.rb +67 -0
  19. data/app/helpers/tramway/admin/russian_cases_helper.rb +23 -0
  20. data/app/helpers/tramway/admin/singleton_helper.rb +10 -0
  21. data/app/helpers/tramway/admin/welcome_helper.rb +4 -0
  22. data/app/jobs/tramway/admin/application_job.rb +6 -0
  23. data/app/mailers/tramway/admin/application_mailer.rb +8 -0
  24. data/app/models/tramway/user/user.rb +9 -0
  25. data/app/views/layouts/tramway/admin/application.html.haml +14 -0
  26. data/app/views/layouts/tramway/admin/shared/_navbar.html.haml +20 -0
  27. data/app/views/tramway/admin/records/_form.html.haml +18 -0
  28. data/app/views/tramway/admin/records/_list.html.haml +27 -0
  29. data/app/views/tramway/admin/records/_search.html.haml +9 -0
  30. data/app/views/tramway/admin/records/edit.html.haml +1 -0
  31. data/app/views/tramway/admin/records/index.html.haml +24 -0
  32. data/app/views/tramway/admin/records/new.html.haml +1 -0
  33. data/app/views/tramway/admin/records/show.html.haml +18 -0
  34. data/app/views/tramway/admin/singletons/_form.html.haml +18 -0
  35. data/app/views/tramway/admin/singletons/edit.html.haml +1 -0
  36. data/app/views/tramway/admin/singletons/show.html.haml +18 -0
  37. data/app/views/tramway/admin/welcome/index.html.haml +0 -0
  38. data/config/locales/ru.collections.yml +4 -0
  39. data/config/routes.rb +6 -0
  40. data/lib/tasks/tramway/admin_tasks.rake +4 -0
  41. data/lib/tramway/admin.rb +30 -0
  42. data/lib/tramway/admin/engine.rb +7 -0
  43. data/lib/tramway/admin/record_routes_helper.rb +19 -0
  44. data/lib/tramway/admin/version.rb +5 -0
  45. metadata +87 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 42d582e53ffb141a3dccb80c9ec4cf3878bc57bb8ee3acfce73ab61bab69f6e7
4
+ data.tar.gz: babce019849cb45c892cb220ff8f8d52fda7b746919e8b6b8d99d0e382a8364f
5
+ SHA512:
6
+ metadata.gz: 51f0ea137169467a884d029cbbb38a91c547a421986c73a703a70a41ee03db82fa80faa9827e943cbe3db0f91dd7e5324bce00b6c1e0b4bbd73048e06044ad27
7
+ data.tar.gz: 7e5c8931ee73d927e167fe8f908d13125bd621ae5556cbc65893b1393024d82a7a422fa4c4637392967fc6af1780a5cb543d6fbf53020872f68c80a6e8957fcf
@@ -0,0 +1,20 @@
1
+ Copyright 2017 Pavel Kalashnikov
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,28 @@
1
+ # Tramway::Admin
2
+ Short description and motivation.
3
+
4
+ ## Usage
5
+ How to use my plugin.
6
+
7
+ ## Installation
8
+ Add this line to your application's Gemfile:
9
+
10
+ ```ruby
11
+ gem 'tramway-admin'
12
+ ```
13
+
14
+ And then execute:
15
+ ```bash
16
+ $ bundle
17
+ ```
18
+
19
+ Or install it yourself as:
20
+ ```bash
21
+ $ gem install tramway-admin
22
+ ```
23
+
24
+ ## Contributing
25
+ Contribution directions go here.
26
+
27
+ ## License
28
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
@@ -0,0 +1,36 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'Tramway::Admin'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.md')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+ APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
18
+ load 'rails/tasks/engine.rake'
19
+
20
+
21
+ load 'rails/tasks/statistics.rake'
22
+
23
+
24
+
25
+ require 'bundler/gem_tasks'
26
+
27
+ require 'rake/testtask'
28
+
29
+ Rake::TestTask.new(:test) do |t|
30
+ t.libs << 'test'
31
+ t.pattern = 'test/**/*_test.rb'
32
+ t.verbose = false
33
+ end
34
+
35
+
36
+ task default: :test
@@ -0,0 +1,2 @@
1
+ //= link_directory ../javascripts/tramway/admin .js
2
+ //= link_directory ../stylesheets/tramway/admin .css
@@ -0,0 +1,3 @@
1
+ #= require jquery
2
+ #= require jquery_ujs
3
+ #= require_tree .
@@ -0,0 +1,2 @@
1
+ // Place all the behaviors and hooks related to the matching controller here.
2
+ // All this logic will automatically be available in application.js.
@@ -0,0 +1,2 @@
1
+ // Place all the behaviors and hooks related to the matching controller here.
2
+ // All this logic will automatically be available in application.js.
@@ -0,0 +1,2 @@
1
+ // Place all the behaviors and hooks related to the matching controller here.
2
+ // All this logic will automatically be available in application.js.
@@ -0,0 +1,7 @@
1
+ /*
2
+ *= require_tree .
3
+ *= require_self
4
+ */
5
+
6
+ @import "tramway/user/application"
7
+ @import "font-awesome"
@@ -0,0 +1,4 @@
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
@@ -0,0 +1,4 @@
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
@@ -0,0 +1,58 @@
1
+ module Tramway
2
+ module Admin
3
+ class ApplicationController < ActionController::Base
4
+ include AuthManagment
5
+ include RecordRoutesHelper
6
+ before_action :authenticate_admin!
7
+ before_action :check_available!
8
+ before_action :collections_counts, if: :model_given?
9
+ before_action :check_available_scope!, if: :model_given?, only: :index
10
+ before_action :application
11
+
12
+ protect_from_forgery with: :exception
13
+
14
+ def check_available!
15
+ render '/404' unless model_given?
16
+ end
17
+
18
+ def check_available_scope!
19
+ if params[:scope].present?
20
+ render '/404' unless available_scope_given?
21
+ end
22
+ end
23
+
24
+ def collections_counts
25
+ @counts = "#{params[:model]}Decorator".constantize.collections.reduce({}) do |hash, collection|
26
+ hash.merge! collection => params[:model].constantize.active.send(collection).count
27
+ end
28
+ end
29
+
30
+ def model_class
31
+ params[:model].constantize
32
+ end
33
+
34
+ def decorator_class
35
+ "#{model_class}Decorator".constantize
36
+ end
37
+
38
+ def form_class
39
+ "#{model_class}Form".constantize
40
+ end
41
+
42
+ def application
43
+ @application = ::Tramway::Core.application.model_class.first
44
+ end
45
+
46
+ private
47
+
48
+ def model_given?
49
+ params[:model].in?(::Tramway::Admin.available_models.map(&:to_s)) ||
50
+ params[:model].in?(::Tramway::Admin.singleton_models.map(&:to_s))
51
+ end
52
+
53
+ def available_scope_given?
54
+ params[:scope].present? && params[:scope].in?(decorator_class.collections.map(&:to_s))
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,62 @@
1
+ module Tramway::Admin
2
+ class RecordsController < ApplicationController
3
+ def index
4
+ @records = decorator_class.decorate model_class.active.send(params[:scope] || :all).page params[:page]
5
+ end
6
+
7
+ def show
8
+ @record = decorator_class.decorate model_class.active.find params[:id]
9
+ end
10
+
11
+ def edit
12
+ @record_form = form_class.new model_class.active.find params[:id]
13
+ end
14
+
15
+ def update
16
+ @record_form = form_class.new model_class.active.find params[:id]
17
+ if @record_form.submit params[:record]
18
+ redirect_to params[:redirect] || record_path(@record_form.model)
19
+ else
20
+ render :edit
21
+ end
22
+ end
23
+
24
+ def new
25
+ @record_form = form_class.new model_class.new
26
+ end
27
+
28
+ def create
29
+ @record_form = form_class.new model_class.new
30
+ if @record_form.submit params[:record]
31
+ redirect_to params[:redirect] || record_path(@record_form.model)
32
+ else
33
+ render :new
34
+ end
35
+ end
36
+
37
+ def destroy
38
+ record = model_class.active.find params[:id]
39
+ record.remove
40
+ redirect_to records_path
41
+ end
42
+ end
43
+
44
+ private
45
+
46
+ # FIXME replace to module
47
+ def record_path(*args, **options)
48
+ super args, options.merge(model: params[:model])
49
+ end
50
+
51
+ def edit_record_path(*args, **options)
52
+ super args, options.merge(model: params[:model])
53
+ end
54
+
55
+ def new_record_path(*args, **options)
56
+ super args, options.merge(model: params[:model])
57
+ end
58
+
59
+ def records_path(*args, **options)
60
+ super args, options.merge(model: params[:model])
61
+ end
62
+ end
@@ -0,0 +1,31 @@
1
+ module Tramway::Admin
2
+ class SingletonsController < ApplicationController
3
+ def show
4
+ @singleton = decorator_class.decorate model_class.active.first
5
+ end
6
+
7
+ def edit
8
+ @singleton_form = form_class.new model_class.active.first
9
+ end
10
+
11
+ def update
12
+ @singleton_form = form_class.new model_class.active.first
13
+ if @singleton_form.submit params[:singleton]
14
+ redirect_to params[:redirect] || singleton_path(model: params[:model])
15
+ else
16
+ render :edit
17
+ end
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ # FIXME replace to module
24
+ def singleton_path(*args, **options)
25
+ super args, options.merge(model: params[:model])
26
+ end
27
+
28
+ def edit_singleton_path(*args, **options)
29
+ super args, options.merge(model: params[:model])
30
+ end
31
+ end
@@ -0,0 +1,10 @@
1
+ require_dependency "tramway/admin/application_controller"
2
+
3
+ module Tramway::Admin
4
+ class WelcomeController < ApplicationController
5
+ skip_before_action :check_available!
6
+
7
+ def index
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,21 @@
1
+ module Tramway
2
+ module Admin
3
+ module ApplicationHelper
4
+ include ::FontAwesome::Rails::IconHelper
5
+ include AuthManagment
6
+
7
+ def title(page_title = default_title)
8
+ title_text = "#{page_title} | #{t('application.name')}"
9
+ content_for(:title) { title_text }
10
+ end
11
+
12
+ def default_title
13
+ t('.title')
14
+ end
15
+
16
+ def page_title(action, model_name)
17
+ t("helpers.actions.#{action}") + ' ' + genitive(model_name)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,67 @@
1
+ module Tramway::Admin
2
+ module RecordsHelper
3
+ # FIXME replace to module
4
+ def record_path(*args, **options)
5
+ super args, options.merge(model: params[:model])
6
+ end
7
+
8
+ def edit_record_path(*args, **options)
9
+ super args, options.merge(model: params[:model])
10
+ end
11
+
12
+ def new_record_path(*args, **options)
13
+ super args, options.merge(model: params[:model])
14
+ end
15
+
16
+ def records_path(*args, **options)
17
+ super args, options.merge(model: params[:model])
18
+ end
19
+
20
+ def model_class
21
+ params[:model].constantize
22
+ end
23
+
24
+ def decorator_class
25
+ "#{model_class}Decorator".constantize
26
+ end
27
+
28
+ def get_collection(model_class)
29
+ decorator_class.collections
30
+ end
31
+
32
+ def to_path(constant)
33
+ constant.name.underscore.gsub '/', '_'
34
+ end
35
+
36
+ def search_tab_title(count)
37
+ "#{t("helpers.found")} / #{count}"
38
+ end
39
+
40
+ def searchable_model?(model_class)
41
+ model_class.methods.include?(:search) || model_class.methods.include?(:search_everywhere)
42
+ end
43
+
44
+ def admin_index_path_of_model(model_class, tab = nil)
45
+ if tab
46
+ records_path model: model_class, scope: tab
47
+ else
48
+ records_path model: model_class
49
+ end
50
+ end
51
+
52
+ def tab_title(model_class, tab, count, state_method = :state)
53
+ model = model_class.name.underscore
54
+ name = if t("default.collections.#{tab}").include?('<span')
55
+ t("collections.#{model}.#{tab}").pluralize(:ru)
56
+ else
57
+ t("default.collections.#{tab}")
58
+ end
59
+ "#{name} / #{count}"
60
+ end
61
+
62
+ def active_tab(tab, index)
63
+ return :active if params[:scope].nil? && index == 0
64
+ return :active if params[:search].nil? && params[:scope].to_s == tab.to_s
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,23 @@
1
+ module Tramway::Admin::RussianCasesHelper
2
+ def case_word(model_name, case_name)
3
+ word_case = I18n.t("cases.#{model_name.name.underscore}.#{case_name}")
4
+ return word_case if word_case.present?
5
+ raise "There is not #{case_name} implementation for \"#{model_name}\""
6
+ end
7
+
8
+ def genitive(word)
9
+ case_word word, :genitive
10
+ end
11
+
12
+ def instrumental(word)
13
+ case_word word, :instrumental
14
+ end
15
+
16
+ def dative(word)
17
+ case_word word, :dative
18
+ end
19
+
20
+ def plural(word)
21
+ case_word word, :plural
22
+ end
23
+ end
@@ -0,0 +1,10 @@
1
+ module Tramway::Admin::SingletonHelper
2
+ # FIXME replace to module
3
+ def singleton_path(*args, **options)
4
+ super args, options.merge(model: params[:model])
5
+ end
6
+
7
+ def edit_singleton_path(*args, **options)
8
+ super args, options.merge(model: params[:model])
9
+ end
10
+ end
@@ -0,0 +1,4 @@
1
+ module Tramway::Admin
2
+ module WelcomeHelper
3
+ end
4
+ end
@@ -0,0 +1,6 @@
1
+ module Tramway
2
+ module Admin
3
+ class ApplicationJob < ActiveJob::Base
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,8 @@
1
+ module Tramway
2
+ module Admin
3
+ class ApplicationMailer < ActionMailer::Base
4
+ default from: 'from@example.com'
5
+ layout 'mailer'
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,9 @@
1
+ class Tramway::User::User < ::Tramway::Core::ApplicationRecord
2
+ has_secure_password #FIXME remove repeating from tramway-user
3
+
4
+ enumerize :role, in: [ :user, :admin ], default: :user
5
+
6
+ def admin?
7
+ role.admin?
8
+ end
9
+ end
@@ -0,0 +1,14 @@
1
+ %html
2
+ %head
3
+ %meta{content: "text/html; charset=UTF-8", "http-equiv" => "Content-Type"}/
4
+ %title Tramway admin
5
+ = stylesheet_link_tag "tramway/admin/application", media: "all"
6
+ = javascript_include_tag "tramway/admin/application"
7
+ = csrf_meta_tags
8
+ %body
9
+ = render 'layouts/tramway/admin/shared/navbar'
10
+ %main.container{ role: :main }
11
+ = yield
12
+ %footer
13
+ .container
14
+ = copyright '2017', 'Tramway'
@@ -0,0 +1,20 @@
1
+ %nav.navbar.navbar-expand-md.navbar-dark.bg-dark
2
+ = link_to @application.title, try(:root_path) || '/', class: 'navbar-brand'
3
+ .navbar-collapse.collapse
4
+ - if signed_in?
5
+ %ul.navbar-nav
6
+ - ::Tramway::Admin.singleton_models.each do |model|
7
+ = model_menu_item model: model, route: ::Tramway::Admin::Engine.routes.url_helpers.singleton_path(model: model)
8
+ - ::Tramway::Admin.available_models.each do |model|
9
+ = model_menu_item model: model, route: ::Tramway::Admin::Engine.routes.url_helpers.records_path(model: model)
10
+ %ul.nav.navbar-nav.ml-auto
11
+ - if signed_in?
12
+ %li.nav-item
13
+ = link_to '/session', method: :delete, class: 'nav-link' do
14
+ = fa_icon 'sign-out'
15
+ = t('helpers.links.sign_out')
16
+ - else
17
+ %li.nav-item
18
+ = link_to new_session_path, class: 'nav-link' do
19
+ = fa_icon 'sign-in'
20
+ = t('helpers.links.enter')
@@ -0,0 +1,18 @@
1
+ - current_title = page_title(action, model_class)
2
+ - title current_title
3
+ .page-header
4
+ %h1= current_title
5
+ %hr
6
+ .row
7
+ .col-lg-12
8
+ = render 'tramway/core/shared/messages', object: @record_form
9
+ .row
10
+ .col-lg-12
11
+ = simple_form_for @record_form.model, url: { controller: :records, action: action, model: @record_form.model.class }, input_html: { class: 'form-horizontal' } do |f|
12
+ - @record_form.properties.each do |property, type|
13
+ - if type == :default
14
+ = f.input property, input_html: { name: "record[#{property}]", id: "record_#{property}" }
15
+ - else
16
+ = f.input property, as: type, input_html: { name: "record[#{property}]", id: "record_#{property}" }
17
+ = f.button :submit, t('helpers.links.save'), class: 'btn-success'
18
+ = link_to t('helpers.links.back'), records_path, class: 'btn btn-secondary'
@@ -0,0 +1,27 @@
1
+ = paginate @records, theme: 'twitter-bootstrap-4'
2
+ %table.table.table-condensed.table-hover
3
+ %thead
4
+ %tr
5
+ %th= model_class.human_attribute_name(:id)
6
+ %th= model_class.human_attribute_name(:name)
7
+ - decorator_class.list_attributes.each do |attribute|
8
+ %th= model_class.human_attribute_name attribute
9
+ %th= t 'helpers.links.actions'
10
+ %tbody
11
+ - @records.each do |record|
12
+ %tr
13
+ %td
14
+ = link_to record.id, record_path(record.id)
15
+ %td
16
+ = link_to record.name, record_path(record.id)
17
+ - decorator_class.list_attributes.each do |attribute|
18
+ %td
19
+ = record.send attribute
20
+ %td.actions
21
+ .btn-group{ data: { toggle: :buttons } }
22
+ - record.model.class.state_machines.keys.each do |state_method|
23
+ - unless state_method == :state
24
+ = state_events_buttons record, state_method: state_method, model_param_name: :record, route_method: :record_path, parameters: { redirect: records_path }
25
+ = link_to fa_icon(:pencil), edit_record_path(record.id), class: 'btn btn-warning btn-xs'
26
+ = link_to fa_icon(:remove), record_path(record.id), method: :delete, class: 'btn btn-xs btn-danger'
27
+ = paginate @records, theme: 'twitter-bootstrap-4'
@@ -0,0 +1,9 @@
1
+ - if searchable_model?(model_class)
2
+ .col-md-6
3
+ .search
4
+ = form_tag request.fullpath, method: :get do |f|
5
+ .form-group.text
6
+ .input-group
7
+ = text_field_tag :search, params[:search], class: 'text form-control'
8
+ %span.input-group-btn
9
+ = submit_tag t('helpers.search')
@@ -0,0 +1 @@
1
+ = render partial: 'form', locals: { action: :update }
@@ -0,0 +1,24 @@
1
+ - default_page_title ||= nil; on_site_link ||= nil
2
+ - current_title = default_page_title || plural(model_class).capitalize
3
+ - title current_title
4
+ - state_method ||= :state
5
+ - tabs = get_collection model_class
6
+ - new_path = "new_admin_#{to_path(model_class)}_path"
7
+ .page-header
8
+ .row
9
+ .col-md-6
10
+ %h1
11
+ = current_title
12
+ = link_to fa_icon(:plus), new_record_path, class: 'btn btn-primary'
13
+ = render 'search', model_class: model_class
14
+ %hr
15
+ %ul.nav.nav-tabs
16
+ - if params[:search]
17
+ %li.active.nav-item
18
+ = link_to search_tab_title(items.total_count), '#', class: 'nav-link'
19
+ - tabs.each_with_index do |tab, index|
20
+ %li.nav-item
21
+ = link_to admin_index_path_of_model(model_class, tab), class: "#{active_tab(tab, index)} nav-link" do
22
+ = tab_title(model_class, tab, @counts[tab], state_method)
23
+ %div{ id: (params[:search] ? :search : params[:scope]) }
24
+ = render 'list'
@@ -0,0 +1 @@
1
+ = render partial: 'form', locals: { action: :create }
@@ -0,0 +1,18 @@
1
+ - default_page_title ||= nil; on_site_link ||= nil
2
+ - current_title = default_page_title || model_class.model_name.human.pluralize(:ru)
3
+ - title current_title
4
+ .page-header
5
+ .row
6
+ .col-md-6
7
+ %h1
8
+ = current_title
9
+ = link_to fa_icon(:pencil), edit_record_path(@record.id), class: 'btn btn-warning btn-xs'
10
+ %hr
11
+ .row
12
+ %table.table.table-striped.table-bordered
13
+ - @record.attributes.each do |attribute_name, value|
14
+ %tr
15
+ %td
16
+ = model_class.human_attribute_name attribute_name
17
+ %td
18
+ = value
@@ -0,0 +1,18 @@
1
+ - current_title = page_title(action, model_class)
2
+ - title current_title
3
+ .page-header
4
+ %h1= current_title
5
+ %hr
6
+ .row
7
+ .col-lg-12
8
+ = render 'tramway/core/shared/messages', object: @singleton_form
9
+ .row
10
+ .col-lg-12
11
+ = simple_form_for @singleton_form.model, url: { controller: :singletons, action: action, model: @singleton_form.model.class }, input_html: { class: 'form-horizontal' } do |f|
12
+ - @singleton_form.properties.each do |property, type|
13
+ - if type == :default
14
+ = f.input property, input_html: { name: "singleton[#{property}]", id: "singleton_#{property}" }
15
+ - else
16
+ = f.input property, as: type, input_html: { name: "singleton[#{property}]", id: "singleton_#{property}" }
17
+ = f.button :submit, t('helpers.links.save'), class: 'btn-success'
18
+ = link_to t('helpers.links.back'), singleton_path, class: 'btn btn-secondary'
@@ -0,0 +1 @@
1
+ = render partial: 'form', locals: { action: :update }
@@ -0,0 +1,18 @@
1
+ - default_page_title ||= nil; on_site_link ||= nil
2
+ - current_title = default_page_title || model_class.model_name.human.pluralize(:ru)
3
+ - title current_title
4
+ .page-header
5
+ .row
6
+ .col-md-6
7
+ %h1
8
+ = current_title
9
+ = link_to fa_icon(:pencil), edit_singleton_path, class: 'btn btn-warning btn-xs'
10
+ %hr
11
+ .row
12
+ %table.table.table-striped.table-bordered
13
+ - @singleton.attributes.each do |attribute_name, value|
14
+ %tr
15
+ %td
16
+ = model_class.human_attribute_name attribute_name
17
+ %td
18
+ = value
@@ -0,0 +1,4 @@
1
+ ru:
2
+ default:
3
+ collections:
4
+ all: Все
@@ -0,0 +1,6 @@
1
+ Tramway::Admin::Engine.routes.draw do
2
+ root to: 'welcome#index'
3
+
4
+ resources :records
5
+ resource :singleton, only: [ :show, :edit, :update ]
6
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :tramway_admin do
3
+ # # Task goes here
4
+ # end
@@ -0,0 +1,30 @@
1
+ require 'tramway/admin/record_routes_helper'
2
+ require "tramway/admin/engine"
3
+ require "tramway/user"
4
+ require 'font-awesome-rails'
5
+
6
+ module Tramway
7
+ module Admin
8
+ ::Tramway::User.layout_path = 'tramway/admin/application'
9
+
10
+ class << self
11
+ def set_available_models(*models)
12
+ @available_models ||= []
13
+ @available_models += models
14
+ end
15
+
16
+ def available_models
17
+ @available_models
18
+ end
19
+
20
+ def set_singleton_models(*models)
21
+ @singleton_models ||= []
22
+ @singleton_models += models
23
+ end
24
+
25
+ def singleton_models
26
+ @singleton_models
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,7 @@
1
+ module Tramway
2
+ module Admin
3
+ class Engine < ::Rails::Engine
4
+ isolate_namespace Tramway::Admin
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,19 @@
1
+ module Tramway::Admin
2
+ module RecordRoutesHelper
3
+ def record_path(*args, **options)
4
+ super args, options.merge(model: params[:model])
5
+ end
6
+
7
+ def edit_record_path(*args, **options)
8
+ super args, options.merge(model: params[:model])
9
+ end
10
+
11
+ def new_record_path(*args, **options)
12
+ super args, options.merge(model: params[:model])
13
+ end
14
+
15
+ def records_path(*args, **options)
16
+ super args, options.merge(model: params[:model])
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,5 @@
1
+ module Tramway
2
+ module Admin
3
+ VERSION = '1.0'
4
+ end
5
+ end
metadata ADDED
@@ -0,0 +1,87 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tramway-admin
3
+ version: !ruby/object:Gem::Version
4
+ version: '1.0'
5
+ platform: ruby
6
+ authors:
7
+ - Pavel Kalashnikov
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-02-21 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Engine for admin
14
+ email:
15
+ - kalashnikovisme@gmail.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - MIT-LICENSE
21
+ - README.md
22
+ - Rakefile
23
+ - app/assets/config/tramway_admin_manifest.js
24
+ - app/assets/javascripts/tramway/admin/application.js.coffee
25
+ - app/assets/javascripts/tramway/admin/records.js
26
+ - app/assets/javascripts/tramway/admin/tramway/admin/records.js
27
+ - app/assets/javascripts/tramway/admin/welcome.js
28
+ - app/assets/stylesheets/tramway/admin/application.css.sass
29
+ - app/assets/stylesheets/tramway/admin/records.css
30
+ - app/assets/stylesheets/tramway/admin/tramway/admin/records.css
31
+ - app/controllers/tramway/admin/application_controller.rb
32
+ - app/controllers/tramway/admin/records_controller.rb
33
+ - app/controllers/tramway/admin/singletons_controller.rb
34
+ - app/controllers/tramway/admin/welcome_controller.rb
35
+ - app/helpers/tramway/admin/application_helper.rb
36
+ - app/helpers/tramway/admin/records_helper.rb
37
+ - app/helpers/tramway/admin/russian_cases_helper.rb
38
+ - app/helpers/tramway/admin/singleton_helper.rb
39
+ - app/helpers/tramway/admin/welcome_helper.rb
40
+ - app/jobs/tramway/admin/application_job.rb
41
+ - app/mailers/tramway/admin/application_mailer.rb
42
+ - app/models/tramway/user/user.rb
43
+ - app/views/layouts/tramway/admin/application.html.haml
44
+ - app/views/layouts/tramway/admin/shared/_navbar.html.haml
45
+ - app/views/tramway/admin/records/_form.html.haml
46
+ - app/views/tramway/admin/records/_list.html.haml
47
+ - app/views/tramway/admin/records/_search.html.haml
48
+ - app/views/tramway/admin/records/edit.html.haml
49
+ - app/views/tramway/admin/records/index.html.haml
50
+ - app/views/tramway/admin/records/new.html.haml
51
+ - app/views/tramway/admin/records/show.html.haml
52
+ - app/views/tramway/admin/singletons/_form.html.haml
53
+ - app/views/tramway/admin/singletons/edit.html.haml
54
+ - app/views/tramway/admin/singletons/show.html.haml
55
+ - app/views/tramway/admin/welcome/index.html.haml
56
+ - config/locales/ru.collections.yml
57
+ - config/routes.rb
58
+ - lib/tasks/tramway/admin_tasks.rake
59
+ - lib/tramway/admin.rb
60
+ - lib/tramway/admin/engine.rb
61
+ - lib/tramway/admin/record_routes_helper.rb
62
+ - lib/tramway/admin/version.rb
63
+ homepage: https://github.com/kalashnikovisme/tramway-admin
64
+ licenses:
65
+ - MIT
66
+ metadata: {}
67
+ post_install_message:
68
+ rdoc_options: []
69
+ require_paths:
70
+ - lib
71
+ required_ruby_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ required_rubygems_version: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ requirements: []
82
+ rubyforge_project:
83
+ rubygems_version: 2.7.3
84
+ signing_key:
85
+ specification_version: 4
86
+ summary: Engine for admin
87
+ test_files: []