From 693eb3ee500c5e7d0db37af4e41be62a84c76cda Mon Sep 17 00:00:00 2001 From: Manuel Cillero Date: Tue, 29 Jan 2019 19:42:59 +0100 Subject: [PATCH] Nuevo plugin Redmine Glossary 0.9.2 --- plugins/redmine_glossary/README.ja.rdoc | 47 +++ plugins/redmine_glossary/README.rdoc | 45 ++ .../app/controllers/glossary_controller.rb | 385 ++++++++++++++++++ .../controllers/glossary_styles_controller.rb | 61 +++ .../controllers/term_categories_controller.rb | 75 ++++ .../app/helpers/glossary_helper.rb | 73 ++++ .../app/helpers/glossary_port_helper.rb | 99 +++++ .../app/helpers/glossary_styles_helper.rb | 107 +++++ .../app/helpers/term_categories_helper.rb | 2 + .../app/models/glossary_style.rb | 52 +++ plugins/redmine_glossary/app/models/term.rb | 149 +++++++ .../app/models/term_category.rb | 29 ++ .../_add_term_category_modal.html.erb | 10 + .../app/views/glossary/_form.html.erb | 38 ++ .../glossary/_index_in_category.html.erb | 31 ++ .../glossary/_show_all_in_category.html.erb | 10 + .../app/views/glossary/_show_one.html.erb | 19 + .../app/views/glossary/_sidebar.html.erb | 44 ++ .../app/views/glossary/_view_term.html.erb | 10 + .../views/glossary/add_term_category.html.erb | 9 + .../views/glossary/add_term_category.js.erb | 2 + .../app/views/glossary/edit.html.erb | 29 ++ .../app/views/glossary/import_csv.html.erb | 57 +++ .../views/glossary/import_csv_exec.html.erb | 13 + .../app/views/glossary/index.html.erb | 42 ++ .../app/views/glossary/move_all.html.erb | 22 + .../app/views/glossary/new.html.erb | 30 ++ .../app/views/glossary/show.html.erb | 29 ++ .../app/views/glossary_styles/_form.html.erb | 44 ++ .../views/glossary_styles/_search.html.erb | 46 +++ .../app/views/glossary_styles/edit.html.erb | 1 + .../settings/_glossary_settings.html.erb | 12 + .../app/views/term_categories/_form.html.erb | 5 + .../views/term_categories/destroy.html.erb | 19 + .../app/views/term_categories/edit.html.erb | 9 + .../app/views/term_categories/index.html.erb | 44 ++ .../assets/images/termlink.png | Bin 0 -> 412 bytes .../assets/stylesheets/glossary.css | 4 + .../assets/stylesheets/termlink.css | 3 + .../redmine_glossary/config/locales/de.yml | 104 +++++ .../redmine_glossary/config/locales/en.yml | 103 +++++ .../redmine_glossary/config/locales/it.yml | 103 +++++ .../redmine_glossary/config/locales/ja.yml | 121 ++++++ .../redmine_glossary/config/locales/pt.yml | 103 +++++ .../redmine_glossary/config/locales/zh.yml | 103 +++++ plugins/redmine_glossary/config/routes.rb | 19 + .../db/migrate/001_create_terms.rb | 34 ++ .../db/migrate/002_create_glossary_styles.rb | 24 ++ .../db/migrate/003_terms_add_columns.rb | 14 + plugins/redmine_glossary/init.rb | 80 ++++ .../lib/glossary_asset_tag_helper_patch.rb | 23 ++ .../lib/glossary_import_info.rb | 69 ++++ .../redmine_glossary/lib/grouping_terms.rb | 50 +++ .../redmine_glossary/lib/term_link_helper.rb | 35 ++ plugins/redmine_glossary/release_note.rwiki | 66 +++ .../test/fixtures/glossary_styles.yml | 19 + .../test/fixtures/grossary_styles.yml | 19 + .../test/fixtures/term_categories.yml | 11 + .../test/fixtures/term_queries.yml | 17 + .../redmine_glossary/test/fixtures/terms.yml | 25 ++ .../test/fixtures/view_styles.yml | 19 + .../functional/glossary_controller_test.rb | 8 + .../glossary_styles_controller_test.rb | 8 + .../glossray_styles_controller_test.rb | 8 + .../term_categories_controller_test.rb | 8 + .../term_queries_controller_test.rb | 8 + plugins/redmine_glossary/test/test_helper.rb | 5 + .../test/unit/glossary_style_test.rb | 10 + .../test/unit/grossary_style_test.rb | 10 + .../test/unit/term_category_test.rb | 10 + .../test/unit/term_query_test.rb | 10 + .../redmine_glossary/test/unit/term_test.rb | 10 + 72 files changed, 2962 insertions(+) create mode 100755 plugins/redmine_glossary/README.ja.rdoc create mode 100755 plugins/redmine_glossary/README.rdoc create mode 100755 plugins/redmine_glossary/app/controllers/glossary_controller.rb create mode 100755 plugins/redmine_glossary/app/controllers/glossary_styles_controller.rb create mode 100755 plugins/redmine_glossary/app/controllers/term_categories_controller.rb create mode 100755 plugins/redmine_glossary/app/helpers/glossary_helper.rb create mode 100755 plugins/redmine_glossary/app/helpers/glossary_port_helper.rb create mode 100755 plugins/redmine_glossary/app/helpers/glossary_styles_helper.rb create mode 100755 plugins/redmine_glossary/app/helpers/term_categories_helper.rb create mode 100755 plugins/redmine_glossary/app/models/glossary_style.rb create mode 100755 plugins/redmine_glossary/app/models/term.rb create mode 100755 plugins/redmine_glossary/app/models/term_category.rb create mode 100755 plugins/redmine_glossary/app/views/glossary/_add_term_category_modal.html.erb create mode 100755 plugins/redmine_glossary/app/views/glossary/_form.html.erb create mode 100755 plugins/redmine_glossary/app/views/glossary/_index_in_category.html.erb create mode 100755 plugins/redmine_glossary/app/views/glossary/_show_all_in_category.html.erb create mode 100755 plugins/redmine_glossary/app/views/glossary/_show_one.html.erb create mode 100755 plugins/redmine_glossary/app/views/glossary/_sidebar.html.erb create mode 100755 plugins/redmine_glossary/app/views/glossary/_view_term.html.erb create mode 100755 plugins/redmine_glossary/app/views/glossary/add_term_category.html.erb create mode 100755 plugins/redmine_glossary/app/views/glossary/add_term_category.js.erb create mode 100755 plugins/redmine_glossary/app/views/glossary/edit.html.erb create mode 100755 plugins/redmine_glossary/app/views/glossary/import_csv.html.erb create mode 100755 plugins/redmine_glossary/app/views/glossary/import_csv_exec.html.erb create mode 100755 plugins/redmine_glossary/app/views/glossary/index.html.erb create mode 100755 plugins/redmine_glossary/app/views/glossary/move_all.html.erb create mode 100755 plugins/redmine_glossary/app/views/glossary/new.html.erb create mode 100755 plugins/redmine_glossary/app/views/glossary/show.html.erb create mode 100755 plugins/redmine_glossary/app/views/glossary_styles/_form.html.erb create mode 100755 plugins/redmine_glossary/app/views/glossary_styles/_search.html.erb create mode 100755 plugins/redmine_glossary/app/views/glossary_styles/edit.html.erb create mode 100755 plugins/redmine_glossary/app/views/settings/_glossary_settings.html.erb create mode 100755 plugins/redmine_glossary/app/views/term_categories/_form.html.erb create mode 100755 plugins/redmine_glossary/app/views/term_categories/destroy.html.erb create mode 100755 plugins/redmine_glossary/app/views/term_categories/edit.html.erb create mode 100755 plugins/redmine_glossary/app/views/term_categories/index.html.erb create mode 100755 plugins/redmine_glossary/assets/images/termlink.png create mode 100755 plugins/redmine_glossary/assets/stylesheets/glossary.css create mode 100755 plugins/redmine_glossary/assets/stylesheets/termlink.css create mode 100755 plugins/redmine_glossary/config/locales/de.yml create mode 100755 plugins/redmine_glossary/config/locales/en.yml create mode 100755 plugins/redmine_glossary/config/locales/it.yml create mode 100755 plugins/redmine_glossary/config/locales/ja.yml create mode 100755 plugins/redmine_glossary/config/locales/pt.yml create mode 100755 plugins/redmine_glossary/config/locales/zh.yml create mode 100755 plugins/redmine_glossary/config/routes.rb create mode 100755 plugins/redmine_glossary/db/migrate/001_create_terms.rb create mode 100755 plugins/redmine_glossary/db/migrate/002_create_glossary_styles.rb create mode 100755 plugins/redmine_glossary/db/migrate/003_terms_add_columns.rb create mode 100755 plugins/redmine_glossary/init.rb create mode 100755 plugins/redmine_glossary/lib/glossary_asset_tag_helper_patch.rb create mode 100755 plugins/redmine_glossary/lib/glossary_import_info.rb create mode 100755 plugins/redmine_glossary/lib/grouping_terms.rb create mode 100755 plugins/redmine_glossary/lib/term_link_helper.rb create mode 100755 plugins/redmine_glossary/release_note.rwiki create mode 100755 plugins/redmine_glossary/test/fixtures/glossary_styles.yml create mode 100755 plugins/redmine_glossary/test/fixtures/grossary_styles.yml create mode 100755 plugins/redmine_glossary/test/fixtures/term_categories.yml create mode 100755 plugins/redmine_glossary/test/fixtures/term_queries.yml create mode 100755 plugins/redmine_glossary/test/fixtures/terms.yml create mode 100755 plugins/redmine_glossary/test/fixtures/view_styles.yml create mode 100755 plugins/redmine_glossary/test/functional/glossary_controller_test.rb create mode 100755 plugins/redmine_glossary/test/functional/glossary_styles_controller_test.rb create mode 100755 plugins/redmine_glossary/test/functional/glossray_styles_controller_test.rb create mode 100755 plugins/redmine_glossary/test/functional/term_categories_controller_test.rb create mode 100755 plugins/redmine_glossary/test/functional/term_queries_controller_test.rb create mode 100755 plugins/redmine_glossary/test/test_helper.rb create mode 100755 plugins/redmine_glossary/test/unit/glossary_style_test.rb create mode 100755 plugins/redmine_glossary/test/unit/grossary_style_test.rb create mode 100755 plugins/redmine_glossary/test/unit/term_category_test.rb create mode 100755 plugins/redmine_glossary/test/unit/term_query_test.rb create mode 100755 plugins/redmine_glossary/test/unit/term_test.rb diff --git a/plugins/redmine_glossary/README.ja.rdoc b/plugins/redmine_glossary/README.ja.rdoc new file mode 100755 index 0000000..f73bcc3 --- /dev/null +++ b/plugins/redmine_glossary/README.ja.rdoc @@ -0,0 +1,47 @@ += Redmine 用語集プラグイン + +Redmine(プロジェクト管理システム)に用語集の機能を追加するプラグインです。 +以下のような用途に使えます。 + * 業務分析工程での専門用語の管理 + * 対訳表 + * 用語とデータ型(クラス名)との変換辞書 + * コーディング時の略名の付け方の方針管理 + + +== プラグインパッケージの取得 + +プラグインパッケージは以下から取得してください。 +* {SourceForge.JP}[http://sourceforge.jp/projects/rp-glossary/releases/] + + +== インストールと設定 + +1. 取得した圧縮ファイルを (インストールディレクトリ)/vender/plugins に展開します。 +2. データベースの設定を行います。 http://www.redmine.org/wiki/1/Plugins + rake db:migrate_plugins RAILS_ENV=production +3. Redmine の WEB サーバ(Apache など)を再起動します。 +4. "管理" メニューの "ロールと権限" から用語集の各権限を設定します。 +5. 用語集を使用したいプロジェクトの "設定" メニューで "用語集" のモジュールにチェックを入れます。 +6. 非表示にしたい項目があれば、プラグインの "設定" ページで設定してください。 + +cf. http://www.r-labs.org/projects/r-labs/wiki/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%96%B9%E6%B3%95 + + +== 使用法 + +プロジェクトメニューの "用語集" からご利用ください。 + +使用法の詳細は以下をご覧ください。 +* http://www.r-labs.org/projects/rp-glossary/wiki/Usage + + +== 質問、バグ報告など + +不具合報告や要望などありましたら、以下で Defect や Proposal のチケットを発行して下さい。 +http://www.r-labs.org/projects/rp-glossary/issues + +質問などは以下のフォーラムに記述して下さい。要望などはこちらに書いてもらってもかまいません。 +http://www.r-labs.org/projects/rp-glossary/boards + + + diff --git a/plugins/redmine_glossary/README.rdoc b/plugins/redmine_glossary/README.rdoc new file mode 100755 index 0000000..81438f8 --- /dev/null +++ b/plugins/redmine_glossary/README.rdoc @@ -0,0 +1,45 @@ += Redmine Glossary Plugin + +This is the Redmine(Project manage system) plug-in which adds the feature of the glossary. + +Ported to 3.0.x and 3.1.x on master branch. +It doesn't keep compatibility with 2.x! + +Ported to comming 4.0.x on support-redmine4 branch. +It doesn't keep compativility with 3.x and below. + +== Use Cases + + * Management of technical terms in a system analysis phase + * Interlinear translation table + * Translate table from term to data type (class name) + * Management of naming examples in a coding + +== Installation and Setup (redmine 3.x) + +cf. http://www.redmine.org/wiki/1/Plugins + +1. Put the downloaded package in the /plugins directory. +2. run the following command to upgrade your database. + rake redmine:plugins:migrate RAILS_ENV=production +3. Restart Redmine WEB server. +4. Set permissions of glossary plugin in "Administration" -> "Roles and permissions" +5. Open the setting page of projects you need, check the "Glossary" module +6. If you need, select items to make hidden in plugin setting page. + +== Installation and Setup (redmine 4.x) + +T.B.D. + +1. Put the downloaded package in the /plugins directory. + Or clone from this repository. + + + +== Usage + +Start from "Glossary" item of a project menu. + + +For the details of the usage, see the following page. +* http://www.r-labs.org/projects/rp-glossary/wiki/UsageEn diff --git a/plugins/redmine_glossary/app/controllers/glossary_controller.rb b/plugins/redmine_glossary/app/controllers/glossary_controller.rb new file mode 100755 index 0000000..645286c --- /dev/null +++ b/plugins/redmine_glossary/app/controllers/glossary_controller.rb @@ -0,0 +1,385 @@ + +class GlossaryController < ApplicationController + menu_item :glossary + unloadable + + layout 'base' + before_filter :find_project, :authorize + before_filter :find_term, :only => [:show, :edit, :destroy] + before_filter :retrieve_glossary_style, :only => [:index, :show, :show_all, :import_csv_exec] + + helper :attachments + include AttachmentsHelper + helper :sort + include SortHelper + helper :glossary + include GlossaryHelper + helper :glossary_port + include GlossaryPortHelper + helper :glossary_styles + include GlossaryStylesHelper + + + def index + + @is_index = true + set_show_params + @terms = find_terms(@glossary_style.project_scope) + unless @terms.empty? + sortparams = @glossary_style.sort_params + sort_terms(@terms, sortparams) unless sortparams.empty? + off_params = @show_params.clone + off_params.delete("category") + off_params.delete("project") + if (!@glossary_style.grouping?) + check_nouse_params(@terms, off_params) + else + @terms = grouping(@glossary_style.groupby, @terms, off_params) + end + @show_params.delete_if {|prm| off_params.member?(prm) } + end + + + respond_to do |format| + format.html { render :template => 'glossary/index.html.erb', :layout => !request.xhr? } + format.csv { + ary = @terms + ary = GroupingTerms.flatten(@terms) if (@glossary_style.grouping?) + send_data(glossary_to_csv(ary), :type => 'text', + :filename => "glossary-export.csv") + } + end + end + + + def index_clear + params[:search_index_ch] = nil + redirect_to :controller => 'glossary', :action => 'index', :project_id => @project + end + + + def show + set_show_params + @term_categories = TermCategory.where(:project_id => @project.id).order(:position) + respond_to do |format| + format.html { render :template => 'glossary/show.html.erb', :layout => !request.xhr? } + end + end + + def new + @term_categories = TermCategory.where(:project_id => @project.id).order(:position) + @term = Term.new(params[:term]) + @term.name = CGI::unescapeHTML(params[:new_term_name]) if params[:new_term_name] + @term.project_id = @project.id + + unless (request.get? || request.xhr?) + @term.author_id = User.current.id + @term.updater_id = User.current.id + if @term.save + attach_files(@term, params[:attachments]) + flash[:notice] = l(:notice_successful_create) + if (params[:continue]) + redirect_to :controller => 'glossary', :action => 'new', :project_id => @project + else + redirect_to :controller => 'glossary', :action => 'show', :project_id => @project, + :id => @term + end + end + end + end + + def preview + @text = params[:term][:description] + render :partial => 'common/preview' + end + + def edit + @term_categories = TermCategory.where(:project_id => @project.id).order(:position) + + if request.post? || request.put? || request.patch? + @term.attributes = params[:term] + @term.updater_id = User.current.id + if @term.save + attach_files(@term, params[:attachments]) + flash[:notice] = l(:notice_successful_update) + redirect_to(:controller => 'glossary', :action => 'show', + :project_id => @project, :id => @term.id) + return + end + end + rescue ActiveRecord::StaleObjectError + # Optimistic locking exception + flash.now[:error] = l(:notice_locking_conflict) + end + + def destroy + @term.destroy + redirect_to :action => 'index', :project_id => @project + end + + def add_term_category + @category = TermCategory.new(params[:category]) + @category.project_id = @project.id + if request.post? and @category.save + respond_to do |format| + format.html do + flash[:notice] = l(:notice_successful_create) + redirect_to :controller => 'term_categories', :action => 'index', :project_id => @project + end + format.js do + term_categories = TermCategory.where(:project_id => @project.id) + render(:update) {|page| page.replace "term_category_id", + content_tag('select', '' + options_from_collection_for_select(term_categories, 'id', 'name', @category.id), :id => 'term_category_id', :name => 'term[category_id]') + } + end + end + end + end + + + def move_all + projs = Project.visible.all + @allowed_projs = projs.find_all {|proj| + User.current.allowed_to?({:controller =>'glossary', :action => 'index'}, proj) and + User.current.allowed_to?({:controller =>'glossary', :action => 'move_all'}, proj) and + proj != @project + } + if request.post? + newproj = Project.find(params[:new_project_id]) + cats = TermCategory.where(:project_id => newproj.id).order(:position) + posbase = (cats.blank?) ? 0 : cats.last.position - 1; + cats = TermCategory.where(:project_id => @project.id) + cats.each {|cat| + cat.project_id = newproj.id + cat.position += cat.position + posbase + cat.save + } + Term.where(project_id: @project.id).update_all(project_id: newproj.id) + flash[:notice] = l(:notice_successful_update) + redirect_to({:action => 'index', :project_id => newproj}) + end + end + + + def import_csv + end + + def import_csv_exec + @import_info = CsvGlossaryImportInfo.new(params) + glossary_from_csv(@import_info, @project.id) + if (@import_info.success?) + flash[:notice] = l(:notice_successful_create) + else + flash.now[:error] = l(:error_import_failed) + " " + @import_info.err_string + end + end + + + private + + def show_param?(prmname) + case prmname + when 'project' + return false unless @glossary_style.project_scope != GlossaryStyle::ProjectCurrent + return true unless @is_index + @glossary_style.groupby != GlossaryStyle::GroupByProject + when 'category' + return true unless @is_index + @glossary_style.groupby != GlossaryStyle::GroupByCategory + when 'rubi' + (param_visible?(prmname) and !@is_index) + when 'abbr_whole' + (param_visible?(prmname) and !@is_index) + else + param_visible?(prmname) + end + end + + def set_show_params + @show_params = default_show_params.find_all {|prmname| + show_param?(prmname) + } + end + + def check_nouse_params(terms, off_params) + terms.each {|term| + return if off_params.empty? + off_params.delete_if {|prm| !term[prm].empty? } + } + end + + def grouping(type, terms, off_params) + grouptbl = {} + terms.each {|term| + off_params.delete_if {|prm| !term[prm].empty? } + tgt = (type == GlossaryStyle::GroupByProject) ? term.project : term.category + gterms = grouptbl[tgt]; + unless (gterms) + gterms = GroupingTerms.new(type, tgt) + grouptbl[tgt] = gterms + end + gterms.ary << term + } + grouptbl.values.sort + end + + + #### sort + + def sort_terms(terms, prms) + terms.to_a.sort! {|a, b| + re = nil + prms.each {|prm| + re = Term.compare_by_param(prm, a, b) + break if (re != 0) + } + (re == 0) ? a.id <=> b.id : re + } + end + + + #### find + + def join_queries(ary, ex = 'OR') + joinstr = " #{ex} " + ((ary.size == 1) ? ary[0] : "( #{ary.join(joinstr)} )") + end + + def query_project_scope(projscope, queries) + ary = authorized_projects(projscope, @project, + {:controller => :glossary, :action => :index}) + return false if ary.empty? + queries << join_queries(ary.collect{|proj| "project_id = #{proj.id}" }) + true + end + + def query_category(catname, queries) + return if (!catname or catname.empty? ) + if (catname == "(#{l(:label_not_categorized)})") + queries << "( category_id IS NULL )" + else + cats = TermCategory.where(["name LIKE :catname", + {:catname => catname + "%"}]) + ary = [] + ptn = /^#{Regexp.escape(catname)}\// + cats.each {|encat| + if (encat.name == catname or encat.name =~ ptn) + ary << "category_id = #{encat.id}" + end + } + queries << join_queries(ary) unless (ary.empty?) + end + end + + + def query_search_str(str, queries, symbols) + return unless (str and !str.empty?) + strs = tokenize_by_space(str) + cnt = 0 + strs.each {|ss| + symbols["search_str_#{cnt}".to_sym] = "%#{ss}%" + cnt += 1 + } + ary = [] + default_searched_params.each {|prm| + subary = [] + cnt = 0 + strs.each {|ss| + subary << "( #{prm} LIKE :search_str_#{cnt} )" + cnt += 1 + } + ary << join_queries(subary, 'AND') + } + queries << join_queries(ary) if (0 < ary.size) + end + + + def get_search_index_charset(ch, type) + charset = [ch] + return charset if type + idx = l(:index_ary).index(ch) + subary = l(:index_subary) + if (subary.is_a?(Array) and subary[idx] and !subary[idx].empty?) + if (subary[idx].is_a?(Array)) + subary[idx].each {|subch| + charset << subch + } + else + charset << subary[idx] + end + end + charset + end + + + def query_search_index(ch, type, queries, symbols) + return unless (ch and !ch.empty?) + charset = get_search_index_charset(ch, type) + searchprms = [:name, :abbr_whole, :rubi] + searchprms << :name_en if (type) + cnt = 0 + charset.each {|tch| + symbols["search_ch_#{cnt}".to_sym] = tch + '%' + cnt += 1 + } + ary = [] + searchprms.each {|prm| + subary = [] + cnt = 0 + charset.each {|tch| + subary << "( #{prm} LIKE :search_ch_#{cnt} )" + cnt += 1 + } + ary << join_queries(subary) + } + @query_string = join_queries(ary) + queries << join_queries(ary) if (0 < ary.size) + end + + + def find_terms(project_scope) + queries = [] + symbols = {} + return [] unless query_project_scope(project_scope, queries) + query_category(params[:search_category], queries) + query_search_str(params[:search_str], queries, symbols) + query_search_index(params[:search_index_ch], params[:search_index_type], + queries, symbols) + terms = nil + if (queries.empty?) + terms = Term.all + else + query_str = join_queries(queries, "AND") + terms = Term.where(query_str, symbols) + end + if (terms and params[:latest_days] and !params[:latest_days].empty?) + limitsec = Time.now.to_i - params[:latest_days].to_i * 60 * 60 * 24 + limittm = Time.at(limitsec) + terms.delete_if {|prm| + (prm.datetime < limittm) + } + else + terms + end + end + + + def find_project + project_id = params[:project_id] || (params[:issue] && params[:issue][:project_id]) + @project = Project.find(project_id) + rescue ActiveRecord::RecordNotFound + render_404 + end + + def find_term + @term = Term.find_by(project_id: @project.id, id: params[:id]) + render_404 unless @term + rescue + render_404 + end + + def attach_files(val, prm) + Attachment.attach_files(val, prm) + end + +end diff --git a/plugins/redmine_glossary/app/controllers/glossary_styles_controller.rb b/plugins/redmine_glossary/app/controllers/glossary_styles_controller.rb new file mode 100755 index 0000000..f648926 --- /dev/null +++ b/plugins/redmine_glossary/app/controllers/glossary_styles_controller.rb @@ -0,0 +1,61 @@ +class GlossaryStylesController < ApplicationController + unloadable + + helper :glossary_styles + include GlossaryStylesHelper + + def search + newparams = { + :controller => 'glossary', :action => 'index', :project_id => Project.find(params[:project_id]) + } + unless (params[:search_clear]) + for prm in [:search_category, :search_str, :latest_days] + if (params[prm] and !params[prm].empty?) + if (prm == :latest_days and !(params[prm] =~ /^\d+$/)) + flash[:warning] = sprintf(l(:error_to_number), params[prm]) + else + newparams[prm] = params[prm] + end + end + end + end + redirect_to(newparams) + end + + + def edit + if (User.current.anonymous?) + if (params[:clear]) + session[:glossary_style] = nil + else + session[:glossary_style] = params[:glossary_style] + end + else + unless params[:glossary_style_id].blank? + @glossary_style = GlossaryStyle.find_by(:user_id => User.current.id) + end + + if (@glossary_style) + if (params[:clear]) + @glossary_style.set_default! + else + params[:glossary_style].each {|key,val| + @glossary_style[key] = val + } + end + else + @glossary_style = GlossaryStyle.new(params[:glossary_style]) + end + + @glossary_style.user_id = User.current.id + unless @glossary_style.save + flash[:error] = l(:notice_glossary_style_create_f) + end + end + newparams = {:controller => 'glossary', :action => 'index', + :project_id => Project.find(params[:project_id]), + :glossary_style_id => @glossary_style_id} + add_search_params(newparams) + redirect_to(newparams) + end +end diff --git a/plugins/redmine_glossary/app/controllers/term_categories_controller.rb b/plugins/redmine_glossary/app/controllers/term_categories_controller.rb new file mode 100755 index 0000000..fc22392 --- /dev/null +++ b/plugins/redmine_glossary/app/controllers/term_categories_controller.rb @@ -0,0 +1,75 @@ +class TermCategoriesController < ApplicationController + unloadable + + layout 'base' + menu_item :glossary, :only => [:index, :edit, :destroy] + + before_filter :find_project, :authorize + before_filter :retrieve_glossary_style, :only => [:index] + + helper :glossary + include GlossaryHelper + helper :glossary_styles + include GlossaryStylesHelper + + + def index + @categories = TermCategory.where(project_id: @project.id).order(:position) + end + + def edit + @category = TermCategory.find_by(project_id: @project.id, id: params[:id]) + if request.patch? and @category.update_attributes(params[:category]) + flash[:notice] = l(:notice_successful_update) + redirect_to :controller => 'term_categories', :action => 'index', :project_id => @project + end + rescue ActiveRecord::RecordNotFound + render_404 + end + + def change_order + if request.post? + category = TermCategory.find_by(project_id: @project.id, id: params[:id]) + case params[:position] + when 'highest'; category.move_to_top + when 'higher'; category.move_higher + when 'lower'; category.move_lower + when 'lowest'; category.move_to_bottom + end if params[:position] + redirect_to :controller => 'term_categories', :action => 'index', :project_id => @project + end + rescue ActiveRecord::RecordNotFound + render_404 + end + + def destroy + @category = TermCategory.find_by(project_id: @project.id, id: params[:id]) + @term_count = @category.terms.size + if @term_count == 0 + @category.destroy + redirect_to :controller => 'term_categories', :action => 'index', :project_id => @project + elsif params[:todo] + reassign_to = TermCategory.find_by(project_id: @project.id, id: params[:reassign_to_id]) if params[:todo] == 'reassign' + @category.destroy(reassign_to) + redirect_to :controller => 'term_categories', :action => 'index', :project_id => @project + end + @categories = TermCategory.where(project_id: @project.id) - [@category] + rescue ActiveRecord::RecordNotFound + render_404 + end + +private + def find_project + @project = Project.find(params[:project_id]) + rescue ActiveRecord::RecordNotFound + render_404 + end + + def conditions_projects() + ary = authorized_projects(@glossary_style.project_scope, @project, + {:controller => :term_categories, :action => :edit}) + return nil if ary.empty? + return ary.collect{|proj| "project_id = #{proj.id}" }.join(" OR ") + end + +end diff --git a/plugins/redmine_glossary/app/helpers/glossary_helper.rb b/plugins/redmine_glossary/app/helpers/glossary_helper.rb new file mode 100755 index 0000000..feb7e5c --- /dev/null +++ b/plugins/redmine_glossary/app/helpers/glossary_helper.rb @@ -0,0 +1,73 @@ +require 'glossary_import_info' + +module GlossaryHelper + + def label_param(prmname) + case prmname + when 'id' + '#' + when 'project' + I18n.t(:label_project) + when 'category' + I18n.t(:field_category) + when 'datetime' + I18n.t(:field_updated_on) + when 'author' + I18n.t(:field_author) + when 'updater' + I18n.t(:label_updater) + when 'created_on' + I18n.t(:field_created_on) + when 'updated_on' + I18n.t(:field_updated_on) + when 'description' + I18n.t(:field_description) + else + I18n.t("label.#{prmname}") + end + end + + + def param_visible?(prmname) + !Setting.plugin_redmine_glossary["hide_item_#{prmname}"] + end + + def collect_visible_params(prmary) + ary = [] + prmary {|prm| + ary << prm if param_visible?(prm) + } + end + + def default_show_params; Term.default_show_params; end + def default_searched_params; Term.default_searched_params; end + def default_sort_params; Term.default_sort_params; end + + + def params_select(form, name, prms) + options = prms.collect{|prm| [label_param(prm), prm]} + form.select(name, options, :include_blank=>true) + end + + def params_select_tag(name, prms, defaultprm) + options = [""] + options += prms.collect{|prm| [label_param(prm), prm]} + select_tag(name, options_from_collection_for_select(options), defaultprm) + end + + + # extract tokens from the question + # eg. hello "bye bye" => ["hello", "bye bye"] + def tokenize_by_space(str) + str.scan(%r{((\s|^)"[\s\w]+"(\s|$)|\S+)}).collect {|m| + m.first.gsub(%r{(^\s*"\s*|\s*"\s*$)}, '') + } + end + + + + def updated_by(updated, author) + l(:label_updated_time_by, :author => link_to_user(author), :age => time_tag(updated)).html_safe + end + +end diff --git a/plugins/redmine_glossary/app/helpers/glossary_port_helper.rb b/plugins/redmine_glossary/app/helpers/glossary_port_helper.rb new file mode 100755 index 0000000..ee877bb --- /dev/null +++ b/plugins/redmine_glossary/app/helpers/glossary_port_helper.rb @@ -0,0 +1,99 @@ +module GlossaryPortHelper + + + #def glossary_csvout(csv, ic, ary) + def glossary_csvout(csv, ary) + csv << ary.collect {|c| + begin + #ic.iconv(c.to_s) + Redmine::CodesetUtil.from_utf8(c.to_s, l(:general_csv_encoding)) + rescue + c.to_s + end + } + end + + def glossary_to_csv(terms) + #ic = Iconv.new(l(:general_csv_encoding), 'UTF-8') + export = FCSV.generate(:col_sep => l(:general_csv_separator)) do |csv| + # csv header fields + headers = Term.export_params.collect {|prm| + label_param(prm) + } + + #glossary_csvout(csv, ic, headers) + glossary_csvout(csv, headers) + + # csv lines + terms.each do |term| + fields = Term.export_params.collect {|prm| + term.param_to_s(prm) + } + #glossary_csvout(csv, ic, fields) + glossary_csvout(csv, fields) + end + end + export + end + + + def glossary_from_csv(portinfo, projid) + line_count = 0 + begin + #ic = Iconv.new('UTF-8', portinfo.in_encoding) + + raise l(:error_file_none) if (!portinfo.import_file) + FCSV::parse(portinfo.import_file.read) { |row| + line_count += 1 + next if (portinfo.is_first_comment and line_count == 1) + next if (row.empty?) + + name = row[portinfo.param_col('name')] + raise sprintf(l(:error_no_name), t("label.name")) unless name + + #name = ic.iconv(name) + name = Redmine::CodesetUtil.to_utf8(name, portinfo.in_encoding) + term = Term.find_by(project_id: projid, name: name) + if (term) + portinfo.upterm_num += 1 + else + term = Term.new(:name => name, :project_id => projid) + portinfo.newterm_num += 1 + end + + for col in 0 ... row.size + prm = portinfo.col_param(col) + next unless prm + #val = ic.iconv(row[col].to_s) + val = Redmine::CodesetUtil.to_utf8(row[col].to_s, portinfo.in_encoding) + case prm + when 'name' + when 'category' + unless val.empty? then + cat = TermCategory.find_by_name(val) + unless (cat) + cat = TermCategory.new(:name => val, :project_id => projid) + unless (cat.save) + raise l(:error_create_term_category) + end + portinfo.cat_num += 1 + end + term['category_id'] = cat.id + end + else + term[prm] = val + end + end + unless (term.save) + raise l(:error_create_term) + end + } + rescue => evar + portinfo.err_string = evar.to_s + if (0 < line_count) + portinfo.err_string += sprintf(l(:error_csv_import_row), line_count) + end + end + end + +end diff --git a/plugins/redmine_glossary/app/helpers/glossary_styles_helper.rb b/plugins/redmine_glossary/app/helpers/glossary_styles_helper.rb new file mode 100755 index 0000000..fc9f322 --- /dev/null +++ b/plugins/redmine_glossary/app/helpers/glossary_styles_helper.rb @@ -0,0 +1,107 @@ +module GlossaryStylesHelper + + def retrieve_glossary_style + if (User.current.anonymous?) + if (session[:glossary_style]) + @glossary_style = GlossaryStyle.new(session[:glossary_style]) + end + else + if !params[:glossary_style_id].blank? + @glossary_style = GlossaryStyle.find_by(params[:glossary_style_id]) + else + @glossary_style= GlossaryStyle.find_by(:user_id => User.current.id) + end + end + + unless (@glossary_style) + @glossary_style = GlossaryStyle.new(:groupby => GlossaryStyle::GroupByCategory) + @glossary_style.user_id = User.current.id + end + + end + + def search_index_table(ary, sepcnt, proj, search_index_type = nil) + return "" if (!ary.is_a?(Array) or sepcnt <= 0) + str = '' + cnt = 0 + for ch in ary + str += '' if ((cnt != 0) and (cnt % sepcnt) == 0 ) + cnt += 1 + str += '' + end + str += '
' + if (ch and !ch.empty?) + prms = {:controller => 'glossary', :action => 'index', :project_id => proj, + :search_index_ch => ch} + prms[:search_index_type] = search_index_type if (search_index_type) + str += link_to(ch, prms) + end + str += '
' + str.html_safe + end + + def search_params + [:search_str, :search_category, :latest_days] + end + + def search_params_all + search_params + [:search_index_ch, :search_index_type] + end + + def add_search_params(prms) + search_params_all.each {|prm| + prms[prm] = params[prm] if (params[prm] and !params[prm].empty?) + } + end + + def glossary_searching? + search_params.each {|prm| + return true if (params[prm] and !params[prm].empty?) + } + return false + end + + + def authorized_projects(projscope, curproj, authcnd) + ary = [] + case projscope + when GlossaryStyle::ProjectCurrent + return [curproj] + when GlossaryStyle::ProjectMine + ary = User.current.memberships.collect(&:project).compact.uniq + when GlossaryStyle::ProjectAll + ary = Project.visible.all + end + ary.find_all {|proj| + User.current.allowed_to?(authcnd, proj) + } + end + + + def break_categories(cats) + catstrs = [] + cats.each {|cat| + catstrs << cat.name + if (cat.name.include?('/')) + str = cat.name + while (str =~ /^(.+)\/[^\/]+$/) + str = $1 + catstrs << str + end + end + } + catstrs + end + + def seach_category_options(projscope, curproj) + options = [""] + projs = authorized_projects(projscope, curproj, {:controller => :glossary, :action => :index}) + unless (projs.empty?) + querystr = projs.collect {|proj| "project_id = #{proj.id}"}.join(" OR ") + options += break_categories(TermCategory.where(querystr)).sort.uniq + end + options << "(#{l(:label_not_categorized)})" + end + + +end diff --git a/plugins/redmine_glossary/app/helpers/term_categories_helper.rb b/plugins/redmine_glossary/app/helpers/term_categories_helper.rb new file mode 100755 index 0000000..08da0d2 --- /dev/null +++ b/plugins/redmine_glossary/app/helpers/term_categories_helper.rb @@ -0,0 +1,2 @@ +module TermCategoriesHelper +end diff --git a/plugins/redmine_glossary/app/models/glossary_style.rb b/plugins/redmine_glossary/app/models/glossary_style.rb new file mode 100755 index 0000000..a57a473 --- /dev/null +++ b/plugins/redmine_glossary/app/models/glossary_style.rb @@ -0,0 +1,52 @@ +class GlossaryStyle < ActiveRecord::Base + unloadable + + GroupByNone = 0 + GroupByCategory = 1 + GroupByProject = 2 + + ProjectCurrent = 0 + ProjectMine = 1 + ProjectAll = 2 + + belongs_to :project + + attr_accessible :groupby + + def grouping? + case groupby + when GroupByCategory + return true + when GroupByProject + return (project_scope != ProjectCurrent) + end + return false + end + + def set_default! + self['show_desc'] = false + self['groupby'] = 1 + self['project_scope'] = 0 + self['sort_item_0'] = '' + self['sort_item_1'] = '' + self['sort_item_2'] = '' + end + + def sort_params + ary = [] + for cnt in 0...3 + prm = self["sort_item_#{cnt}"] + if (prm and !prm.empty?) + case prm + when 'project' + next if (groupby == GroupByProject or project_scope == ProjectCurrent) + when 'category' + next if (groupby == GroupByCategory) + end + ary << prm + end + end + ary.uniq + end + +end diff --git a/plugins/redmine_glossary/app/models/term.rb b/plugins/redmine_glossary/app/models/term.rb new file mode 100755 index 0000000..64d4d3d --- /dev/null +++ b/plugins/redmine_glossary/app/models/term.rb @@ -0,0 +1,149 @@ +class Term < ActiveRecord::Base + unloadable + + belongs_to :category, :class_name => 'TermCategory', :foreign_key => 'category_id' + belongs_to :project + belongs_to :author, :class_name => 'User', :foreign_key => 'author_id' + + validates_presence_of :name, :project + validates_length_of :name, :maximum => 255 + + acts_as_attachable + + acts_as_searchable :columns => ["#{table_name}.name", "#{table_name}.description"], + :project_key => [:project] + + acts_as_event :title => Proc.new {|o| "#{l(:glossary_title)} ##{o.id}: #{o.name}" }, + :description => Proc.new {|o| "#{o.description}"}, + :datetime => :created_on, + :type => 'terms', + :url => Proc.new {|o| {:controller => 'glossary', :action => 'show', :id => o.project, :term_id => o.id} } + + attr_accessible :project_id, :category_id, :author, :name, :name_en, :datatype, :codename, :description, + :rubi, :abbr_whole + + def author + author_id ? User.find_by_id(author_id) : nil + end + + def updater + updater_id ? User.find_by_id(updater_id) : nil + end + + def project + Project.find_by_id(project_id) + end + + def datetime + (self[:created_on] != self[:updated_on]) ? self[:updated_on] : self[:created_on] + end + + def value(prmname) + case prmname + when 'project' + (project) ? project.name : "" + when 'category' + (category) ? category : "" + when 'datetime' + datetime + else + self[prmname] + end + end + + def param_to_s(prmname) + if (prmname == 'created_on' or prmname == 'updated_on') + format_time(self[prmname]) + else + value(prmname).to_s + end + end + + def <=>(term) + id <=> term.id + end + + + def self.compare_safe(a, b, &blk) + if (!a and !b) + return 0 + elsif (!a or !b) + return -1 if a + return 1 if b + end + yield(a,b) + end + + + def self.compare_by_param(prm, a, b) + case prm + when 'project' + a.project.identifier <=> b.project.identifier + when 'category' + self.compare_safe(a.category, b.category) {|acat, bcat| + acat.position <=> bcat.position + } + when 'datetime' + self.compare_safe(a.value(prm), b.value(prm)) {|aval, bval| + (aval <=> bval) * -1 + } + when 'name' + ((a.rubi.empty?) ? a.name : a.rubi) <=> ((b.rubi.empty?) ? b.name : b.rubi) + else + self.compare_safe(a.value(prm), b.value(prm)) {|aval, bval| + aval <=> bval + } + end + end + + + + def to_s + "##{id}: #{name}" + end + + def self.find_for_macro(tname, proj, all_project = false) + if proj + term = Term.find_by(:project_id => proj.id, :name => tname) + return term if term + end + return nil unless all_project + return self.find_by_name(tname) + end + + def self.default_show_params + ['name_en', 'rubi', 'abbr_whole', 'datatype', 'codename', 'project', 'category'] + end + + def self.default_searched_params + ['name', 'name_en', 'abbr_whole', 'datatype', 'codename', 'description'] + end + + def self.default_sort_params + ['id', 'name', 'name_en', 'abbr_whole', 'datatype', 'codename', 'project', 'category', + 'datetime'] + end + + def self.hidable_params + ['name_en', 'rubi', 'abbr_whole', 'datatype', 'codename'] + end + + def self.setting_params + ['name_en', 'rubi', 'abbr_whole', 'datatype', 'codename'] + end + + def self.export_params + ['id','project', + 'name', 'name_en', 'rubi', 'abbr_whole', 'category', 'datatype', 'codename', + 'author', 'updater', 'created_on', 'updated_on', + 'description'] + end + + def self.import_params + ['name', 'name_en', 'rubi', 'abbr_whole', 'category', 'datatype', 'codename', + 'description'] + end + + + +end diff --git a/plugins/redmine_glossary/app/models/term_category.rb b/plugins/redmine_glossary/app/models/term_category.rb new file mode 100755 index 0000000..06b86cb --- /dev/null +++ b/plugins/redmine_glossary/app/models/term_category.rb @@ -0,0 +1,29 @@ +class TermCategory < ActiveRecord::Base + belongs_to :project + has_many :terms, :foreign_key => 'category_id', :dependent => :nullify + + acts_as_list :scope => :project_id + + attr_accessible :name, :project_id, :position + + validates_presence_of :name + validates_uniqueness_of :name, :scope => [:project_id] + + alias :destroy_without_reassign :destroy + + # Destroy the category + # If a category is specified, terms are reassigned to this category + def destroy(reassign_to = nil) + if reassign_to && reassign_to.is_a?(TermCategory) && reassign_to.project == self.project + Term.update_all("category_id = #{reassign_to.id}", "category_id = #{id}") + end + destroy_without_reassign + end + + def <=>(category) + position <=> category.position + end + + def to_s; name end + +end diff --git a/plugins/redmine_glossary/app/views/glossary/_add_term_category_modal.html.erb b/plugins/redmine_glossary/app/views/glossary/_add_term_category_modal.html.erb new file mode 100755 index 0000000..2838ba1 --- /dev/null +++ b/plugins/redmine_glossary/app/views/glossary/_add_term_category_modal.html.erb @@ -0,0 +1,10 @@ +

<%=l(:label_term_category_new)%>

+ +<% form = labelled_form_for @category, :as => :category, :url => { :action => 'add_term_category', :project_id => @project }, :html => {:class => 'tabular'} do |f| %> +<%= render :partial => 'term_categories/form', :locals => { :f => f } %> +

+ <%= submit_tag l(:button_create), :name => nil %> + <%= submit_tag l(:button_cancel), :name => nil, :onclick => "hideModal(this);", :type => 'button' %> +

+<% end %> +<%= form if Rails::VERSION::MAJOR >= 3 %> diff --git a/plugins/redmine_glossary/app/views/glossary/_form.html.erb b/plugins/redmine_glossary/app/views/glossary/_form.html.erb new file mode 100755 index 0000000..4a49e8b --- /dev/null +++ b/plugins/redmine_glossary/app/views/glossary/_form.html.erb @@ -0,0 +1,38 @@ + +

<%= f.text_field :name, :label=>t('label.name'), :size => 100, :required => true %>

+ +<% for prm in Term.setting_params %> + <% if param_visible?(prm) %> +

<%= f.text_field prm, :label=>label_param(prm), :size => 100 %>

+ <% end %> +<% end %> + +
+

<%= f.select :category_id, (@term_categories.collect {|c| [c.name, c.id]}), :include_blank => true %> +<% if Rails::VERSION::MAJOR >= 3 %> + <%= link_to(l(:label_term_category_new), + {:controller => 'glossary', :action => 'add_term_category', :project_id => @project.id }, + :category => 'category[name]', + :class => 'icon icon-add', + :tabindex => 199, + :method => 'get', + :remote => true) if authorize_for('glossary', 'add_term_category') %>

+<% else %> + <%= prompt_to_remote(l(:label_term_category_new), + l(:label_term_category_new), 'category[name]', + {:controller => 'glossary', :action => 'add_term_category', :project_id => @project }, + :class => 'icon icon-add', :tabindex => 199) if authorize_for('glossary', 'add_term_category') %>

+<% end %> +
+

<%= f.text_area :description, :label=>t('label.description'), + :cols => 60, + :rows => (@term.description.blank? ? 10 : [[10, @term.description.length / 50].max, 100].min), + :accesskey => accesskey(:edit), + :class => 'wiki-edit' %>

+ + + +

+

<%= render :partial => 'attachments/form' %>

+ +<%= wikitoolbar_for 'term_description' %> diff --git a/plugins/redmine_glossary/app/views/glossary/_index_in_category.html.erb b/plugins/redmine_glossary/app/views/glossary/_index_in_category.html.erb new file mode 100755 index 0000000..b4defe8 --- /dev/null +++ b/plugins/redmine_glossary/app/views/glossary/_index_in_category.html.erb @@ -0,0 +1,31 @@ + + + + +<% for prm in @show_params %> + +<% end %> + + + + +<% for term in index_in_category -%> + term"> + + +<% for prm in @show_params %> + +<% end %> + + + + +<% end %> + +
#<%=h t('label.name') %><%=h label_param(prm) %><%=h l(:field_description)%>
<%=h term.id %><%= term_link(term) %><%=h term.value(prm) %><%=textilizable term.description %> + <% if term.project_id == @project.id %> +<%= link_to_if_authorized(image_tag('edit.png'), {:action => 'edit', :project_id => @project, :id => term}, :title => l(:button_edit)) %> +<%= link_to_if_authorized(image_tag('delete.png'), {:action => 'destroy', :project_id => @project, :id => term}, :confirm => l(:text_are_you_sure), :method => :post, :title => l(:button_delete)) %> +<% end %> +
+
diff --git a/plugins/redmine_glossary/app/views/glossary/_show_all_in_category.html.erb b/plugins/redmine_glossary/app/views/glossary/_show_all_in_category.html.erb new file mode 100755 index 0000000..e767cd7 --- /dev/null +++ b/plugins/redmine_glossary/app/views/glossary/_show_all_in_category.html.erb @@ -0,0 +1,10 @@ + +<% for term in show_all_in_category -%> +
+

<%= term_link(term) %>

+<%= render(:partial => "glossary/show_one", :object => term) %> + +
+
+<% end %> +
diff --git a/plugins/redmine_glossary/app/views/glossary/_show_one.html.erb b/plugins/redmine_glossary/app/views/glossary/_show_one.html.erb new file mode 100755 index 0000000..3129d41 --- /dev/null +++ b/plugins/redmine_glossary/app/views/glossary/_show_one.html.erb @@ -0,0 +1,19 @@ + +<% term = show_one %> + +<% for prm in @show_params %> + +<% end %> +
<%=h label_param(prm) %>:<%= term.value(prm) %>
+<% unless (term.description.empty?) %> +<%=l(:field_description)%>: +
+<%= textilizable term, :description, :attachments => term.attachments %> +
+ +<% if term.attachments.any? %> + <%= (@is_index) ? "" : '
' %> + <%= link_to_attachments term %> +<% end %> +<% end %> + diff --git a/plugins/redmine_glossary/app/views/glossary/_sidebar.html.erb b/plugins/redmine_glossary/app/views/glossary/_sidebar.html.erb new file mode 100755 index 0000000..1cb7217 --- /dev/null +++ b/plugins/redmine_glossary/app/views/glossary/_sidebar.html.erb @@ -0,0 +1,44 @@ + +<% if User.current.allowed_to?(:view_terms, @project, :global => true) %> +

<%= l(:label_view) %>

+ <%= render(:partial => "glossary_styles/form", + :object => @view_style) %> +
+<% end %> + + +<% if User.current.allowed_to?(:manage_terms, @project, :global => true) %> +

<%= l(:label_term) %>

+ <%= link_to(l(:label_term_new), {:controller => 'glossary', :action => 'new', :project_id => @project}, :class => 'icon icon-add') %> +
+<% if (Term.find_by(:project_id => @project.id)) %> + <%= link_to_if_authorized(l(:label_move_all_terms), {:controller => 'glossary', :action => 'move_all', :project_id => @project}, :class => 'icon icon-move') %> +
+<% end %> + <%= link_to(l(:label_glossary_import_csv), {:controller => 'glossary', :action => 'import_csv', :project_id => @project}) %> +
+<% end %> + + +<% if User.current.allowed_to?(:manage_term_categories, @project, :global => true) %> +

<%= l(:label_term_category) %>

+ <%= link_to l(:label_term_category_new), {:controller => 'glossary', :action => 'add_term_category', :project_id => @project}, :class => 'icon icon-add' %> +
+ <%= link_to l(:label_manage_term_category), { :controller => 'term_categories', :action => 'index', :project_id => @project } %> +
+<% end %> + + +<% if User.current.allowed_to?(:view_terms, @project, :global => true) %> +

<%= l(:label_glossary_style_index) %>

+ +<% if params[:search_index_ch] %> +
+ <%= link_to_if_authorized(l(:button_clear), {:controller => 'glossary', :action => 'index_clear', :project_id => @project}, :class => 'icon icon-reload') %> +
+<% end %> + <%= search_index_table(l(:index_ary_en), l(:index_ary_en_sep_cnt), @project, 'en') %> +
+ <%= search_index_table(l(:index_ary), l(:index_ary_sep_cnt), @project) %> +
+<% end %> diff --git a/plugins/redmine_glossary/app/views/glossary/_view_term.html.erb b/plugins/redmine_glossary/app/views/glossary/_view_term.html.erb new file mode 100755 index 0000000..a57fd5e --- /dev/null +++ b/plugins/redmine_glossary/app/views/glossary/_view_term.html.erb @@ -0,0 +1,10 @@ + +<% content_for :sidebar do %> + <%= render :partial => 'glossary/sidebar' %> +<% end %> + +<% content_for :header_tags do %> + <%= stylesheet_link_tag 'glossary', :plugin => 'redmine_glossary' %> +<% end %> + +<% html_title(l(:glossary_title)) -%> diff --git a/plugins/redmine_glossary/app/views/glossary/add_term_category.html.erb b/plugins/redmine_glossary/app/views/glossary/add_term_category.html.erb new file mode 100755 index 0000000..ca6a63c --- /dev/null +++ b/plugins/redmine_glossary/app/views/glossary/add_term_category.html.erb @@ -0,0 +1,9 @@ +

<%=l(:label_term_category_new)%>

+ +<% form = labelled_form_for @category, :as => :category, :url => { :action => 'add_term_category', :project_id => @project }, :html => {:class => 'tabular'} do |f| %> + <%= render :partial => 'term_categories/form', :locals => { :f => f } %> +<%= submit_tag l(:button_create) %> +<% end %> +<%= form if Rails::VERSION::MAJOR >= 3 %> + +<% html_title(l(:glossary_title)) -%> diff --git a/plugins/redmine_glossary/app/views/glossary/add_term_category.js.erb b/plugins/redmine_glossary/app/views/glossary/add_term_category.js.erb new file mode 100755 index 0000000..2c66a75 --- /dev/null +++ b/plugins/redmine_glossary/app/views/glossary/add_term_category.js.erb @@ -0,0 +1,2 @@ +$('#ajax-modal').html('<%= escape_javascript(render :partial => 'glossary/add_term_category_modal') %>'); +showModal('ajax-modal', '600px'); diff --git a/plugins/redmine_glossary/app/views/glossary/edit.html.erb b/plugins/redmine_glossary/app/views/glossary/edit.html.erb new file mode 100755 index 0000000..ef1091c --- /dev/null +++ b/plugins/redmine_glossary/app/views/glossary/edit.html.erb @@ -0,0 +1,29 @@ +

<%= l(:label_term) %> #<%= @term.id %>

+ +<% form = labelled_form_for @term, :as => :term, + :url => {:action => 'edit', :project_id => @project, :id => @term}, + :html => {:class => 'tabular', :multipart => true, :id => 'term-form'} do |f| %> + <%= error_messages_for 'term' %> +
+ <%= render :partial => 'glossary/form', :locals => {:f => f} %> +
+ <%= submit_tag l(:button_edit) %> + <% if Rails::VERSION::MAJOR >= 3 %> + <%= preview_link({:controller => 'glossary', :action => 'preview', :project_id => @project.id }, + "term-form", + "preview") %> + <% else %> + <%= link_to_remote l(:label_preview), + { :url => { :controller => 'glossary', :action => 'preview', :project_id => @project }, + :method => 'post', + :update => 'preview', + :with => "Form.serialize('term-form')", + :complete => "Element.scrollTo('preview')" + }, :accesskey => accesskey(:preview) %> + <% end %> +<% end %> +<%= form if Rails::VERSION::MAJOR >= 3 %> + +
+ +<% html_title(l(:glossary_title)) -%> diff --git a/plugins/redmine_glossary/app/views/glossary/import_csv.html.erb b/plugins/redmine_glossary/app/views/glossary/import_csv.html.erb new file mode 100755 index 0000000..687d1f2 --- /dev/null +++ b/plugins/redmine_glossary/app/views/glossary/import_csv.html.erb @@ -0,0 +1,57 @@ +

<%=h l(:label_glossary_import_csv) %>

+ + +<% form = form_tag({:controller => 'glossary', :action => 'import_csv_exec', :project_id=>@project}, + {:multipart => true}) do %> + +<%= l(:label_csv_file) %> +<%= file_field_tag 'import_file', :accept => 'text/csv', :size => '60%' %> +
+
+<% encs = l(:in_encoding_candidates) + if (encs and encs.is_a?(Array) and !encs.empty?) + enc_options = [] + encs.each {|enc| + enc_options << enc + } + %> + <%=h l(:label_file_encoding) %> + <%= select_tag("in_encoding", options_for_select(enc_options)) %> +
+<% end %> + + +
+ +
+ +<% + name_options = [] + options = [""] + for num in 1 ... 30 + name_options << num + options << num + end +%> +
+<%= l(:label_import_items) %> + + + +<% CsvGlossaryImportInfo.default_param_cols {|prm, col| %> + +<% } %> +
<%=h l(:label_item) %><%=h l(:label_column) %>
<%=h label_param(prm) %> +<%= select_tag("colno_#{prm}", + options_for_select((prm == 'name') ? name_options : options, col)) %> +
+* <%=h l(:message_import_item) %> +
+
+ +<%= submit_tag(l(:label_import)) %> +<% end %> +<%= form if Rails::VERSION::MAJOR >= 3 %> + +<% html_title(l(:glossary_title)) -%> diff --git a/plugins/redmine_glossary/app/views/glossary/import_csv_exec.html.erb b/plugins/redmine_glossary/app/views/glossary/import_csv_exec.html.erb new file mode 100755 index 0000000..6224ebd --- /dev/null +++ b/plugins/redmine_glossary/app/views/glossary/import_csv_exec.html.erb @@ -0,0 +1,13 @@ +

<%=h l(:label_csv_import_finished) %>

+ + + + + + + +
<%=h l(:label_csv_file) %> : +<%=h (@import_info.import_file) ? @import_info.import_file.original_filename : "" %> +
<%=h l(:label_create_category_num) %> : <%= @import_info.cat_num %>
<%=h l(:label_create_term_num) %> : <%= @import_info.newterm_num %>
<%=h l(:label_update_term_num) %> : <%= @import_info.upterm_num %>
+ +<%= render :partial => 'glossary/view_term' %> diff --git a/plugins/redmine_glossary/app/views/glossary/index.html.erb b/plugins/redmine_glossary/app/views/glossary/index.html.erb new file mode 100755 index 0000000..ea2eb09 --- /dev/null +++ b/plugins/redmine_glossary/app/views/glossary/index.html.erb @@ -0,0 +1,42 @@ + +
+ <%= link_to_if_authorized(l(:label_term_new), {:controller => 'glossary', :action => 'new', :project_id => @project}, :class => 'icon icon-add') %> +
+ +<% +subtitle = "" +if params[:search_index_ch] + subtitlle = "- #{params[:search_index_ch]} -" +end %> + +

<%= t('glossary_title') %> <%= subtitlle %>

+ +
+<% if User.current.allowed_to?(:view_terms, @project, :global => true) %> + <%= render(:partial => "glossary_styles/search") %> +
+<% end %> + +<% tempname = "glossary/#{@glossary_style.show_desc ? 'show_all' : 'index'}_in_category" %> +<% unless @terms.empty? %> + <% if @glossary_style.grouping? %> + <% list_number = 1 %> + <% @terms.each do |gterms| %> +

<%= "#{list_number}. #{gterms.name}" %>

+ <% list_number += 1 %> + <%= render(:partial => tempname, :object => gterms.ary) %> + <% end %> + <% else %> + <%= render(:partial => tempname, :object => @terms) %> + <% end %> + + <% other_formats_links do |f| %> + <%= f.link_to 'CSV', :url => params %> + <% end %> + +<% else %> +

<%= l(:label_no_data) %>

+<% end %> + + +<%= render :partial => 'glossary/view_term' %> diff --git a/plugins/redmine_glossary/app/views/glossary/move_all.html.erb b/plugins/redmine_glossary/app/views/glossary/move_all.html.erb new file mode 100755 index 0000000..60cfad6 --- /dev/null +++ b/plugins/redmine_glossary/app/views/glossary/move_all.html.erb @@ -0,0 +1,22 @@ +

<%= l(:label_move_all_terms) %>

+ +<% if params[:new_project_id] %> + +<% elsif @allowed_projs.blank? %> +
+<%= simple_format(l(:error_no_movement_project)) %> +
+<% else %> +<% form = form_tag({:project_id => @project}, :id => 'move_all_form') do %> + +
+

+<%= select_tag "new_project_id", + project_tree_options_for_select(@allowed_projs) %> +

+
+<%= submit_tag l(:button_move) %> +<% end %> +<%= form if Rails::VERSION::MAJOR >= 3 %> +<% end %> + diff --git a/plugins/redmine_glossary/app/views/glossary/new.html.erb b/plugins/redmine_glossary/app/views/glossary/new.html.erb new file mode 100755 index 0000000..70c2fd8 --- /dev/null +++ b/plugins/redmine_glossary/app/views/glossary/new.html.erb @@ -0,0 +1,30 @@ +

<%=l(:label_term_new)%>

+ +<% form = labelled_form_for @term, :as => :term, + :url => {:action => 'new', :project_id => @project, :id => @term}, + :html => {:class => 'tabular', :multipart => true, :id => 'term-form'} do |f| %> + <%= error_messages_for 'term' %> +
+ <%= render :partial => 'glossary/form', :locals => {:f => f} %> +
+ <%= submit_tag l(:button_create) %> + <%= submit_tag l(:button_create_and_continue), :name => 'continue' %> + <% if Rails::VERSION::MAJOR >= 3 %> + <%= preview_link({:controller => 'glossary', :action => 'preview', :project_id => @project.id }, + "term-form", + "preview") %> + <% else %> + <%= link_to_remote l(:label_preview), + { :url => { :controller => 'glossary', :action => 'preview', :project_id => @project }, + :method => 'post', + :update => 'preview', + :with => "Form.serialize('term-form')", + :complete => "Element.scrollTo('preview')" + }, :accesskey => accesskey(:preview) %> + <% end %> +<% end %> +<%= form if Rails::VERSION::MAJOR >= 3 %> + +
+ +<% html_title(l(:glossary_title)) -%> diff --git a/plugins/redmine_glossary/app/views/glossary/show.html.erb b/plugins/redmine_glossary/app/views/glossary/show.html.erb new file mode 100755 index 0000000..a7bbd33 --- /dev/null +++ b/plugins/redmine_glossary/app/views/glossary/show.html.erb @@ -0,0 +1,29 @@ +
+<%= link_to_if_authorized(l(:button_edit), {:controller => 'glossary', :action => 'edit', :project_id => @project, :id => @term}, :class => 'icon icon-edit', :accesskey => accesskey(:edit)) %> +<%= link_to_if_authorized l(:button_delete), {:controller => 'glossary', :action => 'destroy', :project_id => @project, :id => @term}, :confirm => l(:text_are_you_sure), :method => :post, :class => 'icon icon-del' %> +
+ +

<%= l(:label_term) %> #<%= @term.id %>

+ +
+ +

<%=h @term.name %>

+<%= render(:partial => "glossary/show_one", :object => @term) %> + +

+<%= authoring @term.created_on, @term.author %>. +<% if @term.created_on != @term.updated_on + if (@term.author_id == @term.updater_id) %> + <%= l(:label_updated_time, time_tag(@term.updated_on)).html_safe + '.' %> +<% else %> + <%= updated_by(@term.updated_on, @term.updater) + '.' %> +<% end %> +<% end %> +

+ +
+ + +<%= render :partial => 'glossary/view_term' %> + +<% html_title "##{@term.id}: #{@term.name}" -%> diff --git a/plugins/redmine_glossary/app/views/glossary_styles/_form.html.erb b/plugins/redmine_glossary/app/views/glossary_styles/_form.html.erb new file mode 100755 index 0000000..9c8132b --- /dev/null +++ b/plugins/redmine_glossary/app/views/glossary_styles/_form.html.erb @@ -0,0 +1,44 @@ + +<% urlopts = {:controller => 'glossary_styles', :action => 'edit', + :project_id => @project, + :glossary_style_id => @glossary_style.id} + add_search_params(urlopts) + form = form_for @glossary_style, :url => urlopts do |f| %> + + + +
+ +<%=h l(:label_project) %> +<%= + options = [] + options << [l(:label_glossary_style_project_current), GlossaryStyle::ProjectCurrent] + options << [l(:label_glossary_style_project_mine), GlossaryStyle::ProjectMine] if User.current.logged? + options << [l(:label_glossary_style_project_all), GlossaryStyle::ProjectAll] + f.select('project_scope', options) +%> + + +
<%= l(:label_grouping) %> +<% group_labels = [:label_none, :field_category, :label_project] %> +<% for gby in [GlossaryStyle::GroupByNone, + GlossaryStyle::GroupByCategory, + GlossaryStyle::GroupByProject] %> + +<% end %> +
+ + +
<%= l(:label_sort) %> +<% for cnt in 0...2 %> + <%= cnt+1 %> : <%= params_select(f, "sort_item_#{cnt}", default_sort_params) %>
+<% end %> +
+ +<%= submit_tag l(:label_view) %> +<%= submit_tag l(:button_clear), :name => 'clear' %> + +<% end %> +<%= form if Rails::VERSION::MAJOR >= 3 %> diff --git a/plugins/redmine_glossary/app/views/glossary_styles/_search.html.erb b/plugins/redmine_glossary/app/views/glossary_styles/_search.html.erb new file mode 100755 index 0000000..bda23a7 --- /dev/null +++ b/plugins/redmine_glossary/app/views/glossary_styles/_search.html.erb @@ -0,0 +1,46 @@ + +<% form = form_tag({:controller => 'glossary_styles', :action => 'search', :project_id => @project}, + {:method => 'get', :id=>'search_form'} + ) do %> +<%= hidden_field_tag 'project_id', @project.id.to_s %> + + +<% end %> +<%= form if Rails::VERSION::MAJOR >= 3 %> + diff --git a/plugins/redmine_glossary/app/views/glossary_styles/edit.html.erb b/plugins/redmine_glossary/app/views/glossary_styles/edit.html.erb new file mode 100755 index 0000000..4d3d106 --- /dev/null +++ b/plugins/redmine_glossary/app/views/glossary_styles/edit.html.erb @@ -0,0 +1 @@ +

GlossaryStyles#edit

diff --git a/plugins/redmine_glossary/app/views/settings/_glossary_settings.html.erb b/plugins/redmine_glossary/app/views/settings/_glossary_settings.html.erb new file mode 100755 index 0000000..97fc58b --- /dev/null +++ b/plugins/redmine_glossary/app/views/settings/_glossary_settings.html.erb @@ -0,0 +1,12 @@ + +

<%= t('label_hide_item') %>

+ +<% for item in Term.hidable_params %> + <% name = "hide_item_#{item}" %> + +<% end %> +
+ <%= check_box_tag("settings[#{name}]", 1, @settings[name]) %> + + <%= t("label.#{item}") %> +
diff --git a/plugins/redmine_glossary/app/views/term_categories/_form.html.erb b/plugins/redmine_glossary/app/views/term_categories/_form.html.erb new file mode 100755 index 0000000..d843f74 --- /dev/null +++ b/plugins/redmine_glossary/app/views/term_categories/_form.html.erb @@ -0,0 +1,5 @@ +<%= error_messages_for 'category' %> + +
+

<%= f.text_field :name, :size => 30, :required => true %>

+
diff --git a/plugins/redmine_glossary/app/views/term_categories/destroy.html.erb b/plugins/redmine_glossary/app/views/term_categories/destroy.html.erb new file mode 100755 index 0000000..f7f1b53 --- /dev/null +++ b/plugins/redmine_glossary/app/views/term_categories/destroy.html.erb @@ -0,0 +1,19 @@ +

<%=l(:label_term_category)%>: <%=h @category.name %>

+ +<% form = form_tag({}) do %> +
+

<%= l(:text_term_category_destroy_question, :value => @term_count) %>

+


+<% if @categories.size > 0 %> +: +<%= select_tag 'reassign_to_id', options_from_collection_for_select(@categories, 'id', 'name') %>

+<% end %> +<%= hidden_field_tag 'id', @category.id %> +
+ +<%= submit_tag l(:button_apply) %> +<%= link_to l(:button_cancel), :controller => 'term_categories', :action => 'index', :project_id => @project %> +<% end %> +<%= form if Rails::VERSION::MAJOR >= 3 %> + +<% html_title(l(:glossary_title)) -%> diff --git a/plugins/redmine_glossary/app/views/term_categories/edit.html.erb b/plugins/redmine_glossary/app/views/term_categories/edit.html.erb new file mode 100755 index 0000000..3e21c1c --- /dev/null +++ b/plugins/redmine_glossary/app/views/term_categories/edit.html.erb @@ -0,0 +1,9 @@ +

<%=l(:label_term_category)%>

+ +<% form = labelled_form_for @category, :as => :category, :url => { :action => 'edit', :project_id => @project, :id => @category }, :html => {:class => 'tabular'} do |f| %> +<%= render :partial => 'term_categories/form', :locals => { :f => f } %> +<%= submit_tag l(:button_save) %> +<% end %> +<%= form if Rails::VERSION::MAJOR >= 3 %> + +<% html_title(l(:glossary_title)) -%> diff --git a/plugins/redmine_glossary/app/views/term_categories/index.html.erb b/plugins/redmine_glossary/app/views/term_categories/index.html.erb new file mode 100755 index 0000000..5e6ddf7 --- /dev/null +++ b/plugins/redmine_glossary/app/views/term_categories/index.html.erb @@ -0,0 +1,44 @@ +
+ <%= link_to_if_authorized(l(:label_term_category_new), {:controller => 'glossary', :action => 'add_term_category', :project_id => @project}, :class => 'icon icon-add') %> +
+ + +

<%= l(:label_term_category) %>

+ +<% if @categories.any? %> + + + + + + + + + + <% for category in @categories %> + <% unless category.new_record? %> + + + + + + + + <% end %> + <% end %> + +
#<%= l(:field_name) %><%= l(:field_term_counts_under_category) %>
<%=category.position%><%=h(category.name) %><%=h(category.terms.size) %> + <% if authorize_for("term_categories", "edit") %> + <%= link_to image_tag('2uparrow.png', :alt => l(:label_sort_highest)), {:controller => 'term_categories', :action => 'change_order', :project_id => @project, :id => category, :position => 'highest'}, :method => :post, :title => l(:label_sort_highest) %> + <%= link_to image_tag('1uparrow.png', :alt => l(:label_sort_higher)), {:controller => 'term_categories', :action => 'change_order', :project_id => @project, :id => category, :position => 'higher'}, :method => :post, :title => l(:label_sort_higher) %> - + <%= link_to image_tag('1downarrow.png', :alt => l(:label_sort_lower)), {:controller => 'term_categories', :action => 'change_order', :project_id => @project, :id => category, :position => 'lower'}, :method => :post, :title => l(:label_sort_lower) %> + <%= link_to image_tag('2downarrow.png', :alt => l(:label_sort_lowest)), {:controller => 'term_categories', :action => 'change_order', :project_id => @project, :id => category, :position => 'lowest'}, :method => :post, :title => l(:label_sort_lowest) %> + <% end %> + + <%= link_to_if_authorized(image_tag('edit.png'), { :action => 'edit', :controller => 'term_categories', :project_id => @project, :id => category }, :title => l(:button_edit)) %> + <%= link_to_if_authorized(image_tag('delete.png'), {:action => 'destroy', :controller => 'term_categories', :project_id => @project, :id => category}, :method => :post, :title => l(:button_delete)) %>
+<% else %> +

<%= l(:label_no_data) %>

+<% end %> + +<%= render :partial => 'glossary/view_term' %> diff --git a/plugins/redmine_glossary/assets/images/termlink.png b/plugins/redmine_glossary/assets/images/termlink.png new file mode 100755 index 0000000000000000000000000000000000000000..721cd0c8200a45047d9997a075e3cf02bc6c9b74 GIT binary patch literal 412 zcmV;N0b~A&P)optcEEEbTm&+K9M*aX06M59q&9DxGq8s|oIO