tramway-admin 1.0

Sign up to get free protection for your applications and to get access to all the features.
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: []