| @@ -0,0 +1,76 @@ | |||||
| /* | |||||
| * @Description: Do not edit | |||||
| * @Date: 2021-08-31 11:16:45 | |||||
| * @LastEditors: viletyy | |||||
| * @Author: viletyy | |||||
| * @LastEditTime: 2021-08-31 14:19:46 | |||||
| * @FilePath: /forgeplus/app/assets/javascripts/admins/system_notifications/index.js | |||||
| */ | |||||
| $(document).on('turbolinks:load', function(){ | |||||
| var showSuccessNotify = function() { | |||||
| $.notify({ | |||||
| message: '操作成功' | |||||
| },{ | |||||
| type: 'success' | |||||
| }); | |||||
| } | |||||
| // close user | |||||
| $('.system-notification-list-container').on('click', '.close-action', function(){ | |||||
| var $closeAction = $(this); | |||||
| var $uncloseAction = $closeAction.siblings('.unclose-action'); | |||||
| var keywordID = $closeAction.data('id'); | |||||
| customConfirm({ | |||||
| content: '确认取消置顶吗?', | |||||
| ok: function(){ | |||||
| $.ajax({ | |||||
| url: '/admins/system_notifications/' + keywordID, | |||||
| method: 'PUT', | |||||
| dataType: 'json', | |||||
| data: { | |||||
| system_notification: { | |||||
| is_top: false | |||||
| } | |||||
| }, | |||||
| success: function() { | |||||
| showSuccessNotify(); | |||||
| $closeAction.hide(); | |||||
| $uncloseAction.show(); | |||||
| $(".system-notification-item-"+keywordID).children('td').eq(3).text("") | |||||
| } | |||||
| }); | |||||
| } | |||||
| }); | |||||
| }); | |||||
| // unclose user | |||||
| $('.system-notification-list-container').on('click', '.unclose-action', function(){ | |||||
| var $uncloseAction = $(this); | |||||
| var $closeAction = $uncloseAction.siblings('.close-action'); | |||||
| var keywordID = $uncloseAction.data('id'); | |||||
| customConfirm({ | |||||
| content: '确认置顶吗?', | |||||
| ok: function () { | |||||
| $.ajax({ | |||||
| url: '/admins/system_notifications/' + keywordID, | |||||
| method: 'PUT', | |||||
| dataType: 'json', | |||||
| data: { | |||||
| system_notification: { | |||||
| is_top: true | |||||
| } | |||||
| }, | |||||
| success: function() { | |||||
| showSuccessNotify(); | |||||
| $closeAction.show(); | |||||
| $uncloseAction.hide(); | |||||
| $(".system-notification-item-"+keywordID).children('td').eq(3).text("√") | |||||
| } | |||||
| }); | |||||
| } | |||||
| }) | |||||
| }); | |||||
| }) | |||||
| @@ -0,0 +1,71 @@ | |||||
| class Admins::SystemNotificationsController < Admins::BaseController | |||||
| before_action :get_notification, only: [:history, :edit,:update, :destroy] | |||||
| # before_action :validate_identifer, only: [:create, :update] | |||||
| def index | |||||
| sort_by = SystemNotification.column_names.include?(params[:sort_by]) ? params[:sort_by] : 'created_at' | |||||
| sort_direction = %w(desc asc).include?(params[:sort_direction]) ? params[:sort_direction] : 'desc' | |||||
| q = SystemNotification.ransack(subject_cont: params[:search]) | |||||
| notifications = q.result(distinct: true).reorder("#{sort_by} #{sort_direction},created_at desc") | |||||
| @notifications = paginate(notifications) | |||||
| end | |||||
| def new | |||||
| @notification = SystemNotification.new | |||||
| end | |||||
| def edit | |||||
| end | |||||
| def create | |||||
| @notification = SystemNotification.new(notification_params) | |||||
| if @notification.save | |||||
| redirect_to admins_system_notifications_path | |||||
| flash[:success] = '系统消息创建成功' | |||||
| else | |||||
| redirect_to admins_system_notifications_path | |||||
| flash[:danger] = @notification.errors.full_messages.join(",") | |||||
| end | |||||
| end | |||||
| def update | |||||
| respond_to do |format| | |||||
| if @notification.update_attributes(notification_params) | |||||
| format.html do | |||||
| redirect_to admins_system_notifications_path | |||||
| flash[:success] = '系统消息更新成功' | |||||
| end | |||||
| format.js {render_ok} | |||||
| else | |||||
| format.html do | |||||
| redirect_to admins_system_notifications_path | |||||
| flash[:danger] = @notification.errors.full_messages.join(",") | |||||
| end | |||||
| format.js {render_js_error} | |||||
| end | |||||
| end | |||||
| end | |||||
| def destroy | |||||
| if @notification.destroy | |||||
| redirect_to admins_system_notifications_path | |||||
| flash[:success] = "系统消息删除成功" | |||||
| else | |||||
| redirect_to admins_system_notifications_path | |||||
| flash[:danger] = "系统消息删除失败" | |||||
| end | |||||
| end | |||||
| private | |||||
| def notification_params | |||||
| params.require(:system_notification).permit! | |||||
| end | |||||
| def get_notification | |||||
| @notification = SystemNotification.find_by(id: params[:id]) | |||||
| unless @notification.present? | |||||
| redirect_to admins_system_notifications_path | |||||
| flash[:danger] = "系统消息不存在" | |||||
| end | |||||
| end | |||||
| end | |||||
| @@ -111,8 +111,8 @@ class IssuesController < ApplicationController | |||||
| Issues::CreateForm.new({subject:issue_params[:subject]}).validate! | Issues::CreateForm.new({subject:issue_params[:subject]}).validate! | ||||
| @issue = Issue.new(issue_params) | @issue = Issue.new(issue_params) | ||||
| if @issue.save! | if @issue.save! | ||||
| SendTemplateMessageJob.perform_later('IssueAssigned', current_user.id, @issue&.id) | |||||
| SendTemplateMessageJob.perform_later('ProjectIssue', current_user.id, @issue&.id) | |||||
| SendTemplateMessageJob.perform_later('IssueAssigned', current_user.id, @issue&.id) if Site.has_notice_menu? | |||||
| SendTemplateMessageJob.perform_later('ProjectIssue', current_user.id, @issue&.id) if Site.has_notice_menu? | |||||
| if params[:attachment_ids].present? | if params[:attachment_ids].present? | ||||
| params[:attachment_ids].each do |id| | params[:attachment_ids].each do |id| | ||||
| attachment = Attachment.select(:id, :container_id, :container_type)&.find_by_id(id) | attachment = Attachment.select(:id, :container_id, :container_type)&.find_by_id(id) | ||||
| @@ -206,8 +206,8 @@ class IssuesController < ApplicationController | |||||
| Issues::UpdateForm.new({subject:issue_params[:subject]}).validate! | Issues::UpdateForm.new({subject:issue_params[:subject]}).validate! | ||||
| if @issue.update_attributes(issue_params) | if @issue.update_attributes(issue_params) | ||||
| if @issue&.pull_request.present? | if @issue&.pull_request.present? | ||||
| SendTemplateMessageJob.perform_later('PullRequestChanged', current_user.id, @issue&.pull_request&.id, @issue.previous_changes.slice(:assigned_to_id, :priority_id, :fixed_version_id, :issue_tags_value)) | |||||
| SendTemplateMessageJob.perform_later('PullRequestAssigned', current_user.id, @issue&.pull_request&.id ) if @issue.previous_changes[:assigned_to_id].present? | |||||
| SendTemplateMessageJob.perform_later('PullRequestChanged', current_user.id, @issue&.pull_request&.id, @issue.previous_changes.slice(:assigned_to_id, :priority_id, :fixed_version_id, :issue_tags_value)) if Site.has_notice_menu? | |||||
| SendTemplateMessageJob.perform_later('PullRequestAssigned', current_user.id, @issue&.pull_request&.id ) if @issue.previous_changes[:assigned_to_id].present? && Site.has_notice_menu? | |||||
| else | else | ||||
| previous_changes = @issue.previous_changes.slice(:status_id, :assigned_to_id, :tracker_id, :priority_id, :fixed_version_id, :done_ratio, :issue_tags_value, :branch_name) | previous_changes = @issue.previous_changes.slice(:status_id, :assigned_to_id, :tracker_id, :priority_id, :fixed_version_id, :done_ratio, :issue_tags_value, :branch_name) | ||||
| if @issue.previous_changes[:start_date].present? | if @issue.previous_changes[:start_date].present? | ||||
| @@ -222,8 +222,8 @@ class IssuesController < ApplicationController | |||||
| if @issue.previous_changes[:status_id].present? && @issue.previous_changes[:status_id][0] == 5 | if @issue.previous_changes[:status_id].present? && @issue.previous_changes[:status_id][0] == 5 | ||||
| @issue.project_trends.where(action_type: ProjectTrend::CLOSE).destroy_all | @issue.project_trends.where(action_type: ProjectTrend::CLOSE).destroy_all | ||||
| end | end | ||||
| SendTemplateMessageJob.perform_later('IssueChanged', current_user.id, @issue&.id, previous_changes) | |||||
| SendTemplateMessageJob.perform_later('IssueAssigned', current_user.id, @issue&.id) if @issue.previous_changes[:assigned_to_id].present? | |||||
| SendTemplateMessageJob.perform_later('IssueChanged', current_user.id, @issue&.id, previous_changes) if Site.has_notice_menu? | |||||
| SendTemplateMessageJob.perform_later('IssueAssigned', current_user.id, @issue&.id) if @issue.previous_changes[:assigned_to_id].present? && Site.has_notice_menu? | |||||
| end | end | ||||
| if params[:status_id].to_i == 5 #任务由非关闭状态到关闭状态时 | if params[:status_id].to_i == 5 #任务由非关闭状态到关闭状态时 | ||||
| @issue.issue_times.update_all(end_time: Time.now) | @issue.issue_times.update_all(end_time: Time.now) | ||||
| @@ -276,7 +276,7 @@ class IssuesController < ApplicationController | |||||
| status_id = @issue.status_id | status_id = @issue.status_id | ||||
| token = @issue.token | token = @issue.token | ||||
| login = @issue.user.try(:login) | login = @issue.user.try(:login) | ||||
| SendTemplateMessageJob.perform_later('IssueDeleted', current_user.id, @issue&.subject, @issue.assigned_to_id, @issue.author_id) | |||||
| SendTemplateMessageJob.perform_later('IssueDeleted', current_user.id, @issue&.subject, @issue.assigned_to_id, @issue.author_id) if Site.has_notice_menu? | |||||
| if @issue.destroy | if @issue.destroy | ||||
| if issue_type == "2" && status_id != 5 | if issue_type == "2" && status_id != 5 | ||||
| post_to_chain("add", token, login) | post_to_chain("add", token, login) | ||||
| @@ -299,7 +299,7 @@ class IssuesController < ApplicationController | |||||
| issues = Issue.where(id: issue_ids, issue_type: "1") | issues = Issue.where(id: issue_ids, issue_type: "1") | ||||
| if issues.present? | if issues.present? | ||||
| issues.find_each do |i| | issues.find_each do |i| | ||||
| SendTemplateMessageJob.perform_later('IssueDeleted', current_user.id, i&.subject, i.assigned_to_id, i.author_id) | |||||
| SendTemplateMessageJob.perform_later('IssueDeleted', current_user.id, i&.subject, i.assigned_to_id, i.author_id) if Site.has_notice_menu? | |||||
| end | end | ||||
| if issues.destroy_all | if issues.destroy_all | ||||
| normal_status(0, "删除成功") | normal_status(0, "删除成功") | ||||
| @@ -350,8 +350,8 @@ class IssuesController < ApplicationController | |||||
| if i.previous_changes[:status_id].present? && i.previous_changes[:status_id][0] == 5 | if i.previous_changes[:status_id].present? && i.previous_changes[:status_id][0] == 5 | ||||
| i.project_trends.where(action_type: ProjectTrend::CLOSE).destroy_all | i.project_trends.where(action_type: ProjectTrend::CLOSE).destroy_all | ||||
| end | end | ||||
| SendTemplateMessageJob.perform_later('IssueChanged', current_user.id, i&.id, previous_changes) | |||||
| SendTemplateMessageJob.perform_later('IssueAssigned', current_user.id, i&.id) if i.previous_changes[:assigned_to_id].present? | |||||
| SendTemplateMessageJob.perform_later('IssueChanged', current_user.id, i&.id, previous_changes) if Site.has_notice_menu? | |||||
| SendTemplateMessageJob.perform_later('IssueAssigned', current_user.id, i&.id) if i.previous_changes[:assigned_to_id].present? && Site.has_notice_menu? | |||||
| end | end | ||||
| normal_status(0, "批量更新成功") | normal_status(0, "批量更新成功") | ||||
| else | else | ||||
| @@ -366,8 +366,8 @@ class IssuesController < ApplicationController | |||||
| @new_issue = @issue.dup | @new_issue = @issue.dup | ||||
| @new_issue.author_id = current_user.id | @new_issue.author_id = current_user.id | ||||
| if @new_issue.save | if @new_issue.save | ||||
| SendTemplateMessageJob.perform_later('IssueAssigned', current_user.id, @new_issue&.id) | |||||
| SendTemplateMessageJob.perform_later('ProjectIssue', current_user.id, @new_issue&.id) | |||||
| SendTemplateMessageJob.perform_later('IssueAssigned', current_user.id, @new_issue&.id) if Site.has_notice_menu? | |||||
| SendTemplateMessageJob.perform_later('ProjectIssue', current_user.id, @new_issue&.id) if Site.has_notice_menu? | |||||
| issue_tags = @issue.issue_tags.pluck(:id) | issue_tags = @issue.issue_tags.pluck(:id) | ||||
| if issue_tags.present? | if issue_tags.present? | ||||
| issue_tags.each do |tag| | issue_tags.each do |tag| | ||||
| @@ -9,8 +9,8 @@ class MembersController < ApplicationController | |||||
| def create | def create | ||||
| interactor = Projects::AddMemberInteractor.call(@project.owner, @project, @user) | interactor = Projects::AddMemberInteractor.call(@project.owner, @project, @user) | ||||
| SendTemplateMessageJob.perform_later('ProjectJoined', current_user.id, @user.id, @project.id) | |||||
| SendTemplateMessageJob.perform_later('ProjectMemberJoined', current_user.id, @user.id, @project.id) | |||||
| SendTemplateMessageJob.perform_later('ProjectJoined', current_user.id, @user.id, @project.id) if Site.has_notice_menu? | |||||
| SendTemplateMessageJob.perform_later('ProjectMemberJoined', current_user.id, @user.id, @project.id) if Site.has_notice_menu? | |||||
| render_response(interactor) | render_response(interactor) | ||||
| rescue Exception => e | rescue Exception => e | ||||
| uid_logger_error(e.message) | uid_logger_error(e.message) | ||||
| @@ -30,8 +30,8 @@ class MembersController < ApplicationController | |||||
| def remove | def remove | ||||
| interactor = Projects::DeleteMemberInteractor.call(@project.owner, @project, @user) | interactor = Projects::DeleteMemberInteractor.call(@project.owner, @project, @user) | ||||
| SendTemplateMessageJob.perform_later('ProjectLeft', current_user.id, @user.id, @project.id) | |||||
| SendTemplateMessageJob.perform_later('ProjectMemberLeft', current_user.id, @user.id, @project.id) | |||||
| SendTemplateMessageJob.perform_later('ProjectLeft', current_user.id, @user.id, @project.id) if Site.has_notice_menu? | |||||
| SendTemplateMessageJob.perform_later('ProjectMemberLeft', current_user.id, @user.id, @project.id) if Site.has_notice_menu? | |||||
| render_response(interactor) | render_response(interactor) | ||||
| rescue Exception => e | rescue Exception => e | ||||
| uid_logger_error(e.message) | uid_logger_error(e.message) | ||||
| @@ -40,7 +40,7 @@ class MembersController < ApplicationController | |||||
| def change_role | def change_role | ||||
| interactor = Projects::ChangeMemberRoleInteractor.call(@project.owner, @project, @user, params[:role]) | interactor = Projects::ChangeMemberRoleInteractor.call(@project.owner, @project, @user, params[:role]) | ||||
| SendTemplateMessageJob.perform_later('ProjectRole', current_user.id, @user.id, @project.id, message_role_name) | |||||
| SendTemplateMessageJob.perform_later('ProjectRole', current_user.id, @user.id, @project.id, message_role_name) if Site.has_notice_menu? | |||||
| render_response(interactor) | render_response(interactor) | ||||
| rescue Exception => e | rescue Exception => e | ||||
| uid_logger_error(e.message) | uid_logger_error(e.message) | ||||
| @@ -18,7 +18,7 @@ class Organizations::TeamUsersController < Organizations::BaseController | |||||
| ActiveRecord::Base.transaction do | ActiveRecord::Base.transaction do | ||||
| @team_user = TeamUser.build(@organization.id, @operate_user.id, @team.id) | @team_user = TeamUser.build(@organization.id, @operate_user.id, @team.id) | ||||
| @organization_user = OrganizationUser.build(@organization.id, @operate_user.id) | @organization_user = OrganizationUser.build(@organization.id, @operate_user.id) | ||||
| SendTemplateMessageJob.perform_later('OrganizationRole', @operate_user.id, @organization.id, @team.authorize_name) | |||||
| SendTemplateMessageJob.perform_later('OrganizationRole', @operate_user.id, @organization.id, @team.authorize_name) if Site.has_notice_menu? | |||||
| Gitea::Organization::TeamUser::CreateService.call(@organization.gitea_token, @team.gtid, @operate_user.login) | Gitea::Organization::TeamUser::CreateService.call(@organization.gitea_token, @team.gtid, @operate_user.login) | ||||
| end | end | ||||
| rescue Exception => e | rescue Exception => e | ||||
| @@ -7,7 +7,7 @@ class Projects::ProjectUnitsController < Projects::BaseController | |||||
| if current_user.admin? || @project.manager?(current_user) | if current_user.admin? || @project.manager?(current_user) | ||||
| ActiveRecord::Base.transaction do | ActiveRecord::Base.transaction do | ||||
| before_units, after_units = ProjectUnit.update_by_unit_types!(@project, unit_types) | before_units, after_units = ProjectUnit.update_by_unit_types!(@project, unit_types) | ||||
| SendTemplateMessageJob.perform_later('ProjectSettingChanged', current_user.id, @project&.id, {navbar: true}) unless before_units.eql?(after_units) | |||||
| SendTemplateMessageJob.perform_later('ProjectSettingChanged', current_user.id, @project&.id, {navbar: true}) unless before_units.eql?(after_units) if Site.has_notice_menu? | |||||
| render_ok | render_ok | ||||
| end | end | ||||
| else | else | ||||
| @@ -145,7 +145,7 @@ class ProjectsController < ApplicationController | |||||
| gitea_repo = Gitea::Repository::UpdateService.call(@owner, @project&.repository&.identifier, gitea_params) | gitea_repo = Gitea::Repository::UpdateService.call(@owner, @project&.repository&.identifier, gitea_params) | ||||
| @project.repository.update_attributes({hidden: gitea_repo["private"], identifier: gitea_repo["name"]}) | @project.repository.update_attributes({hidden: gitea_repo["private"], identifier: gitea_repo["name"]}) | ||||
| end | end | ||||
| SendTemplateMessageJob.perform_later('ProjectSettingChanged', current_user.id, @project&.id, @project.previous_changes.slice(:name, :description, :project_category_id, :project_language_id, :is_public)) | |||||
| SendTemplateMessageJob.perform_later('ProjectSettingChanged', current_user.id, @project&.id, @project.previous_changes.slice(:name, :description, :project_category_id, :project_language_id, :is_public)) if Site.has_notice_menu? | |||||
| end | end | ||||
| rescue Exception => e | rescue Exception => e | ||||
| uid_logger_error(e.message) | uid_logger_error(e.message) | ||||
| @@ -59,8 +59,8 @@ class PullRequestsController < ApplicationController | |||||
| @pull_request, @gitea_pull_request = PullRequests::CreateService.call(current_user, @owner, @project, params) | @pull_request, @gitea_pull_request = PullRequests::CreateService.call(current_user, @owner, @project, params) | ||||
| if @gitea_pull_request[:status] == :success | if @gitea_pull_request[:status] == :success | ||||
| @pull_request.bind_gitea_pull_request!(@gitea_pull_request[:body]["number"], @gitea_pull_request[:body]["id"]) | @pull_request.bind_gitea_pull_request!(@gitea_pull_request[:body]["number"], @gitea_pull_request[:body]["id"]) | ||||
| SendTemplateMessageJob.perform_later('PullRequestAssigned', current_user.id, @pull_request&.id) | |||||
| SendTemplateMessageJob.perform_later('ProjectPullRequest', current_user.id, @pull_request&.id) | |||||
| SendTemplateMessageJob.perform_later('PullRequestAssigned', current_user.id, @pull_request&.id) if Site.has_notice_menu? | |||||
| SendTemplateMessageJob.perform_later('ProjectPullRequest', current_user.id, @pull_request&.id) if Site.has_notice_menu? | |||||
| else | else | ||||
| render_error("create pull request error: #{@gitea_pull_request[:status]}") | render_error("create pull request error: #{@gitea_pull_request[:status]}") | ||||
| raise ActiveRecord::Rollback | raise ActiveRecord::Rollback | ||||
| @@ -118,8 +118,8 @@ class PullRequestsController < ApplicationController | |||||
| normal_status(-1, e.message) | normal_status(-1, e.message) | ||||
| raise ActiveRecord::Rollback | raise ActiveRecord::Rollback | ||||
| end | end | ||||
| SendTemplateMessageJob.perform_later('PullRequestChanged', current_user.id, @pull_request&.id, @issue.previous_changes.slice(:assigned_to_id, :priority_id, :fixed_version_id, :issue_tags_value)) | |||||
| SendTemplateMessageJob.perform_later('PullRequestAssigned', current_user.id, @pull_request&.id ) if @issue.previous_changes[:assigned_to_id].present? | |||||
| SendTemplateMessageJob.perform_later('PullRequestChanged', current_user.id, @pull_request&.id, @issue.previous_changes.slice(:assigned_to_id, :priority_id, :fixed_version_id, :issue_tags_value)) if Site.has_notice_menu? | |||||
| SendTemplateMessageJob.perform_later('PullRequestAssigned', current_user.id, @pull_request&.id ) if @issue.previous_changes[:assigned_to_id].present? && Site.has_notice_menu? | |||||
| end | end | ||||
| end | end | ||||
| @@ -131,7 +131,7 @@ class PullRequestsController < ApplicationController | |||||
| colsed = PullRequests::CloseService.call(@owner, @repository, @pull_request, current_user) | colsed = PullRequests::CloseService.call(@owner, @repository, @pull_request, current_user) | ||||
| if colsed === true | if colsed === true | ||||
| @pull_request.project_trends.create!(user: current_user, project: @project,action_type: ProjectTrend::CLOSE) | @pull_request.project_trends.create!(user: current_user, project: @project,action_type: ProjectTrend::CLOSE) | ||||
| SendTemplateMessageJob.perform_later('PullRequestClosed', current_user.id, @pull_request.id) | |||||
| SendTemplateMessageJob.perform_later('PullRequestClosed', current_user.id, @pull_request.id) if Site.has_notice_menu? | |||||
| normal_status(1, "已拒绝") | normal_status(1, "已拒绝") | ||||
| else | else | ||||
| normal_status(-1, '合并失败') | normal_status(-1, '合并失败') | ||||
| @@ -175,7 +175,7 @@ class PullRequestsController < ApplicationController | |||||
| # @pull_request.project_trend_status! | # @pull_request.project_trend_status! | ||||
| @pull_request.project_trends.create!(user: current_user, project: @project,action_type: ProjectTrend::MERGE) | @pull_request.project_trends.create!(user: current_user, project: @project,action_type: ProjectTrend::MERGE) | ||||
| @issue&.custom_journal_detail("merge", "", "该合并请求已被合并", current_user&.id) | @issue&.custom_journal_detail("merge", "", "该合并请求已被合并", current_user&.id) | ||||
| SendTemplateMessageJob.perform_later('PullRequestMerged', current_user.id, @pull_request.id) | |||||
| SendTemplateMessageJob.perform_later('PullRequestMerged', current_user.id, @pull_request.id) if Site.has_notice_menu? | |||||
| normal_status(1, "合并成功") | normal_status(1, "合并成功") | ||||
| else | else | ||||
| normal_status(-1, result.message) | normal_status(-1, result.message) | ||||
| @@ -4,7 +4,7 @@ class SettingsController < ApplicationController | |||||
| get_add_menu | get_add_menu | ||||
| get_common_menu | get_common_menu | ||||
| get_personal_menu | get_personal_menu | ||||
| get_top_system_notification | |||||
| end | end | ||||
| private | private | ||||
| @@ -40,6 +40,10 @@ class SettingsController < ApplicationController | |||||
| end | end | ||||
| end | end | ||||
| def get_top_system_notification | |||||
| @top_system_notification = SystemNotification.is_top.first | |||||
| end | |||||
| def get_site_url(key, value) | def get_site_url(key, value) | ||||
| key.to_s === "url" ? append_http(reset_site_url(value)) : reset_site_url(value) | key.to_s === "url" ? append_http(reset_site_url(value)) : reset_site_url(value) | ||||
| end | end | ||||
| @@ -18,16 +18,16 @@ class Users::MessagesController < Users::BaseController | |||||
| Notice::Write::CreateAtmeForm.new(atme_params).validate! | Notice::Write::CreateAtmeForm.new(atme_params).validate! | ||||
| case atme_params[:atmeable_type] | case atme_params[:atmeable_type] | ||||
| when 'Issue' | when 'Issue' | ||||
| SendTemplateMessageJob.perform_now('IssueAtme', @receivers, current_user.id, atme_params[:atmeable_id]) | |||||
| SendTemplateMessageJob.perform_now('IssueAtme', @receivers, current_user.id, atme_params[:atmeable_id]) if Site.has_notice_menu? | |||||
| when 'PullRequest' | when 'PullRequest' | ||||
| SendTemplateMessageJob.perform_now('PullRequestAtme', @receivers, current_user.id, atme_params[:atmeable_id]) | |||||
| SendTemplateMessageJob.perform_now('PullRequestAtme', @receivers, current_user.id, atme_params[:atmeable_id]) if Site.has_notice_menu? | |||||
| when 'Journal' | when 'Journal' | ||||
| journal = Journal.find_by_id(atme_params[:atmeable_id]) | journal = Journal.find_by_id(atme_params[:atmeable_id]) | ||||
| if journal.present? | if journal.present? | ||||
| if journal&.issue&.pull_request.present? | if journal&.issue&.pull_request.present? | ||||
| SendTemplateMessageJob.perform_now('PullRequestAtme', @receivers, current_user.id, atme_params[:atmeable_id]) | |||||
| SendTemplateMessageJob.perform_now('PullRequestAtme', @receivers, current_user.id, atme_params[:atmeable_id]) if Site.has_notice_menu? | |||||
| else | else | ||||
| SendTemplateMessageJob.perform_now('IssueAtme', @receivers, current_user.id, atme_params[:atmeable_id]) | |||||
| SendTemplateMessageJob.perform_now('IssueAtme', @receivers, current_user.id, atme_params[:atmeable_id]) if Site.has_notice_menu? | |||||
| end | end | ||||
| end | end | ||||
| end | end | ||||
| @@ -3,8 +3,8 @@ class DelayExpiredIssueJob < ApplicationJob | |||||
| def perform | def perform | ||||
| Issue.where(due_date: Date.today + 1.days).find_each do |issue| | Issue.where(due_date: Date.today + 1.days).find_each do |issue| | ||||
| SendTemplateMessageJob.perform_later('IssueAssignerExpire', issue.id) | |||||
| SendTemplateMessageJob.perform_later('IssueCreatorExpire', issue.id) | |||||
| SendTemplateMessageJob.perform_later('IssueAssignerExpire', issue.id) if Site.has_notice_menu? | |||||
| SendTemplateMessageJob.perform_later('IssueCreatorExpire', issue.id) if Site.has_notice_menu? | |||||
| end | end | ||||
| end | end | ||||
| @@ -36,10 +36,10 @@ class OrganizationUser < ApplicationRecord | |||||
| end | end | ||||
| def send_create_message_to_notice_system | def send_create_message_to_notice_system | ||||
| SendTemplateMessageJob.perform_later('OrganizationJoined', self.user_id, self.organization_id) | |||||
| SendTemplateMessageJob.perform_later('OrganizationJoined', self.user_id, self.organization_id) if Site.has_notice_menu? | |||||
| end | end | ||||
| def send_destroy_message_to_notice_system | def send_destroy_message_to_notice_system | ||||
| SendTemplateMessageJob.perform_later('OrganizationLeft', self.user_id, self.organization_id) | |||||
| SendTemplateMessageJob.perform_later('OrganizationLeft', self.user_id, self.organization_id) if Site.has_notice_menu? | |||||
| end | end | ||||
| end | end | ||||
| @@ -26,6 +26,10 @@ class Site < ApplicationRecord | |||||
| set_common_menu! | set_common_menu! | ||||
| end | end | ||||
| def self.has_notice_menu? | |||||
| self.common.where(key: 'notice').present? | |||||
| end | |||||
| private | private | ||||
| def self.set_add_menu! | def self.set_add_menu! | ||||
| adds= [ | adds= [ | ||||
| @@ -0,0 +1,20 @@ | |||||
| # == Schema Information | |||||
| # | |||||
| # Table name: system_notifications | |||||
| # | |||||
| # id :integer not null, primary key | |||||
| # subject :string(255) | |||||
| # sub_subject :string(255) | |||||
| # content :text(65535) | |||||
| # is_top :boolean | |||||
| # created_at :datetime not null | |||||
| # updated_at :datetime not null | |||||
| # | |||||
| class SystemNotification < ApplicationRecord | |||||
| default_scope { order(created_at: :desc)} | |||||
| scope :is_top, lambda { where(is_top: true) } | |||||
| end | |||||
| @@ -170,7 +170,7 @@ class User < Owner | |||||
| has_many :issues, dependent: :destroy, foreign_key: :author_id | has_many :issues, dependent: :destroy, foreign_key: :author_id | ||||
| has_many :pull_requests, dependent: :destroy | has_many :pull_requests, dependent: :destroy | ||||
| has_many :public_keys, class_name: "Gitea::PublicKey",primary_key: :gitea_uid, foreign_key: :owner_id, dependent: :destroy | has_many :public_keys, class_name: "Gitea::PublicKey",primary_key: :gitea_uid, foreign_key: :owner_id, dependent: :destroy | ||||
| # Groups and active users | # Groups and active users | ||||
| scope :active, lambda { where(status: STATUS_ACTIVE) } | scope :active, lambda { where(status: STATUS_ACTIVE) } | ||||
| scope :like, lambda { |keywords| | scope :like, lambda { |keywords| | ||||
| @@ -37,7 +37,7 @@ class Watcher < ApplicationRecord | |||||
| end | end | ||||
| def send_create_message_to_notice_system | def send_create_message_to_notice_system | ||||
| SendTemplateMessageJob.perform_later('FollowTip', self.id) if self.watchable.is_a?(User) | |||||
| SendTemplateMessageJob.perform_later('FollowTip', self.id) if self.watchable.is_a?(User) if Site.has_notice_menu? | |||||
| end | end | ||||
| end | end | ||||
| @@ -53,8 +53,8 @@ class Projects::AcceptJoinService < ApplicationService | |||||
| def operate_project_member | def operate_project_member | ||||
| Projects::AddMemberInteractor.call(@project.owner, @project, @applied_project.user, permission) | Projects::AddMemberInteractor.call(@project.owner, @project, @applied_project.user, permission) | ||||
| SendTemplateMessageJob.perform_later('ProjectJoined', @user.id, @applied_project.user_id, @project.id) | |||||
| SendTemplateMessageJob.perform_later('ProjectMemberJoined', @user.id, @applied_project.user_id, @project.id) | |||||
| SendTemplateMessageJob.perform_later('ProjectJoined', @user.id, @applied_project.user_id, @project.id) if Site.has_notice_menu? | |||||
| SendTemplateMessageJob.perform_later('ProjectMemberJoined', @user.id, @applied_project.user_id, @project.id) if Site.has_notice_menu? | |||||
| end | end | ||||
| def send_apply_message | def send_apply_message | ||||
| @@ -30,8 +30,6 @@ | |||||
| </li> | </li> | ||||
| <li><%= sidebar_item(admins_reversed_keywords_path, '系统保留关键词', icon: 'key', controller: 'admins-reversed_keywords') %></li> | <li><%= sidebar_item(admins_reversed_keywords_path, '系统保留关键词', icon: 'key', controller: 'admins-reversed_keywords') %></li> | ||||
| <li><%= sidebar_item(admins_message_templates_path, '消息模版', icon: 'folder', controller: 'admins-message_templates') %></li> | |||||
| <li><%= sidebar_item(admins_laboratories_path, '云上实验室', icon: 'cloud', controller: 'admins-laboratories') %></li> | <li><%= sidebar_item(admins_laboratories_path, '云上实验室', icon: 'cloud', controller: 'admins-laboratories') %></li> | ||||
| <li> | <li> | ||||
| @@ -48,6 +46,8 @@ | |||||
| <%= sidebar_item_group('#setting-system', '系统配置', icon: 'wrench') do %> | <%= sidebar_item_group('#setting-system', '系统配置', icon: 'wrench') do %> | ||||
| <li><%= sidebar_item(admins_sites_path, 'setting接口配置', icon: 'deaf', controller: 'admins-sites') %></li> | <li><%= sidebar_item(admins_sites_path, 'setting接口配置', icon: 'deaf', controller: 'admins-sites') %></li> | ||||
| <li><%= sidebar_item(admins_edu_settings_path, '全局变量配置', icon: 'pencil-square', controller: 'admins-edu_settings') %></li> | <li><%= sidebar_item(admins_edu_settings_path, '全局变量配置', icon: 'pencil-square', controller: 'admins-edu_settings') %></li> | ||||
| <li><%= sidebar_item(admins_system_notifications_path, '系统通知配置', icon: 'bell', controller: 'admins-system_notifications') %></li> | |||||
| <li><%= sidebar_item(admins_message_templates_path, '消息模版配置', icon: 'folder', controller: 'admins-message_templates') %></li> | |||||
| <% end %> | <% end %> | ||||
| </li> | </li> | ||||
| <li> | <li> | ||||
| @@ -0,0 +1,57 @@ | |||||
| <div class="box search-form-container project-list-form"> | |||||
| <div style="line-height: 38px;" class="flex-1"><%= type == "create" ? "新建" : "编辑" %>系统通知</div> | |||||
| <%= link_to "返回", admins_system_notifications_path, class: "btn btn-default pull-right" %> | |||||
| </div> | |||||
| <div class="box"> | |||||
| <%= form_for @notification, url: {controller: "system_notifications", action: "#{type}"} do |p| %> | |||||
| <div class="form-group"> | |||||
| <label> | |||||
| <span class="color-grey-6 pt10"> | |||||
| 系统通知标题 | |||||
| <span class="ml10 color-orange mr20">*</span> | |||||
| </span> | |||||
| </label> | |||||
| <div class="mt-10"> | |||||
| <%= p.text_field :subject, class: "form-control input-lg", placeholder: "请输入系统通知标题" %> | |||||
| </div> | |||||
| </div> | |||||
| <div class="form-group"> | |||||
| <label> | |||||
| <span class="color-grey-6 pt10"> | |||||
| 系统通知副标题 | |||||
| <span class="ml10 color-orange mr20">*</span> | |||||
| </span> | |||||
| </label> | |||||
| <div class="mt-10"> | |||||
| <%= p.text_field :sub_subject, class: "form-control input-lg", placeholder: "请输入系统通知副标题" %> | |||||
| </div> | |||||
| </div> | |||||
| <div class="form-group"> | |||||
| <label> | |||||
| <span class="color-grey-6 pt10"> | |||||
| 系统通知正文 | |||||
| <span class="ml10 color-orange mr20">*</span> | |||||
| </span> | |||||
| </label> | |||||
| <div class="pl-0 my-3 setting-item-body" id="system-notification-content-editor"> | |||||
| <%= p.text_area :content, class:"form-control", style: 'display: none;', rows: "10", cols: "20", placeholer: "请输入系统通知正文" %> | |||||
| </div> | |||||
| </div> | |||||
| <div class="form-group"> | |||||
| <div class="form-check"> | |||||
| <%= p.check_box :is_top, class: "form-check-input", value:"true"%> | |||||
| <label class="form-check-label" for="is_top"> | |||||
| 是否置顶 | |||||
| </label> | |||||
| </div> | |||||
| </div> | |||||
| <div class="form-group"> | |||||
| <%= p.submit "确认", class: "btn btn-primary submit-btn" %> | |||||
| </div> | |||||
| <% end %> | |||||
| </div> | |||||
| @@ -0,0 +1,40 @@ | |||||
| <div class="modal fade system-notification-change-modal" tabindex="-1" role="dialog" aria-hidden="true"> | |||||
| <div class="modal-dialog modal-dialog-centered" role="document"> | |||||
| <div class="modal-content"> | |||||
| <div class="modal-header"> | |||||
| <h5 class="modal-title"><%= type == "create" ? "新增" : "编辑" %></h5> | |||||
| <button type="button" class="close" data-dismiss="modal" aria-label="Close"> | |||||
| <span aria-hidden="true">×</span> | |||||
| </button> | |||||
| </div> | |||||
| <%= form_for @notification, url: {controller: "system_notifications", action: "#{type}"} do |p| %> | |||||
| <div class="modal-body"> | |||||
| <div class="form-group"> | |||||
| <label> | |||||
| 系统通知标题 <span class="ml10 color-orange mr20">*</span> | |||||
| </label> | |||||
| <%= p.text_field :subject, class: "form-control input-lg",required: true%> | |||||
| </div> | |||||
| <div class="form-group"> | |||||
| <label> | |||||
| 系统通知副标题 <span class="ml10 color-orange mr20">*</span> | |||||
| </label> | |||||
| <%= p.text_field :sub_subject, class: "form-control input-lg",required: true%> | |||||
| </div> | |||||
| <div class="form-group"> | |||||
| <label> | |||||
| 系统通知正文 | |||||
| </label> | |||||
| <div class="pl-0 my-3 setting-item-body" id="system-notification-content-editor"> | |||||
| <%= p.text_area :content, class:"form-control", style: 'display: none;', rows: "10", cols: "20", placeholer: "请输入系统通知正文" %> | |||||
| </div> | |||||
| </div> | |||||
| </div> | |||||
| <div class="modal-footer"> | |||||
| <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button> | |||||
| <%= p.submit "确认", class: "btn btn-primary submit-btn" %> | |||||
| </div> | |||||
| <% end %> | |||||
| </div> | |||||
| </div> | |||||
| </div> | |||||
| @@ -0,0 +1,35 @@ | |||||
| <table class="table table-hover text-center subject-list-table"> | |||||
| <thead class="thead-light"> | |||||
| <tr> | |||||
| <th width="5%">序号</th> | |||||
| <th width="30%">标题</th> | |||||
| <th width="20%">副标题</th> | |||||
| <th width="20%"><%= sort_tag('是否置顶', name: 'is_top', path: admins_system_notifications_path) %></th> | |||||
| <th width="20%"><%= sort_tag('创建时间', name: 'created_at', path: admins_system_notifications_path) %></th> | |||||
| <th width="25%">操作</th> | |||||
| </tr> | |||||
| </thead> | |||||
| <tbody> | |||||
| <% if notifications.present? %> | |||||
| <% notifications.each_with_index do |notification, index| %> | |||||
| <tr class="system-notification-item-<%= notification.id %>"> | |||||
| <td><%= list_index_no((params[:page] || 1).to_i, index) %></td> | |||||
| <td><%= notification.subject %></td> | |||||
| <td><%= notification.sub_subject %></td> | |||||
| <td class="notification_is_top"><%= notification.is_top ? '√' : '' %></td> | |||||
| <td><%= notification.created_at&.strftime('%Y-%m-%d %H:%M') %></td> | |||||
| <td class="action-container"> | |||||
| <%= javascript_void_link '置顶', class: 'action unclose-action', data: { id: notification.id }, style: notification.is_top ? 'display: none;' : '' %> | |||||
| <%= javascript_void_link '取消置顶', class: 'action close-action', data: { id: notification.id }, style: notification.is_top ? '' : 'display: none;' %> | |||||
| <%= link_to "编辑", edit_admins_system_notification_path(notification), remote: true, class: "action" %> | |||||
| <%= link_to "删除", admins_system_notification_path(notification), method: :delete, data:{confirm: "确认删除的吗?"}, class: "action" %> | |||||
| </td> | |||||
| </tr> | |||||
| <% end %> | |||||
| <% else %> | |||||
| <%= render 'admins/shared/no_data_for_table' %> | |||||
| <% end %> | |||||
| </tbody> | |||||
| </table> | |||||
| <%= render partial: 'admins/shared/paginate', locals: { objects: notifications } %> | |||||
| @@ -0,0 +1,2 @@ | |||||
| $("#admins-system-notification-content").html("<%= j render(partial: 'admins/system_notifications/form', locals: {type: 'update'}) %>") | |||||
| createMDEditor('system-notification-content-editor', { height: 500, placeholder: '请输入邮件模版' }); | |||||
| @@ -0,0 +1,21 @@ | |||||
| <% define_admin_breadcrumbs do %> | |||||
| <% add_admin_breadcrumb('系统通知模版') %> | |||||
| <% end %> | |||||
| <div id="admins-system-notification-content"> | |||||
| <div class="box search-form-container project-list-form"> | |||||
| <%= form_tag(admins_system_notifications_path, method: :get, class: 'form-inline search-form flex-1', remote: true) do %> | |||||
| <%= text_field_tag(:search, params[:search], class: 'form-control col-12 col-md-2 mr-3', placeholder: '系统通知标题检索') %> | |||||
| <%= submit_tag('搜索', class: 'btn btn-primary ml-3', 'data-disable-with': '搜索中...') %> | |||||
| <input type="reset" class="btn btn-secondary clear-btn" value="清空"/> | |||||
| <% end %> | |||||
| <%= link_to "新增", new_admins_system_notification_path, remote: true, class: "btn btn-primary pull-right", "data-disabled-with":"...新增" %> | |||||
| </div> | |||||
| <div class="box py-0 pt-4 pl-4 daily-school-statistic-title"> | |||||
| </div> | |||||
| <div class="box admin-list-container system-notification-list-container"> | |||||
| <%= render partial: 'admins/system_notifications/list', locals: { notifications: @notifications } %> | |||||
| </div> | |||||
| </div> | |||||
| @@ -0,0 +1 @@ | |||||
| $('.system-notification-list-container').html("<%= j( render partial: 'admins/system_notifications/list', locals: { notifications: @notifications } ) %>"); | |||||
| @@ -0,0 +1,2 @@ | |||||
| $("#admins-system-notification-content").html("<%= j render(partial: 'admins/system_notifications/form', locals: {type: 'create'}) %>") | |||||
| createMDEditor('system-notification-content-editor', { height: 500, placeholder: '请输入邮件模版' }); | |||||
| @@ -56,4 +56,12 @@ json.setting do | |||||
| end | end | ||||
| json.common @common | json.common @common | ||||
| if @top_system_notification.present? | |||||
| json.system_notification do | |||||
| json.(@top_system_notification, :id, :subject, :sub_subject, :content) | |||||
| end | |||||
| else | |||||
| json.system_notification nil | |||||
| end | |||||
| end | end | ||||
| @@ -670,6 +670,7 @@ Rails.application.routes.draw do | |||||
| resources :project_licenses | resources :project_licenses | ||||
| resources :project_ignores | resources :project_ignores | ||||
| resources :reversed_keywords | resources :reversed_keywords | ||||
| resources :system_notifications | |||||
| resources :message_templates, only: [:index, :edit, :update] do | resources :message_templates, only: [:index, :edit, :update] do | ||||
| collection do | collection do | ||||
| get :init_data | get :init_data | ||||
| @@ -0,0 +1,13 @@ | |||||
| class CreateSystemNotifications < ActiveRecord::Migration[5.2] | |||||
| def change | |||||
| # 系统消息 | |||||
| create_table :system_notifications do |t| | |||||
| t.string :subject, comment: "标题" | |||||
| t.string :sub_subject, comment: "副标题" | |||||
| t.string :content, comment: "正文" | |||||
| t.boolean :is_top, comment: "是否置顶" | |||||
| t.timestamps | |||||
| end | |||||
| end | |||||
| end | |||||
| @@ -0,0 +1,5 @@ | |||||
| class ChangeSystemNotificationContentColumn < ActiveRecord::Migration[5.2] | |||||
| def change | |||||
| change_column :system_notifications, :content, :text | |||||
| end | |||||
| end | |||||