├── spec ├── dummy │ ├── log │ │ └── .keep │ ├── app │ │ ├── mailers │ │ │ └── .keep │ │ ├── models │ │ │ ├── .keep │ │ │ ├── concerns │ │ │ │ └── .keep │ │ │ ├── author_rubric.rb │ │ │ ├── color.rb │ │ │ ├── gallery_photo.rb │ │ │ ├── sequel_gallery.rb │ │ │ ├── sequel_gallery_photo.rb │ │ │ ├── active_gallery_photo.rb │ │ │ ├── active_gallery.rb │ │ │ ├── gallery.rb │ │ │ ├── item.rb │ │ │ ├── article.rb │ │ │ ├── rubric.rb │ │ │ ├── category.rb │ │ │ ├── tag.rb │ │ │ ├── author.rb │ │ │ └── post.rb │ │ ├── assets │ │ │ ├── images │ │ │ │ ├── .keep │ │ │ │ └── rademade_admin │ │ │ │ │ └── ico-s21cd51e5e9.png │ │ │ ├── stylesheets │ │ │ │ └── application.css │ │ │ └── javascripts │ │ │ │ └── application.js │ │ ├── controllers │ │ │ ├── concerns │ │ │ │ └── .keep │ │ │ ├── rademade_admin │ │ │ │ ├── categories_controller.rb │ │ │ │ ├── rubrics_controller.rb │ │ │ │ ├── items_controller.rb │ │ │ │ ├── tags_controller.rb │ │ │ │ ├── articles_controller.rb │ │ │ │ ├── authors_controller.rb │ │ │ │ ├── users_controller.rb │ │ │ │ └── posts_controller.rb │ │ │ └── application_controller.rb │ │ ├── helpers │ │ │ └── application_helper.rb │ │ ├── uploaders │ │ │ ├── poster_uploader.rb │ │ │ ├── file_uploader.rb │ │ │ └── video_uploader.rb │ │ └── views │ │ │ └── layouts │ │ │ └── application.html.erb │ ├── lib │ │ ├── assets │ │ │ └── .keep │ │ ├── sortable.rb │ │ ├── tasks │ │ │ └── sequel.rake │ │ └── kaminari │ │ │ └── sequel.rb │ ├── public │ │ ├── favicon.ico │ │ └── .gitignore │ ├── .gitignore │ ├── bin │ │ ├── rake │ │ ├── bundle │ │ └── rails │ ├── config │ │ ├── initializers │ │ │ ├── rademade_admin.rb │ │ │ ├── cookies_serializer.rb │ │ │ ├── sequel.rb │ │ │ ├── session_store.rb │ │ │ ├── filter_parameter_logging.rb │ │ │ ├── mime_types.rb │ │ │ ├── backtrace_silencers.rb │ │ │ ├── wrap_parameters.rb │ │ │ ├── secret_token.rb │ │ │ └── inflections.rb │ │ ├── environment.rb │ │ ├── boot.rb │ │ ├── mongoid.yml │ │ ├── routes.rb │ │ ├── sequel.yml │ │ ├── database.yml │ │ ├── locales │ │ │ └── en.yml │ │ └── application.rb │ ├── db │ │ ├── sequel │ │ │ ├── 1443713996_add_image_to_category.rb │ │ │ ├── 1443771921_create_galleries.rb │ │ │ ├── 1443686624_create_colors.rb │ │ │ ├── 1443772735_add_gallery_to_items.rb │ │ │ ├── 1443599015_create_categories.rb │ │ │ ├── 1443771976_create_gallery_photos.rb │ │ │ ├── 1443686660_create_colors_items.rb │ │ │ └── 1443626796_create_items.rb │ │ └── migrate │ │ │ ├── 20150116105737_add_status_to_article.rb │ │ │ ├── 20141224160954_add_gallery_to_article.rb │ │ │ ├── 20141224160515_create_active_galleries.rb │ │ │ ├── 20140927150300_create_rubrics.rb │ │ │ ├── 20140909175800_remove_name_from_articles.rb │ │ │ ├── 20140814075700_create_articles.rb │ │ │ ├── 20140814075819_create_authors.rb │ │ │ ├── 20140927181000_add_position_to_articles.rb │ │ │ ├── 20140930165500_rename_author_rubrics.rb │ │ │ ├── 20141001155800_add_publish_time_to_articles.rb │ │ │ ├── 20141224161545_create_active_gallery_photos.rb │ │ │ ├── 20140909175300_translate_articles.rb │ │ │ ├── 20140927150400_create_authors_rubrics.rb │ │ │ ├── 20140930172800_replace_author_rubrics.rb │ │ │ └── 20140926142600_translate_authors.rb │ ├── config.ru │ ├── Rakefile │ └── README.rdoc ├── factories │ ├── post.rb │ └── user.rb └── features │ └── menu_spec.rb ├── app ├── assets │ ├── stylesheets │ │ ├── var │ │ │ ├── _path.sass │ │ │ ├── _import.sass │ │ │ └── _media.sass │ │ ├── base │ │ │ ├── _floats.sass │ │ │ ├── _import.sass │ │ │ ├── _fix.sass │ │ │ ├── _text.sass │ │ │ ├── _main.sass │ │ │ └── _reset.sass │ │ ├── lib │ │ │ ├── _import.sass │ │ │ ├── _leaflet.sass │ │ │ ├── calendar │ │ │ │ ├── _import.sass │ │ │ │ ├── date │ │ │ │ │ ├── _import.sass │ │ │ │ │ ├── _main.sass │ │ │ │ │ ├── _week.sass │ │ │ │ │ ├── _month.sass │ │ │ │ │ └── _day.sass │ │ │ │ ├── time │ │ │ │ │ ├── _import.sass │ │ │ │ │ ├── _label.sass │ │ │ │ │ ├── _input.sass │ │ │ │ │ ├── _btn.sass │ │ │ │ │ └── _main.sass │ │ │ │ └── _main.sass │ │ │ └── _jcrop.sass │ │ ├── mixins │ │ │ ├── _sprite-m.sass │ │ │ ├── _text-indent.sass │ │ │ ├── _clear.sass │ │ │ ├── _text-overflow.sass │ │ │ ├── _user-select.sass │ │ │ ├── _background.sass │ │ │ ├── _column.sass │ │ │ ├── _import.sass │ │ │ ├── _placeholder.sass │ │ │ ├── _fonts-mixin.sass │ │ │ ├── _media.sass │ │ │ └── _fonts.scss │ │ ├── blocks │ │ │ ├── popup │ │ │ │ ├── _import.sass │ │ │ │ ├── _title.sass │ │ │ │ ├── _main.sass │ │ │ │ └── _gallery.sass │ │ │ ├── pagination │ │ │ │ ├── _import.sass │ │ │ │ ├── _main.sass │ │ │ │ ├── _sep.sass │ │ │ │ └── _link.sass │ │ │ ├── form │ │ │ │ ├── file │ │ │ │ │ └── _main.sass │ │ │ │ ├── select2 │ │ │ │ │ ├── _main.sass │ │ │ │ │ ├── _drop.sass │ │ │ │ │ ├── _btn.sass │ │ │ │ │ └── _result.sass │ │ │ │ ├── _erorr.sass │ │ │ │ ├── _textarea.sass │ │ │ │ ├── _label.sass │ │ │ │ ├── _main.sass │ │ │ │ ├── _import.sass │ │ │ │ ├── _checkbox.sass │ │ │ │ └── _input.sass │ │ │ ├── login │ │ │ │ ├── _import.sass │ │ │ │ ├── _main.sass │ │ │ │ ├── _title.sass │ │ │ │ ├── form │ │ │ │ │ ├── _main.sass │ │ │ │ │ ├── _label.sass │ │ │ │ │ ├── _input.sass │ │ │ │ │ └── _error.sass │ │ │ │ └── _project.sass │ │ │ ├── content │ │ │ │ ├── _status.sass │ │ │ │ ├── _import.sass │ │ │ │ ├── _tooltip.sass │ │ │ │ ├── _main.sass │ │ │ │ ├── _header.sass │ │ │ │ └── _draggable.sass │ │ │ ├── nav │ │ │ │ ├── _import.sass │ │ │ │ ├── _logo.sass │ │ │ │ ├── _copyright.sass │ │ │ │ ├── _counter.sass │ │ │ │ ├── _item.sass │ │ │ │ ├── _dd.sass │ │ │ │ ├── _user.sass │ │ │ │ ├── _main.sass │ │ │ │ ├── _link.sass │ │ │ │ └── _btn.sass │ │ │ ├── button │ │ │ │ ├── _import.sass │ │ │ │ ├── main │ │ │ │ │ ├── colors │ │ │ │ │ │ ├── _main.sass │ │ │ │ │ │ └── _other.sass │ │ │ │ │ └── _main.sass │ │ │ │ ├── switch │ │ │ │ │ ├── colors │ │ │ │ │ │ └── _blue.sass │ │ │ │ │ └── _main.sass │ │ │ │ ├── link │ │ │ │ │ └── _main.sass │ │ │ │ └── _box.sass │ │ │ └── _import.sass │ │ └── rademade_admin.sass │ ├── javascripts │ │ ├── app │ │ │ ├── app.coffee │ │ │ ├── templates │ │ │ │ ├── crop │ │ │ │ │ ├── attributes.jst.ejs │ │ │ │ │ └── size.jst.ejs │ │ │ │ ├── select2 │ │ │ │ │ ├── edit.jst.ejs │ │ │ │ │ └── add.jst.ejs │ │ │ │ └── related-item.jst.ejs │ │ │ ├── forms │ │ │ │ ├── login.coffee │ │ │ │ ├── insert.coffee │ │ │ │ └── remove.coffee │ │ │ ├── image │ │ │ │ ├── preview.coffee │ │ │ │ └── model.coffee │ │ │ ├── select2 │ │ │ │ ├── model.coffee │ │ │ │ └── related │ │ │ │ │ ├── model.coffee │ │ │ │ │ └── collection.coffee │ │ │ ├── common │ │ │ │ ├── url-visitor.coffee │ │ │ │ ├── lang-panel.coffee │ │ │ │ ├── turboform.coffee │ │ │ │ ├── dnd-sort.coffee │ │ │ │ └── status-toggler.coffee │ │ │ ├── gallery │ │ │ │ └── image │ │ │ │ │ ├── collection.coffee │ │ │ │ │ ├── model.coffee │ │ │ │ │ ├── view.coffee │ │ │ │ │ └── collection-view.coffee │ │ │ └── compatibility │ │ │ │ └── turbolinks.coffee │ │ ├── form │ │ │ └── form-initializer.coffee │ │ └── settings │ │ │ └── ajax-csrf.coffee │ ├── fonts │ │ ├── HelveticaNeueCyr-Bold.eot │ │ ├── HelveticaNeueCyr-Bold.otf │ │ ├── HelveticaNeueCyr-Bold.ttf │ │ ├── HelveticaNeueCyr-Black.eot │ │ ├── HelveticaNeueCyr-Black.otf │ │ ├── HelveticaNeueCyr-Black.ttf │ │ ├── HelveticaNeueCyr-Black.woff │ │ ├── HelveticaNeueCyr-Bold.woff │ │ ├── HelveticaNeueCyr-Light.eot │ │ ├── HelveticaNeueCyr-Light.otf │ │ ├── HelveticaNeueCyr-Light.ttf │ │ ├── HelveticaNeueCyr-Light.woff │ │ ├── HelveticaNeueCyr-Medium.eot │ │ ├── HelveticaNeueCyr-Medium.otf │ │ ├── HelveticaNeueCyr-Medium.ttf │ │ ├── HelveticaNeueCyr-Roman.eot │ │ ├── HelveticaNeueCyr-Roman.otf │ │ ├── HelveticaNeueCyr-Roman.ttf │ │ ├── HelveticaNeueCyr-Roman.woff │ │ └── HelveticaNeueCyr-Medium.woff │ └── images │ │ └── rademade_admin │ │ ├── fav1.ico │ │ ├── fav2.ico │ │ ├── loader.GIF │ │ ├── leaflet │ │ ├── layers.png │ │ ├── layers-2x.png │ │ ├── marker-icon.png │ │ ├── marker-icon-2x.png │ │ └── marker-shadow.png │ │ ├── notifier-loader-clean.gif │ │ ├── notifier-loader-plastic.gif │ │ └── ico │ │ ├── sortable-down.svg │ │ ├── sortable-down_active.svg │ │ ├── sortable-up.svg │ │ ├── sortable-up_active.svg │ │ ├── prev.svg │ │ ├── left-arrow.svg │ │ ├── left-arrow_blue.svg │ │ ├── checked.svg │ │ ├── next.svg │ │ ├── right-arrow.svg │ │ ├── right-arrow_blue.svg │ │ └── add.svg ├── views │ ├── rademade_admin │ │ ├── abstract │ │ │ ├── edit.html.erb │ │ │ ├── form.html.erb │ │ │ ├── new.html.erb │ │ │ ├── _form.html.erb │ │ │ └── index.html.erb │ │ ├── _blocks │ │ │ ├── _pagination.html.erb │ │ │ ├── button │ │ │ │ ├── _cancel.html.erb │ │ │ │ ├── _gallery.html.erb │ │ │ │ ├── _save.html.erb │ │ │ │ ├── _preview.html.erb │ │ │ │ ├── _edit.html.erb │ │ │ │ ├── _save_and_return.html.erb │ │ │ │ ├── _destroy.html.erb │ │ │ │ └── _hide.html.erb │ │ │ ├── navigation │ │ │ │ ├── _menu.html.erb │ │ │ │ └── menu │ │ │ │ │ └── _item.html.erb │ │ │ ├── form │ │ │ │ ├── _control.html.erb │ │ │ │ └── _lang_panel.html.erb │ │ │ ├── _on_page_switcher.html.erb │ │ │ ├── _search.html.erb │ │ │ └── _navigation.html.erb │ │ ├── dashboard │ │ │ ├── index.html.erb │ │ │ └── login.html.erb │ │ └── _layouts │ │ │ ├── login.html.erb │ │ │ ├── parts │ │ │ └── _head.html.erb │ │ │ ├── content_item.html.erb │ │ │ └── main.html.erb │ ├── layouts │ │ ├── login.html.erb │ │ └── rademade_admin.html.erb │ └── kaminari │ │ └── rademade │ │ ├── _gap.html.erb │ │ ├── _last_page.html.erb │ │ ├── _first_page.html.erb │ │ ├── _next_page.html.erb │ │ ├── _prev_page.html.erb │ │ ├── _page.html.erb │ │ └── _paginator.html.erb ├── controllers │ └── rademade_admin │ │ ├── application_controller.rb │ │ ├── status_controller.rb │ │ ├── dashboard_controller.rb │ │ └── sessions_controller.rb ├── services │ ├── loader_service.rb │ ├── search │ │ ├── part │ │ │ ├── where.rb │ │ │ ├── order.rb │ │ │ └── abstract.rb │ │ ├── where.rb │ │ └── conditions │ │ │ └── autocomplete.rb │ ├── login │ │ └── error.rb │ ├── status │ │ └── toggler.rb │ ├── video_service.rb │ ├── login.rb │ ├── error_service.rb │ ├── upload │ │ ├── preview.rb │ │ └── image_presenter.rb │ ├── model_controller │ │ ├── templates.rb │ │ └── model_options.rb │ ├── sortable_service.rb │ └── csv_service.rb ├── inputs │ └── rademade_admin │ │ ├── date_input.rb │ │ ├── date_time_input.rb │ │ └── boolean_input.rb └── helpers │ └── rademade_admin │ ├── pagination_helper.rb │ └── field_type_helper.rb ├── config ├── locales │ ├── select2.en.yml │ ├── select2.ru.yml │ ├── simple_form.ru.yml │ ├── rademade_kaminari.en.yml │ ├── rademade_kaminari.ru.yml │ └── simple_form.en.yml ├── initializers │ ├── ckeditor.rb │ ├── routes.rb │ ├── simple_form │ │ ├── rademade_component.rb │ │ ├── errors.rb │ │ └── wrappers.rb │ └── kaminari_route_proxy.rb └── routes.rb ├── .coveralls.yml ├── lib ├── rademade_admin │ ├── routing.rb │ ├── version.rb │ ├── model │ │ ├── info │ │ │ ├── relation │ │ │ │ └── gallery.rb │ │ │ ├── field │ │ │ │ └── type.rb │ │ │ ├── uploader.rb │ │ │ ├── uploaders.rb │ │ │ ├── relations.rb │ │ │ ├── data_item │ │ │ │ └── initializer.rb │ │ │ └── field.rb │ │ ├── configuration │ │ │ ├── csv_fields.rb │ │ │ ├── field_label.rb │ │ │ ├── form_fields.rb │ │ │ ├── list_fields.rb │ │ │ ├── list_field.rb │ │ │ ├── form_field.rb │ │ │ └── fields_labels.rb │ │ └── adapter │ │ │ ├── query │ │ │ ├── mysql.rb │ │ │ ├── postgresql.rb │ │ │ ├── active_record.rb │ │ │ └── sequel.rb │ │ │ ├── persistence │ │ │ ├── sequel.rb │ │ │ ├── mongoid.rb │ │ │ └── active_record.rb │ │ │ ├── persistence.rb │ │ │ └── query.rb │ ├── uploader │ │ ├── video.rb │ │ ├── carrier_wave.rb │ │ ├── photo.rb │ │ └── crop_photo.rb │ ├── html_buffer.rb │ ├── routing │ │ └── resource.rb │ ├── gallery.rb │ ├── bower │ │ └── performer.rb │ ├── sortable.rb │ ├── user.rb │ ├── search │ │ └── searcher.rb │ ├── ckeditor_utils.rb │ ├── hideable.rb │ └── input │ │ └── related_select_input │ │ └── model_data.rb ├── tasks │ ├── rademade_admin_tasks.rake │ └── rademade_bower_install.rake ├── templates │ └── erb │ │ └── scaffold │ │ └── _form.html.erb └── rademade_admin.rb ├── .gitignore ├── bin └── rails ├── .travis.yml ├── Rakefile ├── Gemfile ├── LICENSE └── gulpfile.js /spec/dummy/log/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /spec/dummy/app/mailers/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /spec/dummy/app/models/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /spec/dummy/lib/assets/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /spec/dummy/public/favicon.ico: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /spec/dummy/app/assets/images/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /spec/dummy/app/models/concerns/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /spec/dummy/app/controllers/concerns/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/assets/stylesheets/var/_path.sass: -------------------------------------------------------------------------------- 1 | $img-path: "/main/" -------------------------------------------------------------------------------- /spec/dummy/.gitignore: -------------------------------------------------------------------------------- 1 | /tmp/ 2 | /bower_components/ 3 | -------------------------------------------------------------------------------- /spec/dummy/public/.gitignore: -------------------------------------------------------------------------------- 1 | /assets/ 2 | /uploads/ 3 | -------------------------------------------------------------------------------- /app/assets/javascripts/app/app.coffee: -------------------------------------------------------------------------------- 1 | window.Select2Input = {} -------------------------------------------------------------------------------- /app/views/rademade_admin/abstract/edit.html.erb: -------------------------------------------------------------------------------- 1 | <%= render @form_template_path %> -------------------------------------------------------------------------------- /app/views/rademade_admin/abstract/form.html.erb: -------------------------------------------------------------------------------- 1 | <%= render @form_template_path %> -------------------------------------------------------------------------------- /app/views/rademade_admin/abstract/new.html.erb: -------------------------------------------------------------------------------- 1 | <%= render @form_template_path %> -------------------------------------------------------------------------------- /config/locales/select2.en.yml: -------------------------------------------------------------------------------- 1 | en: 2 | select2: 3 | no_results: 'No results' -------------------------------------------------------------------------------- /config/locales/select2.ru.yml: -------------------------------------------------------------------------------- 1 | ru: 2 | select2: 3 | no_results: 'Нет записей' -------------------------------------------------------------------------------- /.coveralls.yml: -------------------------------------------------------------------------------- 1 | service_name: travis-ci 2 | repo_token: GZ1vfO3jtXqzbApOsPVcndcZ106iRO8ws 3 | -------------------------------------------------------------------------------- /app/assets/stylesheets/var/_import.sass: -------------------------------------------------------------------------------- 1 | @import "media" 2 | @import "color" 3 | @import "path" -------------------------------------------------------------------------------- /app/views/layouts/login.html.erb: -------------------------------------------------------------------------------- 1 | <%= render :template => @template_service.login_layout %> -------------------------------------------------------------------------------- /app/views/rademade_admin/abstract/_form.html.erb: -------------------------------------------------------------------------------- 1 | <%= render @template_service.form_block %> -------------------------------------------------------------------------------- /app/views/rademade_admin/abstract/index.html.erb: -------------------------------------------------------------------------------- 1 | <%= render @template_service.list_block %> -------------------------------------------------------------------------------- /app/assets/stylesheets/base/_floats.sass: -------------------------------------------------------------------------------- 1 | .fll 2 | float: left 3 | 4 | .flr 5 | float: right -------------------------------------------------------------------------------- /app/views/layouts/rademade_admin.html.erb: -------------------------------------------------------------------------------- 1 | <%= render :template => @template_service.main_layout %> -------------------------------------------------------------------------------- /app/assets/stylesheets/lib/_import.sass: -------------------------------------------------------------------------------- 1 | @import "leaflet" 2 | @import "jcrop" 3 | @import "calendar/import" -------------------------------------------------------------------------------- /lib/rademade_admin/routing.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin::Routing 3 | 4 | end 5 | -------------------------------------------------------------------------------- /app/assets/javascripts/app/templates/crop/attributes.jst.ejs: -------------------------------------------------------------------------------- 1 |
<%= width %>
2 |
<%= height %>
-------------------------------------------------------------------------------- /app/assets/javascripts/app/templates/select2/edit.jst.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/assets/stylesheets/lib/_leaflet.sass: -------------------------------------------------------------------------------- 1 | .map 2 | &.leaflet-container 3 | z-index: 1 4 | height: 350px -------------------------------------------------------------------------------- /lib/rademade_admin/version.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin 3 | VERSION = '0.3.0' 4 | end -------------------------------------------------------------------------------- /spec/dummy/app/helpers/application_helper.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module ApplicationHelper 3 | end 4 | -------------------------------------------------------------------------------- /app/assets/stylesheets/lib/calendar/_import.sass: -------------------------------------------------------------------------------- 1 | @import "main" 2 | @import "date/import" 3 | @import "time/import" -------------------------------------------------------------------------------- /app/assets/stylesheets/mixins/_sprite-m.sass: -------------------------------------------------------------------------------- 1 | =sprite($name) 2 | @extend .svg-#{$name}-dims 3 | @extend .svg-#{$name} -------------------------------------------------------------------------------- /app/assets/stylesheets/mixins/_text-indent.sass: -------------------------------------------------------------------------------- 1 | =ti 2 | text-indent: 100% 3 | white-space: nowrap 4 | overflow: hidden -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/popup/_import.sass: -------------------------------------------------------------------------------- 1 | @import "main" 2 | @import "title" 3 | @import "action" 4 | @import "gallery" -------------------------------------------------------------------------------- /app/assets/stylesheets/lib/calendar/date/_import.sass: -------------------------------------------------------------------------------- 1 | @import "main" 2 | @import "month" 3 | @import "week" 4 | @import "day" -------------------------------------------------------------------------------- /app/assets/stylesheets/lib/calendar/time/_import.sass: -------------------------------------------------------------------------------- 1 | @import "main" 2 | @import "input" 3 | @import "label" 4 | @import "btn" -------------------------------------------------------------------------------- /spec/dummy/bin/rake: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | require_relative '../config/boot' 3 | require 'rake' 4 | Rake.application.run 5 | -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/pagination/_import.sass: -------------------------------------------------------------------------------- 1 | @import "main" 2 | @import "link" 3 | @import "link-states" 4 | @import "sep" -------------------------------------------------------------------------------- /app/assets/stylesheets/mixins/_clear.sass: -------------------------------------------------------------------------------- 1 | =clear() 2 | &:after 3 | display: table 4 | content: "" 5 | clear: both 6 | -------------------------------------------------------------------------------- /app/views/kaminari/rademade/_gap.html.erb: -------------------------------------------------------------------------------- 1 | <%= t('views.pagination.rademade.truncate').html_safe %> -------------------------------------------------------------------------------- /app/views/rademade_admin/_blocks/_pagination.html.erb: -------------------------------------------------------------------------------- 1 | <%= paginate @items, :theme => :rademade, :params => { :admin_params => {} } %> -------------------------------------------------------------------------------- /config/initializers/ckeditor.rb: -------------------------------------------------------------------------------- 1 | Ckeditor.setup do |config| 2 | config.assets_languages = I18n.available_locales.map &:to_s 3 | end -------------------------------------------------------------------------------- /app/assets/javascripts/app/templates/select2/add.jst.ejs: -------------------------------------------------------------------------------- 1 | <%= I18n.t('rademade_admin.relation.add') %> -------------------------------------------------------------------------------- /app/assets/stylesheets/base/_import.sass: -------------------------------------------------------------------------------- 1 | @import "main" 2 | @import "wrapper" 3 | @import "fix" 4 | @import "text" 5 | @import "floats" -------------------------------------------------------------------------------- /spec/dummy/app/uploaders/poster_uploader.rb: -------------------------------------------------------------------------------- 1 | # encoding: utf-8 2 | class PosterUploader < RademadeAdmin::Uploader::CarrierWave 3 | 4 | end -------------------------------------------------------------------------------- /app/assets/fonts/HelveticaNeueCyr-Bold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rademade/rademade_admin/HEAD/app/assets/fonts/HelveticaNeueCyr-Bold.eot -------------------------------------------------------------------------------- /app/assets/fonts/HelveticaNeueCyr-Bold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rademade/rademade_admin/HEAD/app/assets/fonts/HelveticaNeueCyr-Bold.otf -------------------------------------------------------------------------------- /app/assets/fonts/HelveticaNeueCyr-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rademade/rademade_admin/HEAD/app/assets/fonts/HelveticaNeueCyr-Bold.ttf -------------------------------------------------------------------------------- /app/assets/images/rademade_admin/fav1.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rademade/rademade_admin/HEAD/app/assets/images/rademade_admin/fav1.ico -------------------------------------------------------------------------------- /app/assets/images/rademade_admin/fav2.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rademade/rademade_admin/HEAD/app/assets/images/rademade_admin/fav2.ico -------------------------------------------------------------------------------- /lib/tasks/rademade_admin_tasks.rake: -------------------------------------------------------------------------------- 1 | # desc "Explaining what the task does" 2 | # task :rademade_admin do 3 | # # Task goes here 4 | # end 5 | -------------------------------------------------------------------------------- /app/assets/fonts/HelveticaNeueCyr-Black.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rademade/rademade_admin/HEAD/app/assets/fonts/HelveticaNeueCyr-Black.eot -------------------------------------------------------------------------------- /app/assets/fonts/HelveticaNeueCyr-Black.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rademade/rademade_admin/HEAD/app/assets/fonts/HelveticaNeueCyr-Black.otf -------------------------------------------------------------------------------- /app/assets/fonts/HelveticaNeueCyr-Black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rademade/rademade_admin/HEAD/app/assets/fonts/HelveticaNeueCyr-Black.ttf -------------------------------------------------------------------------------- /app/assets/fonts/HelveticaNeueCyr-Black.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rademade/rademade_admin/HEAD/app/assets/fonts/HelveticaNeueCyr-Black.woff -------------------------------------------------------------------------------- /app/assets/fonts/HelveticaNeueCyr-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rademade/rademade_admin/HEAD/app/assets/fonts/HelveticaNeueCyr-Bold.woff -------------------------------------------------------------------------------- /app/assets/fonts/HelveticaNeueCyr-Light.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rademade/rademade_admin/HEAD/app/assets/fonts/HelveticaNeueCyr-Light.eot -------------------------------------------------------------------------------- /app/assets/fonts/HelveticaNeueCyr-Light.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rademade/rademade_admin/HEAD/app/assets/fonts/HelveticaNeueCyr-Light.otf -------------------------------------------------------------------------------- /app/assets/fonts/HelveticaNeueCyr-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rademade/rademade_admin/HEAD/app/assets/fonts/HelveticaNeueCyr-Light.ttf -------------------------------------------------------------------------------- /app/assets/fonts/HelveticaNeueCyr-Light.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rademade/rademade_admin/HEAD/app/assets/fonts/HelveticaNeueCyr-Light.woff -------------------------------------------------------------------------------- /app/assets/fonts/HelveticaNeueCyr-Medium.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rademade/rademade_admin/HEAD/app/assets/fonts/HelveticaNeueCyr-Medium.eot -------------------------------------------------------------------------------- /app/assets/fonts/HelveticaNeueCyr-Medium.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rademade/rademade_admin/HEAD/app/assets/fonts/HelveticaNeueCyr-Medium.otf -------------------------------------------------------------------------------- /app/assets/fonts/HelveticaNeueCyr-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rademade/rademade_admin/HEAD/app/assets/fonts/HelveticaNeueCyr-Medium.ttf -------------------------------------------------------------------------------- /app/assets/fonts/HelveticaNeueCyr-Roman.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rademade/rademade_admin/HEAD/app/assets/fonts/HelveticaNeueCyr-Roman.eot -------------------------------------------------------------------------------- /app/assets/fonts/HelveticaNeueCyr-Roman.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rademade/rademade_admin/HEAD/app/assets/fonts/HelveticaNeueCyr-Roman.otf -------------------------------------------------------------------------------- /app/assets/fonts/HelveticaNeueCyr-Roman.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rademade/rademade_admin/HEAD/app/assets/fonts/HelveticaNeueCyr-Roman.ttf -------------------------------------------------------------------------------- /app/assets/fonts/HelveticaNeueCyr-Roman.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rademade/rademade_admin/HEAD/app/assets/fonts/HelveticaNeueCyr-Roman.woff -------------------------------------------------------------------------------- /app/assets/images/rademade_admin/loader.GIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rademade/rademade_admin/HEAD/app/assets/images/rademade_admin/loader.GIF -------------------------------------------------------------------------------- /app/assets/javascripts/app/templates/crop/size.jst.ejs: -------------------------------------------------------------------------------- 1 |
-------------------------------------------------------------------------------- /spec/dummy/app/models/author_rubric.rb: -------------------------------------------------------------------------------- 1 | class AuthorRubric < ActiveRecord::Base 2 | 3 | belongs_to :author 4 | belongs_to :rubric 5 | 6 | end -------------------------------------------------------------------------------- /spec/dummy/app/models/color.rb: -------------------------------------------------------------------------------- 1 | class Color < Sequel::Model 2 | 3 | many_to_many :items 4 | 5 | def to_s 6 | name 7 | end 8 | 9 | end -------------------------------------------------------------------------------- /app/assets/fonts/HelveticaNeueCyr-Medium.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rademade/rademade_admin/HEAD/app/assets/fonts/HelveticaNeueCyr-Medium.woff -------------------------------------------------------------------------------- /config/initializers/routes.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | class ActionDispatch::Routing::Mapper 3 | include RademadeAdmin::Routing::Mapper 4 | end 5 | -------------------------------------------------------------------------------- /spec/dummy/config/initializers/rademade_admin.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | RademadeAdmin.configure do |config| 3 | config.admin_class = User 4 | end -------------------------------------------------------------------------------- /spec/dummy/db/sequel/1443713996_add_image_to_category.rb: -------------------------------------------------------------------------------- 1 | Sequel.migration do 2 | change do 3 | add_column :categories, :image, String 4 | end 5 | end -------------------------------------------------------------------------------- /spec/factories/post.rb: -------------------------------------------------------------------------------- 1 | FactoryGirl.define do 2 | 3 | factory :post do 4 | headline 'test headline' 5 | text 'some text' 6 | end 7 | 8 | end 9 | -------------------------------------------------------------------------------- /app/assets/images/rademade_admin/leaflet/layers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rademade/rademade_admin/HEAD/app/assets/images/rademade_admin/leaflet/layers.png -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/form/file/_main.sass: -------------------------------------------------------------------------------- 1 | .upload-list 2 | margin: 0 -2px 3 | width: 100% 4 | +clear 5 | 6 | .upload-box 7 | display: inline -------------------------------------------------------------------------------- /spec/dummy/bin/bundle: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) 3 | load Gem.bin_path('bundler', 'bundle') 4 | -------------------------------------------------------------------------------- /app/assets/images/rademade_admin/leaflet/layers-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rademade/rademade_admin/HEAD/app/assets/images/rademade_admin/leaflet/layers-2x.png -------------------------------------------------------------------------------- /app/assets/javascripts/app/forms/login.coffee: -------------------------------------------------------------------------------- 1 | $(document).on 'ready page:load', -> 2 | 3 | $('#login-form').on 4 | 'ajax-submit-done': -> window.location.reload() -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.idea/ 2 | .DS_Store 3 | /spec/dummy/log/* 4 | /spec/dummy/tmp/* 5 | /vendor/ 6 | /.bundle/ 7 | /coverage 8 | /node_modules/ 9 | *.json 10 | /pkg/ 11 | -------------------------------------------------------------------------------- /app/assets/images/rademade_admin/leaflet/marker-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rademade/rademade_admin/HEAD/app/assets/images/rademade_admin/leaflet/marker-icon.png -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/form/select2/_main.sass: -------------------------------------------------------------------------------- 1 | .form-select 2 | display: block 3 | width: 100% 4 | 5 | .input-holder 6 | .select-wrapper 7 | width: 100% -------------------------------------------------------------------------------- /app/assets/stylesheets/lib/calendar/date/_main.sass: -------------------------------------------------------------------------------- 1 | .rademade-calendar 2 | .calendar-date 3 | width: 60% 4 | +media-below($media-tablet) 5 | width: 100% 6 | -------------------------------------------------------------------------------- /app/assets/images/rademade_admin/leaflet/marker-icon-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rademade/rademade_admin/HEAD/app/assets/images/rademade_admin/leaflet/marker-icon-2x.png -------------------------------------------------------------------------------- /app/assets/images/rademade_admin/leaflet/marker-shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rademade/rademade_admin/HEAD/app/assets/images/rademade_admin/leaflet/marker-shadow.png -------------------------------------------------------------------------------- /app/assets/images/rademade_admin/notifier-loader-clean.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rademade/rademade_admin/HEAD/app/assets/images/rademade_admin/notifier-loader-clean.gif -------------------------------------------------------------------------------- /app/assets/stylesheets/var/_media.sass: -------------------------------------------------------------------------------- 1 | //variables 2 | $media-desktop: 1080 3 | $media-tablet: 768 4 | $media-mobile: 500 5 | 6 | 7 | $transitionVal: 0.3s 8 | 9 | $w100: 100% -------------------------------------------------------------------------------- /app/assets/images/rademade_admin/notifier-loader-plastic.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rademade/rademade_admin/HEAD/app/assets/images/rademade_admin/notifier-loader-plastic.gif -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/pagination/_main.sass: -------------------------------------------------------------------------------- 1 | .pagination 2 | text-align: left 3 | user-select: none 4 | +clear 5 | 6 | +media-below($media-tablet) 7 | width: 100% -------------------------------------------------------------------------------- /spec/dummy/app/models/gallery_photo.rb: -------------------------------------------------------------------------------- 1 | class GalleryPhoto 2 | include Mongoid::Document 3 | 4 | belongs_to :gallery 5 | 6 | mount_uploader :image, PosterUploader 7 | 8 | end -------------------------------------------------------------------------------- /spec/dummy/bin/rails: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | APP_PATH = File.expand_path('../../config/application', __FILE__) 3 | require_relative '../config/boot' 4 | require 'rails/commands' 5 | -------------------------------------------------------------------------------- /app/views/rademade_admin/_blocks/button/_cancel.html.erb: -------------------------------------------------------------------------------- 1 | 2 | <%= t('rademade_admin.button.cancel') %> 3 | -------------------------------------------------------------------------------- /spec/dummy/app/assets/images/rademade_admin/ico-s21cd51e5e9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rademade/rademade_admin/HEAD/spec/dummy/app/assets/images/rademade_admin/ico-s21cd51e5e9.png -------------------------------------------------------------------------------- /spec/dummy/app/models/sequel_gallery.rb: -------------------------------------------------------------------------------- 1 | class SequelGallery < Sequel::Model 2 | include RademadeAdmin::Gallery 3 | 4 | one_to_many :images, :class => SequelGalleryPhoto 5 | 6 | end -------------------------------------------------------------------------------- /spec/dummy/app/models/sequel_gallery_photo.rb: -------------------------------------------------------------------------------- 1 | class SequelGalleryPhoto < Sequel::Model 2 | 3 | many_to_one :sequel_gallery 4 | 5 | mount_uploader :image, PosterUploader 6 | 7 | end -------------------------------------------------------------------------------- /spec/dummy/config/initializers/cookies_serializer.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | Rails.application.config.action_dispatch.cookies_serializer = :json -------------------------------------------------------------------------------- /spec/dummy/db/sequel/1443771921_create_galleries.rb: -------------------------------------------------------------------------------- 1 | Sequel.migration do 2 | change do 3 | create_table(:sequel_galleries) do 4 | primary_key :id 5 | end 6 | end 7 | end -------------------------------------------------------------------------------- /config/locales/simple_form.ru.yml: -------------------------------------------------------------------------------- 1 | ru: 2 | helpers: 3 | submit: 4 | create: "Создать" 5 | update: "Сохранить изменения" 6 | reset: "Сбросить" 7 | cancel: "Отмена" -------------------------------------------------------------------------------- /spec/dummy/config.ru: -------------------------------------------------------------------------------- 1 | # This file is used by Rack-based servers to start the application. 2 | 3 | require ::File.expand_path('../config/environment', __FILE__) 4 | run Rails.application 5 | -------------------------------------------------------------------------------- /app/assets/stylesheets/base/_fix.sass: -------------------------------------------------------------------------------- 1 | .fix 2 | position: relative 3 | padding: 0 15px 4 | min-width: 290px 5 | max-width: 1140px 6 | margin: 0 auto 7 | box-sizing: border-box 8 | +clear -------------------------------------------------------------------------------- /app/assets/stylesheets/mixins/_text-overflow.sass: -------------------------------------------------------------------------------- 1 | =to($display) 2 | display: $display 3 | text-overflow: ellipsis 4 | -o-text-overflow: ellipsis 5 | white-space: nowrap 6 | overflow: hidden -------------------------------------------------------------------------------- /app/controllers/rademade_admin/application_controller.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin 3 | class ApplicationController < ActionController::Base 4 | 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /spec/dummy/app/models/active_gallery_photo.rb: -------------------------------------------------------------------------------- 1 | class ActiveGalleryPhoto < ActiveRecord::Base 2 | 3 | belongs_to :active_gallery 4 | 5 | mount_uploader :image, PosterUploader 6 | 7 | end 8 | -------------------------------------------------------------------------------- /app/assets/stylesheets/mixins/_user-select.sass: -------------------------------------------------------------------------------- 1 | =user-select 2 | -webkit-user-select: none 3 | -moz-user-select: none 4 | -ms-user-select: none 5 | -o-user-select: none 6 | user-select: none -------------------------------------------------------------------------------- /app/views/rademade_admin/dashboard/index.html.erb: -------------------------------------------------------------------------------- 1 |
2 |

<%= t('rademade_admin.dashboard.greeting', :user => @current_user) %>

3 |
-------------------------------------------------------------------------------- /spec/dummy/db/migrate/20150116105737_add_status_to_article.rb: -------------------------------------------------------------------------------- 1 | class AddStatusToArticle < ActiveRecord::Migration 2 | def change 3 | add_column :articles, :status, :integer 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/login/_import.sass: -------------------------------------------------------------------------------- 1 | @import "main" 2 | @import "project" 3 | @import "title" 4 | 5 | @import "form/main" 6 | @import "form/label" 7 | @import "form/input" 8 | @import "form/error" -------------------------------------------------------------------------------- /app/assets/javascripts/app/image/preview.coffee: -------------------------------------------------------------------------------- 1 | class @ImagePreviewModel extends @ImageModel 2 | 3 | _getData : () -> 4 | _.extend { 5 | path : @get('fullUrl') 6 | }, super, @get('uploadParams') -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/content/_status.sass: -------------------------------------------------------------------------------- 1 | .checked 2 | display: block 3 | margin-top: 5px 4 | +sprite(checked) 5 | 6 | .rejected 7 | display: block 8 | margin-top: 5px 9 | +sprite(rejected) -------------------------------------------------------------------------------- /app/services/loader_service.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin 3 | class LoaderService 4 | def self.const_get(name) 5 | name.classify.constantize 6 | end 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /app/views/rademade_admin/_blocks/button/_gallery.html.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | Галерея 4 | 5 | -------------------------------------------------------------------------------- /app/views/rademade_admin/_blocks/button/_save.html.erb: -------------------------------------------------------------------------------- 1 | <%= f.button :button, '', :class => 'btn is-blue is-clickable', :name => :commit do 2 | %><%= t('rademade_admin.button.save') %><% 3 | end %> -------------------------------------------------------------------------------- /spec/dummy/db/sequel/1443686624_create_colors.rb: -------------------------------------------------------------------------------- 1 | Sequel.migration do 2 | change do 3 | create_table(:colors) do 4 | primary_key :id 5 | String :name, :null => false 6 | end 7 | end 8 | end -------------------------------------------------------------------------------- /app/assets/javascripts/app/select2/model.coffee: -------------------------------------------------------------------------------- 1 | class @Select2Input.Model extends Backbone.Model 2 | 3 | isMultiple : () -> 4 | @get('multiple') 5 | 6 | getRelatedData : () -> 7 | @get('related').getData() -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/nav/_import.sass: -------------------------------------------------------------------------------- 1 | @import "main" 2 | @import "logo" 3 | @import "btn" 4 | @import "link" 5 | @import "counter" 6 | @import "item" 7 | @import "dd" 8 | @import "user" 9 | @import "copyright" -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/nav/_logo.sass: -------------------------------------------------------------------------------- 1 | .nav-main-logo 2 | display: block 3 | padding: 10px 22px 4 | color: $nav-logo-color 5 | font-size: em(20) 6 | box-sizing: border-box 7 | opacity: .37 8 | +clear -------------------------------------------------------------------------------- /app/views/kaminari/rademade/_last_page.html.erb: -------------------------------------------------------------------------------- 1 | <%= link_to_unless current_page.last?, t('views.pagination.rademade.last').html_safe, url, 2 | :remote => remote, 3 | :class => 'pagination-link is-last' 4 | %> -------------------------------------------------------------------------------- /spec/dummy/app/models/active_gallery.rb: -------------------------------------------------------------------------------- 1 | class ActiveGallery < ActiveRecord::Base 2 | include RademadeAdmin::Gallery 3 | 4 | has_many :images, :class_name => 'ActiveGalleryPhoto', :dependent => :destroy 5 | 6 | end -------------------------------------------------------------------------------- /spec/dummy/db/sequel/1443772735_add_gallery_to_items.rb: -------------------------------------------------------------------------------- 1 | Sequel.migration do 2 | change do 3 | alter_table(:items) do 4 | add_foreign_key :sequel_gallery_id, :sequel_galleries 5 | end 6 | end 7 | end -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/login/_main.sass: -------------------------------------------------------------------------------- 1 | .login 2 | padding: 170px 0 75px 3 | width: 100% 4 | min-height: 100% 5 | background: $login-bg 6 | background-image: $login-bg-gradient 7 | box-sizing: border-box -------------------------------------------------------------------------------- /app/views/kaminari/rademade/_first_page.html.erb: -------------------------------------------------------------------------------- 1 | <%= link_to_unless current_page.first?, t('views.pagination.rademade.first').html_safe, url, 2 | :remote => remote, 3 | :class => 'pagination-link is-first' 4 | %> -------------------------------------------------------------------------------- /spec/dummy/config/initializers/sequel.rb: -------------------------------------------------------------------------------- 1 | db = Sequel.connect(YAML.load_file("#{::Rails.root}/config/sequel.yml")[::Rails.env]) 2 | db.extension :pagination 3 | Sequel::Dataset::Pagination.send(:include, Kaminari::Sequel) -------------------------------------------------------------------------------- /spec/dummy/db/sequel/1443599015_create_categories.rb: -------------------------------------------------------------------------------- 1 | Sequel.migration do 2 | change do 3 | create_table(:categories) do 4 | primary_key :id 5 | String :name, :null => false 6 | end 7 | end 8 | end -------------------------------------------------------------------------------- /app/assets/stylesheets/mixins/_background.sass: -------------------------------------------------------------------------------- 1 | $main-path: "main/" 2 | 3 | =bg-fix() 4 | -webkit-background-size: cover 5 | background-size: cover 6 | background-attachment: fixed 7 | background-position: center 8 | -------------------------------------------------------------------------------- /app/views/rademade_admin/_blocks/navigation/_menu.html.erb: -------------------------------------------------------------------------------- 1 | <% 2 | main_menu.each do |menu_item| 3 | concat render @template_service.navigation_menu_item_block, { 4 | :menu_item => menu_item 5 | } 6 | end 7 | %> -------------------------------------------------------------------------------- /spec/dummy/config/initializers/session_store.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | # Be sure to restart your server when you modify this file. 3 | 4 | Dummy::Application.config.session_store :cookie_store, key: '_dummy_session' 5 | -------------------------------------------------------------------------------- /spec/dummy/db/migrate/20141224160954_add_gallery_to_article.rb: -------------------------------------------------------------------------------- 1 | class AddGalleryToArticle < ActiveRecord::Migration 2 | 3 | def change 4 | add_reference :articles, :active_gallery, index: true 5 | end 6 | 7 | end 8 | -------------------------------------------------------------------------------- /spec/dummy/app/models/gallery.rb: -------------------------------------------------------------------------------- 1 | class Gallery 2 | include Mongoid::Document 3 | include RademadeAdmin::Gallery 4 | 5 | has_many :images, :class_name => 'GalleryPhoto', :sortable => true, :dependent => :destroy 6 | 7 | end -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/content/_import.sass: -------------------------------------------------------------------------------- 1 | @import "main" 2 | @import "item" 3 | @import "table" 4 | @import "header" 5 | @import "search" 6 | @import "actions" 7 | @import "tooltip" 8 | @import "draggable" 9 | @import "status" -------------------------------------------------------------------------------- /app/views/rademade_admin/_layouts/login.html.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | <%= render @template_service.layout_head %> 4 | 5 |
<%= yield %>
6 | 7 | -------------------------------------------------------------------------------- /config/initializers/simple_form/rademade_component.rb: -------------------------------------------------------------------------------- 1 | module SimpleForm 2 | module Components 3 | module Rademade 4 | 5 | end 6 | end 7 | end 8 | 9 | SimpleForm::Inputs::Base.send(:include, SimpleForm::Components::Rademade) -------------------------------------------------------------------------------- /config/locales/rademade_kaminari.en.yml: -------------------------------------------------------------------------------- 1 | en: 2 | views: 3 | pagination: 4 | rademade: 5 | first: "First" 6 | last: "Last" 7 | previous: "Previous" 8 | next: "Next" 9 | truncate: "…" -------------------------------------------------------------------------------- /spec/dummy/config/environment.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | # Load the Rails application. 3 | require File.expand_path('../application', __FILE__) 4 | 5 | # Initialize the Rails application. 6 | Dummy::Application.initialize! 7 | -------------------------------------------------------------------------------- /app/assets/javascripts/app/common/url-visitor.coffee: -------------------------------------------------------------------------------- 1 | initUrlVisit = () -> 2 | $('[data-link-url]').click () -> 3 | Turbolinks.visit $(this).data('linkUrl') 4 | 5 | $ -> 6 | $(document).on 'ready page:load init-plugins', initUrlVisit -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/button/_import.sass: -------------------------------------------------------------------------------- 1 | @import "box" 2 | @import "main/main" 3 | @import "main/colors/main" 4 | @import "main/colors/other" 5 | 6 | @import "switch/main" 7 | @import "switch/colors/blue" 8 | 9 | @import "link/main" -------------------------------------------------------------------------------- /app/views/kaminari/rademade/_next_page.html.erb: -------------------------------------------------------------------------------- 1 | <%= link_to_unless current_page.last?, t('views.pagination.rademade.next').html_safe, url, 2 | :rel => 'next', 3 | :remote => remote, 4 | :class => 'pagination-link is-next' 5 | %> -------------------------------------------------------------------------------- /spec/dummy/db/migrate/20141224160515_create_active_galleries.rb: -------------------------------------------------------------------------------- 1 | class CreateActiveGalleries < ActiveRecord::Migration 2 | def change 3 | create_table :active_galleries do |t| 4 | 5 | t.timestamps 6 | end 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /app/views/kaminari/rademade/_prev_page.html.erb: -------------------------------------------------------------------------------- 1 | <%= link_to_unless current_page.first?, t('views.pagination.rademade.previous').html_safe, url, 2 | :rel => 'prev', 3 | :remote => remote, 4 | :class => 'pagination-link is-prev' 5 | %> -------------------------------------------------------------------------------- /app/assets/javascripts/app/common/lang-panel.coffee: -------------------------------------------------------------------------------- 1 | initLangPanel = () -> 2 | $langPanel = $('[data-lang-panel]') 3 | $langPanel.tabs() if $langPanel.length > 0 4 | 5 | $ -> 6 | $(document).on 'ready page:load init-plugins', initLangPanel 7 | -------------------------------------------------------------------------------- /app/assets/stylesheets/mixins/_column.sass: -------------------------------------------------------------------------------- 1 | =column($count,$gap) 2 | -webkit-column-count: $count 3 | -moz-column-count: $count 4 | column-count: $count 5 | -webkit-column-gap: #{$gap}px 6 | -moz-column-gap: #{$gap}px 7 | column-gap: #{$gap}px -------------------------------------------------------------------------------- /config/locales/rademade_kaminari.ru.yml: -------------------------------------------------------------------------------- 1 | ru: 2 | views: 3 | pagination: 4 | rademade: 5 | first: "Первая" 6 | last: "Последняя" 7 | previous: "Предыдущая" 8 | next: "Следующая" 9 | truncate: "…" -------------------------------------------------------------------------------- /spec/dummy/db/migrate/20140927150300_create_rubrics.rb: -------------------------------------------------------------------------------- 1 | class CreateRubrics < ActiveRecord::Migration 2 | def change 3 | create_table :rubrics do |t| 4 | t.string :name 5 | 6 | t.timestamps 7 | end 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/form/_erorr.sass: -------------------------------------------------------------------------------- 1 | .error-message 2 | position: absolute 3 | padding: 0 15px 4 | font-size: em(12) 5 | top: 0 6 | right: 0 7 | color: #fff 8 | background-color: #F77070 9 | border-radius: 0 4px 0 4px 10 | -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/nav/_copyright.sass: -------------------------------------------------------------------------------- 1 | .nav-copyright 2 | padding: 15px 25px 3 | font-size: em(12) 4 | color: $nav-copyright-color 5 | line-height: 22px 6 | font-weight: bold 7 | 8 | a 9 | color: $nav-copyright-color 10 | -------------------------------------------------------------------------------- /spec/dummy/app/models/item.rb: -------------------------------------------------------------------------------- 1 | class Item < Sequel::Model 2 | include RademadeAdmin::Hideable 3 | 4 | many_to_one :category 5 | many_to_one :sequel_gallery 6 | many_to_many :colors 7 | 8 | def to_s 9 | name 10 | end 11 | 12 | end -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/popup/_title.sass: -------------------------------------------------------------------------------- 1 | .popup-title 2 | position: absolute 3 | top: 50% 4 | left: 20px 5 | transform: translateY(-50%) 6 | width: 230px 7 | text-align: left 8 | color: #fff 9 | font-size: em(17) 10 | +to(block) -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/login/_title.sass: -------------------------------------------------------------------------------- 1 | .login-form-title 2 | margin-bottom: 7px 3 | font-size: em(28) 4 | color: #FFFFFF 5 | text-align: center 6 | +roboto 7 | 8 | .login-form-project 9 | opacity: 0.5 10 | font-weight: 300 11 | -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/_import.sass: -------------------------------------------------------------------------------- 1 | @import "content/import" 2 | 3 | @import "nav/import" 4 | 5 | @import "button/import" 6 | 7 | @import "login/import" 8 | 9 | @import "pagination/import" 10 | 11 | @import "form/import" 12 | 13 | @import "popup/import" -------------------------------------------------------------------------------- /lib/rademade_admin/model/info/relation/gallery.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin 3 | module Model 4 | class Info 5 | class Relation 6 | class Gallery < Relation 7 | 8 | end 9 | end 10 | end 11 | end 12 | end -------------------------------------------------------------------------------- /spec/dummy/app/controllers/rademade_admin/categories_controller.rb: -------------------------------------------------------------------------------- 1 | class RademadeAdmin::CategoriesController < RademadeAdmin::ModelController 2 | 3 | options do 4 | list :name 5 | form do 6 | name 7 | image 8 | end 9 | end 10 | 11 | end -------------------------------------------------------------------------------- /spec/dummy/app/models/article.rb: -------------------------------------------------------------------------------- 1 | class Article < ActiveRecord::Base 2 | 3 | include RademadeAdmin::Hideable 4 | 5 | belongs_to :active_gallery 6 | belongs_to :author 7 | 8 | translates :name 9 | 10 | def to_s 11 | name 12 | end 13 | 14 | end 15 | -------------------------------------------------------------------------------- /spec/dummy/db/sequel/1443771976_create_gallery_photos.rb: -------------------------------------------------------------------------------- 1 | Sequel.migration do 2 | change do 3 | create_table(:sequel_gallery_photos) do 4 | primary_key :id 5 | foreign_key :sequel_gallery_id, :sequel_galleries 6 | String :image 7 | end 8 | end 9 | end -------------------------------------------------------------------------------- /app/views/kaminari/rademade/_page.html.erb: -------------------------------------------------------------------------------- 1 | <% 2 | class_name = 'pagination-link' 3 | class_name += ' is-active' if page.current? 4 | concat link_to page, url, 5 | :remote => remote, 6 | :rel => page.next? ? 'next' : page.prev? ? 'prev' : nil, 7 | :class => class_name 8 | %> -------------------------------------------------------------------------------- /spec/dummy/Rakefile: -------------------------------------------------------------------------------- 1 | # Add your own tasks in files placed in lib/tasks ending in .rake, 2 | # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. 3 | 4 | require File.expand_path('../config/application', __FILE__) 5 | 6 | Dummy::Application.load_tasks 7 | -------------------------------------------------------------------------------- /spec/dummy/app/models/rubric.rb: -------------------------------------------------------------------------------- 1 | class Rubric < ActiveRecord::Base 2 | 3 | has_many :author_rubrics, :dependent => :destroy 4 | has_many :authors, :through => :author_rubrics 5 | 6 | validates_uniqueness_of :name 7 | 8 | def to_s 9 | name 10 | end 11 | 12 | end 13 | -------------------------------------------------------------------------------- /spec/dummy/db/sequel/1443686660_create_colors_items.rb: -------------------------------------------------------------------------------- 1 | Sequel.migration do 2 | change do 3 | create_table(:colors_items) do 4 | foreign_key :color_id, :colors 5 | foreign_key :item_id, :items 6 | index [:color_id, :item_id], :unique => true 7 | end 8 | end 9 | end -------------------------------------------------------------------------------- /app/assets/javascripts/form/form-initializer.coffee: -------------------------------------------------------------------------------- 1 | initForms = () -> 2 | FormValidation.initDefaults() 3 | $('form').each (i, form) -> 4 | $form = $(form) 5 | Form.init $form unless $form.data().disableAdmin 6 | 7 | $ -> 8 | $(document).on 'ready page:load init-plugins', initForms -------------------------------------------------------------------------------- /lib/rademade_admin/uploader/video.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin 3 | module Uploader 4 | module Video 5 | 6 | def thumb_path 7 | raise NotImplemented.new 'Implement "thumb_path" method' 8 | end 9 | 10 | end 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /spec/dummy/db/migrate/20140909175800_remove_name_from_articles.rb: -------------------------------------------------------------------------------- 1 | class RemoveNameFromArticles < ActiveRecord::Migration 2 | 3 | def self.up 4 | remove_column :articles, :name 5 | end 6 | 7 | def self.down 8 | add_column :articles, :name, :string 9 | end 10 | 11 | end -------------------------------------------------------------------------------- /app/assets/javascripts/settings/ajax-csrf.coffee: -------------------------------------------------------------------------------- 1 | $ -> 2 | $.ajaxSetup(headers : { 3 | 'X-CSRF-Token' : $('meta[name="csrf-token"]').attr('content') 4 | }) 5 | 6 | $(document).on 'page:load ready init-plugins', () -> 7 | $('table.fixed-thead').floatThead 8 | position: 'fixed' 9 | -------------------------------------------------------------------------------- /spec/dummy/app/controllers/rademade_admin/rubrics_controller.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | class RademadeAdmin::RubricsController < RademadeAdmin::ModelController 3 | 4 | options do 5 | parent_menu 'Active record' 6 | list :name 7 | form :name 8 | end 9 | 10 | end 11 | -------------------------------------------------------------------------------- /spec/dummy/config/initializers/filter_parameter_logging.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | # Be sure to restart your server when you modify this file. 3 | 4 | # Configure sensitive parameters which will be filtered from the log file. 5 | Rails.application.config.filter_parameters += [:password] 6 | -------------------------------------------------------------------------------- /spec/dummy/config/initializers/mime_types.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | # Be sure to restart your server when you modify this file. 3 | 4 | # Add new mime types for use in respond_to blocks: 5 | # Mime::Type.register "text/richtext", :rtf 6 | # Mime::Type.register_alias "text/html", :iphone 7 | -------------------------------------------------------------------------------- /spec/dummy/db/migrate/20140814075700_create_articles.rb: -------------------------------------------------------------------------------- 1 | class CreateArticles < ActiveRecord::Migration 2 | def change 3 | create_table :articles do |t| 4 | t.string :name 5 | t.references :author, index: true 6 | 7 | t.timestamps 8 | end 9 | end 10 | end 11 | -------------------------------------------------------------------------------- /app/assets/stylesheets/lib/calendar/time/_label.sass: -------------------------------------------------------------------------------- 1 | .calendar-time .time-list .time-box 2 | .time-label 3 | display: block 4 | margin-bottom: 2px 5 | width: 100% 6 | opacity: 0.5 7 | font-size: 13px 8 | text-align: center 9 | color: #475062 10 | line-height: 15px -------------------------------------------------------------------------------- /spec/dummy/app/controllers/application_controller.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | class ApplicationController < ActionController::Base 3 | # Prevent CSRF attacks by raising an exception. 4 | # For APIs, you may want to use :null_session instead. 5 | protect_from_forgery with: :exception 6 | end 7 | -------------------------------------------------------------------------------- /lib/rademade_admin/html_buffer.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | #todo move to concern dir 3 | module RademadeAdmin 4 | class HtmlBuffer < Array 5 | 6 | def html_safe 7 | join( $/ ).html_safe 8 | end 9 | 10 | def to_s 11 | html_safe 12 | end 13 | 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /spec/dummy/app/controllers/rademade_admin/items_controller.rb: -------------------------------------------------------------------------------- 1 | class RademadeAdmin::ItemsController < RademadeAdmin::ModelController 2 | 3 | options do 4 | list :name 5 | form do 6 | name 7 | price 8 | category 9 | sequel_gallery 10 | end 11 | end 12 | 13 | end -------------------------------------------------------------------------------- /spec/dummy/db/migrate/20140814075819_create_authors.rb: -------------------------------------------------------------------------------- 1 | class CreateAuthors < ActiveRecord::Migration 2 | def change 3 | create_table :authors do |t| 4 | t.string :name 5 | t.string :photo 6 | t.boolean :verified 7 | 8 | t.timestamps 9 | end 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /lib/rademade_admin/routing/resource.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin 3 | module Routing 4 | class Resource < ActionDispatch::Routing::Mapper::Resources::Resource 5 | def default_actions 6 | super + [:autocomplete] 7 | end 8 | end 9 | end 10 | end 11 | -------------------------------------------------------------------------------- /spec/dummy/config/boot.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | # Set up gems listed in the Gemfile. 3 | ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../../../Gemfile', __FILE__) 4 | 5 | require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE']) 6 | $LOAD_PATH.unshift File.expand_path('../../../../lib', __FILE__) 7 | -------------------------------------------------------------------------------- /spec/dummy/db/migrate/20140927181000_add_position_to_articles.rb: -------------------------------------------------------------------------------- 1 | class AddPositionToArticles < ActiveRecord::Migration 2 | 3 | def self.up 4 | add_column :articles, :author_position, :integer 5 | end 6 | 7 | def self.down 8 | remove_column :articles, :author_position 9 | end 10 | 11 | end -------------------------------------------------------------------------------- /spec/dummy/db/migrate/20140930165500_rename_author_rubrics.rb: -------------------------------------------------------------------------------- 1 | class RenameAuthorRubrics < ActiveRecord::Migration 2 | 3 | def self.up 4 | rename_table :authors_rubrics, :author_rubrics 5 | end 6 | 7 | def self.down 8 | rename_table :author_rubrics, :authors_rubrics 9 | end 10 | 11 | end -------------------------------------------------------------------------------- /spec/dummy/db/migrate/20141001155800_add_publish_time_to_articles.rb: -------------------------------------------------------------------------------- 1 | class AddPublishTimeToArticles < ActiveRecord::Migration 2 | 3 | def self.up 4 | add_column :articles, :publish_time, :datetime 5 | end 6 | 7 | def self.down 8 | remove_column :articles, :publish_time 9 | end 10 | 11 | end -------------------------------------------------------------------------------- /spec/dummy/db/sequel/1443626796_create_items.rb: -------------------------------------------------------------------------------- 1 | Sequel.migration do 2 | change do 3 | create_table(:items) do 4 | primary_key :id 5 | foreign_key :category_id, :categories 6 | String :name, :null => false 7 | Float :price 8 | Boolean :status 9 | end 10 | end 11 | end -------------------------------------------------------------------------------- /app/assets/javascripts/app/forms/insert.coffee: -------------------------------------------------------------------------------- 1 | $(document).on 'ready page:load init-plugins', () -> 2 | 3 | $('.insert-item-form').on 4 | 'ajax-submit-done' : (event , data) -> 5 | $(this) 6 | .attr('action', data.form_action) 7 | .append('') -------------------------------------------------------------------------------- /app/views/rademade_admin/_blocks/form/_control.html.erb: -------------------------------------------------------------------------------- 1 | <% 2 | concat render @template_service.cancel_button 3 | if @model_info.persistence_adapter.new?(@item) || can?(:update, @item) 4 | concat render @template_service.save_button, :f => f 5 | concat render @template_service.save_and_return_button, :f => f 6 | end %> -------------------------------------------------------------------------------- /lib/rademade_admin/model/configuration/csv_fields.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | require 'rademade_admin/model/configuration/list_fields' 3 | 4 | module RademadeAdmin 5 | module Model 6 | class Configuration 7 | class CsvFields < ListFields 8 | 9 | end 10 | end 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /app/assets/stylesheets/mixins/_import.sass: -------------------------------------------------------------------------------- 1 | @import "media" 2 | @import "background" 3 | @import "clear" 4 | @import "placeholder" 5 | @import "sprites" 6 | @import "sprite-m" 7 | @import "text-indent" 8 | @import "text-overflow" 9 | @import "column" 10 | @import "user-select" 11 | @import "fonts" 12 | @import "fonts-mixin" -------------------------------------------------------------------------------- /spec/dummy/app/models/category.rb: -------------------------------------------------------------------------------- 1 | class Category < Sequel::Model 2 | 3 | one_to_many :items 4 | 5 | mount_uploader :image, PosterUploader 6 | 7 | plugin :validation_helpers 8 | 9 | def to_s 10 | name 11 | end 12 | 13 | def validate 14 | super 15 | validates_unique :name 16 | end 17 | 18 | end -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/form/_textarea.sass: -------------------------------------------------------------------------------- 1 | .form-textarea 2 | display: block 3 | padding: 10px 15px 4 | width: 100% 5 | height: 150px 6 | font-size: em(14) 7 | color: $form-textarea-color 8 | outline: none 9 | border: 1px solid $form-textarea-border 10 | border-radius: 4px 11 | box-sizing: border-box -------------------------------------------------------------------------------- /lib/rademade_admin/gallery.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin 3 | module Gallery 4 | 5 | def method_missing(name, *arguments) 6 | if name == 'images' 7 | raise NotImplementedError.new 'Implement "images" method' 8 | end 9 | super 10 | end 11 | 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /spec/dummy/app/controllers/rademade_admin/tags_controller.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | class RademadeAdmin::TagsController < RademadeAdmin::ModelController 3 | 4 | options do 5 | parent_menu 'Post' 6 | list :name 7 | form do 8 | name 9 | description :text 10 | end 11 | end 12 | 13 | end -------------------------------------------------------------------------------- /spec/dummy/db/migrate/20141224161545_create_active_gallery_photos.rb: -------------------------------------------------------------------------------- 1 | class CreateActiveGalleryPhotos < ActiveRecord::Migration 2 | def change 3 | create_table :active_gallery_photos do |t| 4 | t.references :active_gallery, index: true 5 | t.string :image 6 | 7 | t.timestamps 8 | end 9 | end 10 | end 11 | -------------------------------------------------------------------------------- /lib/rademade_admin/bower/performer.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | require 'bower-rails/performer' 3 | 4 | module RademadeAdmin 5 | module Bower 6 | class Performer < BowerRails::Performer 7 | 8 | def root_path 9 | @root_path ||= RademadeAdmin::Engine.root.to_s 10 | end 11 | 12 | end 13 | end 14 | end 15 | -------------------------------------------------------------------------------- /app/assets/javascripts/app/forms/remove.coffee: -------------------------------------------------------------------------------- 1 | $(document).on 'ready page:load init-plugins', () -> 2 | 3 | $('[data-delete-item-form]').on 4 | 'ajax-before-submit' : (event, submitStart) -> 5 | submitStart() if confirm I18n.t('rademade_admin.remove_confirm.record') 6 | 'ajax-submit-done' : () -> 7 | $(this).closest('tr').fadeOut 300 -------------------------------------------------------------------------------- /app/assets/javascripts/app/common/turboform.coffee: -------------------------------------------------------------------------------- 1 | initTurboform = () -> 2 | $('form[data-turboform]').on 'submit', () -> 3 | separator = if @action.indexOf('?') is -1 then '?' else '&' 4 | Turbolinks.visit @action + separator + $(this).serialize() 5 | return false 6 | 7 | $ -> 8 | $(document).on 'ready page:load init-plugins', initTurboform 9 | -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/button/main/colors/_main.sass: -------------------------------------------------------------------------------- 1 | .btn 2 | color: $white 3 | background: $gray 4 | border: 1px solid $gray 5 | 6 | &:hover 7 | color: $gray 8 | background: none 9 | 10 | &.is-stroke 11 | color: $gray 12 | background: none 13 | 14 | &:hover 15 | color: $white 16 | background: $gray 17 | -------------------------------------------------------------------------------- /lib/rademade_admin/sortable.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | #todo move to concern dir 3 | module RademadeAdmin 4 | module Sortable 5 | 6 | def method_missing(name, *arguments) 7 | if name == 'position' 8 | raise NotImplementedError.new 'Implement "position" method' 9 | end 10 | super 11 | end 12 | 13 | end 14 | end 15 | -------------------------------------------------------------------------------- /spec/dummy/app/models/tag.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | class Tag 3 | include Mongoid::Document 4 | 5 | field :name, :type => String, :localize => true 6 | field :description, :type => String, :localize => true 7 | has_and_belongs_to_many :posts 8 | 9 | validates_presence_of :name 10 | 11 | def to_s 12 | name 13 | end 14 | 15 | end 16 | -------------------------------------------------------------------------------- /app/views/rademade_admin/_blocks/_on_page_switcher.html.erb: -------------------------------------------------------------------------------- 1 |
2 |

<%= t('rademade_admin.show_on_page') %>

3 |
<% 4 | @pagination_variants.each_with_index do |per_page, index| 5 | concat on_page_item(per_page, index) 6 | end 7 | %>
8 |
-------------------------------------------------------------------------------- /config/initializers/simple_form/errors.rb: -------------------------------------------------------------------------------- 1 | module SimpleForm 2 | module Components 3 | module Errors 4 | 5 | def errors_on_attribute 6 | object.errors[attribute_name] || [] 7 | end 8 | 9 | def full_errors_on_attribute 10 | object.errors.full_messages_for(attribute_name) || [] 11 | end 12 | 13 | end 14 | end 15 | end -------------------------------------------------------------------------------- /app/assets/javascripts/app/templates/related-item.jst.ejs: -------------------------------------------------------------------------------- 1 | <% 2 | if (isSortable) { 3 | %><% 4 | } 5 | %> 6 | <% 7 | if (isDeletable) { 8 | %><% 9 | } 10 | %> -------------------------------------------------------------------------------- /lib/rademade_admin/model/adapter/query/mysql.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | require 'rademade_admin/model/adapter/query/active_record' 3 | 4 | module RademadeAdmin 5 | module Model 6 | module Adapter 7 | class Query 8 | class Mysql < RademadeAdmin::Model::Adapter::Query::ActiveRecord 9 | 10 | end 11 | end 12 | end 13 | end 14 | end -------------------------------------------------------------------------------- /spec/dummy/app/controllers/rademade_admin/articles_controller.rb: -------------------------------------------------------------------------------- 1 | class RademadeAdmin::ArticlesController < RademadeAdmin::ModelController 2 | 3 | options do 4 | parent_menu 'Active record' 5 | list :name, :author 6 | menu_count { Article.count } 7 | form do 8 | name 9 | active_gallery 10 | publish_time 11 | end 12 | end 13 | 14 | end -------------------------------------------------------------------------------- /spec/dummy/app/controllers/rademade_admin/authors_controller.rb: -------------------------------------------------------------------------------- 1 | class RademadeAdmin::AuthorsController < RademadeAdmin::ModelController 2 | 3 | options do 4 | parent_menu 'Active record' 5 | list :name, :articles, :verified 6 | form do 7 | name 8 | photo 9 | articles 10 | verified 11 | rubrics 12 | end 13 | end 14 | 15 | end -------------------------------------------------------------------------------- /lib/rademade_admin/model/configuration/field_label.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin 3 | module Model 4 | class Configuration 5 | class FieldLabel 6 | 7 | attr_accessor :name, :label 8 | 9 | def initialize(name, label) 10 | @name, @label = name, label 11 | end 12 | 13 | end 14 | end 15 | end 16 | end -------------------------------------------------------------------------------- /lib/rademade_admin/model/info/field/type.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin 3 | module Model 4 | class Info 5 | class Field 6 | module Type 7 | 8 | STRING = 1 9 | BOOLEAN = 2 10 | DATE = 3 11 | DATE_TIME = 4 12 | TEXT = 5 13 | 14 | end 15 | end 16 | end 17 | end 18 | end -------------------------------------------------------------------------------- /spec/dummy/db/migrate/20140909175300_translate_articles.rb: -------------------------------------------------------------------------------- 1 | class TranslateArticles < ActiveRecord::Migration 2 | 3 | def self.up 4 | Article.create_translation_table!({ 5 | :name => :string 6 | }, { 7 | :migrate_data => true 8 | }) 9 | end 10 | 11 | def self.down 12 | Article.drop_translation_table! :migrate_data => true 13 | end 14 | 15 | end -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/form/_label.sass: -------------------------------------------------------------------------------- 1 | .form-label 2 | float: left 3 | padding: 12px 15px 0 0 4 | width: 40% 5 | color: $form-label-color 6 | font-size: em(15) 7 | line-height: 21px 8 | box-sizing: border-box 9 | +media-below($media-mobile) 10 | float: none 11 | display: block 12 | width: 100% 13 | padding-right: 75px 14 | margin-bottom: 10px -------------------------------------------------------------------------------- /spec/dummy/app/uploaders/file_uploader.rb: -------------------------------------------------------------------------------- 1 | class FileUploader < CarrierWave::Uploader::Base 2 | 3 | storage :file 4 | 5 | def store_dir 6 | "uploads/files/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 7 | end 8 | 9 | def filename 10 | Digest::MD5.hexdigest(original_filename) << File.extname(original_filename) if original_filename 11 | end 12 | 13 | end -------------------------------------------------------------------------------- /app/views/rademade_admin/_blocks/button/_preview.html.erb: -------------------------------------------------------------------------------- 1 | <% 2 | preview_url = @model_info.preview_url(item) 3 | unless preview_url.nil? 4 | %> 5 | 6 | <%= t('rademade_admin.management.preview') %> 7 | 8 | <% 9 | end %> -------------------------------------------------------------------------------- /app/assets/javascripts/app/select2/related/model.coffee: -------------------------------------------------------------------------------- 1 | class @Select2Input.RelatedModel extends Backbone.Model 2 | 3 | relationRemove : () -> 4 | @trigger 'relation-remove', this 5 | 6 | # todo mixin 7 | update : (data) -> 8 | @set data 9 | @_triggerChange() 10 | 11 | getData : () -> 12 | @attributes 13 | 14 | _triggerChange : () -> 15 | @trigger 'data-change' -------------------------------------------------------------------------------- /app/services/search/part/where.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | require 'search/part/abstract' 3 | 4 | module RademadeAdmin 5 | module Search 6 | module Part 7 | class Where < Abstract 8 | 9 | attr_reader :type 10 | 11 | def initialize(type) 12 | super() 13 | @type = type 14 | end 15 | 16 | end 17 | end 18 | end 19 | end 20 | -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/form/select2/_drop.sass: -------------------------------------------------------------------------------- 1 | .select2-drop 2 | margin-top: -2px 3 | box-shadow: none 4 | &.select2-drop-active 5 | border: 1px solid $form-input-border 6 | 7 | .select2-search 8 | padding: 0 9 | input 10 | padding: 12px 15px 11 | border: 0 12 | font-size: em(14) 13 | background: none !important 14 | height: auto !important 15 | -------------------------------------------------------------------------------- /spec/dummy/app/views/layouts/application.html.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Dummy 5 | <%= stylesheet_link_tag "application", media: "all", "data-turbolinks-track" => true %> 6 | <%= javascript_include_tag "application", "data-turbolinks-track" => true %> 7 | <%= csrf_meta_tags %> 8 | 9 | 10 | 11 | <%= yield %> 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/services/login/error.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin 3 | class Login 4 | class Error < Exception 5 | 6 | attr_accessor :field 7 | 8 | def initialize(message, field) 9 | super message 10 | @field = field 11 | end 12 | 13 | def field_messages 14 | { field.to_sym => message } 15 | end 16 | end 17 | end 18 | end 19 | -------------------------------------------------------------------------------- /app/services/search/part/order.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | require 'search/part/abstract' 3 | 4 | module RademadeAdmin 5 | module Search 6 | module Part 7 | class Order < Abstract 8 | 9 | protected 10 | 11 | def part_object(field, value) 12 | value ||= :asc 13 | super(field, value.to_sym) 14 | end 15 | 16 | end 17 | end 18 | end 19 | end -------------------------------------------------------------------------------- /spec/dummy/db/migrate/20140927150400_create_authors_rubrics.rb: -------------------------------------------------------------------------------- 1 | class CreateAuthorsRubrics < ActiveRecord::Migration 2 | def change 3 | create_table :authors_rubrics, :id => false do |t| 4 | t.column :author_id, :integer 5 | t.column :rubric_id, :integer 6 | t.column :position, :integer 7 | end 8 | add_index :authors_rubrics, [:author_id, :rubric_id], :unique => true 9 | end 10 | end -------------------------------------------------------------------------------- /app/assets/stylesheets/base/_text.sass: -------------------------------------------------------------------------------- 1 | a 2 | position: relative 3 | text-decoration: none 4 | outline: none 5 | border: none 6 | +arial 7 | &:active 8 | background: none 9 | 10 | input 11 | margin: 0 12 | padding: 0 13 | outline: none 14 | border: 0 15 | +arial 16 | 17 | textarea, 18 | select 19 | +arial 20 | 21 | textarea 22 | resize: vertical 23 | 24 | .inline-el 25 | display: inline -------------------------------------------------------------------------------- /spec/dummy/config/mongoid.yml: -------------------------------------------------------------------------------- 1 | development: 2 | sessions: 3 | default: 4 | database: rademade_admin_dev 5 | hosts: 6 | - localhost:27017 7 | test: 8 | sessions: 9 | default: 10 | database: rademade_admin_test 11 | hosts: 12 | - localhost:27017 13 | production: 14 | sessions: 15 | default: 16 | database: rademade_admin 17 | hosts: 18 | - localhost:27017 -------------------------------------------------------------------------------- /spec/dummy/config/routes.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | Rails.application.routes.draw do 3 | 4 | mount RademadeAdmin::Engine => '/' 5 | namespace :rademade_admin, path: '/' do 6 | 7 | # Mongoid 8 | admin_resources :users, :posts, :tags 9 | # Active record 10 | admin_resources :authors, :articles, :rubrics 11 | # Sequel 12 | admin_resources :categories, :items, :colors 13 | 14 | end 15 | 16 | end -------------------------------------------------------------------------------- /spec/dummy/config/sequel.yml: -------------------------------------------------------------------------------- 1 | development: 2 | adapter: mysql2 3 | host: localhost 4 | database: rademade_admin_dev 5 | user: root 6 | password: root 7 | 8 | test: 9 | adapter: mysql2 10 | host: localhost 11 | database: rademade_admin_test 12 | user: root 13 | password: root 14 | 15 | production: 16 | adapter: mysql2 17 | host: localhost 18 | database: rademade_admin 19 | user: root 20 | password: root -------------------------------------------------------------------------------- /spec/dummy/lib/sortable.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module Sortable 3 | include RademadeAdmin::Sortable 4 | extend ActiveSupport::Concern 5 | 6 | included do 7 | 8 | field :position, :type => Integer 9 | default_scope -> { order_by(:position => :asc) } 10 | 11 | set_callback(:create, :before) do 12 | self.position = self.class.max(:position).to_i + 1 13 | end 14 | 15 | end 16 | 17 | end 18 | -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/form/select2/_btn.sass: -------------------------------------------------------------------------------- 1 | .select2-add-btn 2 | position: relative 3 | display: block 4 | padding: 12px 15px 12px 35px 5 | color: #5AACEE 6 | font-size: em(14) 7 | cursor: pointer 8 | &:after 9 | position: absolute 10 | content: '' 11 | top: 50% 12 | left: 12px 13 | transform: translateY(-50%) 14 | +sprite(select2-add) 15 | 16 | &:hover 17 | background-color: #E9F4FE 18 | -------------------------------------------------------------------------------- /lib/rademade_admin/model/configuration/form_fields.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | require 'rademade_admin/model/configuration/fields' 3 | 4 | module RademadeAdmin 5 | module Model 6 | class Configuration 7 | class FormFields < Fields 8 | 9 | protected 10 | 11 | def field_class 12 | RademadeAdmin::Model::Configuration::FormField 13 | end 14 | 15 | end 16 | end 17 | end 18 | end 19 | -------------------------------------------------------------------------------- /lib/rademade_admin/model/configuration/list_fields.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | require 'rademade_admin/model/configuration/fields' 3 | 4 | module RademadeAdmin 5 | module Model 6 | class Configuration 7 | class ListFields < Fields 8 | 9 | protected 10 | 11 | def field_class 12 | RademadeAdmin::Model::Configuration::ListField 13 | end 14 | 15 | end 16 | end 17 | end 18 | end 19 | -------------------------------------------------------------------------------- /spec/dummy/db/migrate/20140930172800_replace_author_rubrics.rb: -------------------------------------------------------------------------------- 1 | class ReplaceAuthorRubrics < ActiveRecord::Migration 2 | 3 | def self.up 4 | drop_table :author_rubrics 5 | create_table :author_rubrics do |t| 6 | t.column :author_id, :integer, :null => false 7 | t.column :rubric_id, :integer, :null => false 8 | t.column :position, :integer 9 | end 10 | end 11 | 12 | def self.down 13 | 14 | end 15 | 16 | end -------------------------------------------------------------------------------- /app/assets/stylesheets/lib/calendar/time/_input.sass: -------------------------------------------------------------------------------- 1 | .calendar-time .time-list .time-box 2 | .time-input 3 | display: block 4 | padding: 11px 5px 5 | width: 100% 6 | box-sizing: border-box 7 | font-size: 14px 8 | text-align: center 9 | color: #222834 10 | background: #FFFFFF 11 | outline: none 12 | border: 1px solid #D8DFEA 13 | border-radius: 4px 14 | &.is-error 15 | border: 1px solid #F6706F -------------------------------------------------------------------------------- /lib/templates/erb/scaffold/_form.html.erb: -------------------------------------------------------------------------------- 1 | <%%= simple_form_for(@<%= singular_table_name %>) do |f| %> 2 | <%%= f.error_notification %> 3 | 4 |
5 | <%- attributes.each do |attribute| -%> 6 | <%%= f.<%= attribute.reference? ? :association : :input %> :<%= attribute.name %> %> 7 | <%- end -%> 8 |
9 | 10 |
11 | <%%= f.button :submit %> 12 |
13 | <%% end %> 14 | -------------------------------------------------------------------------------- /app/inputs/rademade_admin/date_input.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin 3 | class DateInput < SimpleForm::Inputs::DateTimeInput 4 | 5 | def input(_) 6 | @builder.text_field(attribute_name, input_html_options.merge({ 7 | :data => { 8 | :calendar_picker => 'date' 9 | }, 10 | :value => object.send(attribute_name).try(:strftime, '%d.%m.%Y') 11 | })) 12 | end 13 | 14 | end 15 | end -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/login/form/_main.sass: -------------------------------------------------------------------------------- 1 | .login-form 2 | display: block 3 | margin: 0 auto 4 | max-width: 330px 5 | 6 | .btn 7 | margin-bottom: 15px 8 | height: 45px 9 | line-height: 44px 10 | border: 0 11 | 12 | .login-btn 13 | color: $login-btn-text 14 | background: $login-btn-bg 15 | font-size: em(16) 16 | line-height: 45px 17 | cursor: pointer 18 | &:hover 19 | background: $login-btn-bg-hover -------------------------------------------------------------------------------- /app/views/rademade_admin/_blocks/button/_edit.html.erb: -------------------------------------------------------------------------------- 1 | <% 2 | if can? :read, @model 3 | edit_url = admin_edit_uri(item) 4 | unless edit_url.nil? 5 | %> 6 | 7 | <%= t('rademade_admin.management.edit') %> 8 | 9 | <% 10 | end 11 | end %> -------------------------------------------------------------------------------- /spec/dummy/db/migrate/20140926142600_translate_authors.rb: -------------------------------------------------------------------------------- 1 | class TranslateAuthors < ActiveRecord::Migration 2 | 3 | def self.up 4 | Author.create_translation_table!({ 5 | :photo => :string 6 | }, { 7 | :migrate_data => true 8 | }) 9 | remove_column :authors, :photo 10 | end 11 | 12 | def self.down 13 | Author.drop_translation_table! :migrate_data => true 14 | add_column :authors, :photo, :string 15 | end 16 | 17 | end -------------------------------------------------------------------------------- /app/views/rademade_admin/_blocks/_search.html.erb: -------------------------------------------------------------------------------- 1 | <% 2 | unless @model_info.data_items.filter_fields.empty? 3 | list_uri = admin_list_uri(@model) 4 | %><% 9 | end %> -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/button/switch/colors/_blue.sass: -------------------------------------------------------------------------------- 1 | .btn-switch 2 | &.is-blue 3 | .btn-switch-item 4 | border-color: $btn-switch-blue-color 5 | 6 | &.is-active 7 | color: $white 8 | background-color: $btn-switch-blue-color 9 | 10 | &:hover 11 | color: $white 12 | 13 | &:hover 14 | color: $btn-switch-blue-color 15 | 16 | &:first-child 17 | border-color: $btn-switch-blue-color 18 | -------------------------------------------------------------------------------- /spec/factories/user.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | FactoryGirl.define do 3 | 4 | factory :simple_user, class: User do 5 | first_name 'John' 6 | last_name 'Doe' 7 | email 'simple@user.com' 8 | password '12345678' 9 | admin false 10 | end 11 | 12 | factory :admin_user, class: User do 13 | first_name 'Admin' 14 | last_name 'User' 15 | email 'admin@user.com' 16 | password '12345678' 17 | admin true 18 | end 19 | 20 | end 21 | -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/form/_main.sass: -------------------------------------------------------------------------------- 1 | .form 2 | display: block 3 | max-width: 856px 4 | +clear 5 | 6 | .form-box 7 | position: relative 8 | display: block 9 | padding-right: 50px 10 | margin-bottom: 25px 11 | box-sizing: border-box 12 | +clear 13 | +media-below($media-mobile) 14 | padding-right: 0 15 | 16 | 17 | .ui-tabs-panel 18 | .form-box 19 | padding-right: 0 20 | 21 | input 22 | -webkit-appearance: none 23 | -moz-appearance: none -------------------------------------------------------------------------------- /lib/rademade_admin/model/adapter/persistence/sequel.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin 3 | module Model 4 | module Adapter 5 | class Persistence 6 | class Sequel < RademadeAdmin::Model::Adapter::Persistence 7 | 8 | def new?(record) 9 | record.new? 10 | end 11 | 12 | def save(record) 13 | record.save 14 | end 15 | 16 | end 17 | end 18 | end 19 | end 20 | end -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/nav/_counter.sass: -------------------------------------------------------------------------------- 1 | .nav-counter 2 | position: relative 3 | display: inline-block 4 | margin: 1px 0 -5px 0 5 | padding: 0 3px 6 | font-size: em(11) 7 | vertical-align: top 8 | color: $nav-counter-color 9 | font-weight: bold 10 | &:after 11 | position: absolute 12 | top: 1px 13 | left: -1px 14 | content: '' 15 | width: 100% 16 | height: 13px 17 | border-radius: 4px 18 | border: 1px solid $nav-counter-border 19 | -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/pagination/_sep.sass: -------------------------------------------------------------------------------- 1 | .pagination-sep 2 | display: inline-block 3 | vertical-align: top 4 | width: 32px 5 | height: 32px 6 | line-height: 32px 7 | font-size: em(15) 8 | border-radius: 4px 9 | color: $pagination-color 10 | text-align: center 11 | user-select: none 12 | border: 1px solid transparent 13 | transition: color $transitionVal ease-in-out, border $transitionVal ease-in-out 14 | +media-below(1100) 15 | display: none 16 | -------------------------------------------------------------------------------- /app/views/rademade_admin/_blocks/button/_save_and_return.html.erb: -------------------------------------------------------------------------------- 1 | <% 2 | if @with_save_and_return_button 3 | translate_name = @model_info.persistence_adapter.new?(f.object) ? 'helpers.submit.create' : 'helpers.submit.update' 4 | save_text = t(translate_name, :model => f.object.class.to_s) 5 | submit_button_text = t('rademade_admin.button.save_and_return', :save => save_text) 6 | concat f.submit submit_button_text, :class => 'btn-link is-blue', :name => 'save_and_return' 7 | end %> -------------------------------------------------------------------------------- /spec/dummy/app/models/author.rb: -------------------------------------------------------------------------------- 1 | class Author < ActiveRecord::Base 2 | 3 | has_many :articles, :sortable => true, :sortable_field => :author_position 4 | has_many :author_rubrics, :dependent => :destroy 5 | has_many :rubrics, :through => :author_rubrics, :sortable => true 6 | 7 | translates :photo 8 | 9 | accepts_nested_attributes_for :translations 10 | 11 | Translation.mount_uploader :photo, PosterUploader 12 | 13 | def to_s 14 | name 15 | end 16 | 17 | end 18 | -------------------------------------------------------------------------------- /lib/rademade_admin/model/adapter/persistence/mongoid.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin 3 | module Model 4 | module Adapter 5 | class Persistence 6 | class Mongoid < RademadeAdmin::Model::Adapter::Persistence 7 | 8 | def new?(record) 9 | record.new_record? 10 | end 11 | 12 | def save(record) 13 | record.save! 14 | end 15 | 16 | end 17 | end 18 | end 19 | end 20 | end -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/nav/_item.sass: -------------------------------------------------------------------------------- 1 | .nav-item 2 | position: relative 3 | border-bottom: 1px solid $nav-link-border 4 | box-sizing: border-box 5 | .nav-link 6 | &.with-dd 7 | &:before 8 | position: absolute 9 | content: "" 10 | right: 16px 11 | top: 19px 12 | opacity: .5 13 | +sprite(dd-tile) 14 | &.is-active 15 | &:before 16 | opacity: 1 17 | &:hover 18 | &:before 19 | opacity: 1 -------------------------------------------------------------------------------- /lib/rademade_admin/model/adapter/persistence/active_record.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin 3 | module Model 4 | module Adapter 5 | class Persistence 6 | class ActiveRecord < RademadeAdmin::Model::Adapter::Persistence 7 | 8 | def new?(record) 9 | record.new_record? 10 | end 11 | 12 | def save(record) 13 | record.save! 14 | end 15 | 16 | end 17 | end 18 | end 19 | end 20 | end -------------------------------------------------------------------------------- /spec/dummy/config/initializers/backtrace_silencers.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | # Be sure to restart your server when you modify this file. 3 | 4 | # You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. 5 | # Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } 6 | 7 | # You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. 8 | # Rails.backtrace_cleaner.remove_silencers! 9 | -------------------------------------------------------------------------------- /app/assets/javascripts/app/gallery/image/collection.coffee: -------------------------------------------------------------------------------- 1 | class @GalleryImageCollection extends Backbone.Collection 2 | 3 | setClassName : (className) -> 4 | @className = className 5 | 6 | getClassName : () -> 7 | @className 8 | 9 | setSortUrl : (sortUrl) -> 10 | @sortUrl = sortUrl 11 | 12 | sort : (images) -> 13 | $.ajax 14 | type : 'patch' 15 | url : @sortUrl 16 | data : 17 | class_name : @className 18 | images : images 19 | dataType : 'json' -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/nav/_dd.sass: -------------------------------------------------------------------------------- 1 | .nav-dd 2 | .nav-item 3 | border-bottom: 0 4 | .nav-link 5 | background: $nav-link-dd-bg 6 | &.is-active 7 | color: $nav-link-dd-color-bg 8 | background: $nav-link-dd-bg 9 | &:after 10 | display: none 11 | 12 | .nav-dd 13 | .nav-link 14 | padding-left: 40px 15 | 16 | .nav-dd 17 | .nav-link 18 | padding-left: 60px 19 | 20 | .nav-dd 21 | .nav-link 22 | padding-left: 80px 23 | -------------------------------------------------------------------------------- /app/assets/stylesheets/mixins/_placeholder.sass: -------------------------------------------------------------------------------- 1 | =placeholder($n,$z) 2 | &::-webkit-input-placeholder 3 | color: $n 4 | font-size: $z 5 | transition: color 0.5s ease-in-out 6 | &:-moz-placeholder 7 | color: $n 8 | font-size: $z 9 | transition: color 0.5s ease-in-out 10 | &::-moz-placeholder 11 | color: $n 12 | font-size: $z 13 | transition: color 0.5s ease-in-out 14 | &:-ms-input-placeholder 15 | color: $n 16 | font-size: $z 17 | transition: color 0.5s ease-in-out -------------------------------------------------------------------------------- /app/views/rademade_admin/_layouts/parts/_head.html.erb: -------------------------------------------------------------------------------- 1 | Rademade Admin 2 | 3 | 4 | <%= favicon_link_tag('rademade_admin/fav1.ico') %> 5 | <%= javascript_include_tag(:rademade_admin, 'data-turbolinks-track' => true) %> 6 | <%= yield(:head) if content_for?(:head) %> 7 | <%= stylesheet_link_tag(:rademade_admin, :media => 'all', 'data-turbolinks-track' => true) %> 8 | <%= csrf_meta_tags %> -------------------------------------------------------------------------------- /app/assets/stylesheets/lib/calendar/date/_week.sass: -------------------------------------------------------------------------------- 1 | $w100: 100% 2 | .rademade-calendar .calendar-date 3 | .date-week 4 | padding: 0 10px 5 | border-bottom: 1px solid #E1E6EF 6 | 7 | &:after 8 | display: table 9 | content: '' 10 | clear: both 11 | 12 | .week-val 13 | float: left 14 | width: $w100 / 7 15 | text-align: center 16 | font-size: 13px 17 | line-height: 26px 18 | color: #222834 19 | opacity: .2 20 | &.is-active 21 | opacity: 1 -------------------------------------------------------------------------------- /app/controllers/rademade_admin/status_controller.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin 3 | class StatusController < RademadeAdmin::AbstractController 4 | 5 | include RademadeAdmin::Notifier 6 | 7 | def toggle 8 | authorize! :update, params[:model] 9 | status_changer = RademadeAdmin::Status::Toggler.new(params[:model], params[:id]) 10 | status_changer.init_item 11 | status_changer.toggle 12 | success_status_change(status_changer.item) 13 | end 14 | 15 | end 16 | end -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/form/_import.sass: -------------------------------------------------------------------------------- 1 | @import "main" 2 | @import "select" 3 | @import "label" 4 | @import "input" 5 | @import "textarea" 6 | @import "lang" 7 | @import "erorr" 8 | @import "description" 9 | @import "checkbox" 10 | 11 | @import "file/main" 12 | @import "file/item" 13 | 14 | @import "select2/main" 15 | @import "select2/list" 16 | @import "select2/choise" 17 | @import "select2/result" 18 | @import "select2/arrow" 19 | @import "select2/drop" 20 | @import "select2/btn" 21 | 22 | @import "datetimepicker/main" -------------------------------------------------------------------------------- /lib/rademade_admin/user.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | #todo move to concern/model dir 3 | module RademadeAdmin 4 | module UserModule 5 | 6 | def self.get_by_email(email) 7 | raise NotImplementedError.new "Implement 'get_by_email' method" 8 | end 9 | 10 | def method_missing(name, *arguments) 11 | if %w(id email password valid_password? admin?).include? name 12 | raise NotImplementedError.new "Implement '#{name}' method" 13 | end 14 | super 15 | end 16 | 17 | end 18 | end 19 | -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/content/_tooltip.sass: -------------------------------------------------------------------------------- 1 | .tooltip-holder 2 | position: absolute 3 | opacity: 0 4 | z-index: 0 5 | left: 50% 6 | margin-left: -250px 7 | width: 500px 8 | bottom: 120% 9 | text-align: center 10 | transition: opacity 0.3s ease-in-out 11 | visibility: hidden 12 | 13 | .tooltip-text 14 | display: inline-block 15 | padding: 4px 10px 16 | font-size: em(13) 17 | line-height: 14px 18 | background: $content-tooltip-bg 19 | border-radius: 4px 20 | color: $content-tooltip-color 21 | -------------------------------------------------------------------------------- /app/inputs/rademade_admin/date_time_input.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin 3 | class DateTimeInput < SimpleForm::Inputs::DateTimeInput 4 | 5 | def input(_) 6 | @builder.text_field(attribute_name, input_html_options.merge({ 7 | :data => { 8 | :calendar_picker => 'datetime' 9 | }, 10 | :value => object.send(attribute_name).try(:strftime, '%d.%m.%Y %R') 11 | })) 12 | end 13 | 14 | def additional_classes 15 | super + ['with-time'] 16 | end 17 | 18 | end 19 | end -------------------------------------------------------------------------------- /bin/rails: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | # This command will automatically be run when you run "rails" with Rails 4 gems installed from the root of your application. 3 | 4 | ENGINE_ROOT = File.expand_path('../..', __FILE__) 5 | ENGINE_PATH = File.expand_path('../../lib/rademade_admin/engine', __FILE__) 6 | 7 | # Set up gems listed in the Gemfile. 8 | ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) 9 | require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE']) 10 | 11 | require 'rails/all' 12 | require 'rails/engine/commands' 13 | -------------------------------------------------------------------------------- /lib/rademade_admin/model/configuration/list_field.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin 3 | module Model 4 | class Configuration 5 | class ListField 6 | 7 | attr_accessor :name 8 | 9 | def initialize(name, opts = {}) 10 | @name = name 11 | @opts = opts 12 | end 13 | 14 | def preview_accessor 15 | @opts[:method] 16 | end 17 | 18 | def preview_handler 19 | @opts[:handler] 20 | end 21 | 22 | end 23 | end 24 | end 25 | end -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | rvm: 2 | - 2.0.0 3 | - 2.1.0 4 | 5 | services: 6 | - mongodb 7 | 8 | branches: 9 | only: 10 | - master 11 | 12 | before_install: 13 | - npm install bower 14 | - mysql -u root -e "SET PASSWORD FOR 'root'@'localhost' = PASSWORD('root');" 15 | - mysql -e "CREATE DATABASE rademade_admin_test;" 16 | - "export DISPLAY=:99.0" 17 | - "sh -e /etc/init.d/xvfb start" 18 | 19 | script: 20 | - bundle exec rake app:rademade_admin:bower:install 21 | - RAILS_ENV=test bundle exec rake db:migrate --trace 22 | - bundle exec rspec spec/ 23 | -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/form/_checkbox.sass: -------------------------------------------------------------------------------- 1 | .form-checkbox 2 | position: relative 3 | display: block 4 | margin-top: 10px 5 | width: 25px 6 | height: 25px 7 | overflow: hidden 8 | 9 | input 10 | position: absolute 11 | opacity: 0 12 | top: 0 13 | left: 0 14 | width: 500em 15 | height: 500em 16 | cursor: pointer 17 | 18 | input:checked + .form-checkbox-ico 19 | +sprite(checkbox_active) 20 | 21 | .form-checkbox-ico 22 | display: block 23 | top: 0 24 | left: 0 25 | +sprite(checkbox_empty) 26 | -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/pagination/_link.sass: -------------------------------------------------------------------------------- 1 | .pagination-link 2 | display: inline-block 3 | vertical-align: top 4 | margin-right: 5px 5 | width: 32px 6 | height: 32px 7 | line-height: 32px 8 | font-size: em(15) 9 | border-radius: 4px 10 | color: $pagination-color 11 | text-align: center 12 | border: 1px solid transparent 13 | transition: color $transitionVal ease-in-out, border $transitionVal ease-in-out 14 | +media-below(1100) 15 | display: none 16 | 17 | &.is-active 18 | +media-below(1100) 19 | display: inline-block 20 | -------------------------------------------------------------------------------- /app/assets/stylesheets/mixins/_fonts-mixin.sass: -------------------------------------------------------------------------------- 1 | =arial() 2 | font-family: Arial, sans-serif 3 | =roboto() 4 | font-family: 'Roboto', sans-serif 5 | =helvetica-black() 6 | font-family: 'HelveticaNeueCyr-Black', Arial, sans-serif 7 | =helvetica-bold() 8 | font-family: 'HelveticaNeueCyr-Bold', Arial, sans-serif 9 | =helvetica-light() 10 | font-family: 'HelveticaNeueCyr-Light', Arial, sans-serif 11 | =helvetica-medium() 12 | font-family: 'HelveticaNeueCyr-Medium', Arial, sans-serif 13 | =helvetica-regular() 14 | font-family: 'HelveticaNeueCyr-Roman', Arial, sans-serif -------------------------------------------------------------------------------- /app/assets/javascripts/app/gallery/image/model.coffee: -------------------------------------------------------------------------------- 1 | class @GalleryImageModel extends ImageModel 2 | 3 | remove : () -> 4 | $.ajax 5 | type : 'delete' 6 | url : @get 'removeUrl' 7 | data : 8 | class_name : @collection.getClassName() 9 | dataType : 'json' 10 | success : () => 11 | @collection.remove this 12 | @trigger 'image-removed' 13 | error : (data) => 14 | window.notifier.notify data.error 15 | 16 | _getData : () -> 17 | data = super 18 | data.class_name = @collection.getClassName() 19 | data -------------------------------------------------------------------------------- /lib/rademade_admin/search/searcher.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin 3 | module Search 4 | class Searcher 5 | 6 | # 7 | # @param model_info [RademadeAdmin::Model::Info] 8 | # 9 | def initialize(model_info) 10 | @model_info = model_info 11 | end 12 | 13 | # 14 | # @param search_conditions [RademadeAdmin::Search::Conditions::Abstract] 15 | # 16 | def search(search_conditions) 17 | @model_info.query_adapter.exec_query(search_conditions) 18 | end 19 | 20 | end 21 | end 22 | end 23 | -------------------------------------------------------------------------------- /spec/dummy/lib/tasks/sequel.rake: -------------------------------------------------------------------------------- 1 | namespace :sequel do 2 | 3 | desc 'Run migrations' 4 | task :migrate, [:version] do |_, args| 5 | Sequel.extension :migration 6 | db = Sequel.connect(YAML.load_file("#{::Rails.root}/config/sequel.yml")[::Rails.env]) 7 | migration_directory = 'db/sequel' 8 | options = { table: 'sequel_migrations' } 9 | if args[:version] 10 | Sequel::Migrator.run(db, migration_directory, options.merge(target: args[:version].to_i)) 11 | else 12 | Sequel::Migrator.run(db, migration_directory, options) 13 | end 14 | end 15 | 16 | end -------------------------------------------------------------------------------- /app/services/search/where.rb: -------------------------------------------------------------------------------- 1 | module RademadeAdmin 2 | module Search 3 | module Where 4 | 5 | protected 6 | 7 | def regex_filter(where_conditions, search) 8 | if search.present? and not @data_items.filter_fields.empty? 9 | query_where = RademadeAdmin::Search::Part::Where.new(:or) 10 | @data_items.filter_fields.each do |field| 11 | query_where.add(field, /#{search}/i) 12 | end 13 | where_conditions.sub_add(query_where) 14 | end 15 | where_conditions 16 | end 17 | 18 | end 19 | end 20 | end -------------------------------------------------------------------------------- /app/views/rademade_admin/_blocks/button/_destroy.html.erb: -------------------------------------------------------------------------------- 1 | <% 2 | if can? :destroy, item 3 | delete_uri = admin_delete_uri(item) 4 | unless delete_uri.nil? 5 | %><%= form_tag(delete_uri, :method => :delete, :class => 'inline-el', :data => { :'delete-item-form' => '' }) do 6 | %><% 11 | end 12 | end 13 | end %> 14 | -------------------------------------------------------------------------------- /config/initializers/kaminari_route_proxy.rb: -------------------------------------------------------------------------------- 1 | module Kaminari 2 | module Helpers 3 | class Tag 4 | def page_url_for(page) 5 | admin_params = @params.extract!(:admin_params) 6 | params = @params.merge(@param_name => (page <= 1 ? nil : page), :only_path => true) 7 | if admin_params.empty? 8 | @template.url_for params 9 | else 10 | symbolized_params = params.inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo} 11 | Rails.application.routes.url_for(symbolized_params) 12 | end 13 | end 14 | end 15 | end 16 | end -------------------------------------------------------------------------------- /lib/rademade_admin/ckeditor_utils.rb: -------------------------------------------------------------------------------- 1 | module Ckeditor 2 | module Utils 3 | class << self 4 | def js_replace(dom_id, options = nil) 5 | js = ["(function() { if (typeof CKEDITOR != 'undefined') {"] 6 | 7 | if options && !options.keys.empty? 8 | js_options = ActiveSupport::JSON.encode(options) 9 | js << "CKEDITOR.replace('#{dom_id}', #{js_options}); }" 10 | else 11 | js << "CKEDITOR.replace('#{dom_id}'); }" 12 | end 13 | 14 | js << '})();' 15 | js.join.html_safe 16 | end 17 | end 18 | end 19 | end 20 | -------------------------------------------------------------------------------- /app/assets/javascripts/app/image/model.coffee: -------------------------------------------------------------------------------- 1 | class @ImageModel extends Backbone.Model 2 | 3 | crop : (cropAttributes) -> 4 | $.ajax 5 | type : 'post' 6 | url : @get('crop').url 7 | data : @_getData(cropAttributes) 8 | dataType : 'json' 9 | success : @_onSuccess 10 | 11 | _getData : (cropAttributes) -> 12 | id : @get('imageId') 13 | crop : cropAttributes 14 | 15 | _onSuccess : (result) => 16 | @set 17 | fullUrl : result.image_data.full_url 18 | crop : result.image_data.crop 19 | resizedUrl : result.resized_url 20 | @trigger 'crop' -------------------------------------------------------------------------------- /lib/rademade_admin/model/adapter/persistence.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin 3 | module Model 4 | module Adapter 5 | class Persistence 6 | 7 | def initialize(model) 8 | @model = model 9 | end 10 | 11 | def new_record 12 | @model.new 13 | end 14 | 15 | def new?(record) 16 | nil 17 | end 18 | 19 | def save(record) 20 | nil 21 | end 22 | 23 | def destroy(record) 24 | record.destroy 25 | end 26 | 27 | end 28 | end 29 | end 30 | end -------------------------------------------------------------------------------- /app/assets/stylesheets/lib/calendar/time/_btn.sass: -------------------------------------------------------------------------------- 1 | .calendar-time 2 | .time-btn 3 | position: absolute 4 | left: 50% 5 | transform: translateX(-50%) 6 | bottom: 30px 7 | width: 67% 8 | font-size: 14px 9 | color: #5AACEE 10 | height: 32px 11 | line-height: 30px 12 | background: #FFFFFF 13 | border: 1px solid #5AACEE 14 | border-radius: 4px 15 | margin: 0 16 | padding: 0 17 | outline: none 18 | box-sizing: border-box 19 | cursor: pointer 20 | +media-below($media-tablet) 21 | width: 80% 22 | height: 40px 23 | line-height: 40px 24 | -------------------------------------------------------------------------------- /app/controllers/rademade_admin/dashboard_controller.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin 3 | class DashboardController < RademadeAdmin::AbstractController 4 | 5 | helper RademadeAdmin::FormHelper 6 | helper RademadeAdmin::MenuHelper 7 | helper RademadeAdmin::UriHelper 8 | 9 | skip_before_action :require_login, :only => [:login] 10 | 11 | def index 12 | 13 | end 14 | 15 | def login 16 | if admin_logged_in? 17 | redirect_to :action => 'index' 18 | else 19 | render :layout => 'login' 20 | end 21 | end 22 | 23 | end 24 | end 25 | -------------------------------------------------------------------------------- /app/services/status/toggler.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin 3 | module Status 4 | class Toggler 5 | 6 | attr_reader :item 7 | 8 | def initialize(model, id) 9 | @model = model 10 | @id = id 11 | end 12 | 13 | def init_item 14 | @model_info = RademadeAdmin::Model::Graph.instance.model_info @model 15 | @item = @model_info.model.find @id 16 | end 17 | 18 | def toggle 19 | if @model_info.hideable? 20 | @item.toggle 21 | @item.save 22 | end 23 | end 24 | 25 | end 26 | end 27 | end -------------------------------------------------------------------------------- /spec/dummy/README.rdoc: -------------------------------------------------------------------------------- 1 | == README 2 | 3 | This README would normally document whatever steps are necessary to get the 4 | application up and running. 5 | 6 | Things you may want to cover: 7 | 8 | * Ruby version 9 | 10 | * System dependencies 11 | 12 | * Configuration 13 | 14 | * Database creation 15 | 16 | * Database initialization 17 | 18 | * How to run the test suite 19 | 20 | * Services (job queues, cache servers, search engines, etc.) 21 | 22 | * Deployment instructions 23 | 24 | * ... 25 | 26 | 27 | Please feel free to use a different markup language if you do not plan to run 28 | rake doc:app. 29 | -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/login/form/_label.sass: -------------------------------------------------------------------------------- 1 | .login-form 2 | .form-label 3 | position: absolute 4 | overflow: hidden 5 | top: 50% 6 | margin-top: -9px 7 | +ti 8 | 9 | &.email 10 | left: 17px 11 | width: 18px 12 | height: 18px 13 | background-repeat: no-repeat 14 | background-image: asset-url('rademade_admin/ico/user.svg') 15 | opacity: 0.4 16 | 17 | &.password 18 | left: 19px 19 | width: 12px 20 | height: 18px 21 | background-repeat: no-repeat 22 | background-image: asset-url('rademade_admin/ico/password.svg') 23 | opacity: 0.4 -------------------------------------------------------------------------------- /lib/rademade_admin/model/configuration/form_field.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin 3 | module Model 4 | class Configuration 5 | class FormField 6 | 7 | attr_accessor :name, :params 8 | 9 | def initialize(name, params = {}) 10 | @name = name 11 | init_params(params) 12 | end 13 | 14 | private 15 | 16 | def init_params(params) 17 | if params.is_a? Hash 18 | @params = params 19 | else 20 | @params = { :as => params } 21 | end 22 | end 23 | 24 | end 25 | end 26 | end 27 | end -------------------------------------------------------------------------------- /spec/dummy/app/assets/stylesheets/application.css: -------------------------------------------------------------------------------- 1 | /* 2 | * This is a manifest file that'll be compiled into application.css, which will include all the files 3 | * listed below. 4 | * 5 | * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets, 6 | * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path. 7 | * 8 | * You're free to add application-wide styles to this file and they'll appear at the top of the 9 | * compiled file, but it's generally better to create a new file per style scope. 10 | * 11 | *= require_self 12 | *= require_tree . 13 | */ 14 | -------------------------------------------------------------------------------- /lib/tasks/rademade_bower_install.rake: -------------------------------------------------------------------------------- 1 | require 'rademade_admin/bower/performer' 2 | 3 | desc 'Install bower vendor assets' 4 | task 'rademade_admin:bower:install', [:options] => :environment do |_, args| 5 | args.with_defaults(:options => '') 6 | RademadeAdmin::Bower::Performer.perform do |bower| 7 | sh "#{bower} install #{args[:options]}" 8 | end 9 | end 10 | 11 | desc 'Update bower vendor assets' 12 | task 'rademade_admin:bower:update', [:options] => :environment do |_, args| 13 | args.with_defaults(:options => '') 14 | RademadeAdmin::Bower::Performer.perform do |bower| 15 | sh "#{bower} update #{args[:options]}" 16 | end 17 | end -------------------------------------------------------------------------------- /spec/dummy/config/database.yml: -------------------------------------------------------------------------------- 1 | development: 2 | adapter: mysql2 3 | database: rademade_admin_dev 4 | encoding: utf8 5 | collation: utf8_general_ci 6 | username: root 7 | password: root 8 | pool: 5 9 | timeout: 5000 10 | 11 | test: 12 | adapter: mysql2 13 | database: rademade_admin_test 14 | encoding: utf8 15 | collation: utf8_general_ci 16 | username: root 17 | password: root 18 | pool: 5 19 | timeout: 5000 20 | 21 | production: 22 | adapter: mysql2 23 | database: rademade_admin 24 | encoding: utf8 25 | collation: utf8_general_ci 26 | username: root 27 | password: root 28 | pool: 5 29 | timeout: 5000 30 | -------------------------------------------------------------------------------- /spec/dummy/config/initializers/wrap_parameters.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | # Be sure to restart your server when you modify this file. 3 | 4 | # This file contains settings for ActionController::ParamsWrapper which 5 | # is enabled by default. 6 | 7 | # Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. 8 | ActiveSupport.on_load(:action_controller) do 9 | wrap_parameters format: [:json] if respond_to?(:wrap_parameters) 10 | end 11 | 12 | # To enable root element in JSON for ActiveRecord objects. 13 | # ActiveSupport.on_load(:active_record) do 14 | # self.include_root_in_json = true 15 | # end 16 | -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/form/select2/_result.sass: -------------------------------------------------------------------------------- 1 | .select2-results 2 | margin: 0 3 | padding: 0 4 | background: none 5 | 6 | .select2-result 7 | &.select2-highlighted 8 | background: none 9 | &:hover 10 | background-color: #DDEBF6 11 | 12 | .select2-no-results, 13 | .select2-searching 14 | padding: 12px 15px 15 | font-size: em(14) 16 | color: rgba(71,80,98,0.4) 17 | background-color: #fff 18 | 19 | .select2-result-label 20 | color: $form-input-color 21 | padding: 12px 15px 22 | font-size: em(14) 23 | text-decoration: none 24 | 25 | .select2-match 26 | text-decoration: none 27 | -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/popup/_main.sass: -------------------------------------------------------------------------------- 1 | .popup-wrapper 2 | position: fixed 3 | top: 0 4 | left: 0 5 | width: 100% 6 | height: 100% 7 | z-index: 999 8 | overflow-x: hidden 9 | overflow-y: scroll 10 | background: rgba(34,40,52,.89) 11 | box-sizing: border-box 12 | 13 | .popup-headline 14 | position: absolute 15 | top: 0 16 | left: 0 17 | padding: 0 270px 18 | width: 100% 19 | height: 60px 20 | text-align: center 21 | box-sizing: border-box 22 | 23 | .popup-data 24 | display: block 25 | padding: 120px 35px 80px 35px 26 | height: 100% 27 | text-align: center 28 | box-sizing: border-box -------------------------------------------------------------------------------- /app/views/rademade_admin/_layouts/content_item.html.erb: -------------------------------------------------------------------------------- 1 | <% 2 | if defined?(content_url) 3 | url = content_url 4 | else 5 | url_params = request.parameters.symbolize_keys 6 | url_params.delete(:layout) 7 | url = admin_url_for(url_params) 8 | end 9 | %>
10 |
11 | <%= content_header %> 12 | 13 |
<% 14 | if content_for?(:content) 15 | %>
<%= yield(:content) %>
<% 16 | end 17 | %>
-------------------------------------------------------------------------------- /app/views/kaminari/rademade/_paginator.html.erb: -------------------------------------------------------------------------------- 1 | <%= paginator.render do -%> 2 | 19 | <% end -%> 20 | -------------------------------------------------------------------------------- /lib/rademade_admin/model/info/uploader.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin 3 | module Model 4 | class Info 5 | class Uploader 6 | 7 | attr_reader :name, :uploader 8 | 9 | def initialize(name, uploader) 10 | @name, @uploader = name, uploader 11 | end 12 | 13 | def remove_proc 14 | method_name = :"remove_#{name}=" 15 | Proc.new do 16 | self.send(method_name, true) 17 | end 18 | end 19 | 20 | def full_path_for(image_path) 21 | "#{CarrierWave.root}#{image_path}" 22 | end 23 | 24 | end 25 | end 26 | end 27 | end -------------------------------------------------------------------------------- /spec/dummy/lib/kaminari/sequel.rb: -------------------------------------------------------------------------------- 1 | module Kaminari 2 | module Sequel 3 | 4 | def self.included(base) 5 | 6 | base.class_eval do 7 | alias :total_pages :page_count 8 | alias :limit_value :page_size 9 | end 10 | 11 | ::Sequel::DatasetPagination.class_eval do 12 | 13 | def paginate_with_safe_page(page_no, page_size, record_count = nil) 14 | page_no = page_no.to_i 15 | page_no = page_no == 0 ? 1 : page_no 16 | paginate_without_safe_page(page_no, page_size, record_count) 17 | end 18 | 19 | alias_method_chain :paginate, :safe_page 20 | 21 | end 22 | 23 | end 24 | 25 | end 26 | end -------------------------------------------------------------------------------- /spec/dummy/app/assets/javascripts/application.js: -------------------------------------------------------------------------------- 1 | // This is a manifest file that'll be compiled into application.js, which will include all the files 2 | // listed below. 3 | // 4 | // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts, 5 | // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path. 6 | // 7 | // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the 8 | // compiled file. 9 | // 10 | // Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details 11 | // about supported directives. 12 | // 13 | //= require_tree . 14 | -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/login/_project.sass: -------------------------------------------------------------------------------- 1 | .login-project 2 | position: absolute 3 | top: 0 4 | left: 0 5 | width: 100% 6 | text-align: center 7 | transform: translateY(0%) 8 | animation: projectFade 1.5s alternate ease 9 | 10 | .login-project-box 11 | display: inline-block 12 | padding: 9px 25px 13 | min-width: 330px 14 | background: $login-project-bg 15 | box-sizing: border-box 16 | border-radius: 0 0 4px 4px 17 | 18 | .login-project-title 19 | color: $login-project-title-color 20 | font-size: em(18) 21 | 22 | 23 | @keyframes projectFade 24 | 0% 25 | transform: translateY(-100%) 26 | 100% 27 | transform: translateY(0%) 28 | -------------------------------------------------------------------------------- /lib/rademade_admin.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | require 'kaminari' 3 | require 'cancan' 4 | require 'bower-rails' 5 | require 'autoprefixer-rails' 6 | require 'sass-rails' 7 | require 'configurations' 8 | 9 | # js assets 10 | require 'turbolinks' 11 | require 'i18n-js' 12 | require 'simple_form' 13 | require 'ckeditor' 14 | require 'rademade_admin/ckeditor_utils' 15 | 16 | require 'rademade_admin/sortable' 17 | require 'rademade_admin/engine' 18 | 19 | module RademadeAdmin 20 | 21 | include Configurations 22 | 23 | configurable :admin_class, :ability_class 24 | 25 | configuration_defaults do |default_config| 26 | default_config.ability_class = ::RademadeAdmin::Ability 27 | end 28 | 29 | end -------------------------------------------------------------------------------- /spec/dummy/app/controllers/rademade_admin/users_controller.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | class RademadeAdmin::UsersController < RademadeAdmin::ModelController 3 | 4 | options do 5 | parent_menu 'Mongoid' 6 | list :email, :first_name, :last_name, :avatar, :admin 7 | csv do 8 | full_name 9 | email 10 | admin :method => :admin_text 11 | end 12 | form do 13 | email :hint => 'Электронная почта' 14 | avatar 15 | first_name 16 | last_name 17 | address :'rademade_admin/location' 18 | posts 19 | admin :boolean 20 | end 21 | labels do 22 | full_name 'Полное имя' 23 | admin 'Права' 24 | end 25 | end 26 | 27 | end 28 | -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/button/link/_main.sass: -------------------------------------------------------------------------------- 1 | .btn-link 2 | display: inline-block 3 | margin: 10px 20px 0 0 4 | font-size: em(14) 5 | border: 0 6 | background: none 7 | cursor: pointer 8 | &.is-blue 9 | color: $btn-blue-color 10 | &:hover 11 | span 12 | border-bottom: 1px solid $btn-blue-color 13 | &.is-red 14 | color: $btn-red-color 15 | &:hover 16 | span 17 | border-bottom: 1px solid $btn-red-color 18 | 19 | &.is-label 20 | width: 35% 21 | padding-right: 26px 22 | margin-right: 0 23 | +media-below($media-mobile) 24 | width: 100% 25 | 26 | span 27 | border-bottom: 1px solid transparent 28 | transition: border 0.3s ease-in-out -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/form/_input.sass: -------------------------------------------------------------------------------- 1 | .input-holder 2 | float: left 3 | display: block 4 | position: relative 5 | width: 60% 6 | +media-below($media-mobile) 7 | float: none 8 | width: 100% 9 | 10 | &.in-error 11 | .form-description 12 | display: none 13 | .form-input 14 | border: 1px solid $form-input-border-error 15 | 16 | .form-input 17 | display: block 18 | width: 100% 19 | padding: 11px 15px 20 | font-size: em(14) 21 | color: $form-input-color 22 | border: 1px solid $form-input-border 23 | border-radius: 4px 24 | box-sizing: border-box 25 | transition: border $transitionVal ease-in-out 26 | &:focus 27 | border: 1px solid $form-input-border-focus 28 | -------------------------------------------------------------------------------- /app/views/rademade_admin/_blocks/button/_hide.html.erb: -------------------------------------------------------------------------------- 1 | <% 2 | if @model_info.hideable? && can?(:toggle, item) 3 | toggle_url = admin_url_for( 4 | :controller => :'rademade_admin/status', 5 | :action => :toggle, 6 | :model => @model, 7 | :id => item.id 8 | ) #todo via native method. Add route resource 9 | %> 16 | 17 | <%= t('rademade_admin.management.show_status') %> 18 | 19 | <% 20 | end %> -------------------------------------------------------------------------------- /app/assets/stylesheets/lib/calendar/time/_main.sass: -------------------------------------------------------------------------------- 1 | .calendar-time 2 | position: absolute 3 | top: 0 4 | right: 0 5 | padding: 55px 35px 15px 35px 6 | width: 40% 7 | height: 100% 8 | box-sizing: border-box 9 | +media-below($media-tablet) 10 | border-top: 1px solid #E1E6EF 11 | position: relative 12 | width: 100% 13 | margin-top: 10px 14 | padding: 20px 35px 85px 35px 15 | 16 | .time-list 17 | margin: 0 -5px 18 | display: none 19 | 20 | &:after 21 | display: table 22 | content: '' 23 | clear: both 24 | 25 | .time-box 26 | float: left 27 | width: 50% 28 | padding: 0 5px 29 | box-sizing: border-box 30 | 31 | .with-time 32 | 33 | .time-list 34 | display: block -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 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 = 'RademadeAdmin' 12 | rdoc.options << '--line-numbers' 13 | rdoc.rdoc_files.include('README.rdoc') 14 | rdoc.rdoc_files.include('lib/**/*.rb') 15 | end 16 | 17 | APP_RAKEFILE = File.expand_path('../spec/dummy/Rakefile', __FILE__) 18 | load 'rails/tasks/engine.rake' 19 | 20 | Bundler::GemHelper.install_tasks 21 | 22 | require 'rspec/core' 23 | require 'rspec/core/rake_task' 24 | 25 | RSpec::Core::RakeTask.new(:spec => 'app:db:test:prepare') 26 | 27 | task default: :spec 28 | -------------------------------------------------------------------------------- /app/assets/stylesheets/mixins/_media.sass: -------------------------------------------------------------------------------- 1 | =media($width) 2 | @media all and (max-width: $width/16 + em) 3 | @content 4 | 5 | =media-below($width) 6 | @media all and (max-width: $width/16 + em) 7 | @content 8 | 9 | =media-above($width) 10 | @media all and (min-width: $width/16 + em) 11 | @content 12 | 13 | =media-below-height($height) 14 | @media all and (max-height: $height/16 + em) 15 | @content 16 | 17 | =retina() 18 | @media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi) 19 | @content 20 | 21 | +media-below(400) 22 | @-ms-viewport 23 | width: 320px 24 | 25 | $browser-context: 16 26 | 27 | @function em($pixels, $context: $browser-context) 28 | @return #{$pixels/$context}em -------------------------------------------------------------------------------- /spec/dummy/config/locales/en.yml: -------------------------------------------------------------------------------- 1 | # Files in the config/locales directory are used for internationalization 2 | # and are automatically loaded by Rails. If you want to use locales other 3 | # than English, add the necessary files in this directory. 4 | # 5 | # To use the locales, use `I18n.t`: 6 | # 7 | # I18n.t 'hello' 8 | # 9 | # In views, this is aliased to just `t`: 10 | # 11 | # <%= t('hello') %> 12 | # 13 | # To use a different locale, set it with `I18n.locale`: 14 | # 15 | # I18n.locale = :es 16 | # 17 | # This would use the information in config/locales/es.yml. 18 | # 19 | # To learn more, please read the Rails Internationalization guide 20 | # available at http://guides.rubyonrails.org/i18n.html. 21 | 22 | en: 23 | hello: "Hello world" 24 | -------------------------------------------------------------------------------- /app/services/video_service.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | class RademadeAdmin::VideoService 3 | 4 | def initialize(file_path) 5 | @file_path = file_path 6 | end 7 | 8 | def take_random_screenshot(thumb_path) 9 | duration = duration_in_seconds 10 | screenshot_time = duration.nil? ? 0 : Random.rand(duration) 11 | `ffmpeg -ss #{screenshot_time} -i #{@file_path} -f image2 -vframes 1 #{thumb_path}` 12 | end 13 | 14 | def duration_in_seconds 15 | output = `ffmpeg -i #{@file_path} 2>&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//` 16 | if output =~ /([\d][\d]):([\d][\d]):([\d][\d]).([\d]+)/ 17 | (($1.to_i * 60 + $2.to_i) * 60 + $3.to_i) + ($4.to_i / 100) 18 | else 19 | nil 20 | end 21 | end 22 | 23 | end 24 | -------------------------------------------------------------------------------- /spec/dummy/config/initializers/secret_token.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | # Be sure to restart your server when you modify this file. 3 | 4 | # Your secret key is used for verifying the integrity of signed cookies. 5 | # If you change this key, all old signed cookies will become invalid! 6 | 7 | # Make sure the secret is at least 30 characters and all random, 8 | # no regular words or you'll be exposed to dictionary attacks. 9 | # You can use `rake secret` to generate a secure secret key. 10 | 11 | # Make sure your secret_key_base is kept private 12 | # if you're sharing your code publicly. 13 | Dummy::Application.config.secret_key_base = '66ec29b29933eb853ab5265de96f4037a9d3792ce6ba44abd7d0444eddb0714247f5ac636559fcad47815b4ae61d99f17f60c78673e9e03ec3ca60fec356b1b2' 14 | -------------------------------------------------------------------------------- /spec/dummy/config/initializers/inflections.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | # Be sure to restart your server when you modify this file. 3 | 4 | # Add new inflection rules using the following format. Inflections 5 | # are locale specific, and you may define rules for as many different 6 | # locales as you wish. All of these examples are active by default: 7 | # ActiveSupport::Inflector.inflections(:en) do |inflect| 8 | # inflect.plural /^(ox)$/i, '\1en' 9 | # inflect.singular /^(ox)en/i, '\1' 10 | # inflect.irregular 'person', 'people' 11 | # inflect.uncountable %w( fish sheep ) 12 | # end 13 | 14 | # These inflection rules are supported but not enabled by default: 15 | # ActiveSupport::Inflector.inflections(:en) do |inflect| 16 | # inflect.acronym 'RESTful' 17 | # end 18 | -------------------------------------------------------------------------------- /lib/rademade_admin/model/configuration/fields_labels.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | require 'rademade_admin/model/configuration/fields' 3 | 4 | module RademadeAdmin 5 | module Model 6 | class Configuration 7 | class FieldsLabels < Fields 8 | 9 | def label_for(name) 10 | field = find(name) 11 | if field.nil? 12 | name.to_s.humanize 13 | else 14 | field.label 15 | end 16 | end 17 | 18 | protected 19 | 20 | def field_class 21 | RademadeAdmin::Model::Configuration::FieldLabel 22 | end 23 | 24 | def _init_from_options(*options) 25 | raise "Can't init labels from options" 26 | end 27 | 28 | end 29 | end 30 | end 31 | end 32 | -------------------------------------------------------------------------------- /app/views/rademade_admin/_layouts/main.html.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | <%= render @template_service.layout_head %> 4 | 5 |
<% 6 | concat render @template_service.navigation_block 7 | %>
8 | 9 | 10 | 11 |
<%= yield %>
12 |
13 |
14 | <%= javascript_tag do %> 15 | I18n.defaultLocale = "<%= I18n.default_locale %>"; 16 | I18n.locale = "<%= I18n.locale %>"; 17 | I18n.fallbacks = true; 18 | <% end %> 19 | 20 | -------------------------------------------------------------------------------- /app/assets/stylesheets/mixins/_fonts.scss: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'HelveticaNeueCyr-Black'; 3 | src: local('Arial'); 4 | font-weight: normal; 5 | font-style: normal; 6 | } 7 | 8 | @font-face { 9 | font-family: 'HelveticaNeueCyr-Bold'; 10 | src: local('Arial'); 11 | font-weight: normal; 12 | font-style: normal; 13 | } 14 | 15 | @font-face { 16 | font-family: 'HelveticaNeueCyr-Light'; 17 | src: local('Arial'); 18 | font-weight: normal; 19 | font-style: normal; 20 | } 21 | 22 | @font-face { 23 | font-family: 'HelveticaNeueCyr-Medium'; 24 | src: local('Arial'); 25 | font-weight: normal; 26 | font-style: normal; 27 | } 28 | 29 | @font-face { 30 | font-family: 'HelveticaNeueCyr-Roman'; 31 | src: local('Arial'); 32 | font-weight: normal; 33 | font-style: normal; 34 | } 35 | 36 | -------------------------------------------------------------------------------- /lib/rademade_admin/model/adapter/query/postgresql.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | require 'rademade_admin/model/adapter/query/active_record' 3 | 4 | module RademadeAdmin 5 | module Model 6 | module Adapter 7 | class Query 8 | class Postgresql < RademadeAdmin::Model::Adapter::Query::ActiveRecord 9 | 10 | protected 11 | 12 | def build_where_condition(field: nil, value: nil) 13 | field = table_field(field) 14 | 15 | if value.is_a? Regexp 16 | ["LOWER(#{field}) ~* ?", [value.source]] 17 | elsif value.is_a? Array 18 | ["#{field} IN (?)", [value]] 19 | else 20 | ["#{field} = ?", [value]] 21 | end 22 | end 23 | end 24 | end 25 | end 26 | end 27 | end 28 | -------------------------------------------------------------------------------- /app/services/login.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin 3 | class Login 4 | 5 | def self.admin(params) 6 | params.require(:data).permit([:email, :password]) 7 | user = RademadeAdmin.configuration.admin_class.get_by_email(params[:data][:email]) 8 | 9 | error(I18n.t('rademade_admin.login.validation.email_not_found'), :email) unless user.is_a? RademadeAdmin.configuration.admin_class 10 | error(I18n.t('rademade_admin.login.validation.incorrect_password'), :password) unless user.valid_password? params[:data][:password] 11 | error(I18n.t('rademade_admin.login.validation.access_denied'), :email) unless user.admin? 12 | 13 | user 14 | end 15 | 16 | def self.error(message, field) 17 | raise Error.new(message, field) 18 | end 19 | 20 | end 21 | end 22 | -------------------------------------------------------------------------------- /lib/rademade_admin/hideable.rb: -------------------------------------------------------------------------------- 1 | module RademadeAdmin 2 | module Hideable 3 | 4 | STATUS_HIDDEN = 0 5 | STATUS_SHOWN = 1 6 | 7 | def method_missing(name, *arguments) 8 | if %w(status status=).include? name 9 | raise NotImplementedError.new "Implement '#{name}' method" 10 | end 11 | super 12 | end 13 | 14 | def shown? 15 | item_status = send(:status) 16 | if item_status.is_a? Fixnum 17 | item_status == STATUS_SHOWN 18 | else 19 | # for boolean values 20 | item_status 21 | end 22 | end 23 | 24 | def show 25 | send(:status=, STATUS_SHOWN) 26 | end 27 | 28 | def hide 29 | send(:status=, STATUS_HIDDEN) 30 | end 31 | 32 | def toggle 33 | shown? ? hide : show 34 | end 35 | 36 | end 37 | end -------------------------------------------------------------------------------- /app/controllers/rademade_admin/sessions_controller.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin 3 | class SessionsController < RademadeAdmin::AbstractController 4 | 5 | skip_before_action :require_login 6 | 7 | def login 8 | user = RademadeAdmin::Login.admin(params) 9 | session[:user_id] = user.id.to_s 10 | respond_to do |format| 11 | format.html { redirect_to :controller => 'dashboard', :action => 'index' } 12 | format.json { render :json => user } 13 | end 14 | rescue RademadeAdmin::Login::Error => e 15 | render :json => { :errors => e.field_messages }, :status => :precondition_failed 16 | end 17 | 18 | def logout 19 | session.delete(:user_id) 20 | redirect_to :controller => 'dashboard', :action => 'login' 21 | end 22 | 23 | end 24 | end 25 | -------------------------------------------------------------------------------- /app/helpers/rademade_admin/pagination_helper.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin::PaginationHelper 3 | 4 | def on_page_item(on_page, index, name = :paginate) 5 | hash_params = request.query_parameters.clone.except(:page, :layout) 6 | hash_params[name] = on_page 7 | 8 | content_tag(:span, on_page.to_s, 9 | :class => on_page_item_class(on_page, request.query_parameters[name], index), 10 | :'data-link-url' => admin_url_for(request.path_parameters.merge(hash_params)) 11 | ) 12 | end 13 | 14 | private 15 | 16 | def on_page_item_class(on_page, chosen_on_page, index) 17 | class_name = 'btn-switch-item' 18 | if (chosen_on_page.nil? && index.zero?) || on_page == chosen_on_page.to_i 19 | class_name += ' is-active' 20 | end 21 | class_name 22 | end 23 | 24 | end 25 | -------------------------------------------------------------------------------- /app/assets/stylesheets/lib/calendar/_main.sass: -------------------------------------------------------------------------------- 1 | .input-holder 2 | &.is-active 3 | .form-input 4 | position: relative 5 | z-index: 4 6 | border: 1px solid #3790D7 7 | 8 | .rademade-calendar 9 | z-index: 3 10 | 11 | .rademade-calendar 12 | position: absolute 13 | width: 100% 14 | left: 0 15 | top: 0 16 | padding-top: 41px 17 | background: #FFFFFF 18 | border: 1px solid #D8DFEA 19 | border-top: 0 20 | border-radius: 4px 21 | box-sizing: border-box 22 | &:after 23 | position: absolute 24 | content: '' 25 | top: 0 26 | right: 40% 27 | width: 1px 28 | height: 100% 29 | background-color: #E1E6EF 30 | +media-below($media-tablet) 31 | display: none 32 | .calendar-data 33 | display: block 34 | position: relative 35 | width: 100% 36 | height: 100% -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/button/_box.sass: -------------------------------------------------------------------------------- 1 | .input-holder 2 | .btn-list 3 | padding: 10px 0 0 0 4 | 5 | .btn-list 6 | padding: 20px 0 10px 0 7 | +clear 8 | 9 | .btn-box 10 | display: inline-block 11 | vertical-align: top 12 | +clear 13 | 14 | &.fll 15 | width: 70% 16 | +media-below($media-tablet) 17 | float: none 18 | width: 100% 19 | 20 | &.align-left 21 | text-align: left 22 | 23 | .btn 24 | margin: 0 20px 10px 0 25 | 26 | .btn-link 27 | margin: 8px 20px 10px 0 28 | 29 | &.align-center 30 | text-align: center 31 | 32 | .btn 33 | margin: 0 10px 34 | 35 | .btn-link 36 | margin: 8px 10px 0 10px 37 | 38 | &.align-right 39 | text-align: right 40 | 41 | .btn 42 | margin: 0 0 20px 10px 43 | .btn-link 44 | margin: 8px 0 20px 10px -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/button/main/_main.sass: -------------------------------------------------------------------------------- 1 | .btn 2 | position: relative 3 | display: inline-block 4 | padding: 0 20px 5 | height: 36px 6 | font-size: em(16) 7 | line-height: 34px 8 | vertical-align: top 9 | white-space: nowrap 10 | border-radius: 4px 11 | cursor: pointer 12 | outline: none 13 | transition: color 0.3s ease-in-out, background 0.3s ease-in-out 14 | box-sizing: border-box 15 | -webkit-appearance: none 16 | 17 | &.with-ico 18 | padding: 0 20px 0 45px 19 | 20 | &.with-br 21 | border-radius: 40px 22 | 23 | &.full-width 24 | display: block 25 | width: 100% 26 | text-align: center 27 | 28 | &.ico-add 29 | &:after 30 | position: absolute 31 | content: '' 32 | top: 50% 33 | transform: translateY(-50%) 34 | left: 16px 35 | +sprite(button_add) 36 | -------------------------------------------------------------------------------- /app/services/error_service.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin 3 | class ErrorService 4 | 5 | def error_messages_for(error) 6 | if active_record_error?(error) || mongoid_error?(error) 7 | error.record.errors 8 | elsif sequel_error?(error) 9 | error.errors 10 | else 11 | error.message 12 | end 13 | end 14 | 15 | private 16 | 17 | def active_record_error?(error) 18 | defined?(ActiveRecord::RecordInvalid) && error.is_a?(ActiveRecord::RecordInvalid) 19 | end 20 | 21 | def mongoid_error?(error) 22 | defined?(Mongoid::Errors::Validations) && error.is_a?(Mongoid::Errors::Validations) 23 | end 24 | 25 | def sequel_error?(error) 26 | defined?(Sequel::ValidationFailed) && error.is_a?(Sequel::ValidationFailed) 27 | end 28 | 29 | end 30 | end -------------------------------------------------------------------------------- /config/locales/simple_form.en.yml: -------------------------------------------------------------------------------- 1 | en: 2 | simple_form: 3 | "yes": 'Yes' 4 | "no": 'No' 5 | required: 6 | text: 'required' 7 | mark: '*' 8 | # You can uncomment the line below if you need to overwrite the whole required html. 9 | # When using html, text and mark won't be used. 10 | # html: '*' 11 | error_notification: 12 | default_message: "Please review the problems below:" 13 | # Labels and hints examples 14 | # labels: 15 | # defaults: 16 | # password: 'Password' 17 | # user: 18 | # new: 19 | # email: 'E-mail to sign in.' 20 | # edit: 21 | # email: 'E-mail.' 22 | # hints: 23 | # defaults: 24 | # username: 'User name to sign in.' 25 | # password: 'No special characters, please.' 26 | 27 | -------------------------------------------------------------------------------- /lib/rademade_admin/uploader/carrier_wave.rb: -------------------------------------------------------------------------------- 1 | # encoding: utf-8 2 | require 'rademade_admin/uploader/crop_photo' 3 | 4 | module RademadeAdmin 5 | module Uploader 6 | class CarrierWave < CarrierWave::Uploader::Base 7 | include ::LightResizer::CarrierWaveResize 8 | include ::RademadeAdmin::Uploader::CropPhoto 9 | 10 | storage :file 11 | 12 | def store_dir 13 | "uploads/#{model.class.to_s.underscore}/#{model.id}/#{mounted_as}" 14 | end 15 | 16 | def filename 17 | if original_filename == File.basename(model.send(mounted_as).to_s) 18 | super 19 | else 20 | Digest::MD5.hexdigest(super) << File.extname(super) if super 21 | end 22 | end 23 | 24 | def extension_white_list 25 | %w(jpg jpeg png gif) 26 | end 27 | 28 | end 29 | end 30 | end 31 | -------------------------------------------------------------------------------- /app/services/search/part/abstract.rb: -------------------------------------------------------------------------------- 1 | module RademadeAdmin 2 | module Search 3 | module Part 4 | class Abstract 5 | 6 | attr_reader :parts 7 | 8 | def initialize 9 | @parts = [] 10 | end 11 | 12 | def add(field, value) 13 | @parts << part_object(field, value) 14 | end 15 | 16 | def unshift(field, value) 17 | @parts.unshift(part_object(field, value)) 18 | end 19 | 20 | def sub_add(part) 21 | @parts << part 22 | end 23 | 24 | def sub_unshift(part) 25 | @parts.unshift part 26 | end 27 | 28 | protected 29 | 30 | def part_object(field, value) 31 | { 32 | :field => field, 33 | :value => value 34 | } 35 | end 36 | 37 | end 38 | end 39 | end 40 | end -------------------------------------------------------------------------------- /app/assets/stylesheets/rademade_admin.sass: -------------------------------------------------------------------------------- 1 | /* 2 | *= require jquery-fileupload/css/jquery.fileupload-ui 3 | *= require magnific-popup/dist/magnific-popup 4 | *= require jquery-ui/themes/base/core 5 | *= require jquery-ui/themes/base/slider 6 | *= require jquery-ui/themes/base/datepicker 7 | *= require uniform/dist/css/default.css 8 | *= require jcrop/css/jquery.Jcrop 9 | *= require leaflet/dist/leaflet 10 | *= require backbone-notifier/css/notifier-base 11 | *= require backbone-notifier/css/notifier-theme-clean 12 | *= require select2 13 | */ 14 | 15 | /*=== Reset ===*/ 16 | @import "base/reset" 17 | 18 | /*==== Mixins ====*/ 19 | @import "mixins/import" 20 | 21 | /*=== Variables ===*/ 22 | @import "var/import" 23 | 24 | /*=== Libraries ===*/ 25 | @import "lib/import" 26 | 27 | /*=== Base ===*/ 28 | @import "base/import" 29 | 30 | /*=== Blocks ===*/ 31 | @import "blocks/import" -------------------------------------------------------------------------------- /config/initializers/simple_form/wrappers.rb: -------------------------------------------------------------------------------- 1 | SimpleForm.setup do |config| 2 | 3 | config.wrappers :rademade, :tag => 'div', :class => 'form-box' do |form_box| 4 | form_box.use :html5 5 | form_box.use :label, :class => 'form-label' 6 | form_box.wrapper :tag => 'span', :class => 'input-holder' do |input_holder| 7 | input_holder.use :input 8 | end 9 | form_box.wrapper :tag => 'div', :class => 'form-description', :unless_blank => true do |hint| 10 | hint.use :hint, :wrap_with => { :tag => :span, :class => :'form-description-text' } 11 | end 12 | end 13 | 14 | config.wrappers :rademade_login, :tag => 'div', :class => 'input-holder' do |input_holder| 15 | input_holder.use :html5 16 | input_holder.use :placeholder 17 | input_holder.use :input, :class => 'form-input' 18 | input_holder.use :label, :class => 'form-label' 19 | end 20 | 21 | end -------------------------------------------------------------------------------- /app/assets/images/rademade_admin/ico/sortable-down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | sortable-down 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/content/_main.sass: -------------------------------------------------------------------------------- 1 | .content 2 | padding-bottom: 70px 3 | position: relative 4 | transition: transform 0.3s ease-in-out 5 | 6 | .content-data 7 | padding: 0 21px 8 | +media-below($media-desktop) 9 | padding: 55px 25px 10 | 11 | .content-data-title 12 | padding: 20px 0 13 | font-size: em(40) 14 | 15 | .content-box 16 | margin-top: 40px 17 | padding: 20px 18 | width: 100% 19 | background: $content-box-bg 20 | border: 1px solid $content-box-border 21 | border-radius: 4px 4px 0 0 22 | box-sizing: border-box 23 | 24 | .content-btn-list 25 | padding: 35px 21px 26 | background: #EAEFF8 27 | border: 1px solid #CBD6E8 28 | border-top: 0 29 | border-radius: 0 0 4px 4px 30 | .btn-link 31 | margin-top: 0 32 | line-height: 42px 33 | .btn 34 | margin-right: 20px 35 | 36 | .content-btn-box 37 | max-width: 856px 38 | -------------------------------------------------------------------------------- /app/assets/images/rademade_admin/ico/sortable-down_active.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | sortable-down_active 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/assets/stylesheets/base/_main.sass: -------------------------------------------------------------------------------- 1 | html 2 | font-size: 100% 3 | height: 100% 4 | min-height: 100% 5 | &.opened-popup 6 | overflow: hidden 7 | 8 | body 9 | height: 100% 10 | min-height: 100% 11 | background: $white 12 | font-size: em(16) 13 | line-height: 1.46 14 | color: $gray 15 | -webkit-font-smoothing: antialiased 16 | +arial 17 | 18 | .hide 19 | display: none !important 20 | 21 | .ico 22 | display: block 23 | position: absolute 24 | 25 | sup 26 | font-size: 50% 27 | line-height: 50% 28 | vertical-align: top 29 | 30 | .is-clickable 31 | cursor: pointer 32 | 33 | .is-dragging 34 | position: relative 35 | cursor: move 36 | background-color: $content-table-item-hover 37 | .draggable-btn 38 | border: 1px solid $content-table-item-shadow 39 | 40 | .draggable-btn 41 | cursor: move 42 | 43 | .jcrop-holder 44 | display: inline-block 45 | -------------------------------------------------------------------------------- /app/inputs/rademade_admin/boolean_input.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin 3 | class BooleanInput < SimpleForm::Inputs::Base 4 | 5 | def input(wrapper_options = {}) 6 | merged_input_options = merge_wrapper_options(input_html_options, wrapper_options) 7 | template.content_tag(:span, RademadeAdmin::HtmlBuffer.new([ 8 | checkbox_html(merged_input_options), 9 | template.content_tag(:i, '', :class => 'form-checkbox-ico') 10 | ]), :class => 'form-checkbox') 11 | end 12 | 13 | private 14 | 15 | def checkbox_html(input_options) 16 | @builder.check_box(attribute_name, input_options, checked_value, unchecked_value) 17 | end 18 | 19 | def checked_value 20 | options.fetch(:checked_value, '1') 21 | end 22 | 23 | def unchecked_value 24 | options.fetch(:unchecked_value, '0') 25 | end 26 | 27 | end 28 | end -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/login/form/_input.sass: -------------------------------------------------------------------------------- 1 | .login-form 2 | 3 | .input-holder 4 | float: none 5 | width: 100% 6 | position: relative 7 | margin-bottom: 15px 8 | 9 | .form-input 10 | display: block 11 | width: 100% 12 | font-size: em(15) 13 | padding: 14px 25px 14px 50px 14 | color: #fff 15 | background: $login-input-bg 16 | background: $login-input-bg-rgba 17 | border-radius: 4px 18 | border: 1px solid transparent 19 | box-sizing: border-box 20 | transition: background 0.3s ease-in-out 21 | +placeholder(#a0929b, inherit) 22 | &:focus 23 | border: 1px solid transparent 24 | background: $login-input-bg-focus 25 | 26 | 27 | 28 | input 29 | &:-webkit-autofill 30 | -webkit-box-shadow: inset 0 0 0 em(10000) $login-input-bg !important 31 | -webkit-text-fill-color: #fff !important 32 | color: #fff !important -------------------------------------------------------------------------------- /app/views/rademade_admin/_blocks/_navigation.html.erb: -------------------------------------------------------------------------------- 1 | 22 | -------------------------------------------------------------------------------- /app/services/upload/preview.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin 3 | module Upload 4 | class Preview 5 | 6 | include ActionView::Helpers::TagHelper 7 | include ActionView::Context 8 | include UriHelper 9 | 10 | def image_data(uploader) 11 | data = { 12 | :image_id => uploader.model.id.to_s, 13 | :full_url => uploader.url, 14 | :name => uploader.file.try(:filename) 15 | } 16 | data[:crop] = crop_data(uploader) if uploader.class.ancestors.include? RademadeAdmin::Uploader::CropPhoto 17 | data 18 | end 19 | 20 | def crop_data(uploader) 21 | { 22 | :url => crop_url, 23 | :original_dimensions => uploader.original_dimensions.join(',') 24 | } 25 | end 26 | 27 | protected 28 | 29 | def crop_url 30 | nil 31 | end 32 | 33 | end 34 | end 35 | end -------------------------------------------------------------------------------- /app/services/model_controller/templates.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin 3 | module Templates 4 | 5 | def native_template_folder 6 | # 15 = "RademadeAdmin::".length 7 | # 11 = "Controller".length 8 | # e.g. RademadeAdmin::QuestionAnswer::UsersController to "question_answer/users" 9 | @native_template_folder ||= self.class.to_s[15..-11].underscore 10 | end 11 | 12 | def form_template_path(real = false) 13 | abstract_template((real ? '_' : '') + 'form') 14 | end 15 | 16 | def abstract_template(template) 17 | # TODO make with rails native controller extending 18 | if template_exists?(template, @template_service.template_path(native_template_folder)) 19 | folder = native_template_folder 20 | else 21 | folder = 'abstract' 22 | end 23 | @template_service.template_path(folder, template) 24 | end 25 | 26 | end 27 | end 28 | -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/nav/_user.sass: -------------------------------------------------------------------------------- 1 | .nav-user 2 | position: relative 3 | padding: 12px 60px 4 | height: 21px 5 | background: $nav-user-bg 6 | color: $nav-user-color 7 | font-size: em(15) 8 | +to(block) 9 | +clear 10 | 11 | .user-img 12 | position: absolute 13 | top: 50% 14 | left: 16px 15 | transform: translateY(-50%) 16 | width: 40px 17 | height: 40px 18 | border-radius: 50% 19 | 20 | &:after 21 | position: absolute 22 | content: "" 23 | top: 50% 24 | left: 50% 25 | opacity: .7 26 | transform: translateY(-50%) translateX(-50%) 27 | +sprite(user-photo) 28 | 29 | .user-settings 30 | position: absolute 31 | top: 50% 32 | transform: translateY(-50%) 33 | right: 15px 34 | opacity: .5 35 | cursor: pointer 36 | transition: opacity $transitionVal ease-in-out 37 | +sprite(logout) 38 | &:hover 39 | opacity: 1 40 | -------------------------------------------------------------------------------- /app/services/sortable_service.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin 3 | class SortableService 4 | 5 | def initialize(model_info, params) 6 | @model_info = model_info 7 | @params = params 8 | end 9 | 10 | def sort_items 11 | @params[:sorted].each do |_, sorted_data| 12 | item = @model_info.query_adapter.find(sorted_data[:id]) 13 | item.position = sorted_data[:position].to_i 14 | item.save 15 | end 16 | end 17 | 18 | def can_reset? 19 | @params[:sort].present? 20 | end 21 | 22 | def sorting_direction(field) 23 | if field.order_column.to_s == @params[:sort] 24 | return :asc if @params[:direction] == 'asc' 25 | return :desc if @params[:direction] == 'desc' 26 | end 27 | nil 28 | end 29 | 30 | def has_position? 31 | @model_info.data_items.has_field? :position 32 | end 33 | 34 | end 35 | end 36 | -------------------------------------------------------------------------------- /lib/rademade_admin/model/info/uploaders.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin 3 | module Model 4 | class Info 5 | class Uploaders 6 | 7 | def initialize(data_adapter) 8 | @data_adapter = data_adapter 9 | end 10 | 11 | def all 12 | @data_adapter.uploaders 13 | end 14 | 15 | def uploader(name) 16 | @data_adapter.uploader(name) 17 | end 18 | 19 | def has_uploader?(name) 20 | !!(@data_adapter.uploader(name) || has_localized_uploader?(name)) 21 | end 22 | 23 | private 24 | 25 | def has_localized_uploader?(name) # todo mb make "send" and check return type 26 | I18n.available_locales.each do |locale| 27 | return true unless @data_adapter.uploader("#{name}_#{locale}").nil? 28 | end 29 | false 30 | end 31 | 32 | end 33 | end 34 | end 35 | end -------------------------------------------------------------------------------- /spec/dummy/config/application.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | require File.expand_path('../boot', __FILE__) 3 | 4 | require 'rails/all' 5 | require 'mongoid_sortable_relation' 6 | require 'sequel' 7 | require 'carrierwave/mount' 8 | require 'carrierwave/mongoid' 9 | require 'carrierwave/sequel' 10 | require 'carrierwave/orm/activerecord' 11 | require 'light_resizer' 12 | require 'globalize' 13 | require 'activerecord_sortable' 14 | 15 | Bundler.require(*Rails.groups) 16 | require 'rademade_admin' 17 | 18 | module Dummy 19 | class Application < Rails::Application 20 | 21 | config.assets.paths << Rails.root.join('app', 'assets', 'fonts') 22 | 23 | config.autoload_paths += Dir["#{Rails.root}/lib/**/"] 24 | 25 | config.middleware.insert_before(Rack::Sendfile, LightResizer::Middleware, Rails.root) 26 | 27 | I18n.config.available_locales = [:en, :ru] 28 | 29 | config.generators.orm :active_record 30 | 31 | end 32 | end -------------------------------------------------------------------------------- /app/views/rademade_admin/dashboard/login.html.erb: -------------------------------------------------------------------------------- 1 |
2 |
3 | 6 |
7 |
8 | <%= login_form do |f| %> 9 | <% 13 | concat f.input :email, :label => t('rademade_admin.login.email'), :placeholder => t('rademade_admin.login.email') 14 | concat f.input :password, :label => t('rademade_admin.login.password'), :placeholder => t('rademade_admin.login.password') 15 | concat f.submit t('rademade_admin.login.submit'), :class => 'btn login-btn full-width' 16 | end 17 | %>
18 |
-------------------------------------------------------------------------------- /spec/dummy/app/models/post.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | class Post 3 | include RademadeAdmin::Hideable 4 | include Mongoid::Document 5 | include Sortable 6 | 7 | belongs_to :user 8 | belongs_to :gallery 9 | belongs_to :main_post, :class_name => 'Post', :inverse_of => :other_posts 10 | has_many :other_posts, :class_name => 'Post', :inverse_of => :main_post, :sortable => true 11 | has_and_belongs_to_many :tags, :sortable => true 12 | 13 | mount_uploader :avatar, PosterUploader 14 | mount_uploader :document, FileUploader 15 | mount_uploader :video, VideoUploader 16 | 17 | field :headline, :type => String 18 | field :text, :type => String, :localize => true 19 | field :status, :type => Integer 20 | field :post_date, :type => Date 21 | field :status, :type => Mongoid::Boolean, :default => RademadeAdmin::Hideable::STATUS_SHOWN 22 | 23 | validates_presence_of :headline 24 | 25 | def to_s 26 | headline 27 | end 28 | 29 | end 30 | -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/content/_header.sass: -------------------------------------------------------------------------------- 1 | .content-header 2 | position: relative 3 | padding-left: 0 4 | background-color: $content-header-bg 5 | border-bottom: 1px solid $content-header-border 6 | box-sizing: border-box 7 | +clear 8 | 9 | +media-below($media-desktop) 10 | position: fixed 11 | z-index: 988 12 | width: 100% 13 | padding-left: 50px 14 | 15 | .close-link 16 | position: absolute 17 | display: none 18 | top: 50% 19 | right: 25px 20 | transform: translateY(-50%) 21 | opacity: .4 22 | cursor: pointer 23 | transition: opacity $transitionVal ease-in-out 24 | +sprite(close_gray) 25 | &:hover 26 | opacity: .8 27 | 28 | .content-header-link 29 | position: relative 30 | display: block 31 | padding: 12px 70px 12px 20px 32 | color: $content-header-link-color 33 | font-weight: bold 34 | font-size: em(20) 35 | line-height: 25px 36 | box-sizing: border-box 37 | +to(block) -------------------------------------------------------------------------------- /app/assets/images/rademade_admin/ico/sortable-up.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | sortable-up 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/assets/images/rademade_admin/ico/sortable-up_active.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | sortable-up_active 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/nav/_main.sass: -------------------------------------------------------------------------------- 1 | //variables 2 | $nav-width: em(270) 3 | .nav 4 | position: fixed 5 | top: 0 6 | left: 0 7 | z-index: 990 8 | width: $nav-width 9 | height: 100% 10 | background: $nav-bg 11 | background: $nav-bg-gradient 12 | transition: transform 0.3s ease-in-out 13 | 14 | +media-below($media-desktop) 15 | transform: translateX(-$nav-width) 16 | 17 | .nav-box 18 | position: absolute 19 | width: 100% 20 | bottom: 0 21 | 22 | .nav-list 23 | &.with-scroll 24 | position: relative 25 | height: 70% 26 | height: calc(100% - 147px) 27 | overflow-y: auto 28 | -webkit-overflow-scrolling: touch 29 | &::-webkit-scrollbar 30 | width: 4px 31 | background: none 32 | 33 | &::-webkit-scrollbar-track 34 | 35 | &::-webkit-scrollbar-thumb 36 | background: rgba(216,216,216,0.2) 37 | border-radius: 3px 38 | 39 | +media-below-height(420) 40 | height: 50% 41 | height: calc(100% - 147px) 42 | -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/nav/_link.sass: -------------------------------------------------------------------------------- 1 | .nav-link 2 | position: relative 3 | display: inline-block 4 | width: 100% 5 | color: $nav-link-color 6 | padding: 15px 22px 7 | font-size: em(15) 8 | line-height: 18px 9 | box-sizing: border-box 10 | 11 | span 12 | margin-right: 5px 13 | 14 | &:after 15 | position: absolute 16 | top: 0 17 | left: 0 18 | width: 4px 19 | height: 100% 20 | background-color: $nav-link-active-border 21 | 22 | &.is-active 23 | background: $nav-link-active-bg 24 | color: $nav-link-active-color 25 | font-weight: bold 26 | &:after 27 | content: '' 28 | &:before 29 | opacity: 1 30 | transform: rotate(180deg) 31 | &:hover 32 | background: $nav-link-active-bg 33 | color: $nav-link-active-color 34 | font-weight: bold 35 | 36 | &:hover 37 | background: $nav-link-hover-bg 38 | color: $nav-link-active-color 39 | font-weight: bold 40 | &:before 41 | opacity: 1 42 | -------------------------------------------------------------------------------- /app/services/csv_service.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | require 'csv' 3 | 4 | module RademadeAdmin 5 | class CsvService 6 | 7 | def initialize(model_info, items) 8 | @model_info = model_info 9 | @items = items 10 | end 11 | 12 | def to_csv 13 | ::CSV.generate(col_sep: ',', encoding: 'utf-8') do |csv| 14 | csv << column_names 15 | @items.each do |item| 16 | csv << item_data(item) 17 | end 18 | end 19 | end 20 | 21 | def column_names 22 | @model_info.data_items.csv_fields.map(&:label) 23 | end 24 | 25 | def item_data(item) 26 | data = [] 27 | @model_info.data_items.csv_fields.each do |field| 28 | data << field_value(field, item) 29 | end 30 | data 31 | end 32 | 33 | def field_value(field, item) 34 | return field.csv_preview_handler.call(item) unless field.csv_preview_handler.nil? 35 | item.send(field.csv_preview_accessor).to_s 36 | end 37 | end 38 | end 39 | -------------------------------------------------------------------------------- /app/assets/javascripts/app/select2/related/collection.coffee: -------------------------------------------------------------------------------- 1 | class @Select2Input.RelatedCollection extends Backbone.Collection 2 | 3 | comparator : 'position' 4 | 5 | initialize : () -> 6 | @on 'add', @addPosition 7 | @on 'relation-remove', @removeFromCollection 8 | 9 | addPosition : (model) -> 10 | model.set 'position', @length 11 | 12 | removeFromCollection : (model) => 13 | @remove model 14 | @_triggerChange() 15 | 16 | setSortable : (sortable) -> 17 | @sortable = sortable 18 | 19 | setDeletable : (deletable) -> 20 | @deletable = deletable 21 | 22 | isSortable : () -> 23 | @sortable 24 | 25 | isDeletable : () -> 26 | @deletable 27 | 28 | resort : () -> 29 | @sort() 30 | @_triggerChange() 31 | 32 | update : (data) -> 33 | @add new Select2Input.RelatedModel(data), merge : true 34 | @_triggerChange() 35 | 36 | getData : () -> 37 | @map (model) -> model.getData() 38 | 39 | _triggerChange : () -> 40 | @trigger 'data-change' -------------------------------------------------------------------------------- /spec/dummy/app/controllers/rademade_admin/posts_controller.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | class RademadeAdmin::PostsController < RademadeAdmin::ModelController 3 | 4 | options do 5 | parent_menu 'Mongoid' 6 | list do 7 | headline 8 | status handler: Proc.new { |post| "Status #{post.status}" } 9 | tags 10 | bool_test handler: Proc.new { true } 11 | end 12 | form do 13 | headline 14 | avatar 15 | gallery 16 | video 17 | post_date 18 | text :ckeditor 19 | user 20 | other_posts 21 | tags 22 | document 23 | status as: :select, 24 | collection: { 25 | 'Новый' => '1', 26 | 'Отклонен' => '2' 27 | }, 28 | include_blank: false 29 | end 30 | labels do 31 | headline 'Post name' 32 | status 'Status' 33 | bool_test 'Test' 34 | end 35 | csv do 36 | headline 37 | status handler: Proc.new { 'Status' } 38 | end 39 | end 40 | 41 | end 42 | -------------------------------------------------------------------------------- /lib/rademade_admin/uploader/photo.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin 3 | module Uploader 4 | module Photo 5 | 6 | def method_missing(name, *arguments) 7 | raise NotImplemented.new 'Implement "resize" error' if name == 'resize' 8 | super 9 | end 10 | 11 | def delete_other_images(image_path) 12 | filename = File.basename(image_path) 13 | 14 | store_path = full_image_path(store_dir) 15 | 16 | return unless File.exist? store_path 17 | 18 | Dir.foreach(store_path) do |item| 19 | next if item == '.' or item == '..' 20 | if File.basename(item) != filename 21 | FileUtils.rm_r(File.join(store_path, item)) 22 | end 23 | end 24 | end 25 | 26 | protected 27 | 28 | # 29 | # todo problem with other storages 30 | # 31 | def full_image_path(image_path) 32 | File.join(Rails.root, 'public', image_path) 33 | end 34 | 35 | end 36 | end 37 | end 38 | -------------------------------------------------------------------------------- /app/assets/javascripts/app/gallery/image/view.coffee: -------------------------------------------------------------------------------- 1 | class @GalleryImageView extends Backbone.View 2 | 3 | events : 4 | 'click' : 'showPopup' 5 | 'click [data-remove-url]' : 'remove' 6 | 7 | initialize : () -> 8 | @model.on 'image-removed', @_onImageRemove 9 | @model.on 'change:resizedUrl', @_updateImageUrl 10 | 11 | remove : () -> 12 | @model.remove() if confirm I18n.t('rademade_admin.remove_confirm.image') 13 | false 14 | 15 | showPopup : () -> 16 | GalleryPopup.getInstance().showForGallery @model 17 | 18 | _onImageRemove : () => 19 | fadeTime = 300 20 | @$el.fadeOut fadeTime 21 | setTimeout () => 22 | @$el.remove() 23 | , fadeTime 24 | 25 | _updateImageUrl : () => 26 | @$el.find('img').attr 'src', @model.get('resizedUrl') 27 | 28 | @init : ($el) -> 29 | model = new GalleryImageModel $el.data() 30 | model.set 'removeUrl', $el.find('[data-remove-url]').data('removeUrl') 31 | new GalleryImageView 32 | model : model 33 | el : $el 34 | model -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/nav/_btn.sass: -------------------------------------------------------------------------------- 1 | .nav-btn 2 | display: none 3 | position: fixed 4 | z-index: 989 5 | top: 0 6 | left: 0 7 | width: 50px 8 | height: 50px 9 | cursor: pointer 10 | transform: translateX(0) 11 | transition: transform 0.3s ease-in-out, background 0.3s ease-in-out, width 0.3s ease-in-out, height 0.3s ease-in-out 12 | +media-below($media-desktop) 13 | display: block 14 | 15 | .nav-btn-ico 16 | position: absolute 17 | top: 50% 18 | left: 50% 19 | transform: translateY(-50%) translateX(-50%) 20 | width: 20px 21 | height: 3px 22 | background: $gray 23 | opacity: .6 24 | transition: background 0.3s ease-in 25 | 26 | &:after, 27 | &:before 28 | position: absolute 29 | content: "" 30 | left: 0 31 | width: 20px 32 | height: 3px 33 | background: $gray 34 | transform: rotate(0deg) 35 | transition: top 0.3s ease-in-out, bottom 0.3s ease-in-out, transform 0.3s ease-in-out 36 | 37 | &:after 38 | top: -6px 39 | 40 | &:before 41 | bottom: -6px -------------------------------------------------------------------------------- /config/routes.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | RademadeAdmin::Engine.routes.draw do 3 | 4 | mount Ckeditor::Engine => '/ckeditor' 5 | 6 | root 'dashboard#index' 7 | 8 | #todo via resources :file 9 | match 'file-upload' => 'file#upload', :via => [:post, :patch] 10 | match 'file-download/:model/:id/:uploader/:column' => 'file#download', :via => [:get] 11 | match 'file-crop' => 'file#crop', :via => [:post, :patch] 12 | 13 | #todo via resources :gallery 14 | match 'gallery-upload' => 'gallery#upload', :via => [:post, :patch] 15 | match 'gallery-crop' => 'gallery#crop', :via => [:post, :patch] 16 | match 'gallery-sort' => 'gallery#sort', :via => [:post, :patch] 17 | match 'gallery-remove/:id' => 'gallery#remove', :via => [:delete] 18 | 19 | match 'status/:model/:id' => 'status#toggle', :via => [:post, :patch] 20 | 21 | post 'sessions' => 'sessions#login' 22 | get 'login' => 'dashboard#login', :as => :login 23 | 24 | resources :sessions do 25 | get 'logout', :on => :collection 26 | end 27 | 28 | end 29 | -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/button/main/colors/_other.sass: -------------------------------------------------------------------------------- 1 | =btn($btn-class,$btn-color,$btn-color-hov: none) 2 | .btn 3 | &.#{$btn-class} 4 | background: $btn-color 5 | border: 1px solid $btn-color 6 | 7 | &.with-ico 8 | &:hover 9 | color: $white 10 | background: $btn-color 11 | background-image: $btn-color-hov 12 | 13 | &:hover 14 | color: $btn-color 15 | background: none 16 | border: 1px solid $btn-color 17 | 18 | &.is-stroke 19 | color: $btn-color 20 | background: none 21 | border: 1px solid $btn-color 22 | 23 | &:hover 24 | color: $white 25 | background: $btn-color 26 | border: 1px solid $btn-color 27 | 28 | +btn(is-blue,$btn-blue-color,$btn-blue-hover-color) 29 | +btn(is-dark-red,$btn-dred-color) 30 | +btn(is-purple,$btn-purple-color) 31 | +btn(is-red,$btn-red-color) 32 | +btn(is-white,$btn-white-color) 33 | +btn(is-green,$btn-green-color) 34 | +btn(is-yellow,$btn-yellow-color) 35 | -------------------------------------------------------------------------------- /spec/features/menu_spec.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | require 'spec_helper' 3 | 4 | describe 'Menu', :type => :feature, :js => true do 5 | 6 | let(:admin) do 7 | create :admin_user, :password => '12345678' 8 | end 9 | 10 | before(:each) do 11 | # login 12 | visit rademade_admin_path 13 | 14 | fill_in 'data_email', :with => admin.email 15 | fill_in 'data_password', :with => '12345678' 16 | 17 | click_on 'Log in' 18 | find('#wrapper') 19 | end 20 | 21 | it 'should have "dashboard" item' do 22 | expect(page).to have_content 'Home' 23 | end 24 | 25 | it 'should have root models' do 26 | expect(page).to have_content 'Categories' 27 | expect(page).to have_content 'Items' 28 | expect(page).to have_content 'Colors' 29 | end 30 | 31 | it 'should show inner menu items on click' do 32 | click_on('Active record') 33 | expect(page).to have_content 'Authors' 34 | expect(page).to have_content 'Articles' 35 | expect(page).to have_content 'Rubrics' 36 | end 37 | 38 | end 39 | -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/login/form/_error.sass: -------------------------------------------------------------------------------- 1 | .login-form 2 | .input-holder 3 | &.in-error 4 | .form-input 5 | color: #F77070 6 | border: 1px solid #F77070 7 | background: $login-input-bg-focus 8 | animation: input-error .6s ease-in-out alternate 9 | +placeholder(#F77070, inherit) 10 | 11 | .form-label 12 | animation: input-error .6s ease-in-out alternate 13 | &.email 14 | background-image: asset-url('rademade_admin/ico/user_red.svg') 15 | opacity: 1 16 | 17 | &.password 18 | background-image: asset-url('rademade_admin/ico/password_red.svg') 19 | opacity: 1 20 | 21 | .error-message 22 | animation: input-error .6s ease-in-out alternate 23 | 24 | @keyframes input-error 25 | 8%, 41% 26 | transform: translateX(-10px) 27 | 25%, 58% 28 | transform: translateX(10px) 29 | 75% 30 | transform: translateX(-5px) 31 | 92% 32 | transform: translateX(5px) 33 | 0%, 100% 34 | transform: translateX(0) -------------------------------------------------------------------------------- /app/views/rademade_admin/_blocks/form/_lang_panel.html.erb: -------------------------------------------------------------------------------- 1 | <% 2 | @form_fields_with_locale.each do |form_field| 3 | %>
<% 4 | element_id_prefix = "locale-#{form_field.name}-" 5 | %><% 18 | I18n.available_locales.each do |locale| 19 | %>
<% 20 | admin_localized_field(f, form_field, @model_info, locale) 21 | %>
<% 22 | end 23 | %>
<% 24 | end %> -------------------------------------------------------------------------------- /lib/rademade_admin/model/info/relations.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin 3 | module Model 4 | class Info 5 | class Relations 6 | 7 | #@param data_adapter [RademadeAdmin::Model::Adapter::Data] 8 | # 9 | def initialize(data_adapter) 10 | @data_adapter = data_adapter 11 | end 12 | 13 | # Return array of RademadeAdmin::Model::Info::Relation 14 | # 15 | # @return [Array] 16 | # 17 | def all 18 | @data_adapter.relations 19 | end 20 | 21 | # Return status of relation availability 22 | # 23 | # @param name [String] 24 | # @return [Bool] 25 | # 26 | def exist?(name) 27 | @data_adapter.has_relation? name 28 | end 29 | 30 | # @param name [String] 31 | # @return [RademadeAdmin::Model::Info::Relation] 32 | # 33 | def relation(name) 34 | @data_adapter.relation name 35 | end 36 | 37 | end 38 | end 39 | end 40 | end -------------------------------------------------------------------------------- /lib/rademade_admin/model/info/data_item/initializer.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin 3 | module Model 4 | class Info 5 | class DataItem 6 | class Initializer 7 | 8 | def auto 9 | return from_relation if @relation 10 | return form_field if @field 11 | raise 'No relation and field given for DateItem initialization' # TODO custom exception 12 | end 13 | 14 | def from_relation 15 | build(@relation.name, @relation.foreign_key) 16 | end 17 | 18 | def form_field 19 | name = @field.name 20 | build(name, name) 21 | end 22 | 23 | def build(name, order_column) 24 | RademadeAdmin::Model::Info::DataItem.new(name, @field, @relation, order_column) 25 | end 26 | 27 | protected 28 | 29 | def initialize(field, relation) 30 | @field, @relation = field, relation 31 | end 32 | 33 | end 34 | end 35 | end 36 | end 37 | end 38 | -------------------------------------------------------------------------------- /app/assets/stylesheets/lib/calendar/date/_month.sass: -------------------------------------------------------------------------------- 1 | .rademade-calendar .calendar-date 2 | .date-month 3 | position: relative 4 | height: 43px 5 | border-bottom: 1px solid #E1E6EF 6 | .month-btn 7 | position: absolute 8 | top: 0 9 | width: 35px 10 | height: 100% 11 | cursor: pointer 12 | &:hover 13 | background-color: #E1E6EF 14 | 15 | &:after 16 | position: absolute 17 | content: "" 18 | top: 50% 19 | left: 50% 20 | transform: translateY(-50%) translateX(-50%) 21 | &.month-prev 22 | left: 0 23 | &:after 24 | @extend .svg-calendar-prev-dims 25 | @extend .svg-calendar-prev 26 | 27 | &.month-next 28 | right: 0 29 | &:after 30 | @extend .svg-calendar-next-dims 31 | @extend .svg-calendar-next 32 | 33 | .month-val 34 | display: block 35 | width: 100% 36 | font-size: 15px 37 | color: #000 38 | font-weight: bold 39 | text-align: center 40 | line-height: 43px -------------------------------------------------------------------------------- /lib/rademade_admin/input/related_select_input/model_data.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin 3 | module Input 4 | class RelatedSelectInput 5 | module ModelData 6 | 7 | protected 8 | 9 | def model 10 | @model ||= @builder.object 11 | end 12 | 13 | def related_data_item 14 | unless @related_data_item 15 | model_info = Model::Graph.instance.model_info(model.class) 16 | @related_data_item = model_info.data_items.data_item(attribute_name) 17 | end 18 | @related_data_item 19 | end 20 | 21 | def related_to 22 | related_data_item.relation.to || related_value.class 23 | end 24 | 25 | def relation_getter 26 | related_data_item.getter 27 | end 28 | 29 | def multiple? 30 | related_data_item.relation.has_many? 31 | end 32 | 33 | def related_value 34 | @related_value ||= model.send(relation_getter) 35 | end 36 | 37 | end 38 | end 39 | end 40 | end -------------------------------------------------------------------------------- /lib/rademade_admin/uploader/crop_photo.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | require 'rademade_admin/uploader/photo' 3 | 4 | module RademadeAdmin 5 | module Uploader 6 | module CropPhoto 7 | include ::RademadeAdmin::Uploader::Photo 8 | 9 | def crop_image(params, image_path = nil) 10 | crop_path = image_path ? full_image_path(image_path) : path 11 | crop(crop_path, params[:x], params[:y], params[:w], params[:h]) 12 | end 13 | 14 | def crop(image_path, x, y, width, height) 15 | image = ::Magick::Image.read(image_path).first 16 | image.crop!(x.to_i, y.to_i, width.to_i, height.to_i, true) 17 | image.write("#{Rails.root}/tmp/cache/#{x}_#{y}_#{width}_#{height}_#{/([^\/]*)$/.match(image_path)[1]}") 18 | File.open(image.filename) 19 | end 20 | 21 | def original_dimensions 22 | if file && model 23 | image = Magick::Image.ping(file.file).first 24 | [image.columns, image.rows] 25 | else 26 | [] 27 | end 28 | end 29 | 30 | end 31 | end 32 | end 33 | -------------------------------------------------------------------------------- /app/assets/javascripts/app/gallery/image/collection-view.coffee: -------------------------------------------------------------------------------- 1 | class @GalleryImageCollectionView extends Backbone.View 2 | 3 | initImages : (className) -> 4 | @images = new GalleryImageCollection() 5 | @images.setClassName(className) 6 | @$el.find('[data-image-id]').each (index, image) => 7 | @_initImage $(image) 8 | 9 | initSort : () -> 10 | sortUrl = @$el.data('sortableUrl') 11 | if sortUrl 12 | @images.setSortUrl sortUrl 13 | @$el.sortable 14 | stop : () => 15 | @images.sort @_getSortedImages() 16 | 17 | addImage : ($image) -> 18 | @_initImage $image 19 | @$el.append $image 20 | 21 | _getSortedImages : () => 22 | images = [] 23 | @$el.find('[data-image-id]').each (index, el) -> 24 | images.push $(el).data('imageId') 25 | images 26 | 27 | _initImage : ($image) -> 28 | @images.add GalleryImageView.init($image) 29 | 30 | @init : ($el, className) -> 31 | collectionView = new this 32 | el : $el 33 | collectionView.initImages className 34 | collectionView.initSort() 35 | collectionView -------------------------------------------------------------------------------- /lib/rademade_admin/model/adapter/query/active_record.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | require 'rademade_admin/model/adapter/query/sql' 3 | 4 | module RademadeAdmin 5 | module Model 6 | module Adapter 7 | class Query 8 | class ActiveRecord < RademadeAdmin::Model::Adapter::Query::Sql 9 | 10 | def find(ids) 11 | @model.find(ids) 12 | end 13 | 14 | def initial 15 | @model.unscoped 16 | end 17 | 18 | protected 19 | 20 | def order(order_conditions) 21 | order_conditions.parts.each do |part| 22 | if part.is_a? RademadeAdmin::Search::Part::Order 23 | # todo 24 | else 25 | @result = @result.order(part[:field] => part[:value]) 26 | end 27 | end 28 | @result 29 | end 30 | 31 | def paginate(page_condition, per_page_condition) 32 | @result.page(page_condition).per(per_page_condition) 33 | end 34 | 35 | end 36 | end 37 | end 38 | end 39 | end -------------------------------------------------------------------------------- /app/helpers/rademade_admin/field_type_helper.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin::FieldTypeHelper 3 | 4 | def field_type(data_item, type) 5 | if type.nil? 6 | default_field_type(data_item) 7 | else 8 | rademade_admin_type(type) 9 | end 10 | end 11 | 12 | def default_field_type(data_item) 13 | if data_item.gallery_relation? 14 | :'rademade_admin/gallery' 15 | elsif data_item.has_relation? 16 | :'rademade_admin/related_select' 17 | elsif data_item.has_uploader? 18 | :'rademade_admin/file' 19 | elsif data_item.date_field? 20 | :'rademade_admin/date' 21 | elsif data_item.date_time_field? 22 | :'rademade_admin/date_time' 23 | elsif data_item.boolean_field? 24 | rademade_admin_boolean_type 25 | else 26 | nil 27 | end 28 | end 29 | 30 | def rademade_admin_type(type) 31 | if type == :boolean 32 | rademade_admin_boolean_type 33 | else 34 | type 35 | end 36 | end 37 | 38 | def rademade_admin_boolean_type 39 | :'rademade_admin/boolean' 40 | end 41 | 42 | end -------------------------------------------------------------------------------- /app/assets/images/rademade_admin/ico/prev.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | prev 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /lib/rademade_admin/model/adapter/query/sequel.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | require 'rademade_admin/model/adapter/query/sql' 3 | 4 | module RademadeAdmin 5 | module Model 6 | module Adapter 7 | class Query 8 | class Sequel < RademadeAdmin::Model::Adapter::Query::Sql 9 | 10 | def find(ids) 11 | @model[ids] 12 | end 13 | 14 | def initial 15 | @model.dataset 16 | end 17 | 18 | protected 19 | 20 | def order(order_conditions) 21 | order_conditions.parts.each do |part| 22 | if part.is_a? RademadeAdmin::Search::Part::Order 23 | # todo 24 | else 25 | @result = @result.order_append(::Sequel.send(part[:value], part[:field].to_sym)) 26 | end 27 | end 28 | @result 29 | end 30 | 31 | def paginate(page_condition, per_page_condition) 32 | @result.paginate(page_condition, per_page_condition) 33 | end 34 | 35 | end 36 | end 37 | end 38 | end 39 | end -------------------------------------------------------------------------------- /app/assets/images/rademade_admin/ico/left-arrow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | left-arrow 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/assets/images/rademade_admin/ico/left-arrow_blue.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | left-arrow_blue 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/assets/javascripts/app/common/dnd-sort.coffee: -------------------------------------------------------------------------------- 1 | sendSorted = (dataList) -> 2 | $.ajax 3 | type : 'PATCH' 4 | url : "#{window.location.pathname}/sort" 5 | data : 6 | sorted : dataList 7 | 8 | initDnDSorting = -> 9 | $table = $('[data-sortable]') 10 | $tableRows = $table.children('tr') 11 | 12 | if isDnDSorting($table, $tableRows) 13 | minimum = $tableRows.first().data('position') 14 | $table.tableDnD 15 | dragHandle : '.draggable-btn' 16 | onDragClass : 'is-dragging' 17 | onDrop : -> 18 | resortedList = [] 19 | $table.children('tr').each (index, item) -> 20 | $item = $(item) 21 | resortedList.push 22 | id : $item.data('id') 23 | position : index + minimum 24 | sendSorted resortedList 25 | return 26 | return 27 | 28 | isDnDSorting = ($table, $tableRows) -> 29 | first = window.location.search.indexOf('sort') is -1 30 | second = $tableRows.length > 0 31 | third = $table.data('sortable') 32 | first and second and third 33 | 34 | $ -> 35 | $(document).on 'ready page:load init-plugins', initDnDSorting -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | # Load gemspec 4 | gemspec 5 | 6 | # Development gems 7 | group :development, :test do 8 | gem 'pry' 9 | end 10 | 11 | group :test do 12 | gem 'coveralls', :require => false 13 | 14 | # Uploaders 15 | gem 'carrierwave' 16 | 17 | # Mongoid 18 | gem 'mongoid' 19 | gem 'mongoid-paranoia' 20 | gem 'mongoid_rails_migrations', '1.0.0' 21 | gem 'mongoid-grid_fs' 22 | gem 'mongoid-tree' 23 | gem 'carrierwave-mongoid', :require => 'carrierwave/mongoid' 24 | gem 'mongoid_sortable_relation', '>= 0.0.9' 25 | 26 | # Sql 27 | gem 'mysql2', '~> 0.3', '< 0.4' 28 | 29 | # Active Record 30 | gem 'globalize' 31 | gem 'activerecord_sortable' 32 | 33 | # Sequel 34 | gem 'sequel' 35 | gem 'carrierwave-sequel', :require => 'carrierwave/sequel' 36 | 37 | # Testing utilities 38 | gem 'rspec', '~> 3.0' 39 | gem 'spork-rails' 40 | gem 'rspec-rails', '~> 3.0' 41 | gem 'capybara' 42 | gem 'capybara-screenshot' 43 | gem 'database_cleaner', '~> 1.3.0' 44 | gem 'capybara-webkit' 45 | gem 'factory_girl_rails', :require => false 46 | gem 'simplecov' 47 | end 48 | -------------------------------------------------------------------------------- /lib/rademade_admin/model/info/field.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin 3 | module Model 4 | class Info 5 | class Field 6 | 7 | attr_reader :name, :setter, :getter, :localizable, :relation_name 8 | 9 | def primary? 10 | @primary 11 | end 12 | 13 | def string? 14 | @type == Type::STRING 15 | end 16 | 17 | def boolean? 18 | @type == Type::BOOLEAN 19 | end 20 | 21 | def date? 22 | @type == Type::DATE 23 | end 24 | 25 | def date_time? 26 | @type == Type::DATE_TIME 27 | end 28 | 29 | def text? 30 | @type == Type::TEXT 31 | end 32 | 33 | protected 34 | 35 | def initialize(opts = {}) 36 | @name = opts[:name] 37 | @primary = opts[:primary] 38 | @setter = opts[:setter] 39 | @getter = opts[:getter] 40 | @type = opts[:type] 41 | @localizable = opts[:localizable] 42 | @relation_name = opts[:relation_name] 43 | end 44 | 45 | end 46 | end 47 | end 48 | end -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/button/switch/_main.sass: -------------------------------------------------------------------------------- 1 | .btn-switch 2 | margin-bottom: 10px 3 | padding-top: 1px 4 | color: $d-gray 5 | user-select: none 6 | +clear 7 | +media-below($media-tablet) 8 | display: none 9 | 10 | .btn-switch-text 11 | display: inline-block 12 | vertical-align: top 13 | font-size: em(15) 14 | line-height: 35px 15 | color: $bth-switch-text-color 16 | height: 35px 17 | box-sizing: border-box 18 | 19 | .btn-switch-list 20 | display: inline-block 21 | margin-left: 15px 22 | vertical-align: top 23 | +clear 24 | 25 | .btn-switch-item 26 | float: left 27 | width: 38px 28 | height: 35px 29 | font-size: em(15) 30 | line-height: 33px 31 | color: $l-gray 32 | text-align: center 33 | cursor: pointer 34 | border: 1px solid $gray 35 | border-left: 0 36 | box-sizing: border-box 37 | &.is-active 38 | color: $white 39 | background-color: $gray 40 | 41 | &:first-child 42 | border-left: 1px solid $gray 43 | border-radius: 4px 0 0 4px 44 | 45 | &:last-child 46 | border-radius: 0 4px 4px 0 47 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2012 Elia Schito 2 | 3 | MIT License 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining 6 | a copy of this software and associated documentation files (the 7 | "Software"), to deal in the Software without restriction, including 8 | without limitation the rights to use, copy, modify, merge, publish, 9 | distribute, sublicense, and/or sell copies of the Software, and to 10 | permit persons to whom the Software is furnished to do so, subject to 11 | the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be 14 | included in all copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 20 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 21 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 22 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 | -------------------------------------------------------------------------------- /spec/dummy/app/uploaders/video_uploader.rb: -------------------------------------------------------------------------------- 1 | # encoding: utf-8 2 | class VideoUploader < CarrierWave::Uploader::Base 3 | 4 | include RademadeAdmin::Uploader::Video 5 | 6 | storage :file 7 | 8 | def store_dir 9 | "uploads/video/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 10 | end 11 | 12 | def filename 13 | Digest::MD5.hexdigest(original_filename) << File.extname(original_filename) if original_filename 14 | end 15 | 16 | def content_type 17 | video_mime_type(MIME::Types.type_for(file.filename)) 18 | end 19 | 20 | def extension_white_list 21 | %w(avi mp4) 22 | end 23 | 24 | def thumb_path 25 | file_path = file.file 26 | thumb_path = File.dirname(file_path) + '/' + File.basename(file_path, '.*') + '.png' 27 | RademadeAdmin::VideoService.new(file_path).take_random_screenshot(thumb_path) unless File.exists?(thumb_path) 28 | thumb_path.gsub(/^#{Rails.public_path}/, '') 29 | end 30 | 31 | private 32 | 33 | def video_mime_type(mime_types) 34 | mime_types.each do |mime_type| 35 | return mime_type if mime_type.media_type == 'video' 36 | end 37 | nil 38 | end 39 | 40 | end -------------------------------------------------------------------------------- /app/assets/javascripts/app/common/status-toggler.coffee: -------------------------------------------------------------------------------- 1 | class @StatusToggler 2 | 3 | bindToggle : () -> 4 | $('[data-toggle-url]').click (e) => 5 | $element = $(e.currentTarget) 6 | @_toggleClass $element 7 | @_toggleStatus $element.data('toggleUrl') 8 | 9 | _toggleStatus : (statusUrl) -> 10 | unless @sending 11 | @sending = true 12 | $.ajax 13 | type : 'post' 14 | url : statusUrl 15 | dataType : 'json' 16 | success : (data) => 17 | notifier.notify data.message 18 | .always () => 19 | @sending = false 20 | 21 | _toggleClass : ($element) -> 22 | if $element.hasClass('visibility') 23 | removeClass = 'visibility' 24 | addClass = 'invisibility' 25 | else 26 | removeClass = 'invisibility' 27 | addClass = 'visibility' 28 | $element.removeClass(removeClass).addClass(addClass) 29 | 30 | @init : () -> 31 | statusToggler = new this 32 | statusToggler.bindToggle() 33 | statusToggler 34 | 35 | @initPlugin : () => 36 | @init() 37 | 38 | $ -> 39 | $(document).on 'ready page:load init-plugins', StatusToggler.initPlugin -------------------------------------------------------------------------------- /app/services/model_controller/model_options.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin 3 | module ModelOptions 4 | 5 | # Configure admin part of model 6 | # Support options 7 | # - model 8 | # - name 9 | # - parent_menu (todo extract to menu method) 10 | # - fixed_thead 11 | # - menu_count 12 | # - list 13 | # - form 14 | # - labels 15 | # 16 | def options(&options_block) 17 | configuration.instance_eval &options_block 18 | end 19 | 20 | def model_name 21 | configuration.model_name 22 | end 23 | 24 | def item_name 25 | configuration.item_name 26 | end 27 | 28 | def parent_menu_item 29 | configuration.parent_menu_item 30 | end 31 | 32 | def fixed_thead_value 33 | configuration.fixed_thead_value 34 | end 35 | 36 | def model_class 37 | configuration.model_class 38 | end 39 | 40 | def model_info 41 | @model_info ||= Model::Graph.instance.model_info(model_class) 42 | end 43 | 44 | def configuration 45 | @configuration ||= Model::Configuration.new(self) 46 | end 47 | 48 | end 49 | end 50 | -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/content/_draggable.sass: -------------------------------------------------------------------------------- 1 | .select2-items-list 2 | .select2-item 3 | &.is-draggable 4 | padding-left: 35px 5 | width: auto !important 6 | &.ui-sortable-helper 7 | overflow: hidden 8 | +to(block) 9 | 10 | .is-draggable 11 | .draggable-btn 12 | display: block 13 | 14 | .content-table-cell 15 | &:first-child 16 | padding-left: 30px 17 | 18 | .is-highlight 19 | .draggable-btn 20 | &:hover 21 | background: $content-dragable-hover-highlight 22 | 23 | .draggable-btn 24 | display: none 25 | position: absolute 26 | top: 0 27 | left: 0 28 | width: 25px 29 | height: 100% 30 | cursor: move 31 | box-sizing: border-box 32 | border: 1px solid transparent 33 | transition: background $transitionVal ease-in-out 34 | &:after 35 | position: absolute 36 | content: "" 37 | top: 50% 38 | left: 50% 39 | transform: translateX(-50%) translateY(-50%) 40 | +sprite(dragndrop) 41 | opacity: .5 42 | transition: opacity $transitionVal ease-in-out 43 | 44 | &:hover 45 | background: $content-dragable-hover 46 | &:after 47 | opacity: 1 48 | -------------------------------------------------------------------------------- /app/assets/images/rademade_admin/ico/checked.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | checked 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/assets/images/rademade_admin/ico/next.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | next 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/assets/images/rademade_admin/ico/right-arrow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | right-arrow 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | 2 | var config, gulp, path, svgSprite; 3 | 4 | gulp = require('gulp'); 5 | 6 | svgSprite = require('gulp-svg-sprite'); 7 | 8 | config = { 9 | shape: { 10 | spacing: { 11 | padding: 1, 12 | box: 'content' 13 | }, 14 | dimension : { // Dimension related options 15 | maxWidth : 2000, // Max. shape width 16 | maxHeight : 2000, // Max. shape height 17 | precision : 2, // Floating point precision 18 | attributes : false 19 | } 20 | }, 21 | mode: { 22 | css: { 23 | dest: '../assets', 24 | sprite: 'images/rademade_admin/sprite.svg', 25 | bust: false, 26 | render: { 27 | scss: { 28 | dest: 'stylesheets/mixins/_sprites.scss' 29 | } 30 | } 31 | } 32 | } 33 | }; 34 | 35 | gulp.task('sprite', function () { 36 | gulp.src('app/assets/images/rademade_admin/ico/*.svg') 37 | .pipe(svgSprite(config)) 38 | .pipe(gulp.dest('app/assets/')); 39 | }); -------------------------------------------------------------------------------- /app/assets/stylesheets/blocks/popup/_gallery.sass: -------------------------------------------------------------------------------- 1 | .popup-gallery 2 | position: relative 3 | display: block 4 | padding: 0 200px 5 | height: 100% 6 | box-sizing: border-box 7 | user-select: none 8 | 9 | .popup-gallery-list 10 | display: block 11 | height: 100% 12 | white-space: nowrap 13 | overflow: hidden 14 | 15 | .popup-gallery-item 16 | display: inline-block 17 | width: 100% 18 | height: 100% 19 | 20 | .popup-gallery-img 21 | display: inline-block 22 | max-width: 100% 23 | max-height: 100% 24 | 25 | .popup-gallery-btn 26 | position: absolute 27 | top: 0 28 | width: 125px 29 | height: 100% 30 | cursor: pointer 31 | transition: background $transitionVal ease-in-out 32 | &:hover 33 | background: rgba(216,216,216,0.05) 34 | &:after 35 | position: absolute 36 | content: "" 37 | top: 50% 38 | left: 50% 39 | &.prev 40 | left: 0 41 | &:after 42 | transform: translateY(-50%) translateX(-50%) 43 | +sprite(prev) 44 | &.next 45 | right: 0 46 | &:after 47 | left: auto 48 | right: 50% 49 | transform: translateY(-50%) 50 | +sprite(next) -------------------------------------------------------------------------------- /app/assets/images/rademade_admin/ico/right-arrow_blue.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | right-arrow_blue 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/assets/stylesheets/lib/_jcrop.sass: -------------------------------------------------------------------------------- 1 | html 2 | .jcrop-holder 3 | background: rgba(158,182,204,0.37) !important 4 | .jcrop-handle 5 | display: none !important 6 | 7 | .jcrop-vline 8 | background: none !important 9 | opacity: 1 !important 10 | &:after 11 | position: absolute 12 | content: '' 13 | top: 0 14 | left: 0 15 | width: 100% 16 | height: 100% 17 | background-color: #fff 18 | 19 | .jcrop-hline 20 | background: none !important 21 | opacity: 1 !important 22 | &:after 23 | position: absolute 24 | content: '' 25 | top: 0 26 | left: 0 27 | width: 100% 28 | height: 100% 29 | background-color: #fff 30 | 31 | 32 | div[data-jcrop-size] 33 | right: calc(-100% - 5px) !important 34 | bottom: -7px !important 35 | width: em(40) 36 | padding: 0 37 | background: rgba(0,0,0,0.2) 38 | border-radius: 5px 39 | box-sizing: border-box 40 | div 41 | font-size: em(12) 42 | color: #fff 43 | text-align: center 44 | +arial 45 | 46 | &:after 47 | position: absolute 48 | content: '' 49 | top: -10px 50 | left: -9px 51 | +sprite(jcrop) 52 | -------------------------------------------------------------------------------- /app/assets/images/rademade_admin/ico/add.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | add186 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/services/upload/image_presenter.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin 3 | module Upload 4 | class ImagePresenter 5 | 6 | attr_reader :gallery_images, :gallery_images_html 7 | 8 | def initialize(gallery_image_persistence_adapter) 9 | @gallery_image_persistence_adapter = gallery_image_persistence_adapter 10 | end 11 | 12 | def upload_gallery_images(images) 13 | @gallery_images = [] 14 | @gallery_images_html = [] 15 | images.each { |image| add_gallery_image upload_gallery_image(image) } 16 | end 17 | 18 | protected 19 | 20 | def upload_gallery_image(image) 21 | gallery_image = @gallery_image_persistence_adapter.new_record 22 | @gallery_image_persistence_adapter.save(gallery_image) 23 | gallery_image.image.store! image 24 | gallery_image 25 | end 26 | 27 | def add_gallery_image(gallery_image) 28 | @gallery_images << gallery_image 29 | @gallery_images_html << preview_service.preview_html(gallery_image.image) 30 | end 31 | 32 | def preview_service 33 | @preview_service ||= RademadeAdmin::Upload::Preview::Gallery.new 34 | end 35 | 36 | end 37 | end 38 | end -------------------------------------------------------------------------------- /app/services/search/conditions/autocomplete.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | require 'search/conditions/abstract' 3 | require 'search/where' 4 | 5 | module RademadeAdmin 6 | module Search 7 | module Conditions 8 | class Autocomplete < Abstract 9 | 10 | include RademadeAdmin::Search::Where 11 | 12 | protected 13 | 14 | def where 15 | @where_conditions = RademadeAdmin::Search::Part::Where.new(:and) 16 | regex_filter(@where_conditions, @params[:q]) 17 | append_search_params 18 | append_ids_params 19 | @where_conditions 20 | end 21 | 22 | def limit 23 | 100 24 | end 25 | 26 | private 27 | 28 | def append_search_params 29 | if @params[:search].present? 30 | @params[:search].each do |key, value| 31 | @where_conditions.add(key.to_sym, value) if @data_items.origin_fields.include? key.to_s 32 | end 33 | end 34 | end 35 | 36 | def append_ids_params 37 | if @params[:ids].present? 38 | @where_conditions.add(@data_items.primary_field.name, @params[:ids]) 39 | end 40 | end 41 | 42 | end 43 | end 44 | end 45 | end 46 | -------------------------------------------------------------------------------- /app/assets/javascripts/app/compatibility/turbolinks.coffee: -------------------------------------------------------------------------------- 1 | {defer, dispatch} = Turbolinks 2 | 3 | handleEvent = (eventName, handler) -> 4 | document.addEventListener(eventName, handler, false) 5 | 6 | translateEvent = ({from, to}) -> 7 | handler = (event) -> 8 | event = dispatch(to, target: event.target, cancelable: event.cancelable, data: event.data) 9 | event.preventDefault() if event.defaultPrevented 10 | handleEvent(from, handler) 11 | 12 | translateEvent from: "turbolinks:click", to: "page:before-change" 13 | translateEvent from: "turbolinks:request-start", to: "page:fetch" 14 | translateEvent from: "turbolinks:request-end", to: "page:receive" 15 | translateEvent from: "turbolinks:before-cache", to: "page:before-unload" 16 | translateEvent from: "turbolinks:render", to: "page:update" 17 | translateEvent from: "turbolinks:load", to: "page:change" 18 | translateEvent from: "turbolinks:load", to: "page:update" 19 | 20 | loaded = false 21 | handleEvent "DOMContentLoaded", -> 22 | defer -> 23 | loaded = true 24 | handleEvent "turbolinks:load", -> 25 | if loaded 26 | dispatch("page:load") 27 | 28 | jQuery?(document).on "ajaxSuccess", (event, xhr, settings) -> 29 | if jQuery.trim(xhr.responseText).length > 0 30 | dispatch("page:update") 31 | -------------------------------------------------------------------------------- /app/assets/stylesheets/lib/calendar/date/_day.sass: -------------------------------------------------------------------------------- 1 | $w100: 100% 2 | 3 | .rademade-calendar .calendar-date 4 | .date-day 5 | padding: 5px 10px 6 | user-select: none 7 | &:after 8 | display: table 9 | content: '' 10 | clear: both 11 | .day-val-list 12 | width: 100% 13 | &:after 14 | display: table 15 | content: '' 16 | clear: both 17 | 18 | .day-val 19 | position: relative 20 | float: left 21 | width: $w100 / 7 22 | padding-bottom: $w100 / 7 23 | color: #222834 24 | font-size: 14px 25 | border-radius: 50% 26 | cursor: pointer 27 | &.is-disabled 28 | opacity: .33 29 | &:hover 30 | cursor: default 31 | color: #222834 32 | background: none 33 | 34 | &.is-active 35 | color: #fff 36 | background-color: #F6706F 37 | &:hover 38 | color: #fff 39 | background-color: #F6706F 40 | 41 | &:hover 42 | color: #fff 43 | background-color: #8AB8D9 44 | 45 | span 46 | position: absolute 47 | top: 0 48 | left: 0 49 | top: 50% 50 | line-height: $w100 / 7 51 | width: 100% 52 | text-align: center -------------------------------------------------------------------------------- /app/views/rademade_admin/_blocks/navigation/menu/_item.html.erb: -------------------------------------------------------------------------------- 1 | <% 2 | has_sub_items = (menu_item[:sub].is_a? Array and menu_item[:sub].size > 0) 3 | uri = menu_item[:uri] 4 | if has_sub_items || uri 5 | is_active = active?(menu_item) 6 | %><% 34 | end %> -------------------------------------------------------------------------------- /lib/rademade_admin/model/adapter/query.rb: -------------------------------------------------------------------------------- 1 | # -*- encoding : utf-8 -*- 2 | module RademadeAdmin 3 | module Model 4 | module Adapter 5 | class Query 6 | 7 | def initialize(model) 8 | @model = model 9 | end 10 | 11 | # @param [RademadeAdmin::Search::Conditions::Abstract] search_conditions 12 | def exec_query(search_conditions) 13 | @result = search_conditions.base_condition(initial) 14 | return nil if @result.nil? 15 | search_conditions.conditions.each do |query_part, values| 16 | @result = self.send(query_part, *values) unless values.nil? 17 | end 18 | @result 19 | end 20 | 21 | def find(id) 22 | nil 23 | end 24 | 25 | def initial 26 | [] 27 | end 28 | 29 | protected 30 | 31 | def where(where_conditions) 32 | @result 33 | end 34 | 35 | def order(order_conditions) 36 | @result 37 | end 38 | 39 | def paginate(page_condition, per_page_condition) 40 | @result 41 | end 42 | 43 | def limit(limit_condition) 44 | @result.limit(limit_condition) 45 | end 46 | 47 | end 48 | end 49 | end 50 | end -------------------------------------------------------------------------------- /app/assets/stylesheets/base/_reset.sass: -------------------------------------------------------------------------------- 1 | /* http://meyerweb.com/eric/tools/css/reset/ 2 | v2.0 | 20110126 3 | License: none (public domain) */ 4 | 5 | html, body, div, span, applet, object, iframe, 6 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, 7 | a, abbr, acronym, address, big, cite, code, 8 | del, dfn, em, img, ins, kbd, q, s, samp, 9 | small, strike, strong, sub, sup, tt, var, 10 | b, u, i, center, 11 | dl, dt, dd, ol, ul, li, 12 | fieldset, form, label, legend, 13 | table, caption, tbody, tfoot, thead, tr, th, td, 14 | article, aside, canvas, details, embed, 15 | figure, figcaption, footer, header, hgroup, 16 | menu, nav, output, ruby, section, summary, 17 | time, mark, audio, video 18 | margin: 0 19 | padding: 0 20 | border: 0 21 | font-size: 100% 22 | font: inherit 23 | vertical-align: baseline 24 | 25 | /* HTML5 display-role reset for older browsers */ 26 | article, aside, details, figcaption, figure, 27 | footer, header, hgroup, menu, nav, section 28 | display: block 29 | 30 | body 31 | line-height: 1 32 | 33 | ol, ul 34 | list-style: none 35 | 36 | blockquote, q 37 | quotes: none 38 | 39 | blockquote:before, blockquote:after, 40 | q:before, q:after 41 | content: '' 42 | content: none 43 | 44 | table 45 | border-collapse: collapse 46 | border-spacing: 0 --------------------------------------------------------------------------------