commit f832c224aeaad931853844a50353b9134014e6d7 Author: Harry Bomrah Date: Tue Oct 14 16:59:15 2014 +0800 announcement pro with approval capabilities diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..d15019e --- /dev/null +++ b/Gemfile @@ -0,0 +1,14 @@ +source "https://rubygems.org" + +# Declare your gem's dependencies in bulletin.gemspec. +# Bundler will treat runtime dependencies like base dependencies, and +# development dependencies will be added by default to the :development group. +gemspec + +# Declare any dependencies that are still in development here instead of in +# your gemspec. These might include edge Rails or gems from your path or +# Git. Remember to move these dependencies to your gemspec before releasing +# your gem to rubygems.org. + +# To use debugger +# gem 'debugger' diff --git a/MIT-LICENSE b/MIT-LICENSE new file mode 100644 index 0000000..ea966ec --- /dev/null +++ b/MIT-LICENSE @@ -0,0 +1,20 @@ +Copyright 2014 YOURNAME + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.rdoc b/README.rdoc new file mode 100644 index 0000000..b237aa4 --- /dev/null +++ b/README.rdoc @@ -0,0 +1,3 @@ += Bulletin + +This project rocks and uses MIT-LICENSE. \ No newline at end of file diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000..ccd84f8 --- /dev/null +++ b/Rakefile @@ -0,0 +1,32 @@ +begin + require 'bundler/setup' +rescue LoadError + puts 'You must `gem install bundler` and `bundle install` to run rake tasks' +end + +require 'rdoc/task' + +RDoc::Task.new(:rdoc) do |rdoc| + rdoc.rdoc_dir = 'rdoc' + rdoc.title = 'Announcement' + rdoc.options << '--line-numbers' + rdoc.rdoc_files.include('README.rdoc') + rdoc.rdoc_files.include('lib/**/*.rb') +end + + + + +Bundler::GemHelper.install_tasks + +require 'rake/testtask' + +Rake::TestTask.new(:test) do |t| + t.libs << 'lib' + t.libs << 'test' + t.pattern = 'test/**/*_test.rb' + t.verbose = false +end + + +task default: :test diff --git a/announcement.gemspec b/announcement.gemspec new file mode 100644 index 0000000..29337cc --- /dev/null +++ b/announcement.gemspec @@ -0,0 +1,19 @@ +$:.push File.expand_path("../lib", __FILE__) + +# Maintain your gem's version: +require "announcement/version" + +# Describe your gem and declare its dependencies: +Gem::Specification.new do |s| + s.name = "announcement" + s.version = Announcement::VERSION + s.authors = ["RulingDigital"] + s.email = ["orbit@rulingcom.com"] + s.homepage = "http://www.rulingcom.com" + s.summary = "Announcements for Orbit" + s.description = "Announcements for Orbit" + s.license = "MIT" + + s.files = Dir["{app,config,db,lib}/**/*", "MIT-LICENSE", "Rakefile", "README.rdoc"] + s.test_files = Dir["test/**/*"] +end diff --git a/app/assets/images/bulletin/.keep b/app/assets/images/bulletin/.keep new file mode 100644 index 0000000..e69de29 diff --git a/app/assets/javascripts/admin/announcements.js b/app/assets/javascripts/admin/announcements.js new file mode 100644 index 0000000..dee720f --- /dev/null +++ b/app/assets/javascripts/admin/announcements.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/javascripts/bulletin/.keep b/app/assets/javascripts/bulletin/.keep new file mode 100644 index 0000000..e69de29 diff --git a/app/assets/stylesheets/admin/announcements.css b/app/assets/stylesheets/admin/announcements.css new file mode 100644 index 0000000..2c22c38 --- /dev/null +++ b/app/assets/stylesheets/admin/announcements.css @@ -0,0 +1,7 @@ +/* + Place all the styles related to the matching controller here. + They will automatically be included in application.css. +*/ +.table .expired{ + color: #BE2E2E; +} \ No newline at end of file diff --git a/app/assets/stylesheets/bulletin/.keep b/app/assets/stylesheets/bulletin/.keep new file mode 100644 index 0000000..e69de29 diff --git a/app/controllers/.keep b/app/controllers/.keep new file mode 100644 index 0000000..e69de29 diff --git a/app/controllers/admin/announcements_controller.rb b/app/controllers/admin/announcements_controller.rb new file mode 100644 index 0000000..0ef6610 --- /dev/null +++ b/app/controllers/admin/announcements_controller.rb @@ -0,0 +1,222 @@ +# encoding: utf-8 +class Admin::AnnouncementsController < OrbitAdminController + include Admin::AnnouncementsHelper + before_action ->(module_app = @app_title) { set_variables module_app } + before_action :set_bulletin, only: [:edit, :destroy] + before_action :load_access_level + + def initialize + super + @app_title = "announcement" + end + + def index + @tags = @module_app.tags + @categories = @module_app.categories.enabled + @filter_fields = filter_fields(@categories, @tags) + @table_fields = [:status, :category, :title, :start_date, :end_date, :last_modified] + + @bulletins = Bulletin.where(:is_preview.in=>[false,nil]) + .order_by(sort) + .with_categories(filters("category")) + .with_tags(filters("tag")) + .with_status(filters("status")) + + @bulletins = search_data(@bulletins,[:title]).page(params[:page]).per(10) + + if request.xhr? + render :partial => "index" + end + end + + def new + @tags = @module_app.tags + @statuses = [] + @bulletin = Bulletin.new + @bulletin.email_sentdate = Time.now + end + + def create + if !bulletin_params['bulletin_links_attributes'].nil? + bulletin_params['bulletin_links_attributes'].each do |idx,link| + bulletin_params['bulletin_links_attributes'].delete(idx.to_s) if link['url'].blank? + end + end + + bulletin = Bulletin.new(bulletin_params) + bulletin.create_user_id = current_user.id + bulletin.update_user_id = current_user.id + if user_can_approve? + bulletin.approved = true + end + bulletin.save + build_email(bulletin) + redirect_to params['referer_url'] + end + + def approve_bulletin + id = params[:id] + bulletin = Bulletin.find(id) + bulletin.approved = true + bulletin.save + redirect_to admin_announcements_path + end + + def edit + if can_edit_or_delete?(@bulletin) + @tags = @module_app.tags + @categories = @module_app.categories.enabled + @statuses = [] + @bulletin.email_sentdate = Time.now if @bulletin.email_sent == false + else + render_401 + end + end + + def update + uid = params[:id].split('-').last + bulletin = Bulletin.find_by(:uid=>uid) + bulletin_params[:tags] = bulletin_params[:tags].blank? ? [] : bulletin_params[:tags] + bulletin_params[:email_member_ids] = bulletin_params[:email_member_ids].blank? ? [] : bulletin_params[:email_member_ids] + + if !bulletin_params['bulletin_links_attributes'].nil? + bulletin_params['bulletin_links_attributes'].each do |idx,link| + bulletin_params['bulletin_links_attributes'].delete(idx.to_s) if link['url'].blank? + end + end + + bulletin.update_attributes(bulletin_params) + bulletin.save + build_email(bulletin) + redirect_to params['referer_url'] + end + + def destroy + @bulletin.destroy + redirect_to "/admin/announcements" + end + + def delete + if params[:ids] + Bulletin.any_in(:uid => params[:ids]).destroy_all + end + redirect_to "/admin/announcements" + end + + def preview + if params['preview_type'].eql?('edit') + bulletin_data = bulletin_params + org_bulletin = Bulletin.find(params['bulletin_id']) + bulletin = org_bulletin.clone + bulletin.generate_uid + bulletin.bulletin_files = [] + bulletin.bulletin_links = [] + if bulletin_data['image'].blank? + bulletin.image = org_bulletin.image + end + + if !bulletin_data['bulletin_files_attributes'].blank? + bulletin_data['bulletin_files_attributes'].each do |key, bulletin_file| + next if !bulletin_file['_destroy'].blank? + file = nil + if bulletin_file['id'].blank? + file = BulletinFile.new(bulletin_file) + file.bulletin_id = bulletin.id + file.save + else + org_file = BulletinFile.find(bulletin_file['id']) + file = org_file.clone + file.bulletin_id = bulletin.id + file.file = org_file.file + bulletin_file.delete('id') + bulletin_file.delete('_destroy') + file.update_attributes(bulletin_file) + end + + file.save + bulletin.bulletin_files << file + end + end + + if !bulletin_data['bulletin_links_attributes'].blank? + bulletin_data['bulletin_links_attributes'].each do |key, bulletin_link| + next if !bulletin_link['_destroy'].blank? + + if bulletin_link['id'].blank? + link = BulletinLink.new(bulletin_link) + link.bulletin_id = bulletin.id + else + link = BulletinLink.find(bulletin_link['id']).clone + link.bulletin_id = bulletin.id + bulletin_link.delete('id') + bulletin_link.delete('_destroy') + link.update_attributes(bulletin_link) + end + + link.save + bulletin.bulletin_links << link + end + end + + bulletin_data.delete('bulletin_files_attributes') + bulletin_data.delete('bulletin_links_attributes') + bulletin.update_attributes(bulletin_data) + else + bulletin = Bulletin.new(bulletin_params) + end + + bulletin.is_preview = true + bulletin.save + render :text=>page_for_bulletin(bulletin) + end + + def destroy_preview + bulletin = Bulletin.find_by(:uid=>params['uid']) + if bulletin.is_preview + bulletin.destroy + end + render :json=>{'destroy'=>bulletin.id.to_s} + end + + def build_email(bulletin) + if bulletin.email_sent and !bulletin.email_addresses.blank? + if bulletin.email.nil? + email = Email.new + email.save + bulletin.email_id = email.id + bulletin.save + end + + is_sent = bulletin.email.is_sent + is_sent = !params[:resend_mail].eql?("true") if !params[:resend_mail].blank? + + bulletin.email.update_attributes( + :create_user=>current_user, + :mail_sentdate=>bulletin.email_sentdate, + :module_app=>@module_app, + :mail_to=>bulletin.email_addresses, + :mail_subject=>bulletin.title, + :template=>'announcements/email', + :template_data=>{ + "host" => request.host_with_port, + "title" => bulletin.title, + "url" => page_for_bulletin(bulletin) + }, + :is_sent=>is_sent + ) + else + bulletin.email.destroy if !bulletin.email.nil? + end + end + + private + + def set_bulletin + @bulletin = Bulletin.find(params[:id]) + end + + def bulletin_params + params[:bulletin][:email_sent] = params[:bulletin][:email_sent].nil? ? 0 : params[:bulletin][:email_sent] + params.require(:bulletin).permit! + end +end diff --git a/app/controllers/announcements_controller.rb b/app/controllers/announcements_controller.rb new file mode 100644 index 0000000..ebd2ece --- /dev/null +++ b/app/controllers/announcements_controller.rb @@ -0,0 +1,109 @@ +class AnnouncementsController < ApplicationController + + def index + announcements = Bulletin.where(:is_preview.in=>[false,nil]).can_display.is_approved.order_by(:created_at=>'desc').filter_by_categories.filter_by_tags(OrbitHelper.params['tags']) + + anns = announcements.collect do |a| + statuses = a.statuses_with_classname.collect do |status| + { + "status" => status["name"], + "status-class" => "status-#{status['classname']}" + } + end + { + "title" => a.title, + "subtitle" => a.subtitle, + "statuses" => statuses, + "category" => a.category.title, + "postdate" => a.postdate, + "link_to_show" => OrbitHelper.url_to_show(a.to_param), + "img_src" => a.image.thumb.url || "http://placehold.it/100x100", + "img_description" => a.image_description, + "more" => t(:more_plus) + } + end + { + "announcements" => anns, + "extras" => { + "widget-title" =>t('announcement.announcement'), + "title-head" => t('announcement.table.title'), + "date-head" => t('announcement.table.date'), + "status-head" => t('announcement.table.status'), + "subtitle-head" => t('announcement.table.sub_title'), + "category-head" => t('announcement.table.category') + }, + "total_pages" => announcements.total_pages + } + + end + + def widget + announcements = Bulletin.where(:is_preview.in=>[false,nil]).can_display.is_approved.order_by(:created_at=>'desc').filter_by_widget_categories.filter_by_tags(OrbitHelper.widget_tags) + + anns = announcements.collect do |a| + statuses = a.statuses_with_classname.collect do |status| + { + "status" => status["name"], + "status-class" => "status-#{status['classname']}" + } + end + { + "title" => a.title, + "subtitle" => a.subtitle, + "statuses" => statuses, + "category" => a.category.title, + "postdate" => a.postdate, + "link_to_show" => OrbitHelper.widget_item_url(a.to_param), + "img_src" => a.image.thumb.url || "http://placehold.it/100x100", + "img_description" => a.image_description + } + end + { + "announcements" => anns, + "extras" => { + "more_url"=>OrbitHelper.widget_more_url, + "title-head" => t('announcement.table.title'), + "date-head" => t('announcement.table.date'), + "status-head" => t('announcement.table.status'), + "subtitle-head" => t('announcement.table.sub_title'), + "category-head" => t('announcement.table.category') + } + } + end + + def show + params = OrbitHelper.params + announcement = Bulletin.can_display.find_by(:uid=>params[:uid]) + url_to_edit = OrbitHelper.user_can_edit?(announcement) ? "/admin/announcements/#{announcement.id.to_s}/edit" : "" + + access_level = OrbitHelper.user_access_level? + + if !announcement.approved && (access_level != "manager" && access_level != "admin") + return {} + end + + tags = announcement.tags.map{|tag| { + "tag" => tag.name , + "url" => OrbitHelper.page_for_tag(tag) + } } rescue [] + files = announcement.bulletin_files.map{|file| { "file_url" => file.file.url, "file_title" => (file.title.blank? ? File.basename(file.file.path) : file.title rescue '') } } rescue [] + + links = announcement.bulletin_links.map{|link| { "link_url" => link.url, "link_title" => (link.title.blank? ? link.url : link.title) } } rescue [] + update_user = announcement.update_user.member_profile.name rescue "" + { + "tags" => tags, + "bulletin_files" => files, + "bulletin_links" => links, + "data" => { + "title" => announcement.title, + "update_user" => update_user, + "updated_at" => announcement.updated_at.strftime('%Y-%m-%d %H:%M'), + "body" =>announcement.text, + "image" => announcement.image.url + }, + "impressionist" => (announcement.is_preview ? nil : announcement), + "url_to_edit"=>url_to_edit + } + end + +end diff --git a/app/helpers/.keep b/app/helpers/.keep new file mode 100644 index 0000000..e69de29 diff --git a/app/helpers/admin/announcements_helper.rb b/app/helpers/admin/announcements_helper.rb new file mode 100644 index 0000000..cf3ace5 --- /dev/null +++ b/app/helpers/admin/announcements_helper.rb @@ -0,0 +1,47 @@ +module Admin::AnnouncementsHelper + def page_for_bulletin(bulletin) + ann_page = nil + pages = Page.where(:module=>'announcement') + + pages.each do |page| + if page.categories.count ==1 + if page.categories.include?(bulletin.category.id.to_s) + ann_page = page + end + end + break if !ann_page.nil? + end + + if ann_page.nil? + pages.each do |page| + if page.categories.include?(bulletin.category.id.to_s) + ann_page = page + end + break if !ann_page.nil? + end + end + + ann_page = pages.first if ann_page.nil? + request.protocol+(request.host_with_port+ann_page.url+'/'+bulletin.to_param).gsub('//','/') rescue "/" + end + + def load_access_level + if current_user.is_admin? + @access_level = "admin" + elsif current_user.is_manager?(@module_app) + @access_level = "manager" + end + end + + def user_can_approve? + case @access_level + when "admin" + return true + when "manager" + return true + else + return false + end + end + +end diff --git a/app/mailers/.keep b/app/mailers/.keep new file mode 100644 index 0000000..e69de29 diff --git a/app/models/.keep b/app/models/.keep new file mode 100644 index 0000000..e69de29 diff --git a/app/models/bulletin.rb b/app/models/bulletin.rb new file mode 100644 index 0000000..601146a --- /dev/null +++ b/app/models/bulletin.rb @@ -0,0 +1,75 @@ +class Bulletin + include Mongoid::Document + include Mongoid::Timestamps + + include OrbitModel::Status + include OrbitModel::Impression + # encoding: utf-8 + include OrbitTag::Taggable + include OrbitCategory::Categorizable + include Slug + + field :title, as: :slug_title, type: String, localize: true + field :subtitle, localize: true + field :text, localize: true + field :create_user_id + field :update_user_id + field :public, :type => Boolean, :default => true + field :postdate , :type => DateTime, :default => Time.now + field :deadline , :type => DateTime + field :rss2_sn + field :approved, :type => Boolean, :default => false + field :is_preview, :type => Boolean, :default => false + + field :email_id + field :email_sent, :type => Boolean, :default => false + field :email_sentdate , :type => DateTime + field :email_member_ids + field :other_mailaddress + field :image_description, localize: true + + mount_uploader :image, ImageUploader + + has_many :bulletin_links, :autosave => true, :dependent => :destroy + has_many :bulletin_files, :autosave => true, :dependent => :destroy + + accepts_nested_attributes_for :bulletin_files, :allow_destroy => true + accepts_nested_attributes_for :bulletin_links, :allow_destroy => true + + before_destroy :destroy_email + + scope :can_display, ->{where(:is_hidden=>false).any_of({:postdate.lt=>Time.now, :deadline.gt=>Time.now},{:postdate.lt=>Time.now, :deadline=>nil}).order_by([:is_top, :desc])} + scope :is_approved, ->{where(:approved => true)} + + def update_user + User.find(update_user_id) rescue nil + end + + def update_user=(user) + self.update_user_id = user.id + end + + def email_members + MemberProfile.find(self.email_member_ids) rescue [] + end + + def email_addresses + addresses = self.email_members.collect{|member| member.email} rescue [] + addresses = addresses +[self.other_mailaddress] if !self.other_mailaddress.blank? + addresses.flatten + end + + def email + mail = Email.find(self.email_id) rescue nil + end + + def expired? + (self.deadline < Time.now) rescue false + end + + def destroy_email + mail = Email.find(self.email_id) rescue nil + mail.destroy if !mail.nil? + end + +end diff --git a/app/models/bulletin_file.rb b/app/models/bulletin_file.rb new file mode 100644 index 0000000..dabe73a --- /dev/null +++ b/app/models/bulletin_file.rb @@ -0,0 +1,14 @@ +# encoding: utf-8 +class BulletinFile + + include Mongoid::Document + include Mongoid::Timestamps + + mount_uploader :file, AssetUploader + + field :description, localize: true + field :title, localize: true + + belongs_to :bulletin + +end diff --git a/app/models/bulletin_link.rb b/app/models/bulletin_link.rb new file mode 100644 index 0000000..6283857 --- /dev/null +++ b/app/models/bulletin_link.rb @@ -0,0 +1,25 @@ +# encoding: utf-8 +require 'uri' + +class BulletinLink + include Mongoid::Document + include Mongoid::Timestamps + + field :url + field :title, localize: true + + belongs_to :bulletin + + before_validation :add_http + + validates :url, :presence => true, :format => /\A(http|https):\/\/(([a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5})|((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))(:[0-9]{1,5})?(\/.*)?\Z/i + + protected + + def add_http + unless self.url[/^http:\/\//] || self.url[/^https:\/\//] + self.url = 'http://' + self.url + end + end + +end \ No newline at end of file diff --git a/app/views/.keep b/app/views/.keep new file mode 100644 index 0000000..e69de29 diff --git a/app/views/admin/announcements/_form.html.erb b/app/views/admin/announcements/_form.html.erb new file mode 100644 index 0000000..0f64704 --- /dev/null +++ b/app/views/admin/announcements/_form.html.erb @@ -0,0 +1,403 @@ +<% content_for :page_specific_css do %> + <%= stylesheet_link_tag "lib/main-forms" %> + <%= stylesheet_link_tag "lib/fileupload" %> + <%= stylesheet_link_tag "lib/main-list" %> +<% end %> +<% content_for :page_specific_javascript do %> + <%= javascript_include_tag "lib/bootstrap-fileupload" %> + <%= javascript_include_tag "lib/bootstrap-datetimepicker" %> + <%= javascript_include_tag "lib/datetimepicker/datetimepicker.js" %> + <%= javascript_include_tag "lib/file-type" %> + <%= javascript_include_tag "lib/module-area" %> +<% end %> + + +
+ + + + + + +
+ + +
+ + +
+ +
+ <%= select_category(f, @module_app) %> +
+
+ + +
+ +
+ <%= f.datetime_picker :postdate, :no_label => true %> +
+
+ +
+ +
+ <%= f.datetime_picker :deadline, :no_label => true %> +
+
+ +
+ + +
+ + +
+ +
+ + + +
+
+ +
+ <%# end %> + + +
+
+ + <%= select_tags(f, @module_app) %> +
+
+ + +
+ + +
+ +
+
+
+ <% if @bulletin.image.file %> + <%= image_tag @bulletin.image %> + <% else %> + + <% end %> +
+
+ + <%= t(:select_image) %> + <%= t(:change) %> + <%= f.file_field :image %> + + <%= t(:cancel) %> +
+ +
+
+
+
+ <% @site_in_use_locales.each do |locale| %> + <%= f.fields_for :image_description_translations do |f| %> +
+ +
+ <%= f.text_field locale, value: (@bulletin.image_description_translations[locale.to_s] rescue nil) %> +
+
+ <% end %> + <% end %> + +
+ + + +
+ + +
+ +
+ + + +
+ <%= render partial: 'admin/member_selects/email_selection_box', locals: {field: 'bulletin[email_member_ids][]', email_members: @bulletin.email_members} %> +
+
+
+
+ +
+
+ <%= "#{t("announcement.other_mailaddress")}(#{t("announcement.other_mailaddress_note")})"%> + <%= f.text_area :other_mailaddress, :class=>"span12", :cols=>"25", :rows=>"10" %> +
+
+
+ +
+
+ +
+ <%= f.datetime_picker :email_sentdate, :no_label => true %> +
+
+
+ + <% if (@bulletin.email.is_sent rescue false) %> +
+
+ +
+ +
+
+
+ <% end %> + +
+ +
+ + + + + + +
+ + <% @site_in_use_locales.each_with_index do |locale, i| %> + +
"> + + +
+ +
+ <%= f.fields_for :title_translations do |f| %> + <%= f.text_field locale, class: "input-block-level", placeholder: t(:title), value: (@bulletin.title_translations[locale] rescue nil) %> + <% end %> +
+
+ + +
+ +
+
+ <%= f.fields_for :subtitle_translations do |f| %> + <%= f.text_area locale, rows: 2, class: "input-block-level", value: (@bulletin.subtitle_translations[locale] rescue nil) %> + <% end %> +
+
+
+ + +
+ +
+
+ <%= f.fields_for :text_translations do |f| %> + <%= f.cktext_area locale, rows: 5, class: "input-block-level", :value => (@bulletin.text_translations[locale] rescue nil) %> + <% end %> +
+
+
+ +
+ + <% end %> + + +
+ +
+ + + <% if @bulletin && !@bulletin.bulletin_links.blank? %> +
+ <% @bulletin.bulletin_links.each_with_index do |bulletin_link, i| %> + <%= f.fields_for :bulletin_links, bulletin_link do |f| %> + <%= render :partial => 'form_link', :object => bulletin_link, :locals => {:f => f, :i => i} %> + <% end %> + <% end %> +
+
+ <% end %> + + +
+
+

+ <%= hidden_field_tag 'bulletin_link_field_count', @bulletin.bulletin_links.count %> + <%= t(:add) %> +

+ +
+
+ + +
+ +
+ + + <% if @bulletin && !@bulletin.bulletin_files.blank? %> +
+ <% @bulletin.bulletin_files.each_with_index do |bulletin_file, i| %> + <%= f.fields_for :bulletin_files, bulletin_file do |f| %> + <%= render :partial => 'form_file', :object => bulletin_file, :locals => {:f => f, :i => i} %> + <% end %> + <% end %> +
+
+ <% end %> + + +
+
+

+ <%= hidden_field_tag 'bulletin_file_field_count', @bulletin.bulletin_files.count %> + <%= t(:add) %> +

+ +
+
+ +
+ +
+ + +
+ <%= get_referer_url[:action] rescue "" %> + <%= f.submit t('submit'), class: 'btn btn-primary' %> + + <%= button_tag t("preview"), id: "button_for_preview", name: "commit", class: 'btn', type: :button %> + <%= link_to t('cancel'), admin_announcements_path, :class=>"btn" %> +
+ + + + + +<% content_for :page_specific_javascript do %> + +<% end %> \ No newline at end of file diff --git a/app/views/admin/announcements/_form_file.html.erb b/app/views/admin/announcements/_form_file.html.erb new file mode 100644 index 0000000..8628623 --- /dev/null +++ b/app/views/admin/announcements/_form_file.html.erb @@ -0,0 +1,55 @@ +<% if form_file.new_record? %> +
+<% else %> +
+ <% if form_file.file.blank? %> + <%= t(:no_file) %> + <% else %> + <%= link_to content_tag(:i) + form_file.file_identifier, form_file.file.url, {:class => 'file-link file-type', :target => '_blank', :title => form_file.file_identifier} %> + <% end %> +<% end %> +
+ + + + <% @site_in_use_locales.each_with_index do |locale, i| %> + <%= locale %>"> + <%= f.fields_for :title_translations do |f| %> + <%= f.text_field locale, :class => "input-medium", placeholder: t(:alternative), :value => (form_file.title_translations[locale] rescue nil) %> + <% end %> + + <% end %> + + + + <% @site_in_use_locales.each_with_index do |locale, i| %> + <%= locale %>"> + <%= f.fields_for :description_translations do |f| %> + <%= f.text_field locale, :class => "input-medium", placeholder: t(:description), :value => (form_file.description_translations[locale] rescue nil) %> + <% end %> + + <% end %> + + + <% if form_file.new_record? %> + + + + <% else %> + + <%= f.hidden_field :id %> + + <%= f.hidden_field :_destroy, :value => nil, :class => 'should_destroy' %> + + <% end %> +
+
\ No newline at end of file diff --git a/app/views/admin/announcements/_form_link.html.erb b/app/views/admin/announcements/_form_link.html.erb new file mode 100644 index 0000000..461a3fc --- /dev/null +++ b/app/views/admin/announcements/_form_link.html.erb @@ -0,0 +1,26 @@ +
+ + <%= f.text_field :url, class: "input-large", placeholder: t(:url) %> + + + <% @site_in_use_locales.each_with_index do |locale, i| %> + <%= locale %>"> + <%= f.fields_for :title_translations do |f| %> + <%= f.text_field locale, :class => "input-large", placeholder: t(:url_alt), :value => (form_link.title_translations[locale] rescue nil) %> + <% end %> + + <% end %> + + + <% if form_link.new_record? %> + + + + <% else %> + + <%= f.hidden_field :id %> + + <%= f.hidden_field :_destroy, :value => nil, :class => 'should_destroy' %> + + <% end %> +
diff --git a/app/views/admin/announcements/_index.html.erb b/app/views/admin/announcements/_index.html.erb new file mode 100644 index 0000000..57af791 --- /dev/null +++ b/app/views/admin/announcements/_index.html.erb @@ -0,0 +1,76 @@ + + + + + + <% @table_fields.each do |f| %> + <%= thead(f) %> + <% end %> + + + + <% @bulletins.each do |b| %> + + + + + + + + + + + + <% end %> + +
+ <%= b.status_for_table %> + <%= b.category.title %> + <% if b.expired? %> + <%= b.title %> <%= t(:expired) %> + <% elsif !b.approved? %> + <%= b.title %> <%= t(:pending) %> + <% else %> + <%= b.title %> + <% end %> +
+ +
+
<%= format_value b.postdate %>"><%= format_value b.deadline %><%= b.update_user.user_name %>
+
" class="footable-row-detail-inner" style="display: none;"> +
+ <%= t(:tags) %> : + <% b.tags.each do |tag| %> + <%= tag.name %> + <% end %> +
+
+ <%= t("announcement.email_to") %> : + <% b.email_members.each do |member| %> + <%= member.name %> + <% end %> + <% unless b.other_mailaddress.nil? %> + <% b.other_mailaddress.split(',').each do |mailaddress| %> + <%= mailaddress %> + <% end %> + <% end %> +
+
+
+ +<%= + content_tag :div, class: "bottomnav clearfix" do + content_tag :div, paginate(@bulletins), class: "pagination pagination-centered" + end +%> \ No newline at end of file diff --git a/app/views/admin/announcements/edit.html.erb b/app/views/admin/announcements/edit.html.erb new file mode 100644 index 0000000..bf61125 --- /dev/null +++ b/app/views/admin/announcements/edit.html.erb @@ -0,0 +1,5 @@ +<%= form_for @bulletin, url: admin_announcement_path(@bulletin), html: {class: "form-horizontal main-forms previewable"} do |f| %> +
+ <%= render :partial => 'form', locals: {f: f} %> +
+<% end %> \ No newline at end of file diff --git a/app/views/admin/announcements/index.html.erb b/app/views/admin/announcements/index.html.erb new file mode 100644 index 0000000..1ad9a26 --- /dev/null +++ b/app/views/admin/announcements/index.html.erb @@ -0,0 +1,6 @@ +<%= render_filter @filter_fields, "index_table" %> + + <%= render 'index'%> + + +<%= render 'layouts/delete_modal', delete_options: @delete_options %> \ No newline at end of file diff --git a/app/views/admin/announcements/new.html.erb b/app/views/admin/announcements/new.html.erb new file mode 100644 index 0000000..9ecaab7 --- /dev/null +++ b/app/views/admin/announcements/new.html.erb @@ -0,0 +1,5 @@ +<%= form_for @bulletin, url: admin_announcements_path, html: {class: "form-horizontal main-forms previewable"} do |f| %> +
+ <%= render :partial => 'form', locals: {f: f} %> +
+<% end %> \ No newline at end of file diff --git a/app/views/announcements/email.html.erb b/app/views/announcements/email.html.erb new file mode 100644 index 0000000..8483d1d --- /dev/null +++ b/app/views/announcements/email.html.erb @@ -0,0 +1,19 @@ + + + + + + +
+ + <%= t('announcement.mail_hi') %>

+ <%= t('announcement.mail_url_view') %>

+ " target="_blank"> <%= @data["title"] %>

+ + --
+ <%= t('announcement.mail_source') %> :" target="_blank"> <%= Site.first.title %>
+ <%= t('announcement.mail_time') %> <%= DateTime.now %> +
+ + + \ No newline at end of file diff --git a/app/views/announcements/index.html.erb b/app/views/announcements/index.html.erb new file mode 100644 index 0000000..648b75c --- /dev/null +++ b/app/views/announcements/index.html.erb @@ -0,0 +1 @@ +<%= render_view %> \ No newline at end of file diff --git a/app/views/announcements/show.html.erb b/app/views/announcements/show.html.erb new file mode 100644 index 0000000..648b75c --- /dev/null +++ b/app/views/announcements/show.html.erb @@ -0,0 +1 @@ +<%= render_view %> \ No newline at end of file diff --git a/bin/rails b/bin/rails new file mode 100755 index 0000000..08ba0ad --- /dev/null +++ b/bin/rails @@ -0,0 +1,18 @@ +#!/usr/bin/env ruby +# This command will automatically be run when you run "rails" with Rails 4 gems installed from the root of your application. + +ENGINE_ROOT = File.expand_path('../..', __FILE__) +ENGINE_PATH = File.expand_path('../../lib/announcement/engine', __FILE__) + +# Set up gems listed in the Gemfile. +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) +require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE']) + +# require 'rails/all' +# require 'rails/engine/commands' +require "action_controller/railtie" +require "action_mailer/railtie" +require "sprockets/railtie" +require "rails/test_unit/railtie" +require 'rails/engine/commands' +require "mongoid/railtie" diff --git a/config/locales/en.yml b/config/locales/en.yml new file mode 100644 index 0000000..ab5c5ba --- /dev/null +++ b/config/locales/en.yml @@ -0,0 +1,58 @@ +en: + + announcement: + table: + title : Title + date : Date + status : Status + sub_title: Sub Title + category: Category + add_new: Add New + approve: Approve + all_articles: All Articles + announcement: Announcement + approval_setting: Approval Setting + approve_bulletin_fail: Approval Fail + approve_bulletin_success: Approve Successfully + bulletins: Bulletins + categories: Categories + create_bulletin_success: Create Bulletin Successfully + create_bulletin_category_success: Create Category Successfully + date: Announcement Date + default_widget: + bulletin_category_with_title: Bulletin Category with Title + postdate: Post Date + subtitle: Subtitle + title: Title + editing_announcement: Edit Announcement + editing_announcement_category: Edit Category + file: Attachment + file_description: File Description + file_name: File Name + frontend: + bulletins: Announcement front-end + search_result: Search result + link_name: Link Name + new_bulletin_category: New Bulletin Category + picture: Cover Picture + search: Search + selected_file: Select File + update_bulletin_category_success: Update Category Successfully + url: URL + widget: + bulletins_and_web_links: Differential Nav. + index: Index + search: Search + email_reminder: Email Reminder + activate_email_reminder: Activate Email Reminder + email_sentdate: Email Time + email_to: Email To + mail_subject: this is an announcement reminder from【%{site_title}】 + other_mailaddress: Other Email + other_mailaddress_note: Divide different email accounts with "," + mail_hi: Hi + mail_url_view: This email is the reminder of an announcement, please click the link for the details + mail_source: Source + mail_time: Time + image_upload_size_note: The following recommendations %{image_upload_size} upload size + resend_mail: Re-send Email \ No newline at end of file diff --git a/config/locales/zh_tw.yml b/config/locales/zh_tw.yml new file mode 100644 index 0000000..261d1ab --- /dev/null +++ b/config/locales/zh_tw.yml @@ -0,0 +1,61 @@ +zh_tw: + + announcement: + table: + title : 標題 + date : 張貼日期 + status : 標籤 + sub_title: 副標題 + category: 類別 + add_new: 新建 + approve: 通過 + all_articles: 文章列表 + announcement: 公告 + approval_setting: 審核設定 + approve_bulletin_fail: 審核失敗 + approve_bulletin_success: 審核成功 + bulletins: 公告 + categories: 類別 + create_bulletin_success: 建立公告成功 + create_bulletin_category_success: 建立類別成功 + date: 起迄日期 + default_widget: + bulletin_category_with_title: 公告類別及標題 + postdate: 張貼日期 + subtitle: 副標題 + title: 標題 + editing_announcement: 編輯類別 + editing_announcement_category: 編輯類別 + error: + no_avilb_cate_for_posting: 沒有可以張貼的類別 + file: 附加檔案 + file_description: 檔案描述 + file_name: 檔案名稱 + frontend: + bulletins: 公告前台 + search_result: 搜尋結果頁 + link_name: 連結名稱 + new_bulletin_category: 新增公告類別 + picture: 刊頭圖片 + search: 搜尋 + selected_file: 選擇檔案 + update_bulletin_category_success: 更新類別成功 + url: 連結位置 + widget: + bulletins_and_web_links: 分眾頁籤 + index: 索引 + search: 搜尋 + more: 更多+ + email_reminder: 寄送提醒 + activate_email_reminder: 開啟寄送提醒 + email_sentdate: 寄送時間 + email_to: 寄送對象 + other_mailaddress: 其他Mail + other_mailaddress_note: 輸入多組mail時,請用","逗號隔開 + mail_subject: 來自【%{site_title}】的公告事件提醒 + mail_hi: 您好 + mail_url_view: 此封信件為公告事件提醒,請點選以下連結詳細觀看 + mail_source: 來源 + mail_time: 時間 + image_upload_size_note: 建議檔案小於%{image_upload_size} + resend_mail: 重新寄送提醒 diff --git a/config/routes.rb b/config/routes.rb new file mode 100644 index 0000000..319d041 --- /dev/null +++ b/config/routes.rb @@ -0,0 +1,20 @@ +Rails.application.routes.draw do + + locales = Site.first.in_use_locales rescue I18n.available_locales + + scope "(:locale)", locale: Regexp.new(locales.join("|")) do + namespace :admin do + post 'announcement/preview', to: 'announcements#preview' + get 'announcement/destroy_preview/:slug_title-:uid', to: 'announcements#destroy_preview' + get 'announcement/approve_bulletin', to: 'announcements#approve_bulletin' + resources :announcements + end + + resources :announcements do + collection do + get ':slug_title-:uid', to: 'announcements#show', as: :display + end + end + end + +end diff --git a/lib/announcement.rb b/lib/announcement.rb new file mode 100644 index 0000000..1feec47 --- /dev/null +++ b/lib/announcement.rb @@ -0,0 +1,4 @@ +require "announcement/engine" + +module Announcement +end diff --git a/lib/announcement/engine.rb b/lib/announcement/engine.rb new file mode 100644 index 0000000..174c9ad --- /dev/null +++ b/lib/announcement/engine.rb @@ -0,0 +1,50 @@ +module Announcement + class Engine < ::Rails::Engine + initializer "announcement" do + OrbitApp.registration "Announcement", :type => "ModuleApp" do + module_label "announcement.announcement" + base_url File.expand_path File.dirname(__FILE__) + widget_methods ["widget"] + widget_settings [{"data_count"=>10}] + taggable "Bulletin" + categorizable + authorizable + frontend_enabled + data_count 1..10 + + side_bar do + head_label_i18n 'announcement.announcement', icon_class: "icons-megaphone" + available_for "users" + active_for_controllers (['admin/announcements']) + head_link_path "admin_announcements_path" + + context_link 'announcement.all_articles', + :link_path=>"admin_announcements_path" , + :priority=>1, + :active_for_action=>{'admin/announcements'=>'index'}, + :available_for => 'users' + context_link 'new_', + :link_path=>"new_admin_announcement_path" , + :priority=>2, + :active_for_action=>{'admin/announcements'=>'new'}, + :available_for => 'sub_managers' + context_link 'categories', + :link_path=>"admin_module_app_categories_path" , + :link_arg=>"{:module_app_id=>ModuleApp.find_by(:key=>'announcement').id}", + :priority=>3, + :active_for_action=>{'admin/announcements'=>'categories'}, + :active_for_category => 'Announcement', + :available_for => 'managers' + context_link 'tags', + :link_path=>"admin_module_app_tags_path" , + :link_arg=>"{:module_app_id=>ModuleApp.find_by(:key=>'announcement').id}", + :priority=>4, + :active_for_action=>{'admin/announcements'=>'tags'}, + :active_for_tag => 'Announcement', + :available_for => 'managers' + end + + end + end + end +end \ No newline at end of file diff --git a/lib/announcement/version.rb b/lib/announcement/version.rb new file mode 100644 index 0000000..1b52275 --- /dev/null +++ b/lib/announcement/version.rb @@ -0,0 +1,3 @@ +module Announcement + VERSION = "0.0.1" +end diff --git a/lib/tasks/bulletin_tasks.rake b/lib/tasks/bulletin_tasks.rake new file mode 100644 index 0000000..cfe4f33 --- /dev/null +++ b/lib/tasks/bulletin_tasks.rake @@ -0,0 +1,4 @@ +# desc "Explaining what the task does" +# task :bulletin do +# # Task goes here +# end diff --git a/test/bulletin_test.rb b/test/bulletin_test.rb new file mode 100644 index 0000000..10cd840 --- /dev/null +++ b/test/bulletin_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class BulletinTest < ActiveSupport::TestCase + test "truth" do + assert_kind_of Module, Bulletin + end +end diff --git a/test/controllers/admin/announcements_controller_test.rb b/test/controllers/admin/announcements_controller_test.rb new file mode 100644 index 0000000..1bacec2 --- /dev/null +++ b/test/controllers/admin/announcements_controller_test.rb @@ -0,0 +1,14 @@ +require 'test_helper' + +class Admin::AnnouncementsControllerTest < ActionController::TestCase + test "should get new" do + get :new + assert_response :success + end + + test "should get create" do + get :create + assert_response :success + end + +end diff --git a/test/dummy/README.rdoc b/test/dummy/README.rdoc new file mode 100644 index 0000000..dd4e97e --- /dev/null +++ b/test/dummy/README.rdoc @@ -0,0 +1,28 @@ +== README + +This README would normally document whatever steps are necessary to get the +application up and running. + +Things you may want to cover: + +* Ruby version + +* System dependencies + +* Configuration + +* Database creation + +* Database initialization + +* How to run the test suite + +* Services (job queues, cache servers, search engines, etc.) + +* Deployment instructions + +* ... + + +Please feel free to use a different markup language if you do not plan to run +rake doc:app. diff --git a/test/dummy/Rakefile b/test/dummy/Rakefile new file mode 100644 index 0000000..ba6b733 --- /dev/null +++ b/test/dummy/Rakefile @@ -0,0 +1,6 @@ +# Add your own tasks in files placed in lib/tasks ending in .rake, +# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. + +require File.expand_path('../config/application', __FILE__) + +Rails.application.load_tasks diff --git a/test/dummy/app/assets/images/.keep b/test/dummy/app/assets/images/.keep new file mode 100644 index 0000000..e69de29 diff --git a/test/dummy/app/assets/javascripts/application.js b/test/dummy/app/assets/javascripts/application.js new file mode 100644 index 0000000..5bc2e1c --- /dev/null +++ b/test/dummy/app/assets/javascripts/application.js @@ -0,0 +1,13 @@ +// This is a manifest file that'll be compiled into application.js, which will include all the files +// listed below. +// +// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts, +// or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path. +// +// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the +// compiled file. +// +// Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details +// about supported directives. +// +//= require_tree . diff --git a/test/dummy/app/assets/stylesheets/application.css b/test/dummy/app/assets/stylesheets/application.css new file mode 100644 index 0000000..a443db3 --- /dev/null +++ b/test/dummy/app/assets/stylesheets/application.css @@ -0,0 +1,15 @@ +/* + * This is a manifest file that'll be compiled into application.css, which will include all the files + * listed below. + * + * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets, + * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path. + * + * You're free to add application-wide styles to this file and they'll appear at the bottom of the + * compiled file so the styles you add here take precedence over styles defined in any styles + * defined in the other CSS/SCSS files in this directory. It is generally better to create a new + * file per style scope. + * + *= require_tree . + *= require_self + */ diff --git a/test/dummy/app/controllers/application_controller.rb b/test/dummy/app/controllers/application_controller.rb new file mode 100644 index 0000000..d83690e --- /dev/null +++ b/test/dummy/app/controllers/application_controller.rb @@ -0,0 +1,5 @@ +class ApplicationController < ActionController::Base + # Prevent CSRF attacks by raising an exception. + # For APIs, you may want to use :null_session instead. + protect_from_forgery with: :exception +end diff --git a/test/dummy/app/controllers/concerns/.keep b/test/dummy/app/controllers/concerns/.keep new file mode 100644 index 0000000..e69de29 diff --git a/test/dummy/app/helpers/application_helper.rb b/test/dummy/app/helpers/application_helper.rb new file mode 100644 index 0000000..de6be79 --- /dev/null +++ b/test/dummy/app/helpers/application_helper.rb @@ -0,0 +1,2 @@ +module ApplicationHelper +end diff --git a/test/dummy/app/mailers/.keep b/test/dummy/app/mailers/.keep new file mode 100644 index 0000000..e69de29 diff --git a/test/dummy/app/models/.keep b/test/dummy/app/models/.keep new file mode 100644 index 0000000..e69de29 diff --git a/test/dummy/app/models/concerns/.keep b/test/dummy/app/models/concerns/.keep new file mode 100644 index 0000000..e69de29 diff --git a/test/dummy/app/views/layouts/application.html.erb b/test/dummy/app/views/layouts/application.html.erb new file mode 100644 index 0000000..593a778 --- /dev/null +++ b/test/dummy/app/views/layouts/application.html.erb @@ -0,0 +1,14 @@ + + + + Dummy + <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %> + <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %> + <%= csrf_meta_tags %> + + + +<%= yield %> + + + diff --git a/test/dummy/bin/bundle b/test/dummy/bin/bundle new file mode 100755 index 0000000..66e9889 --- /dev/null +++ b/test/dummy/bin/bundle @@ -0,0 +1,3 @@ +#!/usr/bin/env ruby +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) +load Gem.bin_path('bundler', 'bundle') diff --git a/test/dummy/bin/rails b/test/dummy/bin/rails new file mode 100755 index 0000000..728cd85 --- /dev/null +++ b/test/dummy/bin/rails @@ -0,0 +1,4 @@ +#!/usr/bin/env ruby +APP_PATH = File.expand_path('../../config/application', __FILE__) +require_relative '../config/boot' +require 'rails/commands' diff --git a/test/dummy/bin/rake b/test/dummy/bin/rake new file mode 100755 index 0000000..1724048 --- /dev/null +++ b/test/dummy/bin/rake @@ -0,0 +1,4 @@ +#!/usr/bin/env ruby +require_relative '../config/boot' +require 'rake' +Rake.application.run diff --git a/test/dummy/config.ru b/test/dummy/config.ru new file mode 100644 index 0000000..5bc2a61 --- /dev/null +++ b/test/dummy/config.ru @@ -0,0 +1,4 @@ +# This file is used by Rack-based servers to start the application. + +require ::File.expand_path('../config/environment', __FILE__) +run Rails.application diff --git a/test/dummy/config/application.rb b/test/dummy/config/application.rb new file mode 100644 index 0000000..091c8f5 --- /dev/null +++ b/test/dummy/config/application.rb @@ -0,0 +1,29 @@ +require File.expand_path('../boot', __FILE__) + +# Pick the frameworks you want: +# require "active_record/railtie" +require "action_controller/railtie" +require "action_mailer/railtie" +require "action_view/railtie" +require "sprockets/railtie" +require "rails/test_unit/railtie" + +Bundler.require(*Rails.groups) +require "bulletin" + +module Dummy + class Application < Rails::Application + # Settings in config/environments/* take precedence over those specified here. + # Application configuration should go into files in config/initializers + # -- all .rb files in that directory are automatically loaded. + + # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. + # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. + # config.time_zone = 'Central Time (US & Canada)' + + # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. + # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] + # config.i18n.default_locale = :de + end +end + diff --git a/test/dummy/config/boot.rb b/test/dummy/config/boot.rb new file mode 100644 index 0000000..6266cfc --- /dev/null +++ b/test/dummy/config/boot.rb @@ -0,0 +1,5 @@ +# Set up gems listed in the Gemfile. +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../../../Gemfile', __FILE__) + +require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE']) +$LOAD_PATH.unshift File.expand_path('../../../../lib', __FILE__) diff --git a/test/dummy/config/environment.rb b/test/dummy/config/environment.rb new file mode 100644 index 0000000..ee8d90d --- /dev/null +++ b/test/dummy/config/environment.rb @@ -0,0 +1,5 @@ +# Load the Rails application. +require File.expand_path('../application', __FILE__) + +# Initialize the Rails application. +Rails.application.initialize! diff --git a/test/dummy/config/environments/development.rb b/test/dummy/config/environments/development.rb new file mode 100644 index 0000000..a384d95 --- /dev/null +++ b/test/dummy/config/environments/development.rb @@ -0,0 +1,34 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # In the development environment your application's code is reloaded on + # every request. This slows down response time but is perfect for development + # since you don't have to restart the web server when you make code changes. + config.cache_classes = false + + # Do not eager load code on boot. + config.eager_load = false + + # Show full error reports and disable caching. + config.consider_all_requests_local = true + config.action_controller.perform_caching = false + + # Don't care if the mailer can't send. + config.action_mailer.raise_delivery_errors = false + + # Print deprecation notices to the Rails logger. + config.active_support.deprecation = :log + + # Debug mode disables concatenation and preprocessing of assets. + # This option may cause significant delays in view rendering with a large + # number of complex assets. + config.assets.debug = true + + # Adds additional error checking when serving assets at runtime. + # Checks for improperly declared sprockets dependencies. + # Raises helpful error messages. + config.assets.raise_runtime_errors = true + + # Raises error for missing translations + # config.action_view.raise_on_missing_translations = true +end diff --git a/test/dummy/config/environments/production.rb b/test/dummy/config/environments/production.rb new file mode 100644 index 0000000..4f67ce3 --- /dev/null +++ b/test/dummy/config/environments/production.rb @@ -0,0 +1,80 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # Code is not reloaded between requests. + config.cache_classes = true + + # Eager load code on boot. This eager loads most of Rails and + # your application in memory, allowing both threaded web servers + # and those relying on copy on write to perform better. + # Rake tasks automatically ignore this option for performance. + config.eager_load = true + + # Full error reports are disabled and caching is turned on. + config.consider_all_requests_local = false + config.action_controller.perform_caching = true + + # Enable Rack::Cache to put a simple HTTP cache in front of your application + # Add `rack-cache` to your Gemfile before enabling this. + # For large-scale production use, consider using a caching reverse proxy like nginx, varnish or squid. + # config.action_dispatch.rack_cache = true + + # Disable Rails's static asset server (Apache or nginx will already do this). + config.serve_static_assets = false + + # Compress JavaScripts and CSS. + config.assets.js_compressor = :uglifier + # config.assets.css_compressor = :sass + + # Do not fallback to assets pipeline if a precompiled asset is missed. + config.assets.compile = false + + # Generate digests for assets URLs. + config.assets.digest = true + + # Version of your assets, change this if you want to expire all your assets. + config.assets.version = '1.0' + + # Specifies the header that your server uses for sending files. + # config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache + # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx + + # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. + # config.force_ssl = true + + # Set to :debug to see everything in the log. + config.log_level = :info + + # Prepend all log lines with the following tags. + # config.log_tags = [ :subdomain, :uuid ] + + # Use a different logger for distributed setups. + # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new) + + # Use a different cache store in production. + # config.cache_store = :mem_cache_store + + # Enable serving of images, stylesheets, and JavaScripts from an asset server. + # config.action_controller.asset_host = "http://assets.example.com" + + # Precompile additional assets. + # application.js, application.css, and all non-JS/CSS in app/assets folder are already added. + # config.assets.precompile += %w( search.js ) + + # Ignore bad email addresses and do not raise email delivery errors. + # Set this to true and configure the email server for immediate delivery to raise delivery errors. + # config.action_mailer.raise_delivery_errors = false + + # Enable locale fallbacks for I18n (makes lookups for any locale fall back to + # the I18n.default_locale when a translation cannot be found). + config.i18n.fallbacks = true + + # Send deprecation notices to registered listeners. + config.active_support.deprecation = :notify + + # Disable automatic flushing of the log to improve performance. + # config.autoflush_log = false + + # Use default logging formatter so that PID and timestamp are not suppressed. + config.log_formatter = ::Logger::Formatter.new +end diff --git a/test/dummy/config/environments/test.rb b/test/dummy/config/environments/test.rb new file mode 100644 index 0000000..053f5b6 --- /dev/null +++ b/test/dummy/config/environments/test.rb @@ -0,0 +1,39 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # The test environment is used exclusively to run your application's + # test suite. You never need to work with it otherwise. Remember that + # your test database is "scratch space" for the test suite and is wiped + # and recreated between test runs. Don't rely on the data there! + config.cache_classes = true + + # Do not eager load code on boot. This avoids loading your whole application + # just for the purpose of running a single test. If you are using a tool that + # preloads Rails for running tests, you may have to set it to true. + config.eager_load = false + + # Configure static asset server for tests with Cache-Control for performance. + config.serve_static_assets = true + config.static_cache_control = 'public, max-age=3600' + + # Show full error reports and disable caching. + config.consider_all_requests_local = true + config.action_controller.perform_caching = false + + # Raise exceptions instead of rendering exception templates. + config.action_dispatch.show_exceptions = false + + # Disable request forgery protection in test environment. + config.action_controller.allow_forgery_protection = false + + # Tell Action Mailer not to deliver emails to the real world. + # The :test delivery method accumulates sent emails in the + # ActionMailer::Base.deliveries array. + config.action_mailer.delivery_method = :test + + # Print deprecation notices to the stderr. + config.active_support.deprecation = :stderr + + # Raises error for missing translations + # config.action_view.raise_on_missing_translations = true +end diff --git a/test/dummy/config/initializers/backtrace_silencers.rb b/test/dummy/config/initializers/backtrace_silencers.rb new file mode 100644 index 0000000..59385cd --- /dev/null +++ b/test/dummy/config/initializers/backtrace_silencers.rb @@ -0,0 +1,7 @@ +# Be sure to restart your server when you modify this file. + +# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. +# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } + +# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. +# Rails.backtrace_cleaner.remove_silencers! diff --git a/test/dummy/config/initializers/cookies_serializer.rb b/test/dummy/config/initializers/cookies_serializer.rb new file mode 100644 index 0000000..7a06a89 --- /dev/null +++ b/test/dummy/config/initializers/cookies_serializer.rb @@ -0,0 +1,3 @@ +# Be sure to restart your server when you modify this file. + +Rails.application.config.action_dispatch.cookies_serializer = :json \ No newline at end of file diff --git a/test/dummy/config/initializers/filter_parameter_logging.rb b/test/dummy/config/initializers/filter_parameter_logging.rb new file mode 100644 index 0000000..4a994e1 --- /dev/null +++ b/test/dummy/config/initializers/filter_parameter_logging.rb @@ -0,0 +1,4 @@ +# Be sure to restart your server when you modify this file. + +# Configure sensitive parameters which will be filtered from the log file. +Rails.application.config.filter_parameters += [:password] diff --git a/test/dummy/config/initializers/inflections.rb b/test/dummy/config/initializers/inflections.rb new file mode 100644 index 0000000..ac033bf --- /dev/null +++ b/test/dummy/config/initializers/inflections.rb @@ -0,0 +1,16 @@ +# Be sure to restart your server when you modify this file. + +# Add new inflection rules using the following format. Inflections +# are locale specific, and you may define rules for as many different +# locales as you wish. All of these examples are active by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.plural /^(ox)$/i, '\1en' +# inflect.singular /^(ox)en/i, '\1' +# inflect.irregular 'person', 'people' +# inflect.uncountable %w( fish sheep ) +# end + +# These inflection rules are supported but not enabled by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.acronym 'RESTful' +# end diff --git a/test/dummy/config/initializers/mime_types.rb b/test/dummy/config/initializers/mime_types.rb new file mode 100644 index 0000000..72aca7e --- /dev/null +++ b/test/dummy/config/initializers/mime_types.rb @@ -0,0 +1,5 @@ +# Be sure to restart your server when you modify this file. + +# Add new mime types for use in respond_to blocks: +# Mime::Type.register "text/richtext", :rtf +# Mime::Type.register_alias "text/html", :iphone diff --git a/test/dummy/config/initializers/session_store.rb b/test/dummy/config/initializers/session_store.rb new file mode 100644 index 0000000..e766b67 --- /dev/null +++ b/test/dummy/config/initializers/session_store.rb @@ -0,0 +1,3 @@ +# Be sure to restart your server when you modify this file. + +Rails.application.config.session_store :cookie_store, key: '_dummy_session' diff --git a/test/dummy/config/initializers/wrap_parameters.rb b/test/dummy/config/initializers/wrap_parameters.rb new file mode 100644 index 0000000..b81ea74 --- /dev/null +++ b/test/dummy/config/initializers/wrap_parameters.rb @@ -0,0 +1,9 @@ +# Be sure to restart your server when you modify this file. + +# This file contains settings for ActionController::ParamsWrapper which +# is enabled by default. + +# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. +ActiveSupport.on_load(:action_controller) do + wrap_parameters format: [:json] if respond_to?(:wrap_parameters) +end diff --git a/test/dummy/config/locales/en.yml b/test/dummy/config/locales/en.yml new file mode 100644 index 0000000..0653957 --- /dev/null +++ b/test/dummy/config/locales/en.yml @@ -0,0 +1,23 @@ +# Files in the config/locales directory are used for internationalization +# and are automatically loaded by Rails. If you want to use locales other +# than English, add the necessary files in this directory. +# +# To use the locales, use `I18n.t`: +# +# I18n.t 'hello' +# +# In views, this is aliased to just `t`: +# +# <%= t('hello') %> +# +# To use a different locale, set it with `I18n.locale`: +# +# I18n.locale = :es +# +# This would use the information in config/locales/es.yml. +# +# To learn more, please read the Rails Internationalization guide +# available at http://guides.rubyonrails.org/i18n.html. + +en: + hello: "Hello world" diff --git a/test/dummy/config/routes.rb b/test/dummy/config/routes.rb new file mode 100644 index 0000000..3f66539 --- /dev/null +++ b/test/dummy/config/routes.rb @@ -0,0 +1,56 @@ +Rails.application.routes.draw do + # The priority is based upon order of creation: first created -> highest priority. + # See how all your routes lay out with "rake routes". + + # You can have the root of your site routed with "root" + # root 'welcome#index' + + # Example of regular route: + # get 'products/:id' => 'catalog#view' + + # Example of named route that can be invoked with purchase_url(id: product.id) + # get 'products/:id/purchase' => 'catalog#purchase', as: :purchase + + # Example resource route (maps HTTP verbs to controller actions automatically): + # resources :products + + # Example resource route with options: + # resources :products do + # member do + # get 'short' + # post 'toggle' + # end + # + # collection do + # get 'sold' + # end + # end + + # Example resource route with sub-resources: + # resources :products do + # resources :comments, :sales + # resource :seller + # end + + # Example resource route with more complex sub-resources: + # resources :products do + # resources :comments + # resources :sales do + # get 'recent', on: :collection + # end + # end + + # Example resource route with concerns: + # concern :toggleable do + # post 'toggle' + # end + # resources :posts, concerns: :toggleable + # resources :photos, concerns: :toggleable + + # Example resource route within a namespace: + # namespace :admin do + # # Directs /admin/products/* to Admin::ProductsController + # # (app/controllers/admin/products_controller.rb) + # resources :products + # end +end diff --git a/test/dummy/config/secrets.yml b/test/dummy/config/secrets.yml new file mode 100644 index 0000000..e9213c0 --- /dev/null +++ b/test/dummy/config/secrets.yml @@ -0,0 +1,22 @@ +# Be sure to restart your server when you modify this file. + +# Your secret key is used for verifying the integrity of signed cookies. +# If you change this key, all old signed cookies will become invalid! + +# Make sure the secret is at least 30 characters and all random, +# no regular words or you'll be exposed to dictionary attacks. +# You can use `rake secret` to generate a secure secret key. + +# Make sure the secrets in this file are kept private +# if you're sharing your code publicly. + +development: + secret_key_base: 51f457918fc204bef2280de08080b24d6289997cc1af905e47aead42b5e027b6bc27cd6cbd1cb11a34d8df4163d63db2a0ff973acfa11b239a5dd15d6bfb5bfd + +test: + secret_key_base: 1a2d31f4fb35a33e52a69eac67e125b9b1ba5b302e8d3468e60282061a8e74d1a8d977fb88f2eb001aecb99c9c3fbde29e0c7c5ac5d548e1458772ee50ed48e9 + +# Do not keep production secrets in the repository, +# instead read values from the environment. +production: + secret_key_base: <%= ENV["SECRET_KEY_BASE"] %> diff --git a/test/dummy/lib/assets/.keep b/test/dummy/lib/assets/.keep new file mode 100644 index 0000000..e69de29 diff --git a/test/dummy/log/.keep b/test/dummy/log/.keep new file mode 100644 index 0000000..e69de29 diff --git a/test/dummy/public/404.html b/test/dummy/public/404.html new file mode 100644 index 0000000..b612547 --- /dev/null +++ b/test/dummy/public/404.html @@ -0,0 +1,67 @@ + + + + The page you were looking for doesn't exist (404) + + + + + + +
+
+

The page you were looking for doesn't exist.

+

You may have mistyped the address or the page may have moved.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/test/dummy/public/422.html b/test/dummy/public/422.html new file mode 100644 index 0000000..a21f82b --- /dev/null +++ b/test/dummy/public/422.html @@ -0,0 +1,67 @@ + + + + The change you wanted was rejected (422) + + + + + + +
+
+

The change you wanted was rejected.

+

Maybe you tried to change something you didn't have access to.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/test/dummy/public/500.html b/test/dummy/public/500.html new file mode 100644 index 0000000..061abc5 --- /dev/null +++ b/test/dummy/public/500.html @@ -0,0 +1,66 @@ + + + + We're sorry, but something went wrong (500) + + + + + + +
+
+

We're sorry, but something went wrong.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/test/dummy/public/favicon.ico b/test/dummy/public/favicon.ico new file mode 100644 index 0000000..e69de29 diff --git a/test/helpers/admin/announcements_helper_test.rb b/test/helpers/admin/announcements_helper_test.rb new file mode 100644 index 0000000..a867b12 --- /dev/null +++ b/test/helpers/admin/announcements_helper_test.rb @@ -0,0 +1,4 @@ +require 'test_helper' + +class Admin::AnnouncementsHelperTest < ActionView::TestCase +end diff --git a/test/integration/navigation_test.rb b/test/integration/navigation_test.rb new file mode 100644 index 0000000..eec8c0e --- /dev/null +++ b/test/integration/navigation_test.rb @@ -0,0 +1,9 @@ +require 'test_helper' + +class NavigationTest < ActionDispatch::IntegrationTest + + # test "the truth" do + # assert true + # end +end + diff --git a/test/test_helper.rb b/test/test_helper.rb new file mode 100644 index 0000000..1e26a31 --- /dev/null +++ b/test/test_helper.rb @@ -0,0 +1,15 @@ +# Configure Rails Environment +ENV["RAILS_ENV"] = "test" + +require File.expand_path("../dummy/config/environment.rb", __FILE__) +require "rails/test_help" + +Rails.backtrace_cleaner.remove_silencers! + +# Load support files +Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f } + +# Load fixtures from the engine +if ActiveSupport::TestCase.method_defined?(:fixture_path=) + ActiveSupport::TestCase.fixture_path = File.expand_path("../fixtures", __FILE__) +end